Import Cobalt 25.master.0.1032706
diff --git a/.github/actions/build/action.yaml b/.github/actions/build/action.yaml
index f641013..28616c4 100644
--- a/.github/actions/build/action.yaml
+++ b/.github/actions/build/action.yaml
@@ -25,7 +25,7 @@
           fi
         else
           BUILD_PLATFORM=${COBALT_BOOTLOADER}
-          BUILD_TARGET='loader_app_install elf_loader_sandbox_install crashpad_handler_install'
+          BUILD_TARGET='loader_app_install elf_loader_sandbox_install native_target/crashpad_handler'
         fi
         # GitHub Runners have home set to /github/home.
         if [ -d /root/starboard-toolchains ]; then
diff --git a/.github/actions/on_host_test/action.yaml b/.github/actions/on_host_test/action.yaml
index 7df5e2f..7d9efa0 100644
--- a/.github/actions/on_host_test/action.yaml
+++ b/.github/actions/on_host_test/action.yaml
@@ -60,12 +60,14 @@
       run: |
         echo "PYTHONPATH=$GITHUB_WORKSPACE" >> $GITHUB_ENV
         echo "TEST_RESULTS_DIR=${GITHUB_WORKSPACE}/unit-test-results" >> $GITHUB_ENV
+        echo "XML_FILES_DIR=${GITHUB_WORKSPACE}/unit-test-results/${{ matrix.platform }}/${{ matrix.shard }}" >> $GITHUB_ENV
         echo "COVERAGE_DIR=${GITHUB_WORKSPACE}/coverage" >> $GITHUB_ENV
-        echo "TEST_REPORT_FILE=${GITHUB_WORKSPACE}/${{matrix.platform}}-${{matrix.shard}}" >> $GITHUB_ENV
     - name: Run Tests
+      id: run-tests
       shell: bash
       run: |
         set -x
+
         # Starboard toolchains are downloaded to a different dir on github. Create a symlink to reassure our tooling that everything is fine.
         if [ -d /root/starboard-toolchains ]; then
           ln -s /root/starboard-toolchains /github/home/starboard-toolchains
@@ -85,28 +87,31 @@
         elif [[ "${{matrix.shard}}" == 'evergreen-as-blackbox' ]]; then
           xvfb-run -a --server-args="-screen 0 1920x1080x24i +render +extension GLX -noreset" python3 $GITHUB_WORKSPACE/cobalt/black_box_tests/black_box_tests.py --platform ${{matrix.target_platform}} --config ${{matrix.config}} ${loader_args} --test_set evergreen
         elif [[ "${{matrix.shard}}" == 'coverage' ]]; then
-          xvfb-run -a --server-args="-screen 0 1920x1080x24i +render +extension GLX -noreset" python3 ${GITHUB_WORKSPACE}/starboard/tools/testing/test_runner.py --platform ${{matrix.target_platform}} --config ${{matrix.config}} -r ${loader_args} --xml_output_dir=${TEST_RESULTS_DIR} --coverage_dir=${COVERAGE_DIR} --coverage_report
+          xvfb-run -a --server-args="-screen 0 1920x1080x24i +render +extension GLX -noreset" python3 ${GITHUB_WORKSPACE}/starboard/tools/testing/test_runner.py --platform ${{matrix.target_platform}} --config ${{matrix.config}} -r ${loader_args} --xml_output_dir=${XML_FILES_DIR} --coverage_dir=${COVERAGE_DIR} --coverage_report
         else
+          # Set 'test_type' output to unit_tests for the upload steps below.
+          echo "test_type=unit_tests" >> $GITHUB_OUTPUT
           if [[ "${{inputs.os}}" == 'windows' ]]; then
-            python3 ${GITHUB_WORKSPACE}/starboard/tools/testing/test_runner.py --platform ${{matrix.target_platform}} --config ${{matrix.config}} -s ${{matrix.shard}} -r
+            python3 ${GITHUB_WORKSPACE}/starboard/tools/testing/test_runner.py --platform ${{matrix.target_platform}} --config ${{matrix.config}} -s ${{matrix.shard}} -r --xml_output_dir=${XML_FILES_DIR}
           else
-            xvfb-run -a --server-args="-screen 0 1920x1080x24i +render +extension GLX -noreset" python3 ${GITHUB_WORKSPACE}/starboard/tools/testing/test_runner.py --platform ${{matrix.target_platform}} --config ${{matrix.config}} -s ${{matrix.shard}} -r ${loader_args} --xml_output_dir=${TEST_RESULTS_DIR}
+            xvfb-run -a --server-args="-screen 0 1920x1080x24i +render +extension GLX -noreset" python3 ${GITHUB_WORKSPACE}/starboard/tools/testing/test_runner.py --platform ${{matrix.target_platform}} --config ${{matrix.config}} -s ${{matrix.shard}} -r ${loader_args} --xml_output_dir=${XML_FILES_DIR}
           fi
         fi
-    - name: Process unit test results
-      if: failure()
+    - name: Populate TAGS for unit test report
+      if: (success() || failure()) && steps.run-tests.outputs.test_type == 'unit_tests'
       shell: bash
       run: |
-        set -x
-        echo "Saving unit test report to ${TEST_REPORT_FILE}"
-        python3 ${GITHUB_WORKSPACE}/starboard/tools/testing/test_report_parser.py ${TEST_RESULTS_DIR} > ${TEST_REPORT_FILE}
-    - name: Upload unit test report
+        # Set tags for test differentiation.
+        tags="platform:${{ matrix.platform }}"
+        tags="${tags},os:${{ inputs.os }}"
+        echo $tags > ${TEST_RESULTS_DIR}/${{ matrix.platform }}/TAGS
+    - name: Archive unit test results
       uses: actions/upload-artifact@v3
-      if: failure()
+      if: (success() || failure()) && steps.run-tests.outputs.test_type == 'unit_tests'
       with:
-        name: unit-test-reports
-        path: ${{env.TEST_REPORT_FILE}}
-    - name: Upload coverage html report
+        name: unit-test-results
+        path: ${{env.TEST_RESULTS_DIR}}/
+    - name: Archive coverage html report
       if: success() && matrix.shard == 'coverage'
       uses: actions/upload-artifact@v3
       with:
diff --git a/.github/codecov.yml b/.github/codecov.yml
new file mode 100644
index 0000000..236a6f1
--- /dev/null
+++ b/.github/codecov.yml
@@ -0,0 +1,5 @@
+coverage:
+  status:
+    project:
+      default:
+        threshold: 1%
diff --git a/.github/config/win32.json b/.github/config/win32.json
index c65092c..9de9f00 100644
--- a/.github/config/win32.json
+++ b/.github/config/win32.json
@@ -11,7 +11,7 @@
       "name":"win32",
       "platform":"win32",
       "target_platform":"win-win32",
-      "extra_gn_arguments":"is_clang=false visual_studio_path=\\\"C:/BuildTools/VC/Tools/MSVC/14.15.26726\\\" msvc_path=\\\"C:/BuildTools/VC/Tools/MSVC/14.15.26726\\\""
+      "extra_gn_arguments":"is_clang=false"
     }
   ]
 }
diff --git a/.github/workflows/auto_assign.yaml b/.github/workflows/auto_assign.yaml
new file mode 100644
index 0000000..3a47169
--- /dev/null
+++ b/.github/workflows/auto_assign.yaml
@@ -0,0 +1,35 @@
+name: PR Reviewer Auto Assignment
+
+on:
+  pull_request_target:
+    types:
+      - opened
+      - reopened
+
+concurrency:
+  group: '${{ github.workflow }}-${{ github.event_name }} @ ${{ github.event.pull_request.number || github.sha }}'
+  cancel-in-progress: true
+
+jobs:
+  assign-reviewer:
+    runs-on: ubuntu-latest
+    permissions:
+      pull-requests: write
+    steps:
+    - name: Check if PR author is outside collaborator and assign reviewer
+      env:
+        PR_AUTHOR_LOGIN: ${{ github.event.pull_request.user.login }}
+        REPO_NAME: ${{ github.event.repository.full_name }}
+        PR_NUMBER: ${{ github.event.number }}
+      run: |
+        PERMISSION_LEVEL=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
+          "https://api.github.com/repos/$REPO_NAME/collaborators/$PR_AUTHOR_LOGIN/permission" | jq -r .role_name)
+
+        if [ "$PERMISSION_LEVEL" == "none" ] || [ "$PERMISSION_LEVEL" == "read" ]; then
+          echo "PR author is an outside collaborator. Adding label..."
+
+          curl -s -X POST -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
+            -H "Accept: application/vnd.github.v3+json" \
+            -d '["outside collaborator"]' \
+            "https://api.github.com/repos/$REPO_NAME/issues/$PR_NUMBER/labels"
+        fi
diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml
new file mode 100644
index 0000000..834696d
--- /dev/null
+++ b/.github/workflows/coverage.yaml
@@ -0,0 +1,30 @@
+name: coverage
+
+on:
+  pull_request:
+    types:
+      - opened
+      - edited
+      - reopened
+      - synchronize
+  push:
+    branches:
+      - main
+      - feature/*
+
+jobs:
+  linux-coverage:
+    # TODO(b/286302961): Move back and re-enable this check once sharding is supported.
+    # Run on main branch for pushes, PRs and manual invocations.
+    # if: |
+    #  ${{ github.ref == 'refs/heads/main' &&
+    #      (github.event_name == 'push' ||
+    #      github.event_name == 'pull_request' ||
+    #      (github.event_name == 'workflow_dispatch' && inputs.nightly == 'false')) }}
+    uses: ./.github/workflows/main.yaml
+    permissions:
+      packages: write
+      pull-requests: write
+    with:
+      platform: linux-coverage
+      nightly: ${{ github.event.inputs.nightly }}
diff --git a/.github/workflows/label-cherry-pick.yaml b/.github/workflows/label-cherry-pick.yaml
index 6ac390a..1a80289 100644
--- a/.github/workflows/label-cherry-pick.yaml
+++ b/.github/workflows/label-cherry-pick.yaml
@@ -96,4 +96,6 @@
           reviewers: ${{ github.event.pull_request.user.login }}
           title: "Cherry pick PR #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}"
           body: |
-            "Refer to the original PR: https://github.com/${{ github.repository }}/pull/${{ github.event.pull_request.number }}"
+            Refer to the original PR: https://github.com/${{ github.repository }}/pull/${{ github.event.pull_request.number }}
+
+            ${{ github.event.pull_request.body }}
diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml
index 6a138cb..5baaaba 100644
--- a/.github/workflows/lint.yaml
+++ b/.github/workflows/lint.yaml
@@ -61,10 +61,7 @@
         # v2
         uses: gsactions/commit-message-checker@16fa2d5de096ae0d35626443bcd24f1e756cafee
         with:
-          excludeTitle: true
-          excludeDescription: true
-          checkAllCommitMessages: true
           accessToken: ${{ secrets.GITHUB_TOKEN }}
-          pattern: '^b\/\d+$'
+          pattern: 'b\/\d+'
           flags: 'gm'
-          error: 'Commit message should include at least one bug ID on a separate line (e.g. b/12345).'
+          error: 'PR title or description should include at least one bug ID.'
diff --git a/.github/workflows/linux.yaml b/.github/workflows/linux.yaml
index e15041d..bff0dff 100644
--- a/.github/workflows/linux.yaml
+++ b/.github/workflows/linux.yaml
@@ -56,17 +56,3 @@
       platform: linux-modular
       nightly: ${{ github.event.inputs.nightly }}
       modular: true
-  linux-coverage:
-    # Run on main branch for pushes, PRs and manual invocations.
-    if: |
-     ${{ github.ref == 'refs/heads/main' &&
-         (github.event_name == 'push' ||
-         github.event_name == 'pull_request' ||
-         (github.event_name == 'workflow_dispatch' && inputs.nightly == 'false')) }}
-    uses: ./.github/workflows/main.yaml
-    permissions:
-      packages: write
-      pull-requests: write
-    with:
-      platform: linux-coverage
-      nightly: ${{ github.event.inputs.nightly }}
diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml
index b501c1d..e0cd9b5 100644
--- a/.github/workflows/main.yaml
+++ b/.github/workflows/main.yaml
@@ -320,23 +320,3 @@
         uses: ./.github/actions/on_host_test
         with:
           os: linux
-
-  # Gets unit test report from on host tests and prints it.
-  on-host-unit-test-report:
-    needs: [on-host-test]
-    permissions: {}
-    if: failure()
-    runs-on: ubuntu-latest
-    steps:
-      - name: Collect Unit Test Reports
-        uses: actions/download-artifact@v3
-        with:
-          name: unit-test-reports
-          path: unit-test-reports
-      - name: Print Unit Test Reports
-        run: |
-          for filename in ${GITHUB_WORKSPACE}/unit-test-reports/*; do
-            basename $filename
-            cat $filename
-            echo
-          done
diff --git a/.github/workflows/main_win.yaml b/.github/workflows/main_win.yaml
index 3285f1a..ea1a301 100644
--- a/.github/workflows/main_win.yaml
+++ b/.github/workflows/main_win.yaml
@@ -130,7 +130,7 @@
   build:
     needs: [initialize]
     permissions: {}
-    runs-on: [self-hosted, X64, Windows]
+    runs-on: [self-hosted, win32]
     name: ${{matrix.name}}_${{matrix.config}}
     strategy:
       fail-fast: false
@@ -164,7 +164,7 @@
     needs: [initialize, build]
     permissions: {}
     if: needs.initialize.outputs.on_host_test == 'true'
-    runs-on: [self-hosted, Windows, X64]
+    runs-on: [self-hosted, win32]
     name: ${{matrix.name}}_${{matrix.shard}}_test
     strategy:
       fail-fast: false
diff --git a/.github/workflows/pytest.yaml b/.github/workflows/pytest.yaml
index 787f056..1b282e4 100644
--- a/.github/workflows/pytest.yaml
+++ b/.github/workflows/pytest.yaml
@@ -18,7 +18,7 @@
     strategy:
       matrix:
         os: [ubuntu-latest, windows-latest]
-        python-version: ['3.7', '3.11']
+        python-version: ['3.8', '3.11']
       fail-fast: false
     runs-on: ${{ matrix.os }}
     steps:
diff --git a/.github/workflows/unit_test_report.yaml b/.github/workflows/unit_test_report.yaml
new file mode 100644
index 0000000..8f43f24
--- /dev/null
+++ b/.github/workflows/unit_test_report.yaml
@@ -0,0 +1,107 @@
+name: Upload Unit Test Results
+
+on:
+  workflow_run:
+    workflows:
+      - evergreen
+      - linux
+      - win32
+    types:
+      - completed
+
+jobs:
+  unit-test-report:
+    permissions: {}
+      # TODO(b/293508740): Report failed workflow runs back to triggering PR.
+      # pull-requests: write
+    if: ${{ github.event.workflow_run.conclusion == 'success' || github.event.workflow_run.conclusion == 'failure' }}
+    runs-on: ubuntu-latest
+    name: Upload Unit Test Reports
+    steps:
+      - name: Download '${{ github.event.workflow_run.name }}' Unit Test Results
+        # The `download-artifact` action can only access artifacts that were uploaded in the same workflow.
+        # Since it was not this workflow that uploaded the artifacts we must use rest api to download them.
+        # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#using-data-from-the-triggering-workflow
+        uses: actions/github-script@v6
+        with:
+          script: |
+            const name = context.payload.workflow_run.name;
+            const url = context.payload.workflow_run.html_url;
+
+            console.log(`Downloading artifacts from ${url}`)
+            context.payload.workflow_run.pull_requests.forEach(pr => {
+              console.log(`Pull request: ${context.payload.repository.html_url}/pull/${pr.number}`);
+            });
+
+            let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              run_id: context.payload.workflow_run.id
+            });
+
+            let matchArtifacts = allArtifacts.data.artifacts.filter((artifact) => {
+              return artifact.name == "unit-test-results"
+            });
+
+            if (matchArtifacts.length == 1) {
+              let download = await github.rest.actions.downloadArtifact({
+                owner: context.repo.owner,
+                repo: context.repo.repo,
+                artifact_id: matchArtifacts[0].id,
+                archive_format: 'zip'
+              });
+              let fs = require('fs');
+              const path = `${process.env.GITHUB_WORKSPACE}/unit-test-results.zip`;
+              fs.writeFileSync(path, Buffer.from(download.data));
+            } else {
+              core.setFailed(`Expected one artifact with name 'unit-test-results'. Found ${matchArtifacts.length}.`);
+            }
+      - name: Extract Archived Unit Test Results
+        run: unzip unit-test-results.zip -d unit-test-results
+      - name: Get Datadog CLI
+        shell: bash
+        env:
+          DD_VERSION: 'v2.18.0'
+          DD_SHA256SUM: 'adbe9b3a41faaf0b1d9702ba256cf8fa9e474c0cc8216f25e5b489c53d6f0a70  datadog-ci'
+        run: |
+          set -e
+          download_url="https://github.com/DataDog/datadog-ci/releases/download/${DD_VERSION}/datadog-ci_linux-x64"
+          curl -L --fail $download_url --output datadog-ci
+          echo ${DD_SHA256SUM} | sha256sum --check
+          chmod +x datadog-ci
+      - name: Upload to Datadog
+        # Unit test results are archived on the following format:
+        # ├── <platform>
+        # │   ├── <shards>
+        # │   │   └── <test result xmls>
+        # │   └── TAGS
+        # ├── <platform>
+        # │   ├── <shards>
+        # │   │   └── <test result xmls>
+        # │   └── TAGS
+        # etc.
+        shell: bash
+        env:
+          DATADOG_API_KEY: ${{ secrets.DD_API_KEY }}
+          DATADOG_SITE: us5.datadoghq.com
+          DD_ENV: ci
+          DD_SERVICE: ${{ github.event.repository.name }}
+          # Need to populate git info via env vars as we don't have the repo to look at.
+          DD_GIT_REPOSITORY_URL: ${{ github.event.repository.git_url }}
+          DD_GIT_COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
+          DD_GIT_BRANCH: ${{ github.event.workflow_run.head_branch }}
+          DD_GIT_COMMIT_MESSAGE: ${{ github.event.workflow_run.head_commit.message }}
+          DD_GIT_COMMIT_AUTHOR_NAME: ${{ github.event.workflow_run.head_commit.author.name }}
+          DD_GIT_COMMIT_AUTHOR_EMAIL: ${{ github.event.workflow_run.head_commit.author.email }}
+          DD_GIT_COMMIT_AUTHOR_DATE: ${{ github.event.workflow_run.head_commit.timestamp }}
+          DD_GIT_COMMIT_COMMITTER_NAME: ${{ github.event.workflow_run.head_commit.committer.name }}
+          DD_GIT_COMMIT_COMMITTER_EMAIL: ${{ github.event.workflow_run.head_commit.committer.email }}
+          DD_GIT_COMMIT_COMMITTER_DATE:  ${{ github.event.workflow_run.head_commit.timestamp }}
+        run: |
+          # Loop over each platform, extract the tags and upload xml results.
+          for dir in unit-test-results/*/; do
+            echo "Uploading $dir test report"
+            export DD_TAGS=`cat ${dir}TAGS`
+            ./datadog-ci junit upload \
+                      $dir/**/*.xml
+          done
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index c4bd214..ea415f3 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -11,14 +11,17 @@
             base|
             build|
             buildtools|
+            cobalt/updater/win|
             components/crash/core/common|
-            components/metrics|
             components/metrics_services_manager|
+            components/metrics|
+            components/prefs|
             components/ukm|
             components/variations|
             components/version_info|
             crypto|
             extensions/buildflags|
+            glimp/include|
             net|
             internal/starboard/shared/playstation/glimp/shaders|
             testing|
@@ -29,6 +32,10 @@
         |
         components/update_client/((?!cobalt).)*$
         |
+        .*\.pb\.cc$ |
+        .*\.pb\.h$ |
+        .*\.patch$ |
+        .*Proto.java$|
         .*\.sig$
     )
 
@@ -50,15 +57,21 @@
                # The --ignore-words-list argument has a bug where it needs to
                # be lowercase, see
                # https://github.com/codespell-project/codespell/issues/1390
-               --ignore-words-list, atleast]
+               --ignore-words-list, "atleast,varius,ridiculus,statics",
+               ]
         exclude: |
             (?x)^(
                 (internal/)?starboard/[^/]+/i18n/|
                 cobalt/content/licenses/|
+                cobalt/content/ssl/|
                 cobalt/fetch/embedded_scripts|
+                cobalt/streams/embedded_scripts|
                 cobalt/loader/cors_preflight.cc|
                 internal/cobalt/browser/splash_screen/youtube_splash_screen.html|
-                internal/starboard/shared/playstation/storage_internal.cc
+                internal/starboard/shared/playstation/storage_internal.cc|
+                starboard/loader_app/app_key_test.cc|
+                starboard/shared/starboard/player/testdata|
+                starboard/shared/win32/media_transform.cc
             )
 
 -   repo: local
@@ -120,13 +133,25 @@
         stages: [push]
         exclude: |
             (?x)^(
+                .pylintrc$|
                 .pre-commit-config.yaml$|
-                cobalt/media/|
+                cobalt/base/unicode/|
+                cobalt/demos/content/|
                 cobalt/layout_tests/testdata/|
+                cobalt/math/|
+                cobalt/media/|
+                cobalt/streams/|
+                cobalt/updater/|
+                cobalt/webdriver/screencast/|
+                cobalt/websocket/|
+                components/crx_file/|
+                content/|
+                glimp/|
                 nb/|
                 starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java$|
                 starboard/shared/starboard/player/filter/decoded_audio_queue.cc$|
                 starboard/shared/starboard/player/filter/decoded_audio_queue.h$|
+                starboard/shared/starboard/player/testdata/licences/|
                 starboard/shared/starboard/player/filter/wsola_internal.cc$
             )
         exclude_types: [markdown]
@@ -166,20 +191,6 @@
         stages: [push]
         always_run: true
         pass_filenames: false
-    -   id: osslint
-        name: osslint
-        entry: python precommit_hooks/osslint_wrapper.py
-        language: python
-        types: [text]
-        stages: [manual]
-    -   id: internal-file-check
-        name: Internal File Check
-        entry: python precommit_hooks/internal_file_check_wrapper.py
-        language: python
-        types: [text]
-        # TODO: Remove docker-compose-windows.yml after internal check evaluates
-        # properly on it.
-        exclude: '(^docker-compose-windows(-internal)?.yml|EXCLUDE\.FILES(\.RECURSIVE)?|codereview\.settings)$'
     -   id: gn-format
         name: GN format
         entry: gn format
diff --git a/.pylintrc b/.pylintrc
index 6892a44..3707dea 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -216,7 +216,7 @@
 class-rgx=^_?[A-Z][a-zA-Z0-9]*$
 
 # Regular expression matching correct module names
-module-rgx=^(_?[a-z][a-z0-9_]*|__init__)$
+module-rgx=^(_?[a-z][a-z0-9_]*|__init__|2)$
 
 # Regular expression matching correct method names
 method-rgx=(?x)^(?:(?P<exempt>_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass|(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next)|(?P<camel_case>_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P<snake_case>_{0,2}[a-z][a-z0-9_]*))$
@@ -426,6 +426,6 @@
 
 # Exceptions that will emit a warning when being caught. Defaults to
 # "Exception"
-overgeneral-exceptions=StandardError,
-                       Exception,
-                       BaseException
+overgeneral-exceptions=builtins.StandardError,
+                       builtins.Exception,
+                       builtins.BaseException
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 9b82749..3853124 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -50,13 +50,17 @@
 
 #### General guidelines and philosophy for contribution
 
+*   Ensure your change references the bug you are addressing. Follow the
+    instructions
+    [here](https://cobalt.dev/communication.html#filing-bugs-and-feature-requests)
+    to view and create bugs.
 *   Include unit tests when you contribute new features, as they help to:
     1.   Prove that your code works correctly
     1.   Guard against future breaking changes to lower the maintenance cost.
 *   Bug fixes also generally require unit tests, because the presence of bugs
     usually indicates insufficient test coverage.
 *   When you contribute a new feature to Cobalt, the maintenance burden is
-    (by default) transferred to the Cobalbt team. This means that the benefit
+    (by default) transferred to the Cobalt team. This means that the benefit
     of the contribution must be compared against the cost of maintaining the
     feature.
 *   As every PR requires several CPU/GPU hours of CI testing, we discourage
diff --git a/README.md b/README.md
index 0a349a3..32d3816 100644
--- a/README.md
+++ b/README.md
@@ -43,14 +43,13 @@
 
   * **Limited Memory.** All except the very latest, expensive CE devices have a
     very small amount of memory available for applications. This usually is
-    somewhere in the ballpark of 200MB-500MB, including graphics and media
+    somewhere in the ballpark of 500MB, including graphics and media
     memory, as opposed to multiple gigabytes of CPU memory (and more gigabytes
     of GPU memory) in modern desktop and laptop computers, and mobile devices.
   * **Slow CPUs.** Most CE devices have much slower CPUs than what is available
     on even a budget desktop computer. Minor performance concerns can be greatly
-    exaggerated, which seriously affects priorities.
-  * **Fewer cores.** CE System-on-a-Chip (SoC) processors often do not have as
-    many processor cores as we are used to in modern computers.
+    exaggerated, which seriously affects priorities. Cobalt currently expects a
+    4-core 32-bit ARMv7 CPU as a baseline.
   * **Minimal GPU.** Not all CE devices have a monster GPU to throw shaders at
     to offload CPU work. As CE devices now have a standard GPU (though not
     nearly as powerful as even a laptop), OpenGL ES 2.0 is now required
@@ -62,10 +61,9 @@
     no ability to JIT.
   * **Heterogeneous Development Environments.** This is slowly evening out, but
     all CE devices run on custom hardware, often with proprietary methods of
-    building, packaging, deploying, and running programs. Almost all CE devices
-    have ARM processors instead of the more familiar x86. Sometimes the
-    toolchain doesn't support contemporary C++11/14 features. Sometimes the OS
-    isn't POSIX, or it tries to be, but it is only partially implemented.
+    building, packaging, deploying, and running programs. Sometimes the
+    toolchain doesn't support latest C++ language features. Sometimes the OS
+    does not support POSIX, or it is only partially implemented.
     Sometimes the program entry point is in another language or architecture
     that requires a "trampoline" over to native binary code.
   * **No navigation.** The point of a Single-Page Application is that you don't
@@ -73,10 +71,6 @@
     provides poor user feedback, not to mention a jarring transition. Instead,
     one loads data from an XMLHttpRequest (XHR), and then updates one's DOM to
     reflect the new data. AJAX! Web 2.0!!
-  * **No scrolling.** Well, full-screen, 10-foot UI SPA apps might scroll, but
-    not like traditional web pages, with scroll bars and a mouse
-    wheel. Scrolling is generally built into the app very carefully, with
-    support for a Directional Pad and a focus cursor.
 
 
 ## Architecture
@@ -92,19 +86,21 @@
 
   * **Web Implementation** - This is where the W3C standards are implemented,
     ultimately producing an annotated DOM tree that can be passed into the
-    Layout Engine to produce a Render Tree.
+    Layout Engine to produce a Render Tree. Cobalt uses a forked copy of
+    [Chrome Blink's Web IDL compiler](https://www.chromium.org/blink/webidl/) to
+    turn JavaScript IDLs to generated C++ bindings code.
   * **JavaScript Engine** - We have, perhaps surprisingly, *not* written our own
-    JavaScript Engine from scratch. Because of the JITing constraint, we have to
-    be flexible with which engine(s) we work with. We have a bindings layer that
-    interfaces with the JS Engine so that application script can interface with
-    natively-backed objects (like DOM elements).
+    JavaScript Engine from scratch. Cobalt is running on [Chromiums V8](https://v8.dev)
+    JavaScript engine. V8 supports all of our target platforms, including very
+    restricted ones where write-and-execute memory pages (needed for JIT) are
+    not available.
   * **Layout Engine** - The Layout Engine takes an annotated DOM Document
     produced by the Web Implementation and JavaScript Engine working together,
     and calculates a tree of rendering commands to send to the renderer (i.e. a
     Render Tree). It caches intermediate layout artifacts so that subsequent
     incremental layouts can be sped up.
   * **Renderer/Skia** - The Renderer walks a Render Tree produced by the Layout
-    Engine, rasterizes it using the third-party graphics library Skia, and swaps
+    Engine, rasterizes it using the [Chromium graphics library Skia](https://skia.org/), and swaps
     it to the front buffer. This is accomplished using Hardware Skia on OpenGL
     ES 2.0. Note that the renderer runs in a different thread from the Layout
     Engine, and can interpolate animations that do not require re-layout. This
@@ -122,7 +118,7 @@
     software. Mostly format decoders and parsers (e.g. libpng, libxml2,
     zlib). We fork these from Chromium, as we want them to be the most
     battle-tested versions of these libraries.
-  * **Starboard/Glimp/ANGLE** - **Starboard** is the Cobalt porting
+  * **Starboard** - **Starboard** is the Cobalt porting
     interface. One major difference between Cobalt and Chromium is that we have
     created a hard straight-C porting layer, and ported ALL of the compiled
     code, including Base and all third-party libraries, to use it instead of
@@ -130,10 +126,12 @@
     modern systems (see Android, Windows, MacOS X, and iOS). Additionally,
     Starboard includes APIs that haven't been effectively standardized across
     platforms, such as display Window creation, Input events, and Media
-    playback. **Glimp** is an OpenGL ES 2.0 implementation framework, built by
-    the Cobalt team directly on Starboard, designed to adapt proprietary 3D APIs
-    to GLES2. **ANGLE** Is a third-party library that adapts DirectX to GLES2,
-    similar to Glimp, but only for DirectX.
+    playback. A good overview of which OS interfaces are abstracted by Starboard
+    can be found in the [reference documentation.](https://cobalt.dev/reference/starboard/modules/configuration.html)
+  * **ANGLE and Glimp** [**ANGLE** is a Chromium library](https://angleproject.org/)
+    that adapts OpenGL ES 2.0 graphics to various other platform-native graphics APIs.
+    Cobalt uses it on Windows platforms to run on DirectX. Glimp is a similar
+    custom adapter layer that translatest from GL ES2.0 to PlayStation native graphics.
 
 ## The Cobalt Subset
 
diff --git a/base/BUILD.gn b/base/BUILD.gn
index b7cfe95..509aa37 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -1560,7 +1560,7 @@
     ]
     public_configs = [ ":base_public_defines" ]
     deps += [
-      "//nb",
+      "//starboard/common",
       "//starboard",
       "//starboard/client_porting/eztime",
     ]
@@ -1582,7 +1582,7 @@
     # TODO(b/206642994): see if we can remove this condition. It's added for now
     # because linking atomic leads to linker errors for evergreen on arm-hardfp,
     # and it's apparently not really needed (i.e., we can build without it).
-    if (!is_starboard || !sb_is_evergreen) {
+    if (!is_starboard || !sb_is_modular) {
       libs += [ "atomic" ]
     }
   }
diff --git a/base/android/jni_generator/AndroidManifest.xml b/base/android/jni_generator/AndroidManifest.xml
index ec28ff5..1555a81 100644
--- a/base/android/jni_generator/AndroidManifest.xml
+++ b/base/android/jni_generator/AndroidManifest.xml
@@ -7,7 +7,7 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.jni.generator">
 
-    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="24" />
+    <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="33" />
     <application></application>
 
 </manifest>
diff --git a/base/codereview.settings b/base/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/base/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/base/files/file_starboard.cc b/base/files/file_starboard.cc
index 6c1e8ee..40e63d2 100644
--- a/base/files/file_starboard.cc
+++ b/base/files/file_starboard.cc
@@ -14,16 +14,28 @@
 
 // Adapted from platform_file_posix.cc
 
-#include "base/files/file.h"
+#include "base/files/file_starboard.h"
 
+#include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/threading/thread_restrictions.h"
+#include "starboard/common/metrics/stats_tracker.h"
 #include "starboard/common/log.h"
 #include "starboard/file.h"
 
 namespace base {
 
+void RecordFileWriteStat(int write_file_result) {
+  auto& stats_tracker = starboard::StatsTrackerContainer::GetInstance()->stats_tracker();
+  if (write_file_result <= 0) {
+    stats_tracker.FileWriteFail();
+  } else {
+    stats_tracker.FileWriteSuccess();
+    stats_tracker.FileWriteBytesWritten(/*bytes_written=*/write_file_result);
+  }
+}
+
 // Make sure our Whence mappings match the system headers.
 static_assert(
     File::FROM_BEGIN == static_cast<int>(kSbFileFromBegin) &&
@@ -181,8 +193,9 @@
     return -1;
 
   SCOPED_FILE_TRACE_WITH_SIZE("WriteAtCurrentPos", size);
-
-  return SbFileWriteAll(file_.get(), data, size);
+  int write_result = SbFileWriteAll(file_.get(), data, size);
+  RecordFileWriteStat(write_result);
+  return write_result;
 }
 
 int File::WriteAtCurrentPosNoBestEffort(const char* data, int size) {
@@ -192,7 +205,9 @@
     return -1;
 
   SCOPED_FILE_TRACE_WITH_SIZE("WriteAtCurrentPosNoBestEffort", size);
-  return SbFileWrite(file_.get(), data, size);
+  int write_result = SbFileWrite(file_.get(), data, size);
+  RecordFileWriteStat(write_result);
+  return write_result;
 }
 
 int64_t File::GetLength() {
diff --git a/cobalt/h5vcc/h5vcc_account_info.idl b/base/files/file_starboard.h
similarity index 67%
copy from cobalt/h5vcc/h5vcc_account_info.idl
copy to base/files/file_starboard.h
index 1fc2417..81f8874 100644
--- a/cobalt/h5vcc/h5vcc_account_info.idl
+++ b/base/files/file_starboard.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Cobalt Authors. All Rights Reserved.
+// Copyright 2023 Google Inc. All Rights Reserved.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,8 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-interface H5vccAccountInfo {
-  readonly attribute DOMString avatarUrl;
-  readonly attribute DOMString username;
-  readonly attribute DOMString userId;
-};
+#ifndef BASE_FILES_FILE_STARBOARD_H_
+#define BASE_FILES_FILE_STARBOARD_H_
+
+namespace base {
+
+void RecordFileWriteStat(int write_file_result);
+
+}  // namespace base
+
+#endif  // BASE_FILES_FILE_STARBOARD_H_
diff --git a/base/files/file_util.cc b/base/files/file_util.cc
index 8654654..befe725 100644
--- a/base/files/file_util.cc
+++ b/base/files/file_util.cc
@@ -23,7 +23,6 @@
 #include "build/build_config.h"
 
 #if defined(STARBOARD)
-#include "starboard/common/file.h"
 #include "starboard/memory.h"
 #include "starboard/types.h"
 #endif
@@ -62,18 +61,16 @@
   // doing anything smart with text formatting.
 #ifdef STARBOARD
   // std::ifstream doesn't work on all our platforms.
-  starboard::ScopedFile file1(filename1.value().c_str(),
-                              kSbFileOpenOnly | kSbFileRead);
-  starboard::ScopedFile file2(filename2.value().c_str(),
-                              kSbFileOpenOnly | kSbFileRead);
-  auto file1_length = file1.GetSize();
-  if (file1_length != file2.GetSize()) {
+  base::File file1(filename1, base::File::FLAG_OPEN | base::File::FLAG_READ);
+  base::File file2(filename2, base::File::FLAG_OPEN | base::File::FLAG_READ);
+  auto file1_length = file1.GetLength();
+  if (file1_length != file2.GetLength()) {
     return false;
   }
   std::unique_ptr<char[]> file1_content(new char[file1_length]());
   std::unique_ptr<char[]> file2_content(new char[file1_length]());
-  if (file1.ReadAll(file1_content.get(), file1_length) != file1_length ||
-      file2.ReadAll(file2_content.get(), file1_length) != file1_length) {
+  if (file1.ReadAtCurrentPos(file1_content.get(), file1_length) != file1_length ||
+      file2.ReadAtCurrentPos(file2_content.get(), file1_length) != file1_length) {
     return false;
   }
 
diff --git a/base/logging.cc b/base/logging.cc
index a9d61c6..809e141 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -7,9 +7,11 @@
 #include <limits.h>
 
 #include "base/macros.h"
+#include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 
 #if defined(STARBOARD)
+#include "base/files/file_starboard.h"
 #include "starboard/client_porting/eztime/eztime.h"
 #include "starboard/common/log.h"
 #include "starboard/common/mutex.h"
@@ -555,7 +557,7 @@
   g_min_log_level = std::min(LOG_FATAL, level);
 }
 
-#if defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
+#if defined(OFFICIAL_BUILD) && !SB_IS(MODULAR)
 int GetMinLogLevel() {
   return LOG_NUM_SEVERITIES;
 }
@@ -579,7 +581,7 @@
 
 void SetLogPrefix(const char* prefix) {}
 
-#else  // defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
+#else  // defined(OFFICIAL_BUILD) && !SB_IS(MODULAR)
 
 int GetMinLogLevel() {
   return g_min_log_level;
@@ -623,7 +625,7 @@
          base::ContainsOnlyChars(prefix, "abcdefghijklmnopqrstuvwxyz"));
   g_log_prefix = prefix;
 }
-#endif  // defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
+#endif  // defined(OFFICIAL_BUILD) && !SB_IS(MODULAR)
 
 void SetShowErrorDialogs(bool enable_dialogs) {
   show_error_dialogs = enable_dialogs;
@@ -723,6 +725,8 @@
 #endif
   stream_ << std::endl;
   std::string str_newline(stream_.str());
+  TRACE_EVENT_INSTANT1("log", "LogMessage", TRACE_EVENT_SCOPE_THREAD, "message",
+                       str_newline);
 
   // Give any log message handler first dibs on the message.
   if (log_message_handler &&
@@ -939,6 +943,7 @@
       while (written < str_newline.length()) {
         int result = SbFileWrite(g_log_file, &(str_newline.c_str()[written]),
                                  str_newline.length() - written);
+        base::RecordFileWriteStat(result);
         if (result < 0) {
           break;
         }
diff --git a/base/logging.h b/base/logging.h
index e2e94b5..33cd785 100644
--- a/base/logging.h
+++ b/base/logging.h
@@ -412,12 +412,12 @@
 // LOG_IS_ON(DFATAL) always holds in debug mode. In particular, CHECK()s will
 // always fire if they fail.
 
-#if defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
+#if defined(OFFICIAL_BUILD) && !SB_IS(MODULAR)
 #define LOG_IS_ON(severity) false
-#else  // defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
+#else  // defined(OFFICIAL_BUILD) && !SB_IS(MODULAR)
 #define LOG_IS_ON(severity) \
   (::logging::ShouldCreateLogMessage(::logging::LOG_##severity))
-#endif  // defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
+#endif  // defined(OFFICIAL_BUILD) && !SB_IS(MODULAR)
 
 // We can't do any caching tricks with VLOG_IS_ON() like the
 // google-glog version since it requires GCC extensions.  This means
@@ -445,9 +445,9 @@
 #define LOG_IF(severity, condition) \
   LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity) && (condition))
 
-#if defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
+#if defined(OFFICIAL_BUILD) && !SB_IS(MODULAR)
 #define LOG_ONCE(severity) EAT_STREAM_PARAMETERS
-#else  // defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
+#else  // defined(OFFICIAL_BUILD) && !SB_IS(MODULAR)
 #define LOG_ONCE_MSG "[once] "
 
 constexpr uint32_t kFnvOffsetBasis32 = 0x811c9dc5U;
@@ -481,7 +481,7 @@
           ((::logging::LogOnceHelper<::logging::hash_32_fnv1a_const(__FILE__), \
                                     __LINE__>::logged_ = true) == true)))      \
       << LOG_ONCE_MSG
-#endif  // defined(OFFICIAL_BUILD) && !SB_IS(EVERGREEN)
+#endif  // defined(OFFICIAL_BUILD) && !SB_IS(MODULAR)
 
 // The VLOG macros log with negative verbosities.
 #define VLOG_STREAM(verbose_level) \
diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc
index bd9808a..163c712 100644
--- a/base/message_loop/message_loop.cc
+++ b/base/message_loop/message_loop.cc
@@ -24,7 +24,6 @@
 #include "base/threading/thread_id_name_manager.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
-#include "nb/memory_scope.h"
 
 namespace base {
 
@@ -405,7 +404,6 @@
 }
 
 void MessageLoop::SetThreadTaskRunnerHandle() {
-  TRACK_MEMORY_SCOPE("MessageLoop");
   DCHECK_CALLED_ON_VALID_THREAD(bound_thread_checker_);
   // Clear the previous thread task runner first, because only one can exist at
   // a time.
@@ -531,7 +529,6 @@
 }
 
 bool MessageLoop::DoDelayedWork(TimeTicks* next_delayed_work_time) {
-  TRACK_MEMORY_SCOPE("MessageLoop");
   if (!task_execution_allowed_ ||
       !pending_task_queue_.delayed_tasks().HasTasks()) {
     *next_delayed_work_time = TimeTicks();
diff --git a/base/message_loop/message_pump_io_starboard.cc b/base/message_loop/message_pump_io_starboard.cc
index 767dd1b..0194e54 100644
--- a/base/message_loop/message_pump_io_starboard.cc
+++ b/base/message_loop/message_pump_io_starboard.cc
@@ -20,7 +20,6 @@
 #include "base/observer_list.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/time/time.h"
-#include "nb/memory_scope.h"
 #include "starboard/common/socket.h"
 #include "starboard/socket_waiter.h"
 
@@ -171,7 +170,6 @@
 
 // Reentrant!
 void MessagePumpIOStarboard::Run(Delegate* delegate) {
-  TRACK_MEMORY_SCOPE("MessageLoop");
   AutoReset<bool> auto_reset_in_run(&in_run_, true);
 
   for (;;) {
diff --git a/base/message_loop/message_pump_ui_starboard.cc b/base/message_loop/message_pump_ui_starboard.cc
index 9a30ca3..ca6ce46 100644
--- a/base/message_loop/message_pump_ui_starboard.cc
+++ b/base/message_loop/message_pump_ui_starboard.cc
@@ -17,7 +17,6 @@
 #include "base/logging.h"
 #include "base/run_loop.h"
 #include "base/time/time.h"
-#include "nb/memory_scope.h"
 #include "starboard/event.h"
 #include "starboard/system.h"
 
@@ -106,7 +105,6 @@
 
 void MessagePumpUIStarboard::ScheduleDelayedWork(
     const base::TimeTicks& delayed_work_time) {
-  TRACK_MEMORY_SCOPE("MessageLoop");
   base::TimeDelta delay;
   if (!delayed_work_time.is_null()) {
     delay = delayed_work_time - base::TimeTicks::Now();
@@ -121,7 +119,6 @@
     // Make sure any outstanding delayed event is canceled.
     CancelDelayedLocked();
 
-    TRACK_MEMORY_SCOPE("MessageLoop");
     outstanding_delayed_events_.insert(
         SbEventSchedule(&CallMessagePumpDelayed, this, delay.ToSbTime()));
   }
@@ -154,7 +151,6 @@
 }
 
 void MessagePumpUIStarboard::CancelDelayedLocked() {
-  TRACK_MEMORY_SCOPE("MessageLoop");
   outstanding_events_lock_.AssertAcquired();
   for (SbEventIdSet::iterator it = outstanding_delayed_events_.begin();
        it != outstanding_delayed_events_.end(); ++it) {
diff --git a/base/metrics/persistent_histogram_storage.cc b/base/metrics/persistent_histogram_storage.cc
index 3801baf..0fb9628 100644
--- a/base/metrics/persistent_histogram_storage.cc
+++ b/base/metrics/persistent_histogram_storage.cc
@@ -14,10 +14,6 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 
-#if defined(STARBOARD)
-#include "starboard/common/file.h"
-#endif
-
 namespace {
 
 constexpr size_t kAllocSize = 1 << 20;  // 1 MiB
@@ -99,14 +95,7 @@
   StringPiece contents(static_cast<const char*>(allocator->data()),
                        allocator->used());
 #if defined(STARBOARD)
-  // All path should be UTF8 above Starboard.
-  SbFileError error;
-  bool out_created;
-  starboard::ScopedFile sb_file(file_path.AsUTF8Unsafe().c_str(),
-                                kSbFileCreateAlways | kSbFileWrite,
-                                &out_created, &error);
-
-  int bytes_written = sb_file.WriteAll(contents.data(), contents.size());
+  int bytes_written = base::WriteFile(file_path, contents.data(), contents.size());
   if (bytes_written == contents.size()) {
 #else
   if (!ImportantFileWriter::WriteFileAtomically(file_path, contents)) {
diff --git a/base/run_loop.cc b/base/run_loop.cc
index 29deb1d..d4d87d7 100644
--- a/base/run_loop.cc
+++ b/base/run_loop.cc
@@ -12,7 +12,6 @@
 #include "base/threading/thread_local.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
-#include "nb/memory_scope.h"
 
 namespace base {
 
@@ -256,7 +255,6 @@
 #endif  // DCHECK_IS_ON()
 
 bool RunLoop::BeforeRun() {
-  TRACK_MEMORY_SCOPE("MessageLoop");
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
 #if DCHECK_IS_ON()
diff --git a/base/single_thread_task_runner.cc b/base/single_thread_task_runner.cc
index 3c1d832..49c9f0b 100644
--- a/base/single_thread_task_runner.cc
+++ b/base/single_thread_task_runner.cc
@@ -22,6 +22,12 @@
 #if defined(STARBOARD)
 namespace {
 
+#if defined(COBALT_BUILD_TYPE_DEBUG)
+const int kTimeWaitInterval = 10000;
+#else
+const int kTimeWaitInterval = 2000;
+#endif
+
 // Runs the given task, and then signals the given WaitableEvent.
 void RunAndSignal(const base::Closure& task, base::WaitableEvent* event) {
   TRACE_EVENT0("task", "RunAndSignal");
@@ -49,7 +55,8 @@
   if (task_may_run) {
     // Wait for the task to complete before proceeding.
     do {
-      if (task_finished.TimedWait(base::TimeDelta::FromMilliseconds(1000))) {
+      if (task_finished.TimedWait(
+              base::TimeDelta::FromMilliseconds(kTimeWaitInterval))) {
         break;
       }
 #if !defined(COBALT_BUILD_TYPE_GOLD)
diff --git a/base/sys_info_starboard.cc b/base/sys_info_starboard.cc
index b5aae9c..138a14c 100644
--- a/base/sys_info_starboard.cc
+++ b/base/sys_info_starboard.cc
@@ -15,9 +15,11 @@
 #include "base/sys_info.h"
 
 #include "base/logging.h"
+#include "starboard/common/system_property.h"
 #include "starboard/system.h"
 
 namespace base {
+ using starboard::kSystemPropertyMaxLength;
 
 // static
 int SysInfo::NumberOfProcessors() {
@@ -56,4 +58,17 @@
   return AmountOfPhysicalMemoryImpl();
 }
 
+// static
+std::string SysInfo::OperatingSystemName() {
+  char value[kSystemPropertyMaxLength];
+  SbSystemGetProperty(kSbSystemPropertyPlatformName, value,
+                      kSystemPropertyMaxLength);
+  return value;
+}
+
+// static
+std::string SysInfo::OperatingSystemVersion() {
+  return SysInfo::OperatingSystemName();
+}
+
 }  // namespace base
diff --git a/build/android/gradle/android.jinja b/build/android/gradle/android.jinja
index 40d4506..7d566dd 100644
--- a/build/android/gradle/android.jinja
+++ b/build/android/gradle/android.jinja
@@ -51,7 +51,7 @@
 
     defaultConfig {
         vectorDrawables.useSupportLibrary = true
-        minSdkVersion 21
+        minSdkVersion 24
         targetSdkVersion {{ target_sdk_version }}
     }
 
diff --git a/build/config/android/config.gni b/build/config/android/config.gni
index 652ea74..8ffe591 100644
--- a/build/config/android/config.gni
+++ b/build/config/android/config.gni
@@ -48,7 +48,7 @@
 
     # The default to use for android:minSdkVersion for targets that do
     # not explicitly set it.
-    default_min_sdk_version = 21
+    default_min_sdk_version = 24
 
     # [WIP] Allows devs to achieve much faster edit-build-install cycles.
     # Currently only works for ChromeModern apks due to incremental install.
@@ -62,8 +62,8 @@
     android32_ndk_api_level = default_min_sdk_version
 
     # Android API level for 64 bits platforms
-    if (default_min_sdk_version < 21) {
-      android64_ndk_api_level = 21
+    if (default_min_sdk_version < 24) {
+      android64_ndk_api_level = 24
     } else {
       android64_ndk_api_level = default_min_sdk_version
     }
@@ -81,8 +81,8 @@
 
   if (!defined(default_android_ndk_root)) {
     default_android_ndk_root = "//third_party/android_ndk"
-    default_android_ndk_version = "r22"
-    default_android_ndk_major_version = 22
+    default_android_ndk_version = "r25"
+    default_android_ndk_major_version = 25
   } else {
     assert(defined(default_android_ndk_version))
     assert(defined(default_android_ndk_major_version))
diff --git a/build/config/win/BUILD.gn b/build/config/win/BUILD.gn
index 8f7c597..3996b5a 100644
--- a/build/config/win/BUILD.gn
+++ b/build/config/win/BUILD.gn
@@ -590,21 +590,3 @@
 config("nominmax") {
   defines = [ "NOMINMAX" ]
 }
-
-# Visual Studio 2022 Upgrade --------------------------------------------------
-
-# TODO(b/210151198) Visual Studio 2022 upgrade compatibility changes.
-# To be deleted after the upgrade completes and 2022 is the default.
-
-if (is_starboard) {
-  config("visual_studio_version_compat") {
-    if (use_visual_studio_2022) {
-      cflags = [
-        "/wd4800",
-        "/wd4834",
-        "/wd4858",
-        "/wd5208"
-      ]
-    }
-  }
-}
diff --git a/build/config/win/visual_studio_version.gni b/build/config/win/visual_studio_version.gni
index 11f5f02..63b9a97 100644
--- a/build/config/win/visual_studio_version.gni
+++ b/build/config/win/visual_studio_version.gni
@@ -4,7 +4,7 @@
 
 if (is_starboard) {
   declare_args() {
-    visual_studio_version = "14.15.26726"
+    visual_studio_version = "14.34.31933"
 
     # Full path to the Windows SDK, not including a backslash at the end.
     # This value is the default location, override if you have a different
@@ -15,20 +15,6 @@
     if (current_os == "winuwp") {
       wdk_version = "10.0.22000.0"
     } else {
-      wdk_version = "10.0.17763.0"
-    }
-  }
-
-  # TODO(b/210151198) Visual Studio 2022 upgrade compatibility changes.
-  # This argument should be removed, and replace the defaults for the arguments
-  # that are being overriden correspondingly.
-  declare_args() {
-    use_visual_studio_2022 = getenv("VISUAL_STUDIO_VERSION") == "2022"
-  }
-
-  if (use_visual_studio_2022) {
-    visual_studio_version = "14.34.31933"
-    if (current_os != "winuwp") {
       wdk_version = "10.0.18362.0"
     }
   }
@@ -36,14 +22,9 @@
   if (is_docker_build) {
     _default_visual_studio_path = "C:/BuildTools"
   } else {
-    if (use_visual_studio_2022) {
-      _vis_std_year = "2022"
-    } else {
-      _vis_std_year = "2017"
-    }
-    _default_visual_studio_path = getenv("VS2022INSTALLDIR")
+    _default_visual_studio_path = getenv("VSINSTALLDIR")
     if (_default_visual_studio_path == "") {
-      _default_visual_studio_path = "C:/Program Files (x86)/Microsoft Visual Studio/$_vis_std_year/Professional"
+      _default_visual_studio_path = "C:/Program Files (x86)/Microsoft Visual Studio/2022/Professional"
     }
   }
 
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni
index df72296..2a2cc3c 100644
--- a/build/toolchain/gcc_toolchain.gni
+++ b/build/toolchain/gcc_toolchain.gni
@@ -117,7 +117,7 @@
 template("gcc_toolchain") {
   toolchain(target_name) {
     is_starboard_toolchain = target_name == "starboard"
-    if (!build_with_separate_cobalt_toolchain) {
+    if (!sb_is_modular || sb_is_evergreen) {
       not_needed(["is_starboard_toolchain"])
     }
     assert(defined(invoker.ar), "gcc_toolchain() must specify a \"ar\" value")
@@ -391,7 +391,7 @@
       # TODO(b/206642994): see if we can remove this condition. It's needed for
       # now to add cflags for evergreen platforms but we haven't yet decided
       # whether cflags should be added here for all platforms.
-      if (is_starboard && sb_is_evergreen && !is_starboard_toolchain) {
+      if (!is_starboard_toolchain && is_starboard && sb_is_modular) {
         command = "$asm -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{asmflags}}${extra_asmflags} -c {{source}} -o {{output}}"
       } else {
         command = "$asm -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}}${extra_asmflags} -c {{source}} -o {{output}}"
@@ -457,14 +457,7 @@
       # .TOC file, overwrite it, otherwise, don't change it.
       tocfile = sofile + ".TOC"
 
-      # TODO(b/206642994): see if we can remove this condition. It's needed for
-      # now because we use the ld.lld linker for evergreen platforms and need to
-      # pass options as `option` instead of `-Wl,option`.
-      if (is_starboard && sb_is_evergreen && !is_starboard_toolchain) {
-        link_command = "$ld -shared -soname=\"$soname\" {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" @\"$rspfile\""
-      } else {
-        link_command = "$ld -shared -Wl,-soname=\"$soname\" {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" @\"$rspfile\""
-      }
+      link_command = "$ld -shared -Wl,-soname=\"$soname\" {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" @\"$rspfile\""
 
       # Generate a map file to be used for binary size analysis.
       # Map file adds ~10% to the link time on a z620.
@@ -491,11 +484,6 @@
 
       if (target_cpu == "mipsel" && is_component_build && is_android) {
         rspfile_content = "-Wl,--start-group -Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive {{libs}} -Wl,--end-group$tail_lib_dependencies"
-        # TODO(b/206642994): see if we can remove this condition. It's needed for
-        # now because we use the ld.lld linker for evergreen platforms and need
-        # to pass options as `option` instead of `-Wl,option`.
-      } else if (is_starboard && sb_is_evergreen && !is_starboard_toolchain) {
-        rspfile_content = "--whole-archive {{inputs}} {{solibs}} --no-whole-archive {{libs}}$tail_lib_dependencies"
       } else {
         rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive {{libs}}$tail_lib_dependencies"
       }
diff --git a/cobalt/BUILD.gn b/cobalt/BUILD.gn
index 867f45e..92fe9dc 100644
--- a/cobalt/BUILD.gn
+++ b/cobalt/BUILD.gn
@@ -66,24 +66,20 @@
     "//third_party/brotli:dec_no_dictionary_data",
   ]
 
-  if (sb_is_evergreen) {
-    deps += [
-      "//base/util/values:values_util",
-      "//cobalt/updater",
-      "//cobalt/updater:crash_sandbox",
-      "//cobalt/updater:noop_sandbox",
-      "//cobalt/updater:one_app_only_sandbox",
-      "//components/client_update_protocol",
-      "//components/crx_file",
-      "//components/prefs",
-      "//components/update_client",
-      "//third_party/llvm-project/compiler-rt:compiler_rt",
-      "//third_party/llvm-project/libcxx:cxx",
-      "//third_party/llvm-project/libcxxabi:cxxabi",
-      "//third_party/musl:c",
-    ]
-    if (!build_with_separate_cobalt_toolchain) {
-      deps += [ "//third_party/llvm-project/libunwind:unwind_evergreen" ]
+  if (sb_is_modular) {
+    deps += [ "//base/util/values:values_util" ]
+    if (sb_is_evergreen) {
+      deps += [
+        # TODO(b/294247612): Remove unnecessary dependencies.
+        "//cobalt/updater",
+        "//cobalt/updater:crash_sandbox",
+        "//cobalt/updater:noop_sandbox",
+        "//cobalt/updater:one_app_only_sandbox",
+        "//components/client_update_protocol",
+        "//components/crx_file",
+        "//components/prefs",
+        "//components/update_client",
+      ]
     }
   }
 }
diff --git a/cobalt/account/user_authorizer.h b/cobalt/account/user_authorizer.h
index 784984a..a0eb78c 100644
--- a/cobalt/account/user_authorizer.h
+++ b/cobalt/account/user_authorizer.h
@@ -20,7 +20,6 @@
 
 #include "base/optional.h"
 #include "base/time/time.h"
-#include "starboard/user.h"
 
 namespace cobalt {
 namespace account {
@@ -35,7 +34,7 @@
 
 // Platform-specific mechanism to authorize a user to access protected resources
 // in a web app running in Cobalt. Manages getting, refreshing, and discarding
-// an access token associated with a platform user identified by a |SbUser|.
+// an access token associated with a platform user.
 class UserAuthorizer {
  public:
   UserAuthorizer() {}
@@ -51,7 +50,7 @@
   // including an invalid |user|, or user cancellation of the authorization
   // process.
   // On success, a std::unique_ptr holding a valid AccessToken is returned.
-  virtual std::unique_ptr<AccessToken> AuthorizeUser(SbUser user) = 0;
+  virtual std::unique_ptr<AccessToken> AuthorizeUser() = 0;
 
   // Remove authorization for |user| to use application resources (i.e.
   // sign-out).  This call will block until the linking process is complete,
@@ -62,7 +61,7 @@
   // succeeded.
   // Returns false if the process failed for any reason including an invalid
   // |user|, or user cancellation.
-  virtual bool DeauthorizeUser(SbUser user) = 0;
+  virtual bool DeauthorizeUser() = 0;
 
   // Requests a new access token to extend authorization for |user| to continue
   // using application resources.
@@ -71,7 +70,7 @@
   // including an invalid |user|, or |user| not already being authorized (in
   // which case AuthorizeUser should be called).
   // On success, a std::unique_ptr holding a valid AccessToken is returned.
-  virtual std::unique_ptr<AccessToken> RefreshAuthorization(SbUser user) = 0;
+  virtual std::unique_ptr<AccessToken> RefreshAuthorization() = 0;
 
   // Signals that the account manager is shutting down, and unblocks any pending
   // request. Calling other methods after |Shutdown| may have no effect.
diff --git a/cobalt/audio/async_audio_decoder.cc b/cobalt/audio/async_audio_decoder.cc
index c7885a1..df527e3 100644
--- a/cobalt/audio/async_audio_decoder.cc
+++ b/cobalt/audio/async_audio_decoder.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/audio/async_audio_decoder.h"
 
+#include <memory>
+
 #include "base/bind.h"
 #include "base/logging.h"
 #include "cobalt/audio/audio_file_reader.h"
diff --git a/cobalt/audio/audio_device.cc b/cobalt/audio/audio_device.cc
index 7aae3b4..c2806c0 100644
--- a/cobalt/audio/audio_device.cc
+++ b/cobalt/audio/audio_device.cc
@@ -12,17 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/audio/audio_device.h"
+
 #include <algorithm>
 #include <memory>
 
-#include "cobalt/audio/audio_device.h"
-
-#include "starboard/configuration.h"
-
 #include "base/trace_event/trace_event.h"
 #include "cobalt/audio/audio_helpers.h"
-
 #include "starboard/audio_sink.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace audio {
diff --git a/cobalt/audio/audio_file_reader.cc b/cobalt/audio/audio_file_reader.cc
index 3dad138..9b590d7 100644
--- a/cobalt/audio/audio_file_reader.cc
+++ b/cobalt/audio/audio_file_reader.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/audio/audio_file_reader.h"
 
+#include <memory>
+
 #include "cobalt/audio/audio_file_reader_wav.h"
 
 namespace cobalt {
diff --git a/cobalt/audio/audio_file_reader_wav.cc b/cobalt/audio/audio_file_reader_wav.cc
index c81ef88..ea8aa97 100644
--- a/cobalt/audio/audio_file_reader_wav.cc
+++ b/cobalt/audio/audio_file_reader_wav.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/audio/audio_file_reader_wav.h"
+
 #include <memory>
 #include <sstream>
 #include <string>
 
-#include "cobalt/audio/audio_file_reader_wav.h"
-
 #include "base/basictypes.h"
 #include "base/logging.h"
 #include "cobalt/media/base/endian_util.h"
diff --git a/cobalt/audio/audio_node_input.cc b/cobalt/audio/audio_node_input.cc
index 977d67e..41d186b 100644
--- a/cobalt/audio/audio_node_input.cc
+++ b/cobalt/audio/audio_node_input.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/audio/audio_node_input.h"
 
+#include <memory>
+
 #include "base/logging.h"
 #include "cobalt/audio/audio_context.h"
 #include "cobalt/audio/audio_node.h"
@@ -101,16 +101,36 @@
     // output.R = R + 0.7071 * (input.C + input.SR)
     const float kFivePointOneToStereoMatrixSpeaker[] = {
         // 1.0 * L + 0.0 * R + 0.7071 * C + 0.0 * LFE + 0.7071 * SL + 0.0 * SR
-        1.0f, 0.0f, 0.7071f, 0.0f, 0.7071f, 0.0f,
+        1.0f,
+        0.0f,
+        0.7071f,
+        0.0f,
+        0.7071f,
+        0.0f,
         // 0.0 * L + 1.0 * R + 0.7071 * C + 0.0 * LFE + 0.0 * SL + 0.7071 * SR
-        0.0f, 1.0f, 0.7071f, 0.0f, 0.0f, 0.7071f,
+        0.0f,
+        1.0f,
+        0.7071f,
+        0.0f,
+        0.0f,
+        0.7071f,
     };
 
     const float kFivePointOneToStereoMatrixDiscrete[] = {
         // 1.0 * L + 0.0 * R + 0.0 * C + 0.0 * LFE + 0.0 * SL + 0.0 * SR
-        1.f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+        1.f,
+        0.0f,
+        0.0f,
+        0.0f,
+        0.0f,
+        0.0f,
         // 0.0 * L + 1.0 * R + 0.0 * C + 0.0 * LFE + 0.0 * SL + 0.0 * SR
-        0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+        0.0f,
+        1.0f,
+        0.0f,
+        0.0f,
+        0.0f,
+        0.0f,
     };
 
     MixAudioBufferBasedOnInterpretation(
@@ -137,12 +157,18 @@
     // output = 0.25 * (input.L + input.R + input.SL + input.SR);
     const float kQuadToMonoSpeaker[] = {
         // 0.25 * L + 0.25 * R + 0.25 * SL + 0.25 * SR
-        0.25f, 0.25f, 0.25f, 0.25f,
+        0.25f,
+        0.25f,
+        0.25f,
+        0.25f,
     };
 
     const float kQuadToMonoDiscrete[] = {
         // 1.0 * L + 0.0 * R + 0.0 * SL + 0.0 * SR
-        1.0f, 0.0f, 0.0f, 0.0f,
+        1.0f,
+        0.0f,
+        0.0f,
+        0.0f,
     };
 
     MixAudioBufferBasedOnInterpretation(kQuadToMonoSpeaker, kQuadToMonoDiscrete,
diff --git a/cobalt/audio/audio_node_output.cc b/cobalt/audio/audio_node_output.cc
index ed6c507..4b6c0c2 100644
--- a/cobalt/audio/audio_node_output.cc
+++ b/cobalt/audio/audio_node_output.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/audio/audio_node_output.h"
 
+#include <memory>
+
 #include "base/logging.h"
 #include "cobalt/audio/audio_context.h"
 #include "cobalt/audio/audio_node.h"
diff --git a/cobalt/base/BUILD.gn b/cobalt/base/BUILD.gn
index e335403..5552a2e 100644
--- a/cobalt/base/BUILD.gn
+++ b/cobalt/base/BUILD.gn
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 config("base_config") {
-  defines = [ "COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS" ]
+  defines = []
 
   if (is_debug || is_devel) {
     defines += [
@@ -70,6 +70,7 @@
     "ref_counted_lock.h",
     "source_location.cc",
     "source_location.h",
+    "starboard_stats_tracker.h",
     "startup_timer.cc",
     "startup_timer.h",
     "statistics.h",
diff --git a/cobalt/base/c_val.h b/cobalt/base/c_val.h
index cc285c9..fde535a 100644
--- a/cobalt/base/c_val.h
+++ b/cobalt/base/c_val.h
@@ -235,17 +235,16 @@
   oss << std::fixed << std::setprecision(1) << std::setfill('0');
   if (value_in_us > kHour) {
     oss << value_in_us / kHour << ":" << std::setw(2)
-        << (value_in_us % kHour) / kMinute << ":"
-        << std::setw(2) << (value_in_us % kMinute) / kSecond << "h";
+        << (value_in_us % kHour) / kMinute << ":" << std::setw(2)
+        << (value_in_us % kMinute) / kSecond << "h";
   } else if (value_in_us > kMinute) {
     oss << value_in_us / kMinute << ":" << std::setw(2)
         << (value_in_us % kMinute) / kSecond << "m";
   } else if (value_in_us > kSecond) {
-    oss << std::setw(1)
-        << static_cast<double>(value_in_us) / kSecond << "s";
+    oss << std::setw(1) << static_cast<double>(value_in_us) / kSecond << "s";
   } else if (value_in_us > kMillisecond) {
-    oss << std::setw(1)
-        << static_cast<double>(value_in_us) / kMillisecond << "ms";
+    oss << std::setw(1) << static_cast<double>(value_in_us) / kMillisecond
+        << "ms";
   } else {
     oss << value_in_us << "us";
   }
@@ -646,10 +645,8 @@
  public:
   CValStub(const std::string& name, const T& initial_value,
            const std::string& description)
-      : value_(initial_value) {
-  }
-  CValStub(const std::string& name, const std::string& description) {
-  }
+      : value_(initial_value) {}
+  CValStub(const std::string& name, const std::string& description) {}
 
   operator T() const { return value_; }
 
diff --git a/cobalt/base/c_val_collection_entry_stats.h b/cobalt/base/c_val_collection_entry_stats.h
index 83b038a..69dec89 100644
--- a/cobalt/base/c_val_collection_entry_stats.h
+++ b/cobalt/base/c_val_collection_entry_stats.h
@@ -319,12 +319,10 @@
   typedef CValCollectionEntryStatsFlushResults<EntryType> FlushResults;
   typedef typename FlushResults::OnFlushCallback OnFlushCallback;
 
-  explicit CValCollectionEntryStatsStub(const std::string& name) {
-  }
+  explicit CValCollectionEntryStatsStub(const std::string& name) {}
   CValCollectionEntryStatsStub(
       const std::string& name, size_t max_size, bool enable_entry_list_c_val,
-      const OnFlushCallback& on_flush = OnFlushCallback()) {
-  }
+      const OnFlushCallback& on_flush = OnFlushCallback()) {}
 
   void AddEntry(const EntryType& value) {}
   void Flush() {}
diff --git a/cobalt/base/c_val_collection_entry_stats_test.cc b/cobalt/base/c_val_collection_entry_stats_test.cc
index f49ed30..153aa96 100644
--- a/cobalt/base/c_val_collection_entry_stats_test.cc
+++ b/cobalt/base/c_val_collection_entry_stats_test.cc
@@ -12,16 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/base/c_val_collection_entry_stats.h"
+
 #include <string>
 
-#include "cobalt/base/c_val_collection_entry_stats.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::InSequence;
 using ::testing::Return;
 using ::testing::SaveArg;
-using ::testing::_;
 
 namespace base {
 
diff --git a/cobalt/base/c_val_collection_timer_stats_test.cc b/cobalt/base/c_val_collection_timer_stats_test.cc
index b99c2de..273bb4b 100644
--- a/cobalt/base/c_val_collection_timer_stats_test.cc
+++ b/cobalt/base/c_val_collection_timer_stats_test.cc
@@ -12,17 +12,18 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/base/c_val_collection_timer_stats.h"
+
 #include <string>
 
 #include "base/time/time.h"
-#include "cobalt/base/c_val_collection_timer_stats.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::InSequence;
 using ::testing::Return;
 using ::testing::SaveArg;
-using ::testing::_;
 
 namespace base {
 
diff --git a/cobalt/base/c_val_test.cc b/cobalt/base/c_val_test.cc
index 56477c0..7f34992 100644
--- a/cobalt/base/c_val_test.cc
+++ b/cobalt/base/c_val_test.cc
@@ -12,20 +12,21 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/base/c_val.h"
+
 #include <limits>
 #include <utility>
 
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/simple_thread.h"
 #include "base/time/time.h"
-#include "cobalt/base/c_val.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::InSequence;
 using ::testing::Return;
 using ::testing::SaveArg;
-using ::testing::_;
 
 namespace base {
 
@@ -662,7 +663,7 @@
 
 // Tests that we can create and destroy cvals no problem while simultaneously
 // reading from them.  The test creates two threads, a reader thread and a
-// creater/destroyer (and writer) thread.  These both attempt to access the same
+// creator/destroyer (and writer) thread.  These both attempt to access the same
 // cval as fast as possible.
 TEST(CValTest, RemoveAndRead) {
   const char* kTestCValName = "TestCVal";
diff --git a/cobalt/base/c_val_time_interval_entry_stats.h b/cobalt/base/c_val_time_interval_entry_stats.h
index 81dd774..075d9ef 100644
--- a/cobalt/base/c_val_time_interval_entry_stats.h
+++ b/cobalt/base/c_val_time_interval_entry_stats.h
@@ -186,8 +186,7 @@
 class CValTimeIntervalEntryStatsStub {
  public:
   CValTimeIntervalEntryStatsStub(const std::string& name,
-                                 int64 time_interval_in_ms) {
-  }
+                                 int64 time_interval_in_ms) {}
 
   void AddEntry(const EntryType& value) {}
   void AddEntry(const EntryType& value, const base::TimeTicks& now) {}
diff --git a/cobalt/base/c_val_time_interval_entry_stats_test.cc b/cobalt/base/c_val_time_interval_entry_stats_test.cc
index be3d93b..56bd15d 100644
--- a/cobalt/base/c_val_time_interval_entry_stats_test.cc
+++ b/cobalt/base/c_val_time_interval_entry_stats_test.cc
@@ -12,16 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/base/c_val_time_interval_entry_stats.h"
+
 #include <string>
 
-#include "cobalt/base/c_val_time_interval_entry_stats.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::InSequence;
 using ::testing::Return;
 using ::testing::SaveArg;
-using ::testing::_;
 
 namespace base {
 
diff --git a/cobalt/base/c_val_time_interval_timer_stats_test.cc b/cobalt/base/c_val_time_interval_timer_stats_test.cc
index 15190c5..a5ae787 100644
--- a/cobalt/base/c_val_time_interval_timer_stats_test.cc
+++ b/cobalt/base/c_val_time_interval_timer_stats_test.cc
@@ -12,17 +12,18 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/base/c_val_time_interval_timer_stats.h"
+
 #include <string>
 
 #include "base/time/time.h"
-#include "cobalt/base/c_val_time_interval_timer_stats.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::InSequence;
 using ::testing::Return;
 using ::testing::SaveArg;
-using ::testing::_;
 
 namespace base {
 
diff --git a/cobalt/base/circular_buffer_shell.h b/cobalt/base/circular_buffer_shell.h
index add70ea..e9fa42e 100644
--- a/cobalt/base/circular_buffer_shell.h
+++ b/cobalt/base/circular_buffer_shell.h
@@ -1,9 +1,10 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
 // Copyright (c) 2014 Google Inc. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_CIRCULAR_BUFFER_SHELL_H_
-#define BASE_CIRCULAR_BUFFER_SHELL_H_
+#ifndef COBALT_BASE_CIRCULAR_BUFFER_SHELL_H_
+#define COBALT_BASE_CIRCULAR_BUFFER_SHELL_H_
 
 #include "base/base_export.h"
 #include "base/synchronization/lock.h"
@@ -101,4 +102,4 @@
 
 }  // namespace base
 
-#endif  // BASE_CIRCULAR_BUFFER_SHELL_H_
+#endif  // COBALT_BASE_CIRCULAR_BUFFER_SHELL_H_
diff --git a/cobalt/base/circular_buffer_shell_unittest.cc b/cobalt/base/circular_buffer_shell_unittest.cc
index 9c90eaf..444db67 100644
--- a/cobalt/base/circular_buffer_shell_unittest.cc
+++ b/cobalt/base/circular_buffer_shell_unittest.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2014 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,6 +19,8 @@
 
 #include <string.h>
 
+#include <memory>
+
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
diff --git a/cobalt/base/event.h b/cobalt/base/event.h
index 5e860f2..71e73ec 100644
--- a/cobalt/base/event.h
+++ b/cobalt/base/event.h
@@ -20,7 +20,7 @@
 namespace base {
 
 // Event is an abstract, generic class representing some system event that
-// occured.  Event producers like a SystemWindow will produce these events
+// occurred.  Event producers like a SystemWindow will produce these events
 // and dispatch them to the registered callbacks.
 // Derived classes should add the BASE_EVENT_SUBCLASS() macro to their public
 // attributes.
diff --git a/cobalt/base/event_dispatcher.cc b/cobalt/base/event_dispatcher.cc
index 018a505..1336d8f 100644
--- a/cobalt/base/event_dispatcher.cc
+++ b/cobalt/base/event_dispatcher.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/base/event_dispatcher.h"
 
+#include <memory>
+
 #include "base/logging.h"
 
 namespace base {
diff --git a/cobalt/base/event_dispatcher.h b/cobalt/base/event_dispatcher.h
index 3cc9d3a..cbc6743 100644
--- a/cobalt/base/event_dispatcher.h
+++ b/cobalt/base/event_dispatcher.h
@@ -48,7 +48,7 @@
   void RemoveEventCallback(TypeId type, const EventCallback& cb);
 
  private:
-  typedef hash_map<TypeId, std::vector<EventCallback> > CallbackMap;
+  typedef base::hash_map<TypeId, std::vector<EventCallback> > CallbackMap;
   CallbackMap event_callbacks_;
   // Lock to protect access to the callback map.
   mutable base::Lock lock_;
diff --git a/cobalt/base/generated_resources_types.h b/cobalt/base/generated_resources_types.h
index 0597a12..9b807e5 100644
--- a/cobalt/base/generated_resources_types.h
+++ b/cobalt/base/generated_resources_types.h
@@ -16,12 +16,12 @@
 #define COBALT_BASE_GENERATED_RESOURCES_TYPES_H_
 
 #include <string>
+
 #include "base/containers/hash_tables.h"
 
 struct FileContents {
   FileContents() {}
-  FileContents(const unsigned char *data, int size)
-      : data(data), size(size) {}
+  FileContents(const unsigned char *data, int size) : data(data), size(size) {}
 
   const unsigned char *data;
   int size;
diff --git a/cobalt/base/localized_strings.cc b/cobalt/base/localized_strings.cc
index 3388ca7..48f88bd 100644
--- a/cobalt/base/localized_strings.cc
+++ b/cobalt/base/localized_strings.cc
@@ -16,7 +16,10 @@
 
 #include <algorithm>
 
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
 #include "base/logging.h"
+#include "base/optional.h"
 #include "starboard/common/file.h"
 #include "starboard/common/log.h"
 #include "starboard/system.h"
@@ -26,64 +29,19 @@
 
 namespace {
 
-std::string GetFilenameForLanguage(const std::string& language) {
+base::Optional<base::FilePath> GetFilenameForLanguage(
+    const std::string& language) {
   const int kBufferSize = 256;
   char buffer[kBufferSize];
   bool got_path =
       SbSystemGetPath(kSbSystemPathContentDirectory, buffer, kBufferSize);
   if (!got_path) {
     DLOG(ERROR) << "Cannot get content path for i18n files.";
-    return std::string();
+    return base::nullopt;
   }
 
-  return std::string(buffer).append("/i18n/").append(language).append(".csv");
-}
-
-bool ReadFile(const std::string& filename, std::string* out_result) {
-  DCHECK_GT(filename.length(), 0);
-  DCHECK(out_result);
-
-  starboard::ScopedFile file(filename.c_str(), kSbFileOpenOnly | kSbFileRead);
-  if (!file.IsValid()) {
-    DLOG(WARNING) << "Cannot open i18n file: " << filename;
-    return false;
-  }
-
-  SbFileInfo file_info = {0};
-  bool got_info = file.GetInfo(&file_info);
-  if (!got_info) {
-    DLOG(ERROR) << "Cannot get information for i18n file.";
-    return false;
-  }
-  DCHECK_GT(file_info.size, 0);
-
-  const int kMaxBufferSize = 16 * 1024;
-  if (file_info.size > kMaxBufferSize) {
-    DLOG(ERROR) << "i18n file exceeds maximum size: " << file_info.size << " ("
-                << kMaxBufferSize << ")";
-    return false;
-  }
-
-  char* buffer = new char[file_info.size];
-  DCHECK(buffer);
-  int64_t bytes_to_read = file_info.size;
-  char* buffer_pos = buffer;
-  while (bytes_to_read > 0) {
-    int max_bytes_to_read = static_cast<int>(
-        std::min(static_cast<int64_t>(kSbInt32Max), bytes_to_read));
-    int bytes_read = file.Read(buffer_pos, max_bytes_to_read);
-    if (bytes_read < 0) {
-      DLOG(ERROR) << "Read from i18n file failed.";
-      delete[] buffer;
-      return false;
-    }
-    bytes_to_read -= bytes_read;
-    buffer_pos += bytes_read;
-  }
-
-  *out_result = std::string(buffer, file_info.size);
-  delete[] buffer;
-  return true;
+  return base::FilePath(buffer).Append("i18n").Append(language).AddExtension(
+      "csv");
 }
 
 }  // namespace
@@ -123,9 +81,13 @@
 }
 
 bool LocalizedStrings::LoadStrings(const std::string& language) {
-  const std::string filename = GetFilenameForLanguage(language);
+  auto opt_file_path = GetFilenameForLanguage(language);
+  if (!opt_file_path) {
+    return false;
+  }
+  auto file_path = opt_file_path.value();
   std::string file_contents;
-  if (!ReadFile(filename, &file_contents)) {
+  if (!base::ReadFileToString(file_path, &file_contents)) {
     DLOG_ONCE(ERROR) << "Error reading i18n file.";
     return false;
   }
diff --git a/cobalt/base/log_message_handler.h b/cobalt/base/log_message_handler.h
index 798a067..fcfca06 100644
--- a/cobalt/base/log_message_handler.h
+++ b/cobalt/base/log_message_handler.h
@@ -66,7 +66,8 @@
  private:
   // Type for map of callbacks.
   typedef std::map<LogMessageHandler::CallbackId,
-                   LogMessageHandler::OnLogMessageCallback> CallbackMap;
+                   LogMessageHandler::OnLogMessageCallback>
+      CallbackMap;
 
   // This class should only be instanced by the base::Singleton.
   LogMessageHandler();
diff --git a/cobalt/base/message_queue.h b/cobalt/base/message_queue.h
index be36eea..34fd96a 100644
--- a/cobalt/base/message_queue.h
+++ b/cobalt/base/message_queue.h
@@ -16,6 +16,7 @@
 #define COBALT_BASE_MESSAGE_QUEUE_H_
 
 #include <queue>
+
 #include "base/callback.h"
 #include "base/logging.h"
 #include "base/synchronization/lock.h"
diff --git a/cobalt/base/path_provider.cc b/cobalt/base/path_provider.cc
index 6dfbbe7..c1a543d 100644
--- a/cobalt/base/path_provider.cc
+++ b/cobalt/base/path_provider.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/base/path_provider.h"
 
+#include <memory>
+
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
diff --git a/cobalt/base/poller.h b/cobalt/base/poller.h
index 2a66ea5..aa3069a 100644
--- a/cobalt/base/poller.h
+++ b/cobalt/base/poller.h
@@ -60,9 +60,7 @@
     timer_->Start(FROM_HERE, period, user_task);
   }
 
-  void StopTimer() {
-    timer_.reset();
-  }
+  void StopTimer() { timer_.reset(); }
 
   base::MessageLoop* message_loop_;
   std::unique_ptr<RepeatingTimer<Poller> > timer_;
diff --git a/cobalt/base/starboard_stats_tracker.h b/cobalt/base/starboard_stats_tracker.h
new file mode 100644
index 0000000..aea4161
--- /dev/null
+++ b/cobalt/base/starboard_stats_tracker.h
@@ -0,0 +1,67 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_BASE_STARBOARD_STATS_TRACKER_H_
+#define COBALT_BASE_STARBOARD_STATS_TRACKER_H_
+
+#include "cobalt/base/c_val.h"
+#include "starboard/common/metrics/stats_tracker.h"
+
+class StarboardStatsTracker : public starboard::StatsTracker {
+ public:
+  StarboardStatsTracker()
+      : file_write_success_("Starboard.FileWrite.Success", 0,
+                            "SbFileWrite() success count from cobalt."),
+        file_write_fail_("Starboard.FileWrite.Fail", 0,
+                         "SbFileWrite() fail count from cobalt."),
+        file_write_bytes_written_("Starboard.FileWrite.BytesWritten", 0,
+                                  "SbFileWrite() bytes written from cobalt."),
+        storage_write_record_success_(
+            "Starboard.StorageWriteRecord.Success", 0,
+            "SbStorageWriteRecord() success count from cobalt."),
+        storage_write_record_fail_(
+            "Starboard.StorageWriteRecord.Fail", 0,
+            "SbStorageWriteRecord() fail count from cobalt."),
+        storage_write_record_bytes_written_(
+            "Starboard.StorageWriteRecord.BytesWritten", 0,
+            "SbStorageWriteRecord() bytes written from cobalt.") {}
+
+  void FileWriteSuccess() override { ++file_write_success_; }
+
+  void FileWriteFail() override { ++file_write_fail_; }
+
+  void FileWriteBytesWritten(int bytes_written) override {
+    file_write_bytes_written_ += bytes_written;
+  }
+
+  void StorageWriteRecordSuccess() override { ++storage_write_record_success_; }
+
+  void StorageWriteRecordFail() override { ++storage_write_record_fail_; }
+
+  void StorageWriteRecordBytesWritten(int bytes_written) override {
+    storage_write_record_bytes_written_ += bytes_written;
+  }
+
+ private:
+  base::CVal<int, base::CValPublic> file_write_success_;
+  base::CVal<int, base::CValPublic> file_write_fail_;
+  base::CVal<base::cval::SizeInBytes, base::CValPublic>
+      file_write_bytes_written_;
+  base::CVal<int, base::CValPublic> storage_write_record_success_;
+  base::CVal<int, base::CValPublic> storage_write_record_fail_;
+  base::CVal<base::cval::SizeInBytes, base::CValPublic>
+      storage_write_record_bytes_written_;
+};
+
+#endif  // COBALT_BASE_STARBOARD_STATS_TRACKER_H_
diff --git a/cobalt/base/token_test.cc b/cobalt/base/token_test.cc
index 4dcb597..2ba7a64 100644
--- a/cobalt/base/token_test.cc
+++ b/cobalt/base/token_test.cc
@@ -17,10 +17,9 @@
 #include <algorithm>
 #include <vector>
 
-#include "testing/gtest/include/gtest/gtest.h"
-
 #include "base/logging.h"
 #include "starboard/common/string.h"
+#include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
 namespace {
diff --git a/cobalt/base/unicode/character.cc b/cobalt/base/unicode/character.cc
index a5fb6ad..ac0736d 100644
--- a/cobalt/base/unicode/character.cc
+++ b/cobalt/base/unicode/character.cc
@@ -26,17 +26,17 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#include <algorithm>
-
 #include "cobalt/base/unicode/character.h"
 
+#include <algorithm>
+
 namespace base {
 namespace unicode {
 namespace {
 
 // Takes a flattened list of closed intervals
 template <class T, size_t size>
-bool ValueInIntervalList(const T(&intervalList)[size], const T& value) {
+bool ValueInIntervalList(const T (&intervalList)[size], const T& value) {
   const T* bound =
       std::upper_bound(&intervalList[0], &intervalList[size], value);
   if ((bound - intervalList) % 2 == 1) return true;
diff --git a/cobalt/base/unicode/character.h b/cobalt/base/unicode/character.h
index dae1b1b..bef9010 100644
--- a/cobalt/base/unicode/character.h
+++ b/cobalt/base/unicode/character.h
@@ -30,7 +30,6 @@
 #define COBALT_BASE_UNICODE_CHARACTER_H_
 
 #include "cobalt/base/unicode/character_values.h"
-
 #include "third_party/icu/source/common/unicode/uchar.h"
 
 namespace base {
diff --git a/cobalt/base/version_compatibility.cc b/cobalt/base/version_compatibility.cc
index 6b16d88..01149e3 100644
--- a/cobalt/base/version_compatibility.cc
+++ b/cobalt/base/version_compatibility.cc
@@ -12,8 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#if defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
-
 #include "cobalt/base/version_compatibility.h"
 
 #include "base/logging.h"
@@ -49,5 +47,3 @@
 }
 
 }  // namespace base
-
-#endif  // defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
diff --git a/cobalt/base/version_compatibility.h b/cobalt/base/version_compatibility.h
index aa4898e..cb22e24 100644
--- a/cobalt/base/version_compatibility.h
+++ b/cobalt/base/version_compatibility.h
@@ -15,8 +15,6 @@
 #ifndef COBALT_BASE_VERSION_COMPATIBILITY_H_
 #define COBALT_BASE_VERSION_COMPATIBILITY_H_
 
-#if defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
-
 #include <string>
 
 #include "base/atomicops.h"
@@ -57,6 +55,4 @@
 
 }  // namespace base
 
-#endif  // defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
-
 #endif  // COBALT_BASE_VERSION_COMPATIBILITY_H_
diff --git a/cobalt/base/wrap_main_starboard.h b/cobalt/base/wrap_main_starboard.h
index db37f6c..e60b7fc 100644
--- a/cobalt/base/wrap_main_starboard.h
+++ b/cobalt/base/wrap_main_starboard.h
@@ -24,7 +24,7 @@
 #include "starboard/client_porting/wrap_main/wrap_main.h"
 #include "starboard/event.h"
 #include "starboard/system.h"
-#if SB_IS(EVERGREEN)
+#if SB_IS(MODULAR)
 #include "third_party/musl/src/starboard/internal/hwcap_impl.h"
 #endif
 
@@ -45,7 +45,7 @@
       DCHECK(!g_started);
       DCHECK(!g_at_exit);
       g_at_exit = new base::AtExitManager();
-#if SB_IS(EVERGREEN)
+#if SB_IS(MODULAR)
       init_musl_hwcap();
 #endif
       InitCobalt(data->argument_count, data->argument_values, data->link);
@@ -64,7 +64,7 @@
       if (!g_started) {
         DCHECK(!g_at_exit);
         g_at_exit = new base::AtExitManager();
-#if SB_IS(EVERGREEN)
+#if SB_IS(MODULAR)
         init_musl_hwcap();
 #endif
         InitCobalt(data->argument_count, data->argument_values, data->link);
diff --git a/cobalt/bindings/README.md b/cobalt/bindings/README.md
index 18269ee..09758eb 100644
--- a/cobalt/bindings/README.md
+++ b/cobalt/bindings/README.md
@@ -166,4 +166,3 @@
 Bindings test is tested in isolation via the bindings_test target.  Because bindings is the bridge from the JavaScript engine to the DOM, bindings test works by having an [entirely separate set of IDL](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/bindings/testing/testing.gyp?type=cs&sq=package:%5Ecobalt$&g=0#27) files that contain [minimal internal logic](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/bindings/testing/arbitrary_interface.h?q=arbitrary_interface&sq=package:%5Ecobalt$&dr=CSs#27), and are meant to [stress Web IDL features](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/bindings/testing/numeric_types_test_interface.idl?sq=package:%5Ecobalt$&dr=CSs&g=0).  This is accomplished by parameterizing what IDL files should get compiled at gyp time.  All other parts of the bindings build pipeline (such as the IDL compiler and jinja templates) are shared between bindings_test and cobalt entirely.  Note that bindings_test lives above the script/ interface, so no engine specific APIs can be used within the tests.
 
 Additionally, when it is convenient to implement a test entirely within JavaScript, certain script/ and bindings/ features are tested within layout_tests and web_platform_tests (see for example, [platform-object-user-properties-survive-gc.html](https://cobalt.googlesource.com/cobalt/+/2a8c847d785c1602f60915c8e0112e0aec6a15a5/src/cobalt/layout_tests/testdata/cobalt/platform-object-user-properties-survive-gc.html?type=cs&q=platform-object-user&sq=package:%5Ecobalt$&g=0#1)).  These serve as higher level, more end-to-end tests, that are good for testing more complex examples that also involve Cobalt's usage of script/.
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_indexed_getter_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_indexed_getter_interface.cc
index d9037d8..a075e78 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_indexed_getter_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_indexed_getter_interface.cc
@@ -213,7 +213,7 @@
                     [](v8::Isolate* isolate, AnonymousIndexedGetterInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->length(),
               &result_value);
@@ -368,5 +368,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_getter_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_getter_interface.cc
index b1eb1fc..889b4a2 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_getter_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_getter_interface.cc
@@ -376,5 +376,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_indexed_getter_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_indexed_getter_interface.cc
index 1507906..a134146 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_indexed_getter_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_anonymous_named_indexed_getter_interface.cc
@@ -322,7 +322,7 @@
                     [](v8::Isolate* isolate, AnonymousNamedIndexedGetterInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->length(),
               &result_value);
@@ -489,5 +489,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_arbitrary_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_arbitrary_interface.cc
index 6ccd0b9..35c9c48 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_arbitrary_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_arbitrary_interface.cc
@@ -130,7 +130,7 @@
                     [](v8::Isolate* isolate, ArbitraryInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->arbitrary_property(),
               &result_value);
@@ -353,5 +353,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_base_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_base_interface.cc
index a529fc2..81542b8 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_base_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_base_interface.cc
@@ -130,7 +130,7 @@
                     [](v8::Isolate* isolate, BaseInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->base_attribute(),
               &result_value);
@@ -331,5 +331,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_boolean_type_test_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_boolean_type_test_interface.cc
index 260c18e..cc68c22 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_boolean_type_test_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_boolean_type_test_interface.cc
@@ -119,7 +119,7 @@
                     [](v8::Isolate* isolate, BooleanTypeTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->boolean_property(),
               &result_value);
@@ -419,5 +419,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_function_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_function_interface.cc
index 5c911dd..1e61da7 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_function_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_function_interface.cc
@@ -123,7 +123,7 @@
                     [](v8::Isolate* isolate, CallbackFunctionInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->callback_attribute(),
               &result_value);
@@ -164,7 +164,7 @@
                     [](v8::Isolate* isolate, CallbackFunctionInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->nullable_callback_attribute(),
               &result_value);
@@ -711,5 +711,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_interface_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_interface_interface.cc
index bd5f09b..592494b 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_interface_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_callback_interface_interface.cc
@@ -123,7 +123,7 @@
                     [](v8::Isolate* isolate, CallbackInterfaceInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->callback_attribute(),
               &result_value);
@@ -417,5 +417,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_conditional_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_conditional_interface.cc
index 1135e4b..bd11e46 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_conditional_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_conditional_interface.cc
@@ -123,7 +123,7 @@
                     [](v8::Isolate* isolate, ConditionalInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->enabled_attribute(),
               &result_value);
@@ -166,7 +166,7 @@
                     [](v8::Isolate* isolate, ConditionalInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->disabled_attribute(),
               &result_value);
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constants_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constants_interface.cc
index d3515c4..574b47d 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constants_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constants_interface.cc
@@ -275,5 +275,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_interface.cc
index a582362..118ffaf 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_interface.cc
@@ -301,5 +301,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_with_arguments_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_with_arguments_interface.cc
index c30834e..9ac00e1 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_with_arguments_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_constructor_with_arguments_interface.cc
@@ -173,7 +173,7 @@
                     [](v8::Isolate* isolate, ConstructorWithArgumentsInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->long_arg(),
               &result_value);
@@ -193,7 +193,7 @@
                     [](v8::Isolate* isolate, ConstructorWithArgumentsInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->boolean_arg(),
               &result_value);
@@ -213,7 +213,7 @@
                     [](v8::Isolate* isolate, ConstructorWithArgumentsInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->string_arg(),
               &result_value);
@@ -398,5 +398,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_convert_simple_object_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_convert_simple_object_interface.cc
index 5452403..c874c9f 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_convert_simple_object_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_convert_simple_object_interface.cc
@@ -307,5 +307,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_dictionary.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_dictionary.cc
index 188d81e..6757463 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_dictionary.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_dictionary.cc
@@ -119,4 +119,3 @@
 }  // namespace v8c
 }  // namespace script
 }  // namespace cobalt
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_getter_setter_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_getter_setter_interface.cc
index 3177fef..2c090e0 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_getter_setter_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_getter_setter_interface.cc
@@ -326,7 +326,7 @@
                     [](v8::Isolate* isolate, DerivedGetterSetterInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->length(),
               &result_value);
@@ -346,7 +346,7 @@
                     [](v8::Isolate* isolate, DerivedGetterSetterInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->property_on_derived_class(),
               &result_value);
@@ -786,5 +786,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_interface.cc
index ccd7e97..8f3ecb7 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_derived_interface.cc
@@ -134,7 +134,7 @@
                     [](v8::Isolate* isolate, DerivedInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->derived_attribute(),
               &result_value);
@@ -350,5 +350,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dictionary_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dictionary_interface.cc
index 23b7f5d..069c14e 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dictionary_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dictionary_interface.cc
@@ -125,7 +125,7 @@
                     [](v8::Isolate* isolate, DictionaryInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->dictionary_sequence(),
               &result_value);
@@ -507,5 +507,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dictionary_with_dictionary_member.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dictionary_with_dictionary_member.cc
index 0697e7c..7b8e190 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dictionary_with_dictionary_member.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dictionary_with_dictionary_member.cc
@@ -115,4 +115,3 @@
 }  // namespace v8c
 }  // namespace script
 }  // namespace cobalt
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_disabled_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_disabled_interface.cc
index 97d64d1..8f26a8e 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_disabled_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_disabled_interface.cc
@@ -122,7 +122,7 @@
                     [](v8::Isolate* isolate, DisabledInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->disabled_property(),
               &result_value);
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dom_string_test_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dom_string_test_interface.cc
index e82cf79..a309d07 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dom_string_test_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_dom_string_test_interface.cc
@@ -119,7 +119,7 @@
                     [](v8::Isolate* isolate, DOMStringTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->property(),
               &result_value);
@@ -160,7 +160,7 @@
                     [](v8::Isolate* isolate, DOMStringTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->read_only_property(),
               &result_value);
@@ -180,7 +180,7 @@
                     [](v8::Isolate* isolate, DOMStringTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->read_only_token_property(),
               &result_value);
@@ -200,7 +200,7 @@
                     [](v8::Isolate* isolate, DOMStringTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->null_is_empty_property(),
               &result_value);
@@ -241,7 +241,7 @@
                     [](v8::Isolate* isolate, DOMStringTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->undefined_is_empty_property(),
               &result_value);
@@ -282,7 +282,7 @@
                     [](v8::Isolate* isolate, DOMStringTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->nullable_undefined_is_empty_property(),
               &result_value);
@@ -551,5 +551,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_enumeration_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_enumeration_interface.cc
index 3542e55..ae9edb3 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_enumeration_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_enumeration_interface.cc
@@ -132,7 +132,7 @@
                     [](v8::Isolate* isolate, EnumerationInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->enum_property(),
               &result_value);
@@ -372,5 +372,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exception_object_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exception_object_interface.cc
index a8d8540..b941dca 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exception_object_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exception_object_interface.cc
@@ -119,7 +119,7 @@
                     [](v8::Isolate* isolate, ExceptionObjectInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->error(),
               &result_value);
@@ -139,7 +139,7 @@
                     [](v8::Isolate* isolate, ExceptionObjectInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->message(),
               &result_value);
@@ -309,5 +309,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exceptions_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exceptions_interface.cc
index e5125d3..5f5678f 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exceptions_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_exceptions_interface.cc
@@ -134,7 +134,7 @@
                     [](v8::Isolate* isolate, ExceptionsInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->attribute_throws_exception(&exception_state),
               &result_value);
@@ -357,5 +357,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_extended_idl_attributes_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_extended_idl_attributes_interface.cc
index 48697f1..3afdbd5 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_extended_idl_attributes_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_extended_idl_attributes_interface.cc
@@ -119,7 +119,7 @@
                     [](v8::Isolate* isolate, ExtendedIDLAttributesInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->attribute_default(),
               &result_value);
@@ -414,5 +414,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_garbage_collection_test_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_garbage_collection_test_interface.cc
index c63d041..61829bc 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_garbage_collection_test_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_garbage_collection_test_interface.cc
@@ -134,7 +134,7 @@
                     [](v8::Isolate* isolate, GarbageCollectionTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->previous(),
               &result_value);
@@ -175,7 +175,7 @@
                     [](v8::Isolate* isolate, GarbageCollectionTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->next(),
               &result_value);
@@ -363,5 +363,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_global_interface_parent.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_global_interface_parent.cc
index dff0c84..76c3add 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_global_interface_parent.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_global_interface_parent.cc
@@ -279,5 +279,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_indexed_getter_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_indexed_getter_interface.cc
index 7e698f2..0525832 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_indexed_getter_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_indexed_getter_interface.cc
@@ -238,7 +238,7 @@
                     [](v8::Isolate* isolate, IndexedGetterInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->length(),
               &result_value);
@@ -625,5 +625,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any.cc
index 48a1d90..37a00ff 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any.cc
@@ -369,5 +369,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any_dictionary.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any_dictionary.cc
index cc777e4..e110aad 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any_dictionary.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_any_dictionary.cc
@@ -493,5 +493,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_date.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_date.cc
index 538aebf..6108ba4 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_date.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_date.cc
@@ -369,5 +369,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_unsupported_properties.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_unsupported_properties.cc
index 5ef3e17..5239cb2 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_unsupported_properties.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_interface_with_unsupported_properties.cc
@@ -119,7 +119,7 @@
                     [](v8::Isolate* isolate, InterfaceWithUnsupportedProperties* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->supported_attribute(),
               &result_value);
@@ -263,5 +263,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_constructor_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_constructor_interface.cc
index 2ac0763..bdc73f5 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_constructor_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_constructor_interface.cc
@@ -235,5 +235,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_getter_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_getter_interface.cc
index 520508d..49ebda4 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_getter_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_getter_interface.cc
@@ -644,5 +644,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_indexed_getter_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_indexed_getter_interface.cc
index 3b5a5b1..b8d9bc0 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_indexed_getter_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_named_indexed_getter_interface.cc
@@ -322,7 +322,7 @@
                     [](v8::Isolate* isolate, NamedIndexedGetterInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->length(),
               &result_value);
@@ -342,7 +342,7 @@
                     [](v8::Isolate* isolate, NamedIndexedGetterInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->property_on_base_class(),
               &result_value);
@@ -927,5 +927,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nested_put_forwards_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nested_put_forwards_interface.cc
index ab6e99c..3ceaa79 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nested_put_forwards_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nested_put_forwards_interface.cc
@@ -123,7 +123,7 @@
                     [](v8::Isolate* isolate, NestedPutForwardsInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->nested_forwarding_attribute(),
               &result_value);
@@ -311,5 +311,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_constructor_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_constructor_interface.cc
index 788a7ab..ff5d80a 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_constructor_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_constructor_interface.cc
@@ -223,5 +223,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_interface_object_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_interface_object_interface.cc
index e18f1c4..dca8822 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_interface_object_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_no_interface_object_interface.cc
@@ -223,5 +223,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nullable_types_test_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nullable_types_test_interface.cc
index ee2eef4..c7dd532 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nullable_types_test_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_nullable_types_test_interface.cc
@@ -125,7 +125,7 @@
                     [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->nullable_boolean_property(),
               &result_value);
@@ -166,7 +166,7 @@
                     [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->nullable_numeric_property(),
               &result_value);
@@ -207,7 +207,7 @@
                     [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->nullable_string_property(),
               &result_value);
@@ -248,7 +248,7 @@
                     [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->nullable_dictionary_property(),
               &result_value);
@@ -289,7 +289,7 @@
                     [](v8::Isolate* isolate, NullableTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->nullable_object_property(),
               &result_value);
@@ -1209,5 +1209,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_numeric_types_test_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_numeric_types_test_interface.cc
index 8e6fdb7..7dec2ca 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_numeric_types_test_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_numeric_types_test_interface.cc
@@ -119,7 +119,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->byte_property(),
               &result_value);
@@ -160,7 +160,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->byte_clamp_property(),
               &result_value);
@@ -201,7 +201,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->octet_property(),
               &result_value);
@@ -242,7 +242,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->octet_clamp_property(),
               &result_value);
@@ -283,7 +283,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->short_property(),
               &result_value);
@@ -324,7 +324,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->short_clamp_property(),
               &result_value);
@@ -365,7 +365,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->unsigned_short_property(),
               &result_value);
@@ -406,7 +406,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->unsigned_short_clamp_property(),
               &result_value);
@@ -447,7 +447,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->long_property(),
               &result_value);
@@ -488,7 +488,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->long_clamp_property(),
               &result_value);
@@ -529,7 +529,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->unsigned_long_property(),
               &result_value);
@@ -570,7 +570,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->unsigned_long_clamp_property(),
               &result_value);
@@ -611,7 +611,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->long_long_property(),
               &result_value);
@@ -652,7 +652,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->long_long_clamp_property(),
               &result_value);
@@ -693,7 +693,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->unsigned_long_long_property(),
               &result_value);
@@ -734,7 +734,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->unsigned_long_long_clamp_property(),
               &result_value);
@@ -775,7 +775,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->double_property(),
               &result_value);
@@ -816,7 +816,7 @@
                     [](v8::Isolate* isolate, NumericTypesTestInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->unrestricted_double_property(),
               &result_value);
@@ -2679,5 +2679,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_object_type_bindings_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_object_type_bindings_interface.cc
index 1295813..753d5bb 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_object_type_bindings_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_object_type_bindings_interface.cc
@@ -131,7 +131,7 @@
                     [](v8::Isolate* isolate, ObjectTypeBindingsInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->arbitrary_object(),
               &result_value);
@@ -172,7 +172,7 @@
                     [](v8::Isolate* isolate, ObjectTypeBindingsInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->base_interface(),
               &result_value);
@@ -192,7 +192,7 @@
                     [](v8::Isolate* isolate, ObjectTypeBindingsInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->derived_interface(),
               &result_value);
@@ -233,7 +233,7 @@
                     [](v8::Isolate* isolate, ObjectTypeBindingsInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->object_property(),
               &result_value);
@@ -461,5 +461,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_operations_test_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_operations_test_interface.cc
index 9d89426..e184220 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_operations_test_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_operations_test_interface.cc
@@ -1748,5 +1748,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_promise_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_promise_interface.cc
index 71e955f..e959090 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_promise_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_promise_interface.cc
@@ -527,5 +527,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_put_forwards_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_put_forwards_interface.cc
index 4d321ab..b4e4a15 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_put_forwards_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_put_forwards_interface.cc
@@ -123,7 +123,7 @@
                     [](v8::Isolate* isolate, PutForwardsInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->forwarding_attribute(),
               &result_value);
@@ -175,7 +175,7 @@
                     [](v8::Isolate* isolate, PutForwardsInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               PutForwardsInterface::static_forwarding_attribute(),
               &result_value);
@@ -373,5 +373,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_sequence_user.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_sequence_user.cc
index 77b171a..0182609 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_sequence_user.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_sequence_user.cc
@@ -1177,5 +1177,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_single_operation_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_single_operation_interface.cc
index 5cb91ed..dc84423 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_single_operation_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_single_operation_interface.cc
@@ -105,4 +105,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_static_properties_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_static_properties_interface.cc
index 79beed9..8cd2ad3 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_static_properties_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_static_properties_interface.cc
@@ -123,7 +123,7 @@
                     [](v8::Isolate* isolate, StaticPropertiesInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               StaticPropertiesInterface::static_attribute(),
               &result_value);
@@ -554,5 +554,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_anonymous_operation_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_anonymous_operation_interface.cc
index a35969c..4cae118 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_anonymous_operation_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_anonymous_operation_interface.cc
@@ -243,5 +243,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_attribute_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_attribute_interface.cc
index d0bbdc0..4a23d1d 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_attribute_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_attribute_interface.cc
@@ -119,7 +119,7 @@
                     [](v8::Isolate* isolate, StringifierAttributeInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->the_stringifier_attribute(),
               &result_value);
@@ -305,5 +305,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_operation_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_operation_interface.cc
index 2cfb54c..f644e4c 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_operation_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_stringifier_operation_interface.cc
@@ -305,5 +305,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_target_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_target_interface.cc
index 9774c9c..a6b727b 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_target_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_target_interface.cc
@@ -335,5 +335,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_test_dictionary.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_test_dictionary.cc
index 8d035ae..917e74b 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_test_dictionary.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_test_dictionary.cc
@@ -423,4 +423,3 @@
 }  // namespace v8c
 }  // namespace script
 }  // namespace cobalt
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_union_types_interface.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_union_types_interface.cc
index a98e132..871031b 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_union_types_interface.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_union_types_interface.cc
@@ -131,7 +131,7 @@
                     [](v8::Isolate* isolate, UnionTypesInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->union_property(),
               &result_value);
@@ -172,7 +172,7 @@
                     [](v8::Isolate* isolate, UnionTypesInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->union_with_nullable_member_property(),
               &result_value);
@@ -213,7 +213,7 @@
                     [](v8::Isolate* isolate, UnionTypesInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->nullable_union_property(),
               &result_value);
@@ -254,7 +254,7 @@
                     [](v8::Isolate* isolate, UnionTypesInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->union_base_property(),
               &result_value);
@@ -295,7 +295,7 @@
                     [](v8::Isolate* isolate, UnionTypesInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->union_with_dictionary_property(),
               &result_value);
@@ -336,7 +336,7 @@
                     [](v8::Isolate* isolate, UnionTypesInterface* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->union_dicts_objects_property(),
               &result_value);
@@ -607,5 +607,3 @@
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_window.cc b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_window.cc
index feb2cd0..75f15c2 100644
--- a/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_window.cc
+++ b/cobalt/bindings/generated/v8c/testing/cobalt/bindings/testing/v8c_window.cc
@@ -331,7 +331,7 @@
                     [](v8::Isolate* isolate, Window* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->window_property(),
               &result_value);
@@ -372,7 +372,7 @@
                     [](v8::Isolate* isolate, Window* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->window(),
               &result_value);
@@ -392,7 +392,7 @@
                     [](v8::Isolate* isolate, Window* impl,
                        cobalt::script::ExceptionState& exception_state,
                        v8::Local<v8::Value>& result_value) {
-  
+
       ToJSValue(isolate,
               impl->on_event(),
               &result_value);
@@ -1091,5 +1091,3 @@
 
 }  // namespace script
 }  // namespace cobalt
-
-
diff --git a/cobalt/bindings/templates/dictionary.h.template b/cobalt/bindings/templates/dictionary.h.template
index d178bd6..416d522 100644
--- a/cobalt/bindings/templates/dictionary.h.template
+++ b/cobalt/bindings/templates/dictionary.h.template
@@ -47,6 +47,7 @@
 #include "cobalt/script/script_value.h"
 #include "cobalt/script/sequence.h"
 #include "cobalt/script/typed_arrays.h"
+#include "cobalt/script/union_type.h"
 #include "cobalt/script/value_handle.h"
 {% for include in includes %}
 #include "{{include}}"
diff --git a/cobalt/bindings/testing/any_bindings_test.cc b/cobalt/bindings/testing/any_bindings_test.cc
index ac6539f..951e428 100644
--- a/cobalt/bindings/testing/any_bindings_test.cc
+++ b/cobalt/bindings/testing/any_bindings_test.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "base/logging.h"
-
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/interface_with_any.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/cobalt/bindings/testing/any_dictionary_bindings_test.cc b/cobalt/bindings/testing/any_dictionary_bindings_test.cc
index 7082f6d..e9996df 100644
--- a/cobalt/bindings/testing/any_dictionary_bindings_test.cc
+++ b/cobalt/bindings/testing/any_dictionary_bindings_test.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "base/logging.h"
-
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/interface_with_any_dictionary.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/cobalt/bindings/testing/boolean_type_bindings_test.cc b/cobalt/bindings/testing/boolean_type_bindings_test.cc
index b518870..d095a1e 100644
--- a/cobalt/bindings/testing/boolean_type_bindings_test.cc
+++ b/cobalt/bindings/testing/boolean_type_bindings_test.cc
@@ -14,7 +14,6 @@
 
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/boolean_type_test_interface.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::InSequence;
diff --git a/cobalt/bindings/testing/callback_function_test.cc b/cobalt/bindings/testing/callback_function_test.cc
index 6a87b34..7f454bd 100644
--- a/cobalt/bindings/testing/callback_function_test.cc
+++ b/cobalt/bindings/testing/callback_function_test.cc
@@ -18,12 +18,12 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::ContainsRegex;
-using ::testing::Invoke;
 using ::testing::InSequence;
+using ::testing::Invoke;
 using ::testing::Return;
 using ::testing::SaveArg;
-using ::testing::_;
 
 namespace cobalt {
 namespace bindings {
@@ -117,10 +117,10 @@
   FunctionOwner function_owner(&test_mock());
   EXPECT_CALL(test_mock(), TakesFunctionWithOneParameter(_))
       .WillOnce(Invoke(&function_owner, &FunctionOwner::TakeOwnership));
-  EXPECT_TRUE(EvaluateScript(
-      "test.takesFunctionWithOneParameter(function(value) { "
-      "callback_value = value });",
-      NULL));
+  EXPECT_TRUE(
+      EvaluateScript("test.takesFunctionWithOneParameter(function(value) { "
+                     "callback_value = value });",
+                     NULL));
   ASSERT_TRUE(function_owner.IsSet());
 
   // Run the callback, and check that the value was passed through to script.
@@ -142,11 +142,11 @@
   FunctionOwner function_owner(&test_mock());
   EXPECT_CALL(test_mock(), TakesFunctionWithSeveralParameters(_))
       .WillOnce(Invoke(&function_owner, &FunctionOwner::TakeOwnership));
-  EXPECT_TRUE(EvaluateScript(
-      "test.takesFunctionWithSeveralParameters("
-      "function(param1, param2, param3) { "
-      "value1 = param1; value2 = param2; value3 = param3; });",
-      NULL));
+  EXPECT_TRUE(
+      EvaluateScript("test.takesFunctionWithSeveralParameters("
+                     "function(param1, param2, param3) { "
+                     "value1 = param1; value2 = param2; value3 = param3; });",
+                     NULL));
   ASSERT_TRUE(function_owner.IsSet());
 
   // Execute the callback
@@ -180,11 +180,11 @@
   FunctionOwner function_owner(&test_mock());
   EXPECT_CALL(test_mock(), TakesFunctionWithNullableParameters(_))
       .WillOnce(Invoke(&function_owner, &FunctionOwner::TakeOwnership));
-  EXPECT_TRUE(EvaluateScript(
-      "test.takesFunctionWithNullableParameters("
-      "function(param1, param2, param3) { "
-      "value1 = param1; value2 = param2; value3 = param3; });",
-      NULL));
+  EXPECT_TRUE(
+      EvaluateScript("test.takesFunctionWithNullableParameters("
+                     "function(param1, param2, param3) { "
+                     "value1 = param1; value2 = param2; value3 = param3; });",
+                     NULL));
   ASSERT_TRUE(function_owner.IsSet());
 
   // Execute the callback
diff --git a/cobalt/bindings/testing/callback_interface_test.cc b/cobalt/bindings/testing/callback_interface_test.cc
index 6131d45..b3a43bc 100644
--- a/cobalt/bindings/testing/callback_interface_test.cc
+++ b/cobalt/bindings/testing/callback_interface_test.cc
@@ -20,10 +20,10 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::ContainsRegex;
 using ::testing::Invoke;
 using ::testing::Return;
-using ::testing::_;
 
 namespace cobalt {
 namespace bindings {
diff --git a/cobalt/bindings/testing/conditional_attribute_test.cc b/cobalt/bindings/testing/conditional_attribute_test.cc
index f124a35..8cb1325 100644
--- a/cobalt/bindings/testing/conditional_attribute_test.cc
+++ b/cobalt/bindings/testing/conditional_attribute_test.cc
@@ -14,7 +14,6 @@
 
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/conditional_interface.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::Return;
diff --git a/cobalt/bindings/testing/constructor_bindings_test.cc b/cobalt/bindings/testing/constructor_bindings_test.cc
index 4d88d85..23296e4 100644
--- a/cobalt/bindings/testing/constructor_bindings_test.cc
+++ b/cobalt/bindings/testing/constructor_bindings_test.cc
@@ -96,10 +96,10 @@
 
 TEST_F(ConstructorBindingsTest, NamedConstructorHasCorrectPrototype) {
   std::string result;
-  EXPECT_TRUE(EvaluateScript(
-      "Object.getPrototypeOf(SomeNamedConstructor) === "
-      "Object.getPrototypeOf(NamedConstructorInterface);",
-      &result));
+  EXPECT_TRUE(
+      EvaluateScript("Object.getPrototypeOf(SomeNamedConstructor) === "
+                     "Object.getPrototypeOf(NamedConstructorInterface);",
+                     &result));
   EXPECT_STREQ("true", result.c_str());
 }
 
diff --git a/cobalt/bindings/testing/date_bindings_test.cc b/cobalt/bindings/testing/date_bindings_test.cc
index bb58362..9b4c420 100644
--- a/cobalt/bindings/testing/date_bindings_test.cc
+++ b/cobalt/bindings/testing/date_bindings_test.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "base/logging.h"
-
 #include "base/time/time.h"
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/interface_with_date.h"
diff --git a/cobalt/bindings/testing/dependent_interface_test.cc b/cobalt/bindings/testing/dependent_interface_test.cc
index 0bc3f4a..524a2da 100644
--- a/cobalt/bindings/testing/dependent_interface_test.cc
+++ b/cobalt/bindings/testing/dependent_interface_test.cc
@@ -14,7 +14,6 @@
 
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/target_interface.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::Return;
diff --git a/cobalt/bindings/testing/dom_string_bindings_test.cc b/cobalt/bindings/testing/dom_string_bindings_test.cc
index c66bd43..015cda0 100644
--- a/cobalt/bindings/testing/dom_string_bindings_test.cc
+++ b/cobalt/bindings/testing/dom_string_bindings_test.cc
@@ -14,7 +14,6 @@
 
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/dom_string_test_interface.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::Return;
diff --git a/cobalt/bindings/testing/enumeration_bindings_test.cc b/cobalt/bindings/testing/enumeration_bindings_test.cc
index 01acc6a..c985c6d 100644
--- a/cobalt/bindings/testing/enumeration_bindings_test.cc
+++ b/cobalt/bindings/testing/enumeration_bindings_test.cc
@@ -65,10 +65,11 @@
   InSequence dummy;
 
   std::string result;
-  EXPECT_TRUE(EvaluateScript(
-      "var caught_exception = null; "
-      "try { test.enumProperty = \"invalid\"; } "
-      "catch (e) { caught_exception = e }", NULL));
+  EXPECT_TRUE(
+      EvaluateScript("var caught_exception = null; "
+                     "try { test.enumProperty = \"invalid\"; } "
+                     "catch (e) { caught_exception = e }",
+                     NULL));
   EXPECT_TRUE(
       EvaluateScript("caught_exception.constructor === TypeError;", &result));
   EXPECT_STREQ("true", result.c_str());
diff --git a/cobalt/bindings/testing/exceptions_bindings_test.cc b/cobalt/bindings/testing/exceptions_bindings_test.cc
index 44ba808..6b95bfc 100644
--- a/cobalt/bindings/testing/exceptions_bindings_test.cc
+++ b/cobalt/bindings/testing/exceptions_bindings_test.cc
@@ -22,8 +22,8 @@
 using ::testing::DoAll;
 using ::testing::InSequence;
 using ::testing::Invoke;
-using ::testing::Return;
 using ::testing::NiceMock;
+using ::testing::Return;
 using ::testing::WithArg;
 
 #define EXPECT_SUBSTRING(needle, haystack) \
@@ -75,8 +75,9 @@
 
 TEST_F(ExceptionsBindingsTest, ThrowExceptionFromOperation) {
   SimpleExceptionSetter exception_setter(script::kSimpleTypeError);
-  EXPECT_CALL(test_mock(), FunctionThrowsException(_)).WillOnce(
-      Invoke(&exception_setter, &SimpleExceptionSetter::FireException));
+  EXPECT_CALL(test_mock(), FunctionThrowsException(_))
+      .WillOnce(
+          Invoke(&exception_setter, &SimpleExceptionSetter::FireException));
 
   std::string result;
   EXPECT_FALSE(EvaluateScript("test.functionThrowsException();", &result));
@@ -85,9 +86,10 @@
 
 TEST_F(ExceptionsBindingsTest, ThrowExceptionFromGetter) {
   SimpleExceptionSetter exception_setter(script::kSimpleRangeError);
-  EXPECT_CALL(test_mock(), attribute_throws_exception(_)).WillOnce(
-      DoAll(Invoke(&exception_setter, &SimpleExceptionSetter::FireException),
-            Return(false)));
+  EXPECT_CALL(test_mock(), attribute_throws_exception(_))
+      .WillOnce(DoAll(
+          Invoke(&exception_setter, &SimpleExceptionSetter::FireException),
+          Return(false)));
 
   std::string result;
   EXPECT_FALSE(
@@ -113,13 +115,14 @@
   ExceptionObjectSetter exception_setter(exception_object);
 
   InSequence in_sequence_dummy;
-  EXPECT_CALL(test_mock(), FunctionThrowsException(_)).WillOnce(
-      Invoke(&exception_setter, &ExceptionObjectSetter::FireException));
-  EXPECT_TRUE(EvaluateScript(
-      "var error = null;"
-      "try { test.functionThrowsException(); }"
-      "catch(e) { error = e; }",
-      NULL));
+  EXPECT_CALL(test_mock(), FunctionThrowsException(_))
+      .WillOnce(
+          Invoke(&exception_setter, &ExceptionObjectSetter::FireException));
+  EXPECT_TRUE(
+      EvaluateScript("var error = null;"
+                     "try { test.functionThrowsException(); }"
+                     "catch(e) { error = e; }",
+                     NULL));
 
   std::string result;
   EXPECT_TRUE(EvaluateScript("error instanceof Error;", &result));
diff --git a/cobalt/bindings/testing/extended_attributes_test.cc b/cobalt/bindings/testing/extended_attributes_test.cc
index 883ee4f..66708e8 100644
--- a/cobalt/bindings/testing/extended_attributes_test.cc
+++ b/cobalt/bindings/testing/extended_attributes_test.cc
@@ -17,7 +17,6 @@
 #include "base/strings/stringprintf.h"
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/extended_idl_attributes_interface.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::Return;
diff --git a/cobalt/bindings/testing/get_own_property_descriptor.cc b/cobalt/bindings/testing/get_own_property_descriptor.cc
index 5945d36..8814534 100644
--- a/cobalt/bindings/testing/get_own_property_descriptor.cc
+++ b/cobalt/bindings/testing/get_own_property_descriptor.cc
@@ -14,7 +14,6 @@
 
 #include "cobalt/bindings/testing/arbitrary_interface.h"
 #include "cobalt/bindings/testing/bindings_test_base.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/bindings/testing/getter_setter_test.cc b/cobalt/bindings/testing/getter_setter_test.cc
index 580aa49..182b59c 100644
--- a/cobalt/bindings/testing/getter_setter_test.cc
+++ b/cobalt/bindings/testing/getter_setter_test.cc
@@ -25,11 +25,11 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using ::testing::Invoke;
+using ::testing::_;
 using ::testing::InSequence;
+using ::testing::Invoke;
 using ::testing::Return;
 using ::testing::ReturnArg;
-using ::testing::_;
 
 namespace cobalt {
 namespace bindings {
diff --git a/cobalt/bindings/testing/interface_object_test.cc b/cobalt/bindings/testing/interface_object_test.cc
index 80a9fbf..d422738 100644
--- a/cobalt/bindings/testing/interface_object_test.cc
+++ b/cobalt/bindings/testing/interface_object_test.cc
@@ -15,7 +15,6 @@
 #include "cobalt/bindings/testing/arbitrary_interface.h"
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/no_interface_object_interface.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::Return;
@@ -36,16 +35,16 @@
 // Interface object for non-callback interface is a global property.
 TEST_F(InterfaceObjectTest, InterfaceObjectIsGlobalProperty) {
   std::string result;
-  EXPECT_TRUE(EvaluateScript(
-      "this.hasOwnProperty(\"ArbitraryInterface\");", &result));
+  EXPECT_TRUE(
+      EvaluateScript("this.hasOwnProperty(\"ArbitraryInterface\");", &result));
   EXPECT_STREQ("true", result.c_str());
 }
 
 // Interface object for non-callback interface is a function object.
 TEST_F(InterfaceObjectTest, InterfaceObjectIsFunctionObject) {
   std::string result;
-  EXPECT_TRUE(EvaluateScript(
-      "ArbitraryInterface instanceof Function;", &result));
+  EXPECT_TRUE(
+      EvaluateScript("ArbitraryInterface instanceof Function;", &result));
   EXPECT_STREQ("true", result.c_str());
 }
 
@@ -58,8 +57,7 @@
   EXPECT_STREQ("true", result.c_str());
 
   EXPECT_TRUE(EvaluateScript(
-      "ArbitraryInterface.prototype == Object.getPrototypeOf(test);",
-      &result));
+      "ArbitraryInterface.prototype == Object.getPrototypeOf(test);", &result));
   EXPECT_STREQ("true", result.c_str());
 }
 
diff --git a/cobalt/bindings/testing/interface_with_any_dictionary.h b/cobalt/bindings/testing/interface_with_any_dictionary.h
index 11609a9..8748905 100644
--- a/cobalt/bindings/testing/interface_with_any_dictionary.h
+++ b/cobalt/bindings/testing/interface_with_any_dictionary.h
@@ -16,7 +16,6 @@
 #define COBALT_BINDINGS_TESTING_INTERFACE_WITH_ANY_DICTIONARY_H_
 
 #include "base/compiler_specific.h"
-
 #include "cobalt/bindings/testing/test_dictionary.h"
 #include "cobalt/script/script_value.h"
 #include "cobalt/script/value_handle.h"
diff --git a/cobalt/bindings/testing/numeric_type_bindings_test.cc b/cobalt/bindings/testing/numeric_type_bindings_test.cc
index 3906ebc..4cc347e 100644
--- a/cobalt/bindings/testing/numeric_type_bindings_test.cc
+++ b/cobalt/bindings/testing/numeric_type_bindings_test.cc
@@ -17,7 +17,6 @@
 #include "base/strings/stringprintf.h"
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/numeric_types_test_interface.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::Eq;
diff --git a/cobalt/bindings/testing/object_type_bindings_test.cc b/cobalt/bindings/testing/object_type_bindings_test.cc
index fce4047..3472fb7 100644
--- a/cobalt/bindings/testing/object_type_bindings_test.cc
+++ b/cobalt/bindings/testing/object_type_bindings_test.cc
@@ -120,10 +120,10 @@
   EXPECT_CALL(test_mock(), derived_interface());
 
   std::string result;
-  EXPECT_TRUE(EvaluateScript(
-      "Object.getPrototypeOf(test.derivedInterface) === "
-      "DerivedInterface.prototype;",
-      &result));
+  EXPECT_TRUE(
+      EvaluateScript("Object.getPrototypeOf(test.derivedInterface) === "
+                     "DerivedInterface.prototype;",
+                     &result));
   EXPECT_STREQ("true", result.c_str());
 }
 
diff --git a/cobalt/bindings/testing/operations_bindings_test.cc b/cobalt/bindings/testing/operations_bindings_test.cc
index c5f7b49..3f8c077 100644
--- a/cobalt/bindings/testing/operations_bindings_test.cc
+++ b/cobalt/bindings/testing/operations_bindings_test.cc
@@ -15,7 +15,6 @@
 #include "cobalt/bindings/testing/arbitrary_interface.h"
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/operations_test_interface.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::_;
@@ -144,11 +143,11 @@
 TEST_F(OperationsBindingsTest, OverloadedOperationInvalidNumberOfArguments) {
   InSequence in_sequence_dummy;
 
-  EXPECT_TRUE(EvaluateScript(
-      "var error = null;"
-      "try { test.overloadedFunction(1, 2); }"
-      "catch(e) { error = e; }",
-      NULL));
+  EXPECT_TRUE(
+      EvaluateScript("var error = null;"
+                     "try { test.overloadedFunction(1, 2); }"
+                     "catch(e) { error = e; }",
+                     NULL));
   std::string result;
   EXPECT_TRUE(EvaluateScript(
       "Object.getPrototypeOf(error) === TypeError.prototype;", &result));
diff --git a/cobalt/bindings/testing/optional_arguments_bindings_test.cc b/cobalt/bindings/testing/optional_arguments_bindings_test.cc
index cf86e73..0d11ee9 100644
--- a/cobalt/bindings/testing/optional_arguments_bindings_test.cc
+++ b/cobalt/bindings/testing/optional_arguments_bindings_test.cc
@@ -15,7 +15,6 @@
 #include "cobalt/bindings/testing/arbitrary_interface.h"
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/operations_test_interface.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::Return;
diff --git a/cobalt/bindings/testing/promise_test.cc b/cobalt/bindings/testing/promise_test.cc
index c85bc31..ea2bdf7 100644
--- a/cobalt/bindings/testing/promise_test.cc
+++ b/cobalt/bindings/testing/promise_test.cc
@@ -20,12 +20,12 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::ContainsRegex;
-using ::testing::Invoke;
 using ::testing::InSequence;
+using ::testing::Invoke;
 using ::testing::Return;
 using ::testing::SaveArg;
-using ::testing::_;
 
 namespace cobalt {
 namespace bindings {
diff --git a/cobalt/bindings/testing/sequence_bindings_test.cc b/cobalt/bindings/testing/sequence_bindings_test.cc
index ac3737a..b5f2e2f 100644
--- a/cobalt/bindings/testing/sequence_bindings_test.cc
+++ b/cobalt/bindings/testing/sequence_bindings_test.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "base/logging.h"
-
 #include "cobalt/bindings/testing/arbitrary_interface.h"
 #include "cobalt/bindings/testing/base_interface.h"
 #include "cobalt/bindings/testing/bindings_test_base.h"
diff --git a/cobalt/bindings/testing/static_properties_bindings_test.cc b/cobalt/bindings/testing/static_properties_bindings_test.cc
index 170aa9f..ab5137c 100644
--- a/cobalt/bindings/testing/static_properties_bindings_test.cc
+++ b/cobalt/bindings/testing/static_properties_bindings_test.cc
@@ -14,7 +14,6 @@
 
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/static_properties_interface.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::_;
@@ -79,7 +78,8 @@
 TEST_F(StaticPropertiesBindingsTest, GetStaticAttribute) {
   std::string result;
   EXPECT_CALL(StaticPropertiesInterface::static_methods_mock.Get(),
-              static_attribute()).WillOnce(Return("test_string"));
+              static_attribute())
+      .WillOnce(Return("test_string"));
   EXPECT_TRUE(
       EvaluateScript("StaticPropertiesInterface.staticAttribute;", &result));
   EXPECT_STREQ("test_string", result.c_str());
diff --git a/cobalt/bindings/testing/union_type_bindings_test.cc b/cobalt/bindings/testing/union_type_bindings_test.cc
index 01e4a76..060b722 100644
--- a/cobalt/bindings/testing/union_type_bindings_test.cc
+++ b/cobalt/bindings/testing/union_type_bindings_test.cc
@@ -14,14 +14,13 @@
 
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/union_types_interface.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::ContainsRegex;
 using ::testing::InSequence;
 using ::testing::Return;
 using ::testing::SaveArg;
-using ::testing::_;
 
 namespace cobalt {
 namespace bindings {
@@ -35,8 +34,9 @@
   InSequence dummy;
 
   std::string result;
-  EXPECT_CALL(test_mock(), union_property()).WillOnce(
-      Return(UnionTypesInterface::UnionPropertyType(std::string("foo"))));
+  EXPECT_CALL(test_mock(), union_property())
+      .WillOnce(
+          Return(UnionTypesInterface::UnionPropertyType(std::string("foo"))));
   EXPECT_TRUE(
       EvaluateScript("typeof test.unionProperty == \"string\";", &result));
   EXPECT_STREQ("true", result.c_str());
@@ -44,10 +44,10 @@
   EXPECT_CALL(test_mock(), union_property())
       .WillOnce(Return(UnionTypesInterface::UnionPropertyType(
           base::WrapRefCounted(new ArbitraryInterface()))));
-  EXPECT_TRUE(EvaluateScript(
-      "Object.getPrototypeOf(test.unionProperty) === "
-      "ArbitraryInterface.prototype;",
-      &result));
+  EXPECT_TRUE(
+      EvaluateScript("Object.getPrototypeOf(test.unionProperty) === "
+                     "ArbitraryInterface.prototype;",
+                     &result));
   EXPECT_STREQ("true", result.c_str());
 
   EXPECT_CALL(test_mock(), union_property())
diff --git a/cobalt/bindings/testing/union_types_interface.h b/cobalt/bindings/testing/union_types_interface.h
index 39e9ff4..86c37c9 100644
--- a/cobalt/bindings/testing/union_types_interface.h
+++ b/cobalt/bindings/testing/union_types_interface.h
@@ -32,9 +32,9 @@
 class UnionTypesInterface : public script::Wrappable {
  public:
   typedef script::UnionType4<std::string, bool,
-                             scoped_refptr<ArbitraryInterface>,
-                             int32_t> UnionPropertyType;
-  typedef base::Optional<script::UnionType2<double, std::string> >
+                             scoped_refptr<ArbitraryInterface>, int32_t>
+      UnionPropertyType;
+  typedef base::Optional<script::UnionType2<double, std::string>>
       NullableUnionPropertyType;
   typedef script::UnionType2<scoped_refptr<BaseInterface>, std::string>
       UnionBasePropertyType;
@@ -45,19 +45,19 @@
       script::UnionType2<DerivedDictionary, scoped_refptr<ArbitraryInterface>>;
 
   MOCK_METHOD0(union_property, UnionPropertyType());
-  MOCK_METHOD1(set_union_property, void(const UnionPropertyType&));
+  MOCK_METHOD1(set_union_property, void(const UnionPropertyType &));
 
   MOCK_METHOD0(union_with_nullable_member_property,
                NullableUnionPropertyType());
   MOCK_METHOD1(set_union_with_nullable_member_property,
-               void(const NullableUnionPropertyType&));
+               void(const NullableUnionPropertyType &));
 
   MOCK_METHOD0(nullable_union_property, NullableUnionPropertyType());
   MOCK_METHOD1(set_nullable_union_property,
-               void(const NullableUnionPropertyType&));
+               void(const NullableUnionPropertyType &));
 
   MOCK_METHOD0(union_base_property, UnionBasePropertyType());
-  MOCK_METHOD1(set_union_base_property, void(const UnionBasePropertyType&));
+  MOCK_METHOD1(set_union_base_property, void(const UnionBasePropertyType &));
 
   MOCK_METHOD0(union_with_dictionary_property, UnionDictPropertyType());
   MOCK_METHOD1(set_union_with_dictionary_property,
diff --git a/cobalt/bindings/testing/variadic_arguments_bindings_test.cc b/cobalt/bindings/testing/variadic_arguments_bindings_test.cc
index ec140aa..ef45ab1 100644
--- a/cobalt/bindings/testing/variadic_arguments_bindings_test.cc
+++ b/cobalt/bindings/testing/variadic_arguments_bindings_test.cc
@@ -15,13 +15,12 @@
 #include "cobalt/bindings/testing/arbitrary_interface.h"
 #include "cobalt/bindings/testing/bindings_test_base.h"
 #include "cobalt/bindings/testing/operations_test_interface.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::InSequence;
 using ::testing::Return;
 using ::testing::SaveArg;
-using ::testing::_;
 
 namespace cobalt {
 namespace bindings {
@@ -61,14 +60,16 @@
       "test.variadicStringArgumentsAfterOptionalArgument();", NULL));
 
   std::vector<std::string> string_args;
-  EXPECT_CALL(test_mock(), VariadicStringArgumentsAfterOptionalArgument(
-                               true, _)).WillOnce(SaveArg<1>(&string_args));
+  EXPECT_CALL(test_mock(),
+              VariadicStringArgumentsAfterOptionalArgument(true, _))
+      .WillOnce(SaveArg<1>(&string_args));
   EXPECT_TRUE(EvaluateScript(
       "test.variadicStringArgumentsAfterOptionalArgument(true);", NULL));
   EXPECT_EQ(0, string_args.size());
 
-  EXPECT_CALL(test_mock(), VariadicStringArgumentsAfterOptionalArgument(
-                               false, _)).WillOnce(SaveArg<1>(&string_args));
+  EXPECT_CALL(test_mock(),
+              VariadicStringArgumentsAfterOptionalArgument(false, _))
+      .WillOnce(SaveArg<1>(&string_args));
   EXPECT_TRUE(EvaluateScript(
       "test.variadicStringArgumentsAfterOptionalArgument(false, \"zero\", "
       "\"one\");",
diff --git a/cobalt/bindings/v8c/templates/macros.cc.template b/cobalt/bindings/v8c/templates/macros.cc.template
index ce11720..d7545c9 100644
--- a/cobalt/bindings/v8c/templates/macros.cc.template
+++ b/cobalt/bindings/v8c/templates/macros.cc.template
@@ -220,7 +220,7 @@
 {# If no variadic arguments have been set, we still call the function with
    signature that has the variadic argument and pass an empty vector. There is
    no such function signature that takes the optional parameter immediately
-   preceeding the variadic argument but does not take the variadic arguments. #}
+   preceding the variadic argument but does not take the variadic arguments. #}
 {% if loop.last or not operation.arguments[num_arguments].is_variadic %}
 {% set function_arguments =
       operation.arguments[0:num_arguments]|map(attribute='name')|list %}
diff --git a/cobalt/black_box_tests/README.md b/cobalt/black_box_tests/README.md
index 409390c..1ad41d0 100644
--- a/cobalt/black_box_tests/README.md
+++ b/cobalt/black_box_tests/README.md
@@ -15,37 +15,57 @@
   3. Re-fetch network requests after network shortage.
 
 
+## Adding a New Test
+
+  1. Add a python test script in tests/.
+     1.  The python script, at a minimum, needs to load your HTML (see step #2)
+         and call both `runner.WaitForJSTestsSetup()` and
+         `self.assertTrue(runner.JSTestsSucceeded())`. See one of the many python
+         scripts in this directory as an example.
+  2. Add target web page(s) and associated resources(if any) to testdata/.
+     1.  At a minimum, call `setupFinished()` and `onEndTest()` when the test is
+         ready to run and when it's completed running respectively. You'll need
+         to have loaded `<script src='black_box_js_test_utils.js'></script>` for
+         these utility methods to be available.
+  3. Add the test name (name of the python test script) to black_box_tests.py
+     to automate new test. Add the name to the list of tests requiring
+     app launcher support for system signals (e.g. suspend/resume), or the list
+     of tests requiring deep link support, or the list of tests that don't.
+
+
 ## Running Tests:
 
   1. To run all tests:
 
-     $ python path/to/black_box_tests.py --platform PLATFORM --config CONFIG
+     `$ python path/to/black_box_tests.py --platform PLATFORM --config CONFIG`
 
      e.g.
-     $ python path/to/black_box_tests.py --platform linux-x64x11 --config
-       devel
+     `$ python path/to/black_box_tests.py --platform linux-x64x11 --config
+       devel`
 
 
   2. To run an individual test:
 
-     $ python path/to/black_box_tests.py --platform PLATFORM --config CONFIG
-       --test_name TEST_NAME
+     `$ python path/to/black_box_tests.py --platform PLATFORM --config CONFIG
+       --test_name TEST_NAME`
 
      e.g.
-     $ python path/to/black_box_tests.py --platform linux-x64x11 --config devel
-       --test_name preload_font
+     `$ python path/to/black_box_tests.py --platform linux-x64x11 --config devel
+       --test_name preload_font`
 
-     You can apply --gtest_filter through --target_params, e.g.
-     $ python path/to/black_box_tests.py --platform linux-x64x11 --config devel
-       --test_name web_platform_tests
-       --target_params="--gtest_filter=fetch/*"
+     You can apply `--gtest_filter` through `--target_params`, e.g.
+     ```
+       $ python path/to/black_box_tests.py --platform linux-x64x11 --config devel
+         --test_name web_platform_tests
+         --target_params="--gtest_filter=fetch/*"
+     ```
 
      Note: When declaring a gtest_filter, it will override the filters defined
      in GetWebPlatformTestFilters in configuration.py.
 
   If you see a HTTPConnection error which eventually
   causes a TimeoutException for the test, you might want
-  to add "--server_binding_address localhost" in your
+  to add `--server_binding_address localhost` in your
   python command.
 
 ## Tests
@@ -59,17 +79,18 @@
 
 A wrapper around the app launcher. BlackBoxCobaltRunner includes a webdriver
 module attached to the app launcher's Cobalt instance after it starts running.
-Includes a method(JSTestsSucceeded()) to check test result on the JavaScript
+Includes a method(`JSTestsSucceeded()`) to check test result on the JavaScript
 side. Call this method to wait for JavaScript test result.
 black_box_js_test_utils.js provides some utility functions that are meant to
-work with runner.JSTestsSucceeded() in the python test scripts. Together,
+work with `runner.JSTestsSucceeded()` in the python test scripts. Together,
 they allow for test logic to exist in either the python test scripts or
 JavaScript test data.
-e.g. Call OnEndTest() to signal test completion on the JavaScript side,
-JSTestsSucceeded() will react to the signal and return the test status of
+
+Call `OnEndTest()` to signal test completion on the JavaScript side,
+`JSTestsSucceeded()` will react to the signal and return the test status of
 JavaScript test logic; another example is that when the python script wants to
-wait for some setup steps on JavaScript, call runner.WaitForJSTestsSetup().
-Calling setupFinished() in JavaScript whenever ready will unblock the wait.
+wait for some setup steps on JavaScript, call `runner.WaitForJSTestsSetup()`.
+Calling `setupFinished()` in JavaScript whenever ready will unblock the wait.
 
 
 ## Test Data
@@ -77,18 +98,10 @@
 A default local test server will be launched before any unit test starts to
 serve the test data in black_box_tests/testdata/. The server's port will be
 passed to the app launcher to fetch test data from.
+
 Test data can include the target web page for Cobalt to open and any additional
 resources (font file, JavaScripts...).
+
 Tests are free to start their own HTTP servers if the default test server is
 inadequate (e.g. The test is testing that Cobalt handles receipt of a specific
 HTTP server generated error code properly).
-
-
-## Adding a New Test
-
-  1. Add a python test script in tests/.
-  2. Add target web page(s) and associated resources(if any) to testdata/.
-  3. Add the test name(name of the python test script) to black_box_tests.py
-     to automate new test. Add the name to the list of tests requiring
-     app launcher support for system signals(e.g. suspend/resume), or the list
-     of tests requiring deep link support, or the list of tests that don't.
diff --git a/tools/lbshell/open_source_release/create_tarball.sh b/cobalt/black_box_tests/bbt_settings.py
old mode 100755
new mode 100644
similarity index 79%
rename from tools/lbshell/open_source_release/create_tarball.sh
rename to cobalt/black_box_tests/bbt_settings.py
index 79904b4..d6d67fd
--- a/tools/lbshell/open_source_release/create_tarball.sh
+++ b/cobalt/black_box_tests/bbt_settings.py
@@ -1,5 +1,3 @@
-#!/bin/bash
-#
 # Copyright 2023 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,6 +11,7 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+"""Contains global settings for all tests"""
 
-CURRENT_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-${CURRENT_DIR}/../../../internal/tools/lbshell/open_source_release/create_tarball.sh "$@"
+# Setting it to None instead of 0 exposes issues.
+default_web_server_port = None
diff --git a/cobalt/black_box_tests/black_box_cobalt_runner.py b/cobalt/black_box_tests/black_box_cobalt_runner.py
index 9e83f09..c3829c6 100644
--- a/cobalt/black_box_tests/black_box_cobalt_runner.py
+++ b/cobalt/black_box_tests/black_box_cobalt_runner.py
@@ -50,6 +50,7 @@
                target_params=None,
                success_message=None,
                poll_until_wait_seconds=POLL_UNTIL_WAIT_SECONDS,
+               web_server_port=None,
                **kwargs):
     # For black box tests, don't log inline script warnings, we intend to
     # explicitly control timings for suspends and resumes, so we are not
@@ -65,6 +66,7 @@
         target_params,
         success_message,
         poll_until_wait_seconds=poll_until_wait_seconds,
+        web_server_port=web_server_port,
         **kwargs)
 
     self.poll_until_wait_seconds = poll_until_wait_seconds
diff --git a/cobalt/black_box_tests/black_box_tests.py b/cobalt/black_box_tests/black_box_tests.py
index 99b11c4..3c6c44e 100755
--- a/cobalt/black_box_tests/black_box_tests.py
+++ b/cobalt/black_box_tests/black_box_tests.py
@@ -27,6 +27,7 @@
 import unittest
 
 from cobalt.black_box_tests import black_box_cobalt_runner
+from cobalt.black_box_tests import bbt_settings
 from cobalt.black_box_tests.proxy_server import ProxyServer
 from starboard.tools import abstract_launcher
 from starboard.tools import build
@@ -78,6 +79,7 @@
     'h5vcc_storage_write_verify_test',
     'http_cache',
     'persistent_cookie',
+    'scroll',
     'service_worker_add_to_cache_test',
     'service_worker_cache_keys_test',
     'service_worker_controller_activation_test',
@@ -89,6 +91,7 @@
     'service_worker_test',
     'service_worker_persist_test',
     'soft_mic_platform_service_test',
+    'telemetry_test',
     'text_encoding_test',
     'wasm_basic_test',
     'web_debugger',
@@ -108,7 +111,8 @@
 ]
 # These tests can only run on Evergreen-compatible platforms.
 _TESTS_EVERGREEN_END_TO_END = [
-    'evergreen_verify_qa_channel_update_test',
+    # Temporary disable test to publish new SB 16 changes b/149243810
+    #'evergreen_verify_qa_channel_update_test',
 ]
 # Location of test files.
 _TEST_DIR_PATH = 'cobalt.black_box_tests.tests.'
@@ -153,6 +157,7 @@
         launcher_params=_launcher_params,
         url=url,
         target_params=all_target_params,
+        web_server_port=bbt_settings.default_web_server_port,
         **kwargs)
 
   def GetBindingAddress(self):
@@ -243,6 +248,11 @@
     _wpt_http_port = args.wpt_http_port or str(
         self.GetUnusedPort([_server_binding_address]))
 
+    # Port used to set up tunneling between host and device for testdata server.
+    sock = socket.socket()
+    sock.bind(('', 0))
+    bbt_settings.default_web_server_port = sock.getsockname()[1]
+
     # Proxy is only needed for WPT
     self.use_proxy = args.test_set in ['all', 'wpt']
 
diff --git a/cobalt/black_box_tests/testdata/allow_eval.html b/cobalt/black_box_tests/testdata/allow_eval.html
index c7ad9e4..78f2714 100644
--- a/cobalt/black_box_tests/testdata/allow_eval.html
+++ b/cobalt/black_box_tests/testdata/allow_eval.html
@@ -22,4 +22,4 @@
     }
     onEndTest();
   </script>
-</body>
\ No newline at end of file
+</body>
diff --git a/cobalt/black_box_tests/testdata/black_box_js_test_utils.js b/cobalt/black_box_tests/testdata/black_box_js_test_utils.js
index e4dfc8a..ce5dde4 100644
--- a/cobalt/black_box_tests/testdata/black_box_js_test_utils.js
+++ b/cobalt/black_box_tests/testdata/black_box_js_test_utils.js
@@ -72,7 +72,7 @@
   }
 }
 
-function assertFalse(result) {
+function assertFalse(result, msg) {
   if (result) {
     const errorMessage = '\n' +
       'Black Box Test Assertion failed: \n' +
diff --git a/cobalt/black_box_tests/testdata/disable_eval_with_csp.html b/cobalt/black_box_tests/testdata/disable_eval_with_csp.html
index 447a3bd..349fd4d 100644
--- a/cobalt/black_box_tests/testdata/disable_eval_with_csp.html
+++ b/cobalt/black_box_tests/testdata/disable_eval_with_csp.html
@@ -18,4 +18,4 @@
     eval('1+3')
 
   </script>
-</body>
\ No newline at end of file
+</body>
diff --git a/cobalt/black_box_tests/testdata/persistent_cookie.html b/cobalt/black_box_tests/testdata/persistent_cookie.html
index d7e838f..e029f39 100644
--- a/cobalt/black_box_tests/testdata/persistent_cookie.html
+++ b/cobalt/black_box_tests/testdata/persistent_cookie.html
@@ -71,4 +71,4 @@
     }
     setupFinished();
   </script>
-</body>
\ No newline at end of file
+</body>
diff --git a/cobalt/black_box_tests/testdata/preload_font.html b/cobalt/black_box_tests/testdata/preload_font.html
index 180af0e..b7a17c3 100644
--- a/cobalt/black_box_tests/testdata/preload_font.html
+++ b/cobalt/black_box_tests/testdata/preload_font.html
@@ -44,4 +44,4 @@
     document.addEventListener("visibilitychange", handleVisibilityChange);
     setupFinished();
   </script>
-</body>
\ No newline at end of file
+</body>
diff --git a/cobalt/black_box_tests/testdata/preload_launch_parameter.html b/cobalt/black_box_tests/testdata/preload_launch_parameter.html
index 2576463..a040d79 100644
--- a/cobalt/black_box_tests/testdata/preload_launch_parameter.html
+++ b/cobalt/black_box_tests/testdata/preload_launch_parameter.html
@@ -32,4 +32,4 @@
 
     setupFinished();
   </script>
-</body>
\ No newline at end of file
+</body>
diff --git a/cobalt/black_box_tests/testdata/scroll.html b/cobalt/black_box_tests/testdata/scroll.html
new file mode 100644
index 0000000..d8adade
--- /dev/null
+++ b/cobalt/black_box_tests/testdata/scroll.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+
+<html>
+
+<head>
+  <title>Cobalt scroll test</title>
+  <script src='black_box_js_test_utils.js'></script>
+  <style>
+    .app {
+      position: absolute;
+      width: 80rem;
+      height: 45rem;
+      overflow: hidden;
+      padding: 20px;
+      z-index: 1;
+    }
+
+    .row {
+      /* pointer-events: auto; */
+      position: relative;
+      overflow: auto;
+      height: 20rem;
+      width: 80rem;
+    }
+
+    .tile {
+      position: absolute;
+      height: 10rem;
+      width: 200rem;
+      background: linear-gradient(0.25turn, #f4aca9, #ebf8e1, #bce6f3);
+    }
+  </style>
+</head>
+
+<body>
+  <div class="app" style="overflow:auto;">
+    <div id="row" class="row" style="height: 20rem;">
+      <div id="top_one" class="tile">One</div>
+    </div>
+  </div>
+</body>
+<script>
+  function checkEndState() {
+    const scroll_container = document.getElementById("row");
+    assertTrue(scroll_container.scrollLeft > 0);
+    onEndTest();
+  }
+
+  window.onload = () => {
+    setupFinished();
+  }
+
+  window.onkeydown = (event) => {
+    if (event.key == 0) {
+      checkEndState();
+    }
+  }
+</script>
+
+</html>
diff --git a/cobalt/black_box_tests/testdata/suspend_visibility.html b/cobalt/black_box_tests/testdata/suspend_visibility.html
index 092e817..6dbf5a0 100644
--- a/cobalt/black_box_tests/testdata/suspend_visibility.html
+++ b/cobalt/black_box_tests/testdata/suspend_visibility.html
@@ -74,4 +74,4 @@
     document.addEventListener("visibilitychange", handleVisibilityChange);
     setupFinished();
   </script>
-</body>
\ No newline at end of file
+</body>
diff --git a/cobalt/black_box_tests/testdata/telemetry_test.html b/cobalt/black_box_tests/testdata/telemetry_test.html
new file mode 100644
index 0000000..01ccf90
--- /dev/null
+++ b/cobalt/black_box_tests/testdata/telemetry_test.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<!--
+  Copyright 2023 The Cobalt Authors. All Rights Reserved.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<html>
+
+<head>
+    <title>Cobalt Telemetry Test</title>
+    <script src='black_box_js_test_utils.js'></script>
+</head>
+
+<body>
+    <script>
+        const metrics = window.h5vcc.metrics;
+        const EVENT_INTERVAL_SECS = 5;
+        let lastMetricType = '';
+        let lastPayload = '';
+        let payloadCount = 0;
+
+        function metricEventHandler(metricType, payload) {
+            lastMetricType = metricType;
+            lastPayload = payload;
+            payloadCount++;
+        }
+
+        function initTelemetry() {
+            metrics.enable();
+            metrics.setMetricEventInterval(EVENT_INTERVAL_SECS);
+            metrics.onMetricEvent(metricEventHandler);
+        }
+        window.onload = function () {
+            initTelemetry();
+
+            setupFinished();
+
+            setTimeout(() => {
+                assertTrue(metrics.isEnabled(), 'metrics should be enabled');
+                assertEqual('COBALT_UMA', lastMetricType, 'metricType should be uma');
+                assertTrue(lastPayload.length > 0, 'payload should be non-empty');
+                assertEqual(1, payloadCount, 'only one payload sent');
+            }, 4000);
+
+            setTimeout(() => {
+                assertEqual('COBALT_UMA', lastMetricType, 'metricType should be uma');
+                assertTrue(lastPayload.length > 0, 'payload should be non-empty');
+                assertEqual(2, payloadCount, 'two payloads sent');
+
+                metrics.disable();
+
+                setTimeout(() => {
+                    assertFalse(metrics.isEnabled(), 'should disable metrics');
+                    onEndTest();
+                }, 1000);
+            }, 11000);
+        }
+    </script>
+</body>
+
+</html>
diff --git a/cobalt/black_box_tests/testdata/timer_hit_after_preload.html b/cobalt/black_box_tests/testdata/timer_hit_after_preload.html
index facfcfb..cc2c20b 100644
--- a/cobalt/black_box_tests/testdata/timer_hit_after_preload.html
+++ b/cobalt/black_box_tests/testdata/timer_hit_after_preload.html
@@ -41,4 +41,4 @@
     NewElement.setAttribute('id', 'script_executed');
     document.appendChild(NewElement);
   </script>
-</body>
\ No newline at end of file
+</body>
diff --git a/cobalt/black_box_tests/testdata/timer_hit_in_preload.html b/cobalt/black_box_tests/testdata/timer_hit_in_preload.html
index a8b8510..5048f7b 100644
--- a/cobalt/black_box_tests/testdata/timer_hit_in_preload.html
+++ b/cobalt/black_box_tests/testdata/timer_hit_in_preload.html
@@ -37,4 +37,4 @@
       verifyAllMethods();
     }, 1500);
   </script>
-</body>
\ No newline at end of file
+</body>
diff --git a/cobalt/black_box_tests/tests/preload_font.py b/cobalt/black_box_tests/tests/preload_font.py
index b43a00a..6b09bf5 100644
--- a/cobalt/black_box_tests/tests/preload_font.py
+++ b/cobalt/black_box_tests/tests/preload_font.py
@@ -40,8 +40,9 @@
         start_time = time.time()
         while runner.IsInPreload():
           if time.time() - start_time > _MAX_RESUME_WAIT_SECONDS:
-            raise Exception('Cobalt can not exit preload mode after receiving'
-                            'resume signal')
+            raise RuntimeError(
+                'Cobalt can not exit preload mode after receiving'
+                'resume signal')
           time.sleep(.1)
         # At this point, Cobalt is in started mode.
         self.assertTrue(runner.JSTestsSucceeded())
diff --git a/cobalt/black_box_tests/tests/scroll.py b/cobalt/black_box_tests/tests/scroll.py
new file mode 100644
index 0000000..e0db0fd
--- /dev/null
+++ b/cobalt/black_box_tests/tests/scroll.py
@@ -0,0 +1,64 @@
+# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests for scroll containers."""
+
+import logging
+import traceback
+
+from cobalt.black_box_tests import black_box_tests
+from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
+from selenium.webdriver.common.action_chains import ActionChains
+from selenium.webdriver.common import keys
+
+# Time to sleep after a mouse move to give the device time to process it and
+# to avoid collapsing with subsequent move events.
+_SLEEP_AFTER_MOVE_TIME = 0.5
+
+
+def find_element_by_id(runner, id_selector):
+  return runner.webdriver.find_elements_by_css_selector('#' + id_selector)[0]
+
+
+class PointerTest(black_box_tests.BlackBoxTestCase):
+  """Tests pointer and mouse event."""
+
+  def test_pointer_events(self):
+    try:
+      with ThreadedWebServer(
+          binding_address=self.GetBindingAddress()) as server:
+        url = server.GetURL(file_name='testdata/scroll.html')
+
+        with self.CreateCobaltRunner(url=url) as runner:
+          logging.info('JS Test Setup WaitForJSTestsSetup')
+          runner.WaitForJSTestsSetup()
+          logging.info('JS Test Setup')
+          self.assertTrue(runner.webdriver)
+
+          row = find_element_by_id(runner, 'row')
+
+          # Perform mouse actions with ActionChains.
+          #   https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.action_chains.html#module-selenium.webdriver.common.action_chains  # pylint: disable=line-too-long
+          actions = ActionChains(runner.webdriver)
+          actions.click_and_hold(row).pause(_SLEEP_AFTER_MOVE_TIME)
+          actions.move_by_offset(-100, 0)
+          actions.release()
+          actions.perform()
+          runner.SendKeys(keys.Keys.NUMPAD0)
+          self.assertTrue(runner.JSTestsSucceeded())
+    except:  # pylint: disable=bare-except
+      traceback.print_exc()
+      # Consider an exception being thrown as a test failure.
+      self.fail('Test failure')
+    finally:
+      logging.info('Cleaning up.')
diff --git a/cobalt/black_box_tests/tests/telemetry_test.py b/cobalt/black_box_tests/tests/telemetry_test.py
new file mode 100644
index 0000000..dbb937b
--- /dev/null
+++ b/cobalt/black_box_tests/tests/telemetry_test.py
@@ -0,0 +1,34 @@
+# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests Cobalt Telemetry functionality."""
+
+from cobalt.black_box_tests import black_box_tests
+from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
+
+
+class TelemetryTest(black_box_tests.BlackBoxTestCase):
+  """Test Cobalt Telemetry functionality."""
+
+  def test_telemetry(self):
+
+    with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server:
+      url = server.GetURL(file_name='testdata/telemetry_test.html')
+
+      # target_params to pass args to cobalt
+      with self.CreateCobaltRunner(
+          url=url,
+          poll_until_wait_seconds=70,
+          target_params=['--initial-metrics-upload-interval=0']) as runner:
+        runner.WaitForJSTestsSetup()
+        self.assertTrue(runner.JSTestsSucceeded())
diff --git a/cobalt/black_box_tests/threaded_web_server.py b/cobalt/black_box_tests/threaded_web_server.py
index d305ea3..040dcac 100644
--- a/cobalt/black_box_tests/threaded_web_server.py
+++ b/cobalt/black_box_tests/threaded_web_server.py
@@ -19,11 +19,12 @@
 
 import logging
 import os
-from six.moves import SimpleHTTPServer
-from six.moves import socketserver
 import socket
 import threading
 
+from six.moves import SimpleHTTPServer
+from six.moves import socketserver
+
 
 class _ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
   pass
@@ -67,7 +68,6 @@
     base_path: A path considered to be the root directory.
     paths_to_headers: A dictionary with keys partial paths and values of header
     dicts. Key is expected to be a substring of a file being served.
-
     E.g. if you have a test with files foo.html and foo.js, you can serve them
     separate headers with the following:
     paths_to_headers = {
@@ -154,7 +154,10 @@
     if not binding_address:
       # No specific binding address specified. Bind to any interfaces instead.
       binding_address = '0.0.0.0'
-    self._server = _ThreadedTCPServer((binding_address, 0), handler)
+    # pylint: disable=import-outside-toplevel
+    from cobalt.black_box_tests.bbt_settings import default_web_server_port
+    binding_port = default_web_server_port
+    self._server = _ThreadedTCPServer((binding_address, binding_port), handler)
 
     self._server_thread = None
 
@@ -164,6 +167,9 @@
       # When listening to any interfaces, get the IPv4 address of the hostname.
       self._bound_host = socket.gethostbyname(socket.gethostname())
 
+  def GetPort(self):
+    return self._bound_port
+
   def GetURL(self, file_name):
     """Given a |file_name|, return a HTTP URI that can be fetched.
 
diff --git a/cobalt/black_box_tests/web_platform_test_server.py b/cobalt/black_box_tests/web_platform_test_server.py
index 50ebda8..4d5d38a 100644
--- a/cobalt/black_box_tests/web_platform_test_server.py
+++ b/cobalt/black_box_tests/web_platform_test_server.py
@@ -73,7 +73,7 @@
     self._server_thread = threading.Thread(target=self.main)
     self._server_thread.start()
     while not self._server_started:
-      time.sleep(.1)
+      time.sleep(0.1)
     return self
 
   def __exit__(self, exc_type, exc_value, traceback):
diff --git a/cobalt/browser/BUILD.gn b/cobalt/browser/BUILD.gn
index 5b015e8..97ac9fa 100644
--- a/cobalt/browser/BUILD.gn
+++ b/cobalt/browser/BUILD.gn
@@ -58,7 +58,6 @@
     "//net",
   ]
   data_deps = [
-    "//cobalt/dom:licenses",
     "//cobalt/network:copy_ssl_certificates",
     "//third_party/icu:icudata",
   ]
@@ -157,7 +156,6 @@
     "//cobalt/audio",
     "//cobalt/base",
     "//cobalt/browser/memory_settings:browser_memory_settings",
-    "//cobalt/browser/memory_tracker:memory_tracker_tool",
     "//cobalt/browser/metrics",
     "//cobalt/build:cobalt_build_id",
     "//cobalt/build:cobalt_build_info",
@@ -200,9 +198,9 @@
     "//components/metrics",
     "//components/metrics_services_manager",
     "//crypto",
-    "//nb",
     "//net",
     "//starboard",
+    "//starboard/common",
     "//third_party/icu:icui18n",
     "//third_party/protobuf:protobuf_lite",
     "//url",
@@ -245,8 +243,6 @@
     "memory_settings/pretty_print_test.cc",
     "memory_settings/table_printer_test.cc",
     "memory_settings/test_common.h",
-    "memory_tracker/tool/tool_impl_test.cc",
-    "memory_tracker/tool/util_test.cc",
     "user_agent_string_test.cc",
   ]
 
@@ -255,7 +251,6 @@
     ":browser_switches",
     "//cobalt/base",
     "//cobalt/browser/memory_settings:browser_memory_settings",
-    "//cobalt/browser/memory_tracker:memory_tracker_tool",
     "//cobalt/dom",
     "//cobalt/loader",
     "//cobalt/math",
@@ -263,7 +258,6 @@
     "//cobalt/speech",
     "//cobalt/storage",
     "//cobalt/test:run_all_unittests",
-    "//nb",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/cobalt/browser/application.cc b/cobalt/browser/application.cc
index 69a52c0..e05b7d0 100644
--- a/cobalt/browser/application.cc
+++ b/cobalt/browser/application.cc
@@ -49,17 +49,15 @@
 #include "cobalt/base/on_screen_keyboard_hidden_event.h"
 #include "cobalt/base/on_screen_keyboard_shown_event.h"
 #include "cobalt/base/on_screen_keyboard_suggestions_updated_event.h"
+#include "cobalt/base/starboard_stats_tracker.h"
 #include "cobalt/base/startup_timer.h"
-#if defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
 #include "cobalt/base/version_compatibility.h"
-#endif  // defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
 #include "cobalt/base/window_on_offline_event.h"
 #include "cobalt/base/window_on_online_event.h"
 #include "cobalt/base/window_size_changed_event.h"
 #include "cobalt/browser/client_hint_headers.h"
 #include "cobalt/browser/device_authentication.h"
 #include "cobalt/browser/memory_settings/auto_mem_settings.h"
-#include "cobalt/browser/memory_tracker/tool.h"
 #include "cobalt/browser/metrics/cobalt_metrics_services_manager.h"
 #include "cobalt/browser/switches.h"
 #include "cobalt/browser/user_agent_platform_info.h"
@@ -78,6 +76,7 @@
 #include "cobalt/watchdog/watchdog.h"
 #include "components/metrics/metrics_service.h"
 #include "starboard/common/device_type.h"
+#include "starboard/common/metrics/stats_tracker.h"
 #include "starboard/common/system_property.h"
 #include "starboard/configuration.h"
 #include "starboard/event.h"
@@ -528,14 +527,6 @@
 base::LazyInstance<NonTrivialStaticFields>::DestructorAtExit
     non_trivial_static_fields = LAZY_INSTANCE_INITIALIZER;
 
-#if defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-const char kMemoryTrackerCommand[] = "memory_tracker";
-const char kMemoryTrackerCommandShortHelp[] = "Create a memory tracker.";
-const char kMemoryTrackerCommandLongHelp[] =
-    "Create a memory tracker of the given type. Use an empty string to see the "
-    "available trackers.";
-#endif  // defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-
 void AddCrashHandlerAnnotations(const UserAgentPlatformInfo& platform_info) {
   auto crash_handler_extension =
       static_cast<const CobaltExtensionCrashHandlerApi*>(
@@ -631,17 +622,7 @@
 
 Application::Application(const base::Closure& quit_closure, bool should_preload,
                          SbTimeMonotonic timestamp)
-    : message_loop_(base::MessageLoop::current()),
-      quit_closure_(quit_closure)
-#if defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-      ,
-      ALLOW_THIS_IN_INITIALIZER_LIST(memory_tracker_command_handler_(
-          kMemoryTrackerCommand,
-          base::Bind(&Application::OnMemoryTrackerCommand,
-                     base::Unretained(this)),
-          kMemoryTrackerCommandShortHelp, kMemoryTrackerCommandLongHelp))
-#endif  // defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-{
+    : message_loop_(base::MessageLoop::current()), quit_closure_(quit_closure) {
   DCHECK(!quit_closure_.is_null());
   if (should_preload) {
     preload_timestamp_ = timestamp;
@@ -693,6 +674,9 @@
   // URLRequestContext;
   base::TaskScheduler::CreateAndStartWithDefaultParams("Cobalt TaskScheduler");
 
+  starboard::StatsTrackerContainer::GetInstance()->set_stats_tracker(
+      std::make_unique<StarboardStatsTracker>());
+
   // Initializes persistent settings.
   persistent_settings_ =
       std::make_unique<persistent_storage::PersistentSettings>(
@@ -768,7 +752,6 @@
 
 #endif  // defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 
-#if defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
   constexpr int kDefaultMinCompatibilityVersion = 1;
   int minimum_version = kDefaultMinCompatibilityVersion;
 #if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
@@ -781,7 +764,6 @@
   }
 #endif  // defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   base::VersionCompatibility::GetInstance()->SetMinimumVersion(minimum_version);
-#endif  // defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
 
   base::Optional<std::string> partition_key;
   if (command_line->HasSwitch(browser::switches::kLocalStoragePartitionUrl)) {
@@ -860,14 +842,6 @@
 
   EnableUsingStubImageDecoderIfRequired();
 
-#if defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-  if (command_line->HasSwitch(switches::kMemoryTracker)) {
-    std::string command_arg =
-        command_line->GetSwitchValueASCII(switches::kMemoryTracker);
-    memory_tracker_tool_ = memory_tracker::CreateMemoryTrackerTool(command_arg);
-  }
-#endif  // defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-
   if (command_line->HasSwitch(switches::kDisableImageAnimations)) {
     options.web_module_options.enable_image_animations = false;
   }
@@ -907,6 +881,9 @@
   network_module_.reset(new network::NetworkModule(
       CreateUserAgentString(platform_info), GetClientHintHeaders(platform_info),
       &event_dispatcher_, network_module_options));
+  // This is not necessary, but since some platforms need a lot of time to read
+  // the savegame, start the storage manager as soon as possible here.
+  network_module_->EnsureStorageManagerStarted();
 
   AddCrashHandlerAnnotations(platform_info);
 
@@ -1013,15 +990,20 @@
 #endif  // ENABLE_WEBDRIVER
 
 #if defined(ENABLE_DEBUGGER)
-  int remote_debugging_port = GetRemoteDebuggingPort();
-  if (remote_debugging_port == 0) {
-    DLOG(INFO) << "Remote web debugger disabled because "
-               << switches::kRemoteDebuggingPort << " is 0.";
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDisableWebDebugger)) {
+    LOG(INFO) << "Remote web debugger disabled.";
   } else {
-    debug_web_server_.reset(new debug::remote::DebugWebServer(
-        remote_debugging_port, GetDevServersListenIp(),
-        base::Bind(&BrowserModule::CreateDebugClient,
-                   base::Unretained(browser_module_.get()))));
+    int remote_debugging_port = GetRemoteDebuggingPort();
+    if (remote_debugging_port == 0) {
+      LOG(INFO) << "Remote web debugger disabled because "
+                << switches::kRemoteDebuggingPort << " is 0.";
+    } else {
+      debug_web_server_.reset(new debug::remote::DebugWebServer(
+          remote_debugging_port, GetDevServersListenIp(),
+          base::Bind(&BrowserModule::CreateDebugClient,
+                     base::Unretained(browser_module_.get()))));
+    }
   }
 #endif  // ENABLE_DEBUGGER
 
@@ -1052,10 +1034,6 @@
   // an opportunity to clean up late logs and persist metrics.
   metrics::CobaltMetricsServicesManager::DeleteInstance();
 
-#if defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-  memory_tracker_tool_.reset(NULL);
-#endif  // defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-
   // Unregister event callbacks.
   event_dispatcher_.RemoveEventCallback(base::WindowSizeChangedEvent::TypeId(),
                                         window_size_change_event_callback_);
@@ -1471,24 +1449,6 @@
   event_dispatcher_.DispatchEvent(std::unique_ptr<base::Event>(event));
 }
 
-#if defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-void Application::OnMemoryTrackerCommand(const std::string& message) {
-  if (base::MessageLoop::current() != message_loop_) {
-    message_loop_->task_runner()->PostTask(
-        FROM_HERE, base::Bind(&Application::OnMemoryTrackerCommand,
-                              base::Unretained(this), message));
-    return;
-  }
-
-  if (memory_tracker_tool_) {
-    LOG(ERROR) << "Can not create a memory tracker when one is already active.";
-    return;
-  }
-  LOG(WARNING) << "Creating \"" << message << "\" memory tracker.";
-  memory_tracker_tool_ = memory_tracker::CreateMemoryTrackerTool(message);
-}
-#endif  // defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-
 // Called to handle deep link consumed events.
 void Application::OnDeepLinkConsumedCallback(const std::string& link) {
   LOG(INFO) << "Got deep link consumed callback: " << link;
@@ -1558,9 +1518,9 @@
   // it's enabled or upload interval.
   bool is_metrics_enabled = persistent_settings_->GetPersistentSettingAsBool(
       metrics::kMetricEnabledSettingName, false);
-  metrics_services_manager_->SetUploadInterval(
-      persistent_settings_->GetPersistentSettingAsInt(
-          metrics::kMetricEventIntervalSettingName, 300));
+  auto metric_event_interval = persistent_settings_->GetPersistentSettingAsInt(
+      metrics::kMetricEventIntervalSettingName, 300);
+  metrics_services_manager_->SetUploadInterval(metric_event_interval);
   metrics_services_manager_->ToggleMetricsEnabled(is_metrics_enabled);
   // Metric recording state initialization _must_ happen before we bootstrap
   // otherwise we crash.
@@ -1569,6 +1529,10 @@
   // UpdateUploadPermissions bootstraps the whole metric reporting, scheduling,
   // and uploading cycle.
   metrics_services_manager_->UpdateUploadPermissions(is_metrics_enabled);
+  LOG(INFO)
+      << "Cobalt Telemetry initialized with settings: is_metrics_enabled: "
+      << is_metrics_enabled
+      << ", metric_event_interval: " << metric_event_interval;
 }
 
 }  // namespace browser
diff --git a/cobalt/browser/application.h b/cobalt/browser/application.h
index 7ca2d5d..5015219 100644
--- a/cobalt/browser/application.h
+++ b/cobalt/browser/application.h
@@ -26,7 +26,6 @@
 #include "base/threading/thread_checker.h"
 #include "cobalt/base/event_dispatcher.h"
 #include "cobalt/browser/browser_module.h"
-#include "cobalt/browser/memory_tracker/tool.h"
 #include "cobalt/browser/metrics/cobalt_metrics_services_manager.h"
 #include "cobalt/network/network_module.h"
 #include "cobalt/persistent_storage/persistent_settings.h"
@@ -199,17 +198,6 @@
 
   base::RepeatingTimer stats_update_timer_;
 
-#if defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-  std::unique_ptr<memory_tracker::Tool> memory_tracker_tool_;
-
-  // Command handler object for creating a memory tracker.
-  debug::console::ConsoleCommandManager::CommandHandler
-      memory_tracker_command_handler_;
-
-  // Create a memory tracker with the given message
-  void OnMemoryTrackerCommand(const std::string& message);
-#endif  // defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-
   // Deep links are stored here until they are reported consumed.
   std::string unconsumed_deep_link_;
 
diff --git a/cobalt/browser/browser_module.cc b/cobalt/browser/browser_module.cc
index e8f1c28..d83200f 100644
--- a/cobalt/browser/browser_module.cc
+++ b/cobalt/browser/browser_module.cc
@@ -55,7 +55,6 @@
 #include "cobalt/ui_navigation/scroll_engine/scroll_engine.h"
 #include "cobalt/web/csp_delegate_factory.h"
 #include "cobalt/web/navigator_ua_data.h"
-#include "nb/memory_scope.h"
 #include "starboard/atomic.h"
 #include "starboard/common/string.h"
 #include "starboard/configuration.h"
@@ -621,6 +620,10 @@
   }
 
   options.debugger_state = debugger_state_.get();
+  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDisableWebDebugger)) {
+    options.enable_debugger = true;
+  }
 #endif  // ENABLE_DEBUGGER
 
   // Pass down this callback from to Web module.
@@ -1419,9 +1422,14 @@
       FROM_HERE,
       base::Bind(&BrowserModule::GetDebugDispatcherInternal,
                  base::Unretained(this), base::Unretained(&debug_dispatcher)));
-  DCHECK(debug_dispatcher);
-  return std::unique_ptr<debug::DebugClient>(
-      new debug::DebugClient(debug_dispatcher, delegate));
+  if (debug_dispatcher) {
+    return std::unique_ptr<debug::DebugClient>(
+        new debug::DebugClient(debug_dispatcher, delegate));
+  } else {
+    LOG(ERROR)
+        << "Debugger connected but debugging the main web module is disabled.";
+    return nullptr;
+  }
 }
 
 void BrowserModule::GetDebugDispatcherInternal(
diff --git a/cobalt/browser/debug_console.cc b/cobalt/browser/debug_console.cc
index b08fed0..f540eec 100644
--- a/cobalt/browser/debug_console.cc
+++ b/cobalt/browser/debug_console.cc
@@ -205,7 +205,14 @@
 
 void DebugConsole::CycleMode() {
   base::AutoLock lock(mode_mutex_);
-  mode_ = (mode_ + 1) % debug::console::kDebugConsoleModeCount;
+  int number_of_modes = debug::console::kDebugConsoleModeCount;
+#if defined(ENABLE_DEBUGGER)
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDisableWebDebugger)) {
+    number_of_modes = (debug::console::kDebugConsoleModeHud + 1);
+  }
+#endif
+  mode_ = (mode_ + 1) % number_of_modes;
 }
 
 debug::console::DebugConsoleMode DebugConsole::GetMode() {
diff --git a/cobalt/browser/idl_files.gni b/cobalt/browser/idl_files.gni
index 4663d09..12adde0 100644
--- a/cobalt/browser/idl_files.gni
+++ b/cobalt/browser/idl_files.gni
@@ -156,7 +156,6 @@
   "//cobalt/h5vcc/dial/dial_server.idl",
   "//cobalt/h5vcc/h5vcc.idl",
   "//cobalt/h5vcc/h5vcc_accessibility.idl",
-  "//cobalt/h5vcc/h5vcc_account_info.idl",
   "//cobalt/h5vcc/h5vcc_account_manager_internal.idl",
   "//cobalt/h5vcc/h5vcc_audio_config.idl",
   "//cobalt/h5vcc/h5vcc_audio_config_array.idl",
diff --git a/cobalt/browser/memory_settings/calculations_test.cc b/cobalt/browser/memory_settings/calculations_test.cc
index 62104a7..502321e 100644
--- a/cobalt/browser/memory_settings/calculations_test.cc
+++ b/cobalt/browser/memory_settings/calculations_test.cc
@@ -24,7 +24,6 @@
 #include "starboard/common/log.h"
 #include "starboard/memory.h"
 #include "starboard/system.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/browser/memory_settings/pretty_print_test.cc b/cobalt/browser/memory_settings/pretty_print_test.cc
index 4034bfa..3eafe36 100644
--- a/cobalt/browser/memory_settings/pretty_print_test.cc
+++ b/cobalt/browser/memory_settings/pretty_print_test.cc
@@ -30,7 +30,6 @@
 #include "starboard/memory.h"
 #include "starboard/string.h"
 #include "starboard/system.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/browser/memory_tracker/BUILD.gn b/cobalt/browser/memory_tracker/BUILD.gn
deleted file mode 100644
index f2ecb49..0000000
--- a/cobalt/browser/memory_tracker/BUILD.gn
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-static_library("memory_tracker_tool") {
-  has_pedantic_warnings = true
-  sources = [
-    "tool.cc",
-    "tool.h",
-    "tool/buffered_file_writer.cc",
-    "tool/buffered_file_writer.h",
-    "tool/compressed_time_series_tool.cc",
-    "tool/compressed_time_series_tool.h",
-    "tool/histogram_table_csv_base.h",
-    "tool/internal_fragmentation_tool.cc",
-    "tool/internal_fragmentation_tool.h",
-    "tool/leak_finder_tool.cc",
-    "tool/leak_finder_tool.h",
-    "tool/log_writer_tool.cc",
-    "tool/log_writer_tool.h",
-    "tool/malloc_logger_tool.cc",
-    "tool/malloc_logger_tool.h",
-    "tool/malloc_stats_tool.cc",
-    "tool/malloc_stats_tool.h",
-    "tool/memory_size_binner_tool.cc",
-    "tool/memory_size_binner_tool.h",
-    "tool/params.cc",
-    "tool/params.h",
-    "tool/print_csv_tool.cc",
-    "tool/print_csv_tool.h",
-    "tool/print_tool.cc",
-    "tool/print_tool.h",
-    "tool/tool_impl.cc",
-    "tool/tool_impl.h",
-    "tool/tool_thread.cc",
-    "tool/tool_thread.h",
-    "tool/util.cc",
-    "tool/util.h",
-  ]
-  deps = [
-    "//base",
-    "//cobalt/base",
-    "//cobalt/script",
-    "//nb",
-    "//starboard",
-  ]
-}
diff --git a/cobalt/browser/memory_tracker/tool.cc b/cobalt/browser/memory_tracker/tool.cc
deleted file mode 100644
index 0db436a..0000000
--- a/cobalt/browser/memory_tracker/tool.cc
+++ /dev/null
@@ -1,514 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool.h"
-
-#include <cmath>
-#include <cstdlib>
-#include <map>
-#include <memory>
-#include <string>
-
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "cobalt/browser/memory_tracker/tool/compressed_time_series_tool.h"
-#include "cobalt/browser/memory_tracker/tool/internal_fragmentation_tool.h"
-#include "cobalt/browser/memory_tracker/tool/leak_finder_tool.h"
-#include "cobalt/browser/memory_tracker/tool/log_writer_tool.h"
-#include "cobalt/browser/memory_tracker/tool/malloc_logger_tool.h"
-#include "cobalt/browser/memory_tracker/tool/malloc_stats_tool.h"
-#include "cobalt/browser/memory_tracker/tool/memory_size_binner_tool.h"
-#include "cobalt/browser/memory_tracker/tool/print_csv_tool.h"
-#include "cobalt/browser/memory_tracker/tool/print_tool.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-#include "cobalt/browser/memory_tracker/tool/tool_thread.h"
-#include "nb/analytics/memory_tracker_helpers.h"
-#include "starboard/common/log.h"
-#include "starboard/configuration.h"
-#include "starboard/configuration_constants.h"
-#include "starboard/file.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-#if !defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-// Null implementation for memory tracker tool.
-class NullTool : public Tool {
- public:
-  virtual ~NullTool() {}
-};
-
-// Instantiates the memory tracker tool from the command argument.
-std::unique_ptr<Tool> CreateMemoryTrackerTool(const std::string&) {
-  return std::unique_ptr<Tool>(new NullTool);
-}
-
-#else
-
-using nb::analytics::MemoryTracker;
-
-namespace {
-enum SwitchEnum {
-  kNull,
-  kStartup,
-  kContinuousPrinter,
-  kCompressedTimeseries,
-  kBinnerAnalytics,
-  kAllocationLogger,
-  kLeakTracer,
-  kJavascriptLeakTracer,
-  kInternalFragmentationTracer,
-  kMallocStats,
-  kMallocLogger,
-};
-
-struct SwitchVal {
-  SwitchVal() : help_msg(), enum_value(kNull) {}
-  SwitchVal(const SwitchVal& other)
-      : tool_name(other.tool_name),
-        help_msg(other.help_msg),
-        enum_value(other.enum_value) {}
-  SwitchVal(const char* name, const char* msg, SwitchEnum val)
-      : tool_name(name), help_msg(msg), enum_value(val) {}
-
-  std::string tool_name;
-  std::string help_msg;
-  SwitchEnum enum_value;
-};
-
-class SbLogger : public AbstractLogger {
- public:
-  void Output(const char* str) override { LOG(INFO) << str; }
-  void Flush() override { SbLogFlush(); }
-};
-
-class FileLogger : public AbstractLogger {
- public:
-  explicit FileLogger(const std::string& filename);
-  ~FileLogger();
-  void Output(const char* str) override {
-    if (SbFileIsValid(log_file_)) {
-      SbFileWrite(log_file_, str, static_cast<int>(strlen(str)));
-      SbFileFlush(log_file_);
-    } else {
-      LOG(INFO) << str;
-    }
-  }
-  void Flush() override { SbLogFlush(); }
-
- private:
-  SbFile log_file_;
-};
-
-FileLogger::FileLogger(const std::string& filename)
-    : log_file_(kSbFileInvalid) {
-  char file_name_buff[2048] = {};
-  SbSystemGetPath(kSbSystemPathDebugOutputDirectory, file_name_buff,
-                  arraysize(file_name_buff));
-  std::string path(file_name_buff);
-  if (!path.empty()) {  // Protect against a dangling "/" at end.
-    const int back_idx_signed = static_cast<int>(path.length()) - 1;
-    if (back_idx_signed >= 0) {
-      const size_t idx = back_idx_signed;
-      if (path[idx] == kSbFileSepChar) {
-        path.erase(idx);
-      }
-    }
-  }
-  path.push_back(kSbFileSepChar);
-  path.append(filename);
-  int flags = kSbFileCreateAlways | kSbFileWrite;
-  bool created_ok = false;
-  SbFileError error_code = kSbFileOk;
-  log_file_ = SbFileOpen(path.c_str(), flags, &created_ok, &error_code);
-  if (log_file_ == kSbFileInvalid || !created_ok) {
-    LOG(ERROR) << "Error creating log file";
-    return;
-  } else {
-    LOG(INFO) << "Logging to file: " << path;
-  }
-}
-
-FileLogger::~FileLogger() {
-  SbFileClose(log_file_);
-  log_file_ = kSbFileInvalid;
-}  // namespace
-
-// Parses out the toolname for a tool command.
-// Example:
-//   INPUT:  "tool_name(arg):filename"
-//   OUTPUT: "tool_name"
-std::string ParseToolName(const std::string& command_arg) {
-  const size_t first_open_paren_idx = command_arg.find('(');
-  if (first_open_paren_idx == std::string::npos) {
-    const size_t first_colon_idx = command_arg.find(':');
-    if (first_colon_idx == std::string::npos) {
-      return command_arg;
-    }
-    return command_arg.substr(0, first_colon_idx);
-  }
-  return command_arg.substr(0, first_open_paren_idx);
-}
-
-// Parses out the output filename for a tool command.
-// Example:
-//   INPUT:  "tool_name(arg):filename"
-//   OUTPUT: "filename"
-std::string ParseFileName(const std::string& command_arg) {
-  const size_t first_colon_idx = command_arg.find(':');
-  if (first_colon_idx == std::string::npos) {
-    return "";
-  }
-  return command_arg.substr(1 + first_colon_idx);
-}
-
-// Parses out the arguments for a tool.
-// Example:
-//   INPUT:  "tool_name(arg):filename"
-//   OUTPUT: "arg"
-std::string ParseToolArg(const std::string& command_arg) {
-  const size_t first_open_paren_idx = command_arg.find('(');
-  const size_t last_closing_paren_idx = command_arg.find_last_of(')');
-
-  if ((first_open_paren_idx == std::string::npos) ||
-      (last_closing_paren_idx == std::string::npos)) {
-    return "";
-  }
-
-  if (last_closing_paren_idx < first_open_paren_idx) {
-    return "";
-  }
-
-  const size_t begin_idx = first_open_paren_idx + 1;
-  const size_t length = (last_closing_paren_idx - begin_idx);
-  std::string arg_str = command_arg.substr(begin_idx, length);
-  return arg_str;
-}
-
-struct DisableMemoryTrackerInScope {
-  explicit DisableMemoryTrackerInScope(MemoryTracker* tracker)
-      : tracker_(tracker) {
-    if (tracker_) {
-      tracker_->SetMemoryTrackingEnabled(false);
-    }
-  }
-
-  ~DisableMemoryTrackerInScope() {
-    if (tracker_) {
-      tracker_->SetMemoryTrackingEnabled(true);
-    }
-  }
-
-  MemoryTracker* tracker_;
-};
-
-}  // namespace.
-
-class MemoryTrackerThreadImpl : public Tool {
- public:
-  explicit MemoryTrackerThreadImpl(base::SimpleThread* ptr)
-      : thread_ptr_(ptr) {}
-  ~MemoryTrackerThreadImpl() override { thread_ptr_.reset(NULL); }
-  std::unique_ptr<base::SimpleThread> thread_ptr_;
-};
-
-std::unique_ptr<Tool> CreateMemoryTrackerTool(const std::string& command_arg) {
-  // The command line switch for memory_tracker was used. Look into the args
-  // and determine the mode that the memory_tracker should be used for.
-
-  // The map is used to
-  // 1) Resolve the string to an enum.
-  // 2) Print a useful help method of all known memory_tracker modes.
-  typedef std::map<std::string, SwitchVal> SwitchMap;
-
-  SwitchVal startup_tool(
-      "startup(num_mins=1)",  // Name of tool.
-      "  Records high-frequency memory metrics for the first 60\n"
-      "  seconds of program launch and then dumps it out in CSV format\n"
-      "  to stdout.\n",
-      kStartup);
-
-  SwitchVal continuous_printer_tool(
-      "continuous_printer",  // Name of tool.
-      "  Once every second the memory state is dumped to stdout.\n",
-      kContinuousPrinter);
-
-  SwitchVal compressed_timeseries_tool(
-      "compressed_timeseries",  // Name of tool.
-      "  Use this tool to see the growth in memory usage as the app runs.\n"
-      "  The memory growth is segmented into memory scopes and outputted as\n"
-      "  CSV. The compressed time-series will depict the full history of\n"
-      "  the memory using a fixed number of rows. Older history has degraded\n"
-      "  resolution and while new entries are captured in full detail. This\n"
-      "  achieved by evicting old entries by an exponential decay scheme.\n",
-      kCompressedTimeseries);
-
-  SwitchVal binner_tool(
-      "binner(region=NULL)",
-      "  Dumps memory statistics once a second in CSV format to stdout.\n"
-      "  The default memory region is all memory regions. Pass the\n"
-      "  name of the memory region to specify that only that memory region\n"
-      "  should be tracked. For example: binner(Javascript).\n",
-      kBinnerAnalytics);
-
-  SwitchVal allocation_logger_tool(
-      "allocation_logger",
-      "  Continuously writes allocations and deallocations to\n"
-      "  memory_log.txt. This is a legacy format used by lbshell. The\n"
-      "  location of this memory_log.txt file is in the platform dependent\n"
-      "  directory specified by kSbSystemPathDebugOutputDirectory.\n",
-      kAllocationLogger);
-
-  SwitchVal leak_tracing_tool(
-      "leak_tracer",
-      "  Automatically detects leaks and reports them in CSV format.\n",
-      kLeakTracer);
-
-  SwitchVal js_leak_tracing_tool(
-      "js_leak_tracer",
-      "  Automatically detects Javascript leaks and reports them in CSV\n"
-      "  format.\n",
-      kJavascriptLeakTracer);
-
-  SwitchVal internal_fragmentation_tracer_tool(
-      "internal_fragmentation_tracer",
-      "  Traces internal fragmentation and stores it in CSV format.\n",
-      kInternalFragmentationTracer);
-
-  SwitchVal malloc_stats_tool(
-      "malloc_stats",
-      "  Queries the allocation system for memory usage. This is the most\n"
-      "  lightweight tool. Output is CSV format.\n",
-      kMallocStats);
-
-  SwitchVal malloc_logger_tool(
-      "malloc_logger",
-      "  Continuously writes allocations, deallocations, allocation location\n"
-      "  and malloc stats to memory_log_<timestamp>.csv, without headers.\n"
-      "  The location of this log file is in the platform dependent\n"
-      "  directory specified by kSbSystemPathDebugOutputDirectory.\n",
-      kMallocLogger);
-
-  SwitchMap switch_map;
-  switch_map[ParseToolName(startup_tool.tool_name)] = startup_tool;
-  switch_map[ParseToolName(continuous_printer_tool.tool_name)] =
-      continuous_printer_tool;
-  switch_map[ParseToolName(compressed_timeseries_tool.tool_name)] =
-      compressed_timeseries_tool;
-  switch_map[ParseToolName(binner_tool.tool_name)] = binner_tool;
-  switch_map[ParseToolName(allocation_logger_tool.tool_name)] =
-      allocation_logger_tool;
-  switch_map[ParseToolName(leak_tracing_tool.tool_name)] = leak_tracing_tool;
-  switch_map[ParseToolName(js_leak_tracing_tool.tool_name)] =
-      js_leak_tracing_tool;
-  switch_map[ParseToolName(internal_fragmentation_tracer_tool.tool_name)] =
-      internal_fragmentation_tracer_tool;
-  switch_map[ParseToolName(malloc_logger_tool.tool_name)] = malloc_logger_tool;
-
-  switch_map[ParseToolName(malloc_stats_tool.tool_name)] = malloc_stats_tool;
-
-  std::string tool_name = ParseToolName(command_arg);
-  std::string tool_arg = ParseToolArg(command_arg);
-  std::string filename = ParseFileName(command_arg);
-
-  // FAST OUT - is a thread type not selected? Then print out a help menu
-  // and request that the app should shut down.
-  SwitchMap::const_iterator found_it = switch_map.find(tool_name);
-  if (found_it == switch_map.end()) {
-    // Error, tell the user what to do instead and then exit.
-    std::stringstream ss;
-    ss << "\nNo memory tracker tool selected so help has been invoked:\n";
-    ss << "Memory Tracker help:\n";
-    for (SwitchMap::const_iterator it = switch_map.begin();
-         it != switch_map.end(); ++it) {
-      const std::string& name = it->first;
-      const SwitchVal& val = it->second;
-      ss << "    memory_tracker=" << name << " \n" << val.help_msg;
-    }
-    ss << "\nIf the string has a colon, then the name after the colon is used\n"
-          "as the filename for output.\n"
-          "For example: \"leak_tracer:leaks.csv\"\n";
-    LOG(INFO) << ss.str();
-    ss.str("");  // Clears the contents of stringstream.
-
-    // Try and turn off all logging so that the stdout is less likely to be
-    // polluted by interleaving output.
-    logging::SetMinLogLevel(INT_MAX);
-    // SbThreadSleep wants microseconds. We sleep here so that the user can
-    // read the help message before the engine starts up again and the
-    // fills the output with more logging text.
-    const SbTime four_seconds = 4000 * kSbTimeMillisecond;
-    SbThreadSleep(four_seconds);
-
-    found_it = switch_map.find(continuous_printer_tool.tool_name);
-
-    // One more help message and 1-second pause. Then continue on with the
-    // execution as normal.
-    const SbTime one_second = 1000 * kSbTimeMillisecond;
-    SbThreadSleep(one_second);
-  }
-
-  // Okay we have been resolved to use a memory tracker in some way.
-  DLOG(INFO) << "\n\nUsing MemoryTracking=" << found_it->first << "\n";
-
-  // Tools are expected to instantiate the MemoryTracker if they need it.
-  MemoryTracker* memory_tracker = NULL;
-  std::unique_ptr<AbstractTool> tool_ptr;
-
-  const SwitchVal& value = found_it->second;
-  switch (value.enum_value) {
-    case kNull: {
-      SB_NOTREACHED();
-      break;
-    }
-    case kStartup: {
-      double num_mins = 1.0;
-      if (!tool_arg.empty()) {
-        if (!base::StringToDouble(tool_arg, &num_mins) ||
-            std::isnan(num_mins) || num_mins <= 0) {
-          num_mins = 1.0;
-        }
-      }
-      memory_tracker = MemoryTracker::Get();
-      memory_tracker->InstallGlobalTrackingHooks();
-
-      // Converts minutes into Sampling interval and also total sampling time.
-      // To keep the amount of elements in the output static, we adjust the
-      // sampling.
-      //
-      // The number of samples produced is held constants and is:
-      //   kNumSamples = F::TotalSamplingTime(num_mins) /
-      //                 F::SamplingIntervalMs(num_mins)
-      struct F {
-        static int SamplingIntervalMs(double mins) {
-          // kNumSamples is chosen such that SamplingIntervalMs(1) outputs
-          // 240ms.
-          static const double kNumSamples = 250.;
-          const int sample_time_ms =
-              static_cast<int>(ToMilliseconds(mins) / kNumSamples);
-          return static_cast<int>(sample_time_ms);
-        }
-
-        // TotalSamplingTime(1) outputs 60,000 milliseconds, or 1 minute.
-        static int ToMilliseconds(double mins) {
-          const double milliseconds = mins * 60. * 1000.;
-          return static_cast<int>(milliseconds);
-        }
-      };
-
-      // Sample time increases with the number of seconds. At one second we
-      // sample 4 times a second. This keeps the number of samples constant
-      // regardless of input time.
-      int sampling_interval_ms = F::SamplingIntervalMs(num_mins);
-      // Time until output is triggered.
-      int sampling_time_ms = F::ToMilliseconds(num_mins);
-      // Create a thread that will gather memory metrics for startup.
-      DisableMemoryTrackerInScope disable_in_scope(memory_tracker);
-      tool_ptr.reset(new PrintCSVTool(sampling_interval_ms, sampling_time_ms));
-      break;
-    }
-    case kContinuousPrinter: {
-      memory_tracker = MemoryTracker::Get();
-      memory_tracker->InstallGlobalTrackingHooks();
-      // Create a thread that will continuously report memory use.
-      DisableMemoryTrackerInScope disable_in_scope(memory_tracker);
-      tool_ptr.reset(new PrintTool);
-      break;
-    }
-    case kCompressedTimeseries: {
-      memory_tracker = MemoryTracker::Get();
-      memory_tracker->InstallGlobalTrackingHooks();
-      // Create a thread that will continuously report memory use.
-      DisableMemoryTrackerInScope disable_in_scope(memory_tracker);
-      tool_ptr.reset(new CompressedTimeSeriesTool);
-      break;
-    }
-    case kBinnerAnalytics: {
-      memory_tracker = MemoryTracker::Get();
-      memory_tracker->InstallGlobalTrackingHooks();
-      DisableMemoryTrackerInScope disable_in_scope(memory_tracker);
-      // Create a thread that will continuously report javascript memory
-      // analytics.
-      tool_ptr.reset(new MemorySizeBinnerTool(tool_arg));
-      break;
-    }
-    case kAllocationLogger: {
-      std::unique_ptr<LogWriterTool> disk_writer_tool(new LogWriterTool());
-      tool_ptr.reset(disk_writer_tool.release());
-      break;
-    }
-    case kLeakTracer: {
-      std::unique_ptr<LeakFinderTool> leak_finder(
-          new LeakFinderTool(LeakFinderTool::kCPlusPlus));
-
-      memory_tracker = MemoryTracker::Get();
-      memory_tracker->InstallGlobalTrackingHooks();
-      memory_tracker->SetMemoryTrackerDebugCallback(leak_finder.get());
-      tool_ptr.reset(leak_finder.release());
-      break;
-    }
-    case kJavascriptLeakTracer: {
-      std::unique_ptr<LeakFinderTool> leak_finder(
-          new LeakFinderTool(LeakFinderTool::kJavascript));
-
-      memory_tracker = MemoryTracker::Get();
-      memory_tracker->InstallGlobalTrackingHooks();
-      memory_tracker->SetMemoryTrackerDebugCallback(leak_finder.get());
-      tool_ptr.reset(leak_finder.release());
-      break;
-    }
-    case kInternalFragmentationTracer: {
-      memory_tracker = MemoryTracker::Get();
-      memory_tracker->InstallGlobalTrackingHooks();
-      tool_ptr.reset(new InternalFragmentationTool());
-      break;
-    }
-    case kMallocStats: {
-      tool_ptr.reset(new MallocStatsTool);
-      break;
-    }
-    case kMallocLogger: {
-      std::unique_ptr<MallocLoggerTool> malloc_logger(new MallocLoggerTool());
-
-      memory_tracker = MemoryTracker::Get();
-      memory_tracker->InstallGlobalTrackingHooks();
-      memory_tracker->SetMemoryTrackerDebugCallback(malloc_logger.get());
-      tool_ptr.reset(malloc_logger.release());
-      break;
-    }
-  }
-
-  if (tool_ptr.get()) {
-    DisableMemoryTrackerInScope disable_in_scope(memory_tracker);
-    AbstractLogger* logger = NULL;
-    if (!filename.empty()) {
-      logger = new FileLogger(filename);
-    }
-    if (!logger) {
-      logger = new SbLogger;
-    }
-    base::SimpleThread* thread = new ToolThread(memory_tracker,  // May be NULL.
-                                                tool_ptr.release(), logger);
-    return std::unique_ptr<Tool>(new MemoryTrackerThreadImpl(thread));
-  } else {
-    return std::unique_ptr<Tool>();
-  }
-}
-
-#endif  // !defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool.h b/cobalt/browser/memory_tracker/tool.h
deleted file mode 100644
index d18fdce..0000000
--- a/cobalt/browser/memory_tracker/tool.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_H_
-
-#include <memory>
-#include <string>
-
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-// Self running tool. It only has a destructor defined.
-class Tool {
- public:
-  virtual ~Tool() {}
-};
-
-// Instantiates the memory tracker tool from the command argument.
-std::unique_ptr<Tool> CreateMemoryTrackerTool(const std::string& command_arg);
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_H_
diff --git a/cobalt/browser/memory_tracker/tool/buffered_file_writer.cc b/cobalt/browser/memory_tracker/tool/buffered_file_writer.cc
deleted file mode 100644
index 73d3b47..0000000
--- a/cobalt/browser/memory_tracker/tool/buffered_file_writer.cc
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/buffered_file_writer.h"
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-
-#include "starboard/common/condition_variable.h"
-#include "starboard/common/log.h"
-#include "starboard/common/mutex.h"
-#include "starboard/file.h"
-#include "starboard/thread.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-BufferedFileWriter::BufferedFileWriter(const std::string& file_path)
-    : current_log_buffer_(0),
-      log_buffer_to_flush_(NULL),
-      log_file_(kSbFileInvalid),
-      diskwrite_mutex_(),
-      diskwrite_cond_(diskwrite_mutex_),
-      quit_thread_(false),
-      file_path_(file_path) {
-  memset(log_buffers_, 0, sizeof(log_buffers_));
-  StartThread();
-}
-
-BufferedFileWriter::~BufferedFileWriter() { QuitThread(); }
-
-void BufferedFileWriter::QuitThread() {
-  quit_thread_ = true;
-  SwapBuffers();
-  diskwrite_cond_.Signal();
-
-  SbThreadJoin(flush_thread_, NULL);
-
-  SbFileClose(log_file_);
-  log_file_ = kSbFileInvalid;
-}
-
-void BufferedFileWriter::StartThread() {
-  // Do not reset the LogBuffers here, as they may have been written to
-  // before the log thread was started.
-  int flags = kSbFileCreateAlways | kSbFileWrite;
-  bool created_ok = false;
-  SbFileError error_code = kSbFileOk;
-
-  log_file_ = SbFileOpen(file_path_.c_str(), flags, &created_ok, &error_code);
-
-  if (log_file_ == kSbFileInvalid || !created_ok) {
-    SbLogRaw("Error creating memory log file\n");
-    return;
-  }
-
-  flush_thread_ = SbThreadCreate(0,  // default stack size.
-                                 kSbThreadPriorityHigh, kSbThreadNoAffinity,
-                                 true,  // true - joinable.
-                                 "AllocationLoggerWriter", ThreadEntryFunc,
-                                 static_cast<void*>(this));
-}
-
-void BufferedFileWriter::Append(const char* data, size_t num_bytes) {
-  if (num_bytes > kBufferSize) {
-    // We can never log this, and it's probably an error, but let's not write
-    // over the end of the buffer.
-    DCHECK(false) << "Log data is larger than the full buffer size. "
-                     "Dropping log data\n";
-    return;
-  }
-
-  starboard::ScopedLock lock(buffer_write_mutex_);
-
-  // This function may be called before memory_log_writer_start.
-  if (log_buffers_[current_log_buffer_].num_bytes + num_bytes > kBufferSize) {
-    if (!SwapBuffers()) {
-      // Failed to swap the buffer, so we will have to drop this log
-      DCHECK(false) << "Dropping log data. Try increasing buffer size.";
-      return;
-    }
-  }
-
-  LogBuffer& current_buffer = log_buffers_[current_log_buffer_];
-  memcpy(current_buffer.buffer + current_buffer.num_bytes, data,
-               num_bytes);
-  current_buffer.num_bytes += num_bytes;
-  return;
-}
-
-void BufferedFileWriter::Run() {
-  starboard::ScopedLock lock(diskwrite_mutex_);
-  while (!quit_thread_) {
-    if (log_buffer_to_flush_ != NULL) {
-      size_t bytes_written =
-          SbFileWrite(log_file_, log_buffer_to_flush_->buffer,
-                      static_cast<int>(log_buffer_to_flush_->num_bytes));
-      if (bytes_written != log_buffer_to_flush_->num_bytes) {
-        SbLogRaw("Error writing to memory log. Aborting logging\n");
-        break;
-      }
-      log_buffer_to_flush_->num_bytes = 0;
-      log_buffer_to_flush_ = NULL;
-    }
-    diskwrite_cond_.Wait();  // Unlocks diskwrite_mutex_.
-  }
-}
-
-void* BufferedFileWriter::ThreadEntryFunc(void* context) {
-  BufferedFileWriter* self = static_cast<BufferedFileWriter*>(context);
-  self->Run();
-  return NULL;
-}
-
-bool BufferedFileWriter::SwapBuffers() {
-  // If the non-logging threads block on this for too long, try increasing
-  // the size of the buffers.
-  diskwrite_mutex_.Acquire();
-
-  bool can_swap = (log_buffer_to_flush_ == NULL);
-  if (!can_swap) {
-    SbLogRaw("Cannot swap buffer while a flush is pending.\n");
-  } else {
-    log_buffer_to_flush_ = &(log_buffers_[current_log_buffer_]);
-    current_log_buffer_ = (current_log_buffer_ + 1) % kNumBuffers;
-    SB_DCHECK(log_buffers_[current_log_buffer_].num_bytes == 0);
-  }
-
-  diskwrite_cond_.Signal();
-
-  diskwrite_mutex_.Release();
-  SbThreadYield();
-
-  return can_swap;
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/buffered_file_writer.h b/cobalt/browser/memory_tracker/tool/buffered_file_writer.h
deleted file mode 100644
index 7001464..0000000
--- a/cobalt/browser/memory_tracker/tool/buffered_file_writer.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_BUFFERED_FILE_WRITER_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_BUFFERED_FILE_WRITER_H_
-
-#include <string>
-
-#include "starboard/common/condition_variable.h"
-#include "starboard/common/log.h"
-#include "starboard/common/mutex.h"
-#include "starboard/file.h"
-#include "starboard/memory.h"
-#include "starboard/thread.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-// This is a heavy weight file writing class. It's "heavy weight" because
-// 1) It uses its own thread.
-// 2) It uses a 4mb inlined buffer for file writes. This class guarantees
-// that it will never allocate memory and therefore can be used in high
-// performance, low-level data writes.
-class BufferedFileWriter {
- public:
-  // Constructs the BufferedFileWriter with the path to write to. A thread is
-  // started which will begin writing to the file object.
-  explicit BufferedFileWriter(const std::string& file_path);
-
-  // Implicitly calls JoinThread(). This is safe if JoinThread() has already
-  // been called.
-  ~BufferedFileWriter();
-
-  // Can be called by any thread. Pushes data to the buffer to be written out
-  // by the disk writing thread as is.
-  // Note that this append is raw and will NOT add any new line or other
-  // formatting characters.
-  void Append(const char* data, size_t num_bytes);
-
- private:
-  static void* ThreadEntryFunc(void* context);  // Delegates to Run().
-  void Run();
-  bool SwapBuffers();
-  void StartThread();
-  void QuitThread();
-
-  static const int kBufferSize = 1 << 20;
-  static const int kNumBuffers = 2;
-  struct LogBuffer {
-    char buffer[kBufferSize];
-    size_t num_bytes;
-  };
-  LogBuffer log_buffers_[kNumBuffers];
-  int current_log_buffer_;
-  LogBuffer* log_buffer_to_flush_;
-  SbFile log_file_;
-
-  starboard::Mutex diskwrite_mutex_;
-  starboard::Mutex buffer_write_mutex_;
-  starboard::ConditionVariable diskwrite_cond_;
-  SbThread flush_thread_;
-  bool quit_thread_;
-  std::string file_path_;
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_BUFFERED_FILE_WRITER_H_
diff --git a/cobalt/browser/memory_tracker/tool/compressed_time_series_tool.cc b/cobalt/browser/memory_tracker/tool/compressed_time_series_tool.cc
deleted file mode 100644
index 5cb3d52..0000000
--- a/cobalt/browser/memory_tracker/tool/compressed_time_series_tool.cc
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/compressed_time_series_tool.h"
-
-#include <iomanip>
-#include <map>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "base/time/time.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-#include "cobalt/browser/memory_tracker/tool/util.h"
-#include "nb/analytics/memory_tracker.h"
-#include "starboard/common/log.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-///////////////////////////////////////////////////////////////////////////////
-CompressedTimeSeriesTool::CompressedTimeSeriesTool() : number_samples_(400) {}
-
-void CompressedTimeSeriesTool::Run(Params* params) {
-  TimeSeries timeseries;
-  Timer timer_status_message(base::TimeDelta::FromSeconds(1));
-
-  // Outputs CSV once every minute.
-  Timer timer_output_csv(base::TimeDelta::FromMinutes(1));
-
-  // Initial sample time is every 50 milliseconds.
-  base::TimeDelta current_sample_interval =
-      base::TimeDelta::FromMilliseconds(50);
-
-  while (!params->wait_for_finish_signal(current_sample_interval.ToSbTime())) {
-    AcquireSample(params->memory_tracker(), &timeseries,
-                  params->time_since_start());
-
-    if (IsFull(timeseries, number_samples_)) {
-      Compress(&timeseries);           // Remove every other element.
-      current_sample_interval *= 2;    // Double the sample time.
-      timer_status_message.Restart();  // Skip status message.
-    }
-
-    if (timer_output_csv.UpdateAndIsExpired()) {
-      const std::string str = ToCsvString(timeseries);
-      params->logger()->Output(str.c_str());
-      timer_status_message.Restart();  // Skip status message.
-    }
-
-    // Print status message.
-    if (timer_status_message.UpdateAndIsExpired()) {
-      std::stringstream ss;
-      ss << tool_name() << " is running..." << kNewLine;
-      params->logger()->Output(ss.str().c_str());
-    }
-  }
-}
-
-std::string CompressedTimeSeriesTool::ToCsvString(
-    const TimeSeries& timeseries) {
-  size_t largest_sample_size = 0;
-  size_t smallest_sample_size = INT_MAX;
-
-  typedef MapAllocationSamples::const_iterator MapIt;
-
-  // Sanitize samples_in and store as samples.
-  const MapAllocationSamples& samples_in = timeseries.samples_;
-  MapAllocationSamples samples;
-  for (MapIt it = samples_in.begin(); it != samples_in.end(); ++it) {
-    std::string name = it->first;
-    const AllocationSamples& value = it->second;
-
-    if (value.allocated_bytes_.size() != value.number_allocations_.size()) {
-      SB_NOTREACHED() << "Error at " << __FILE__ << ":" << __LINE__;
-      return "ERROR";
-    }
-
-    const size_t n = value.allocated_bytes_.size();
-    if (n > largest_sample_size) {
-      largest_sample_size = n;
-    }
-    if (n < smallest_sample_size) {
-      smallest_sample_size = n;
-    }
-
-    const bool duplicate_found = (samples.end() != samples.find(name));
-    if (duplicate_found) {
-      SB_NOTREACHED() << "Error, duplicate found for entry: " << name
-                      << kNewLine;
-    }
-    // Store value as a sanitized sample.
-    samples[name] = value;
-  }
-
-  SB_DCHECK(largest_sample_size == smallest_sample_size);
-
-  std::stringstream ss;
-
-  // Begin output to CSV.
-
-  // Preamble
-  ss << kNewLine << "//////////////////////////////////////////////" << kNewLine
-     << "// CSV of BYTES allocated per region (MB's)." << kNewLine
-     << "// Units are in Megabytes. This is designed" << kNewLine
-     << "// to be used in a stacked graph." << kNewLine;
-
-  // HEADER.
-  ss << kQuote << "Time(mins)" << kQuote << kDelimiter;
-  for (MapIt it = samples.begin(); it != samples.end(); ++it) {
-    const std::string& name = it->first;
-    ss << kQuote << SanitizeCSVKey(name) << kQuote << kDelimiter;
-  }
-  ss << kNewLine;
-
-  // Print out the values of each of the samples.
-  for (size_t i = 0; i < smallest_sample_size; ++i) {
-    // Output time first so that it can be used as an x-axis.
-    const double time_mins =
-        timeseries.time_stamps_[i].InMilliseconds() / (1000. * 60.);
-    ss << time_mins << ",";
-    for (MapIt it = samples.begin(); it != samples.end(); ++it) {
-      const int64 alloc_bytes = it->second.allocated_bytes_[i];
-      // Convert to float megabytes with decimals of precision.
-      double n = static_cast<double>(alloc_bytes / (1000 * 10));
-      n = n / (100.);
-      ss << n << kDelimiter;
-    }
-    ss << kNewLine;
-  }
-  ss << "// END CSV of BYTES allocated per region." << kNewLine;
-  ss << "//////////////////////////////////////////////";
-
-  ss << kNewLine;
-  // Preamble
-  ss << kNewLine << "//////////////////////////////////////////////";
-  ss << kNewLine << "// CSV of COUNT of allocations per region." << kNewLine;
-
-  // HEADER
-  ss << kQuote << "Time(mins)" << kQuote << kDelimiter;
-  for (MapIt it = samples.begin(); it != samples.end(); ++it) {
-    const std::string& name = it->first;
-    ss << kQuote << SanitizeCSVKey(name) << kQuote << kDelimiter;
-  }
-  ss << kNewLine;
-  for (size_t i = 0; i < smallest_sample_size; ++i) {
-    // Output time first so that it can be used as an x-axis.
-    const double time_mins =
-        timeseries.time_stamps_[i].InMilliseconds() / (1000. * 60.);
-    ss << time_mins << ",";
-    for (MapIt it = samples.begin(); it != samples.end(); ++it) {
-      const int64 n_allocs = it->second.number_allocations_[i];
-      ss << n_allocs << kDelimiter;
-    }
-    ss << kNewLine;
-  }
-  ss << "// END CSV of COUNT of allocations per region." << kNewLine;
-  ss << "//////////////////////////////////////////////";
-  ss << kNewLine << kNewLine;
-
-  std::string output = ss.str();
-  return output;
-}
-
-void CompressedTimeSeriesTool::AcquireSample(
-    nb::analytics::MemoryTracker* memory_tracker, TimeSeries* timeseries,
-    const base::TimeDelta& time_now) {
-  const size_t sample_count = timeseries->time_stamps_.size();
-  timeseries->time_stamps_.push_back(time_now);
-
-  MapAllocationSamples& map_samples = timeseries->samples_;
-
-  std::vector<const nb::analytics::AllocationGroup*> vector_output;
-  memory_tracker->GetAllocationGroups(&vector_output);
-
-  // Sample all known memory scopes.
-  for (size_t i = 0; i < vector_output.size(); ++i) {
-    const nb::analytics::AllocationGroup* group = vector_output[i];
-    const std::string& name = group->name();
-
-    const bool first_creation =
-        map_samples.find(group->name()) == map_samples.end();
-
-    AllocationSamples& new_entry = map_samples[name];
-
-    // Didn't see it before so create new entry.
-    if (first_creation) {
-      // Make up for lost samples...
-      new_entry.allocated_bytes_.resize(sample_count, 0);
-      new_entry.number_allocations_.resize(sample_count, 0);
-    }
-
-    int32 num_allocs = -1;
-    int64 allocation_bytes = -1;
-    group->GetAggregateStats(&num_allocs, &allocation_bytes);
-
-    new_entry.allocated_bytes_.push_back(allocation_bytes);
-    new_entry.number_allocations_.push_back(num_allocs);
-  }
-
-  // Sample the in use memory bytes reported by malloc.
-  nb::analytics::MemoryStats memory_stats =
-      nb::analytics::GetProcessMemoryStats();
-  AllocationSamples& process_mem_in_use = map_samples["ProcessMemoryInUse"];
-  process_mem_in_use.allocated_bytes_.push_back(memory_stats.used_cpu_memory);
-  process_mem_in_use.number_allocations_.push_back(0);
-
-  // Sample the reserved memory bytes reported by malloc.
-  AllocationSamples& process_mem_reserved =
-      map_samples["ProcessMemoryReserved"];
-  process_mem_reserved.allocated_bytes_.push_back(memory_stats.used_cpu_memory);
-  process_mem_reserved.number_allocations_.push_back(0);
-}
-
-bool CompressedTimeSeriesTool::IsFull(const TimeSeries& timeseries,
-                                      size_t samples_limit) {
-  return timeseries.time_stamps_.size() >= samples_limit;
-}
-
-void CompressedTimeSeriesTool::Compress(TimeSeries* timeseries) {
-  typedef MapAllocationSamples::iterator MapIt;
-  MapAllocationSamples& samples = timeseries->samples_;
-  RemoveOddElements(&(timeseries->time_stamps_));
-  for (MapIt it = samples.begin(); it != samples.end(); ++it) {
-    AllocationSamples& data = it->second;
-    RemoveOddElements(&data.allocated_bytes_);
-    RemoveOddElements(&data.number_allocations_);
-  }
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/compressed_time_series_tool.h b/cobalt/browser/memory_tracker/tool/compressed_time_series_tool.h
deleted file mode 100644
index 35bcfe0..0000000
--- a/cobalt/browser/memory_tracker/tool/compressed_time_series_tool.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_COMPRESSED_TIME_SERIES_TOOL_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_COMPRESSED_TIME_SERIES_TOOL_H_
-
-#include <string>
-
-#include "base/basictypes.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-#include "cobalt/browser/memory_tracker/tool/util.h"
-#include "nb/analytics/memory_tracker.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-// Generates CSV values of the engine memory. This includes memory
-// consumption in bytes and also the number of allocations.
-// Allocations are segmented by category such as "Javascript" and "Network and
-// are periodically dumped to the Params::abstract_logger_.
-//
-// Compression:
-//  During early run, the sampling rate is extremely high, however the sampling
-//  rate will degrade by half each time the sampling buffer fills up.
-//
-//  Additionally, every time the sampling buffer fills up, space is freed by
-//  evicting every other element.
-//
-// Example output:
-//  //////////////////////////////////////////////
-//  // CSV of BYTES allocated per region (MB's).
-//  // Units are in Megabytes. This is designed
-//  // to be used in a stacked graph.
-//  "Time(mins)","CSS","DOM","Javascript","Media","base::MessageLoop"....
-//  0,0,0,0,0,0...
-//  1022.54,3.3,7.19,49.93,50.33....
-//  ...
-//  // END CSV of BYTES allocated per region.
-//  //////////////////////////////////////////////
-//
-//  //////////////////////////////////////////////
-//  // CSV of COUNT of allocations per region.
-//  "Time(mins)","CSS","DOM","Javascript","Media","base::MessageLoop"....
-//  0,0,0,0,0,0...
-//  1022.54,57458,70011,423217,27,54495,43460...
-//  ...
-//  // END CSV of COUNT of allocations per region.
-//  //////////////////////////////////////////////
-class CompressedTimeSeriesTool : public AbstractTool {
- public:
-  CompressedTimeSeriesTool();
-  void Run(Params* params) override;
-  std::string tool_name() const override {
-    return "MemoryTrackerCompressedTimeSeries";
-  }
-
- private:
-  static std::string ToCsvString(const TimeSeries& histogram);
-  static void AcquireSample(nb::analytics::MemoryTracker* memory_tracker,
-                            TimeSeries* histogram, const base::TimeDelta& dt);
-  static bool IsFull(const TimeSeries& histogram, size_t num_samples);
-  static void Compress(TimeSeries* histogram);
-
-  const int number_samples_;
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_COMPRESSED_TIME_SERIES_TOOL_H_
diff --git a/cobalt/browser/memory_tracker/tool/histogram_table_csv_base.h b/cobalt/browser/memory_tracker/tool/histogram_table_csv_base.h
deleted file mode 100644
index 3a96a34..0000000
--- a/cobalt/browser/memory_tracker/tool/histogram_table_csv_base.h
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_HISTOGRAM_TABLE_CSV_BASE_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_HISTOGRAM_TABLE_CSV_BASE_H_
-
-#include <map>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "base/logging.h"
-#include "cobalt/browser/memory_tracker/tool/util.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-// This HistogramTableCSV provides most of the functionality for generating a
-// csv table from a histogram of data.
-//
-// Subclasses need to override ValueToString(...) so that the
-// data-type can be stringified during the call to ToString().
-//
-// Example:
-//  class MyHistogram : public HistogramTableCSV<int64_t>() {...}
-//  MyHistogram my_histogram;
-//  my_histogram.set_title("Memory Values");
-//
-//  // Add first row.
-//  my_histogram.BeginRow(time_delta);
-//  my_histogram.AddRowValue("ColumnA", 0);
-//  my_histogram.AddRowValue("ColumnB", 0);
-//  my_histogram.FinalizeRow();
-//
-//  // Add second row.
-//  my_histogram.BeginRow(time_delta);
-//  my_histogram.AddRowValue("ColumnA", 1);
-//  my_histogram.AddRowValue("ColumnB", 2);
-//  my_histogram.AddRowValue("ColumnC", 1);  // Ok, ColumnC will be autofilled.
-//  my_histogram.FinalizeRow();
-//
-//  Print(my_histogram.ToString());
-template <typename ValueType>
-class HistogramTableCSVBase {
- public:
-  typedef std::map<std::string, std::vector<ValueType> > TableData;
-
-  // default_value is used to auto-fill values, such as when a new column
-  // is introduced.
-  explicit HistogramTableCSVBase(const ValueType& default_value)
-      : default_value_(default_value) {}
-
-  virtual std::string ValueToString(const ValueType& value) const = 0;
-
-  void set_title(const std::string& title) { title_ = title; }
-
-  void BeginRow(const base::TimeDelta time_value) {
-    time_values_.push_back(time_value);
-  }
-
-  void AddRowValue(const std::string& column_key, const ValueType& value) {
-    if (time_values_.empty()) {
-      NOTREACHED() << "table_data_ was empty.";
-      time_values_.push_back(base::TimeDelta());
-    }
-    const size_t n = time_values_.size();
-    std::vector<ValueType>& column = table_data_[column_key];
-    while (column.size() < n - 1) {
-      column.push_back(default_value_);
-    }
-    column.push_back(value);
-  }
-
-  void FinalizeRow() {
-    const size_t n = time_values_.size();
-    for (typename TableData::iterator it = table_data_.begin();
-         it != table_data_.end(); ++it) {
-      std::vector<ValueType>& column = it->second;
-      while (column.size() < n) {
-        column.push_back(default_value_);
-      }
-    }
-  }
-
-  std::string ToString() const {
-    const char kSeparator[] = "//////////////////////////////////////////////";
-    std::stringstream ss;
-    ss << kSeparator << kNewLine;
-    if (title_.size()) {
-      ss << "// CSV of " << title_ << kNewLine;
-    }
-    for (size_t i = 0; i < NumberOfRows(); ++i) {
-      ss << StringifyRow(i);
-    }
-    ss << kSeparator;
-    return ss.str();
-  }
-
-  // All odd elements are removed. Effectively compressing the table in half.
-  void RemoveOddElements() {
-    memory_tracker::RemoveOddElements(&time_values_);
-    for (typename TableData::iterator it = table_data_.begin();
-         it != table_data_.end(); ++it) {
-      memory_tracker::RemoveOddElements(&it->second);
-    }
-  }
-
-  size_t NumberOfRows() const { return time_values_.size(); }
-
- protected:
-  static std::string JoinValues(const std::vector<std::string>& row_values) {
-    std::stringstream ss;
-    for (size_t i = 0; i < row_values.size(); ++i) {
-      ss << kQuote << row_values[i] << kQuote << kDelimiter;
-    }
-    ss << kNewLine;
-    return ss.str();
-  }
-
-  static std::string TimeToMinutesString(base::TimeDelta dt) {
-    double value_minutes = dt.InSecondsF() / 60.;
-    char buff[128];
-    SbStringFormatF(buff, sizeof(buff), "%.2f", value_minutes);
-    return std::string(buff);
-  }
-
-  std::string StringifyRow(size_t index) const {
-    if (index == 0) {
-      // Create header row.
-      std::vector<std::string> column_keys;
-      column_keys.push_back("Time(min)");
-      for (typename TableData::const_iterator it = table_data_.begin();
-           it != table_data_.end(); ++it) {
-        column_keys.push_back(SanitizeCSVKey(it->first));
-      }
-      return JoinValues(column_keys);
-    } else {
-      // Create data row.
-      std::vector<std::string> row_values;
-      row_values.push_back(TimeToMinutesString(time_values_[index]));
-      for (typename TableData::const_iterator it = table_data_.begin();
-           it != table_data_.end(); ++it) {
-        const std::vector<ValueType>& column = it->second;
-        const std::string value_str = ValueToString(column[index]);
-        row_values.push_back(value_str);
-      }
-      return JoinValues(row_values);
-    }
-  }
-
-  std::string title_;
-  ValueType default_value_;
-  std::vector<base::TimeDelta> time_values_;
-  TableData table_data_;
-};
-
-// Useful for tracking values in megabytes.
-class MemoryBytesHistogramCSV : public HistogramTableCSVBase<int64_t> {
- public:
-  MemoryBytesHistogramCSV() : HistogramTableCSVBase<int64_t>(0) {}
-  std::string ValueToString(const int64_t& bytes) const override {
-    return ToMegabyteString(bytes);
-  }
-
-  static std::string ToMegabyteString(int64_t bytes) {
-    double megabytes = static_cast<double>(bytes) / (1024.0 * 1024.0);
-    char buff[128];
-    SbStringFormatF(buff, sizeof(buff), "%.1f", megabytes);
-    return std::string(buff);
-  }
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_HISTOGRAM_TABLE_CSV_BASE_H_
diff --git a/cobalt/browser/memory_tracker/tool/internal_fragmentation_tool.cc b/cobalt/browser/memory_tracker/tool/internal_fragmentation_tool.cc
deleted file mode 100644
index 223af84..0000000
--- a/cobalt/browser/memory_tracker/tool/internal_fragmentation_tool.cc
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright 2018 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/internal_fragmentation_tool.h"
-// C++ headers.
-#include <algorithm>
-#include <map>
-#include <set>
-#include <vector>
-// Cobalt headers.
-#include "cobalt/browser/memory_tracker/tool/histogram_table_csv_base.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/util.h"
-#include "nb/bit_cast.h"
-// Starboard headers.
-#include "starboard/configuration_constants.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-namespace {
-
-using nb::analytics::AllocationRecord;
-using nb::analytics::AllocationVisitor;
-using nb::analytics::MemoryTracker;
-
-class FragmentationProcessor : private AllocationVisitor {
- public:
-  explicit FragmentationProcessor(uintptr_t page_size)
-      : page_size_(page_size) {}
-
-  void Process(MemoryTracker* tracker, size_t* allocated_memory_in_pages,
-               size_t* used_memory_in_segments) {
-    memory_segments_.erase(memory_segments_.begin(), memory_segments_.end());
-    *allocated_memory_in_pages = 0;
-    *used_memory_in_segments = 0;
-    tracker->Accept(this);
-
-    // Note that because of the fine course locking used for
-    // the memory tracker, it's accepted that there can be
-    // an occasional overlapping memory segment, where the memory region
-    // was deallocated and then recycled during the segment collection phase.
-    // This will then show up as an overlapping region. This is resolved
-    // by selecting the first memory segment, and discarding any
-    // memory segments that overlap it.
-    // While this can skew results, the rate of overlaps in practice is so low
-    // that we can essentially ignore it without warning the user.
-    std::sort(memory_segments_.begin(), memory_segments_.end());
-    std::vector<Segment> copy_no_overlaps;
-    copy_no_overlaps.reserve(memory_segments_.size());
-    for (const Segment& seg : memory_segments_) {
-      if (copy_no_overlaps.empty() ||
-          !seg.Intersects(copy_no_overlaps.back())) {
-        copy_no_overlaps.push_back(seg);
-      }
-    }
-    memory_segments_.swap(copy_no_overlaps);
-
-    if (!memory_segments_.empty()) {
-      std::set<uintptr_t> page_ids;
-
-      std::vector<Segment> sub_segments;
-      for (const Segment& seg : memory_segments_) {
-        if (!seg.size()) {  // Ignore 0-size segments.
-          continue;
-        }
-        // Use erase() instead of clear(), because it has stronger
-        // guarantees about recycling memory in the vector.
-        sub_segments.erase(sub_segments.begin(), sub_segments.end());
-        // Memory allocation segments may span multiple pages. In this
-        // case we will break them up and store them in sub_segments.
-        seg.SplitAcrossPageBoundaries(page_size_, &sub_segments);
-
-        for (const Segment& sub_seg : sub_segments) {
-          uintptr_t page_id = GetPageId(sub_seg.begin());
-          page_ids.insert(page_id);
-        }
-      }
-      *allocated_memory_in_pages = page_ids.size() * page_size_;
-    }
-    *used_memory_in_segments = CountUsedMemoryInSegments();
-  }
-
- private:
-  // Implements AllocationVisitor::Visitor().
-  bool Visit(const void* memory,
-             const AllocationRecord& alloc_record) override {
-    const char* memory_begin = static_cast<const char*>(memory);
-    const char* memory_end = memory_begin + alloc_record.size;
-    memory_segments_.push_back(Segment(nullptr, memory_begin, memory_end));
-    return true;
-  }
-  uintptr_t GetPageId(const char* ptr) const {
-    return nb::bit_cast<uintptr_t>(ptr) / page_size_;
-  }
-  size_t CountUsedMemoryInSegments() const {
-    if (memory_segments_.empty()) {
-      return 0;
-    }
-    size_t total_bytes = 0;
-    const Segment* prev_segment = nullptr;
-    for (const Segment& seg : memory_segments_) {
-      size_t size = seg.size();
-      if (prev_segment && prev_segment->Intersects(seg)) {
-        // Sanity check - FragmentationProcessor::Process() is expected
-        // to resolve overlapping memory segments that occur from the
-        // concurrent nature of memory collection.
-        SB_NOTREACHED() << "Memory segments intersected!";
-        size = 0;
-      }
-      prev_segment = &seg;
-      total_bytes += size;
-    }
-    return total_bytes;
-  }
-
-  std::vector<Segment> memory_segments_;
-  const uintptr_t page_size_;
-};
-
-}  // namespace.
-
-InternalFragmentationTool::InternalFragmentationTool() {}
-
-InternalFragmentationTool::~InternalFragmentationTool() {}
-
-std::string InternalFragmentationTool::tool_name() const {
-  return "InternalFragmentationTool";
-}
-
-void InternalFragmentationTool::Run(Params* params) {
-  // Run function does almost nothing.
-  params->logger()->Output("InternalFragmentationTool running...\n");
-
-  Timer output_timer(base::TimeDelta::FromSeconds(30));
-  Timer sample_timer(base::TimeDelta::FromMilliseconds(50));
-
-  MemoryBytesHistogramCSV histogram_table;
-  histogram_table.set_title("Internal Fragmentation - Probably undercounts");
-
-  FragmentationProcessor visitor(kSbMemoryPageSize);
-
-  // If we get a finish signal then this will break out of the loop.
-  while (!params->wait_for_finish_signal(250 * kSbTimeMillisecond)) {
-    // LOG CSV.
-    if (output_timer.UpdateAndIsExpired()) {
-      std::stringstream ss;
-      ss << kNewLine << histogram_table.ToString() << kNewLine << kNewLine;
-      params->logger()->Output(ss.str());
-    }
-
-    // ADD A HISTOGRAM SAMPLE.
-    if (sample_timer.UpdateAndIsExpired()) {
-      histogram_table.BeginRow(params->time_since_start());
-
-      size_t allocated_memory_in_pages = 0;
-      size_t used_memory = 0;
-      visitor.Process(params->memory_tracker(), &allocated_memory_in_pages,
-                      &used_memory);
-
-      SB_DCHECK(allocated_memory_in_pages > used_memory)
-          << "allocated_memory_in_pages: " << allocated_memory_in_pages << ","
-          << "used_memory: " << used_memory;
-
-      histogram_table.AddRowValue("TotalReservedCpuMemoryInPages(MB)",
-                                  allocated_memory_in_pages);
-      histogram_table.AddRowValue("TotalCpuMemoryInUse(MB)", used_memory);
-      histogram_table.FinalizeRow();
-    }
-
-    // COMPRESS TABLE WHEN FULL.
-    //
-    // Table is full, therefore eliminate half of the elements.
-    // Reduce sample frequency to match.
-    if (histogram_table.NumberOfRows() >= 100) {
-      // Compression step.
-      histogram_table.RemoveOddElements();
-
-      // By doubling the sampling time this keeps the table linear with
-      // respect to time. If sampling time was not doubled then there
-      // would be time distortion in the graph.
-      sample_timer.ScaleTriggerTime(2.0);
-      sample_timer.Restart();
-    }
-  }
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/internal_fragmentation_tool.h b/cobalt/browser/memory_tracker/tool/internal_fragmentation_tool.h
deleted file mode 100644
index bebd634..0000000
--- a/cobalt/browser/memory_tracker/tool/internal_fragmentation_tool.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2018 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_INTERNAL_FRAGMENTATION_TOOL_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_INTERNAL_FRAGMENTATION_TOOL_H_
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-class InternalFragmentationTool : public AbstractTool {
- public:
-  InternalFragmentationTool();
-  ~InternalFragmentationTool() override;
-  // Interface AbstractMemoryTrackerTool
-  std::string tool_name() const override;
-  void Run(Params* params) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(InternalFragmentationTool);
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_INTERNAL_FRAGMENTATION_TOOL_H_
diff --git a/cobalt/browser/memory_tracker/tool/leak_finder_tool.cc b/cobalt/browser/memory_tracker/tool/leak_finder_tool.cc
deleted file mode 100644
index 31a89a3..0000000
--- a/cobalt/browser/memory_tracker/tool/leak_finder_tool.cc
+++ /dev/null
@@ -1,476 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/leak_finder_tool.h"
-
-#include <algorithm>
-#include <iomanip>
-#include <map>
-#include <utility>
-
-#include "base/timer/timer.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-#include "cobalt/browser/memory_tracker/tool/util.h"
-#include "cobalt/script/util/stack_trace_helpers.h"
-#include "nb/memory_scope.h"
-#include "starboard/common/string.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-// Number of output values to display in the csv.
-const size_t kNumberOfOutputColumns = 40;
-
-LeakFinderTool::LeakFinderTool(StackTraceMode mode)
-    : string_pool_(128),
-      frame_map_(128),
-      callframe_map_(128),
-      stack_trace_mode_(mode) {
-  default_callframe_str_ = &string_pool_.Intern("<Unknown>");
-}
-
-LeakFinderTool::~LeakFinderTool() {
-  frame_map_.Clear();
-  callframe_map_.Clear();
-}
-
-bool LeakFinderTool::IsJavascriptScope(
-    const nb::analytics::CallStack& callstack) {
-  // March through all MemoryScopes in the callstack and check if any of them
-  // contains a javascript scope. If it does return true.
-  for (nb::analytics::CallStack::const_iterator it = callstack.begin();
-       it != callstack.end(); ++it) {
-    const NbMemoryScopeInfo* memory_scope = *it;
-    const bool is_javascript_scope =
-        strstr(memory_scope->memory_scope_name_, "Javascript");
-    if (is_javascript_scope) {
-      return true;
-    }
-  }
-  return false;
-}
-
-void LeakFinderTool::OnMemoryAllocation(
-    const void* memory_block, const nb::analytics::AllocationRecord& record,
-    const nb::analytics::CallStack& callstack) {
-  // When in javascript mode, filter only allocations with "Javascript" in
-  // the memory scope name.
-  if (stack_trace_mode_ == kJavascript) {
-    if (!IsJavascriptScope(callstack)) {
-      return;
-    }
-  }
-
-  // symbol_str can be used as a unique key. The same value of callstack will
-  // always produce the same string pointer.
-  const std::string* symbol_str = GetOrCreateSymbol(callstack);
-  // Track the allocation.
-  if (!callframe_map_.SetIfMissing(memory_block, symbol_str)) {
-    CallFrameMap::EntryHandle entry_handle;
-    callframe_map_.Get(memory_block, &entry_handle);
-
-    const void* ptr = entry_handle.Valid() ? entry_handle.Key() : NULL;
-    entry_handle.ReleaseLockAndInvalidate();
-
-    DCHECK(false) << "Unexpected memory block at " << memory_block
-                  << " already existed as: " << ptr;
-  }
-
-  AllocationFrameMap::EntryHandle entry_handle;
-  frame_map_.GetOrCreate(symbol_str, &entry_handle);
-
-  // While this entry_handle is in use, no other threads
-  // can modify this entry.
-  AllocRec& alloc_rec = entry_handle.ValueMutable();
-  alloc_rec.total_bytes += record.size;
-  alloc_rec.num_allocs++;
-}
-
-void LeakFinderTool::OnMemoryDeallocation(
-    const void* memory_block, const nb::analytics::AllocationRecord& record,
-    const nb::analytics::CallStack& callstack) {
-
-  const std::string* symbol_str = NULL;
-
-  {
-    CallFrameMap::EntryHandle entry_handle;
-    if (!callframe_map_.Get(memory_block, &entry_handle)) {
-      // This happens if the allocation happened before this tool attached
-      // to the memory tracker or if the memory allocation was filtered and
-      // therefore isn't being tracked.
-      return;
-    }
-    symbol_str = entry_handle.Value();
-    callframe_map_.Remove(&entry_handle);
-  }
-
-  // This case can happen if the memory tracker attaches after the allocation.
-  if (!symbol_str) {
-    return;
-  }
-
-  AllocationFrameMap::EntryHandle entry_handle;
-  frame_map_.GetOrCreate(symbol_str, &entry_handle);
-
-  // While entry_handle is in use, no other element can modify
-  // this element.
-  AllocRec& alloc_rec = entry_handle.ValueMutable();
-  alloc_rec.total_bytes -= record.size;
-  alloc_rec.num_allocs--;
-}
-
-std::string LeakFinderTool::tool_name() const {
-  return "MemoryTrackerLeakFinder";
-}
-
-void LeakFinderTool::Run(Params* params) {
-  // Run function does almost nothing.
-  params->logger()->Output("MemoryTrackerLeakFinder running...");
-
-  static const size_t kMaxSamples = 400;
-
-  // This value will decay whenever the buffer fills up and is compressed via
-  // sample elimination.
-  SbTime sample_time = 50;  // 50 microseconds.
-
-  std::vector<base::TimeDelta> time_values;
-  std::map<const std::string*, std::vector<AllocRec> > map_allocations;
-
-  SbTime start_time = SbTimeGetMonotonicNow();
-  Timer output_trigger(base::TimeDelta::FromMinutes(1));
-
-  const double recording_delay_mins = 5.0;
-
-  // Controls how often an update status message is sent to output.
-  Timer output_status_timer(base::TimeDelta::FromSeconds(1));
-
-  while (true) {
-    if (params->wait_for_finish_signal(sample_time)) {
-      break;  // Finish received, break.
-    }
-    SbTime now_time = SbTimeGetMonotonicNow();
-
-    const base::TimeDelta time_since_start =
-        base::Time::FromSbTime(now_time) - base::Time::FromSbTime(start_time);
-
-    // DELAY RECORDING AS STARTUP MEMORY IS INITIALIZED
-    // Cleaner graphs if we wait until after startup.
-    //
-    const double times_since_start_mins = time_since_start.InSecondsF() / 60.0;
-    if (times_since_start_mins < recording_delay_mins) {
-      if (output_status_timer.UpdateAndIsExpired()) {
-        double remaining_time_mins =
-            (recording_delay_mins - times_since_start_mins);
-        std::stringstream ss;
-        ss << "MemoryTrackerLeakFinder starting in " << remaining_time_mins
-           << " minutes.\n";
-        params->logger()->Output(ss.str().c_str());
-      }
-      continue;
-    }
-
-    time_values.push_back(time_since_start);
-
-    // To improve performance, make a copy of the values to a vector on
-    // the stack.
-    std::vector<std::pair<const std::string*, AllocRec> > samples;
-    SampleSnapshot(&samples);
-
-    // Take a snapshot.
-    for (size_t i = 0; i < samples.size(); ++i) {
-      std::pair<const std::string*, AllocRec> sample = samples[i];
-      std::vector<AllocRec>& sample_history = map_allocations[sample.first];
-
-      sample_history.resize(time_values.size());
-      sample_history.back() = sample.second;
-    }
-
-    if (output_trigger.UpdateAndIsExpired() && time_values.size() > 10) {
-      // Timer expired so dump the current information output.
-
-      std::vector<AllocationProfile> alloc_profiles;
-      GenerateTopLeakingAllocationProfiles(time_values, map_allocations,
-                                           &alloc_profiles);
-      if (alloc_profiles.empty()) {
-        params->logger()->Output(
-            "MemoryTrackerLeakFinder: alloc_profiles was "
-            "empty and nothing is written.");
-      } else {
-        if (alloc_profiles.size() > kNumberOfOutputColumns) {
-          alloc_profiles.resize(kNumberOfOutputColumns);
-        }
-
-        std::string csv_str = GenerateCSV(time_values, alloc_profiles);
-        params->logger()->Output(csv_str.c_str());
-      }
-    }
-
-    // Compress the buffer, and modify sample_time so that it's twice as slow.
-    if (time_values.size() >= kMaxSamples) {
-      sample_time *= 2;  // Double the time that it takes to trigger a sample.
-      // Remove every other element in time_values.
-      RemoveOddElements(&time_values);
-
-      // Remove every other element in the samples.
-      for (size_t i = 0; i < samples.size(); ++i) {
-        std::pair<const std::string*, AllocRec> sample = samples[i];
-        std::vector<AllocRec>& sample_history = map_allocations[sample.first];
-        RemoveOddElements(&sample_history);
-      }
-    }
-  }
-}
-
-const std::string* LeakFinderTool::GetOrCreateSymbol(
-    const nb::analytics::CallStack& callstack) {
-  const std::string* symbol_str = NULL;
-
-  // In javascript mode we try and get the javascript symbol. Otherwise
-  // fallback to C++ symbol.
-  if (stack_trace_mode_ == kJavascript) {
-    symbol_str = TryGetJavascriptSymbol();
-    if (symbol_str) {
-      return symbol_str;
-    }
-  }
-
-  symbol_str = GetOrCreateCplusPlusSymbol(callstack);
-  return symbol_str;
-}
-
-const std::string* LeakFinderTool::GetOrCreateCplusPlusSymbol(
-    const nb::analytics::CallStack& callstack) {
-  if (callstack.empty()) {
-    return default_callframe_str_;
-  } else {
-    const NbMemoryScopeInfo* memory_scope = callstack.back();
-
-    const bool skip =
-        strstr(memory_scope->function_name_, "js_malloc") ||
-        strstr(memory_scope->function_name_, "js_realloc") ||
-        strstr(memory_scope->function_name_, "new_");
-
-    // Skip up one callstack because we don't want to track calls to
-    // allocation functions.
-    if (skip && callstack.size() > 1) {
-      memory_scope = callstack[callstack.size() - 2];
-    }
-
-    const char* file_name = BaseNameFast(memory_scope->file_name_);
-
-    // Generates a symbol.
-    // Example:
-    //   "Javascript:Interpreter.cpp(415):RunScript()"
-    char symbol_buff[128];
-    SbStringFormatF(symbol_buff, sizeof(symbol_buff), "%s:%s(%d)::%s()",
-                    memory_scope->memory_scope_name_, file_name,
-                    memory_scope->line_number_, memory_scope->function_name_);
-
-    // Get's a unique pointer to a string containing the symbol. If the symbol
-    // was previously generated then the previous symbol is returned.
-    return &string_pool_.Intern(symbol_buff);
-  }
-}
-
-const std::string* LeakFinderTool::TryGetJavascriptSymbol() {
-  auto* js_stack_gen = script::util::GetThreadLocalStackTraceGenerator();
-  if (!js_stack_gen || !js_stack_gen->Valid()) {
-    return NULL;
-  }
-
-  // Only get one symbol.
-  char buffer[256];
-  if (!js_stack_gen->GenerateStackTraceString(1, buffer, sizeof(buffer))) {
-    return NULL;
-  }
-  const char* file_name = BaseNameFast(buffer);
-  return &string_pool_.Intern(file_name);
-}
-
-void LeakFinderTool::SampleSnapshot(
-    std::vector<std::pair<const std::string*, AllocRec> >* destination) {
-  destination->erase(destination->begin(), destination->end());
-
-  const size_t sample_size = frame_map_.GetSize();
-
-  // Do this locally.
-  destination->reserve(sample_size + 10);
-  frame_map_.CopyToStdVector(destination);
-}
-
-std::string LeakFinderTool::GenerateCSV(
-    const std::vector<base::TimeDelta>& time_values,
-    const std::vector<AllocationProfile>& data) {
-  std::stringstream ss;
-  ss << std::fixed;  // Turn off scientific notation for CSV values.
-  ss << std::setprecision(3);
-  ss << kNewLine << kNewLine;
-
-  // HEADER
-  ss << "// Allocation in megabytes. Keep in mind that only" << kNewLine
-     << "// the N top allocations will be displayed, sorted" << kNewLine
-     << "// by slope steepness. Negative slopping allocations" << kNewLine
-     << "// and allocations that have few blocks may be filtered" << kNewLine
-     << "// out." << kNewLine << kQuote << "Time(min)" << kQuote << kDelimiter;
-  for (size_t i = 0; i < data.size(); ++i) {
-    const AllocationProfile& alloc_profile = data[i];
-    const std::string& name = *alloc_profile.name_;
-    ss << kQuote << name << kQuote << kDelimiter;
-  }
-  ss << kNewLine;
-
-  // BODY
-  for (size_t i = 0; i < time_values.size(); ++i) {
-    for (size_t j = 0; j < data.size(); ++j) {
-      if (j == 0) {
-        double mins = time_values[i].InSecondsF() / 60.f;
-        if (mins < .001) {
-          mins = 0;
-        }
-        ss << mins << kDelimiter;
-      }
-
-      const AllocationProfile& alloc_profile = data[j];
-      const std::vector<AllocRec>& alloc_history =
-          *alloc_profile.alloc_history_;
-
-      double megabytes = static_cast<double>(alloc_history[i].total_bytes) /
-                         static_cast<double>(1024 * 1024);
-
-      DCHECK_EQ(alloc_history.size(), time_values.size());
-      ss << megabytes << kDelimiter;
-    }
-    ss << kNewLine;
-  }
-  ss << kNewLine << kNewLine;
-  ss << "// Object counts." << kNewLine;
-  ss << kQuote << "Time(min)" << kQuote << kDelimiter;
-  for (size_t i = 0; i < data.size(); ++i) {
-    const AllocationProfile& alloc_profile = data[i];
-    const std::string& name = *alloc_profile.name_;
-    ss << kQuote << name << kQuote << kDelimiter;
-  }
-  ss << kNewLine;
-  for (size_t i = 0; i < time_values.size(); ++i) {
-    for (size_t j = 0; j < data.size(); ++j) {
-      if (j == 0) {
-        double mins = time_values[i].InSecondsF() / 60.f;
-        if (mins < .001) {
-          mins = 0;
-        }
-        ss << mins << kDelimiter;
-      }
-      const AllocationProfile& alloc_profile = data[j];
-      const std::vector<AllocRec>& alloc_history =
-          *alloc_profile.alloc_history_;
-      DCHECK_EQ(alloc_history.size(), time_values.size());
-      ss << alloc_history[i].num_allocs << kDelimiter;
-    }
-    ss << kNewLine;
-  }
-
-  ss << kNewLine << kNewLine;
-  return ss.str();
-}
-
-void LeakFinderTool::GenerateTopLeakingAllocationProfiles(
-    const std::vector<base::TimeDelta>& time_values, const MapSamples& samples,
-    std::vector<AllocationProfile>* destination) {
-  // GENERATE LINEAR REGRESSION LINE
-  // first value is time in microseconds.
-  // second value is total_bytes.
-  std::vector<std::pair<int64_t, int64_t> > sample_data;
-
-  typedef std::map<const std::string*, SlopeYIntercept> LinearRegressionMap;
-  LinearRegressionMap linear_regression_map;
-
-  std::vector<AllocationProfile> allocation_profiles;
-
-  for (MapSamples::const_iterator it = samples.begin(); it != samples.end();
-       ++it) {
-    const std::string* allocation_name = it->first;
-    const std::vector<AllocRec>& allocation_samples = it->second;
-
-    if (allocation_samples.empty()) {
-      continue;
-    }
-
-    // Filter out allocations records that have low number of allocations.
-    if (allocation_samples.back().num_allocs < 10) {
-      continue;
-    }
-
-    // Filter out allocations that are insignificant.
-    int64_t largest_allocation_sample = 0;
-    const int64_t kMinAllocationSize = 1024 * 64;
-    for (size_t i = 0; i < allocation_samples.size(); ++i) {
-      int64_t bytes = allocation_samples[i].total_bytes;
-      largest_allocation_sample = std::max(largest_allocation_sample, bytes);
-    }
-    if (largest_allocation_sample < kMinAllocationSize) {
-      continue;
-    }
-
-    // Filter out allocations where there is no growth between first quartile
-    // and final output.
-    const AllocRec& first_quartile_sample =
-        allocation_samples[allocation_samples.size() / 4];
-    const AllocRec& final_sample = allocation_samples.back();
-
-    const double increase_ratio =
-        static_cast<double>(final_sample.total_bytes) /
-        static_cast<double>(first_quartile_sample.total_bytes);
-
-    // 5% threshold of increase to be qualified as a lead.
-    static const double kMinIncreaseThreshold = .05;
-
-    // If the increase between first quartile and final sample less than 5%
-    // then skip.
-    if (increase_ratio < kMinIncreaseThreshold) {
-      continue;
-    }
-
-    sample_data.clear();  // Recycle.
-    for (size_t i = 0; i < time_values.size(); ++i) {
-      std::pair<int64_t, int64_t> datum(time_values[i].InMicroseconds(),
-                                        allocation_samples[i].total_bytes);
-      sample_data.push_back(datum);
-    }
-
-    double slope = 0;
-    double y_intercept = 0;
-    bool valid = GetLinearFit(sample_data.begin(), sample_data.end(), &slope,
-                              &y_intercept);
-    DCHECK(valid);
-    linear_regression_map[allocation_name] =
-        SlopeYIntercept(slope, y_intercept);
-    AllocationProfile alloc_profile(allocation_name, &allocation_samples, slope,
-                                    y_intercept);
-    alloc_profile.leak_potential_ =
-        allocation_samples.back().total_bytes * slope;
-    allocation_profiles.push_back(alloc_profile);
-  }
-
-  std::sort(allocation_profiles.begin(), allocation_profiles.end(),
-            AllocationProfile::CompareLeakPotential);
-  // Biggest one first.
-  std::reverse(allocation_profiles.begin(), allocation_profiles.end());
-  *destination = allocation_profiles;
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/leak_finder_tool.h b/cobalt/browser/memory_tracker/tool/leak_finder_tool.h
deleted file mode 100644
index 66f42f5..0000000
--- a/cobalt/browser/memory_tracker/tool/leak_finder_tool.h
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_LEAK_FINDER_TOOL_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_LEAK_FINDER_TOOL_H_
-
-#include <map>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-#include "nb/analytics/memory_tracker.h"
-#include "nb/concurrent_map.h"
-#include "nb/hash.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-// Records allocations and outputs leaks as a CSV. Each column will
-// have an associated symbol.
-class LeakFinderTool : public AbstractTool,
-                       public nb::analytics::MemoryTrackerDebugCallback {
- public:
-  enum StackTraceMode {
-    // Always get the C++ version of the stack trace.
-    kCPlusPlus,
-    // Whenever possible, get the javascript stack trace,
-    // else fallback to CPlusPlus.
-    kJavascript,
-  };
-
-  explicit LeakFinderTool(StackTraceMode pref);
-  virtual ~LeakFinderTool();
-
-  // OnMemoryAllocation() and OnMemoryDeallocation() are part of
-  // class MemoryTrackerDebugCallback.
-  void OnMemoryAllocation(const void* memory_block,
-                          const nb::analytics::AllocationRecord& record,
-                          const nb::analytics::CallStack& callstack) override;
-
-  void OnMemoryDeallocation(const void* memory_block,
-                            const nb::analytics::AllocationRecord& record,
-                            const nb::analytics::CallStack& callstack) override;
-
-  // Interface AbstractMemoryTrackerTool
-  std::string tool_name() const override;
-  void Run(Params* params) override;
-
-  const std::string* GetOrCreateSymbol(
-      const nb::analytics::CallStack& callstack);
-
-  const std::string* TryGetJavascriptSymbol();
-  const std::string* GetOrCreateCplusPlusSymbol(
-      const nb::analytics::CallStack& callstack);
-
- private:
-  struct AllocRec;
-  // A map from callsite -> allocation size.
-  // typedef std::map<const std::string*, AllocRec> AllocationFrameMap;
-  typedef nb::ConcurrentMap<const std::string*, AllocRec,
-                            nb::PODHasher<const std::string*> >
-      AllocationFrameMap;
-
-  // A map of memory -> callsite.
-  // This keeps track of what callsites belong to which allocations.
-  // typedef std::map<const void*, const std::string*> CallFrameMap;
-  //
-  typedef nb::ConcurrentMap<const void*, const std::string*,
-                            nb::PODHasher<const std::string*> >
-      CallFrameMap;
-
-  // A map from callsite -> allocation data.
-  typedef std::map<const std::string*, std::vector<AllocRec> > MapSamples;
-  // A value type for holding a slope and Y-intercept.
-  typedef std::pair<double, double> SlopeYIntercept;
-  // An AllocationRecord.
-  struct AllocRec {
-    AllocRec() : total_bytes(0), num_allocs(0) {}
-    AllocRec(const AllocRec& other)
-        : total_bytes(other.total_bytes), num_allocs(other.num_allocs) {}
-    AllocRec& operator=(const AllocRec& other) {
-      total_bytes = other.total_bytes;
-      num_allocs = other.num_allocs;
-      return *this;
-    }
-    int64_t total_bytes;
-    int32_t num_allocs;
-  };
-
-  // This data structure is used to for sorting leaks. The important variable
-  // is |leak_potential|, which represents how likely this AllocationProfile
-  // is a leak.
-  struct AllocationProfile {
-    AllocationProfile()
-        : name_(NULL),
-          alloc_history_(NULL),
-          slope_(0),
-          y_intercept_(0),
-          leak_potential_(0) {}
-
-    AllocationProfile(const std::string* name,
-                      const std::vector<AllocRec>* alloc_history, double slope,
-                      double y_intercept)
-        : name_(name),
-          alloc_history_(alloc_history),
-          slope_(slope),
-          y_intercept_(y_intercept),
-          leak_potential_(0) {}
-    const std::string* name_;
-    const std::vector<AllocRec>* alloc_history_;
-    // Linear regression data.
-    double slope_;
-    double y_intercept_;
-
-    // This this value is set externally. Higher values indicate higher chance
-    // that this is a leak.
-    double leak_potential_;
-
-    static bool CompareLeakPotential(const AllocationProfile& a,
-                                     const AllocationProfile& b) {
-      return a.leak_potential_ < b.leak_potential_;
-    }
-  };
-
-  static std::string GenerateCSV(
-      const std::vector<base::TimeDelta>& time_values,
-      const std::vector<AllocationProfile>& data);
-
-  void SampleSnapshot(
-      std::vector<std::pair<const std::string*, AllocRec> >* destination);
-
-  static void GenerateTopLeakingAllocationProfiles(
-      const std::vector<base::TimeDelta>& time_values,
-      const MapSamples& samples, std::vector<AllocationProfile>* destination);
-
-  static bool IsJavascriptScope(const nb::analytics::CallStack& callstack);
-
-  const std::string* default_callframe_str_;
-  nb::ConcurrentStringInterner string_pool_;
-  AllocationFrameMap frame_map_;
-  CallFrameMap callframe_map_;
-  StackTraceMode stack_trace_mode_;
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_LEAK_FINDER_TOOL_H_
diff --git a/cobalt/browser/memory_tracker/tool/log_writer_tool.cc b/cobalt/browser/memory_tracker/tool/log_writer_tool.cc
deleted file mode 100644
index b8dd168..0000000
--- a/cobalt/browser/memory_tracker/tool/log_writer_tool.cc
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/log_writer_tool.h"
-
-#include <algorithm>
-
-#include "base/time/time.h"
-#include "cobalt/browser/memory_tracker/tool/buffered_file_writer.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "starboard/client_porting/poem/string_poem.h"
-#include "starboard/common/string.h"
-#include "starboard/configuration.h"
-#include "starboard/configuration_constants.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-LogWriterTool::LogWriterTool() : start_time_(NowTime()) {
-  buffered_file_writer_.reset(new BufferedFileWriter(MemoryLogPath()));
-  InitAndRegisterMemoryReporter();
-}
-
-LogWriterTool::~LogWriterTool() {
-  // No locks are used for the thread reporter, so when it's set to null
-  // we allow one second for any suspended threads to run through and finish
-  // their reporting.
-  SbMemorySetReporter(NULL);
-  SbThreadSleep(kSbTimeSecond);
-  buffered_file_writer_.reset(NULL);
-}
-
-std::string LogWriterTool::tool_name() const {
-  return "MemoryTrackerLogWriter";
-}
-
-void LogWriterTool::Run(Params* params) {
-  // Run function does almost nothing.
-  params->logger()->Output("MemoryTrackerLogWriter running...");
-}
-
-void LogWriterTool::OnMemoryAllocation(const void* memory_block, size_t size) {
-  void* addresses[kMaxStackSize] = {};
-  // Though the SbSystemGetStack API documentation does not specify any possible
-  // negative return values, we take no chance.
-  const size_t count = std::max(SbSystemGetStack(addresses, kMaxStackSize), 0);
-
-  const size_t n = 256;
-  char buff[n] = {0};
-  size_t buff_pos = 0;
-
-  int time_since_start_ms = GetTimeSinceStartMs();
-  // Writes "+ <ALLOCATION ADDRESS> <size> <time>"
-  int bytes_written =
-      SbStringFormatF(buff, sizeof(buff), "+ %" PRIXPTR " %x %d",
-                      reinterpret_cast<uintptr_t>(memory_block),
-                      static_cast<unsigned int>(size), time_since_start_ms);
-
-  buff_pos += bytes_written;
-  const size_t end_index = std::min(count, kStartIndex + kNumAddressPrints);
-
-  // For each of the stack addresses that we care about, concat them to the
-  // buffer. This was originally written to do multiple stack addresses but
-  // this tends to overflow on some lower platforms so it's possible that
-  // this loop only iterates once.
-  for (size_t i = kStartIndex; i < end_index; ++i) {
-    void* p = addresses[i];
-    bytes_written =
-        SbStringFormatF(buff + buff_pos, sizeof(buff) - buff_pos,
-                        " %" PRIXPTR "", reinterpret_cast<uintptr_t>(p));
-    DCHECK_GE(bytes_written, 0);
-
-    if (bytes_written < 0) {
-      DCHECK(false) << "Error occurred while writing string.";
-      continue;
-    }
-
-    buff_pos += static_cast<size_t>(bytes_written);
-  }
-  // Adds a "\n" at the end.
-  starboard::strlcat(buff + buff_pos, "\n", static_cast<int>(n - buff_pos));
-  buffered_file_writer_->Append(buff, strlen(buff));
-}
-
-void LogWriterTool::OnMemoryDeallocation(const void* memory_block) {
-  const size_t n = 256;
-  char buff[n] = {0};
-  // Writes "- <ADDRESS OF ALLOCATION> \n"
-  SbStringFormatF(buff, sizeof(buff), "- %" PRIXPTR "\n",
-                  reinterpret_cast<uintptr_t>(memory_block));
-  buffered_file_writer_->Append(buff, strlen(buff));
-}
-
-void LogWriterTool::OnAlloc(void* context, const void* memory, size_t size) {
-  LogWriterTool* self = static_cast<LogWriterTool*>(context);
-  self->OnMemoryAllocation(memory, size);
-}
-
-void LogWriterTool::OnDealloc(void* context, const void* memory) {
-  LogWriterTool* self = static_cast<LogWriterTool*>(context);
-  self->OnMemoryDeallocation(memory);
-}
-
-void LogWriterTool::OnMapMemory(void* context, const void* memory,
-                                size_t size) {
-  LogWriterTool* self = static_cast<LogWriterTool*>(context);
-  self->OnMemoryAllocation(memory, size);
-}
-
-void LogWriterTool::OnUnMapMemory(void* context, const void* memory,
-                                  size_t size) {
-  LogWriterTool* self = static_cast<LogWriterTool*>(context);
-  self->OnMemoryDeallocation(memory);
-}
-
-std::string LogWriterTool::MemoryLogPath() {
-  char file_name_buff[2048] = {};
-  SbSystemGetPath(kSbSystemPathDebugOutputDirectory, file_name_buff,
-                  arraysize(file_name_buff));
-  std::string path(file_name_buff);
-  if (!path.empty()) {  // Protect against a dangling "/" at end.
-    const int back_idx_signed = static_cast<int>(path.length()) - 1;
-    if (back_idx_signed >= 0) {
-      const size_t idx = back_idx_signed;
-      if (path[idx] == kSbFileSepChar) {
-        path.erase(idx);
-      }
-    }
-  }
-  path.push_back(kSbFileSepChar);
-  path.append("memory_log.txt");
-  return path;
-}
-
-base::TimeTicks LogWriterTool::NowTime() {
-  // NowFromSystemTime() is slower but more accurate. However it might
-  // be useful to use the faster but less accurate version if there is
-  // a speedup.
-  return base::TimeTicks::Now();
-}
-
-int LogWriterTool::GetTimeSinceStartMs() const {
-  base::TimeDelta dt = NowTime() - start_time_;
-  return static_cast<int>(dt.InMilliseconds());
-}
-
-void LogWriterTool::InitAndRegisterMemoryReporter() {
-  DCHECK(!memory_reporter_.get()) << "Memory Reporter already registered.";
-
-  SbMemoryReporter mem_reporter = {OnAlloc, OnDealloc, OnMapMemory,
-                                   OnUnMapMemory, this};
-  memory_reporter_.reset(new SbMemoryReporter(mem_reporter));
-  SbMemorySetReporter(memory_reporter_.get());
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/log_writer_tool.h b/cobalt/browser/memory_tracker/tool/log_writer_tool.h
deleted file mode 100644
index dfd7b42..0000000
--- a/cobalt/browser/memory_tracker/tool/log_writer_tool.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_LOG_WRITER_TOOL_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_LOG_WRITER_TOOL_H_
-
-#include <memory>
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/time/time.h"
-#include "cobalt/browser/memory_tracker/tool/buffered_file_writer.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-#include "starboard/memory_reporter.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-class BufferedFileWriter;
-
-// Outputs memory_log.txt to the output log location. This log contains
-// allocations with a stack trace (non-symbolized) and deallocations without
-// a stack.
-class LogWriterTool : public AbstractTool {
- public:
-  LogWriterTool();
-  virtual ~LogWriterTool();
-
-  // Interface AbstractMemoryTrackerTool
-  std::string tool_name() const override;
-  void Run(Params* params) override;
-
-  void OnMemoryAllocation(const void* memory_block, size_t size);
-  void OnMemoryDeallocation(const void* memory_block);
-
- private:
-  // Callbacks for MemoryReporter
-  static void OnAlloc(void* context, const void* memory, size_t size);
-  static void OnDealloc(void* context, const void* memory);
-  static void OnMapMemory(void* context, const void* memory, size_t size);
-  static void OnUnMapMemory(void* context, const void* memory, size_t size);
-  static std::string MemoryLogPath();
-
-  static base::TimeTicks NowTime();
-  static const size_t kStartIndex = 5;
-  static const size_t kNumAddressPrints = 1;
-  static const size_t kMaxStackSize = 10;
-
-  int GetTimeSinceStartMs() const;
-  void InitAndRegisterMemoryReporter();
-
-  base::TimeTicks start_time_;
-  std::unique_ptr<SbMemoryReporter> memory_reporter_;
-  std::unique_ptr<BufferedFileWriter> buffered_file_writer_;
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_LOG_WRITER_TOOL_H_
diff --git a/cobalt/browser/memory_tracker/tool/malloc_logger_tool.cc b/cobalt/browser/memory_tracker/tool/malloc_logger_tool.cc
deleted file mode 100644
index 1bae210..0000000
--- a/cobalt/browser/memory_tracker/tool/malloc_logger_tool.cc
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/malloc_logger_tool.h"
-
-#include <algorithm>
-
-#include "base/time/time.h"
-#include "cobalt/base/c_val.h"
-#include "cobalt/browser/memory_tracker/tool/buffered_file_writer.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/util.h"
-#include "nb/memory_scope.h"
-#include "starboard/common/string.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-namespace {
-const int kAllocationRecord = 1;
-const int kDeallocationRecord = 0;
-const size_t kStartIndex = 5;
-const size_t kNumAddressPrints = 2;
-const size_t kMaxStackSize = 10;
-const size_t kRecordLimit = 1024;
-const NbMemoryScopeInfo kEmptyCallstackMemoryScopeInfo = {nullptr, "-", "-",
-                                                          0,       "-", true};
-}  // namespace
-
-MallocLoggerTool::MallocLoggerTool()
-    : start_time_(NowTime()),
-      atomic_counter_(0),
-      atomic_used_memory_(SbSystemGetUsedCPUMemory()) {
-  buffered_file_writer_.reset(new BufferedFileWriter(MemoryLogPath()));
-}
-
-MallocLoggerTool::~MallocLoggerTool() {
-  // No locks are used for the thread reporter, so when it's set to null
-  // we allow one second for any suspended threads to run through and finish
-  // their reporting.
-  SbMemorySetReporter(NULL);
-  SbThreadSleep(kSbTimeSecond);
-  buffered_file_writer_.reset(NULL);
-}
-
-std::string MallocLoggerTool::tool_name() const {
-  return "MemoryTrackerMallocLogger";
-}
-
-void MallocLoggerTool::Run(Params* params) {
-  // Update malloc stats every second
-  params->logger()->Output("MemoryTrackerMallocLogger running...");
-
-  // There are some memory allocations which do not get tracked.
-  // Those allocations show up as fragmentation.
-  // It has been empirically observed that a majority (98%+) of these
-  // untracked allocations happen in the first 20 seconds of Cobalt runtime.
-  //
-  // Also, there is minimal external fragmentation (< 1 MB) during this initial
-  // period.
-  //
-  // The following piece of code resets atomic_used_memory_ at the 20 second
-  // mark, to compensate for the deviation due to untracked memory.
-  base::TimeDelta current_sample_interval = base::TimeDelta::FromSeconds(20);
-  if (!params->wait_for_finish_signal(current_sample_interval.ToSbTime())) {
-    atomic_used_memory_.store(SbSystemGetUsedCPUMemory());
-  }
-
-  // Export fragmentation as a CVal on HUD.
-  base::CVal<base::cval::SizeInBytes> memory_fragmentation(
-      "Memory.CPU.Fragmentation", base::cval::SizeInBytes(0),
-      "Memory Fragmentation");
-
-  // Update CVal every 5 seconds
-  current_sample_interval = base::TimeDelta::FromSeconds(5);
-  int64_t allocated_memory = 0;
-  int64_t used_memory = 0;
-  while (!params->wait_for_finish_signal(current_sample_interval.ToSbTime())) {
-    allocated_memory = SbSystemGetUsedCPUMemory();
-    used_memory = atomic_used_memory_.load();
-    memory_fragmentation = static_cast<uint64>(
-        std::max(allocated_memory - used_memory, static_cast<int64_t>(0)));
-  }
-}
-
-void MallocLoggerTool::LogRecord(const void* memory_block,
-                                 const nb::analytics::AllocationRecord& record,
-                                 const nb::analytics::CallStack& callstack,
-                                 int type) {
-  const int log_counter = atomic_counter_.increment();
-  const int64_t used_memory = atomic_used_memory_.load();
-  const int64_t allocated_memory = SbSystemGetUsedCPUMemory();
-  const int time_since_start_ms = GetTimeSinceStartMs();
-  char buff[kRecordLimit] = {0};
-  size_t buff_pos = 0;
-  void* addresses[kMaxStackSize];
-
-  const NbMemoryScopeInfo* memory_scope;
-  if (callstack.empty()) {
-    memory_scope = &kEmptyCallstackMemoryScopeInfo;
-  } else {
-    memory_scope = callstack.back();
-  }
-
-  int bytes_written = SbStringFormatF(
-      buff, sizeof(buff),
-      "%u,%d,%zd,\"%s\",%d,%s,%d,%" PRId64 ",%" PRId64 ",%" PRIXPTR ",\"",
-      log_counter, type, record.size, memory_scope->file_name_,
-      memory_scope->line_number_, memory_scope->function_name_,
-      time_since_start_ms, allocated_memory, used_memory,
-      reinterpret_cast<uintptr_t>(memory_block));
-
-  buff_pos += static_cast<size_t>(bytes_written);
-  const size_t count = std::max(SbSystemGetStack(addresses, kMaxStackSize), 0);
-  const size_t end_index = std::min(count, kStartIndex + kNumAddressPrints);
-  // For each of the stack addresses that we care about, concat them to the
-  // buffer. This was originally written to do multiple stack addresses but
-  // this tends to overflow on some lower platforms so it's possible that
-  // this loop only iterates once.
-  for (size_t i = kStartIndex; i < end_index; ++i) {
-    void* p = addresses[i];
-    bytes_written =
-        SbStringFormatF(buff + buff_pos, kRecordLimit - buff_pos,
-                        ",%" PRIXPTR "", reinterpret_cast<uintptr_t>(p));
-    DCHECK_GE(bytes_written, 0);
-    buff_pos += static_cast<size_t>(bytes_written);
-  }
-
-  // Adds a "\n" at the end.
-  bytes_written = starboard::strlcat(buff + buff_pos, "\"\n",
-                                     static_cast<int>(kRecordLimit - buff_pos));
-  buff_pos += bytes_written;
-  buffered_file_writer_->Append(buff, buff_pos);
-}
-
-void MallocLoggerTool::OnMemoryAllocation(
-    const void* memory_block, const nb::analytics::AllocationRecord& record,
-    const nb::analytics::CallStack& callstack) {
-  atomic_used_memory_.fetch_add(record.size);
-  LogRecord(memory_block, record, callstack, kAllocationRecord);
-}
-
-void MallocLoggerTool::OnMemoryDeallocation(
-    const void* memory_block, const nb::analytics::AllocationRecord& record,
-    const nb::analytics::CallStack& callstack) {
-  atomic_used_memory_.fetch_sub(record.size);
-  LogRecord(memory_block, record, callstack, kDeallocationRecord);
-}
-
-std::string MallocLoggerTool::MemoryLogPath() {
-  char file_name_buff[2048] = {};
-  SbSystemGetPath(kSbSystemPathDebugOutputDirectory, file_name_buff,
-                  arraysize(file_name_buff));
-  std::string path(file_name_buff);
-  if (!path.empty()) {  // Protect against a dangling "/" at end.
-    const int back_idx_signed = static_cast<int>(path.length()) - 1;
-    if (back_idx_signed >= 0) {
-      const size_t idx = back_idx_signed;
-      if (path[idx] == '/') {
-        path.erase(idx);
-      }
-    }
-  }
-
-  base::Time time = base::Time::Now();
-  base::Time::Exploded exploded;
-  time.LocalExplode(&exploded);
-
-  std::stringstream ss;
-  ss << "/memory_log_" << exploded.year << "-" << exploded.month << "-"
-     << exploded.day_of_month << ":" << exploded.hour << "-" << exploded.minute
-     << "-" << exploded.second << ".csv";
-  path.append(ss.str());
-  return path;
-}
-
-base::TimeTicks MallocLoggerTool::NowTime() {
-  // NowFromSystemTime() is slower but more accurate. However it might
-  // be useful to use the faster but less accurate version if there is
-  // a speedup.
-  return base::TimeTicks::Now();
-}
-
-int MallocLoggerTool::GetTimeSinceStartMs() const {
-  base::TimeDelta dt = NowTime() - start_time_;
-  return static_cast<int>(dt.InMilliseconds());
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/malloc_logger_tool.h b/cobalt/browser/memory_tracker/tool/malloc_logger_tool.h
deleted file mode 100644
index 2086d79..0000000
--- a/cobalt/browser/memory_tracker/tool/malloc_logger_tool.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_MALLOC_LOGGER_TOOL_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_MALLOC_LOGGER_TOOL_H_
-
-#include <memory>
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/time/time.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-#include "nb/memory_scope.h"
-#include "starboard/common/atomic.h"
-#include "starboard/memory_reporter.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-class BufferedFileWriter;
-
-// Outputs memory_log_<time_stamp>.csv to the output log location. This log
-// contains allocations and deallocations with a non-symbolized stack trace.
-class MallocLoggerTool : public AbstractTool,
-                         public nb::analytics::MemoryTrackerDebugCallback {
- public:
-  MallocLoggerTool();
-  virtual ~MallocLoggerTool();
-
-  // Interface AbstractMemoryTrackerTool
-  std::string tool_name() const override;
-  void Run(Params* params) override;
-
-  // OnMemoryAllocation() and OnMemoryDeallocation() are part of
-  // class MemoryTrackerDebugCallback.
-  void OnMemoryAllocation(const void* memory_block,
-                          const nb::analytics::AllocationRecord& record,
-                          const nb::analytics::CallStack& callstack) override;
-
-  void OnMemoryDeallocation(const void* memory_block,
-                            const nb::analytics::AllocationRecord& record,
-                            const nb::analytics::CallStack& callstack) override;
-
-  // Method to obtain allocation, stack information and generate records
-  void LogRecord(const void* memory_block,
-                 const nb::analytics::AllocationRecord& record,
-                 const nb::analytics::CallStack& callstack, const int type);
-
- private:
-  static std::string MemoryLogPath();
-  static base::TimeTicks NowTime();
-
-  int GetTimeSinceStartMs() const;
-
-  base::TimeTicks start_time_;
-  std::unique_ptr<SbMemoryReporter> memory_reporter_;
-  std::unique_ptr<BufferedFileWriter> buffered_file_writer_;
-  starboard::atomic_int32_t atomic_counter_;
-  starboard::atomic_int64_t atomic_used_memory_;
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_MALLOC_LOGGER_TOOL_H_
diff --git a/cobalt/browser/memory_tracker/tool/malloc_stats_tool.cc b/cobalt/browser/memory_tracker/tool/malloc_stats_tool.cc
deleted file mode 100644
index bbb7e58..0000000
--- a/cobalt/browser/memory_tracker/tool/malloc_stats_tool.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/malloc_stats_tool.h"
-
-#include <string>
-#include <vector>
-
-#include "cobalt/browser/memory_tracker/tool/histogram_table_csv_base.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-#include "nb/analytics/memory_tracker.h"
-#include "starboard/common/string.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-MallocStatsTool::MallocStatsTool() {}
-
-std::string MallocStatsTool::tool_name() const { return "MallocStatsTool"; }
-
-void MallocStatsTool::Run(Params* params) {
-  params->logger()->Output("MallocStatsTool running...\n");
-
-  Timer output_timer(base::TimeDelta::FromSeconds(30));
-  Timer sample_timer(base::TimeDelta::FromMilliseconds(50));
-
-  MemoryBytesHistogramCSV histogram_table;
-  histogram_table.set_title("Malloc Stats");
-
-  // If we get a finish signal then this will break out of the loop.
-  while (!params->wait_for_finish_signal(250 * kSbTimeMillisecond)) {
-    // LOG CSV.
-    if (output_timer.UpdateAndIsExpired()) {
-      std::stringstream ss;
-      ss << kNewLine << histogram_table.ToString() << kNewLine << kNewLine;
-      params->logger()->Output(ss.str());
-    }
-
-    // ADD A HISTOGRAM SAMPLE.
-    if (sample_timer.UpdateAndIsExpired()) {
-      // Take a sample.
-      nb::analytics::MemoryStats memory_stats =
-          nb::analytics::GetProcessMemoryStats();
-
-      histogram_table.BeginRow(params->time_since_start());
-      histogram_table.AddRowValue("TotalCpuMemory(MB)",
-                                  memory_stats.total_cpu_memory);
-      histogram_table.AddRowValue("UsedCpuMemory(MB)",
-                                  memory_stats.used_cpu_memory);
-      histogram_table.AddRowValue("TotalGpuMemory(MB)",
-                                  memory_stats.total_gpu_memory);
-      histogram_table.AddRowValue("UsedGpuMemory(MB)",
-                                  memory_stats.used_gpu_memory);
-      histogram_table.FinalizeRow();
-    }
-
-    // COMPRESS TABLE WHEN FULL.
-    //
-    // Table is full, therefore eliminate half of the elements.
-    // Reduce sample frequency to match.
-    if (histogram_table.NumberOfRows() >= 100) {
-      // Compression step.
-      histogram_table.RemoveOddElements();
-
-      // By double the sampling time this keeps the table linear with
-      // respect to time. If sampling time was not doubled then there
-      // would be time distortion in the graph.
-      sample_timer.ScaleTriggerTime(2.0);
-      sample_timer.Restart();
-    }
-  }
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/malloc_stats_tool.h b/cobalt/browser/memory_tracker/tool/malloc_stats_tool.h
deleted file mode 100644
index 0d16bd7..0000000
--- a/cobalt/browser/memory_tracker/tool/malloc_stats_tool.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_MALLOC_STATS_TOOL_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_MALLOC_STATS_TOOL_H_
-
-#include <string>
-
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-// Generates a CSV table of the memory stats. This tool does not use
-// per-allocation tracking and therefore has a lower memory footprint than
-// most other tools.
-class MallocStatsTool : public AbstractTool {
- public:
-  MallocStatsTool();
-  std::string tool_name() const override;
-  void Run(Params* params) override;
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_MALLOC_STATS_TOOL_H_
diff --git a/cobalt/browser/memory_tracker/tool/memory_size_binner_tool.cc b/cobalt/browser/memory_tracker/tool/memory_size_binner_tool.cc
deleted file mode 100644
index 709d88a..0000000
--- a/cobalt/browser/memory_tracker/tool/memory_size_binner_tool.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/memory_size_binner_tool.h"
-
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-#include "cobalt/base/c_val.h"
-#include "cobalt/browser/memory_tracker/tool/util.h"
-#include "nb/analytics/memory_tracker.h"
-#include "nb/analytics/memory_tracker_helpers.h"
-#include "starboard/common/log.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-namespace {
-
-const nb::analytics::AllocationGroup* FindAllocationGroup(
-    const std::string& name, nb::analytics::MemoryTracker* memory_tracker) {
-  std::vector<const nb::analytics::AllocationGroup*> groups;
-  memory_tracker->GetAllocationGroups(&groups);
-  // Find by exact string match.
-  for (size_t i = 0; i < groups.size(); ++i) {
-    const nb::analytics::AllocationGroup* group = groups[i];
-    if (group->name().compare(name) == 0) {
-      return group;
-    }
-  }
-  return NULL;
-}
-}  // namespace.
-
-MemorySizeBinnerTool::MemorySizeBinnerTool(const std::string& memory_scope_name)
-    : memory_scope_name_(memory_scope_name) {}
-
-void MemorySizeBinnerTool::Run(Params* params) {
-  const nb::analytics::AllocationGroup* target_group = NULL;
-
-  while (!params->finished()) {
-    if (target_group == NULL && !memory_scope_name_.empty()) {
-      target_group =
-          FindAllocationGroup(memory_scope_name_, params->memory_tracker());
-    }
-
-    std::stringstream ss;
-    ss.precision(2);
-    if (target_group || memory_scope_name_.empty()) {
-      AllocationSizeBinner visitor_binner = AllocationSizeBinner(target_group);
-      params->memory_tracker()->Accept(&visitor_binner);
-
-      size_t min_size = 0;
-      size_t max_size = 0;
-
-      visitor_binner.GetLargestSizeRange(&min_size, &max_size);
-
-      FindTopSizes top_size_visitor =
-          FindTopSizes(min_size, max_size, target_group);
-      params->memory_tracker()->Accept(&top_size_visitor);
-
-      ss << kNewLine;
-      ss << "TimeNow " << params->TimeInMinutesString() << " (minutes):";
-      ss << kNewLine;
-      if (!memory_scope_name_.empty()) {
-        ss << "Tracking Memory Scope \"" << memory_scope_name_ << "\", ";
-      } else {
-        ss << "Tracking whole program, ";
-      }
-      ss << "first row is allocation size range, second row is number of "
-         << kNewLine << "allocations in that range." << kNewLine;
-      ss << visitor_binner.ToCSVString();
-      ss << kNewLine;
-      ss << "Largest allocation range: \"" << min_size << "..." << max_size
-         << "\"" << kNewLine;
-      ss << "Printing out top allocations from this range: " << kNewLine;
-      ss << top_size_visitor.ToString(5) << kNewLine;
-    } else {
-      ss << "No allocations for \"" << memory_scope_name_ << "\".";
-    }
-
-    params->logger()->Output(ss.str().c_str());
-    params->logger()->Flush();
-
-    // Sleep until the next sample.
-    base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
-  }
-}
-
-std::string MemorySizeBinnerTool::tool_name() const {
-  return "MemoryTrackerCompressedTimeSeries";
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/memory_size_binner_tool.h b/cobalt/browser/memory_tracker/tool/memory_size_binner_tool.h
deleted file mode 100644
index 324e6df..0000000
--- a/cobalt/browser/memory_tracker/tool/memory_size_binner_tool.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_MEMORY_SIZE_BINNER_TOOL_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_MEMORY_SIZE_BINNER_TOOL_H_
-
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-// This tool inspects a memory scope and reports on the memory usage.
-// The output will be a CSV file printed to stdout representing
-// the number of memory allocations for objects. The objects are binned
-// according to the size of the memory allocation. Objects within the same
-// power of two are binned together. For example 1024 will be binned with 1025.
-class MemorySizeBinnerTool : public AbstractTool {
- public:
-  // memory_scope_name represents the memory scope that is to be investigated.
-  explicit MemorySizeBinnerTool(const std::string& memory_scope_name);
-
-  void Run(Params* params) override;
-  std::string tool_name() const override;
-
- private:
-  std::string memory_scope_name_;
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_MEMORY_SIZE_BINNER_TOOL_H_
diff --git a/cobalt/browser/memory_tracker/tool/params.cc b/cobalt/browser/memory_tracker/tool/params.cc
deleted file mode 100644
index d1fc5a3..0000000
--- a/cobalt/browser/memory_tracker/tool/params.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/params.h"
-
-#include <sstream>
-
-#include "base/basictypes.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-Params::Params(nb::analytics::MemoryTracker* memory_tracker,
-               AbstractLogger* logger, base::Time start_time)
-    : memory_tracker_(memory_tracker),
-      finished_(false),
-      logger_(logger),
-      timer_(start_time) {}
-
-bool Params::finished() const { return finished_; }
-
-bool Params::wait_for_finish_signal(SbTime wait_us) {
-  return finished_semaphore_.TakeWait(wait_us);
-}
-
-void Params::set_finished(bool val) {
-  finished_ = val;
-  finished_semaphore_.Put();
-}
-
-nb::analytics::MemoryTracker* Params::memory_tracker() const {
-  return memory_tracker_;
-}
-
-cobalt::browser::memory_tracker::AbstractLogger* Params::logger() {
-  return logger_.get();
-}
-
-base::TimeDelta Params::time_since_start() const {
-  return base::Time::NowFromSystemTime() - timer_;
-}
-
-std::string Params::TimeInMinutesString() const {
-  base::TimeDelta delta_t = time_since_start();
-  int64 seconds = delta_t.InSeconds();
-  float time_mins = static_cast<float>(seconds) / 60.f;
-  std::stringstream ss;
-
-  ss << time_mins;
-  return ss.str();
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/params.h b/cobalt/browser/memory_tracker/tool/params.h
deleted file mode 100644
index 1f71052..0000000
--- a/cobalt/browser/memory_tracker/tool/params.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_PARAMS_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_PARAMS_H_
-
-#include <memory>
-#include <string>
-
-#include "base/time/time.h"
-#include "nb/analytics/memory_tracker.h"
-#include "starboard/common/semaphore.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-class AbstractLogger;
-
-class Params {
- public:
-  Params(nb::analytics::MemoryTracker* memory_tracker, AbstractLogger* logger,
-         base::Time start_time);
-  bool finished() const;
-  bool wait_for_finish_signal(SbTime wait_us);
-  void set_finished(bool val);
-
-  nb::analytics::MemoryTracker* memory_tracker() const;
-  AbstractLogger* logger();
-  base::TimeDelta time_since_start() const;
-  std::string TimeInMinutesString() const;
-
- private:
-  nb::analytics::MemoryTracker* memory_tracker_;
-  bool finished_;
-  std::unique_ptr<AbstractLogger> logger_;
-  base::Time timer_;
-  starboard::Semaphore finished_semaphore_;
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_PARAMS_H_
diff --git a/cobalt/browser/memory_tracker/tool/print_csv_tool.cc b/cobalt/browser/memory_tracker/tool/print_csv_tool.cc
deleted file mode 100644
index 90ecb57..0000000
--- a/cobalt/browser/memory_tracker/tool/print_csv_tool.cc
+++ /dev/null
@@ -1,262 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/print_csv_tool.h"
-
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "cobalt/base/c_val.h"
-#include "cobalt/browser/memory_tracker/tool/util.h"
-#include "nb/analytics/memory_tracker.h"
-#include "nb/analytics/memory_tracker_helpers.h"
-#include "starboard/common/log.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-PrintCSVTool::PrintCSVTool(int sampling_interval_ms, int sampling_time_ms)
-    : sample_interval_ms_(sampling_interval_ms),
-      sampling_time_ms_(sampling_time_ms) {}
-
-std::string PrintCSVTool::ToCsvString(const MapAllocationSamples& samples_in) {
-  typedef MapAllocationSamples Map;
-  typedef Map::const_iterator MapIt;
-
-  size_t largest_sample_size = 0;
-  size_t smallest_sample_size = INT_MAX;
-
-  // Sanitize samples_in and store as samples.
-  MapAllocationSamples samples;
-  for (MapIt it = samples_in.begin(); it != samples_in.end(); ++it) {
-    std::string name = it->first;
-    const AllocationSamples& value = it->second;
-
-    if (value.allocated_bytes_.size() != value.number_allocations_.size()) {
-      SB_NOTREACHED() << "Error at " << __FILE__ << ":" << __LINE__;
-      return "ERROR";
-    }
-
-    const size_t n = value.allocated_bytes_.size();
-    if (n > largest_sample_size) {
-      largest_sample_size = n;
-    }
-    if (n < smallest_sample_size) {
-      smallest_sample_size = n;
-    }
-
-    const bool duplicate_found = (samples.end() != samples.find(name));
-    if (duplicate_found) {
-      SB_NOTREACHED() << "Error, duplicate found for entry: " << name
-                      << kNewLine;
-    }
-    // Store value as a sanitized sample.
-    samples[name] = value;
-  }
-
-  SB_DCHECK(largest_sample_size == smallest_sample_size);
-
-  std::stringstream ss;
-
-  // Begin output to CSV.
-  // Sometimes we need to skip the CPU memory entry.
-  const MapIt total_cpu_memory_it = samples.find(UntrackedMemoryKey());
-
-  // Preamble
-  ss << kNewLine << "//////////////////////////////////////////////";
-  ss << kNewLine << "// CSV of bytes / allocation" << kNewLine;
-  // HEADER.
-  ss << "Name" << kDelimiter << kQuote << "Bytes/Alloc" << kQuote << kNewLine;
-  // DATA.
-  for (MapIt it = samples.begin(); it != samples.end(); ++it) {
-    if (total_cpu_memory_it == it) {
-      continue;
-    }
-
-    const AllocationSamples& samples_ref = it->second;
-    if (samples_ref.allocated_bytes_.empty() ||
-        samples_ref.number_allocations_.empty()) {
-      SB_NOTREACHED() << "Should not be here";
-      return "ERROR";
-    }
-    const int64 n_allocs = samples_ref.number_allocations_.back();
-    const int64 n_bytes = samples_ref.allocated_bytes_.back();
-    int64 bytes_per_alloc = 0;
-    if (n_allocs > 0) {
-      bytes_per_alloc = n_bytes / n_allocs;
-    }
-    const std::string& name = it->first;
-    ss << kQuote << SanitizeCSVKey(name) << kQuote << kDelimiter
-       << bytes_per_alloc << kNewLine;
-  }
-  ss << kNewLine;
-
-  // Preamble
-  ss << kNewLine << "//////////////////////////////////////////////" << kNewLine
-     << "// CSV of bytes allocated per region (MB's)." << kNewLine
-     << "// Units are in Megabytes. This is designed" << kNewLine
-     << "// to be used in a stacked graph." << kNewLine;
-
-  // HEADER.
-  for (MapIt it = samples.begin(); it != samples.end(); ++it) {
-    if (total_cpu_memory_it == it) {
-      continue;
-    }
-    // Strip out any characters that could make parsing the csv difficult.
-    const std::string name = SanitizeCSVKey(it->first);
-    ss << kQuote << name << kQuote << kDelimiter;
-  }
-  // Save the total for last.
-  if (total_cpu_memory_it != samples.end()) {
-    const std::string& name = SanitizeCSVKey(total_cpu_memory_it->first);
-    ss << kQuote << name << kQuote << kDelimiter;
-  }
-  ss << kNewLine;
-
-  // Print out the values of each of the samples.
-  for (size_t i = 0; i < smallest_sample_size; ++i) {
-    for (MapIt it = samples.begin(); it != samples.end(); ++it) {
-      if (total_cpu_memory_it == it) {
-        continue;
-      }
-      const int64 alloc_bytes = it->second.allocated_bytes_[i];
-      // Convert to float megabytes with decimals of precision.
-      double n = static_cast<double>(alloc_bytes / (1000 * 10));
-      n = n / (100.);
-      ss << n << kDelimiter;
-    }
-    if (total_cpu_memory_it != samples.end()) {
-      const int64 alloc_bytes = total_cpu_memory_it->second.allocated_bytes_[i];
-      // Convert to float megabytes with decimals of precision.
-      double n = static_cast<double>(alloc_bytes / (1000 * 10));
-      n = n / (100.);
-      ss << n << kDelimiter;
-    }
-    ss << kNewLine;
-  }
-
-  ss << kNewLine;
-  // Preamble
-  ss << kNewLine << "//////////////////////////////////////////////";
-  ss << kNewLine << "// CSV of number of allocations per region." << kNewLine;
-
-  // HEADER
-  for (MapIt it = samples.begin(); it != samples.end(); ++it) {
-    if (total_cpu_memory_it == it) {
-      continue;
-    }
-    const std::string& name = SanitizeCSVKey(it->first);
-    ss << kQuote << name << kQuote << kDelimiter;
-  }
-  ss << kNewLine;
-  for (size_t i = 0; i < smallest_sample_size; ++i) {
-    for (MapIt it = samples.begin(); it != samples.end(); ++it) {
-      if (total_cpu_memory_it == it) {
-        continue;
-      }
-      const int64 n_allocs = it->second.number_allocations_[i];
-      ss << n_allocs << kDelimiter;
-    }
-    ss << kNewLine;
-  }
-  std::string output = ss.str();
-  return output;
-}
-
-const char* PrintCSVTool::UntrackedMemoryKey() { return "Untracked Memory"; }
-
-void PrintCSVTool::Run(Params* params) {
-  params->logger()->Output("\nMemoryTrackerPrintCSVThread is sampling...\n");
-  int sample_count = 0;
-  MapAllocationSamples map_samples;
-
-  while (!TimeExpiredYet(*params) && !params->finished()) {
-    // Sample total memory used by the system.
-    nb::analytics::MemoryStats mem_stats =
-        nb::analytics::GetProcessMemoryStats();
-    int64 untracked_used_memory =
-        mem_stats.used_cpu_memory + mem_stats.used_gpu_memory;
-
-    std::vector<const nb::analytics::AllocationGroup*> vector_output;
-    params->memory_tracker()->GetAllocationGroups(&vector_output);
-
-    // Sample all known memory scopes.
-    for (size_t i = 0; i < vector_output.size(); ++i) {
-      const nb::analytics::AllocationGroup* group = vector_output[i];
-      const std::string& name = group->name();
-
-      const bool first_creation =
-          map_samples.find(group->name()) == map_samples.end();
-
-      AllocationSamples* new_entry = &(map_samples[name]);
-
-      // Didn't see it before so create new entry.
-      if (first_creation) {
-        // Make up for lost samples...
-        new_entry->allocated_bytes_.resize(sample_count, 0);
-        new_entry->number_allocations_.resize(sample_count, 0);
-      }
-
-      int32 num_allocs = -1;
-      int64 allocation_bytes = -1;
-      group->GetAggregateStats(&num_allocs, &allocation_bytes);
-
-      new_entry->allocated_bytes_.push_back(allocation_bytes);
-      new_entry->number_allocations_.push_back(num_allocs);
-
-      untracked_used_memory -= allocation_bytes;
-    }
-
-    // Now push in remaining total.
-    AllocationSamples* process_sample = &(map_samples[UntrackedMemoryKey()]);
-    if (untracked_used_memory < 0) {
-      // On some platforms, total GPU memory may not be correctly reported.
-      // However the allocations from the GPU memory may be reported. In this
-      // case untracked_used_memory will go negative. To protect the memory
-      // reporting the untracked_used_memory is set to 0 so that it doesn't
-      // cause an error in reporting.
-      untracked_used_memory = 0;
-    }
-    process_sample->allocated_bytes_.push_back(untracked_used_memory);
-    process_sample->number_allocations_.push_back(-1);
-
-    ++sample_count;
-    base::PlatformThread::Sleep(
-        base::TimeDelta::FromMilliseconds(sample_interval_ms_));
-  }
-
-  std::stringstream ss;
-  ss.precision(2);
-  ss << "Time now: " << params->TimeInMinutesString() << ",\n";
-  ss << ToCsvString(map_samples);
-  params->logger()->Output(ss.str().c_str());
-  params->logger()->Flush();
-  // Prevents the "thread exited code 0" from being interleaved into the
-  // output. This happens if flush is not implemented correctly in the system.
-  base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
-}
-
-bool PrintCSVTool::TimeExpiredYet(const Params& params) {
-  base::TimeDelta dt = params.time_since_start();
-  int64 dt_ms = dt.InMilliseconds();
-  const bool expired_time = dt_ms > sampling_time_ms_;
-  return expired_time;
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/print_csv_tool.h b/cobalt/browser/memory_tracker/tool/print_csv_tool.h
deleted file mode 100644
index 623334e..0000000
--- a/cobalt/browser/memory_tracker/tool/print_csv_tool.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_PRINT_CSV_TOOL_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_PRINT_CSV_TOOL_H_
-
-#include <map>
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-// Generates CSV values of the engine.
-// There are three sections of data including:
-//   1. average bytes / alloc
-//   2. # Bytes allocated per memory scope.
-//   3. # Allocations per memory scope.
-// This data can be pasted directly into a Google spreadsheet and visualized.
-// Note that this thread will implicitly call Start() is called during
-// construction and Cancel() & Join() during destruction.
-class PrintCSVTool : public AbstractTool {
- public:
-  // This tool will only produce on CSV dump of the engine. This is useful
-  // for profiling startup memory consumption.
-  PrintCSVTool(int sampling_interval_ms, int sampling_time_ms);
-
-  // Overridden so that the thread can exit gracefully.
-  void Run(Params* params) override;
-  std::string tool_name() const override { return "MemoryTrackerPrintCSV"; }
-
- private:
-  typedef std::map<std::string, AllocationSamples> MapAllocationSamples;
-  static std::string ToCsvString(const MapAllocationSamples& samples);
-  static const char* UntrackedMemoryKey();
-  bool TimeExpiredYet(const Params& params);
-
-  const int sample_interval_ms_;
-  const int sampling_time_ms_;
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_PRINT_CSV_TOOL_H_
diff --git a/cobalt/browser/memory_tracker/tool/print_tool.cc b/cobalt/browser/memory_tracker/tool/print_tool.cc
deleted file mode 100644
index 6344974..0000000
--- a/cobalt/browser/memory_tracker/tool/print_tool.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/print_tool.h"
-
-#include <map>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/threading/platform_thread.h"
-#include "cobalt/base/c_val.h"
-#include "cobalt/browser/memory_tracker/tool/util.h"
-#include "nb/analytics/memory_tracker.h"
-#include "nb/analytics/memory_tracker_helpers.h"
-#include "starboard/common/log.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-using nb::analytics::AllocationGroup;
-
-class PrintTool::CvalsMap {
- public:
-  typedef base::CVal<base::cval::SizeInBytes> CValType;
-
-  ~CvalsMap() {
-    while (!map_.empty()) {
-      MapCvals::iterator it = map_.begin();
-      delete it->second;
-      map_.erase(it);
-    }
-  }
-
-  void Update(const std::string& name, size_t value) {
-    std::string cval_name = GetCvalName(name);
-    CValType*& val = map_[cval_name];
-    if (!val) {
-      // Create if not found.
-      val = new CValType(cval_name, 0,
-                         "Automatically generated by the "
-                         "browser::memory_tracker system.");
-    }
-    (*val) = value;
-  }
-
-  static std::string GetCvalName(const std::string& name) {
-    std::stringstream ss;
-    ss << "Memory.Scope." << name;
-    return ss.str();
-  }
-
- private:
-  typedef std::map<std::string, CValType*> MapCvals;
-  MapCvals map_;
-};
-
-PrintTool::PrintTool() : cvals_map_(new CvalsMap) {}
-
-PrintTool::~PrintTool() {}
-
-void PrintTool::Run(Params* params) {
-  const std::string kSeparator =
-      "--------------------------------------------------";
-
-  while (!params->finished()) {
-    std::vector<const AllocationGroup*> vector_output;
-    params->memory_tracker()->GetAllocationGroups(&vector_output);
-
-    typedef std::map<std::string, const AllocationGroup*> Map;
-    typedef Map::const_iterator MapIt;
-
-    Map output;
-    for (size_t i = 0; i < vector_output.size(); ++i) {
-      const AllocationGroup* group = vector_output[i];
-      output[group->name()] = group;
-    }
-
-    int32 num_allocs = 0;
-    int64 total_bytes = 0;
-
-    struct F {
-      static void PrintRow(std::stringstream* ss, const std::string& v1,
-                           const std::string& v2, const std::string& v3) {
-        ss->width(25);
-        *ss << std::left << v1;
-        ss->width(13);
-        *ss << std::right << v2 << "  ";
-        ss->width(10);
-        *ss << std::right << v3 << "\n";
-      }
-    };
-
-    if (params->memory_tracker()->IsMemoryTrackingEnabled()) {
-      // If this isn't true then it would cause an infinite loop. The
-      // following will likely crash.
-      SB_DCHECK(false) << "Unexpected, memory tracking should be disabled.";
-    }
-
-    std::stringstream ss;
-
-    ss << kNewLine;
-    ss << "TimeNow " << params->TimeInMinutesString()
-       << " (minutes):" << kNewLine << kNewLine;
-
-    ss << kSeparator << kNewLine;
-    nb::analytics::MemoryStats memstats =
-        nb::analytics::GetProcessMemoryStats();
-
-    F::PrintRow(&ss, "MALLOC STAT", "IN USE BYTES", "");
-    ss << kSeparator << kNewLine;
-    F::PrintRow(&ss, "Total CPU Reserved",
-                NumberFormatWithCommas(memstats.total_cpu_memory), "");
-
-    F::PrintRow(&ss, "Total CPU Used",
-                NumberFormatWithCommas(memstats.used_cpu_memory), "");
-
-    F::PrintRow(&ss, "Total GPU Reserved",
-                NumberFormatWithCommas(memstats.total_gpu_memory), "");
-
-    F::PrintRow(&ss, "Total GPU Used",
-                NumberFormatWithCommas(memstats.used_gpu_memory), "");
-
-    ss << kSeparator << kNewLine << kNewLine;
-
-    ss << kSeparator << kNewLine;
-    F::PrintRow(&ss, "MEMORY REGION", "IN USE BYTES", "NUM ALLOCS");
-    ss << kSeparator << kNewLine;
-
-    for (MapIt it = output.begin(); it != output.end(); ++it) {
-      const AllocationGroup* group = it->second;
-      if (!group) {
-        continue;
-      }
-
-      int32 num_group_allocs = -1;
-      int64 total_group_bytes = -1;
-
-      group->GetAggregateStats(&num_group_allocs, &total_group_bytes);
-      SB_DCHECK(-1 != num_group_allocs);
-      SB_DCHECK(-1 != total_group_bytes);
-
-      cvals_map_->Update(group->name(), static_cast<size_t>(total_group_bytes));
-
-      num_allocs += num_group_allocs;
-      total_bytes += total_group_bytes;
-
-      F::PrintRow(&ss, it->first, NumberFormatWithCommas(total_group_bytes),
-                  NumberFormatWithCommas(num_group_allocs));
-    }
-
-    cvals_map_->Update("Total", static_cast<size_t>(total_bytes));
-
-    ss << kNewLine;
-
-    F::PrintRow(&ss, "Total (in groups above)",
-                NumberFormatWithCommas(total_bytes),
-                NumberFormatWithCommas(num_allocs));
-
-    ss << kSeparator << kNewLine;
-    ss << kNewLine << kNewLine;
-
-    params->logger()->Output(ss.str().c_str());
-    // Output once every 5 seconds.
-    base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(5));
-  }
-}
-
-std::string PrintTool::tool_name() const { return "MemoryTrackerPrintThread"; }
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/print_tool.h b/cobalt/browser/memory_tracker/tool/print_tool.h
deleted file mode 100644
index f50b249..0000000
--- a/cobalt/browser/memory_tracker/tool/print_tool.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_PRINT_TOOL_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_PRINT_TOOL_H_
-
-#include <memory>
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-// Start() is called when this object is created, and Cancel() & Join() are
-// called during destruction.
-class PrintTool : public AbstractTool {
- public:
-  PrintTool();
-  ~PrintTool() override;
-
-  // Overridden so that the thread can exit gracefully.
-  void Run(Params* params) override;
-  std::string tool_name() const override;
-
- private:
-  class CvalsMap;
-  std::unique_ptr<CvalsMap> cvals_map_;
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_PRINT_TOOL_H_
diff --git a/cobalt/browser/memory_tracker/tool/tool_impl.cc b/cobalt/browser/memory_tracker/tool/tool_impl.cc
deleted file mode 100644
index 4b4580f..0000000
--- a/cobalt/browser/memory_tracker/tool/tool_impl.cc
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-
-#include <algorithm>
-#include <cstring>
-#include <iomanip>
-#include <iterator>
-#include <map>
-#include <set>
-#include <sstream>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/time/time.h"
-#include "cobalt/base/c_val_collection_entry_stats.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/tool_thread.h"
-#include "cobalt/browser/memory_tracker/tool/util.h"
-#include "nb/analytics/memory_tracker.h"
-#include "nb/analytics/memory_tracker_helpers.h"
-#include "nb/concurrent_map.h"
-#include "nb/memory_scope.h"
-#include "starboard/common/semaphore.h"
-#include "starboard/common/string.h"
-#include "starboard/configuration.h"
-#include "starboard/file.h"
-#include "starboard/system.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-using nb::analytics::AllocationGroup;
-using nb::analytics::AllocationRecord;
-using nb::analytics::AllocationVisitor;
-using nb::analytics::GetProcessMemoryStats;
-using nb::analytics::MemoryStats;
-using nb::analytics::MemoryTracker;
-
-size_t AllocationSizeBinner::GetBucketIndexForAllocationSize(size_t size) {
-  for (int i = 0; i < 32; ++i) {
-    size_t val = static_cast<size_t>(0x1) << i;
-    if (val > size) {
-      return i;
-    }
-  }
-  SB_NOTREACHED();
-  return 32;
-}
-
-void AllocationSizeBinner::GetSizeRange(size_t size, size_t* min_value,
-                                        size_t* max_value) {
-  size_t idx = GetBucketIndexForAllocationSize(size);
-  IndexToSizeRange(idx, min_value, max_value);
-}
-
-void AllocationSizeBinner::IndexToSizeRange(size_t idx, size_t* min_value,
-                                            size_t* max_value) {
-  if (idx == 0) {
-    *min_value = 0;
-    *max_value = 0;
-    return;
-  }
-  *min_value = static_cast<size_t>(0x1) << (idx - 1);
-  *max_value = (*min_value << 1) - 1;
-  return;
-}
-
-size_t AllocationSizeBinner::GetIndexRepresentingMostMemoryConsumption() const {
-  int64 largest_allocation_total = 0;
-  size_t largest_allocation_total_idx = 0;
-
-  for (size_t i = 0; i < allocation_histogram_.size(); ++i) {
-    size_t alloc_size = static_cast<size_t>(0x1) << i;
-    size_t count = allocation_histogram_[i];
-    int64 allocation_total =
-        static_cast<int64>(alloc_size) * static_cast<int64>(count);
-
-    if (largest_allocation_total < allocation_total) {
-      largest_allocation_total = allocation_total;
-      largest_allocation_total_idx = i;
-    }
-  }
-  return largest_allocation_total_idx;
-}
-
-void AllocationSizeBinner::GetLargestSizeRange(size_t* min_value,
-                                               size_t* max_value) const {
-  size_t index = GetIndexRepresentingMostMemoryConsumption();
-  IndexToSizeRange(index, min_value, max_value);
-}
-
-AllocationSizeBinner::AllocationSizeBinner(const AllocationGroup* group_filter)
-    : group_filter_(group_filter) {
-  allocation_histogram_.resize(33);
-}
-
-bool AllocationSizeBinner::PassesFilter(
-    const AllocationRecord& alloc_record) const {
-  if (group_filter_ == NULL) {
-    return true;
-  }
-
-  return alloc_record.allocation_group == group_filter_;
-}
-
-bool AllocationSizeBinner::Visit(const void* memory,
-                                 const AllocationRecord& alloc_record) {
-  if (PassesFilter(alloc_record)) {
-    const size_t idx = GetBucketIndexForAllocationSize(alloc_record.size);
-    allocation_histogram_[idx]++;
-  }
-  return true;
-}
-
-std::string AllocationSizeBinner::ToCSVString() const {
-  size_t first_idx = 0;
-  size_t end_idx = allocation_histogram_.size();
-
-  // Determine the start index by skipping all consecutive head entries
-  // that are 0.
-  while (first_idx < allocation_histogram_.size()) {
-    const size_t num_allocs = allocation_histogram_[first_idx];
-    if (num_allocs > 0) {
-      break;
-    }
-    first_idx++;
-  }
-
-  // Determine the end index by skipping all consecutive tail entries
-  // that are 0.
-  while (end_idx > 0) {
-    if (end_idx < allocation_histogram_.size()) {
-      const size_t num_allocs = allocation_histogram_[end_idx];
-      if (num_allocs > 0) {
-        ++end_idx;
-        break;
-      }
-    }
-    end_idx--;
-  }
-
-  std::stringstream ss;
-  for (size_t i = first_idx; i < end_idx; ++i) {
-    size_t min = 0;
-    size_t max = 0;
-    IndexToSizeRange(i, &min, &max);
-    std::stringstream name_ss;
-    name_ss << kQuote << min << "..." << max << kQuote;
-    ss << name_ss.str() << kDelimiter;
-  }
-  ss << kNewLine;
-
-  for (size_t i = first_idx; i < end_idx; ++i) {
-    const size_t num_allocs = allocation_histogram_[i];
-    ss << num_allocs << kDelimiter;
-  }
-  ss << kNewLine;
-  return ss.str();
-}
-
-FindTopSizes::FindTopSizes(size_t minimum_size, size_t maximum_size,
-                           const AllocationGroup* group)
-    : minimum_size_(minimum_size),
-      maximum_size_(maximum_size),
-      group_filter_(group) {}
-
-bool FindTopSizes::Visit(const void* memory,
-                         const AllocationRecord& alloc_record) {
-  if (PassesFilter(alloc_record)) {
-    size_counter_[alloc_record.size]++;
-  }
-  return true;
-}
-
-std::string FindTopSizes::ToString(size_t max_elements_to_print) const {
-  std::vector<GroupAllocation> group_allocs = GetTopAllocations();
-  const size_t n = std::min(max_elements_to_print, group_allocs.size());
-
-  if (!group_allocs.empty()) {
-    std::stringstream ss;
-
-    for (size_t i = 0; i < n; ++i) {
-      GroupAllocation g = group_allocs[i];
-      size_t total_size = g.allocation_count * g.allocation_size;
-      ss << "    " << total_size
-         << " bytes allocated with object size: " << g.allocation_size
-         << " bytes in " << g.allocation_count << " instances " << kNewLine;
-    }
-    return ss.str();
-  } else {
-    return std::string();
-  }
-}
-
-std::vector<FindTopSizes::GroupAllocation> FindTopSizes::GetTopAllocations()
-    const {
-  std::vector<GroupAllocation> group_allocs;
-  // Push objects to a vector.
-  for (SizeCounterMap::const_iterator it = size_counter_.begin();
-       it != size_counter_.end(); ++it) {
-    GroupAllocation alloc = {it->first, it->second};
-    group_allocs.push_back(alloc);
-  }
-
-  std::sort(group_allocs.begin(), group_allocs.end(),
-            GroupAllocation::LessAllocationSize);
-  // Biggest first.
-  std::reverse(group_allocs.begin(), group_allocs.end());
-  return group_allocs;
-}
-
-bool FindTopSizes::PassesFilter(const AllocationRecord& alloc_record) const {
-  if (alloc_record.size < minimum_size_) return false;
-  if (alloc_record.size > maximum_size_) return false;
-  if (!group_filter_) return true;  // No group filter when null.
-  return group_filter_ == alloc_record.allocation_group;
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/tool_impl.h b/cobalt/browser/memory_tracker/tool/tool_impl.h
deleted file mode 100644
index 8551002..0000000
--- a/cobalt/browser/memory_tracker/tool/tool_impl.h
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_TOOL_IMPL_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_TOOL_IMPL_H_
-
-#include <deque>
-#include <map>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/debug/stack_trace.h"
-#include "base/memory/ref_counted.h"
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "cobalt/browser/memory_tracker/tool/buffered_file_writer.h"
-#include "cobalt/browser/memory_tracker/tool/util.h"
-#include "nb/analytics/memory_tracker.h"
-#include "nb/analytics/memory_tracker_helpers.h"
-#include "nb/concurrent_map.h"
-#include "nb/string_interner.h"
-#include "nb/thread_local_object.h"
-#include "starboard/memory_reporter.h"
-
-namespace starboard {
-class ScopedFile;
-}  // namespace starboard
-
-namespace nb {
-namespace analytics {
-class AllocationGroup;
-class AllocationRecord;
-class MemoryTracker;
-}  // namespace analytics
-}  // namespace nb
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-// Interface for logging. This allows dependency inject to override in the case
-// of future tests.
-class AbstractLogger {
- public:
-  virtual ~AbstractLogger() {}
-  virtual void Output(const char* str) = 0;
-  void Output(const std::string& str) { Output(str.c_str()); }
-  virtual void Flush() = 0;
-};
-
-// Params holds important data needed by the MemoryTracker tools during
-// their run cycle.
-class Params;
-
-// Base class for all tools.
-class AbstractTool {
- public:
-  virtual ~AbstractTool() {}
-  virtual std::string tool_name() const = 0;
-  virtual void Run(Params* params) = 0;
-};
-
-// Bins the size according from all the encountered allocations.
-// If AllocationGroup* is non-null, then this is used as a filter such that
-// ONLY allocations belonging to that AllocationGroup are considered.
-class AllocationSizeBinner : public nb::analytics::AllocationVisitor {
- public:
-  typedef std::vector<int> AllocationHistogram;
-  // Maps the input size to a bin number. This function performs a 2^n
-  // mapping. Here is a table of some size mappings:
-  // Example:
-  //   GetIndex(0) == 0;
-  //   GetIndex(1) == 1;
-  //   GetIndex(2) == 2;
-  //   GetIndex(3) == 2;
-  //   GetIndex(4) == 3;
-  //   ...
-  //   GetIndex(15) == 4;
-  //   GetIndex(16) == 5;
-  static size_t GetBucketIndexForAllocationSize(size_t size);
-  static void GetSizeRange(size_t size, size_t* min_value, size_t* max_value);
-  static void IndexToSizeRange(size_t size, size_t* min_value,
-                               size_t* max_value);
-
-  explicit AllocationSizeBinner(
-      const nb::analytics::AllocationGroup* group_filter);
-  bool Visit(const void* memory,
-             const nb::analytics::AllocationRecord& alloc_record) override;
-
-  size_t GetIndexRepresentingMostMemoryConsumption() const;
-  void GetLargestSizeRange(size_t* min_value, size_t* max_value) const;
-  bool PassesFilter(const nb::analytics::AllocationRecord& alloc_record) const;
-  // Outputs CSV formatted string of the data values.
-  // The header containing the binning range is printed first, then the
-  // the number of allocations in that bin.
-  // Example:
-  //   "16...32","32...64","64...128","128...256",...
-  //   831,3726,3432,10285,...
-  //
-  // In this example there are 831 allocations of size 16-32 bytes.
-  std::string ToCSVString() const;
-  const AllocationHistogram& allocation_histogram() const {
-    return allocation_histogram_;
-  }
-
- private:
-  AllocationHistogram allocation_histogram_;
-  // Only these allocations are tracked.
-  const nb::analytics::AllocationGroup* group_filter_;
-};
-
-// Finds the top allocations by size.
-class FindTopSizes : public nb::analytics::AllocationVisitor {
- public:
-  FindTopSizes(size_t minimum_size, size_t maximum_size,
-               const nb::analytics::AllocationGroup* group);
-
-  bool Visit(const void* memory,
-             const nb::analytics::AllocationRecord& alloc_record) override;
-
-  struct GroupAllocation {
-    size_t allocation_size;
-    size_t allocation_count;
-
-    static bool LessAllocationSize(GroupAllocation a, GroupAllocation b) {
-      size_t total_size_a = a.allocation_size * a.allocation_count;
-      size_t total_size_b = b.allocation_size * b.allocation_count;
-      return total_size_a < total_size_b;
-    }
-  };
-
-  std::string ToString(size_t max_elements_to_print) const;
-  std::vector<GroupAllocation> GetTopAllocations() const;
-
- private:
-  typedef std::map<size_t, size_t> SizeCounterMap;
-
-  bool PassesFilter(const nb::analytics::AllocationRecord& alloc_record) const;
-  size_t minimum_size_;
-  size_t maximum_size_;
-  const nb::analytics::AllocationGroup* group_filter_;
-  SizeCounterMap size_counter_;
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_TOOL_IMPL_H_
diff --git a/cobalt/browser/memory_tracker/tool/tool_impl_test.cc b/cobalt/browser/memory_tracker/tool/tool_impl_test.cc
deleted file mode 100644
index 96f44ee..0000000
--- a/cobalt/browser/memory_tracker/tool/tool_impl_test.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-#include "build/build_config.h"
-
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-using ::nb::analytics::AllocationGroup;
-using ::nb::analytics::AllocationRecord;
-using ::nb::analytics::AllocationVisitor;
-
-// Tests the expectation that AllocationSizeBinner will correctly bin
-// allocations.
-TEST(MemoryTrackerToolTest, AllocationSizeBinner) {
-  const size_t index =
-      AllocationSizeBinner::GetBucketIndexForAllocationSize(24);
-  EXPECT_EQ(5, static_cast<int>(index));
-
-  const size_t kAllocSize = 24;
-
-  AllocationSizeBinner binner(NULL);
-  void* dummy_memory = SbMemoryAllocate(kAllocSize);
-
-  AllocationRecord allocation_record(kAllocSize, NULL);
-  binner.Visit(dummy_memory, allocation_record);
-
-  size_t min_val = 0;
-  size_t max_val = 0;
-  AllocationSizeBinner::GetSizeRange(kAllocSize, &min_val, &max_val);
-  EXPECT_EQ(16, static_cast<int>(min_val));
-  EXPECT_EQ(31, static_cast<int>(max_val));
-
-  // 0 -> [0,0]
-  // 1 -> [1,1]
-  // 2 -> [2,3]
-  // 3 -> [4,7]
-  // 4 -> [8,15]
-  // 5 -> [16,31] ...
-  EXPECT_EQ(1, binner.allocation_histogram()[5]);
-
-  allocation_record.size = 15;
-  binner.Visit(NULL, allocation_record);
-  binner.Visit(NULL, allocation_record);
-
-  size_t min_value = 0;
-  size_t max_value = 0;
-  binner.GetLargestSizeRange(&min_value, &max_value);
-  EXPECT_EQ(min_value, static_cast<int>(8));
-  EXPECT_EQ(max_value, static_cast<int>(15));
-
-  std::string csv_string = binner.ToCSVString();
-
-  // Expect header.
-  bool found = (csv_string.find("\"8...15\",\"16...31\"") != std::string::npos);
-  EXPECT_TRUE(found);
-
-  // Expect data.
-  found = (csv_string.find("2,1") != std::string::npos);
-  SbMemoryDeallocate(dummy_memory);
-}
-
-// Tests the expectation that AllocationSizeBinner will correctly bin
-// allocations.
-TEST(MemoryTrackerToolTest, FindTopSizes) {
-  const size_t min_size = 21;
-  const size_t max_size = 23;
-  AllocationGroup* group = NULL;  // signals "accept any group".
-
-  FindTopSizes top_sizes_visitor(min_size, max_size, group);
-
-  AllocationRecord record_a(21, group);
-  AllocationRecord record_b(22, group);
-  AllocationRecord record_c(22, group);
-  AllocationRecord record_d(24, group);
-
-  const void* dummy_alloc = NULL;
-  top_sizes_visitor.Visit(dummy_alloc, record_a);
-  top_sizes_visitor.Visit(dummy_alloc, record_b);
-  top_sizes_visitor.Visit(dummy_alloc, record_c);
-  top_sizes_visitor.Visit(dummy_alloc, record_d);
-
-  std::vector<FindTopSizes::GroupAllocation> top_allocations =
-      top_sizes_visitor.GetTopAllocations();
-
-  // Expect element 24 to be filtered out, leaving only 22 and 24.
-  EXPECT_EQ(top_allocations.size(), 2);
-  // Expect that allocation size 22 is the top allocation.
-  EXPECT_EQ(top_allocations[0].allocation_size, 22);
-  EXPECT_EQ(top_allocations[0].allocation_count, 2);
-  // And then the 21 byte allocation.
-  EXPECT_EQ(top_allocations[1].allocation_size, 21);
-  EXPECT_EQ(top_allocations[1].allocation_count, 1);
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/tool_thread.cc b/cobalt/browser/memory_tracker/tool/tool_thread.cc
deleted file mode 100644
index 7f5858b..0000000
--- a/cobalt/browser/memory_tracker/tool/tool_thread.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/tool_thread.h"
-
-#include "base/time/time.h"
-#include "cobalt/browser/memory_tracker/tool/params.h"
-#include "cobalt/browser/memory_tracker/tool/tool_impl.h"
-#include "nb/analytics/memory_tracker.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-namespace {
-// NoMemoryTracking will disable memory tracking while in the current scope of
-// execution. When the object is destroyed it will reset the previous state
-// of allocation tracking.
-// Example:
-//   void Foo() {
-//     NoMemoryTracking no_memory_tracking_in_scope;
-//     int* ptr = new int();  // ptr is not tracked.
-//     delete ptr;
-//     return;    // Previous memory tracking state is restored.
-//   }
-class NoMemoryTracking {
- public:
-  explicit NoMemoryTracking(nb::analytics::MemoryTracker* owner)
-      : prev_val_(false), owner_(owner) {
-    if (owner_) {
-      prev_val_ = owner_->IsMemoryTrackingEnabled();
-      owner_->SetMemoryTrackingEnabled(false);
-    }
-  }
-  ~NoMemoryTracking() {
-    if (owner_) {
-      owner_->SetMemoryTrackingEnabled(prev_val_);
-    }
-  }
-
- private:
-  bool prev_val_;
-  nb::analytics::MemoryTracker* owner_;
-};
-
-}  // namespace.
-
-ToolThread::ToolThread(nb::analytics::MemoryTracker* memory_tracker,
-                       AbstractTool* tool, AbstractLogger* logger)
-    : Super(tool->tool_name()),
-      params_(
-          new Params(memory_tracker, logger, base::Time::NowFromSystemTime())),
-      tool_(tool) {
-  Start();
-}
-
-ToolThread::~ToolThread() {
-  nb::analytics::MemoryTracker* memory_tracker = params_->memory_tracker();
-  if (memory_tracker) {
-    memory_tracker->SetMemoryTrackerDebugCallback(nullptr);
-  }
-  Join();
-  tool_.reset();
-  params_.reset();
-}
-
-void ToolThread::Join() {
-  params_->set_finished(true);
-  Super::Join();
-}
-
-void ToolThread::Run() {
-  NoMemoryTracking no_mem_tracking_in_this_scope(params_->memory_tracker());
-  // This tool will run until the finished_ if flipped to false.
-  tool_->Run(params_.get());
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/tool_thread.h b/cobalt/browser/memory_tracker/tool/tool_thread.h
deleted file mode 100644
index 7f6108c..0000000
--- a/cobalt/browser/memory_tracker/tool/tool_thread.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_TOOL_THREAD_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_TOOL_THREAD_H_
-
-#include <memory>
-
-#include "base/compiler_specific.h"
-#include "base/threading/simple_thread.h"
-
-namespace nb {
-namespace analytics {
-class MemoryTracker;
-}  // namespace analytics
-}  // namespace nb
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-class AbstractLogger;
-class AbstractTool;
-class Params;
-
-// ToolThread sets up the the thread environment to run an AbstractTool.
-class ToolThread : public base::SimpleThread {
- public:
-  typedef base::SimpleThread Super;
-  ToolThread(nb::analytics::MemoryTracker* memory_tracker, AbstractTool* tool,
-             AbstractLogger* logger);
-  virtual ~ToolThread();
-
-  void Join();
-  void Run();
-
- private:
-  std::unique_ptr<Params> params_;
-  std::unique_ptr<AbstractTool> tool_;
-};
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_TOOL_THREAD_H_
diff --git a/cobalt/browser/memory_tracker/tool/util.cc b/cobalt/browser/memory_tracker/tool/util.cc
deleted file mode 100644
index e865670..0000000
--- a/cobalt/browser/memory_tracker/tool/util.cc
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/util.h"
-
-#include <algorithm>
-#include <iterator>
-#include <string>
-#include <vector>
-
-#include "base/time/time.h"
-#include "nb/bit_cast.h"
-#include "starboard/common/string.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-const char kQuote[] = "\"";
-const char kDelimiter[] = ",";
-const char kNewLine[] = "\n";
-
-std::string RemoveString(const std::string& haystack, const char* needle) {
-  const size_t kNotFound = std::string::npos;
-
-  // Base case. No modification needed.
-  size_t pos = haystack.find(needle);
-  if (pos == kNotFound) {
-    return haystack;
-  }
-  const size_t n = strlen(needle);
-  std::string output;
-  output.reserve(haystack.size());
-
-  // Copy string, omitting the portion containing the "needle".
-  std::copy(haystack.begin(), haystack.begin() + pos,
-            std::back_inserter(output));
-  std::copy(haystack.begin() + pos + n, haystack.end(),
-            std::back_inserter(output));
-
-  // Recursively remove same needle in haystack.
-  return RemoveString(output, needle);
-}
-
-std::string SanitizeCSVKey(std::string key) {
-  key = RemoveString(key, kQuote);
-  key = RemoveString(key, kDelimiter);
-  key = RemoveString(key, kNewLine);
-  return key;
-}
-
-std::string InsertCommasIntoNumberString(const std::string& input) {
-  typedef std::vector<char> CharVector;
-  typedef CharVector::iterator CharIt;
-
-  CharVector chars(input.begin(), input.end());
-  std::reverse(chars.begin(), chars.end());
-
-  CharIt curr_it = chars.begin();
-  CharIt mid = std::find(chars.begin(), chars.end(), '.');
-  if (mid == chars.end()) {
-    mid = curr_it;
-  }
-
-  CharVector out(curr_it, mid);
-
-  int counter = 0;
-  for (CharIt it = mid; it != chars.end(); ++it) {
-    if (counter != 0 && (counter % 3 == 0)) {
-      out.push_back(',');
-    }
-    if (*it != '.') {
-      counter++;
-    }
-    out.push_back(*it);
-  }
-
-  std::reverse(out.begin(), out.end());
-  std::stringstream ss;
-  for (size_t i = 0; i < out.size(); ++i) {
-    ss << out[i];
-  }
-  return ss.str();
-}
-
-Timer::Timer(base::TimeDelta delta_time) {
-  start_time_ = Now();
-  time_before_expiration_ = delta_time;
-}
-
-Timer::Timer(base::TimeDelta delta_time, Timer::TimeFunctor time_functor) {
-  time_function_override_ = time_functor;
-  start_time_ = Now();
-  time_before_expiration_ = delta_time;
-}
-
-void Timer::Restart() { start_time_ = Now(); }
-
-bool Timer::UpdateAndIsExpired() {
-  base::TimeTicks now_time = Now();
-  base::TimeDelta delta_time = now_time - start_time_;
-  if (delta_time >= time_before_expiration_) {
-    start_time_ = now_time;
-    return true;
-  } else {
-    return false;
-  }
-}
-
-base::TimeTicks Timer::Now() {
-  if (time_function_override_.is_null()) {
-    return base::TimeTicks::Now();
-  } else {
-    return time_function_override_.Run();
-  }
-}
-
-void Timer::ScaleTriggerTime(double scale) {
-  int64_t old_dt = time_before_expiration_.InMicroseconds();
-  int64_t new_dt = static_cast<int64_t>(static_cast<double>(old_dt) * scale);
-  time_before_expiration_ = base::TimeDelta::FromMicroseconds(new_dt);
-}
-
-Segment::Segment(const std::string* name, const char* start_address,
-                 const char* end_address)
-    : name_(name), begin_(start_address), end_(end_address) {}
-
-void Segment::SplitAcrossPageBoundaries(size_t page_size,
-                                        std::vector<Segment>* segments) const {
-  if (size() == 0) {
-    segments->push_back(*this);
-    return;
-  }
-
-  uintptr_t page_start = nb::bit_cast<uintptr_t>(begin_) / page_size;
-  uintptr_t page_end = nb::bit_cast<uintptr_t>(end_ - 1) / page_size;
-
-  if (page_start == page_end) {
-    segments->push_back(*this);
-    return;
-  }
-
-  for (uintptr_t p = page_start; p <= page_end; ++p) {
-    uintptr_t start_addr;
-    if (p == page_start) {
-      start_addr = nb::bit_cast<uintptr_t>(begin_);
-    } else {
-      start_addr = p * page_size;
-    }
-
-    uintptr_t end_addr;
-    if (p == page_end) {
-      end_addr = nb::bit_cast<uintptr_t>(end_);
-    } else {
-      end_addr = (p + 1) * page_size;
-    }
-
-    const char* start = nb::bit_cast<const char*>(start_addr);
-    const char* end = nb::bit_cast<const char*>(end_addr);
-    segments->push_back(Segment(name_, start, end));
-  }
-}
-
-bool Segment::Intersects(const Segment& other) const {
-  size_t total_span = std::distance(std::min(begin_, other.begin()),
-                                    std::max(end_, other.end()));
-
-  bool intersects = (size() + other.size()) > total_span;
-  return intersects;
-}
-
-bool Segment::operator<(const Segment& other) const {
-  return begin_ < other.begin();
-}
-
-bool Segment::operator==(const Segment& other) const {
-  if (begin_ == other.begin() && end_ == other.end()) {
-    DCHECK(name_ == other.name_);
-    return true;
-  }
-  return false;
-}
-
-size_t Segment::size() const { return std::distance(begin_, end_); }
-
-const char* BaseNameFast(const char* file_name) {
-  // Case: Linux.
-  const char* end_pos = file_name + strlen(file_name);
-  const char* last_forward_slash = strrchr(file_name, '/');
-  if (last_forward_slash) {
-    if (end_pos != last_forward_slash) {
-      ++last_forward_slash;
-    }
-    return last_forward_slash;
-  }
-
-  // Case: Windows.
-  const char* last_backward_slash = strrchr(file_name, '\\');
-  if (last_backward_slash) {
-    if (end_pos != last_backward_slash) {
-      ++last_backward_slash;
-    }
-    return last_backward_slash;
-  }
-  return file_name;
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/memory_tracker/tool/util.h b/cobalt/browser/memory_tracker/tool/util.h
deleted file mode 100644
index a6ef651..0000000
--- a/cobalt/browser/memory_tracker/tool/util.h
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_UTIL_H_
-#define COBALT_BROWSER_MEMORY_TRACKER_TOOL_UTIL_H_
-
-#include <map>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/time/time.h"
-#include "starboard/common/string.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-
-// Used for CSV generation.
-extern const char kQuote[];
-extern const char kDelimiter[];
-extern const char kNewLine[];
-
-// This is a simple algorithm to remove the "needle" from the haystack. Note
-// that this function is simple and not well optimized.
-std::string RemoveString(const std::string& haystack, const char* needle);
-
-// Not optimized but works ok for a tool that dumps out in user time.
-std::string SanitizeCSVKey(std::string key);
-
-// Converts "2345.54" => "2,345.54".
-std::string InsertCommasIntoNumberString(const std::string& input);
-
-template <typename T>
-std::string NumberFormatWithCommas(T val) {
-  // Convert value to string.
-  std::stringstream ss;
-  ss << val;
-  std::string s = InsertCommasIntoNumberString(ss.str());
-  return s;
-}
-
-// Removes odd elements and resizes vector.
-template <typename VectorType>
-void RemoveOddElements(VectorType* v) {
-  typedef typename VectorType::iterator iterator;
-
-  iterator read_it = v->end();
-  iterator write_it = v->end();
-  for (size_t i = 0; i * 2 < v->size(); ++i) {
-    write_it = v->begin() + i;
-    read_it = v->begin() + (i * 2);
-    *write_it = *read_it;
-  }
-  if (write_it != v->end()) {
-    write_it++;
-  }
-  v->erase(write_it, v->end());
-}
-
-// Simple timer class that fires periodically after time has elapsed.
-class Timer {
- public:
-  typedef base::Callback<base::TimeTicks(void)> TimeFunctor;
-
-  explicit Timer(base::TimeDelta delta_time);
-  Timer(base::TimeDelta delta_time, TimeFunctor f);
-
-  void Restart();
-  bool UpdateAndIsExpired();  // Returns true if the expiration was triggered.
-  void ScaleTriggerTime(double scale);
-
- private:
-  base::TimeTicks Now();
-  base::TimeTicks start_time_;
-  base::TimeDelta time_before_expiration_;
-  TimeFunctor time_function_override_;
-};
-
-struct AllocationSamples {
-  std::vector<int32_t> number_allocations_;
-  std::vector<int64_t> allocated_bytes_;
-};
-typedef std::map<std::string, AllocationSamples> MapAllocationSamples;
-typedef std::vector<base::TimeDelta> TimeStamps;
-
-struct TimeSeries {
-  MapAllocationSamples samples_;
-  TimeStamps time_stamps_;
-};
-
-// Generates a linear fit in the form of slope / y-intercept form.
-// Returns true if linear fit was calculated. False otherwise. Reasons for
-// returning false include passing in an empty range, such that
-// begin_it == end_it, or all x-values being the same.
-//
-// Algorithm adapted from:
-// https://en.wikipedia.org/wiki/Simple_linear_regression#Fitting_the_regression_line
-// Example:
-//    std::vector<std::pair<int, int> > data;
-//    for (int i = 0; i < 10; ++i) {
-//      data.push_back(std::pair<int, int>(i+1, 2*i));
-//    }
-//    double slope = 0;
-//    double y_intercept = 0;
-//    GetLinearFit(data.begin(), data.end(), &slope, &y_intercept);
-//    std::cout << "slope: " << slope << "\n";
-//    std::cout << "y_intercept: " << y_intercept<< "\n";
-template <typename PairIterator>
-bool GetLinearFit(PairIterator begin_it, PairIterator end_it, double* out_slope,
-                  double* out_yintercept) {
-  if (begin_it == end_it) {
-    return false;
-  }
-
-  size_t n = 0;
-  double x_avg = 0;
-  double y_avg = 0;
-
-  for (PairIterator it = begin_it; it != end_it; ++it) {
-    x_avg += it->first;
-    y_avg += it->second;
-    n++;
-  }
-
-  x_avg /= n;
-  y_avg /= n;
-
-  double numerator = 0;
-  double denominator = 0;
-
-  for (PairIterator it = begin_it; it != end_it; ++it) {
-    double x_variance = it->first - x_avg;
-    double y_variance = it->second - y_avg;
-    numerator += (x_variance * y_variance);
-    denominator += (x_variance * x_variance);
-  }
-
-  if (denominator == 0.0) {
-    return false;  // Failed to generate any value.
-  }
-
-  double slope = numerator / denominator;
-  double yintercept = y_avg - slope * x_avg;
-
-  *out_slope = slope;
-  *out_yintercept = yintercept;
-  return true;
-}
-
-// Segment represents a named memory segment of allocated memory.
-// The name is optional and can be null.
-class Segment {
- public:
-  // Equal name string values must have equal pointers.
-  Segment(const std::string* name, const char* start_address,
-          const char* end_address);
-
-  // Using the page_size, split this Segment into one Segment
-  // per page. Each of the sub_segments will copy the name
-  // pointer from this.
-  void SplitAcrossPageBoundaries(size_t page_size,
-                                 std::vector<Segment>* sub_segments) const;
-
-  bool Intersects(const Segment& other) const;
-
-  bool operator<(const Segment& other) const;
-  bool operator==(const Segment& other) const;
-
-  size_t size() const;
-  const std::string* name() const { return name_; }
-
-  const char* begin() const { return begin_; }
-  const char* end() const { return end_; }
-
- private:
-  const std::string* name_;
-  const char* begin_;
-  const char* end_;
-};
-
-// Returns a substring with the directory path removed from the filename.
-// Example:
-//   F::BaseNameFast("directory/filename.cc") => "filename.cc"
-//   F::BaseNameFast("directory\filename.cc") => "filename.cc"
-//
-// Note that base::FilePath::BaseName() isn't used because of performance
-// reasons.
-const char* BaseNameFast(const char* file_name);
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // COBALT_BROWSER_MEMORY_TRACKER_TOOL_UTIL_H_
diff --git a/cobalt/browser/memory_tracker/tool/util_test.cc b/cobalt/browser/memory_tracker/tool/util_test.cc
deleted file mode 100644
index b49d0ad..0000000
--- a/cobalt/browser/memory_tracker/tool/util_test.cc
+++ /dev/null
@@ -1,229 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/memory_tracker/tool/util.h"
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "nb/bit_cast.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace browser {
-namespace memory_tracker {
-namespace {
-
-const char* ToAddress(uintptr_t val) { return nb::bit_cast<const char*>(val); }
-
-// 4k page size.
-static const uintptr_t kPageSize = 4096;
-
-class FakeTimeSource {
- public:
-  explicit FakeTimeSource(base::TimeTicks value) : static_time_(value) {}
-  void set_static_time(base::TimeTicks value) { static_time_ = value; }
-  base::TimeTicks GetTime() { return static_time_; }
-
- private:
-  base::TimeTicks static_time_;
-};
-
-}  // namespace.
-
-// Tests the expectation that AllocationSizeBinner will correctly bin
-// allocations.
-TEST(UtilTest, RemoveString) {
-  std::string value = "abba";
-  value = RemoveString(value, "bb");
-  EXPECT_STREQ("aa", value.c_str());
-}
-
-// Tests the expectation that AllocationSizeBinner will correctly bin
-// allocations.
-TEST(UtilTest, InsertCommasIntoNumberString) {
-  std::string value = "2345.54";
-  std::string value_with_commas = InsertCommasIntoNumberString(value);
-
-  EXPECT_STREQ("2,345.54", value_with_commas.c_str());
-}
-
-TEST(UtilTest, NumberFormatWithCommas) {
-  int value = 1000;
-  std::string value_with_commas = NumberFormatWithCommas<int>(value);
-
-  EXPECT_STREQ("1,000", value_with_commas.c_str());
-}
-
-// Tests the expectation that RemoveOddElements() removes the odd elements of
-// a vector and resizes it.
-TEST(UtilTest, RemoveOddElements) {
-  std::vector<int> values;
-
-  // EVEN TEST.
-  values.push_back(0);
-  values.push_back(1);
-  values.push_back(2);
-  values.push_back(3);
-
-  RemoveOddElements(&values);
-
-  ASSERT_EQ(2, values.size());
-  EXPECT_EQ(0, values[0]);
-  EXPECT_EQ(2, values[1]);
-
-  values.clear();
-
-  // ODD TEST
-  values.push_back(0);
-  values.push_back(1);
-  values.push_back(2);
-  values.push_back(3);
-  values.push_back(4);
-  RemoveOddElements(&values);
-
-  ASSERT_EQ(3, values.size());
-  EXPECT_EQ(0, values[0]);
-  EXPECT_EQ(2, values[1]);
-  EXPECT_EQ(4, values[2]);
-}
-
-// Tests the expectation that GetLinearFit() generates the expected linear
-// regression values.
-TEST(UtilTest, GetLinearFit) {
-  std::vector<std::pair<int, int> > data;
-  for (int i = 0; i < 10; ++i) {
-    data.push_back(std::pair<int, int>(i + 1, 2 * i));
-  }
-  double slope = 0;
-  double y_intercept = 0;
-  GetLinearFit(data.begin(), data.end(), &slope, &y_intercept);
-
-  EXPECT_DOUBLE_EQ(2.0f, slope);
-  EXPECT_DOUBLE_EQ(-2.0f, y_intercept);
-}
-
-// Test the expectation that BaseNameFast() works correctly for both windows
-// and linux path types.
-TEST(UtilTest, BaseNameFast) {
-  const char* linux_path = "directory/filename.cc";
-  const char* win_path = "directory\\filename.cc";
-
-  EXPECT_STREQ("filename.cc", BaseNameFast(linux_path));
-  EXPECT_STREQ("filename.cc", BaseNameFast(win_path));
-}
-
-TEST(UtilTest, TimerUse) {
-  base::TimeTicks initial_time = base::TimeTicks::Now();
-  FakeTimeSource time_source(initial_time);
-
-  Timer::TimeFunctor time_functor =
-      base::Bind(&FakeTimeSource::GetTime, base::Unretained(&time_source));
-
-  Timer test_timer(base::TimeDelta::FromSeconds(30), time_functor);
-  EXPECT_FALSE(test_timer.UpdateAndIsExpired());  // 0 time has elapsed.
-
-  time_source.set_static_time(initial_time + base::TimeDelta::FromSeconds(29));
-  // 29 seconds has elapsed, which is less than the 30 seconds required for
-  // the timer to fire.
-  EXPECT_FALSE(test_timer.UpdateAndIsExpired());
-  time_source.set_static_time(initial_time + base::TimeDelta::FromSeconds(30));
-  // 31 seconds has elapsed, which means that the next call to
-  // UpdateAndIsExpired() should succeed.
-  EXPECT_TRUE(test_timer.UpdateAndIsExpired());
-  // Now that the value fired, expect that it won't fire again (until the next
-  // 30 seconds has passed).
-  EXPECT_FALSE(test_timer.UpdateAndIsExpired());
-  time_source.set_static_time(initial_time + base::TimeDelta::FromSeconds(60));
-  EXPECT_TRUE(test_timer.UpdateAndIsExpired());
-  EXPECT_FALSE(test_timer.UpdateAndIsExpired());
-}
-
-TEST(Segment, SplitAcrossPageBoundaries_Simple) {
-  std::string name("AllocName");
-  const char* start_addr = ToAddress(0);
-  const char* end_addr = ToAddress(1);
-
-  Segment memory_segment(&name, start_addr, end_addr);
-
-  std::vector<Segment> segments;
-  memory_segment.SplitAcrossPageBoundaries(kPageSize, &segments);
-  ASSERT_EQ(1, segments.size());
-
-  ASSERT_EQ(memory_segment, segments[0]);
-}
-
-TEST(Segment, SplitAcrossPageBoundaries_WholePage) {
-  std::string name("AllocName");
-  const char* start_addr = ToAddress(0);
-  const char* end_addr = ToAddress(kPageSize);
-
-  Segment memory_segment(&name, start_addr, end_addr);
-
-  std::vector<Segment> segments;
-  memory_segment.SplitAcrossPageBoundaries(kPageSize, &segments);
-  ASSERT_EQ(1, segments.size());
-
-  ASSERT_EQ(memory_segment, segments[0]);
-}
-
-TEST(Segment, SplitAcrossPageBoundaries_Across) {
-  std::string name("AllocName");
-  const char* start_addr = ToAddress(kPageSize / 2);
-  const char* mid_addr = ToAddress(kPageSize);
-  const char* end_addr = ToAddress(kPageSize + kPageSize / 2);
-
-  Segment memory_segment(&name, start_addr, end_addr);
-
-  std::vector<Segment> segments;
-  memory_segment.SplitAcrossPageBoundaries(kPageSize, &segments);
-
-  ASSERT_EQ(2, segments.size());
-
-  Segment s1(&name, start_addr, mid_addr);
-  Segment s2(&name, mid_addr, end_addr);
-
-  ASSERT_EQ(s1, segments[0]);
-  ASSERT_EQ(s2, segments[1]);
-}
-
-TEST(Segment, SplitAcrossPageBoundaries_Many) {
-  std::string name("AllocName");
-  const char* start_addr = ToAddress(kPageSize / 2);
-  const char* mid_0_addr = ToAddress(kPageSize);
-  const char* mid_1_addr = ToAddress(kPageSize * 2);
-  const char* end_addr = ToAddress(2 * kPageSize + kPageSize / 2);
-
-  Segment memory_segment(&name, start_addr, end_addr);
-
-  std::vector<Segment> segments;
-  memory_segment.SplitAcrossPageBoundaries(4096, &segments);
-  ASSERT_EQ(3, segments.size());
-
-  Segment s1(&name, start_addr, mid_0_addr);
-  Segment s2(&name, mid_0_addr, mid_1_addr);
-  Segment s3(&name, mid_1_addr, end_addr);
-
-  ASSERT_EQ(s1, segments[0]);
-  ASSERT_EQ(s2, segments[1]);
-  ASSERT_EQ(s3, segments[2]);
-}
-
-}  // namespace memory_tracker
-}  // namespace browser
-}  // namespace cobalt
diff --git a/cobalt/browser/metrics/cobalt_metrics_log_uploader.cc b/cobalt/browser/metrics/cobalt_metrics_log_uploader.cc
index 2076f6b..49f1c81 100644
--- a/cobalt/browser/metrics/cobalt_metrics_log_uploader.cc
+++ b/cobalt/browser/metrics/cobalt_metrics_log_uploader.cc
@@ -14,18 +14,32 @@
 
 #include "cobalt/browser/metrics/cobalt_metrics_log_uploader.h"
 
+#include "base/base64url.h"
 #include "base/logging.h"
 #include "cobalt/browser/metrics/cobalt_metrics_uploader_callback.h"
 #include "cobalt/h5vcc/h5vcc_metric_type.h"
 #include "components/metrics/log_decoder.h"
 #include "components/metrics/metrics_log_uploader.h"
 #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h"
+#include "third_party/metrics_proto/cobalt_uma_event.pb.h"
 #include "third_party/metrics_proto/reporting_info.pb.h"
 
 namespace cobalt {
 namespace browser {
 namespace metrics {
 
+// Helper method to create a trimmed down and sanitized version of the UMA
+// proto for Cobalt
+void PopulateCobaltUmaEvent(
+    const ::metrics::ChromeUserMetricsExtension& uma_proto,
+    const ::metrics::ReportingInfo reporting_info_proto,
+    CobaltUMAEvent& cobalt_proto) {
+  cobalt_proto.mutable_histogram_event()->CopyFrom(uma_proto.histogram_event());
+  cobalt_proto.mutable_user_action_event()->CopyFrom(
+      uma_proto.user_action_event());
+  cobalt_proto.mutable_reporting_info()->CopyFrom(reporting_info_proto);
+}
+
 CobaltMetricsLogUploader::CobaltMetricsLogUploader(
     ::metrics::MetricsLogUploader::MetricServiceType service_type,
     const ::metrics::MetricsLogUploader::UploadCallback& on_upload_complete)
@@ -35,12 +49,26 @@
     const std::string& compressed_log_data, const std::string& log_hash,
     const ::metrics::ReportingInfo& reporting_info) {
   if (service_type_ == ::metrics::MetricsLogUploader::UMA) {
-    std::string uncompressed_serialized_proto;
-    ::metrics::DecodeLogData(compressed_log_data,
-                             &uncompressed_serialized_proto);
     if (upload_handler_ != nullptr) {
-      upload_handler_->Run(h5vcc::H5vccMetricType::kH5vccMetricTypeUma,
-                           uncompressed_serialized_proto);
+      std::string uncompressed_serialized_proto;
+      ::metrics::DecodeLogData(compressed_log_data,
+                               &uncompressed_serialized_proto);
+
+      ::metrics::ChromeUserMetricsExtension uma_event;
+      uma_event.ParseFromString(uncompressed_serialized_proto);
+      CobaltUMAEvent cobalt_uma_event;
+      PopulateCobaltUmaEvent(uma_event, reporting_info, cobalt_uma_event);
+      LOG(INFO) << "Publishing Cobalt metrics upload event. Type: "
+                << h5vcc::H5vccMetricType::kH5vccMetricTypeCobaltUma;
+      std::string base64_encoded_proto;
+      // Base64 encode the payload as web client's can't consume it without
+      // corrupting the data (see b/293431381). Also, use a URL/web safe
+      // encoding so it can be safely included in any web network request.
+      base::Base64UrlEncode(cobalt_uma_event.SerializeAsString(),
+                            base::Base64UrlEncodePolicy::INCLUDE_PADDING,
+                            &base64_encoded_proto);
+      upload_handler_->Run(h5vcc::H5vccMetricType::kH5vccMetricTypeCobaltUma,
+                           base64_encoded_proto);
     }
   }
 
diff --git a/cobalt/browser/metrics/cobalt_metrics_log_uploader_test.cc b/cobalt/browser/metrics/cobalt_metrics_log_uploader_test.cc
index 21f2770..78e7d18 100644
--- a/cobalt/browser/metrics/cobalt_metrics_log_uploader_test.cc
+++ b/cobalt/browser/metrics/cobalt_metrics_log_uploader_test.cc
@@ -16,12 +16,14 @@
 
 #include <memory>
 
+#include "base/base64url.h"
 #include "base/test/mock_callback.h"
 #include "cobalt/browser/metrics/cobalt_metrics_uploader_callback.h"
 #include "cobalt/h5vcc/h5vcc_metrics.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h"
+#include "third_party/metrics_proto/cobalt_uma_event.pb.h"
 #include "third_party/metrics_proto/reporting_info.pb.h"
 #include "third_party/zlib/google/compression_utils.h"
 
@@ -64,14 +66,30 @@
   const auto cb = mock_upload_handler.Get();
   uploader_->SetOnUploadHandler(&cb);
   ::metrics::ReportingInfo dummy_reporting_info;
+  dummy_reporting_info.set_attempt_count(33);
   ::metrics::ChromeUserMetricsExtension uma_log;
   uma_log.set_session_id(1234);
   uma_log.set_client_id(1234);
+  auto histogram_event = uma_log.add_histogram_event();
+  histogram_event->set_name_hash(1234);
+  auto user_event = uma_log.add_user_action_event();
+  user_event->set_name_hash(42);
+
+  CobaltUMAEvent cobalt_event;
+  cobalt_event.mutable_histogram_event()->CopyFrom(uma_log.histogram_event());
+  cobalt_event.mutable_user_action_event()->CopyFrom(
+      uma_log.user_action_event());
+  cobalt_event.mutable_reporting_info()->CopyFrom(dummy_reporting_info);
+
   std::string compressed_message;
   compression::GzipCompress(uma_log.SerializeAsString(), &compressed_message);
+  std::string base64_encoded_proto;
+  base::Base64UrlEncode(cobalt_event.SerializeAsString(),
+                        base::Base64UrlEncodePolicy::INCLUDE_PADDING,
+                        &base64_encoded_proto);
   EXPECT_CALL(mock_upload_handler,
-              Run(Eq(h5vcc::H5vccMetricType::kH5vccMetricTypeUma),
-                  StrEq(uma_log.SerializeAsString())))
+              Run(Eq(h5vcc::H5vccMetricType::kH5vccMetricTypeCobaltUma),
+                  StrEq(base64_encoded_proto)))
       .Times(1);
   uploader_->UploadLog(compressed_message, "fake_hash", dummy_reporting_info);
   ASSERT_EQ(callback_count_, 1);
@@ -79,11 +97,20 @@
   ::metrics::ChromeUserMetricsExtension uma_log2;
   uma_log2.set_session_id(456);
   uma_log2.set_client_id(567);
+  CobaltUMAEvent cobalt_event2;
+  cobalt_event2.mutable_histogram_event()->CopyFrom(uma_log2.histogram_event());
+  cobalt_event2.mutable_user_action_event()->CopyFrom(
+      uma_log2.user_action_event());
+  cobalt_event2.mutable_reporting_info()->CopyFrom(dummy_reporting_info);
   std::string compressed_message2;
   compression::GzipCompress(uma_log2.SerializeAsString(), &compressed_message2);
+  std::string base64_encoded_proto2;
+  base::Base64UrlEncode(cobalt_event2.SerializeAsString(),
+                        base::Base64UrlEncodePolicy::INCLUDE_PADDING,
+                        &base64_encoded_proto2);
   EXPECT_CALL(mock_upload_handler,
-              Run(Eq(h5vcc::H5vccMetricType::kH5vccMetricTypeUma),
-                  StrEq(uma_log2.SerializeAsString())))
+              Run(Eq(h5vcc::H5vccMetricType::kH5vccMetricTypeCobaltUma),
+                  StrEq(base64_encoded_proto2)))
       .Times(1);
   uploader_->UploadLog(compressed_message2, "fake_hash", dummy_reporting_info);
   ASSERT_EQ(callback_count_, 2);
diff --git a/cobalt/browser/metrics/cobalt_metrics_services_manager.cc b/cobalt/browser/metrics/cobalt_metrics_services_manager.cc
index 3874d08..acb5d8b 100644
--- a/cobalt/browser/metrics/cobalt_metrics_services_manager.cc
+++ b/cobalt/browser/metrics/cobalt_metrics_services_manager.cc
@@ -16,6 +16,7 @@
 
 #include <memory>
 
+#include "base/logging.h"
 #include "cobalt/browser/metrics/cobalt_metrics_service_client.h"
 #include "cobalt/browser/metrics/cobalt_metrics_services_manager_client.h"
 #include "components/metrics_services_manager/metrics_services_manager.h"
@@ -56,6 +57,7 @@
       static_cast<CobaltMetricsServiceClient*>(GetMetricsServiceClient());
   DCHECK(client);
   client->SetOnUploadHandler(uploader_callback);
+  LOG(INFO) << "New Cobalt Telemetry metric upload handler bound.";
 }
 
 void CobaltMetricsServicesManager::ToggleMetricsEnabled(bool is_enabled) {
@@ -73,6 +75,7 @@
   client->GetEnabledStateProvider()->SetConsentGiven(is_enabled);
   client->GetEnabledStateProvider()->SetReportingEnabled(is_enabled);
   UpdateUploadPermissions(is_enabled);
+  LOG(INFO) << "Cobalt Telemetry enabled state toggled to: " << is_enabled;
 }
 
 void CobaltMetricsServicesManager::SetUploadInterval(
@@ -90,6 +93,8 @@
           GetMetricsServiceClient());
   DCHECK(client);
   client->SetUploadInterval(interval_seconds);
+  LOG(INFO) << "Cobalt Telemetry metric upload interval changed to: "
+            << interval_seconds;
 }
 
 
diff --git a/cobalt/browser/metrics/cobalt_metrics_services_manager_client.cc b/cobalt/browser/metrics/cobalt_metrics_services_manager_client.cc
index 224490c..36002ca 100644
--- a/cobalt/browser/metrics/cobalt_metrics_services_manager_client.cc
+++ b/cobalt/browser/metrics/cobalt_metrics_services_manager_client.cc
@@ -17,12 +17,14 @@
 #include <memory>
 
 #include "base/callback_forward.h"
+#include "base/command_line.h"
 #include "base/metrics/field_trial.h"
 #include "cobalt/browser/metrics/cobalt_metrics_service_client.h"
 #include "components/metrics/client_info.h"
 #include "components/metrics/metrics_service.h"
 #include "components/metrics/metrics_service_client.h"
 #include "components/metrics/metrics_state_manager.h"
+#include "components/metrics/metrics_switches.h"
 #include "components/metrics_services_manager/metrics_services_manager_client.h"
 #include "components/prefs/in_memory_pref_store.h"
 #include "components/prefs/pref_registry_simple.h"
@@ -57,13 +59,14 @@
   return enabled_state_provider_->IsConsentGiven();
 }
 
-// If the user has forced metrics collection on via the override flag.
+// If the user has forced metrics collection on via the override flag. This
+// switch being set trumps/overrides any other mechanism to enable telemetry
+// (e.g., through the h5vcc_metrics API).
 bool CobaltMetricsServicesManagerClient::IsMetricsReportingForceEnabled() {
-  // TODO(b/286091096): Add support for metrics logging forcing.
-  return false;
+  return base::CommandLine::ForCurrentProcess()->HasSwitch(
+      ::metrics::switches::kForceEnableMetricsReporting);
 }
 
-
 void StoreMetricsClientInfo(const ::metrics::ClientInfo& client_info) {
   // ClientInfo is a way to get data into the metrics component, but goes unused
   // in Cobalt. Do nothing with it for now.
diff --git a/cobalt/browser/metrics/cobalt_metrics_services_manager_client_test.cc b/cobalt/browser/metrics/cobalt_metrics_services_manager_client_test.cc
index c6bf848..fd1fcd2 100644
--- a/cobalt/browser/metrics/cobalt_metrics_services_manager_client_test.cc
+++ b/cobalt/browser/metrics/cobalt_metrics_services_manager_client_test.cc
@@ -16,10 +16,12 @@
 
 #include <memory>
 
+#include "base/command_line.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/user_metrics.h"
 #include "base/test/test_simple_task_runner.h"
 #include "components/metrics/metrics_service_client.h"
+#include "components/metrics/metrics_switches.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
@@ -58,12 +60,19 @@
   EXPECT_FALSE(client_->IsMetricsReportingEnabled());
 }
 
-TEST_F(CobaltMetricsServicesManagerClientTest, ForceEnabledStateIsCorrect) {
-  // TODO(b/286091096): Add tests for force enabling on the command-line.
+TEST_F(CobaltMetricsServicesManagerClientTest,
+       ForceEnabledStateIsCorrectWithoutFlag) {
   EXPECT_FALSE(client_->IsMetricsReportingForceEnabled());
 }
 
 TEST_F(CobaltMetricsServicesManagerClientTest,
+       ForceEnabledStateIsCorrectWithFlag) {
+  base::CommandLine::ForCurrentProcess()->AppendSwitch(
+      ::metrics::switches::kForceEnableMetricsReporting);
+  EXPECT_TRUE(client_->IsMetricsReportingForceEnabled());
+}
+
+TEST_F(CobaltMetricsServicesManagerClientTest,
        MetricsServiceClientAndStateManagerAreConstructedProperly) {
   auto metrics_client = client_->CreateMetricsServiceClient();
   ASSERT_NE(metrics_client, nullptr);
diff --git a/cobalt/browser/on_screen_keyboard_starboard_bridge.cc b/cobalt/browser/on_screen_keyboard_starboard_bridge.cc
index ccd818e..f534caa 100644
--- a/cobalt/browser/on_screen_keyboard_starboard_bridge.cc
+++ b/cobalt/browser/on_screen_keyboard_starboard_bridge.cc
@@ -18,7 +18,6 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-
 #include "starboard/event.h"
 
 namespace cobalt {
@@ -50,7 +49,7 @@
 
 void OnScreenKeyboardStarboardBridge::UpdateSuggestions(
     const script::Sequence<std::string>& suggestions, int ticket) {
-  std::unique_ptr<const char* []> suggestions_data(
+  std::unique_ptr<const char*[]> suggestions_data(
       new const char*[suggestions.size()]);
   for (script::Sequence<std::string>::size_type i = 0; i < suggestions.size();
        ++i) {
diff --git a/cobalt/browser/screen_shot_writer.cc b/cobalt/browser/screen_shot_writer.cc
index 8b27ca4..5e639c3 100644
--- a/cobalt/browser/screen_shot_writer.cc
+++ b/cobalt/browser/screen_shot_writer.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/browser/screen_shot_writer.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/basictypes.h"
 #include "base/bind.h"
 #include "base/files/file_util.h"
diff --git a/cobalt/browser/service_worker_registry.cc b/cobalt/browser/service_worker_registry.cc
index f5dd468..bbfdf0f 100644
--- a/cobalt/browser/service_worker_registry.cc
+++ b/cobalt/browser/service_worker_registry.cc
@@ -22,6 +22,7 @@
 #include "base/threading/thread.h"
 #include "base/trace_event/trace_event.h"
 #include "cobalt/network/network_module.h"
+#include "cobalt/watchdog/watchdog.h"
 
 namespace cobalt {
 namespace browser {
@@ -29,6 +30,18 @@
 namespace {
 // Signals the given WaitableEvent.
 void SignalWaitableEvent(base::WaitableEvent* event) { event->Signal(); }
+
+// The watchdog client name used to represent service worker registry thread.
+const char kWatchdogName[] = "service worker registry";
+// The watchdog time interval in microseconds allowed between pings before
+// triggering violations.
+const int64_t kWatchdogTimeInterval = 15000000;
+// The watchdog time wait in microseconds to initially wait before triggering
+// violations.
+const int64_t kWatchdogTimeWait = 15000000;
+// The watchdog time interval in milliseconds between pings.
+const int64_t kWatchdogTimePing = 5000;
+
 }  // namespace
 
 void ServiceWorkerRegistry::WillDestroyCurrentMessageLoop() {
@@ -43,6 +56,21 @@
   if (!thread_.Start()) return;
   DCHECK(message_loop());
 
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+
+  // Registers service worker thread as a watchdog client.
+  if (watchdog) {
+    watchdog_registered_ = true;
+    watchdog->Register(kWatchdogName, kWatchdogName,
+                       base::kApplicationStateStarted, kWatchdogTimeInterval,
+                       kWatchdogTimeWait, watchdog::PING);
+    message_loop()->task_runner()->PostDelayedTask(
+        FROM_HERE,
+        base::Bind(&ServiceWorkerRegistry::PingWatchdog,
+                   base::Unretained(this)),
+        base::TimeDelta::FromMilliseconds(kWatchdogTimePing));
+  }
+
   message_loop()->task_runner()->PostTask(
       FROM_HERE,
       base::Bind(&ServiceWorkerRegistry::Initialize, base::Unretained(this),
@@ -69,6 +97,13 @@
   DCHECK(message_loop());
   DCHECK(thread_.IsRunning());
 
+  // Unregisters service worker thread as a watchdog client.
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+  if (watchdog) {
+    watchdog_registered_ = false;
+    watchdog->Unregister(kWatchdogName);
+  }
+
   // Ensure that the destruction observer got added before stopping the thread.
   // Stop the thread. This will cause the destruction observer to be notified.
   destruction_observer_added_.Wait();
@@ -77,6 +112,21 @@
   DCHECK(!service_worker_context_);
 }
 
+// Ping watchdog every 5 second, otherwise a violation will be triggered.
+void ServiceWorkerRegistry::PingWatchdog() {
+  DCHECK_EQ(base::MessageLoop::current(), message_loop());
+
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+  // If watchdog is already unregistered or shut down, stop ping watchdog.
+  if (!watchdog_registered_ || !watchdog) return;
+
+  watchdog->Ping(kWatchdogName);
+  message_loop()->task_runner()->PostDelayedTask(
+      FROM_HERE,
+      base::Bind(&ServiceWorkerRegistry::PingWatchdog, base::Unretained(this)),
+      base::TimeDelta::FromMilliseconds(kWatchdogTimePing));
+}
+
 void ServiceWorkerRegistry::EnsureServiceWorkerStarted(
     const url::Origin& storage_key, const GURL& client_url,
     base::WaitableEvent* done_event) {
diff --git a/cobalt/browser/service_worker_registry.h b/cobalt/browser/service_worker_registry.h
index 5b57118..4880d6a 100644
--- a/cobalt/browser/service_worker_registry.h
+++ b/cobalt/browser/service_worker_registry.h
@@ -21,6 +21,7 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread.h"
 #include "cobalt/network/network_module.h"
+#include "cobalt/watchdog/watchdog.h"
 #include "cobalt/web/web_settings.h"
 #include "cobalt/worker/service_worker_context.h"
 
@@ -57,6 +58,10 @@
                   network::NetworkModule* network_module,
                   web::UserAgentPlatformInfo* platform_info, const GURL& url);
 
+  void PingWatchdog();
+
+  bool watchdog_registered_ = false;
+
   // The thread created and owned by the Service Worker Registry.
   // All registry mutations occur on this thread. The thread has to outlive all
   // web Agents that use service workers.,
diff --git a/cobalt/browser/splash_screen_cache.cc b/cobalt/browser/splash_screen_cache.cc
index a139f6f..3e27fdf 100644
--- a/cobalt/browser/splash_screen_cache.cc
+++ b/cobalt/browser/splash_screen_cache.cc
@@ -19,12 +19,13 @@
 #include <vector>
 
 #include "base/base64.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
 #include "base/hash.h"
 #include "base/optional.h"
 #include "base/strings/string_util.h"
 #include "base/synchronization/lock.h"
 #include "cobalt/base/get_application_key.h"
-#include "starboard/common/file.h"
 #include "starboard/common/string.h"
 #include "starboard/configuration_constants.h"
 #include "starboard/directory.h"
@@ -85,13 +86,8 @@
   if (!CreateDirsForKey(key.value())) {
     return false;
   }
-  std::string full_path =
-      std::string(path.data()) + kSbFileSepString + key.value();
-  starboard::ScopedFile cache_file(
-      full_path.c_str(), kSbFileCreateAlways | kSbFileWrite, NULL, NULL);
-
-  return cache_file.WriteAll(content.c_str(),
-                             static_cast<int>(content.size())) > 0;
+  base::FilePath file_path = base::FilePath(path.data()).Append(key.value());
+  return base::WriteFile(file_path, content.c_str(), content.size()) > 0;
 }
 
 bool SplashScreenCache::IsSplashScreenCached() const {
@@ -120,18 +116,18 @@
     result->reset();
     return 0;
   }
-  std::string full_path = std::string(path.data()) + kSbFileSepString + key;
-  starboard::ScopedFile cache_file(full_path.c_str(),
-                                   kSbFileOpenOnly | kSbFileRead, NULL, NULL);
-  SbFileInfo info;
-  bool success = SbFileGetPathInfo(full_path.c_str(), &info);
-  if (!success) {
+  base::FilePath file_path = base::FilePath(path.data()).Append(key);
+  int64_t file_size;
+  if (!base::GetFileSize(file_path, &file_size)) {
     result->reset();
     return 0;
   }
-  const int kFileSize = static_cast<int>(info.size);
-  result->reset(new char[kFileSize]);
-  int result_size = cache_file.ReadAll(result->get(), kFileSize);
+  result->reset(new char[file_size]);
+  int result_size = base::ReadFile(file_path, result->get(), file_size);
+  if (result_size <= 0) {
+    result->reset();
+    return 0;
+  }
   last_page_hash_ = base::Hash(result->get(), result_size);
   return result_size;
 }
diff --git a/cobalt/browser/switches.cc b/cobalt/browser/switches.cc
index e455eeb..70bb756 100644
--- a/cobalt/browser/switches.cc
+++ b/cobalt/browser/switches.cc
@@ -36,6 +36,9 @@
     "IPv4), and to listen to LOOPBACK use \"::1\" (\"127.0.0.1\" for IPv4)";
 
 #if defined(ENABLE_DEBUGGER)
+const char kDisableWebDebugger[] = "disable_web_debugger";
+const char kDisableWebDebuggerHelp[] = "Disable support for the web debugger";
+
 const char kRemoteDebuggingPort[] = "remote_debugging_port";
 const char kRemoteDebuggingPortHelp[] =
     "Remote web debugger is served from the specified port. If 0, then the "
@@ -121,11 +124,6 @@
     "If this flag is set, input will be continuously generated randomly "
     "instead of taken from an external input device (like a controller).";
 
-const char kMemoryTracker[] = "memory_tracker";
-const char kMemoryTrackerHelp[] =
-    "Enables memory tracking by installing the memory tracker on startup. Run "
-    "--memory_tracker=help for more info.";
-
 const char kMinCompatibilityVersion[] = "min_compatibility_version";
 const char kMinCompatibilityVersionHelp[] =
     "The minimum version of Cobalt that will be checked during compatibility "
@@ -444,8 +442,9 @@
     {kDebugConsoleMode, kDebugConsoleModeHelp},
         {kDevServersListenIp, kDevServersListenIpHelp},
 #if defined(ENABLE_DEBUGGER)
-        {kWaitForWebDebugger, kWaitForWebDebuggerHelp},
+        {kDisableWebDebugger, kDisableWebDebuggerHelp},
         {kRemoteDebuggingPort, kRemoteDebuggingPortHelp},
+        {kWaitForWebDebugger, kWaitForWebDebuggerHelp},
 #endif  // ENABLE_DEBUGGER
         {kDisableImageAnimations, kDisableImageAnimationsHelp},
         {kForceDeterministicRendering, kForceDeterministicRenderingHelp},
@@ -459,7 +458,7 @@
         {kExtraWebFileDir, kExtraWebFileDirHelp},
         {kFakeMicrophone, kFakeMicrophoneHelp},
         {kIgnoreCertificateErrors, kIgnoreCertificateErrorsHelp},
-        {kInputFuzzer, kInputFuzzerHelp}, {kMemoryTracker, kMemoryTrackerHelp},
+        {kInputFuzzer, kInputFuzzerHelp},
         {kMinCompatibilityVersion, kMinCompatibilityVersionHelp},
         {kNullSavegame, kNullSavegameHelp}, {kProd, kProdHelp},
         {kRequireCSP, kRequireCSPHelp},
diff --git a/cobalt/browser/switches.h b/cobalt/browser/switches.h
index c1401d7..8cef3d8 100644
--- a/cobalt/browser/switches.h
+++ b/cobalt/browser/switches.h
@@ -30,6 +30,8 @@
 extern const char kDevServersListenIpHelp[];
 
 #if defined(ENABLE_DEBUGGER)
+extern const char kDisableWebDebugger[];
+extern const char kDisableWebDebuggerHelp[];
 extern const char kRemoteDebuggingPort[];
 extern const char kRemoteDebuggingPortHelp[];
 extern const char kWaitForWebDebugger[];
@@ -62,8 +64,6 @@
 extern const char kIgnoreCertificateErrorsHelp[];
 extern const char kInputFuzzer[];
 extern const char kInputFuzzerHelp[];
-extern const char kMemoryTracker[];
-extern const char kMemoryTrackerHelp[];
 extern const char kMinCompatibilityVersion[];
 extern const char kMinCompatibilityVersionHelp[];
 extern const char kNullSavegame[];
diff --git a/cobalt/browser/system_platform_error_handler.cc b/cobalt/browser/system_platform_error_handler.cc
index b16feca..71e03d3 100644
--- a/cobalt/browser/system_platform_error_handler.cc
+++ b/cobalt/browser/system_platform_error_handler.cc
@@ -23,7 +23,7 @@
     const SystemPlatformErrorOptions& options) {
   DCHECK(!options.callback.is_null());
 
-  CallbackData* callback_data = new CallbackData{ &mutex_, options.callback };
+  CallbackData* callback_data = new CallbackData{&mutex_, options.callback};
 
   if (!SbSystemRaisePlatformError(
           options.error_type,
diff --git a/cobalt/browser/web_module.cc b/cobalt/browser/web_module.cc
index 33ca0be..c955f83 100644
--- a/cobalt/browser/web_module.cc
+++ b/cobalt/browser/web_module.cc
@@ -142,8 +142,7 @@
 
 #if defined(ENABLE_DEBUGGER)
   debug::backend::DebugDispatcher* debug_dispatcher() {
-    DCHECK(debug_module_);
-    return debug_module_->debug_dispatcher();
+    return debug_module_ ? debug_module_->debug_dispatcher() : nullptr;
   }
 #endif  // ENABLE_DEBUGGER
 
@@ -229,7 +228,13 @@
 
   void FreezeDebugger(
       std::unique_ptr<debug::backend::DebuggerState>* debugger_state) {
-    if (debugger_state) *debugger_state = debug_module_->Freeze();
+    if (debugger_state) {
+      if (debug_module_) {
+        *debugger_state = debug_module_->Freeze();
+      } else {
+        debugger_state->reset();
+      }
+    }
   }
 #endif  // defined(ENABLE_DEBUGGER)
 
@@ -537,6 +542,7 @@
       data.options.loader_thread_priority));
 
   animated_image_tracker_.reset(new loader::image::AnimatedImageTracker(
+      web_context_->name().c_str(),
       data.options.animated_image_decode_thread_priority));
 
   DCHECK_LE(0, data.options.image_cache_capacity);
@@ -612,7 +618,7 @@
   web_context_->global_environment()->AddRoot(media_source_registry_.get());
 
 #if defined(ENABLE_DEBUGGER)
-  if (data.options.wait_for_web_debugger) {
+  if (data.options.enable_debugger && data.options.wait_for_web_debugger) {
     // Post a task that blocks the message loop and waits for the web debugger.
     // This must be posted before the the window's task to load the document.
     waiting_for_web_debugger_->store(true);
@@ -717,13 +723,15 @@
   }
 
 #if defined(ENABLE_DEBUGGER)
-  debug_overlay_.reset(
-      new debug::backend::RenderOverlay(render_tree_produced_callback_));
+  if (data.options.enable_debugger) {
+    debug_overlay_.reset(
+        new debug::backend::RenderOverlay(render_tree_produced_callback_));
 
-  debug_module_.reset(new debug::backend::DebugModule(
-      &debugger_hooks_, web_context_->global_environment(),
-      debug_overlay_.get(), resource_provider_, window_,
-      data.options.debugger_state));
+    debug_module_.reset(new debug::backend::DebugModule(
+        &debugger_hooks_, web_context_->global_environment(),
+        debug_overlay_.get(), resource_provider_, window_,
+        data.options.debugger_state));
+  }
 #endif  // ENABLE_DEBUGGER
 
   report_unload_timing_info_callback_ =
@@ -954,7 +962,11 @@
                  last_render_tree_produced_time_));
 
 #if defined(ENABLE_DEBUGGER)
-  debug_overlay_->OnRenderTreeProduced(layout_results_with_callback);
+  if (debug_overlay_) {
+    debug_overlay_->OnRenderTreeProduced(layout_results_with_callback);
+  } else {
+    render_tree_produced_callback_.Run(layout_results_with_callback);
+  }
 #else   // ENABLE_DEBUGGER
   render_tree_produced_callback_.Run(layout_results_with_callback);
 #endif  // ENABLE_DEBUGGER
@@ -975,6 +987,7 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   web_module_stat_tracker_->OnRenderTreeRasterized(produced_time,
                                                    rasterized_time);
+  animated_image_tracker_->OnRenderTreeRasterized();
   if (produced_time >= last_render_tree_produced_time_) {
     is_render_tree_rasterization_pending_ = false;
   }
@@ -1034,12 +1047,13 @@
 #if defined(ENABLE_DEBUGGER)
 void WebModule::Impl::WaitForWebDebugger() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(debug_module_);
-  LOG(WARNING) << "\n-------------------------------------"
-                  "\n Waiting for web debugger to connect "
-                  "\n-------------------------------------";
-  // This blocks until the web debugger connects.
-  debug_module_->debug_dispatcher()->SetPaused(true);
+  if (debug_module_) {
+    LOG(WARNING) << "\n-------------------------------------"
+                    "\n Waiting for web debugger to connect "
+                    "\n-------------------------------------";
+    // This blocks until the web debugger connects.
+    debug_module_->debug_dispatcher()->SetPaused(true);
+  }
   waiting_for_web_debugger_->store(false);
 }
 #endif  // defined(ENABLE_DEBUGGER)
@@ -1130,7 +1144,7 @@
 
 #if defined(ENABLE_DEBUGGER)
   // The debug overlay may be holding onto a render tree, clear that out.
-  debug_overlay_->ClearInput();
+  if (debug_overlay_) debug_overlay_->ClearInput();
 #endif
 
   // Force garbage collection in |javascript_engine|.
diff --git a/cobalt/browser/web_module.h b/cobalt/browser/web_module.h
index 8c28dce..28fa714 100644
--- a/cobalt/browser/web_module.h
+++ b/cobalt/browser/web_module.h
@@ -229,6 +229,8 @@
     bool limit_performance_timer_resolution = true;
 
 #if defined(ENABLE_DEBUGGER)
+    // Whether a debugger should be started for this WebModule.
+    bool enable_debugger = false;
     // Whether the debugger should block until remote devtools connects.
     bool wait_for_web_debugger = false;
 
diff --git a/cobalt/build/build_info.py b/cobalt/build/build_info.py
index 2edcc52..aed2646 100755
--- a/cobalt/build/build_info.py
+++ b/cobalt/build/build_info.py
@@ -26,6 +26,7 @@
 
 _BUILD_ID_PATTERN = '^BUILD_NUMBER=([1-9][0-9]{6,})$'
 _GIT_REV_PATTERN = '^GitOrigin-RevId: ([0-9a-f]{40})$'
+_COBALT_VERSION_PATTERN = '^#define COBALT_VERSION "(.*)"$'
 
 
 def get_build_id_and_git_rev_from_commits(cwd):
@@ -77,6 +78,16 @@
   return _get_last_commit_with_format(r'%s', cwd=cwd)
 
 
+def _get_cobalt_version():
+  version_header_path = os.path.join(os.path.dirname(FILE_DIR), 'version.h')
+  contents = ''
+  with open(version_header_path, 'r', encoding='utf-8') as f:
+    contents = f.read()
+  compiled_cobalt_version_pattern = re.compile(
+      _COBALT_VERSION_PATTERN, flags=re.MULTILINE)
+  return compiled_cobalt_version_pattern.search(contents).group(1)
+
+
 def main(output_path, cwd=FILE_DIR):
   """Writes a Cobalt build_info json file."""
   build_rev = _get_hash_from_last_commit(cwd=cwd)
@@ -84,6 +95,7 @@
   if build_id is None:
     build_id = get_build_id_from_commit_count(cwd=cwd)
     git_rev = build_rev
+  cobalt_version = _get_cobalt_version()
   build_time = datetime.datetime.now().ctime()
   author = _get_author_from_last_commit(cwd=cwd)
   commit = _get_subject_from_last_commit(cwd=cwd)
@@ -92,6 +104,7 @@
       'build_id': build_id,
       'build_rev': build_rev,
       'git_rev': git_rev,
+      'cobalt_version': cobalt_version,
       'build_time': build_time,
       'author': author,
       'commit': commit
@@ -108,6 +121,7 @@
 Build ID: {build_id}
 Build Rev: {build_rev}
 Git Rev: {git_rev}
+Cobalt Version: {cobalt_version}
 Build Time: {build_time}
 Author: {author}
 Commit: {commit}
diff --git a/cobalt/build/cobalt_configuration.py b/cobalt/build/cobalt_configuration.py
index 91b90a6..e1320ab 100644
--- a/cobalt/build/cobalt_configuration.py
+++ b/cobalt/build/cobalt_configuration.py
@@ -105,6 +105,7 @@
     ]
     return filters
 
+  # TODO(b/292007482): Replace static list with gn query.
   def GetTestTargets(self):
     return [
         'audio_test',
@@ -112,38 +113,48 @@
         'base_unittests',
         'bindings_test',
         'browser_test',
+        'components_metrics_tests',
+        'crypto_impl_test',
         'crypto_unittests',
         'csp_test',
-        'css_parser_test',
         'cssom_test',
+        'css_parser_test',
+        'cwrappers_test',
         'dom_parser_test',
         'dom_test',
         'extension_test',
+        # TODO(b/292127297): This target is not built for all platforms.
+        # 'ffmpeg_demuxer_test',
         'graphics_system_test',
         'layout_test',
         'layout_tests',
-        'cwrappers_test',
         'loader_test',
         'math_test',
         'media_capture_test',
         'media_session_test',
         'media_stream_test',
+        # TODO(b/292030213): Crashes on evergreen
+        # 'media_test',
         'memory_store_test',
         'metrics_test',
         'nb_test',
         'net_unittests',
         'network_test',
+        'overlay_info_test',
         'persistent_settings_test',
+        'png_utils_test',
         'poem_unittests',
-        'render_tree_test',
         'renderer_test',
+        'render_tree_test',
         'scroll_engine_tests',
+        'speech_test',
         'storage_test',
         'text_encoding_test',
-        'web_test',
+        'watchdog_test',
         'web_animations_test',
         'webdriver_test',
         'websocket_test',
+        'web_test',
         'worker_test',
         'xhr_test',
         'zip_unittests',
diff --git a/cobalt/build/gn.py b/cobalt/build/gn.py
index 7ff3bc4..e8c4472 100755
--- a/cobalt/build/gn.py
+++ b/cobalt/build/gn.py
@@ -68,7 +68,7 @@
   parser.add_argument(
       '-p',
       '--platform',
-      required=True,
+      default='linux-x64x11',
       choices=list(PLATFORMS),
       help='The platform to build.')
   parser.add_argument(
diff --git a/cobalt/codereview.settings b/cobalt/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/cobalt/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/cobalt/csp/content_security_policy_test.cc b/cobalt/csp/content_security_policy_test.cc
index 8ef00fd..880ff4e 100644
--- a/cobalt/csp/content_security_policy_test.cc
+++ b/cobalt/csp/content_security_policy_test.cc
@@ -12,9 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/csp/content_security_policy.h"
+
 #include <memory>
 
-#include "cobalt/csp/content_security_policy.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
diff --git a/cobalt/css_parser/BUILD.gn b/cobalt/css_parser/BUILD.gn
index d6a668c..bff1cfa 100644
--- a/cobalt/css_parser/BUILD.gn
+++ b/cobalt/css_parser/BUILD.gn
@@ -94,7 +94,6 @@
     ":css_grammar",
     "//cobalt/base",
     "//cobalt/cssom",
-    "//nb",
     "//starboard/common",
   ]
 
diff --git a/cobalt/css_parser/border_shorthand_property_parse_structures.cc b/cobalt/css_parser/border_shorthand_property_parse_structures.cc
index cb259db..b18735d 100644
--- a/cobalt/css_parser/border_shorthand_property_parse_structures.cc
+++ b/cobalt/css_parser/border_shorthand_property_parse_structures.cc
@@ -40,7 +40,7 @@
       break;
     }
     case 2: {
-      // If left is mising, it is the same as right; If bottom is missing, it is
+      // If left is missing, it is the same as right; If bottom is missing, it's
       // the same as top.
       border_top = list->value()[0];
       border_right = list->value()[1];
diff --git a/cobalt/css_parser/margin_or_padding_shorthand.cc b/cobalt/css_parser/margin_or_padding_shorthand.cc
index 2067923..5260e2d 100644
--- a/cobalt/css_parser/margin_or_padding_shorthand.cc
+++ b/cobalt/css_parser/margin_or_padding_shorthand.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/css_parser/margin_or_padding_shorthand.h"
 
+#include <memory>
+
 namespace cobalt {
 namespace css_parser {
 
diff --git a/cobalt/css_parser/parser.cc b/cobalt/css_parser/parser.cc
index 49a1e2d..ccc9b42 100644
--- a/cobalt/css_parser/parser.cc
+++ b/cobalt/css_parser/parser.cc
@@ -88,7 +88,6 @@
 #include "cobalt/cssom/unicode_range_value.h"
 #include "cobalt/cssom/universal_selector.h"
 #include "cobalt/cssom/url_value.h"
-#include "nb/memory_scope.h"
 
 namespace cobalt {
 namespace css_parser {
@@ -271,21 +270,18 @@
           supports_map_to_mesh == Parser::kSupportsMapToMeshRectangular) {}
 
 scoped_refptr<cssom::CSSStyleSheet> ParserImpl::ParseStyleSheet() {
-  TRACK_MEMORY_SCOPE("CSS");
   scanner_.PrependToken(kStyleSheetEntryPointToken);
   return Parse() ? style_sheet_
                  : base::WrapRefCounted(new cssom::CSSStyleSheet(css_parser_));
 }
 
 scoped_refptr<cssom::CSSRule> ParserImpl::ParseRule() {
-  TRACK_MEMORY_SCOPE("CSS");
   scanner_.PrependToken(kRuleEntryPointToken);
   return Parse() ? rule_ : NULL;
 }
 
 scoped_refptr<cssom::CSSDeclaredStyleData>
 ParserImpl::ParseStyleDeclarationList() {
-  TRACK_MEMORY_SCOPE("CSS");
   scanner_.PrependToken(kStyleDeclarationListEntryPointToken);
   return Parse() ? style_declaration_data_
                  : base::WrapRefCounted(new cssom::CSSDeclaredStyleData());
@@ -293,7 +289,6 @@
 
 scoped_refptr<cssom::CSSFontFaceDeclarationData>
 ParserImpl::ParseFontFaceDeclarationList() {
-  TRACK_MEMORY_SCOPE("CSS");
   scanner_.PrependToken(kFontFaceDeclarationListEntryPointToken);
   return Parse()
              ? font_face_declaration_data_
@@ -312,7 +307,6 @@
 
 scoped_refptr<cssom::PropertyValue> ParserImpl::ParsePropertyValue(
     const std::string& property_name) {
-  TRACK_MEMORY_SCOPE("CSS");
   Token property_name_token;
   bool is_property_name_known =
       scanner_.DetectPropertyNameToken(property_name, &property_name_token);
@@ -335,7 +329,6 @@
 void ParserImpl::ParsePropertyIntoDeclarationData(
     const std::string& property_name,
     cssom::CSSDeclarationData* declaration_data) {
-  TRACK_MEMORY_SCOPE("CSS");
   Token property_name_token;
   bool is_property_name_known =
       scanner_.DetectPropertyNameToken(property_name, &property_name_token);
@@ -364,13 +357,11 @@
 }
 
 scoped_refptr<cssom::MediaList> ParserImpl::ParseMediaList() {
-  TRACK_MEMORY_SCOPE("CSS");
   scanner_.PrependToken(kMediaListEntryPointToken);
   return Parse() ? media_list_ : base::WrapRefCounted(new cssom::MediaList());
 }
 
 scoped_refptr<cssom::MediaQuery> ParserImpl::ParseMediaQuery() {
-  TRACK_MEMORY_SCOPE("CSS");
   scanner_.PrependToken(kMediaQueryEntryPointToken);
   return Parse() ? media_query_ : base::WrapRefCounted(new cssom::MediaQuery());
 }
@@ -390,7 +381,6 @@
 }
 
 bool ParserImpl::Parse() {
-  TRACK_MEMORY_SCOPE("CSS");
   // For more information on error codes
   // see http://www.gnu.org/software/bison/manual/html_node/Parser-Function.html
   TRACE_EVENT0("cobalt::css_parser", "ParseImpl::Parse");
diff --git a/cobalt/css_parser/parser_test.cc b/cobalt/css_parser/parser_test.cc
index 3c1d879..d65c464 100644
--- a/cobalt/css_parser/parser_test.cc
+++ b/cobalt/css_parser/parser_test.cc
@@ -1405,7 +1405,9 @@
 // for the expanded properties for values 'inherit' and 'initial'.
 TEST_F(ParserTest, ParsesShorthandPropertyInitialAndInherit) {
   const char* shorthand_property_keywords[] = {
-      "inherit", "initial", nullptr,
+      "inherit",
+      "initial",
+      nullptr,
   };
 
   // Helper class to check if a PropertyValue is a KeywordValue.
diff --git a/cobalt/css_parser/scanner_test.cc b/cobalt/css_parser/scanner_test.cc
index 3bd87ac..e5e9a7d 100644
--- a/cobalt/css_parser/scanner_test.cc
+++ b/cobalt/css_parser/scanner_test.cc
@@ -27,9 +27,9 @@
 // below, this DISABLED test should be enabled.
 
 const char* kNumericLocales[] = {
-  "",       // default locale
-  "C",      // dot radix separator
-  "de_DE",  // comma radix separator
+    "",       // default locale
+    "C",      // dot radix separator
+    "de_DE",  // comma radix separator
 };
 
 class ScannerTest : public ::testing::Test,
@@ -42,14 +42,14 @@
       return;
     }
 
-#if SB_IS(EVERGREEN)
+#if SB_IS(MODULAR)
     // We don't support changing locale for Evergreen so run only
     // if the default/empty local is passed in the param.
     locale_okay_ = (GetParam()[0] == 0);
 #else
     // Save the old locale.
     char* old_locale_cstr = setlocale(LC_NUMERIC, nullptr);
-    EXPECT_TRUE(old_locale_cstr != nullptr) << "Cant' save original locale";
+    EXPECT_TRUE(old_locale_cstr != nullptr) << "Can't save original locale";
     old_locale_ = old_locale_cstr;
 
     // Keep the default locale when the param is empty, and for other param
@@ -60,7 +60,7 @@
   }
 
   virtual void TearDown() {
-#if !SB_IS(EVERGREEN)
+#if !SB_IS(MODULAR)
     if (!old_locale_.empty()) setlocale(LC_NUMERIC, old_locale_.c_str());
 #endif
   }
@@ -764,10 +764,10 @@
   const char* text;
   int token;
 } known_dash_functions[] = {
-  { "-cobalt-mtm", kCobaltMtmFunctionToken },
-  { "-cobalt-ui-nav-focus-transform", kCobaltUiNavFocusTransformFunctionToken },
-  { "-cobalt-ui-nav-spotlight-transform",
-    kCobaltUiNavSpotlightTransformFunctionToken },
+    {"-cobalt-mtm", kCobaltMtmFunctionToken},
+    {"-cobalt-ui-nav-focus-transform", kCobaltUiNavFocusTransformFunctionToken},
+    {"-cobalt-ui-nav-spotlight-transform",
+     kCobaltUiNavSpotlightTransformFunctionToken},
 };
 }  // namespace
 
@@ -778,10 +778,11 @@
 
     Scanner scanner(text.c_str(), &string_pool_);
     ASSERT_EQ(known_dash_functions[i].token,
-              yylex(&token_value_, &token_location_, &scanner)) << text;
+              yylex(&token_value_, &token_location_, &scanner))
+        << text;
     ASSERT_EQ(')', yylex(&token_value_, &token_location_, &scanner)) << text;
-    ASSERT_EQ(kEndOfFileToken,
-              yylex(&token_value_, &token_location_, &scanner)) << text;
+    ASSERT_EQ(kEndOfFileToken, yylex(&token_value_, &token_location_, &scanner))
+        << text;
   }
 }
 
@@ -792,10 +793,11 @@
 
     Scanner scanner(text.c_str(), &string_pool_);
     ASSERT_EQ(known_dash_functions[i].token,
-              yylex(&token_value_, &token_location_, &scanner)) << text;
+              yylex(&token_value_, &token_location_, &scanner))
+        << text;
     ASSERT_EQ(')', yylex(&token_value_, &token_location_, &scanner)) << text;
-    ASSERT_EQ(kEndOfFileToken,
-              yylex(&token_value_, &token_location_, &scanner)) << text;
+    ASSERT_EQ(kEndOfFileToken, yylex(&token_value_, &token_location_, &scanner))
+        << text;
   }
 }
 
diff --git a/cobalt/css_parser/string_pool.h b/cobalt/css_parser/string_pool.h
index b94f72d..1383b91 100644
--- a/cobalt/css_parser/string_pool.h
+++ b/cobalt/css_parser/string_pool.h
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <string>
+#include <vector>
 
 
 namespace cobalt {
diff --git a/cobalt/css_parser/trivial_string_piece.h b/cobalt/css_parser/trivial_string_piece.h
index 4c5be8f..eb491eb 100644
--- a/cobalt/css_parser/trivial_string_piece.h
+++ b/cobalt/css_parser/trivial_string_piece.h
@@ -54,8 +54,7 @@
 
 // Used by tests.
 inline bool operator==(const TrivialStringPiece& lhs, const char* rhs) {
-  return strncmp(lhs.begin, rhs, lhs.size()) == 0 &&
-         rhs[lhs.size()] == '\0';
+  return strncmp(lhs.begin, rhs, lhs.size()) == 0 && rhs[lhs.size()] == '\0';
 }
 
 // Used by tests.
diff --git a/cobalt/cssom/animation_set.cc b/cobalt/cssom/animation_set.cc
index 751b72a..1432030 100644
--- a/cobalt/cssom/animation_set.cc
+++ b/cobalt/cssom/animation_set.cc
@@ -160,19 +160,21 @@
 
     // Create the animation and insert it into our map of currently active
     // animations.
-    InternalAnimationMap::iterator inserted = animations_.insert(
-        std::make_pair(
-            name_string,
-            AnimationEntry(Animation(name_string, keyframes, current_time,
-                GetTimeValue(i, style.animation_delay().get()),
-                GetTimeValue(i, style.animation_duration().get()),
-                GetFillMode(i, style.animation_fill_mode().get()),
-                GetIterationCount(
-                    i, style.animation_iteration_count().get()),
-                GetDirection(i, style.animation_direction().get()),
-                GetTimingFunction(
-                    i, style.animation_timing_function().get())))))
-        .first;
+    InternalAnimationMap::iterator inserted =
+        animations_
+            .insert(std::make_pair(
+                name_string,
+                AnimationEntry(Animation(
+                    name_string, keyframes, current_time,
+                    GetTimeValue(i, style.animation_delay().get()),
+                    GetTimeValue(i, style.animation_duration().get()),
+                    GetFillMode(i, style.animation_fill_mode().get()),
+                    GetIterationCount(i,
+                                      style.animation_iteration_count().get()),
+                    GetDirection(i, style.animation_direction().get()),
+                    GetTimingFunction(
+                        i, style.animation_timing_function().get())))))
+            .first;
     if (event_handler_) {
       event_handler_->OnAnimationStarted(inserted->second.animation, this);
     }
@@ -187,8 +189,8 @@
     // If the animation is playing, but the current time is past the end time,
     // then we should signal to the event handler that it has ended.
     bool animation_has_ended =
-        current_time >= iter->second.animation.start_time() +
-                        iter->second.animation.duration();
+        current_time >=
+        iter->second.animation.start_time() + iter->second.animation.duration();
     if (animation_has_ended && !iter->second.ended) {
       iter->second.ended = true;
       if (event_handler_) {
diff --git a/cobalt/cssom/animation_set.h b/cobalt/cssom/animation_set.h
index 081ab95..5504f59 100644
--- a/cobalt/cssom/animation_set.h
+++ b/cobalt/cssom/animation_set.h
@@ -17,6 +17,7 @@
 
 #include <map>
 #include <string>
+#include <utility>
 
 #include "cobalt/cssom/animation.h"
 #include "cobalt/cssom/css_computed_style_data.h"
diff --git a/cobalt/cssom/cascade_precedence.h b/cobalt/cssom/cascade_precedence.h
index 60f978e..ffb72b2 100644
--- a/cobalt/cssom/cascade_precedence.h
+++ b/cobalt/cssom/cascade_precedence.h
@@ -79,7 +79,7 @@
  public:
   explicit CascadePrecedence(Origin origin) : origin_(origin) {}
   CascadePrecedence(Origin origin, const Specificity& specificity,
-                  const Appearance& appearance)
+                    const Appearance& appearance)
       : origin_(origin), specificity_(specificity), appearance_(appearance) {}
 
   Origin origin() const { return origin_; }
diff --git a/cobalt/cssom/cascaded_style_test.cc b/cobalt/cssom/cascaded_style_test.cc
index da6cb14..644b611 100644
--- a/cobalt/cssom/cascaded_style_test.cc
+++ b/cobalt/cssom/cascaded_style_test.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/cssom/cascaded_style.h"
 
+#include <memory>
+#include <utility>
+
 #include "cobalt/css_parser/parser.h"
 #include "cobalt/cssom/cascade_precedence.h"
 #include "cobalt/cssom/css_computed_style_data.h"
@@ -46,44 +47,47 @@
   // rule 2 > rule 3 > rule 1.
 
   scoped_refptr<CSSStyleRule> css_style_rule_1 =
-      css_parser->ParseRule(
-                    "div {"
-                    "  left: 100px !important;"
-                    "  right: 100px;"
-                    "  width: 100px;"
-                    "  height: 100px;"
-                    "}",
-                    base::SourceLocation("[object CascadedStyleTest]", 1, 1))
+      css_parser
+          ->ParseRule(
+              "div {"
+              "  left: 100px !important;"
+              "  right: 100px;"
+              "  width: 100px;"
+              "  height: 100px;"
+              "}",
+              base::SourceLocation("[object CascadedStyleTest]", 1, 1))
           ->AsCSSStyleRule();
   CascadePrecedence cascade_precedence_1(kNormalUserAgent);
   rules_with_cascade_precedence.push_back(
       std::make_pair(css_style_rule_1, cascade_precedence_1));
 
   scoped_refptr<CSSStyleRule> css_style_rule_2 =
-      css_parser->ParseRule(
-                    "div {"
-                    "  left: 200px;"
-                    "  right: 200px !important;"
-                    "  width: 200px;"
-                    "  height: 200px;"
-                    "  vertical-align: top !important;"
-                    "  text-align: center !important;"
-                    "}",
-                    base::SourceLocation("[object CascadedStyleTest]", 1, 1))
+      css_parser
+          ->ParseRule(
+              "div {"
+              "  left: 200px;"
+              "  right: 200px !important;"
+              "  width: 200px;"
+              "  height: 200px;"
+              "  vertical-align: top !important;"
+              "  text-align: center !important;"
+              "}",
+              base::SourceLocation("[object CascadedStyleTest]", 1, 1))
           ->AsCSSStyleRule();
   CascadePrecedence cascade_precedence_2(kNormalOverride);
   rules_with_cascade_precedence.push_back(
       std::make_pair(css_style_rule_2, cascade_precedence_2));
 
   scoped_refptr<CSSStyleRule> css_style_rule_3 =
-      css_parser->ParseRule(
-                    "div {"
-                    "  left: 300px;"
-                    "  right: 300px;"
-                    "  width: 300px !important;"
-                    "  height: 300px;"
-                    "}",
-                    base::SourceLocation("[object CascadedStyleTest]", 1, 1))
+      css_parser
+          ->ParseRule(
+              "div {"
+              "  left: 300px;"
+              "  right: 300px;"
+              "  width: 300px !important;"
+              "  height: 300px;"
+              "}",
+              base::SourceLocation("[object CascadedStyleTest]", 1, 1))
           ->AsCSSStyleRule();
   CascadePrecedence cascade_precedence_3(kNormalAuthor);
   rules_with_cascade_precedence.push_back(
@@ -121,25 +125,27 @@
   // rule 2 > rule 1.
 
   scoped_refptr<CSSStyleRule> css_style_rule_1 =
-      css_parser->ParseRule(
-                    "div {"
-                    "  left: 100px !important;"
-                    "  right: 100px;"
-                    "}",
-                    base::SourceLocation("[object CascadedStyleTest]", 1, 1))
+      css_parser
+          ->ParseRule(
+              "div {"
+              "  left: 100px !important;"
+              "  right: 100px;"
+              "}",
+              base::SourceLocation("[object CascadedStyleTest]", 1, 1))
           ->AsCSSStyleRule();
   CascadePrecedence cascade_precedence_1(kNormalUserAgent);
   rules_with_cascade_precedence.push_back(
       std::make_pair(css_style_rule_1, cascade_precedence_1));
 
   scoped_refptr<CSSStyleRule> css_style_rule_2 =
-      css_parser->ParseRule(
-                    "div {"
-                    "  left: 200px;"
-                    "  right: 200px !important;"
-                    "  background-image: url(foo.png);"
-                    "}",
-                    base::SourceLocation("[object CascadedStyleTest]", 1, 1))
+      css_parser
+          ->ParseRule(
+              "div {"
+              "  left: 200px;"
+              "  right: 200px !important;"
+              "  background-image: url(foo.png);"
+              "}",
+              base::SourceLocation("[object CascadedStyleTest]", 1, 1))
           ->AsCSSStyleRule();
   CascadePrecedence cascade_precedence_2(kNormalOverride);
   rules_with_cascade_precedence.push_back(
@@ -177,13 +183,14 @@
       GURL("https://www.youtube.com/tv/img");
 
   scoped_refptr<CSSStyleRule> css_style_rule =
-      css_parser->ParseRule(
-                    "div {"
-                    "  left: 200px;"
-                    "  right: 200px !important;"
-                    "  background-image: url(foo.png);"
-                    "}",
-                    base::SourceLocation("[object CascadedStyleTest]", 1, 1))
+      css_parser
+          ->ParseRule(
+              "div {"
+              "  left: 200px;"
+              "  right: 200px !important;"
+              "  background-image: url(foo.png);"
+              "}",
+              base::SourceLocation("[object CascadedStyleTest]", 1, 1))
           ->AsCSSStyleRule();
   CascadePrecedence cascade_precedence(kNormalOverride);
   rules_with_cascade_precedence.push_back(
@@ -221,12 +228,13 @@
   // rule 2 > rule 1.
 
   scoped_refptr<CSSStyleRule> css_style_rule_1 =
-      css_parser->ParseRule(
-                    "div {"
-                    "  right: 100px;"
-                    "  background-image: url(bar.png) !important;"
-                    "}",
-                    base::SourceLocation("[object CascadedStyleTest]", 1, 1))
+      css_parser
+          ->ParseRule(
+              "div {"
+              "  right: 100px;"
+              "  background-image: url(bar.png) !important;"
+              "}",
+              base::SourceLocation("[object CascadedStyleTest]", 1, 1))
           ->AsCSSStyleRule();
   CascadePrecedence cascade_precedence_1(kNormalUserAgent);
   rules_with_cascade_precedence.push_back(
@@ -238,12 +246,13 @@
   css_style_rule_1->set_parent_style_sheet(parent_style_sheet_1.get());
 
   scoped_refptr<CSSStyleRule> css_style_rule_2 =
-      css_parser->ParseRule(
-                    "div {"
-                    "  right: 200px !important;"
-                    "  background-image: url(foo.png);"
-                    "}",
-                    base::SourceLocation("[object CascadedStyleTest]", 1, 1))
+      css_parser
+          ->ParseRule(
+              "div {"
+              "  right: 200px !important;"
+              "  background-image: url(foo.png);"
+              "}",
+              base::SourceLocation("[object CascadedStyleTest]", 1, 1))
           ->AsCSSStyleRule();
   CascadePrecedence cascade_precedence_2(kNormalOverride);
   rules_with_cascade_precedence.push_back(
diff --git a/cobalt/cssom/color_stop.h b/cobalt/cssom/color_stop.h
index cdbd4d0..367a079 100644
--- a/cobalt/cssom/color_stop.h
+++ b/cobalt/cssom/color_stop.h
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <string>
+#include <vector>
 
 #include "base/memory/ref_counted.h"
 #include "cobalt/cssom/length_value.h"
diff --git a/cobalt/cssom/combinator.cc b/cobalt/cssom/combinator.cc
index 88e485f..e266360 100644
--- a/cobalt/cssom/combinator.cc
+++ b/cobalt/cssom/combinator.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/cssom/combinator.h"
 
+#include <memory>
+#include <utility>
+
 #include "cobalt/cssom/compound_selector.h"
 
 namespace cobalt {
diff --git a/cobalt/cssom/complex_selector.cc b/cobalt/cssom/complex_selector.cc
index e62cc7e..2bf8abd 100644
--- a/cobalt/cssom/complex_selector.cc
+++ b/cobalt/cssom/complex_selector.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/cssom/complex_selector.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/logging.h"
 #include "cobalt/cssom/combinator.h"
 #include "cobalt/cssom/compound_selector.h"
diff --git a/cobalt/cssom/complex_selector.h b/cobalt/cssom/complex_selector.h
index 93405e6..037a2ed 100644
--- a/cobalt/cssom/complex_selector.h
+++ b/cobalt/cssom/complex_selector.h
@@ -52,9 +52,7 @@
   CompoundSelector* first_selector() { return first_selector_.get(); }
   CompoundSelector* last_selector() { return last_selector_; }
 
-  int combinator_count() {
-    return combinator_count_;
-  }
+  int combinator_count() { return combinator_count_; }
 
   // For a chain of compound selectors separated by combinators, AppendSelector
   // should be first called with the left most compound selector, then
diff --git a/cobalt/cssom/compound_selector.h b/cobalt/cssom/compound_selector.h
index 54a79fb..3369215 100644
--- a/cobalt/cssom/compound_selector.h
+++ b/cobalt/cssom/compound_selector.h
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <string>
+#include <vector>
 
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
diff --git a/cobalt/cssom/computed_style_test.cc b/cobalt/cssom/computed_style_test.cc
index dc1bfe1..7088a10 100644
--- a/cobalt/cssom/computed_style_test.cc
+++ b/cobalt/cssom/computed_style_test.cc
@@ -15,6 +15,7 @@
 #include "cobalt/cssom/computed_style.h"
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "cobalt/base/polymorphic_downcast.h"
@@ -1172,7 +1173,8 @@
   DCHECK_EQ(2u, box_shadow_list->value().size());
 
   float expected_length_value[2][3] = {
-      {100.0f, 30.0f, 150.0f}, {100.0f, 40.0f, 0.0f},
+      {100.0f, 30.0f, 150.0f},
+      {100.0f, 40.0f, 0.0f},
   };
   float expected_color[2] = {0x0047ABFF, 0x000080FF};
   bool expected_has_inset[2] = {true, false};
@@ -1829,7 +1831,8 @@
   DCHECK_EQ(2u, text_shadow_list->value().size());
 
   float expected_length_value[2][3] = {
-      {100.0f, 30.0f, 150.0f}, {100.0f, 40.0f, 0.0f},
+      {100.0f, 30.0f, 150.0f},
+      {100.0f, 40.0f, 0.0f},
   };
   float expected_color[2] = {0x0047ABFF, 0x000080FF};
 
diff --git a/cobalt/cssom/css.idl b/cobalt/cssom/css.idl
index 2569462..100dc48 100644
--- a/cobalt/cssom/css.idl
+++ b/cobalt/cssom/css.idl
@@ -17,4 +17,4 @@
 interface CSS {
   [CallWith=EnvironmentSettings] static boolean supports(DOMString property,
                                                          DOMString value);
-};
\ No newline at end of file
+};
diff --git a/cobalt/cssom/css_computed_style_data_property_set_matcher_test.cc b/cobalt/cssom/css_computed_style_data_property_set_matcher_test.cc
index 6ecb327..115ab22 100644
--- a/cobalt/cssom/css_computed_style_data_property_set_matcher_test.cc
+++ b/cobalt/cssom/css_computed_style_data_property_set_matcher_test.cc
@@ -13,11 +13,9 @@
 // limitations under the License.
 
 #include "cobalt/cssom/css_computed_style_data.h"
-
 #include "cobalt/cssom/font_style_value.h"
 #include "cobalt/cssom/font_weight_value.h"
 #include "cobalt/cssom/keyword_value.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/cssom/css_computed_style_data_test.cc b/cobalt/cssom/css_computed_style_data_test.cc
index edc4722..7195282 100644
--- a/cobalt/cssom/css_computed_style_data_test.cc
+++ b/cobalt/cssom/css_computed_style_data_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/cssom/css_computed_style_data.h"
+
 #include "cobalt/cssom/css_style_sheet.h"
 #include "cobalt/cssom/font_weight_value.h"
 #include "cobalt/cssom/integer_value.h"
@@ -20,7 +21,6 @@
 #include "cobalt/cssom/length_value.h"
 #include "cobalt/cssom/property_definitions.h"
 #include "cobalt/cssom/rgba_color_value.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/cssom/css_computed_style_declaration_test.cc b/cobalt/cssom/css_computed_style_declaration_test.cc
index ac53074..8ba0f2d 100644
--- a/cobalt/cssom/css_computed_style_declaration_test.cc
+++ b/cobalt/cssom/css_computed_style_declaration_test.cc
@@ -26,9 +26,9 @@
 namespace cobalt {
 namespace cssom {
 
+using dom::testing::FakeExceptionState;
 using ::testing::_;
 using ::testing::Return;
-using dom::testing::FakeExceptionState;
 
 TEST(CSSComputedStyleDeclarationTest, CSSTextSetterRaisesException) {
   scoped_refptr<CSSComputedStyleDeclaration> style =
diff --git a/cobalt/cssom/css_condition_rule.h b/cobalt/cssom/css_condition_rule.h
index dd78bb7..197bebe 100644
--- a/cobalt/cssom/css_condition_rule.h
+++ b/cobalt/cssom/css_condition_rule.h
@@ -41,9 +41,7 @@
   // Custom, not in any spec.
   //
   // From CSSRule.
-  void Accept(CSSRuleVisitor* visitor) override {
-    NOTREACHED();
-  }
+  void Accept(CSSRuleVisitor* visitor) override { NOTREACHED(); }
 
   // Returns the cached result of evaluating the condition.
   bool condition_value() { return cached_condition_value_; }
diff --git a/cobalt/cssom/css_declared_style_data.cc b/cobalt/cssom/css_declared_style_data.cc
index b5eae46..1f0e8b4 100644
--- a/cobalt/cssom/css_declared_style_data.cc
+++ b/cobalt/cssom/css_declared_style_data.cc
@@ -152,7 +152,8 @@
        property_value_iterator != declared_property_values_.end();
        ++property_value_iterator) {
     if (!property_value_iterator->second->Equals(
-            *that.declared_property_values_.find(property_value_iterator->first)
+            *that.declared_property_values_
+                 .find(property_value_iterator->first)
                  ->second)) {
       return false;
     }
diff --git a/cobalt/cssom/css_declared_style_data_test.cc b/cobalt/cssom/css_declared_style_data_test.cc
index a3f8cef..c3afa40 100644
--- a/cobalt/cssom/css_declared_style_data_test.cc
+++ b/cobalt/cssom/css_declared_style_data_test.cc
@@ -20,7 +20,6 @@
 #include "cobalt/cssom/length_value.h"
 #include "cobalt/cssom/property_definitions.h"
 #include "cobalt/cssom/rgba_color_value.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/cssom/css_declared_style_declaration_test.cc b/cobalt/cssom/css_declared_style_declaration_test.cc
index 5e3b92b..abd0322 100644
--- a/cobalt/cssom/css_declared_style_declaration_test.cc
+++ b/cobalt/cssom/css_declared_style_declaration_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/cssom/css_declared_style_declaration.h"
+
 #include "cobalt/cssom/css_declared_style_data.h"
 #include "cobalt/cssom/css_parser.h"
 #include "cobalt/cssom/css_style_rule.h"
diff --git a/cobalt/cssom/css_font_face_declaration_data.cc b/cobalt/cssom/css_font_face_declaration_data.cc
index 1b5efd3..552c65b 100644
--- a/cobalt/cssom/css_font_face_declaration_data.cc
+++ b/cobalt/cssom/css_font_face_declaration_data.cc
@@ -47,8 +47,8 @@
 scoped_refptr<PropertyValue> CSSFontFaceDeclarationData::GetPropertyValue(
     PropertyKey key) const {
   scoped_refptr<PropertyValue>* property_value_reference =
-      const_cast<CSSFontFaceDeclarationData*>(this)
-          ->GetPropertyValueReference(key);
+      const_cast<CSSFontFaceDeclarationData*>(this)->GetPropertyValueReference(
+          key);
   return property_value_reference ? *property_value_reference : NULL;
 }
 
diff --git a/cobalt/cssom/css_font_face_declaration_data_test.cc b/cobalt/cssom/css_font_face_declaration_data_test.cc
index a7287fa..6eabfd4 100644
--- a/cobalt/cssom/css_font_face_declaration_data_test.cc
+++ b/cobalt/cssom/css_font_face_declaration_data_test.cc
@@ -16,7 +16,6 @@
 
 #include "cobalt/cssom/keyword_value.h"
 #include "cobalt/cssom/property_definitions.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/cssom/css_font_face_rule_test.cc b/cobalt/cssom/css_font_face_rule_test.cc
index 9245801..7338325 100644
--- a/cobalt/cssom/css_font_face_rule_test.cc
+++ b/cobalt/cssom/css_font_face_rule_test.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/cssom/css_font_face_rule.h"
 
+#include <memory>
+#include <utility>
+
 #include "cobalt/cssom/css_font_face_declaration_data.h"
 #include "cobalt/cssom/css_style_sheet.h"
 #include "cobalt/cssom/font_style_value.h"
diff --git a/cobalt/cssom/css_grouping_rule.h b/cobalt/cssom/css_grouping_rule.h
index 4d364f2..55d7e0e 100644
--- a/cobalt/cssom/css_grouping_rule.h
+++ b/cobalt/cssom/css_grouping_rule.h
@@ -49,9 +49,7 @@
   // Custom, not in any spec.
   //
   // From CSSRule.
-  void Accept(CSSRuleVisitor* visitor) override {
-    NOTREACHED();
-  }
+  void Accept(CSSRuleVisitor* visitor) override { NOTREACHED(); }
 
   void SetIndex(int index) override;
   int IndexWidth() const override;
diff --git a/cobalt/cssom/css_property_definitions_test.cc b/cobalt/cssom/css_property_definitions_test.cc
index 20d3009..cd528a1 100644
--- a/cobalt/cssom/css_property_definitions_test.cc
+++ b/cobalt/cssom/css_property_definitions_test.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "cobalt/cssom/property_definitions.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/cssom/css_style_sheet_test.cc b/cobalt/cssom/css_style_sheet_test.cc
index edd0825..5c17d59 100644
--- a/cobalt/cssom/css_style_sheet_test.cc
+++ b/cobalt/cssom/css_style_sheet_test.cc
@@ -12,16 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
+#include "cobalt/cssom/css_style_sheet.h"
 
-#include "cobalt/cssom/css_rule_list.h"
+#include <memory>
+#include <utility>
 
 #include "cobalt/cssom/css_media_rule.h"
 #include "cobalt/cssom/css_parser.h"
+#include "cobalt/cssom/css_rule_list.h"
 #include "cobalt/cssom/css_rule_style_declaration.h"
 #include "cobalt/cssom/css_style_declaration.h"
 #include "cobalt/cssom/css_style_rule.h"
-#include "cobalt/cssom/css_style_sheet.h"
 #include "cobalt/cssom/length_value.h"
 #include "cobalt/cssom/media_feature.h"
 #include "cobalt/cssom/media_feature_keyword_value.h"
diff --git a/cobalt/cssom/css_transition_set.cc b/cobalt/cssom/css_transition_set.cc
index 8a6787d..a310e1c 100644
--- a/cobalt/cssom/css_transition_set.cc
+++ b/cobalt/cssom/css_transition_set.cc
@@ -16,6 +16,7 @@
 
 #include <algorithm>
 #include <cmath>
+#include <utility>
 
 #include "base/lazy_instance.h"
 #include "cobalt/base/polymorphic_downcast.h"
@@ -139,7 +140,7 @@
   scoped_refptr<PropertyValue> current_value_within_old_transition =
       old_transition.Evaluate(current_time);
 
-  // If the new transition is a reversal fo the old transition, we need to
+  // If the new transition is a reversal of the old transition, we need to
   // setup reversing_adjusted_start_value and reversing_shortening_factor so
   // that they can be used to reduce the new transition's duration.
   scoped_refptr<PropertyValue> new_reversing_adjusted_start_value;
diff --git a/cobalt/cssom/css_transition_set_test.cc b/cobalt/cssom/css_transition_set_test.cc
index d94a45a..b789693 100644
--- a/cobalt/cssom/css_transition_set_test.cc
+++ b/cobalt/cssom/css_transition_set_test.cc
@@ -12,12 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/cssom/css_transition_set.h"
+
 #include <memory>
+#include <utility>
 
 #include "base/time/time.h"
 #include "cobalt/cssom/css_computed_style_data.h"
 #include "cobalt/cssom/css_transition.h"
-#include "cobalt/cssom/css_transition_set.h"
 #include "cobalt/cssom/keyword_value.h"
 #include "cobalt/cssom/length_value.h"
 #include "cobalt/cssom/number_value.h"
@@ -28,7 +30,6 @@
 #include "cobalt/cssom/time_list_value.h"
 #include "cobalt/cssom/timing_function.h"
 #include "cobalt/cssom/timing_function_list_value.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/cssom/filter_function_list_value.h b/cobalt/cssom/filter_function_list_value.h
index 7bcbc0b..cb9cce6 100644
--- a/cobalt/cssom/filter_function_list_value.h
+++ b/cobalt/cssom/filter_function_list_value.h
@@ -16,6 +16,7 @@
 #define COBALT_CSSOM_FILTER_FUNCTION_LIST_VALUE_H_
 
 #include <string>
+#include <utility>
 
 #include "base/compiler_specific.h"
 #include "cobalt/base/polymorphic_equatable.h"
diff --git a/cobalt/cssom/font_weight_value.h b/cobalt/cssom/font_weight_value.h
index 0a6e33b..25f808e 100644
--- a/cobalt/cssom/font_weight_value.h
+++ b/cobalt/cssom/font_weight_value.h
@@ -39,10 +39,10 @@
     kLightAka300,
     kNormalAka400,
     kMediumAka500,
-    kSemiBoldAka600,    // same as Demi Bold
+    kSemiBoldAka600,  // same as Demi Bold
     kBoldAka700,
-    kExtraBoldAka800,   // same as Ultra Bold
-    kBlackAka900,       // same as Heavy
+    kExtraBoldAka800,  // same as Ultra Bold
+    kBlackAka900,      // same as Heavy
   };
 
   // For the sake of saving memory an explicit instantiation of this class
diff --git a/cobalt/cssom/interpolate_property_value_test.cc b/cobalt/cssom/interpolate_property_value_test.cc
index 548594a..cfc8805 100644
--- a/cobalt/cssom/interpolate_property_value_test.cc
+++ b/cobalt/cssom/interpolate_property_value_test.cc
@@ -12,14 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/cssom/interpolate_property_value.h"
+
 #include <cmath>
+#include <utility>
 
 #include "base/time/time.h"
 #include "cobalt/cssom/calc_value.h"
 #include "cobalt/cssom/cobalt_ui_nav_focus_transform_function.h"
 #include "cobalt/cssom/cobalt_ui_nav_spotlight_transform_function.h"
 #include "cobalt/cssom/css_transition.h"
-#include "cobalt/cssom/interpolate_property_value.h"
 #include "cobalt/cssom/interpolated_transform_property_value.h"
 #include "cobalt/cssom/keyword_value.h"
 #include "cobalt/cssom/length_value.h"
diff --git a/cobalt/cssom/interpolated_transform_property_value.cc b/cobalt/cssom/interpolated_transform_property_value.cc
index ea31222..0de8d3b 100644
--- a/cobalt/cssom/interpolated_transform_property_value.cc
+++ b/cobalt/cssom/interpolated_transform_property_value.cc
@@ -23,9 +23,7 @@
 InterpolatedTransformPropertyValue::InterpolatedTransformPropertyValue(
     TransformPropertyValue* start_value, TransformPropertyValue* end_value,
     float progress)
-    : start_value_(start_value),
-      end_value_(end_value),
-      progress_(progress) {
+    : start_value_(start_value), end_value_(end_value), progress_(progress) {
   DCHECK(start_value);
   DCHECK(end_value);
 }
@@ -44,8 +42,7 @@
     const scoped_refptr<ui_navigation::NavItem>& used_ui_nav_focus) const {
   return math::InterpolateMatrices(
       start_value_->ToMatrix(used_size, used_ui_nav_focus),
-      end_value_->ToMatrix(used_size, used_ui_nav_focus),
-      progress_);
+      end_value_->ToMatrix(used_size, used_ui_nav_focus), progress_);
 }
 
 }  // namespace cssom
diff --git a/cobalt/cssom/interpolated_transform_property_value.h b/cobalt/cssom/interpolated_transform_property_value.h
index ad271dd..cdff3fb 100644
--- a/cobalt/cssom/interpolated_transform_property_value.h
+++ b/cobalt/cssom/interpolated_transform_property_value.h
@@ -38,8 +38,8 @@
   }
 
   math::Matrix3F ToMatrix(const math::SizeF& used_size,
-      const scoped_refptr<ui_navigation::NavItem>& used_ui_nav_focus)
-      const override;
+                          const scoped_refptr<ui_navigation::NavItem>&
+                              used_ui_nav_focus) const override;
 
   bool operator==(const InterpolatedTransformPropertyValue& other) const {
     return progress_ == other.progress_ &&
diff --git a/cobalt/cssom/linear_gradient_value.h b/cobalt/cssom/linear_gradient_value.h
index bb50727..44a0e44 100644
--- a/cobalt/cssom/linear_gradient_value.h
+++ b/cobalt/cssom/linear_gradient_value.h
@@ -16,6 +16,7 @@
 #define COBALT_CSSOM_LINEAR_GRADIENT_VALUE_H_
 
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/basictypes.h"
diff --git a/cobalt/cssom/list_value.h b/cobalt/cssom/list_value.h
index 8658928..f4be9f3 100644
--- a/cobalt/cssom/list_value.h
+++ b/cobalt/cssom/list_value.h
@@ -16,6 +16,7 @@
 #define COBALT_CSSOM_LIST_VALUE_H_
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "base/basictypes.h"
diff --git a/cobalt/cssom/map_to_mesh_function.h b/cobalt/cssom/map_to_mesh_function.h
index 3a888e7..09e495f 100644
--- a/cobalt/cssom/map_to_mesh_function.h
+++ b/cobalt/cssom/map_to_mesh_function.h
@@ -17,6 +17,8 @@
 
 #include <memory>
 #include <string>
+#include <utility>
+#include <vector>
 
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
diff --git a/cobalt/cssom/media_query.cc b/cobalt/cssom/media_query.cc
index 252f5ce..6b4cdbc 100644
--- a/cobalt/cssom/media_query.cc
+++ b/cobalt/cssom/media_query.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/cssom/media_query.h"
 
+#include <memory>
+
 #include "base/memory/ref_counted.h"
 #include "cobalt/cssom/media_feature.h"
 #include "cobalt/cssom/viewport_size.h"
diff --git a/cobalt/cssom/media_query_test.cc b/cobalt/cssom/media_query_test.cc
index 6aba6b8..90938a8 100644
--- a/cobalt/cssom/media_query_test.cc
+++ b/cobalt/cssom/media_query_test.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/cssom/media_query.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/memory/ref_counted.h"
 #include "cobalt/cssom/length_value.h"
 #include "cobalt/cssom/media_feature.h"
diff --git a/cobalt/cssom/not_pseudo_class.cc b/cobalt/cssom/not_pseudo_class.cc
index a206a21..eb6d85d 100644
--- a/cobalt/cssom/not_pseudo_class.cc
+++ b/cobalt/cssom/not_pseudo_class.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/cssom/not_pseudo_class.h"
 
+#include <memory>
+#include <utility>
+
 #include "cobalt/cssom/compound_selector.h"
 #include "cobalt/cssom/selector_visitor.h"
 
diff --git a/cobalt/cssom/not_pseudo_class.h b/cobalt/cssom/not_pseudo_class.h
index f028015..abb4da6 100644
--- a/cobalt/cssom/not_pseudo_class.h
+++ b/cobalt/cssom/not_pseudo_class.h
@@ -35,8 +35,7 @@
 //   https://www.w3.org/TR/selectors4/#negation-pseudo
 class NotPseudoClass : public PseudoClass {
  public:
-  NotPseudoClass()
-      : PseudoClass(base::Tokens::not_pseudo_class_selector()) {}
+  NotPseudoClass() : PseudoClass(base::Tokens::not_pseudo_class_selector()) {}
   ~NotPseudoClass() override {}
 
   // From Selector.
diff --git a/cobalt/cssom/property_definitions.cc b/cobalt/cssom/property_definitions.cc
index 6a4db89..382d936 100644
--- a/cobalt/cssom/property_definitions.cc
+++ b/cobalt/cssom/property_definitions.cc
@@ -16,6 +16,7 @@
 
 #include <algorithm>
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "base/bind.h"
diff --git a/cobalt/cssom/property_key_list_value.h b/cobalt/cssom/property_key_list_value.h
index 5dd0774..e275c2e 100644
--- a/cobalt/cssom/property_key_list_value.h
+++ b/cobalt/cssom/property_key_list_value.h
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
diff --git a/cobalt/cssom/property_list_value.h b/cobalt/cssom/property_list_value.h
index d938d37..9056de2 100644
--- a/cobalt/cssom/property_list_value.h
+++ b/cobalt/cssom/property_list_value.h
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/compiler_specific.h"
 #include "cobalt/base/polymorphic_equatable.h"
diff --git a/cobalt/cssom/property_value_to_string_test.cc b/cobalt/cssom/property_value_to_string_test.cc
index 609e2b2..9a1bc8d 100644
--- a/cobalt/cssom/property_value_to_string_test.cc
+++ b/cobalt/cssom/property_value_to_string_test.cc
@@ -14,8 +14,6 @@
 
 #include <memory>
 
-#include "cobalt/cssom/property_value.h"
-
 #include "base/memory/ptr_util.h"
 #include "base/time/time.h"
 #include "cobalt/cssom/absolute_url_value.h"
@@ -36,6 +34,7 @@
 #include "cobalt/cssom/property_definitions.h"
 #include "cobalt/cssom/property_key_list_value.h"
 #include "cobalt/cssom/property_list_value.h"
+#include "cobalt/cssom/property_value.h"
 #include "cobalt/cssom/radial_gradient_value.h"
 #include "cobalt/cssom/ratio_value.h"
 #include "cobalt/cssom/resolution_value.h"
diff --git a/cobalt/cssom/property_value_visitor.cc b/cobalt/cssom/property_value_visitor.cc
index 1156137..b94a999 100644
--- a/cobalt/cssom/property_value_visitor.cc
+++ b/cobalt/cssom/property_value_visitor.cc
@@ -70,8 +70,7 @@
   VisitDefault(font_weight_value);
 }
 
-void DefaultingPropertyValueVisitor::VisitInteger(
-    IntegerValue* integer_value) {
+void DefaultingPropertyValueVisitor::VisitInteger(IntegerValue* integer_value) {
   VisitDefault(integer_value);
 }
 
diff --git a/cobalt/cssom/property_value_visitor_test.cc b/cobalt/cssom/property_value_visitor_test.cc
index 11762be..27854ac 100644
--- a/cobalt/cssom/property_value_visitor_test.cc
+++ b/cobalt/cssom/property_value_visitor_test.cc
@@ -15,6 +15,7 @@
 #include "cobalt/cssom/property_value_visitor.h"
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "cobalt/cssom/absolute_url_value.h"
@@ -261,7 +262,7 @@
 
 TEST(PropertyValueVisitorTest, VisitsShadowValue) {
   scoped_refptr<ShadowValue> shadow_value =
-      new ShadowValue(std::vector<scoped_refptr<LengthValue> >(),
+      new ShadowValue(std::vector<scoped_refptr<LengthValue>>(),
                       new RGBAColorValue(0x0047abff), false);
   MockPropertyValueVisitor mock_visitor;
   EXPECT_CALL(mock_visitor, VisitShadow(shadow_value.get()));
@@ -322,8 +323,8 @@
   scoped_refptr<InterpolatedTransformPropertyValue> interpolated_value(
       new InterpolatedTransformPropertyValue(start_value, end_value, 0.5f));
   MockPropertyValueVisitor mock_visitor;
-  EXPECT_CALL(mock_visitor, VisitTransformPropertyValue(
-      interpolated_value.get()));
+  EXPECT_CALL(mock_visitor,
+              VisitTransformPropertyValue(interpolated_value.get()));
   interpolated_value->Accept(&mock_visitor);
 }
 
diff --git a/cobalt/cssom/radial_gradient_value.h b/cobalt/cssom/radial_gradient_value.h
index bcef848..87aa71a 100644
--- a/cobalt/cssom/radial_gradient_value.h
+++ b/cobalt/cssom/radial_gradient_value.h
@@ -16,6 +16,7 @@
 #define COBALT_CSSOM_RADIAL_GRADIENT_VALUE_H_
 
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/basictypes.h"
@@ -80,9 +81,7 @@
 
   const scoped_refptr<PropertyListValue>& position() const { return position_; }
 
-  const ColorStopList& color_stop_list() const {
-    return color_stop_list_;
-  }
+  const ColorStopList& color_stop_list() const { return color_stop_list_; }
 
   std::string ToString() const override;
 
diff --git a/cobalt/cssom/resolution_value.cc b/cobalt/cssom/resolution_value.cc
index 9381048..a578f1a 100644
--- a/cobalt/cssom/resolution_value.cc
+++ b/cobalt/cssom/resolution_value.cc
@@ -35,9 +35,10 @@
 }
 
 std::string ResolutionValue::ToString() const {
-  return base::StringPrintf(
-      "%.7g%s", value_,
-      unit_ == kDPIUnit ? "dpi" : unit_ == kDPCMUnit ? "dpcm" : "");
+  return base::StringPrintf("%.7g%s", value_,
+                            unit_ == kDPIUnit    ? "dpi"
+                            : unit_ == kDPCMUnit ? "dpcm"
+                                                 : "");
 }
 
 }  // namespace cssom
diff --git a/cobalt/cssom/rotate_function.h b/cobalt/cssom/rotate_function.h
index ccfc11b..2b19e0f 100644
--- a/cobalt/cssom/rotate_function.h
+++ b/cobalt/cssom/rotate_function.h
@@ -47,8 +47,8 @@
   }
 
   math::Matrix3F ToMatrix(const math::SizeF& used_size,
-      const scoped_refptr<ui_navigation::NavItem>& used_ui_nav_focus)
-      const override;
+                          const scoped_refptr<ui_navigation::NavItem>&
+                              used_ui_nav_focus) const override;
 
   bool operator==(const RotateFunction& other) const {
     return clockwise_angle_in_radians_ == other.clockwise_angle_in_radians_;
diff --git a/cobalt/cssom/scale_function.h b/cobalt/cssom/scale_function.h
index 252a078..33a0333 100644
--- a/cobalt/cssom/scale_function.h
+++ b/cobalt/cssom/scale_function.h
@@ -50,8 +50,8 @@
   }
 
   math::Matrix3F ToMatrix(const math::SizeF& used_size,
-      const scoped_refptr<ui_navigation::NavItem>& used_ui_nav_focus)
-      const override;
+                          const scoped_refptr<ui_navigation::NavItem>&
+                              used_ui_nav_focus) const override;
 
   bool operator==(const ScaleFunction& other) const {
     return x_factor_ == other.x_factor_ && y_factor_ == other.y_factor_;
diff --git a/cobalt/cssom/scoped_list_value.h b/cobalt/cssom/scoped_list_value.h
index 0577930..0ec7fe3 100644
--- a/cobalt/cssom/scoped_list_value.h
+++ b/cobalt/cssom/scoped_list_value.h
@@ -16,6 +16,8 @@
 #define COBALT_CSSOM_SCOPED_LIST_VALUE_H_
 
 #include <memory>
+#include <utility>
+#include <vector>
 
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
diff --git a/cobalt/cssom/scoped_ref_list_value.h b/cobalt/cssom/scoped_ref_list_value.h
index fc7f8fb..0cd6ccf 100644
--- a/cobalt/cssom/scoped_ref_list_value.h
+++ b/cobalt/cssom/scoped_ref_list_value.h
@@ -16,6 +16,7 @@
 #define COBALT_CSSOM_SCOPED_REF_LIST_VALUE_H_
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "base/basictypes.h"
diff --git a/cobalt/cssom/selector.h b/cobalt/cssom/selector.h
index 7a12aa8..83a5405 100644
--- a/cobalt/cssom/selector.h
+++ b/cobalt/cssom/selector.h
@@ -16,6 +16,7 @@
 #define COBALT_CSSOM_SELECTOR_H_
 
 #include <memory>
+#include <vector>
 
 #include "cobalt/cssom/specificity.h"
 
diff --git a/cobalt/cssom/selector_test.cc b/cobalt/cssom/selector_test.cc
index 43381b7..e856823 100644
--- a/cobalt/cssom/selector_test.cc
+++ b/cobalt/cssom/selector_test.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/cssom/selector.h"
 
+#include <memory>
+#include <utility>
+
 #include "cobalt/cssom/child_combinator.h"
 #include "cobalt/cssom/class_selector.h"
 #include "cobalt/cssom/complex_selector.h"
@@ -123,8 +124,7 @@
     complex_selector->AppendSelector(
         std::unique_ptr<CompoundSelector>(new CompoundSelector()));
 
-    for (int i = 0; i < ComplexSelector::kCombinatorLimit;
-         i++) {
+    for (int i = 0; i < ComplexSelector::kCombinatorLimit; i++) {
       std::unique_ptr<CompoundSelector> compound_selector(
           new CompoundSelector());
       std::unique_ptr<ChildCombinator> child_combinator(new ChildCombinator());
@@ -142,9 +142,7 @@
     complex_selector->AppendSelector(
         std::unique_ptr<CompoundSelector>(new CompoundSelector()));
 
-    for (int i = 0;
-         i < 2 * ComplexSelector::kCombinatorLimit + 1;
-         i++) {
+    for (int i = 0; i < 2 * ComplexSelector::kCombinatorLimit + 1; i++) {
       std::unique_ptr<CompoundSelector> compound_selector(
           new CompoundSelector());
       std::unique_ptr<ChildCombinator> child_combinator(new ChildCombinator());
diff --git a/cobalt/cssom/selector_tree.cc b/cobalt/cssom/selector_tree.cc
index 6dc91db..bd41332 100644
--- a/cobalt/cssom/selector_tree.cc
+++ b/cobalt/cssom/selector_tree.cc
@@ -16,9 +16,7 @@
 
 #include <set>
 
-#if defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
 #include "cobalt/base/version_compatibility.h"
-#endif  // defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
 #include "cobalt/cssom/complex_selector.h"
 #include "cobalt/cssom/compound_selector.h"
 #include "cobalt/cssom/css_style_rule.h"
@@ -76,7 +74,6 @@
   return owned_nodes_map_[std::make_pair(node, combinator)];
 }
 
-#if defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
 namespace {
 
 // This uses the old CompoundSelector compare logic that had a bug where 'not'
@@ -178,7 +175,6 @@
 bool SelectorTree::ValidateVersionCompatibility() const {
   return !HasNotPseudoClassCompatibilityViolations(owned_nodes_map_);
 }
-#endif  // defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
 
 SelectorTree::Node* SelectorTree::GetOrCreateNodeForComplexSelector(
     ComplexSelector* complex_selector) {
diff --git a/cobalt/cssom/selector_tree.h b/cobalt/cssom/selector_tree.h
index b02a176..a42d2ae 100644
--- a/cobalt/cssom/selector_tree.h
+++ b/cobalt/cssom/selector_tree.h
@@ -202,11 +202,9 @@
   // Used by unit tests only.
   const OwnedNodes& children(const Node* node, CombinatorType combinator);
 
-#if defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
   // Validates the selector tree's compatibility against pre-selected versions
   // of Cobalt. Returns true if there are no version compatibility violations.
   bool ValidateVersionCompatibility() const;
-#endif  // defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
 
  private:
   // Gets or creates node for complex selector, starting from root.
diff --git a/cobalt/cssom/selector_tree_test.cc b/cobalt/cssom/selector_tree_test.cc
index 38f7cac..42d9493 100644
--- a/cobalt/cssom/selector_tree_test.cc
+++ b/cobalt/cssom/selector_tree_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/cssom/selector_tree.h"
 
+#include <memory>
+
 #include "cobalt/base/version_compatibility.h"
 #include "cobalt/css_parser/parser.h"
 #include "cobalt/cssom/css_style_rule.h"
diff --git a/cobalt/cssom/serializer.cc b/cobalt/cssom/serializer.cc
index d7cf50f..c7f8ad2 100644
--- a/cobalt/cssom/serializer.cc
+++ b/cobalt/cssom/serializer.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/cssom/serializer.h"
+
 #include "cobalt/cssom/active_pseudo_class.h"
 #include "cobalt/cssom/after_pseudo_element.h"
 #include "cobalt/cssom/attribute_selector.h"
diff --git a/cobalt/cssom/serializer_test.cc b/cobalt/cssom/serializer_test.cc
index 3429edc..eb1a192 100644
--- a/cobalt/cssom/serializer_test.cc
+++ b/cobalt/cssom/serializer_test.cc
@@ -14,6 +14,9 @@
 
 #include "cobalt/cssom/serializer.h"
 
+#include <memory>
+#include <vector>
+
 #include "cobalt/base/token.h"
 #include "cobalt/css_parser/parser.h"
 #include "cobalt/cssom/css_style_rule.h"
diff --git a/cobalt/cssom/time_list_value.cc b/cobalt/cssom/time_list_value.cc
index 1dce453..edb7c7f 100644
--- a/cobalt/cssom/time_list_value.cc
+++ b/cobalt/cssom/time_list_value.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/cssom/time_list_value.h"
+
 #include <inttypes.h>
 
 #include "base/strings/stringprintf.h"
-#include "cobalt/cssom/time_list_value.h"
 
 namespace cobalt {
 namespace cssom {
diff --git a/cobalt/cssom/time_list_value.h b/cobalt/cssom/time_list_value.h
index ba3eef0..4b8d8b1 100644
--- a/cobalt/cssom/time_list_value.h
+++ b/cobalt/cssom/time_list_value.h
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
diff --git a/cobalt/cssom/timing_function_list_value.h b/cobalt/cssom/timing_function_list_value.h
index f1e97e3..e597f94 100644
--- a/cobalt/cssom/timing_function_list_value.h
+++ b/cobalt/cssom/timing_function_list_value.h
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/compiler_specific.h"
 #include "cobalt/base/polymorphic_equatable.h"
diff --git a/cobalt/cssom/timing_function_test.cc b/cobalt/cssom/timing_function_test.cc
index c8f6872..d3aaf67 100644
--- a/cobalt/cssom/timing_function_test.cc
+++ b/cobalt/cssom/timing_function_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/cssom/timing_function.h"
+
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/cssom/transform_function.h b/cobalt/cssom/transform_function.h
index 9e586c8..120d07d 100644
--- a/cobalt/cssom/transform_function.h
+++ b/cobalt/cssom/transform_function.h
@@ -51,7 +51,8 @@
 
   virtual std::string ToString() const = 0;
 
-  virtual math::Matrix3F ToMatrix(const math::SizeF& used_size,
+  virtual math::Matrix3F ToMatrix(
+      const math::SizeF& used_size,
       const scoped_refptr<ui_navigation::NavItem>& used_ui_nav_focus) const = 0;
 
   virtual ~TransformFunction() {}
diff --git a/cobalt/cssom/transform_function_list_value.cc b/cobalt/cssom/transform_function_list_value.cc
index 95f0d71..35e7a12 100644
--- a/cobalt/cssom/transform_function_list_value.cc
+++ b/cobalt/cssom/transform_function_list_value.cc
@@ -14,15 +14,15 @@
 
 #include "cobalt/cssom/transform_function_list_value.h"
 
+#include <utility>
+
 namespace cobalt {
 namespace cssom {
 
-TransformFunctionListValue::Builder::Builder()
-    : traits_(0) {}
+TransformFunctionListValue::Builder::Builder() : traits_(0) {}
 
 TransformFunctionListValue::Builder::Builder(Builder&& other)
-    : functions_(std::move(other.functions_)),
-      traits_(other.traits_) {}
+    : functions_(std::move(other.functions_)), traits_(other.traits_) {}
 
 void TransformFunctionListValue::Builder::emplace_back(
     TransformFunction* function) {
diff --git a/cobalt/cssom/transform_function_list_value.h b/cobalt/cssom/transform_function_list_value.h
index eccc723..9c39a01 100644
--- a/cobalt/cssom/transform_function_list_value.h
+++ b/cobalt/cssom/transform_function_list_value.h
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/compiler_specific.h"
@@ -72,8 +73,8 @@
   }
 
   math::Matrix3F ToMatrix(const math::SizeF& used_size,
-      const scoped_refptr<ui_navigation::NavItem>& used_ui_nav_focus)
-      const override;
+                          const scoped_refptr<ui_navigation::NavItem>&
+                              used_ui_nav_focus) const override;
 
   bool operator==(const TransformFunctionListValue& other) const;
 
diff --git a/cobalt/cssom/transform_property_value.h b/cobalt/cssom/transform_property_value.h
index f707aaf..ceaa3be 100644
--- a/cobalt/cssom/transform_property_value.h
+++ b/cobalt/cssom/transform_property_value.h
@@ -37,7 +37,8 @@
   // Returns whether the transform has any functions with the specified trait.
   virtual bool HasTrait(TransformFunction::Trait trait) const = 0;
 
-  virtual math::Matrix3F ToMatrix(const math::SizeF& used_size,
+  virtual math::Matrix3F ToMatrix(
+      const math::SizeF& used_size,
       const scoped_refptr<ui_navigation::NavItem>& used_ui_nav_focus) const = 0;
 };
 
diff --git a/cobalt/cssom/translate_function.cc b/cobalt/cssom/translate_function.cc
index dae29cd..a018a9a 100644
--- a/cobalt/cssom/translate_function.cc
+++ b/cobalt/cssom/translate_function.cc
@@ -25,7 +25,7 @@
 namespace cssom {
 
 TranslateFunction::TranslateFunction(Axis axis,
-    const scoped_refptr<PropertyValue>& offset)
+                                     const scoped_refptr<PropertyValue>& offset)
     : axis_(axis), offset_(offset) {
   DCHECK(offset);
   if (offset_type() == kLength && offset_as_length()->IsUnitRelative()) {
@@ -124,16 +124,16 @@
     const scoped_refptr<ui_navigation::NavItem>& used_ui_nav_focus) const {
   switch (axis_) {
     case kXAxis:
-      return math::TranslateMatrix(length_component_in_pixels() +
-                                   percentage_component() * used_size.width(),
-                                   0.0f);
+      return math::TranslateMatrix(
+          length_component_in_pixels() +
+              percentage_component() * used_size.width(),
+          0.0f);
     case kYAxis:
-      return math::TranslateMatrix(0.0f,
-                                   length_component_in_pixels() +
-                                   percentage_component() * used_size.height());
+      return math::TranslateMatrix(
+          0.0f, length_component_in_pixels() +
+                    percentage_component() * used_size.height());
     case kZAxis:
-      if (length_component_in_pixels() != 0 ||
-          percentage_component() != 0) {
+      if (length_component_in_pixels() != 0 || percentage_component() != 0) {
         LOG(ERROR) << "translateZ is currently a noop in Cobalt.";
       }
       break;
diff --git a/cobalt/cssom/translate_function.h b/cobalt/cssom/translate_function.h
index 3a84ab1..70033f4 100644
--- a/cobalt/cssom/translate_function.h
+++ b/cobalt/cssom/translate_function.h
@@ -70,8 +70,8 @@
   std::string ToString() const override;
 
   math::Matrix3F ToMatrix(const math::SizeF& used_size,
-      const scoped_refptr<ui_navigation::NavItem>& used_ui_nav_focus)
-      const override;
+                          const scoped_refptr<ui_navigation::NavItem>&
+                              used_ui_nav_focus) const override;
 
   bool operator==(const TranslateFunction& other) const {
     return offset_->Equals(*other.offset_) && axis_ == other.axis_;
diff --git a/cobalt/debug/BUILD.gn b/cobalt/debug/BUILD.gn
index 2c48c85..0bdf9b5 100644
--- a/cobalt/debug/BUILD.gn
+++ b/cobalt/debug/BUILD.gn
@@ -92,6 +92,9 @@
       "console/command_manager.cc",
       "console/command_manager.h",
     ]
-    deps = [ "//cobalt/base" ]
+    deps = [
+      "//cobalt/base",
+      "//starboard:starboard_headers_only",
+    ]
   }
 }
diff --git a/cobalt/debug/backend/command_map.h b/cobalt/debug/backend/command_map.h
index 919fc36..40467eb 100644
--- a/cobalt/debug/backend/command_map.h
+++ b/cobalt/debug/backend/command_map.h
@@ -17,6 +17,7 @@
 
 #include <map>
 #include <string>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/optional.h"
diff --git a/cobalt/debug/backend/log_agent.cc b/cobalt/debug/backend/log_agent.cc
index 9fc974a..593fb0a 100644
--- a/cobalt/debug/backend/log_agent.cc
+++ b/cobalt/debug/backend/log_agent.cc
@@ -14,13 +14,22 @@
 
 #include "cobalt/debug/backend/log_agent.h"
 
+#include "base/bind.h"
 #include "base/logging.h"
+#include "cobalt/debug/console/command_manager.h"
 
 namespace cobalt {
 namespace debug {
 namespace backend {
 
 namespace {
+const char kDebugLogCommand[] = "debug_log";
+const char kDebugLogCommandShortHelp[] =
+    "Turns browser debug logging on or off.";
+const char kDebugLogCommandLongHelp[] =
+    "When turned on, browser logs are sent in such a way that they are visible "
+    "in devtools.";
+
 // Error levels:
 constexpr char kInfoLevel[] = "info";
 constexpr char kWarningLevel[] = "warning";
@@ -42,7 +51,21 @@
 }
 }  // namespace
 
-LogAgent::LogAgent(DebugDispatcher* dispatcher) : AgentBase("Log", dispatcher) {
+void LogAgent::OnDebugLog(const std::string& message) {
+  SetDebugLog(console::ConsoleCommandManager::CommandHandler::IsOnEnableOrTrue(
+      message));
+}
+void LogAgent::SetDebugLog(bool enable) {
+  event_method_ = domain_ + (enable ? ".entryAdded" : ".browserEntryAdded");
+}
+
+LogAgent::LogAgent(DebugDispatcher* dispatcher)
+    : AgentBase("Log", dispatcher),
+      debug_log_command_handler_(
+          kDebugLogCommand,
+          base::Bind(&LogAgent::OnDebugLog, base::Unretained(this)),
+          kDebugLogCommandShortHelp, kDebugLogCommandLongHelp) {
+  SetDebugLog(false);
   // Get log output while still making it available elsewhere.
   log_message_handler_callback_id_ =
       base::LogMessageHandler::GetInstance()->AddCallback(
@@ -63,9 +86,10 @@
     // except it only shows up in the debug console and not in remote devtools.
     // TODO: Flesh out the rest of LogEntry properties (source, timestamp)
     JSONObject params(new base::DictionaryValue());
+    params->SetString("entry.source", "other");
     params->SetString("entry.text", str);
     params->SetString("entry.level", GetLogLevelFromSeverity(severity));
-    dispatcher_->SendEvent(domain_ + ".browserEntryAdded", params);
+    dispatcher_->SendEvent(event_method_, params);
   }
 
   // Don't suppress the log message.
diff --git a/cobalt/debug/backend/log_agent.h b/cobalt/debug/backend/log_agent.h
index 97e6fe0..5a6fb50 100644
--- a/cobalt/debug/backend/log_agent.h
+++ b/cobalt/debug/backend/log_agent.h
@@ -19,6 +19,7 @@
 #include "cobalt/base/log_message_handler.h"
 #include "cobalt/debug/backend/agent_base.h"
 #include "cobalt/debug/backend/debug_dispatcher.h"
+#include "cobalt/debug/console/command_manager.h"
 
 namespace cobalt {
 namespace debug {
@@ -33,6 +34,9 @@
   explicit LogAgent(DebugDispatcher* dispatcher);
   ~LogAgent();
 
+  void OnDebugLog(const std::string& message);
+  void SetDebugLog(bool enable);
+
  private:
   // Called by LogMessageHandler for each log message.
   // May be called from any thread.
@@ -46,6 +50,11 @@
 
   // The callback id of our recipient of log messages so we can unregister it.
   base::LogMessageHandler::CallbackId log_message_handler_callback_id_;
+
+  std::string event_method_;
+
+  debug::console::ConsoleCommandManager::CommandHandler
+      debug_log_command_handler_;
 };
 
 }  // namespace backend
diff --git a/cobalt/debug/backend/overlay_agent.cc b/cobalt/debug/backend/overlay_agent.cc
index a1686cd..05ceeca 100644
--- a/cobalt/debug/backend/overlay_agent.cc
+++ b/cobalt/debug/backend/overlay_agent.cc
@@ -14,6 +14,9 @@
 
 #include "cobalt/debug/backend/overlay_agent.h"
 
+#include <memory>
+#include <utility>
+
 #include "cobalt/math/clamp.h"
 #include "cobalt/math/rect_f.h"
 #include "cobalt/render_tree/brush.h"
diff --git a/cobalt/debug/backend/overlay_agent.h b/cobalt/debug/backend/overlay_agent.h
index b9186de..cbef52e 100644
--- a/cobalt/debug/backend/overlay_agent.h
+++ b/cobalt/debug/backend/overlay_agent.h
@@ -14,6 +14,8 @@
 #ifndef COBALT_DEBUG_BACKEND_OVERLAY_AGENT_H_
 #define COBALT_DEBUG_BACKEND_OVERLAY_AGENT_H_
 
+#include <memory>
+
 #include "cobalt/debug/backend/agent_base.h"
 #include "cobalt/debug/backend/debug_dispatcher.h"
 #include "cobalt/debug/backend/render_layer.h"
diff --git a/cobalt/debug/backend/page_agent.cc b/cobalt/debug/backend/page_agent.cc
index 8c96420..fdd1d2a 100644
--- a/cobalt/debug/backend/page_agent.cc
+++ b/cobalt/debug/backend/page_agent.cc
@@ -15,6 +15,7 @@
 #include "cobalt/debug/backend/page_agent.h"
 
 #include <string>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/values.h"
diff --git a/cobalt/debug/backend/script_debugger_agent.cc b/cobalt/debug/backend/script_debugger_agent.cc
index d9f024a..a1b3f86 100644
--- a/cobalt/debug/backend/script_debugger_agent.cc
+++ b/cobalt/debug/backend/script_debugger_agent.cc
@@ -15,6 +15,7 @@
 #include "cobalt/debug/backend/script_debugger_agent.h"
 
 #include <string>
+#include <utility>
 
 #include "base/strings/stringprintf.h"
 #include "cobalt/debug/json_object.h"
diff --git a/cobalt/debug/backend/tracing_agent.cc b/cobalt/debug/backend/tracing_agent.cc
index 1e10129..3c26d29 100644
--- a/cobalt/debug/backend/tracing_agent.cc
+++ b/cobalt/debug/backend/tracing_agent.cc
@@ -14,6 +14,8 @@
 
 #include "cobalt/debug/backend/tracing_agent.h"
 
+#include <utility>
+
 #include "base/bind.h"
 #include "base/values.h"
 #include "cobalt/script/script_debugger.h"
diff --git a/cobalt/debug/backend/tracing_agent.h b/cobalt/debug/backend/tracing_agent.h
index a9c0bda..f2101fb 100644
--- a/cobalt/debug/backend/tracing_agent.h
+++ b/cobalt/debug/backend/tracing_agent.h
@@ -33,7 +33,7 @@
 // TracingAgent doesn't use AgentBase.
 //
 // https://chromedevtools.github.io/devtools-protocol/tot/Tracing
-class TracingAgent : public script::ScriptDebugger::TraceDelegate  {
+class TracingAgent : public script::ScriptDebugger::TraceDelegate {
  public:
   explicit TracingAgent(DebugDispatcher* dispatcher,
                         script::ScriptDebugger* script_debugger);
diff --git a/cobalt/debug/console/command_manager.cc b/cobalt/debug/console/command_manager.cc
index a25879a..3c30ae3 100644
--- a/cobalt/debug/console/command_manager.cc
+++ b/cobalt/debug/console/command_manager.cc
@@ -15,6 +15,7 @@
 #include "cobalt/debug/console/command_manager.h"
 
 #include "base/logging.h"
+#include "starboard/string.h"
 
 namespace cobalt {
 namespace debug {
@@ -45,6 +46,16 @@
   manager->UnregisterCommandHandler(this);
 }
 
+// Returns true if the message is 'on', 'enable', or 'true'.
+// static
+bool ConsoleCommandManager::CommandHandler::IsOnEnableOrTrue(
+    const std::string& message) {
+  return (SbStringCompareNoCase("on", message.c_str()) == 0) ||
+         (SbStringCompareNoCase("enable", message.c_str()) == 0) ||
+         (SbStringCompareNoCase("true", message.c_str()) == 0);
+}
+
+
 void ConsoleCommandManager::HandleCommand(const std::string& command,
                                           const std::string& message) const {
   DCHECK_GT(command.length(), size_t(0));
diff --git a/cobalt/debug/console/command_manager.h b/cobalt/debug/console/command_manager.h
index 66a5601..1ace46c 100644
--- a/cobalt/debug/console/command_manager.h
+++ b/cobalt/debug/console/command_manager.h
@@ -61,6 +61,9 @@
     const std::string& short_help() const { return short_help_; }
     const std::string& long_help() const { return long_help_; }
 
+    // Returns true if the message is 'on', 'enable', or 'true'.
+    static bool IsOnEnableOrTrue(const std::string& message);
+
    private:
     std::string command_;
     CommandCallback callback_;
diff --git a/cobalt/debug/console/content/debugger_client.js b/cobalt/debug/console/content/debugger_client.js
index 2ceb3e0..daaa47b 100644
--- a/cobalt/debug/console/content/debugger_client.js
+++ b/cobalt/debug/console/content/debugger_client.js
@@ -16,6 +16,7 @@
   this.DEBUGGER_DETACHED = 0;
   this.DEBUGGER_ATTACHING = 1;
   this.DEBUGGER_ATTACHED = 2;
+  this.DEBUGGER_DISABLED = 3;
   this.scripts = [];
   this.attachState = this.DEBUGGER_DETACHED;
   this.onAttachCallback = this.onAttach.bind(this);
@@ -25,11 +26,11 @@
 
 // Attaches to the debugger and listens for debug events.
 // Enables the domains we care about here.
-DebuggerClient.prototype.attach = function() {
+DebuggerClient.prototype.attach = function () {
   if (this.attachState == this.DEBUGGER_DETACHED) {
     this.attachState = this.DEBUGGER_ATTACHING;
     printToMessageLog(MessageLog.INTERACTIVE,
-                      'Attempting to attach to debugger...');
+      'Attempting to attach to debugger...');
     this.scripts = [];
     debugHub.onEvent.addListener(this.onEventCallback);
     debugHub.attach(this.onAttachCallback);
@@ -38,14 +39,14 @@
     this.sendCommand('Runtime.enable');
   } else if (this.attachState == this.DEBUGGER_ATTACHING) {
     printToMessageLog(MessageLog.INTERACTIVE,
-                      'Still attempting to attach to debugger...');
+      'Still attempting to attach to debugger...');
   }
 }
 
-// Local method to list the parsed scripts the client has been notifed of
+// Local method to list the parsed scripts the client has been notified of
 // via the |Debugger.scriptParsed| event. Maps the possibly very long script id
 // from the debug dispatcher to a more human-readable 0-based index.
-DebuggerClient.prototype.getScripts = function(scriptId) {
+DebuggerClient.prototype.getScripts = function (scriptId) {
   for (var i in this.scripts) {
     var index = this.pad(i, 3);
     var scriptUrl = this.scripts[i].url;
@@ -57,7 +58,7 @@
 
 // Each debugger command has an associated callback to get the result.
 
-DebuggerClient.prototype.getScriptSource = function(scriptId) {
+DebuggerClient.prototype.getScriptSource = function (scriptId) {
   // If the id looks like an index into the local script array, look it up there.
   if (scriptId >= 0 && scriptId < this.scripts.length) {
     scriptId = this.scripts[scriptId].scriptId;
@@ -69,7 +70,7 @@
   this.sendCommand(method, params, callback);
 }
 
-DebuggerClient.prototype.getScriptSourceCallback = function(result) {
+DebuggerClient.prototype.getScriptSourceCallback = function (result) {
   var scriptSource = result.scriptSource;
   var lines = scriptSource.split('\n');
   for (var i = 0; i < lines.length; i++) {
@@ -78,7 +79,7 @@
   }
 }
 
-DebuggerClient.prototype.evaluate = function(expression, callback) {
+DebuggerClient.prototype.evaluate = function (expression, callback) {
   var method = 'Runtime.evaluate';
   var params = {};
   params.contextId = this.executionContext;
@@ -92,8 +93,8 @@
 
 // All debugger commands are routed through this method. Converts the command
 // parameters into a JSON string to pass to the debug dispatcher.
-DebuggerClient.prototype.sendCommand = function(method, commandParams,
-                                                callback) {
+DebuggerClient.prototype.sendCommand = function (method, commandParams,
+  callback) {
   var jsonParams = JSON.stringify(commandParams);
   var responseCallback = this.responseCallback.bind(this, method, callback);
   debugHub.sendCommand(method, jsonParams, responseCallback);
@@ -102,15 +103,15 @@
 // All command responses are routed through this method. Parses the JSON
 // response from the debug dispatcher, checks for errors and passes on to the
 // command-specific callback to handle the result.
-DebuggerClient.prototype.responseCallback = function(method, callback,
-                                                     responseString) {
+DebuggerClient.prototype.responseCallback = function (method, callback,
+  responseString) {
   var response = JSON.parse(responseString);
 
   if (response && response.error) {
     printToMessageLog(
-        MessageLog.ERROR,
-        '[ERROR(' + response.error.code + '):' + method + '] ' +
-            response.error.message);
+      MessageLog.ERROR,
+      '[ERROR(' + response.error.code + '):' + method + '] ' +
+      response.error.message);
   } else if (callback) {
     if (response) {
       callback(response.result);
@@ -122,10 +123,10 @@
 
 //-- Events.
 
-DebuggerClient.prototype.onAttach = function() {
+DebuggerClient.prototype.onAttach = function () {
   if (debugHub.lastError) {
     printToMessageLog(MessageLog.WARNING, 'Could not attach to debugger.');
-    this.attachState = this.DEBUGGER_DETACHED;
+    this.attachState = this.DEBUGGER_DISABLED;
   } else {
     printToMessageLog(MessageLog.INTERACTIVE, 'Debugger attached.');
     this.attachState = this.DEBUGGER_ATTACHED;
@@ -135,7 +136,7 @@
 // All events generated by the debug dispatcher are routed through this method.
 // Parses the JSON string and passes on to the appropriate handler according to
 // the method name.
-DebuggerClient.prototype.onEvent = function(method, paramString) {
+DebuggerClient.prototype.onEvent = function (method, paramString) {
   var params = JSON.parse(paramString);
   if (method == 'Console.messageAdded') {
     this.onConsoleMessageAdded(params)
@@ -152,32 +153,32 @@
   }
 }
 
-DebuggerClient.prototype.onDetached = function() {
+DebuggerClient.prototype.onDetached = function () {
   printToMessageLog(MessageLog.INTERACTIVE, 'Debugger detached.');
   this.attachState = this.DEBUGGER_DETACHED;
 }
 
-DebuggerClient.prototype.onExecutionContextCreated = function(params) {
+DebuggerClient.prototype.onExecutionContextCreated = function (params) {
   this.executionContext = params.context.id;
   printToMessageLog(MessageLog.INFO,
-                    'Execution context created: ' + this.executionContext);
+    'Execution context created: ' + this.executionContext);
 }
 
-DebuggerClient.prototype.onLogEntryAdded = function(params) {
+DebuggerClient.prototype.onLogEntryAdded = function (params) {
   printToMessageLog(params.entry.level, params.entry.text);
 }
 
 
-DebuggerClient.prototype.onConsoleMessageAdded = function(params) {
+DebuggerClient.prototype.onConsoleMessageAdded = function (params) {
   // Translate Console.messageAdded params to Runtime.consoleAPICalled params.
   var consoleApiParams = {
     type: params.message.level,
-    args: [ { type: 'string', value: params.message.text } ]
+    args: [{ type: 'string', value: params.message.text }]
   };
   this.onConsoleApiCalled(consoleApiParams);
 }
 
-DebuggerClient.prototype.onConsoleApiCalled = function(params) {
+DebuggerClient.prototype.onConsoleApiCalled = function (params) {
   var severity = params.type;
   if (severity === "assert") {
     severity = MessageLog.ERROR;
@@ -200,13 +201,13 @@
   printToMessageLog(MessageLog.CONSOLE + severity, message);
 }
 
-DebuggerClient.prototype.onScriptParsed = function(params) {
+DebuggerClient.prototype.onScriptParsed = function (params) {
   this.scripts.push(params);
 }
 
 //--- Utils.
 
-DebuggerClient.prototype.pad = function(number, minLength) {
+DebuggerClient.prototype.pad = function (number, minLength) {
   var result = number.toString();
   while (result.length < minLength) {
     result = ' ' + result;
diff --git a/cobalt/debug/console/content/message_log.js b/cobalt/debug/console/content/message_log.js
index c22b510..dfa989f 100644
--- a/cobalt/debug/console/content/message_log.js
+++ b/cobalt/debug/console/content/message_log.js
@@ -224,4 +224,3 @@
   this.displayPos = 0;
   this.displayMessages();
 }
-
diff --git a/cobalt/demos/content/animated-webp-performance-demo/10_turtle.webp b/cobalt/demos/content/animated-webp-performance-demo/10_turtle.webp
new file mode 100644
index 0000000..800df18
--- /dev/null
+++ b/cobalt/demos/content/animated-webp-performance-demo/10_turtle.webp
Binary files differ
diff --git a/cobalt/demos/content/animated-webp-performance-demo/1_fan.webp b/cobalt/demos/content/animated-webp-performance-demo/1_fan.webp
new file mode 100644
index 0000000..f982fd8
--- /dev/null
+++ b/cobalt/demos/content/animated-webp-performance-demo/1_fan.webp
Binary files differ
diff --git a/cobalt/demos/content/animated-webp-performance-demo/2_heart.webp b/cobalt/demos/content/animated-webp-performance-demo/2_heart.webp
new file mode 100644
index 0000000..79cdd39
--- /dev/null
+++ b/cobalt/demos/content/animated-webp-performance-demo/2_heart.webp
Binary files differ
diff --git a/cobalt/demos/content/animated-webp-performance-demo/3_cry.webp b/cobalt/demos/content/animated-webp-performance-demo/3_cry.webp
new file mode 100644
index 0000000..c045e21
--- /dev/null
+++ b/cobalt/demos/content/animated-webp-performance-demo/3_cry.webp
Binary files differ
diff --git a/cobalt/demos/content/animated-webp-performance-demo/4_clap.webp b/cobalt/demos/content/animated-webp-performance-demo/4_clap.webp
new file mode 100644
index 0000000..194a34c
--- /dev/null
+++ b/cobalt/demos/content/animated-webp-performance-demo/4_clap.webp
Binary files differ
diff --git a/cobalt/demos/content/animated-webp-performance-demo/5_egg.webp b/cobalt/demos/content/animated-webp-performance-demo/5_egg.webp
new file mode 100644
index 0000000..995a4cb
--- /dev/null
+++ b/cobalt/demos/content/animated-webp-performance-demo/5_egg.webp
Binary files differ
diff --git a/cobalt/demos/content/animated-webp-performance-demo/6_party.webp b/cobalt/demos/content/animated-webp-performance-demo/6_party.webp
new file mode 100644
index 0000000..d5dfb16
--- /dev/null
+++ b/cobalt/demos/content/animated-webp-performance-demo/6_party.webp
Binary files differ
diff --git a/cobalt/demos/content/animated-webp-performance-demo/7_rofl.webp b/cobalt/demos/content/animated-webp-performance-demo/7_rofl.webp
new file mode 100644
index 0000000..4c6c375
--- /dev/null
+++ b/cobalt/demos/content/animated-webp-performance-demo/7_rofl.webp
Binary files differ
diff --git a/cobalt/demos/content/animated-webp-performance-demo/8_melt.webp b/cobalt/demos/content/animated-webp-performance-demo/8_melt.webp
new file mode 100644
index 0000000..3feba61
--- /dev/null
+++ b/cobalt/demos/content/animated-webp-performance-demo/8_melt.webp
Binary files differ
diff --git a/cobalt/demos/content/animated-webp-performance-demo/9_explode.webp b/cobalt/demos/content/animated-webp-performance-demo/9_explode.webp
new file mode 100644
index 0000000..3c548ce
--- /dev/null
+++ b/cobalt/demos/content/animated-webp-performance-demo/9_explode.webp
Binary files differ
diff --git a/cobalt/demos/content/animated-webp-performance-demo/index.html b/cobalt/demos/content/animated-webp-performance-demo/index.html
new file mode 100644
index 0000000..5613cc8
--- /dev/null
+++ b/cobalt/demos/content/animated-webp-performance-demo/index.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html>
+<!--
+ | Demo to help test animated webp performance metrics.
+ | We set up decoding speed tracking on a regular interval, and make a
+ | customizeable page with varying number of decoded images.
+ -->
+<html>
+
+<head>
+  <title>WebP performance test</title>
+  <style type="text/css">
+
+    body {
+      background-color: white;
+    }
+    .image {
+      width: 100px;
+      height: 100px;
+      background-size: contain;
+      display: inline-block;
+    }
+    .highlight {
+      background-color: rgb(0, 255, 0);
+    }
+  </style>
+  <script type="text/javascript">
+    window.onload = () => {
+      var size = 100; // Default pixel size of rendered images
+      var search = window.location.search;
+      var num = 1; // Default number of decoded images
+
+      // Grab URL search args
+      var matches = search.matchAll(/num=([0-9]+)/gm);
+      for (const match of matches) {
+        num = match[1]
+      }
+      var matches = search.matchAll(/size=([0-9]+)/gm);
+      for (const match of matches) {
+        size = match[1]
+      }
+
+      // Insert images into DOM tree
+      var layer = document.getElementById('layer');
+      function addImage(img, size) {
+        var el = document.createElement('span');
+        console.log(`adding ${img}`);
+        el.classList.add('image');
+        el.style['backgroundImage'] = `url(${img}.webp)`;
+        el.style['width'] = `${size}px`;
+        el.style['height'] = `${size}px`;
+        layer.appendChild(el)
+        console.log("Added image");
+      }
+      var images = [
+        "1_fan","2_heart","3_cry","4_clap", "5_egg",
+        "6_party","7_rofl","8_melt","9_explode","10_turtle"
+      ]
+      for(i = 0; i< num; i++)  {
+        (function(i) {
+          var img = images[i % 10];
+          window.setTimeout( () => {  addImage(img,size) } , 1 + i*40);
+        })(i)
+      }
+
+      // Set up function retrieve CVals.
+      var getCVal = function(name) { return 0 }
+      if (typeof h5vcc != "undefined" && typeof h5vcc.cVal != "undefined") {
+        getCVal = function(name) {
+          return h5vcc.cVal.getValue(name);
+        }
+      }
+
+      // Set up periodic stats tracking loop.
+      var last_frames = 0;
+      var last_time = performance.now();
+      function updateStats() {
+        var current_time = performance.now();
+        var time_delta_milliseconds = current_time - last_time;
+        var decoded_frames =
+          getCVal('Count.MainWebModule.AnimatedImage.DecodedFrames');
+        var underruns = getCVal('Count.MainWebModule.AnimatedImage.DecodingUnderruns');
+        var overruns = getCVal('Count.MainWebModule.AnimatedImage.DecodingOverruns');
+        var newly_decoded_frames = decoded_frames - last_frames;
+        var fps = parseInt( newly_decoded_frames * 100 / (time_delta_milliseconds / 1000.0)) / 100;
+        document.getElementById('Active').textContent =
+          getCVal('Count.MainWebModule.AnimatedImage.Active');
+        document.getElementById('DecodedFrames').textContent = decoded_frames;
+        document.getElementById('DecodingUnderruns').textContent = underruns
+        document.getElementById('DecodingOverruns').textContent = overruns;
+        document.getElementById('DecodedFPS').textContent = fps;
+        document.getElementById('UnderrunPercent').textContent =  parseInt(underruns / decoded_frames * 100.0);
+        document.getElementById('OverrunPercent').textContent =  parseInt(overruns / decoded_frames * 100.0);
+
+        last_frames = decoded_frames;
+        last_time = current_time;
+      }
+      window.setInterval(updateStats, 1000);
+
+      // Set up keyboard menu nav
+      var menu = document.getElementById('menu').children;
+      var index = 0;
+      function refresh() {
+        var textBox = document.getElementById('nav');
+        for (let i = 0; i < menu.length; i++) {
+          if (i == index) {
+            menu[i].classList.add('highlight');
+          } else {
+            menu[i].classList.remove('highlight');
+          }
+        }
+      }
+      document.addEventListener('keydown', function (e) {
+        // left, up, android left, up
+        if ([37, 38, 32782, 32780].includes(e.keyCode)) {
+          index -= 1;
+        //right, down, android right, down
+        } else if ([39, 40, 32781, 32783].includes(e.keyCode)) {
+          index += 1;
+        // enter, android enter
+        } else if ([13, 32768].includes(e.keyCode)) {
+          var el = document.getElementById('menu').children[index];
+          window.location = el.firstChild.href;
+        }
+        index = (index + menu.length) % menu.length;
+        refresh();
+      });
+      refresh();
+    }
+  </script>
+</head>
+
+<body>
+  <div class="background"></div>
+  <div id="menu">
+    <span><a href="?size=100&amp;num=1">1 small image</a></span>
+    <span><a href="?size=300&amp;num=1">1 large image</a></span>
+    <span><a href="?size=100&amp;num=2">2 small images</a></span>
+    <span><a href="?size=300&amp;num=2">2 large image</a></span>
+    <span><a href="?size=100&amp;num=3">3 small images</a></span>
+    <span><a href="?size=300&amp;num=3">3 large images</a></span>
+    <span><a href="?size=100&amp;num=4">4 small images</a></span>
+    <span><a href="?size=300&amp;num=4">4 large images</a></span>
+    <div></div>
+    <span><a href="?size=100&amp;num=4">5 small images</a></span>
+    <span><a href="?size=300&amp;num=4">5 large images</a></span>
+    <span><a href="?size=100&amp;num=6">6 small images</a></span>
+    <span><a href="?size=300&amp;num=6">6 large images</a></span>
+    <span><a href="?size=100&amp;num=8">8 small images</a></span>
+    <span><a href="?size=300&amp;num=8">8 large images</a></span>
+    <span><a href="?size=100&amp;num=10">10 small images</a></span>
+    <span><a href="?size=300&amp;num=10">10 large images</a></span>
+  </div>
+  <div id="metrics">
+    <div><span>Total images playing:</span><span id="Active"></span></div>
+    <div><span>Total frames decoded:</span><span id="DecodedFrames"></span></div>
+    <div><span>Total frames underrun:</span><span id="DecodingUnderruns"></span></div>
+    <div><span>Total frames overrun:</span><span id="DecodingOverruns"></span></div>
+    <div><span>Frames decoded per second:</span><span id="DecodedFPS"></span></div>
+    <div><span>Underrun %:</span><span id="UnderrunPercent"></span>
+      <span>Overrun %:</span><span id="OverrunPercent"></span></div>
+  </div>
+
+  <div class="layer" id="layer"></div>
+</body>
+
+</html>
diff --git a/cobalt/demos/content/animations-demo/index.html b/cobalt/demos/content/animations-demo/index.html
index 9ccc565..a74bde0 100644
--- a/cobalt/demos/content/animations-demo/index.html
+++ b/cobalt/demos/content/animations-demo/index.html
@@ -77,4 +77,4 @@
   <div class="fern-layer"></div>
   <div class="intro-layer"></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/demos/content/animations-demo/layer_fern.js b/cobalt/demos/content/animations-demo/layer_fern.js
index 403ffdb..d6393a4 100644
--- a/cobalt/demos/content/animations-demo/layer_fern.js
+++ b/cobalt/demos/content/animations-demo/layer_fern.js
@@ -59,4 +59,3 @@
   AppendFern(fernContainer, 0.28);
   layerElement.appendChild(fernContainer);
 }
-
diff --git a/cobalt/demos/content/animations-demo/layer_intro.css b/cobalt/demos/content/animations-demo/layer_intro.css
index 6c0ca7b..f393a8a 100644
--- a/cobalt/demos/content/animations-demo/layer_intro.css
+++ b/cobalt/demos/content/animations-demo/layer_intro.css
@@ -36,4 +36,4 @@
   font-size: 70px;
 
   animation: text-animation 4s 1s both;
-}
\ No newline at end of file
+}
diff --git a/cobalt/demos/content/animations-demo/layer_sun.js b/cobalt/demos/content/animations-demo/layer_sun.js
index 103da84..1b1492f 100644
--- a/cobalt/demos/content/animations-demo/layer_sun.js
+++ b/cobalt/demos/content/animations-demo/layer_sun.js
@@ -69,4 +69,3 @@
   }
   layerElement.appendChild(sunBladeLayerContainerElement);
 }
-
diff --git a/cobalt/demos/content/crash-demo/crash-demo.html b/cobalt/demos/content/crash-demo/crash-demo.html
index 5ea1ebf..ff48653 100644
--- a/cobalt/demos/content/crash-demo/crash-demo.html
+++ b/cobalt/demos/content/crash-demo/crash-demo.html
@@ -93,4 +93,4 @@
   </script>
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/demos/content/lottie-player-demo/white_material_wave_loading.json b/cobalt/demos/content/lottie-player-demo/white_material_wave_loading.json
index cafcccf..b62abd4 100644
--- a/cobalt/demos/content/lottie-player-demo/white_material_wave_loading.json
+++ b/cobalt/demos/content/lottie-player-demo/white_material_wave_loading.json
@@ -1 +1 @@
-{"v":"4.6.8","fr":29.9700012207031,"ip":0,"op":40.0000016292334,"w":256,"h":256,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[208.6,127.969,0],"e":[208.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[208.6,88,0],"e":[208.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":40.0000016292334}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9843137,0.5490196,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[168.6,128,0],"e":[168.6,88,0],"to":[0,-6.66666650772095,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[168.6,88,0],"e":[168.6,128,0],"to":[0,0,0],"ti":[0,-6.66666650772095,0]},{"t":35.0000014255792}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9921569,0.8470588,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[128.594,127.969,0],"e":[128.594,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[128.594,88,0],"e":[128.594,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":30.0000012219251}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.2627451,0.627451,0.2784314,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 4","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":5,"s":[88.6,127.969,0],"e":[88.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[88.6,88,0],"e":[88.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":25.0000010182709}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.1176471,0.5333334,0.8980392,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 5","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[48.6,127.969,0],"e":[48.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[48.6,88,0],"e":[48.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":20.0000008146167}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.8980392,0.2235294,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1}]}
\ No newline at end of file
+{"v":"4.6.8","fr":29.9700012207031,"ip":0,"op":40.0000016292334,"w":256,"h":256,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[208.6,127.969,0],"e":[208.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[208.6,88,0],"e":[208.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":40.0000016292334}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9843137,0.5490196,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[168.6,128,0],"e":[168.6,88,0],"to":[0,-6.66666650772095,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[168.6,88,0],"e":[168.6,128,0],"to":[0,0,0],"ti":[0,-6.66666650772095,0]},{"t":35.0000014255792}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9921569,0.8470588,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[128.594,127.969,0],"e":[128.594,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[128.594,88,0],"e":[128.594,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":30.0000012219251}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.2627451,0.627451,0.2784314,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 4","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":5,"s":[88.6,127.969,0],"e":[88.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[88.6,88,0],"e":[88.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":25.0000010182709}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.1176471,0.5333334,0.8980392,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 5","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[48.6,127.969,0],"e":[48.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[48.6,88,0],"e":[48.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":20.0000008146167}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.8980392,0.2235294,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1}]}
diff --git a/cobalt/demos/content/material-design-spinner-demo/index.html b/cobalt/demos/content/material-design-spinner-demo/index.html
index d1a27a9..398d273 100644
--- a/cobalt/demos/content/material-design-spinner-demo/index.html
+++ b/cobalt/demos/content/material-design-spinner-demo/index.html
@@ -125,4 +125,4 @@
       </div>
     </div>
   </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/demos/content/media-element-demo/package-lock.json b/cobalt/demos/content/media-element-demo/package-lock.json
index 698b6f8..8c190bf 100644
--- a/cobalt/demos/content/media-element-demo/package-lock.json
+++ b/cobalt/demos/content/media-element-demo/package-lock.json
@@ -281,9 +281,9 @@
       "dev": true
     },
     "ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
       "dev": true
     },
     "ansi-styles": {
@@ -396,9 +396,9 @@
       "dev": true
     },
     "async": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
-      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+      "version": "2.6.4",
+      "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
+      "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
       "dev": true,
       "requires": {
         "lodash": "^4.17.14"
@@ -418,9 +418,9 @@
       "dev": true
     },
     "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
       "dev": true
     },
     "base": {
@@ -728,6 +728,16 @@
         "unset-value": "^1.0.0"
       }
     },
+    "call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
     "camelcase": {
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -929,7 +939,7 @@
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
       "dev": true
     },
     "concat-stream": {
@@ -1018,6 +1028,30 @@
             "ssri": "^8.0.0",
             "tar": "^6.0.2",
             "unique-filename": "^1.1.1"
+          },
+          "dependencies": {
+            "tar": {
+              "version": "6.1.15",
+              "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz",
+              "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==",
+              "dev": true,
+              "requires": {
+                "chownr": "^2.0.0",
+                "fs-minipass": "^2.0.0",
+                "minipass": "^5.0.0",
+                "minizlib": "^2.1.1",
+                "mkdirp": "^1.0.3",
+                "yallist": "^4.0.0"
+              },
+              "dependencies": {
+                "minipass": {
+                  "version": "5.0.0",
+                  "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+                  "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+                  "dev": true
+                }
+              }
+            }
           }
         },
         "chownr": {
@@ -1048,18 +1082,15 @@
           }
         },
         "json5": {
-          "version": "2.1.3",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
-          "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.5"
-          }
+          "version": "2.2.3",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+          "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+          "dev": true
         },
         "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
           "dev": true,
           "requires": {
             "big.js": "^5.2.2",
@@ -1180,9 +1211,9 @@
           }
         },
         "ssri": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz",
-          "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==",
+          "version": "8.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+          "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
           "dev": true,
           "requires": {
             "minipass": "^3.1.1"
@@ -1307,9 +1338,9 @@
       "dev": true
     },
     "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+      "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
       "dev": true
     },
     "define-property": {
@@ -1428,24 +1459,24 @@
       }
     },
     "elliptic": {
-      "version": "6.5.3",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
-      "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
+      "version": "6.5.4",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+      "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
       "dev": true,
       "requires": {
-        "bn.js": "^4.4.0",
-        "brorand": "^1.0.1",
+        "bn.js": "^4.11.9",
+        "brorand": "^1.1.0",
         "hash.js": "^1.0.0",
-        "hmac-drbg": "^1.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.0"
+        "hmac-drbg": "^1.0.1",
+        "inherits": "^2.0.4",
+        "minimalistic-assert": "^1.0.1",
+        "minimalistic-crypto-utils": "^1.0.1"
       },
       "dependencies": {
         "bn.js": {
-          "version": "4.11.9",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
-          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
           "dev": true
         }
       }
@@ -1846,9 +1877,9 @@
       }
     },
     "follow-redirects": {
-      "version": "1.12.1",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz",
-      "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==",
+      "version": "1.15.2",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
       "dev": true
     },
     "for-in": {
@@ -1910,12 +1941,30 @@
       "dev": true,
       "optional": true
     },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
     "get-caller-file": {
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
       "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
       "dev": true
     },
+    "get-intrinsic": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3"
+      }
+    },
     "get-value": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
@@ -1937,9 +1986,9 @@
       }
     },
     "glob-parent": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-      "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
       "dev": true,
       "requires": {
         "is-glob": "^4.0.1"
@@ -2000,12 +2049,33 @@
       "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
       "dev": true
     },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
     "has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
       "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
       "dev": true
     },
+    "has-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+      "dev": true
+    },
+    "has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "dev": true
+    },
     "has-value": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
@@ -2087,7 +2157,7 @@
     "hmac-drbg": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
-      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
       "dev": true,
       "requires": {
         "hash.js": "^1.0.3",
@@ -2202,9 +2272,9 @@
       "dev": true
     },
     "ini": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
       "dev": true
     },
     "interpret": {
@@ -2387,9 +2457,9 @@
       "dev": true
     },
     "json5": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+      "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
       "dev": true,
       "requires": {
         "minimist": "^1.2.0"
@@ -2408,9 +2478,9 @@
       "dev": true
     },
     "loader-utils": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+      "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
       "dev": true,
       "requires": {
         "big.js": "^5.2.2",
@@ -2429,9 +2499,9 @@
       }
     },
     "lodash": {
-      "version": "4.17.19",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
-      "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
       "dev": true
     },
     "lru-cache": {
@@ -2549,22 +2619,22 @@
     "minimalistic-crypto-utils": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+      "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
       "dev": true
     },
     "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
       "requires": {
         "brace-expansion": "^1.1.7"
       }
     },
     "minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
       "dev": true
     },
     "minipass": {
@@ -2810,6 +2880,12 @@
         }
       }
     },
+    "object-inspect": {
+      "version": "1.12.3",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+      "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+      "dev": true
+    },
     "object-visit": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
@@ -3115,10 +3191,13 @@
       "dev": true
     },
     "qs": {
-      "version": "6.9.4",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
-      "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==",
-      "dev": true
+      "version": "6.11.2",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
+      "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
+      "dev": true,
+      "requires": {
+        "side-channel": "^1.0.4"
+      }
     },
     "querystring": {
       "version": "0.2.0",
@@ -3426,6 +3505,17 @@
       "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
       "dev": true
     },
+    "side-channel": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.0",
+        "get-intrinsic": "^1.0.2",
+        "object-inspect": "^1.9.0"
+      }
+    },
     "slash": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -3565,9 +3655,9 @@
       }
     },
     "source-map-support": {
-      "version": "0.5.19",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
-      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
       "dev": true,
       "requires": {
         "buffer-from": "^1.0.0",
@@ -3598,9 +3688,9 @@
       }
     },
     "ssri": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
-      "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
+      "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
       "dev": true,
       "requires": {
         "figgy-pudding": "^3.5.1"
@@ -3710,44 +3800,10 @@
       "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
       "dev": true
     },
-    "tar": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz",
-      "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==",
-      "dev": true,
-      "requires": {
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.0.0",
-        "minipass": "^3.0.0",
-        "minizlib": "^2.1.1",
-        "mkdirp": "^1.0.3",
-        "yallist": "^4.0.0"
-      },
-      "dependencies": {
-        "chownr": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-          "dev": true
-        },
-        "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-          "dev": true
-        },
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-          "dev": true
-        }
-      }
-    },
     "terser": {
-      "version": "4.8.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
-      "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+      "version": "4.8.1",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
+      "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
       "dev": true,
       "requires": {
         "commander": "^2.20.0",
@@ -4352,9 +4408,9 @@
       "dev": true
     },
     "y18n": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
       "dev": true
     },
     "yallist": {
diff --git a/cobalt/demos/content/media-element-demo/public/assets/ac3.mp4 b/cobalt/demos/content/media-element-demo/public/assets/ac3.mp4
new file mode 100644
index 0000000..683e060
--- /dev/null
+++ b/cobalt/demos/content/media-element-demo/public/assets/ac3.mp4
Binary files differ
diff --git a/cobalt/demos/content/media-element-demo/public/assets/dash-audio.mp4 b/cobalt/demos/content/media-element-demo/public/assets/dash-audio.mp4
new file mode 100644
index 0000000..b26721c
--- /dev/null
+++ b/cobalt/demos/content/media-element-demo/public/assets/dash-audio.mp4
Binary files differ
diff --git a/cobalt/demos/content/media-element-demo/public/assets/dash-video-1080p.mp4 b/cobalt/demos/content/media-element-demo/public/assets/dash-video-1080p.mp4
new file mode 100644
index 0000000..e5513e8
--- /dev/null
+++ b/cobalt/demos/content/media-element-demo/public/assets/dash-video-1080p.mp4
Binary files differ
diff --git a/cobalt/demos/content/media-element-demo/public/assets/dash-video-240p.mp4 b/cobalt/demos/content/media-element-demo/public/assets/dash-video-240p.mp4
new file mode 100644
index 0000000..f8f78dd
--- /dev/null
+++ b/cobalt/demos/content/media-element-demo/public/assets/dash-video-240p.mp4
Binary files differ
diff --git a/cobalt/demos/content/media-element-demo/public/assets/eac3.mp4 b/cobalt/demos/content/media-element-demo/public/assets/eac3.mp4
new file mode 100644
index 0000000..a228a2f
--- /dev/null
+++ b/cobalt/demos/content/media-element-demo/public/assets/eac3.mp4
Binary files differ
diff --git a/cobalt/demos/content/media-element-demo/public/assets/hvc1_480p.mp4 b/cobalt/demos/content/media-element-demo/public/assets/hvc1_480p.mp4
new file mode 100644
index 0000000..18baf1d
--- /dev/null
+++ b/cobalt/demos/content/media-element-demo/public/assets/hvc1_480p.mp4
Binary files differ
diff --git a/cobalt/demos/content/media-element-demo/public/assets/hvc1_480p_720p.mp4 b/cobalt/demos/content/media-element-demo/public/assets/hvc1_480p_720p.mp4
new file mode 100644
index 0000000..6122f7b
--- /dev/null
+++ b/cobalt/demos/content/media-element-demo/public/assets/hvc1_480p_720p.mp4
Binary files differ
diff --git a/cobalt/demos/content/media-element-demo/public/assets/hvc1_720p.mp4 b/cobalt/demos/content/media-element-demo/public/assets/hvc1_720p.mp4
new file mode 100644
index 0000000..7599258
--- /dev/null
+++ b/cobalt/demos/content/media-element-demo/public/assets/hvc1_720p.mp4
Binary files differ
diff --git a/cobalt/demos/content/media-element-demo/public/assets/hvc1_hdr_480p.mp4 b/cobalt/demos/content/media-element-demo/public/assets/hvc1_hdr_480p.mp4
new file mode 100644
index 0000000..580b00c
--- /dev/null
+++ b/cobalt/demos/content/media-element-demo/public/assets/hvc1_hdr_480p.mp4
Binary files differ
diff --git a/cobalt/demos/content/media-element-demo/public/assets/progressive.mp4 b/cobalt/demos/content/media-element-demo/public/assets/progressive.mp4
new file mode 100644
index 0000000..2299f73
--- /dev/null
+++ b/cobalt/demos/content/media-element-demo/public/assets/progressive.mp4
Binary files differ
diff --git a/cobalt/demos/content/media-element-demo/src/components/component.ts b/cobalt/demos/content/media-element-demo/src/components/component.ts
index 55f9474..2caacdd 100644
--- a/cobalt/demos/content/media-element-demo/src/components/component.ts
+++ b/cobalt/demos/content/media-element-demo/src/components/component.ts
@@ -35,7 +35,7 @@
 
 /**
  * Renders a component to the container element.
- * @param CtorOrFunc Can be either a component contructor or a component
+ * @param CtorOrFunc Can be either a component constructor or a component
  *     function. The component function is easier to write but does not keep
  *     track of internal states.
  * @param props Component props.
diff --git a/cobalt/demos/content/media-element-demo/src/components/watch.ts b/cobalt/demos/content/media-element-demo/src/components/watch.ts
index 5503d44..6089099 100644
--- a/cobalt/demos/content/media-element-demo/src/components/watch.ts
+++ b/cobalt/demos/content/media-element-demo/src/components/watch.ts
@@ -25,7 +25,7 @@
 
   /**
    * Listens to any key event and displays a message. Bootstraps the page once
-   * user interacts with the docuemnt.
+   * user interacts with the document.
    */
   private waitForInteraction() {
     const messageEl = document.createElement('h1');
diff --git a/cobalt/demos/content/media-element-demo/src/utils/limited_source_buffer.ts b/cobalt/demos/content/media-element-demo/src/utils/limited_source_buffer.ts
index 63f5aae..21b77e0 100644
--- a/cobalt/demos/content/media-element-demo/src/utils/limited_source_buffer.ts
+++ b/cobalt/demos/content/media-element-demo/src/utils/limited_source_buffer.ts
@@ -5,7 +5,7 @@
 
 /**
  * A source buffer wrapper that limits the array buffers that can be added to
- * the source buffer. If the bufferred length exceeds the limit, it will
+ * the source buffer. If the buffered length exceeds the limit, it will
  * automatically pauses and waits until the remaining playback time is below the
  * limit.
  */
diff --git a/cobalt/demos/content/selector-tester/selector-tester.html b/cobalt/demos/content/selector-tester/selector-tester.html
index 937066f..2f1a01e 100644
--- a/cobalt/demos/content/selector-tester/selector-tester.html
+++ b/cobalt/demos/content/selector-tester/selector-tester.html
@@ -113,7 +113,7 @@
 
   <my-div style="position:absolute; left: 50%; width: 40%;">
     <div id="title">
-    <markup>&lt;div id="titile"&gt;</markup>
+    <markup>&lt;div id="title"&gt;</markup>
       Hello, Cobalt!
     <markup>&lt;/div&gt;</markup>
     </div>
diff --git a/cobalt/demos/content/smooth-animations-demo/index.html b/cobalt/demos/content/smooth-animations-demo/index.html
index 917415d..6ba0eb9 100644
--- a/cobalt/demos/content/smooth-animations-demo/index.html
+++ b/cobalt/demos/content/smooth-animations-demo/index.html
@@ -48,7 +48,7 @@
       subContainer.className = 'sub-container';
       subContainer.style.width = '50%';
       subContainer.style.height = '50%';
-      return subContainer;      
+      return subContainer;
     }
     // Build a complicated scene in order to force a layout that takes a long
     // time.
diff --git a/cobalt/demos/content/smooth-key-scroll/index.html b/cobalt/demos/content/smooth-key-scroll/index.html
index 4ad10f3..1ebe7cd 100644
--- a/cobalt/demos/content/smooth-key-scroll/index.html
+++ b/cobalt/demos/content/smooth-key-scroll/index.html
@@ -183,4 +183,3 @@
 
 </body>
 </html>
-
diff --git a/cobalt/demos/content/telemetry/index.html b/cobalt/demos/content/telemetry/index.html
index d3744a8..3dc2958 100644
--- a/cobalt/demos/content/telemetry/index.html
+++ b/cobalt/demos/content/telemetry/index.html
@@ -50,7 +50,6 @@
             log('Enabling metrics reporting: metrics.enable()');
             metrics.enable();
             log(`Setting metric event interval: metrics.setMetricEventInterval(${EVENT_INTERVAL_SECS})`);
-            log(`Note that the first upload interval will always be 60 seconds, regardless of metricEventInterval.`);
             metrics.setMetricEventInterval(EVENT_INTERVAL_SECS);
             log('Binding metric event handler: metrics.onMetricEvent(metricEventHandler)');
             metrics.onMetricEvent(metricEventHandler);
@@ -62,8 +61,12 @@
             log.textContent = logText;
             LOG_CONTAINER.appendChild(log);
         }
-
-        init();
+        // Persistent settings are only ready/validated after the browser module
+        // has fully loaded. As telemetry uses persistent settings, everything
+        // must happen after onload.
+        window.onload = function() {
+            init();
+        }
     </script>
 </body>
 
diff --git a/cobalt/demos/content/transitions-demo/transitions-demo.html b/cobalt/demos/content/transitions-demo/transitions-demo.html
index 65f6217..9a09ec1 100644
--- a/cobalt/demos/content/transitions-demo/transitions-demo.html
+++ b/cobalt/demos/content/transitions-demo/transitions-demo.html
@@ -372,4 +372,3 @@
 
 </body>
 </html>
-
diff --git a/cobalt/demos/content/transparent-animated-webp-demo/index.html b/cobalt/demos/content/transparent-animated-webp-demo/index.html
index e3fda4a..2ba6f5d 100644
--- a/cobalt/demos/content/transparent-animated-webp-demo/index.html
+++ b/cobalt/demos/content/transparent-animated-webp-demo/index.html
@@ -67,4 +67,4 @@
   </div>
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/demos/content/video-background-demo/dash-audio.mp4 b/cobalt/demos/content/video-background-demo/dash-audio.mp4
new file mode 100644
index 0000000..b26721c
--- /dev/null
+++ b/cobalt/demos/content/video-background-demo/dash-audio.mp4
Binary files differ
diff --git a/cobalt/demos/content/video-background-demo/sddefault.jpg b/cobalt/demos/content/video-background-demo/sddefault.jpg
new file mode 100644
index 0000000..ef2dae5
--- /dev/null
+++ b/cobalt/demos/content/video-background-demo/sddefault.jpg
Binary files differ
diff --git a/cobalt/demos/content/video-background-demo/video-background-demo.html b/cobalt/demos/content/video-background-demo/video-background-demo.html
new file mode 100644
index 0000000..c68d4da
--- /dev/null
+++ b/cobalt/demos/content/video-background-demo/video-background-demo.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<!--
+ | Copyright 2023 The Cobalt Authors. All Rights Reserved.
+ |
+ | Licensed under the Apache License, Version 2.0 (the "License");
+ | you may not use this file except in compliance with the License.
+ | You may obtain a copy of the License at
+ |
+ |     http://www.apache.org/licenses/LICENSE-2.0
+ |
+ | Unless required by applicable law or agreed to in writing, software
+ | distributed under the License is distributed on an "AS IS" BASIS,
+ | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ | See the License for the specific language governing permissions and
+ | limitations under the License.
+ -->
+
+<html>
+  <head>
+    <title>Video Elements With Background</title>
+    <style>
+        body {
+          margin: 0;
+        }
+
+        video {
+          width: 100%;
+          height: 100%;
+        }
+
+        #ui-layer {
+          display: flex;
+          justify-content: space-between;
+          position: absolute;
+          top: 15%;
+          height: 85%;
+          width: 100%;
+          background-color: rgba(33, 33, 33, .75);
+          padding: 24px;
+          margin: auto;
+        }
+
+        .item {
+          width: 320px;
+          height: 240px;
+          display: inline-block;
+          margin: 24px;
+          vertical-align: middle;
+        }
+    </style>
+  </head>
+  <body>
+    <div id="ui-layer">
+      <div class="item">
+        <video id="video1" muted="1" style="background-color: #4285F4">
+        </video>
+      </div>
+      <div class="item">
+        <video id="video2" muted="1"
+           style="background-image: url(sddefault.jpg);
+                  background-size: 320px 240px;">
+        </video>
+      </div>
+      <div class="item">
+        <video id="video3" muted="1" style="background-color: #4285F4">
+        </video>
+      </div>
+      <div class="item">
+        <video id="video4" muted="1"
+           style="background-image: url(sddefault.jpg);
+                  background-size: 320px 240px;">
+        </video>
+      </div>
+    </div>
+    <script src="video-background-demo.js"></script>
+  </body>
+</html>
diff --git a/cobalt/demos/content/video-background-demo/video-background-demo.js b/cobalt/demos/content/video-background-demo/video-background-demo.js
new file mode 100644
index 0000000..1c50180
--- /dev/null
+++ b/cobalt/demos/content/video-background-demo/video-background-demo.js
@@ -0,0 +1,106 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+var nextVideoElementIndex = 0;
+var audioData;
+var videoData;
+
+function downloadMediaData(downloadedCallback) {
+  var xhr = new XMLHttpRequest;
+
+  xhr.onload = function() {
+    audioData = xhr.response;
+    console.log("Downloaded " + audioData.byteLength + " of audio data.");
+
+    xhr.onload = function() {
+      videoData = xhr.response;
+      console.log("Downloaded " + videoData.byteLength + " of video data.");
+      downloadedCallback();
+    }
+
+    xhr.open("GET", "vp9-720p.webm", true);
+    xhr.send();
+  }
+
+  xhr.open("GET", "dash-audio.mp4", true);
+  xhr.responseType = "arraybuffer";
+  xhr.send();
+}
+
+function playVideoOn(videoElement) {
+  var ms = new MediaSource;
+  ms.addEventListener('sourceopen', function() {
+    console.log("Creating SourceBuffer objects.");
+    var audioBuffer = ms.addSourceBuffer('audio/mp4; codecs="mp4a.40.2"');
+    var videoBuffer = ms.addSourceBuffer('video/webm; codecs="vp9"; decode-to-texture=true');
+    audioBuffer.addEventListener("updateend", function() {
+      audioBuffer.abort();
+      videoBuffer.addEventListener("updateend", function() {
+        setTimeout(function() {
+          videoBuffer.addEventListener("updateend", function() {
+            videoBuffer.abort();
+            ms.endOfStream();
+            videoElement.ontimeupdate = function() {
+              if (videoElement.currentTime > 10) {
+                console.log("Stop playback.");
+                videoElement.src = '';
+                videoElement.load();
+                videoElement.ontimeupdate = null;
+              }
+            }
+            console.log("Start playback.");
+            videoElement.play();
+          });
+          videoBuffer.appendBuffer(videoData.slice(1024));
+        }, 5000);
+      });
+      videoBuffer.appendBuffer(videoData.slice(0, 1024));
+    });
+    audioBuffer.appendBuffer(audioData);
+  });
+
+  console.log("Attaching MediaSource to video element.");
+  videoElement.src = URL.createObjectURL(ms);
+}
+
+function setupKeyHandler() {
+  document.onkeydown = function() {
+    videoElements = document.getElementsByTagName('video');
+    for(let i = 0; i < videoElements.length; i++) {
+      if (videoElements[i].playing) {
+        console.log("Ignore key press as a video is still playing.");
+        return;
+      }
+    }
+
+    nextVideoElementIndex = nextVideoElementIndex % videoElements.length;
+
+    console.log("Trying to play next video at index " + nextVideoElementIndex);
+
+    var currentVideoElement = videoElements[nextVideoElementIndex];
+    if (currentVideoElement.setMaxVideoCapabilities) {
+      if (nextVideoElementIndex < videoElements.length / 2) {
+        currentVideoElement.setMaxVideoCapabilities("");
+      } else {
+        currentVideoElement.setMaxVideoCapabilities("width=1920; height=1080");
+      }
+    }
+
+    nextVideoElementIndex++;
+
+    playVideoOn(currentVideoElement);
+  };
+}
+
+downloadMediaData(setupKeyHandler);
diff --git a/cobalt/demos/content/video-background-demo/vp9-720p.webm b/cobalt/demos/content/video-background-demo/vp9-720p.webm
new file mode 100644
index 0000000..08a670e
--- /dev/null
+++ b/cobalt/demos/content/video-background-demo/vp9-720p.webm
Binary files differ
diff --git a/cobalt/doc/cvals.md b/cobalt/doc/cvals.md
index 6accd8f..68317e4 100644
--- a/cobalt/doc/cvals.md
+++ b/cobalt/doc/cvals.md
@@ -119,6 +119,18 @@
     compatibility violations encountered.
 *   **Count.XHR** - The total number of xhr::XMLHttpRequest in existence
     globally.
+*   **Count.MainWebModule.AnimatedImage.Active** - The total number of currently
+    active animated image decoders. Same image from a single URL source rendered
+    multiple times across the content counts as one decoder.
+*   **Count.MainWebModule.AnimatedImage.DecodedFrames** - Total number of decoded
+    frames across all active image decoders. This number resets only when
+    WebModule gets re-created - e.g. page reload, navigation.
+*   **Count.MainWebModule.AnimatedImage.DecodingUnderruns** - Total number of
+    frames when animated image decoding has fallen behind real-time, as defined
+    by image frame exposure times. This indicates a CPU bottleneck.
+*   **Count.MainWebModule.AnimatedImage.DecodingOverruns** - Total number of
+    frames when animated image decoding has been attempted too early, before
+    next frame exposure time. This indicates a timing issue in platform.
 
 ### Event
 
diff --git a/cobalt/dom/BUILD.gn b/cobalt/dom/BUILD.gn
index e25b7f2..9ce1859 100644
--- a/cobalt/dom/BUILD.gn
+++ b/cobalt/dom/BUILD.gn
@@ -322,7 +322,7 @@
   ]
 
   deps = [
-    ":licenses",
+    ":embed_license_as_header_file",
     "//base:i18n",
     "//cobalt/base",
     "//cobalt/browser:generated_bindings",
@@ -349,7 +349,6 @@
     "//cobalt/worker",
     "//cobalt/xhr:global_stats",
     "//crypto",
-    "//nb",
     "//net",
     "//starboard/common",
     "//third_party/icu:icuuc",
@@ -359,13 +358,13 @@
   ]
 }
 
-copy("licenses") {
-  install_content = true
-  license_path =
-      "licenses/platform/$cobalt_licenses_platform/licenses_cobalt.txt"
-  sources = [ "$static_contents_source_dir/$license_path" ]
-  outputs =
-      [ "$sb_static_contents_output_data_dir/licenses/licenses_cobalt.txt" ]
+action("embed_license_as_header_file") {
+  script = "//cobalt/build/generate_data_header.py"
+  license_path = "//cobalt/content/licenses/platform/$cobalt_licenses_platform/licenses_cobalt.txt"
+  inputs = [ "$license_path" ]
+  outputs = [ "$target_gen_dir/embedded_licenses.h" ]
+  args = [ "DOMEmbeddedResources" ] + rebase_path(outputs, root_build_dir) +
+         rebase_path(inputs, root_build_dir)
 }
 
 target(gtest_target_type, "dom_test") {
@@ -438,12 +437,9 @@
     "//cobalt/storage/store:memory_store",
     "//cobalt/test:run_all_unittests",
     "//cobalt/web:dom_exception",
-    "//nb",
     "//net:test_support",
     "//testing/gmock",
     "//testing/gtest",
     "//url",
   ]
-
-  data_deps = [ ":licenses" ]
 }
diff --git a/cobalt/dom/abort_controller.cc b/cobalt/dom/abort_controller.cc
index 68ccb9a..9d1c2e9 100644
--- a/cobalt/dom/abort_controller.cc
+++ b/cobalt/dom/abort_controller.cc
@@ -21,9 +21,7 @@
   abort_signal_ = new AbortSignal(settings);
 }
 
-void AbortController::Abort() {
-  abort_signal_->SignalAbort();
-}
+void AbortController::Abort() { abort_signal_->SignalAbort(); }
 
 void AbortController::TraceMembers(script::Tracer* tracer) {
   tracer->Trace(abort_signal_);
diff --git a/cobalt/dom/application_lifecycle_state_test.cc b/cobalt/dom/application_lifecycle_state_test.cc
index 5dd3c37..4ebf38c 100644
--- a/cobalt/dom/application_lifecycle_state_test.cc
+++ b/cobalt/dom/application_lifecycle_state_test.cc
@@ -12,15 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/dom/application_lifecycle_state.h"
 
+#include <memory>
+
 #include "base/debug/stack_trace.h"
 #include "base/logging.h"
 #include "cobalt/base/application_state.h"
 #include "cobalt/dom/visibility_state.h"
-
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -42,6 +41,7 @@
   MOCK_METHOD1(OnVisibilityStateChanged,
                void(VisibilityState visibility_state));
   MOCK_METHOD1(OnFrozennessChanged, void(bool is_frozen));
+
  protected:
   MockApplicationLifecycleStateObserver() {}
 };
diff --git a/cobalt/dom/attr.h b/cobalt/dom/attr.h
index f94a23e..3113d4e 100644
--- a/cobalt/dom/attr.h
+++ b/cobalt/dom/attr.h
@@ -34,8 +34,7 @@
 //
 // This class is designed to proxy the actual attribute value which is stored
 // in the Element and be created only on demand.
-class Attr : public script::Wrappable,
-             public base::SupportsWeakPtr<Attr> {
+class Attr : public script::Wrappable, public base::SupportsWeakPtr<Attr> {
  public:
   // If container is NULL, the Attr will be created in a detached state.
   Attr(const std::string& name, const std::string& value,
diff --git a/cobalt/dom/audio_track.h b/cobalt/dom/audio_track.h
index b3869e6..08ebd85 100644
--- a/cobalt/dom/audio_track.h
+++ b/cobalt/dom/audio_track.h
@@ -61,12 +61,9 @@
   static bool IsValidKind(const char* kind) {
     // https://www.w3.org/TR/html51/semantics-embedded-content.html#dom-audiotrack-audiotrackkind
     return strcmp(kind, "alternative") == 0 ||
-           strcmp(kind, "descriptions") == 0 ||
-           strcmp(kind, "main") == 0 ||
-           strcmp(kind, "main-desc") == 0 ||
-           strcmp(kind, "translation") == 0 ||
-           strcmp(kind, "commentary") == 0 ||
-           strlen(kind) == 0;
+           strcmp(kind, "descriptions") == 0 || strcmp(kind, "main") == 0 ||
+           strcmp(kind, "main-desc") == 0 || strcmp(kind, "translation") == 0 ||
+           strcmp(kind, "commentary") == 0 || strlen(kind) == 0;
   }
 
   DEFINE_WRAPPABLE_TYPE(AudioTrack);
diff --git a/cobalt/dom/base64.cc b/cobalt/dom/base64.cc
index e233070..621edb6 100644
--- a/cobalt/dom/base64.cc
+++ b/cobalt/dom/base64.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <algorithm>
-
 #include "cobalt/dom/base64.h"
 
+#include <algorithm>
+
 #include "base/base64.h"
 
 namespace cobalt {
diff --git a/cobalt/dom/c_val_view.h b/cobalt/dom/c_val_view.h
index 50905ee..fd9d111 100644
--- a/cobalt/dom/c_val_view.h
+++ b/cobalt/dom/c_val_view.h
@@ -19,8 +19,8 @@
 
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
-#include "cobalt/script/wrappable.h"
 #include "cobalt/script/sequence.h"
+#include "cobalt/script/wrappable.h"
 
 namespace cobalt {
 namespace dom {
diff --git a/cobalt/dom/camera_3d.cc b/cobalt/dom/camera_3d.cc
index 8d75e92..3e491bb 100644
--- a/cobalt/dom/camera_3d.cc
+++ b/cobalt/dom/camera_3d.cc
@@ -16,11 +16,10 @@
 
 #include "cobalt/dom/camera_3d.h"
 
-#include "third_party/glm/glm/gtx/euler_angles.hpp"
-
 #include "base/basictypes.h"
 #include "base/time/time.h"
 #include "cobalt/dom/device_orientation_event.h"
+#include "third_party/glm/glm/gtx/euler_angles.hpp"
 
 namespace cobalt {
 namespace dom {
diff --git a/cobalt/dom/captions/caption_character_edge_style.idl b/cobalt/dom/captions/caption_character_edge_style.idl
index fe27590..b8bd92f 100644
--- a/cobalt/dom/captions/caption_character_edge_style.idl
+++ b/cobalt/dom/captions/caption_character_edge_style.idl
@@ -18,4 +18,4 @@
   "depressed",
   "uniform",
   "drop-shadow",
-};
\ No newline at end of file
+};
diff --git a/cobalt/dom/captions/caption_color.idl b/cobalt/dom/captions/caption_color.idl
index f1ea52d..449dc9c 100644
--- a/cobalt/dom/captions/caption_color.idl
+++ b/cobalt/dom/captions/caption_color.idl
@@ -22,4 +22,4 @@
   "red",
   "white",
   "yellow",
-};
\ No newline at end of file
+};
diff --git a/cobalt/dom/captions/caption_font_family.idl b/cobalt/dom/captions/caption_font_family.idl
index 964b1af..a913660 100644
--- a/cobalt/dom/captions/caption_font_family.idl
+++ b/cobalt/dom/captions/caption_font_family.idl
@@ -20,4 +20,4 @@
   "proportional-sans-serif",
   "proportional-serif",
   "small-capitals",
-};
\ No newline at end of file
+};
diff --git a/cobalt/dom/captions/caption_font_size_percentage.idl b/cobalt/dom/captions/caption_font_size_percentage.idl
index 82d5566..afd2db4 100644
--- a/cobalt/dom/captions/caption_font_size_percentage.idl
+++ b/cobalt/dom/captions/caption_font_size_percentage.idl
@@ -25,4 +25,4 @@
   "250",
   "275",
   "300",
-};
\ No newline at end of file
+};
diff --git a/cobalt/dom/captions/caption_opacity_percentage.idl b/cobalt/dom/captions/caption_opacity_percentage.idl
index b4b6e7f..58e9c33 100644
--- a/cobalt/dom/captions/caption_opacity_percentage.idl
+++ b/cobalt/dom/captions/caption_opacity_percentage.idl
@@ -18,4 +18,4 @@
   "50",
   "75",
   "100",
-};
\ No newline at end of file
+};
diff --git a/cobalt/dom/captions/system_caption_settings.cc b/cobalt/dom/captions/system_caption_settings.cc
index fa07b56..7308247 100644
--- a/cobalt/dom/captions/system_caption_settings.cc
+++ b/cobalt/dom/captions/system_caption_settings.cc
@@ -12,11 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/dom/captions/system_caption_settings.h"
+
 #include <string>
 
 #include "base/compiler_specific.h"
 #include "base/logging.h"
-
 #include "cobalt/base/accessibility_caption_settings_changed_event.h"
 #include "cobalt/base/event_dispatcher.h"
 #include "cobalt/dom/captions/caption_character_edge_style.h"
@@ -25,9 +26,7 @@
 #include "cobalt/dom/captions/caption_font_size_percentage.h"
 #include "cobalt/dom/captions/caption_opacity_percentage.h"
 #include "cobalt/dom/captions/caption_state.h"
-#include "cobalt/dom/captions/system_caption_settings.h"
 #include "cobalt/web/event_target.h"
-
 #include "starboard/accessibility.h"
 #include "starboard/memory.h"
 
diff --git a/cobalt/dom/css_animations_adapter.cc b/cobalt/dom/css_animations_adapter.cc
index c886de6..bd09c9c 100644
--- a/cobalt/dom/css_animations_adapter.cc
+++ b/cobalt/dom/css_animations_adapter.cc
@@ -15,6 +15,7 @@
 #include "cobalt/dom/css_animations_adapter.h"
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "cobalt/base/tokens.h"
diff --git a/cobalt/dom/css_animations_adapter.h b/cobalt/dom/css_animations_adapter.h
index 2574e4e..15e8389 100644
--- a/cobalt/dom/css_animations_adapter.h
+++ b/cobalt/dom/css_animations_adapter.h
@@ -18,6 +18,7 @@
 #include <map>
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/memory/ref_counted.h"
 #include "cobalt/cssom/animation.h"
diff --git a/cobalt/dom/css_transitions_adapter.cc b/cobalt/dom/css_transitions_adapter.cc
index 6e91f68..64ffdae 100644
--- a/cobalt/dom/css_transitions_adapter.cc
+++ b/cobalt/dom/css_transitions_adapter.cc
@@ -15,6 +15,7 @@
 #include "cobalt/dom/css_transitions_adapter.h"
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "cobalt/base/tokens.h"
diff --git a/cobalt/dom/css_transitions_adapter.h b/cobalt/dom/css_transitions_adapter.h
index c3a23c1..3472572 100644
--- a/cobalt/dom/css_transitions_adapter.h
+++ b/cobalt/dom/css_transitions_adapter.h
@@ -17,6 +17,7 @@
 
 #include <map>
 #include <memory>
+#include <utility>
 
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
diff --git a/cobalt/dom/device_orientation_event_init.idl b/cobalt/dom/device_orientation_event_init.idl
index d84a3ef..2943274 100644
--- a/cobalt/dom/device_orientation_event_init.idl
+++ b/cobalt/dom/device_orientation_event_init.idl
@@ -18,4 +18,4 @@
   double? beta = null;
   double? gamma = null;
   boolean absolute = false;
-};
\ No newline at end of file
+};
diff --git a/cobalt/dom/document.cc b/cobalt/dom/document.cc
index b3d1ca0..e405cd9 100644
--- a/cobalt/dom/document.cc
+++ b/cobalt/dom/document.cc
@@ -64,7 +64,6 @@
 #include "cobalt/web/custom_event.h"
 #include "cobalt/web/dom_exception.h"
 #include "cobalt/web/message_event.h"
-#include "nb/memory_scope.h"
 
 using cobalt::cssom::ViewportSize;
 
@@ -234,7 +233,6 @@
 scoped_refptr<web::Event> Document::CreateEvent(
     const std::string& interface_name,
     script::ExceptionState* exception_state) {
-  TRACK_MEMORY_SCOPE("DOM");
   // https://www.w3.org/TR/dom/#dom-document-createevent
   // The match of interface name is case-insensitive.
   if (base::strcasecmp(interface_name.c_str(), "event") == 0 ||
@@ -992,11 +990,9 @@
       AppendRulesFromCSSStyleSheetToSelectorTree(css_style_sheet,
                                                  selector_tree_.get());
     }
-#if defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
     // Now that the selector tree is fully updated, validate its version
     // compatibility.
     selector_tree_->ValidateVersionCompatibility();
-#endif  // defined(COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS)
 
     scoped_refptr<HTMLHtmlElement> current_html = html();
     if (current_html) {
diff --git a/cobalt/dom/document_timeline.cc b/cobalt/dom/document_timeline.cc
index ce6ff25..a2c8529 100644
--- a/cobalt/dom/document_timeline.cc
+++ b/cobalt/dom/document_timeline.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/dom/document_timeline.h"
+
 #include "base/memory/weak_ptr.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/dom/document.h"
-#include "cobalt/dom/document_timeline.h"
 #include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/window.h"
 
@@ -26,11 +27,11 @@
 
 scoped_refptr<base::BasicClock> CreateOffsetClock(Document* document,
                                                   double origin_time) {
-  return document->navigation_start_clock() ?
-      new base::OffsetClock(
-        document->navigation_start_clock(),
-        base::TimeDelta::FromMillisecondsD(origin_time)) :
-      NULL;
+  return document->navigation_start_clock()
+             ? new base::OffsetClock(
+                   document->navigation_start_clock(),
+                   base::TimeDelta::FromMillisecondsD(origin_time))
+             : NULL;
 }
 }  // namespace
 
diff --git a/cobalt/dom/dom_implementation.cc b/cobalt/dom/dom_implementation.cc
index c298f10..c32c30d 100644
--- a/cobalt/dom/dom_implementation.cc
+++ b/cobalt/dom/dom_implementation.cc
@@ -38,7 +38,6 @@
 scoped_refptr<XMLDocument> DOMImplementation::CreateDocument(
     base::Optional<std::string> namespace_name,
     const std::string& qualified_name, scoped_refptr<DocumentType> doctype) {
-
   // 1. Let document be a new XMLDocument.
   scoped_refptr<XMLDocument> document = new XMLDocument(html_element_context_);
 
diff --git a/cobalt/dom/dom_rect_read_only.idl b/cobalt/dom/dom_rect_read_only.idl
index 1e35306..343c374 100644
--- a/cobalt/dom/dom_rect_read_only.idl
+++ b/cobalt/dom/dom_rect_read_only.idl
@@ -28,4 +28,3 @@
   readonly attribute unrestricted double bottom;
   readonly attribute unrestricted double left;
 };
-
diff --git a/cobalt/dom/dom_string_map.cc b/cobalt/dom/dom_string_map.cc
index 26db29e..14d99a0 100644
--- a/cobalt/dom/dom_string_map.cc
+++ b/cobalt/dom/dom_string_map.cc
@@ -100,9 +100,8 @@
 
     // If property name contains a "-" (U+002D) character followed by
     // a lowercase ASCII letter, abort these steps.
-    if (preceded_by_hyphen &&
-        base::ToUpperASCII(property_name_character) !=
-            property_name_character) {
+    if (preceded_by_hyphen && base::ToUpperASCII(property_name_character) !=
+                                  property_name_character) {
       return base::nullopt;
     }
 
diff --git a/cobalt/dom/dom_token_list.cc b/cobalt/dom/dom_token_list.cc
index 8e7a1e4..f7f9023 100644
--- a/cobalt/dom/dom_token_list.cc
+++ b/cobalt/dom/dom_token_list.cc
@@ -18,7 +18,6 @@
 
 #include "base/strings/string_split.h"
 #include "cobalt/dom/global_stats.h"
-#include "nb/memory_scope.h"
 
 namespace cobalt {
 namespace dom {
@@ -27,7 +26,6 @@
     : element_(element),
       attr_name_(attr_name),
       element_node_generation_(Node::kInvalidNodeGeneration) {
-  TRACK_MEMORY_SCOPE("DOM");
   DCHECK(element);
   // The current implementation relies on nodes calling UpdateNodeGeneration()
   // each time the class is changed. This results in DOMTokenList only working
@@ -93,7 +91,6 @@
 // Algorithm for Add:
 //   https://www.w3.org/TR/dom/#dom-domtokenlist-add
 void DOMTokenList::Add(const std::vector<std::string>& tokens) {
-  TRACK_MEMORY_SCOPE("DOM");
   // Custom, not in any spec.
   MaybeRefresh();
 
@@ -236,7 +233,6 @@
 // Algorithm for RunUpdateSteps:
 //   https://www.w3.org/TR/dom/#concept-dtl-update
 void DOMTokenList::RunUpdateSteps() const {
-  TRACK_MEMORY_SCOPE("DOM");
   // 1. If there is no associated attribute (when the object is a
   // DOMSettableTokenList), terminate these steps.
   // 2. Set an attribute for the associated element using associated attribute's
@@ -257,7 +253,6 @@
 }
 
 void DOMTokenList::MaybeRefresh() const {
-  TRACK_MEMORY_SCOPE("DOM");
   if (element_node_generation_ != element_->node_generation()) {
     element_node_generation_ = element_->node_generation();
     std::string attribute = element_->GetAttribute(attr_name_).value_or("");
diff --git a/cobalt/dom/element.cc b/cobalt/dom/element.cc
index c2119dc..04e1127 100644
--- a/cobalt/dom/element.cc
+++ b/cobalt/dom/element.cc
@@ -40,7 +40,6 @@
 #include "cobalt/dom/text.h"
 #include "cobalt/math/rect_f.h"
 #include "cobalt/web/dom_exception.h"
-#include "nb/memory_scope.h"
 
 namespace cobalt {
 namespace dom {
@@ -60,7 +59,6 @@
       animations_(new web_animations::AnimationSet()) {}
 
 base::Optional<std::string> Element::text_content() const {
-  TRACK_MEMORY_SCOPE("DOM");
   std::string content;
 
   const Node* child = first_child();
@@ -76,7 +74,6 @@
 
 void Element::set_text_content(
     const base::Optional<std::string>& text_content) {
-  TRACK_MEMORY_SCOPE("DOM");
   // https://www.w3.org/TR/dom/#dom-node-textcontent
   // 1. Let node be null.
   scoped_refptr<Node> new_node;
@@ -109,7 +106,6 @@
 
 bool Element::Matches(const std::string& selectors,
                       script::ExceptionState* exception_state) {
-  TRACK_MEMORY_SCOPE("DOM");
   // Referenced from:
   // https://dom.spec.whatwg.org/#dom-element-matches
 
@@ -138,7 +134,6 @@
 }
 
 scoped_refptr<NamedNodeMap> Element::attributes() {
-  TRACK_MEMORY_SCOPE("DOM");
   scoped_refptr<NamedNodeMap> named_node_map = named_node_map_.get();
   if (!named_node_map) {
     // Create a new instance and store a weak reference.
@@ -149,7 +144,6 @@
 }
 
 const scoped_refptr<DOMTokenList>& Element::class_list() {
-  TRACK_MEMORY_SCOPE("DOM");
   if (!class_list_) {
     // Create a new instance and store a reference to it. Because of the
     // negative performance impact of having to constantly recreate DomTokenList
@@ -163,7 +157,6 @@
 //   https://www.w3.org/TR/2014/WD-dom-20140710/#dom-element-getattribute
 base::Optional<std::string> Element::GetAttribute(
     const std::string& name) const {
-  TRACK_MEMORY_SCOPE("DOM");
   Document* document = node_document();
 
   // 1. If the context object is in the HTML namespace and its node document is
@@ -196,7 +189,6 @@
 // Algorithm for SetAttribute:
 //   https://www.w3.org/TR/2014/WD-dom-20140710/#dom-element-setattribute
 void Element::SetAttribute(const std::string& name, const std::string& value) {
-  TRACK_MEMORY_SCOPE("DOM");
   TRACE_EVENT2("cobalt::dom", "Element::SetAttribute", "name", name, "value",
                value);
   Document* document = node_document();
@@ -276,7 +268,6 @@
 // Algorithm for RemoveAttribute:
 //   https://www.w3.org/TR/2014/WD-dom-20140710/#dom-element-removeattribute
 void Element::RemoveAttribute(const std::string& name) {
-  TRACK_MEMORY_SCOPE("DOM");
   TRACE_EVENT1("cobalt::dom", "Element::RemoveAttribute", "name", name);
   Document* document = node_document();
 
@@ -357,7 +348,6 @@
 // Algorithm for HasAttribute:
 //   https://www.w3.org/TR/2014/WD-dom-20140710/#dom-element-hasattribute
 bool Element::HasAttribute(const std::string& name) const {
-  TRACK_MEMORY_SCOPE("DOM");
   Document* document = node_document();
 
   // 1. If the context object is in the HTML namespace and its node document is
@@ -421,7 +411,6 @@
 // Algorithm for getBoundingClientRect:
 //   https://www.w3.org/TR/2013/WD-cssom-view-20131217/#dom-element-getboundingclientrect
 scoped_refptr<DOMRect> Element::GetBoundingClientRect() {
-  TRACK_MEMORY_SCOPE("DOM");
   // 1. Let list be the result of invoking getClientRects() on the same element
   // this method was invoked on.
   scoped_refptr<DOMRectList> list = GetClientRects();
@@ -488,7 +477,6 @@
 // Algorithm for inner_html:
 //   https://www.w3.org/TR/DOM-Parsing/#widl-Element-innerHTML
 std::string Element::inner_html() const {
-  TRACK_MEMORY_SCOPE("DOM");
   std::ostringstream oss;
   Serializer serializer(&oss);
   serializer.SerializeDescendantsOnly(this);
@@ -498,7 +486,6 @@
 // Algorithm for set_inner_html:
 //   https://www.w3.org/TR/DOM-Parsing/#widl-Element-innerHTML
 void Element::set_inner_html(const std::string& inner_html) {
-  TRACK_MEMORY_SCOPE("DOM");
   // 1. Let fragment be the result of invoking the fragment parsing algorithm
   // with the new value as markup, and the context object as the context
   // element.
@@ -522,7 +509,6 @@
 // Algorithm for outer_html:
 //   https://www.w3.org/TR/DOM-Parsing/#widl-Element-innerHTML
 std::string Element::outer_html(script::ExceptionState* exception_state) const {
-  TRACK_MEMORY_SCOPE("DOM");
   std::ostringstream oss;
   Serializer serializer(&oss);
   serializer.Serialize(this);
@@ -533,8 +519,6 @@
 //   https://www.w3.org/TR/DOM-Parsing/#widl-Element-outerHTML
 void Element::set_outer_html(const std::string& outer_html,
                              script::ExceptionState* exception_state) {
-  TRACK_MEMORY_SCOPE("DOM");
-
   // 1. Let parent be the context object's parent.
   scoped_refptr<Node> parent = parent_node();
 
@@ -607,7 +591,6 @@
 void Element::Accept(ConstNodeVisitor* visitor) const { visitor->Visit(this); }
 
 scoped_refptr<Node> Element::Duplicate() const {
-  TRACK_MEMORY_SCOPE("DOM");
   Element* new_element = new Element(node_document(), local_name_);
   new_element->CopyAttributes(*this);
   return new_element;
@@ -742,7 +725,6 @@
 }
 
 HTMLElementContext* Element::html_element_context() {
-  TRACK_MEMORY_SCOPE("DOM");
   Document* document = node_document();
   return document ? document->html_element_context() : NULL;
 }
diff --git a/cobalt/dom/font_cache.cc b/cobalt/dom/font_cache.cc
index 25c953d..dc3c2ab 100644
--- a/cobalt/dom/font_cache.cc
+++ b/cobalt/dom/font_cache.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/dom/font_cache.h"
+
 #include <memory>
 #include <vector>
 
-#include "cobalt/dom/font_cache.h"
 #include "cobalt/dom/global_stats.h"
 
 namespace cobalt {
diff --git a/cobalt/dom/font_face_updater.h b/cobalt/dom/font_face_updater.h
index 775c8f3..fe7dcd4 100644
--- a/cobalt/dom/font_face_updater.h
+++ b/cobalt/dom/font_face_updater.h
@@ -30,7 +30,7 @@
 class CSSStyleSheet;
 class StyleSheetList;
 
-}  // cssom
+}  // namespace cssom
 
 namespace dom {
 
diff --git a/cobalt/dom/history.idl b/cobalt/dom/history.idl
index da86104..09ca958 100644
--- a/cobalt/dom/history.idl
+++ b/cobalt/dom/history.idl
@@ -24,4 +24,3 @@
 interface History {
   readonly attribute long length;
 };
-
diff --git a/cobalt/dom/html_anchor_element.cc b/cobalt/dom/html_anchor_element.cc
index 0c15a83..e7527d3 100644
--- a/cobalt/dom/html_anchor_element.cc
+++ b/cobalt/dom/html_anchor_element.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/dom/html_anchor_element.h"
+
 #include "cobalt/dom/document.h"
 
 namespace cobalt {
diff --git a/cobalt/dom/html_element.cc b/cobalt/dom/html_element.cc
index 01ea1eb..ef21c62 100644
--- a/cobalt/dom/html_element.cc
+++ b/cobalt/dom/html_element.cc
@@ -63,6 +63,7 @@
 #include "cobalt/dom/text.h"
 #include "cobalt/loader/image/animated_image_tracker.h"
 #include "cobalt/loader/resource_cache.h"
+#include "cobalt/math/clamp.h"
 #include "cobalt/web/csp_delegate.h"
 #include "third_party/icu/source/common/unicode/uchar.h"
 #include "third_party/icu/source/common/unicode/utf8.h"
@@ -584,6 +585,10 @@
   node_document()->window()->CancelScroll(ui_nav_item_);
   float left, top;
   ui_nav_item_->GetContentOffset(&left, &top);
+
+  float throwaway, min = x, max = x;
+  ui_nav_item_->GetBounds(&throwaway, &min, &throwaway, &max);
+  x = math::Clamp(x, min, max);
   ui_nav_item_->SetContentOffset(x, top);
 }
 
@@ -638,6 +643,10 @@
   node_document()->window()->CancelScroll(ui_nav_item_);
   float left, top;
   ui_nav_item_->GetContentOffset(&left, &top);
+
+  float throwaway, min = y, max = y;
+  ui_nav_item_->GetBounds(&min, &throwaway, &max, &throwaway);
+  y = math::Clamp(y, min, max);
   ui_nav_item_->SetContentOffset(left, y);
 }
 
@@ -1481,13 +1490,22 @@
   if (!ui_nav_item_->IsContainer()) {
     return;
   }
+
+  DirState dir = GetUsedDirState();
+  if (dir == DirState::kDirNotDefined) {
+    Document* document = node_document();
+    if (document && document->html()) {
+      dir = document->html()->GetUsedDirState();
+    }
+  }
+
   float scrollable_width = scroll_width() - client_width();
   float scroll_top_lower_bound = 0.0f;
   float scroll_left_lower_bound =
-      GetUsedDirState() == DirState::kDirRightToLeft ? -scrollable_width : 0.0f;
+      dir == DirState::kDirRightToLeft ? -scrollable_width : 0.0f;
   float scroll_top_upper_bound = scroll_height() - client_height();
   float scroll_left_upper_bound =
-      GetUsedDirState() == DirState::kDirRightToLeft ? 0.0f : scrollable_width;
+      dir == DirState::kDirRightToLeft ? 0.0f : scrollable_width;
   ui_nav_item_->SetBounds(scroll_top_lower_bound, scroll_left_lower_bound,
                           scroll_top_upper_bound, scroll_left_upper_bound);
 }
diff --git a/cobalt/dom/html_element_factory.cc b/cobalt/dom/html_element_factory.cc
index 12cc291..bf30531 100644
--- a/cobalt/dom/html_element_factory.cc
+++ b/cobalt/dom/html_element_factory.cc
@@ -36,7 +36,6 @@
 #include "cobalt/dom/html_unknown_element.h"
 #include "cobalt/dom/html_video_element.h"
 #include "cobalt/dom/lottie_player.h"
-#include "nb/memory_scope.h"
 
 namespace cobalt {
 namespace dom {
@@ -171,7 +170,6 @@
 
 scoped_refptr<HTMLElement> HTMLElementFactory::CreateHTMLElement(
     Document* document, base::Token tag_name) {
-  TRACK_MEMORY_SCOPE("DOM");
   TagNameToCreateHTMLElementTCallbackMap::const_iterator iter =
       tag_name_to_create_html_element_t_callback_map_.find(tag_name);
   if (iter != tag_name_to_create_html_element_t_callback_map_.end()) {
diff --git a/cobalt/dom/html_link_element.cc b/cobalt/dom/html_link_element.cc
index efd1019..011000b 100644
--- a/cobalt/dom/html_link_element.cc
+++ b/cobalt/dom/html_link_element.cc
@@ -20,8 +20,10 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/string_tokenizer.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "cobalt/cssom/css_parser.h"
 #include "cobalt/cssom/css_style_sheet.h"
@@ -29,13 +31,20 @@
 #include "cobalt/dom/html_element_context.h"
 #include "cobalt/dom/window.h"
 #include "cobalt/web/csp_delegate.h"
-#include "nb/memory_scope.h"
 #include "url/gurl.h"
 
 namespace cobalt {
 namespace dom {
 namespace {
 
+// Constants for parse time histogram. Do not modify these. If you need to
+// change these, create a new histogram and new constants.
+constexpr size_t kNumParseTimeHistogramBuckets = 100;
+constexpr base::TimeDelta kParseTimeHistogramMinTime =
+    base::TimeDelta::FromMicroseconds(1);
+constexpr base::TimeDelta kParseTimeHistogramMaxTime =
+    base::TimeDelta::FromMilliseconds(10);
+
 bool IsValidRelChar(char const& c) {
   return (isalnum(c) || c == '_' || c == '\\' || c == '-');
 }
@@ -158,7 +167,6 @@
 // Algorithm for Obtain:
 //   https://www.w3.org/TR/html50/document-metadata.html#concept-link-obtain
 void HTMLLinkElement::Obtain() {
-  TRACK_MEMORY_SCOPE("DOM");
   TRACE_EVENT0("cobalt::dom", "HTMLLinkElement::Obtain()");
   // Custom, not in any spec.
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -232,7 +240,6 @@
                                         std::unique_ptr<std::string> content) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(content);
-  TRACK_MEMORY_SCOPE("DOM");
   TRACE_EVENT0("cobalt::dom", "HTMLLinkElement::OnContentProduced()");
 
   // Get resource's final destination url from loader.
@@ -310,9 +317,24 @@
 
 void HTMLLinkElement::OnStylesheetLoaded(Document* document,
                                          const std::string& content) {
+  auto before_parse_micros = SbTimeGetMonotonicNow();
   scoped_refptr<cssom::CSSStyleSheet> css_style_sheet =
       document->html_element_context()->css_parser()->ParseStyleSheet(
           content, base::SourceLocation(href(), 1, 1));
+  auto after_parse_micros = SbTimeGetMonotonicNow();
+  auto css_kb = content.length() / 1000;
+  // Only measure non-trivial CSS sizes and ignore non-HTTP schemes (e.g.,
+  // file://), which are primarily used for debug purposes.
+  if (css_kb > 0 && absolute_url_.SchemeIsHTTPOrHTTPS()) {
+    // Get parse time normalized by byte size, see:
+    // go/cobalt-js-css-parsing-metrics.
+    auto micros_per_kb = (after_parse_micros - before_parse_micros) / css_kb;
+    UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
+        "Cobalt.DOM.CSS.Link.ParseTimeMicrosPerKB",
+        base::TimeDelta::FromMicroseconds(micros_per_kb),
+        kParseTimeHistogramMinTime, kParseTimeHistogramMaxTime,
+        kNumParseTimeHistogramBuckets);
+  }
   css_style_sheet->SetLocationUrl(absolute_url_);
   // If not loading from network-fetched resources or fetched resource is same
   // origin as the document, set origin-clean flag to true.
diff --git a/cobalt/dom/html_link_element_test.cc b/cobalt/dom/html_link_element_test.cc
index 0ca5bfa..6f11f01 100644
--- a/cobalt/dom/html_link_element_test.cc
+++ b/cobalt/dom/html_link_element_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/dom/html_link_element.h"
+
 #include "base/message_loop/message_loop.h"
 #include "cobalt/cssom/testing/mock_css_parser.h"  // nogncheck
 #include "cobalt/dom/document.h"
diff --git a/cobalt/dom/html_script_element.cc b/cobalt/dom/html_script_element.cc
index fa4153e..73e60b6 100644
--- a/cobalt/dom/html_script_element.cc
+++ b/cobalt/dom/html_script_element.cc
@@ -35,7 +35,6 @@
 #include "cobalt/script/global_environment.h"
 #include "cobalt/script/script_runner.h"
 #include "cobalt/web/csp_delegate.h"
-#include "nb/memory_scope.h"
 #include "url/gurl.h"
 
 namespace cobalt {
@@ -163,7 +162,6 @@
 // Algorithm for Prepare:
 //   https://www.w3.org/TR/2018/SPSD-html5-20180327/scripting-1.html#prepare-a-script
 void HTMLScriptElement::Prepare() {
-  TRACK_MEMORY_SCOPE("DOM");
   // Custom, not in any spec.
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(base::MessageLoop::current());
@@ -639,7 +637,6 @@
 void HTMLScriptElement::Execute(const std::string& content,
                                 const base::SourceLocation& script_location,
                                 bool is_external) {
-  TRACK_MEMORY_SCOPE("DOM");
   // If should_execute_ is set to false for whatever reason, then we
   // immediately exit.
   // When inserted using the document.write() method, script elements execute
diff --git a/cobalt/dom/html_style_element.cc b/cobalt/dom/html_style_element.cc
index d5d0be0..323b5d7 100644
--- a/cobalt/dom/html_style_element.cc
+++ b/cobalt/dom/html_style_element.cc
@@ -16,6 +16,8 @@
 
 #include <string>
 
+#include "base/metrics/histogram_macros.h"
+#include "base/time/time.h"
 #include "cobalt/cssom/css_parser.h"
 #include "cobalt/dom/document.h"
 #include "cobalt/dom/html_element_context.h"
@@ -24,6 +26,14 @@
 namespace cobalt {
 namespace dom {
 
+// Constants for parse time histogram. Do not modify these. If you need to
+// change these, create a new histogram and new constants.
+constexpr size_t kNumParseTimeHistogramBuckets = 100;
+constexpr base::TimeDelta kParseTimeHistogramMinTime =
+    base::TimeDelta::FromMicroseconds(1);
+constexpr base::TimeDelta kParseTimeHistogramMaxTime =
+    base::TimeDelta::FromMilliseconds(10);
+
 // static
 const char HTMLStyleElement::kTagName[] = "style";
 
@@ -81,9 +91,24 @@
   const std::string& text = content.value_or(base::EmptyString());
   if (bypass_csp || csp_delegate->AllowInline(web::CspDelegate::kStyle,
                                               inline_style_location_, text)) {
+    auto before_parse_micros = SbTimeGetMonotonicNow();
     scoped_refptr<cssom::CSSStyleSheet> css_style_sheet =
         document->html_element_context()->css_parser()->ParseStyleSheet(
             text, inline_style_location_);
+    auto after_parse_micros = SbTimeGetMonotonicNow();
+    auto css_kb = text.length() / 1000;
+    // Only measure non-trivial css sizes and inlined HTML style elements.
+    if (css_kb > 0 &&
+        inline_style_location_.file_path == "[object HTMLStyleElement]") {
+      // Get parse time normalized by byte size, see:
+      // go/cobalt-js-css-parsing-metrics.
+      auto micros_per_kb = (after_parse_micros - before_parse_micros) / css_kb;
+      UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
+          "Cobalt.DOM.CSS.Style.ParseTimeMicrosPerKB",
+          base::TimeDelta::FromMicroseconds(micros_per_kb),
+          kParseTimeHistogramMinTime, kParseTimeHistogramMaxTime,
+          kNumParseTimeHistogramBuckets);
+    }
     css_style_sheet->SetLocationUrl(GURL(inline_style_location_.file_path));
     css_style_sheet->SetOriginClean(true);
     style_sheet_ = css_style_sheet;
diff --git a/cobalt/dom/html_video_element.cc b/cobalt/dom/html_video_element.cc
index a973f3e..75b3f9f 100644
--- a/cobalt/dom/html_video_element.cc
+++ b/cobalt/dom/html_video_element.cc
@@ -18,6 +18,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/trace_event/trace_event.h"
 #include "cobalt/dom/dom_settings.h"
+#include "cobalt/dom/media_settings.h"
 #include "cobalt/dom/performance.h"
 #include "cobalt/dom/window.h"
 #include "cobalt/math/size_f.h"
@@ -30,6 +31,15 @@
 
 const char HTMLVideoElement::kTagName[] = "video";
 
+const MediaSettings& GetMediaSettings(web::EnvironmentSettings* settings) {
+  DCHECK(settings);
+  DCHECK(settings->context());
+  DCHECK(settings->context()->web_settings());
+
+  const auto& web_settings = settings->context()->web_settings();
+  return web_settings->media_settings();
+}
+
 HTMLVideoElement::HTMLVideoElement(Document* document)
     : HTMLMediaElement(document, base::Token(kTagName)) {}
 
@@ -98,9 +108,15 @@
   }
 }
 
-scoped_refptr<DecodeTargetProvider>
-HTMLVideoElement::GetDecodeTargetProvider() {
+scoped_refptr<DecodeTargetProvider> HTMLVideoElement::GetDecodeTargetProvider(
+    bool* paint_to_black) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(paint_to_black);
+
+  *paint_to_black = GetMediaSettings(environment_settings())
+                        .IsPaintingVideoBackgroundToBlack()
+                        .value_or(false);
+
   return player() ? player()->GetDecodeTargetProvider() : NULL;
 }
 
diff --git a/cobalt/dom/html_video_element.h b/cobalt/dom/html_video_element.h
index b98b6f6..914a69e 100644
--- a/cobalt/dom/html_video_element.h
+++ b/cobalt/dom/html_video_element.h
@@ -52,7 +52,10 @@
   // From HTMLElement
   scoped_refptr<HTMLVideoElement> AsHTMLVideoElement() override { return this; }
 
-  scoped_refptr<DecodeTargetProvider> GetDecodeTargetProvider();
+  // When the return value is nullptr, and |paint_to_black| is set to true, the
+  // caller is expected to paint the area covered by the video to black.
+  scoped_refptr<DecodeTargetProvider> GetDecodeTargetProvider(
+      bool* paint_to_black);
 
   WebMediaPlayer::SetBoundsCB GetSetBoundsCB();
 
diff --git a/cobalt/dom/intersection_observer.cc b/cobalt/dom/intersection_observer.cc
index a500813..f109197 100644
--- a/cobalt/dom/intersection_observer.cc
+++ b/cobalt/dom/intersection_observer.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/dom/intersection_observer.h"
+
 #include <algorithm>
 #include <string>
 
-#include "cobalt/dom/intersection_observer.h"
-
 #include "base/trace_event/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/base/source_location.h"
diff --git a/cobalt/dom/intersection_observer.h b/cobalt/dom/intersection_observer.h
index 1e2373b..8a07670 100644
--- a/cobalt/dom/intersection_observer.h
+++ b/cobalt/dom/intersection_observer.h
@@ -15,6 +15,7 @@
 #ifndef COBALT_DOM_INTERSECTION_OBSERVER_H_
 #define COBALT_DOM_INTERSECTION_OBSERVER_H_
 
+#include <memory>
 #include <string>
 #include <vector>
 
diff --git a/cobalt/dom/intersection_observer_test.cc b/cobalt/dom/intersection_observer_test.cc
index fc1d683..bea614c 100644
--- a/cobalt/dom/intersection_observer_test.cc
+++ b/cobalt/dom/intersection_observer_test.cc
@@ -27,8 +27,8 @@
 using cobalt::cssom::PercentageValue;
 using cobalt::cssom::PropertyListValue;
 using cobalt::dom::testing::MockLayoutBoxes;
-using ::testing::NiceMock;
 using ::testing::_;
+using ::testing::NiceMock;
 using ::testing::Return;
 
 namespace cobalt {
diff --git a/cobalt/dom/keyframes_map_updater.h b/cobalt/dom/keyframes_map_updater.h
index 2eb7b1f..f66ad79 100644
--- a/cobalt/dom/keyframes_map_updater.h
+++ b/cobalt/dom/keyframes_map_updater.h
@@ -32,7 +32,7 @@
 class CSSStyleSheet;
 class StyleSheetList;
 
-}  // cssom
+}  // namespace cssom
 
 namespace dom {
 
diff --git a/cobalt/dom/local_storage_database.cc b/cobalt/dom/local_storage_database.cc
index 595e869..6564d1f 100644
--- a/cobalt/dom/local_storage_database.cc
+++ b/cobalt/dom/local_storage_database.cc
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/dom/local_storage_database.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/trace_event/trace_event.h"
 #include "cobalt/dom/storage_area.h"
 #include "cobalt/storage/storage_manager.h"
 #include "cobalt/storage/store/memory_store.h"
-#include "nb/memory_scope.h"
 
 namespace cobalt {
 namespace dom {
@@ -36,7 +36,6 @@
     const LocalStorageDatabase::ReadCompletionCallback& callback,
     const storage::MemoryStore& memory_store) {
   LOG(INFO) << "LocalStorageReadValues";
-  TRACK_MEMORY_SCOPE("Storage");
 
   std::unique_ptr<storage::MemoryStore::LocalStorageMap> values(
       new storage::MemoryStore::LocalStorageMap);
@@ -47,19 +46,16 @@
 void LocalStorageWrite(const loader::Origin& origin, const std::string& key,
                        const std::string& value,
                        storage::MemoryStore* memory_store) {
-  TRACK_MEMORY_SCOPE("Storage");
   memory_store->WriteToLocalStorage(origin, key, value);
 }
 
 void LocalStorageDelete(const loader::Origin& origin, const std::string& key,
                         storage::MemoryStore* memory_store) {
-  TRACK_MEMORY_SCOPE("Storage");
   memory_store->DeleteFromLocalStorage(origin, key);
 }
 
 void LocalStorageClear(const loader::Origin& origin,
                        storage::MemoryStore* memory_store) {
-  TRACK_MEMORY_SCOPE("Storage");
   memory_store->ClearLocalStorage(origin);
 }
 }  // namespace
@@ -78,7 +74,6 @@
 
 void LocalStorageDatabase::ReadAll(const loader::Origin& origin,
                                    const ReadCompletionCallback& callback) {
-  TRACK_MEMORY_SCOPE("Storage");
   Init();
   storage_->WithReadOnlyMemoryStore(
       base::Bind(&LocalStorageReadValues, origin, callback));
@@ -87,26 +82,22 @@
 void LocalStorageDatabase::Write(const loader::Origin& origin,
                                  const std::string& key,
                                  const std::string& value) {
-  TRACK_MEMORY_SCOPE("Storage");
   Init();
   storage_->WithMemoryStore(base::Bind(&LocalStorageWrite, origin, key, value));
 }
 
 void LocalStorageDatabase::Delete(const loader::Origin& origin,
                                   const std::string& key) {
-  TRACK_MEMORY_SCOPE("Storage");
   Init();
   storage_->WithMemoryStore(base::Bind(&LocalStorageDelete, origin, key));
 }
 
 void LocalStorageDatabase::Clear(const loader::Origin& origin) {
-  TRACK_MEMORY_SCOPE("Storage");
   Init();
   storage_->WithMemoryStore(base::Bind(&LocalStorageClear, origin));
 }
 
 void LocalStorageDatabase::Flush(const base::Closure& callback) {
-  TRACK_MEMORY_SCOPE("Storage");
   storage_->FlushNow(callback);
 }
 
diff --git a/cobalt/dom/local_storage_database_test.cc b/cobalt/dom/local_storage_database_test.cc
index 1ec75da..ba3f78c 100644
--- a/cobalt/dom/local_storage_database_test.cc
+++ b/cobalt/dom/local_storage_database_test.cc
@@ -25,7 +25,6 @@
 #include "cobalt/base/cobalt_paths.h"
 #include "cobalt/storage/savegame_fake.h"
 #include "cobalt/storage/storage_manager.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/dom/location_test.cc b/cobalt/dom/location_test.cc
index 9e4caf2..4e8f599 100644
--- a/cobalt/dom/location_test.cc
+++ b/cobalt/dom/location_test.cc
@@ -19,9 +19,9 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
+using ::testing::_;
 using ::testing::Return;
 using ::testing::StrictMock;
-using ::testing::_;
 
 namespace cobalt {
 namespace dom {
diff --git a/cobalt/dom/lottie_player.h b/cobalt/dom/lottie_player.h
index c28fb0b..26afb6f 100644
--- a/cobalt/dom/lottie_player.h
+++ b/cobalt/dom/lottie_player.h
@@ -15,6 +15,7 @@
 #ifndef COBALT_DOM_LOTTIE_PLAYER_H_
 #define COBALT_DOM_LOTTIE_PLAYER_H_
 
+#include <memory>
 #include <string>
 
 #include "base/message_loop/message_loop.h"
diff --git a/cobalt/dom/media_settings.cc b/cobalt/dom/media_settings.cc
index 2915df3..ed39dbe 100644
--- a/cobalt/dom/media_settings.cc
+++ b/cobalt/dom/media_settings.cc
@@ -77,6 +77,12 @@
       LOG(INFO) << name << ": set to " << value;
       return true;
     }
+  } else if (name == "MediaElement.PaintingVideoBackgroundToBlack") {
+    if (value == 0 || value == 1) {
+      is_painting_video_background_to_black_ = value != 0;
+      LOG(INFO) << name << ": set to " << value;
+      return true;
+    }
   } else {
     LOG(WARNING) << "Ignore unknown setting with name \"" << name << "\"";
     return false;
diff --git a/cobalt/dom/media_settings.h b/cobalt/dom/media_settings.h
index eace022..9f1a6f4 100644
--- a/cobalt/dom/media_settings.h
+++ b/cobalt/dom/media_settings.h
@@ -41,6 +41,7 @@
 
   virtual base::Optional<int>
   GetMediaElementTimeupdateEventIntervalInMilliseconds() const = 0;
+  virtual base::Optional<bool> IsPaintingVideoBackgroundToBlack() const = 0;
 
  protected:
   MediaSettings() = default;
@@ -89,6 +90,9 @@
       const override {
     return media_element_timeupdate_event_interval_in_milliseconds_;
   }
+  base::Optional<bool> IsPaintingVideoBackgroundToBlack() const override {
+    return is_painting_video_background_to_black_;
+  }
 
   // Returns true when the setting associated with `name` is set to `value`.
   // Returns false when `name` is not associated with any settings, or if
@@ -106,6 +110,8 @@
   base::Optional<int> max_source_buffer_append_size_in_bytes_;
 
   base::Optional<int> media_element_timeupdate_event_interval_in_milliseconds_;
+
+  base::Optional<bool> is_painting_video_background_to_black_;
 };
 
 }  // namespace dom
diff --git a/cobalt/dom/media_settings_test.cc b/cobalt/dom/media_settings_test.cc
index 8850f72..e4addfe 100644
--- a/cobalt/dom/media_settings_test.cc
+++ b/cobalt/dom/media_settings_test.cc
@@ -31,6 +31,7 @@
   EXPECT_FALSE(impl.GetMaxSizeForImmediateJob());
   EXPECT_FALSE(impl.GetMaxSourceBufferAppendSizeInBytes());
   EXPECT_FALSE(impl.GetMediaElementTimeupdateEventIntervalInMilliseconds());
+  EXPECT_FALSE(impl.IsPaintingVideoBackgroundToBlack());
 }
 
 TEST(MediaSettingsImplTest, SunnyDay) {
@@ -46,6 +47,7 @@
   ASSERT_TRUE(impl.Set("MediaSource.MaxSourceBufferAppendSizeInBytes", 100000));
   ASSERT_TRUE(
       impl.Set("MediaElement.TimeupdateEventIntervalInMilliseconds", 100001));
+  ASSERT_TRUE(impl.Set("MediaElement.PaintingVideoBackgroundToBlack", 1));
 
   EXPECT_EQ(impl.GetSourceBufferEvictExtraInBytes().value(), 100);
   EXPECT_EQ(impl.GetMinimumProcessorCountToOffloadAlgorithm().value(), 101);
@@ -56,6 +58,7 @@
   EXPECT_EQ(impl.GetMaxSourceBufferAppendSizeInBytes().value(), 100000);
   EXPECT_EQ(impl.GetMediaElementTimeupdateEventIntervalInMilliseconds().value(),
             100001);
+  EXPECT_TRUE(impl.IsPaintingVideoBackgroundToBlack().value());
 }
 
 TEST(MediaSettingsImplTest, RainyDay) {
@@ -71,6 +74,7 @@
   ASSERT_FALSE(impl.Set("MediaSource.MaxSourceBufferAppendSizeInBytes", 0));
   ASSERT_FALSE(
       impl.Set("MediaElement.TimeupdateEventIntervalInMilliseconds", 0));
+  ASSERT_FALSE(impl.Set("MediaElement.PaintingVideoBackgroundToBlack", 2));
 
   EXPECT_FALSE(impl.GetSourceBufferEvictExtraInBytes());
   EXPECT_FALSE(impl.GetMinimumProcessorCountToOffloadAlgorithm());
@@ -80,6 +84,7 @@
   EXPECT_FALSE(impl.GetMaxSizeForImmediateJob());
   EXPECT_FALSE(impl.GetMaxSourceBufferAppendSizeInBytes());
   EXPECT_FALSE(impl.GetMediaElementTimeupdateEventIntervalInMilliseconds());
+  EXPECT_FALSE(impl.IsPaintingVideoBackgroundToBlack());
 }
 
 TEST(MediaSettingsImplTest, ZeroValuesWork) {
@@ -95,6 +100,7 @@
   // O is an invalid value for "MediaSource.MaxSourceBufferAppendSizeInBytes".
   // O is an invalid value for
   // "MediaElement.TimeupdateEventIntervalInMilliseconds".
+  ASSERT_TRUE(impl.Set("MediaElement.PaintingVideoBackgroundToBlack", 0));
 
   EXPECT_EQ(impl.GetSourceBufferEvictExtraInBytes().value(), 0);
   EXPECT_EQ(impl.GetMinimumProcessorCountToOffloadAlgorithm().value(), 0);
@@ -102,6 +108,7 @@
   EXPECT_FALSE(impl.IsAvoidCopyingArrayBufferEnabled().value());
   EXPECT_FALSE(impl.IsCallingEndedWhenClosedEnabled().value());
   EXPECT_EQ(impl.GetMaxSizeForImmediateJob().value(), 0);
+  EXPECT_FALSE(impl.IsPaintingVideoBackgroundToBlack().value());
 }
 
 TEST(MediaSettingsImplTest, Updatable) {
@@ -117,6 +124,7 @@
   ASSERT_TRUE(impl.Set("MediaSource.MaxSourceBufferAppendSizeInBytes", 1));
   ASSERT_TRUE(
       impl.Set("MediaElement.TimeupdateEventIntervalInMilliseconds", 1));
+  ASSERT_TRUE(impl.Set("MediaElement.PaintingVideoBackgroundToBlack", 0));
 
   ASSERT_TRUE(impl.Set("MediaSource.SourceBufferEvictExtraInBytes", 1));
   ASSERT_TRUE(
@@ -128,6 +136,7 @@
   ASSERT_TRUE(impl.Set("MediaSource.MaxSourceBufferAppendSizeInBytes", 2));
   ASSERT_TRUE(
       impl.Set("MediaElement.TimeupdateEventIntervalInMilliseconds", 2));
+  ASSERT_TRUE(impl.Set("MediaElement.PaintingVideoBackgroundToBlack", 1));
 
   EXPECT_EQ(impl.GetSourceBufferEvictExtraInBytes().value(), 1);
   EXPECT_EQ(impl.GetMinimumProcessorCountToOffloadAlgorithm().value(), 1);
@@ -138,6 +147,7 @@
   EXPECT_EQ(impl.GetMaxSourceBufferAppendSizeInBytes().value(), 2);
   EXPECT_EQ(impl.GetMediaElementTimeupdateEventIntervalInMilliseconds().value(),
             2);
+  EXPECT_TRUE(impl.IsPaintingVideoBackgroundToBlack().value());
 }
 
 TEST(MediaSettingsImplTest, InvalidSettingNames) {
diff --git a/cobalt/dom/media_source.cc b/cobalt/dom/media_source.cc
index 31ffc95..526f262 100644
--- a/cobalt/dom/media_source.cc
+++ b/cobalt/dom/media_source.cc
@@ -232,7 +232,7 @@
     script::EnvironmentSettings* settings, const std::string& type,
     script::ExceptionState* exception_state) {
   TRACE_EVENT1("cobalt::dom", "MediaSource::AddSourceBuffer()", "type", type);
-  DLOG(INFO) << "add SourceBuffer with type " << type;
+  LOG(INFO) << "add SourceBuffer with type " << type;
 
   if (type.empty()) {
     web::DOMException::Raise(web::DOMException::kInvalidAccessErr,
diff --git a/cobalt/dom/mime_type_array.idl b/cobalt/dom/mime_type_array.idl
index 65e3403..48ac443 100644
--- a/cobalt/dom/mime_type_array.idl
+++ b/cobalt/dom/mime_type_array.idl
@@ -20,4 +20,3 @@
 interface MimeTypeArray {
   readonly attribute long length;
 };
-
diff --git a/cobalt/dom/mutation_reporter.cc b/cobalt/dom/mutation_reporter.cc
index eba3de5..9af9794 100644
--- a/cobalt/dom/mutation_reporter.cc
+++ b/cobalt/dom/mutation_reporter.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/dom/mutation_reporter.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/containers/hash_tables.h"
 #include "base/trace_event/trace_event.h"
 #include "cobalt/dom/mutation_observer.h"
diff --git a/cobalt/dom/named_node_map.cc b/cobalt/dom/named_node_map.cc
index 8848a4f..5cdbaf6 100644
--- a/cobalt/dom/named_node_map.cc
+++ b/cobalt/dom/named_node_map.cc
@@ -21,7 +21,6 @@
 #include "cobalt/dom/attr.h"
 #include "cobalt/dom/element.h"
 #include "cobalt/dom/global_stats.h"
-#include "nb/memory_scope.h"
 
 namespace cobalt {
 namespace dom {
@@ -182,7 +181,6 @@
 
 scoped_refptr<Attr> NamedNodeMap::GetOrCreateAttr(
     const std::string& name) const {
-  TRACK_MEMORY_SCOPE("DOM");
   NameToAttrMap::iterator iter = proxy_attributes_.find(name);
   if (iter != proxy_attributes_.end() && iter->second) {
     return iter->second.get();
diff --git a/cobalt/dom/navigator.cc b/cobalt/dom/navigator.cc
index bb2fca9..7ad053c 100644
--- a/cobalt/dom/navigator.cc
+++ b/cobalt/dom/navigator.cc
@@ -21,6 +21,7 @@
 #include "base/trace_event/trace_event.h"
 #include "cobalt/dom/captions/system_caption_settings.h"
 #include "cobalt/dom/dom_settings.h"
+#include "cobalt/dom/embedded_licenses.h"  // Generated file.
 #include "cobalt/dom/eme/media_key_system_access.h"
 #include "cobalt/media_capture/media_devices.h"
 #include "cobalt/media_session/media_session_client.h"
@@ -36,7 +37,7 @@
 namespace dom {
 namespace {
 
-const char kLicensesRelativePath[] = "/licenses/licenses_cobalt.txt";
+const char kEmbeddedLicenses[] = "licenses_cobalt.txt";
 
 #if !defined(COBALT_BUILD_TYPE_GOLD)
 
@@ -153,49 +154,12 @@
           new media_capture::MediaDevices(settings, script_value_factory())),
       system_caption_settings_(captions) {}
 
-base::Optional<std::string> GetFilenameForLicenses() {
-  const size_t kBufferSize = kSbFileMaxPath + 1;
-  std::vector<char> buffer(kBufferSize, 0);
-  bool got_path = SbSystemGetPath(kSbSystemPathContentDirectory, buffer.data(),
-                                  static_cast<int>(kBufferSize));
-  if (!got_path) {
-    SB_DLOG(ERROR) << "Cannot get content path for licenses files.";
-    return base::Optional<std::string>();
-  }
-
-  return std::string(buffer.data()).append(kLicensesRelativePath);
-}
-
 const std::string Navigator::licenses() const {
-  base::Optional<std::string> filename = GetFilenameForLicenses();
-  if (!filename) {
-    return std::string();
-  }
-
-  SbFile file = SbFileOpen(filename->c_str(), kSbFileOpenOnly | kSbFileRead,
-                           nullptr, nullptr);
-  if (file == kSbFileInvalid) {
-    SB_DLOG(WARNING) << "Cannot open licenses file: " << *filename;
-    return std::string();
-  }
-
-  SbFileInfo info;
-  bool success = SbFileGetInfo(file, &info);
-  if (!success) {
-    SB_DLOG(WARNING) << "Cannot get information for licenses file.";
-    SbFileClose(file);
-    return std::string();
-  }
-  // SbFileReadAll expects an int for the size argument. Assume that the file
-  // is smaller than 2^32.
-  int file_size = static_cast<int>(info.size);
-
-  std::unique_ptr<char[]> buffer(new char[file_size]);
-  SbFileReadAll(file, buffer.get(), file_size);
-  const std::string file_contents = std::string(buffer.get(), file_size);
-  SbFileClose(file);
-
-  return file_contents;
+  GeneratedResourceMap resource_map;
+  DOMEmbeddedResources::GenerateMap(resource_map);
+  FileContents file_contents = resource_map[kEmbeddedLicenses];
+  return std::string(reinterpret_cast<const char*>(file_contents.data),
+                     file_contents.size);
 }
 
 bool Navigator::java_enabled() const { return false; }
diff --git a/cobalt/dom/node.cc b/cobalt/dom/node.cc
index 26c78eb..ca68573 100644
--- a/cobalt/dom/node.cc
+++ b/cobalt/dom/node.cc
@@ -163,7 +163,6 @@
 // Algorithm for CloneNode:
 //   https://www.w3.org/TR/2015/WD-dom-20150618/#dom-node-clonenode
 scoped_refptr<Node> Node::CloneNode(bool deep) const {
-  TRACK_MEMORY_SCOPE("DOM");
   TRACE_EVENT0("cobalt::dom", "Node::CloneNode()");
   scoped_refptr<Node> new_node = Duplicate();
   DCHECK(new_node);
diff --git a/cobalt/dom/node_dispatch_event_test.cc b/cobalt/dom/node_dispatch_event_test.cc
index 9ecb4e0..102f95e 100644
--- a/cobalt/dom/node_dispatch_event_test.cc
+++ b/cobalt/dom/node_dispatch_event_test.cc
@@ -14,16 +14,16 @@
 
 #include <memory>
 
-#include "cobalt/dom/node.h"
-
 #include "cobalt/dom/document.h"
 #include "cobalt/dom/element.h"
 #include "cobalt/dom/global_stats.h"
 #include "cobalt/dom/html_element_context.h"
+#include "cobalt/dom/node.h"
 #include "cobalt/script/testing/fake_script_value.h"
 #include "cobalt/web/testing/mock_event_listener.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::AllOf;
 using ::testing::Eq;
 using ::testing::IgnoreResult;
@@ -31,7 +31,6 @@
 using ::testing::InvokeWithoutArgs;
 using ::testing::Pointee;
 using ::testing::Property;
-using ::testing::_;
 
 namespace cobalt {
 namespace dom {
diff --git a/cobalt/dom/node_list_live.h b/cobalt/dom/node_list_live.h
index e8d6a2f..833804e 100644
--- a/cobalt/dom/node_list_live.h
+++ b/cobalt/dom/node_list_live.h
@@ -15,9 +15,8 @@
 #ifndef COBALT_DOM_NODE_LIST_LIVE_H_
 #define COBALT_DOM_NODE_LIST_LIVE_H_
 
-#include "cobalt/dom/node_list.h"
-
 #include "base/memory/ref_counted.h"
+#include "cobalt/dom/node_list.h"
 
 namespace cobalt {
 namespace dom {
diff --git a/cobalt/dom/performance_entry.cc b/cobalt/dom/performance_entry.cc
index be0e56b..17a537d 100644
--- a/cobalt/dom/performance_entry.cc
+++ b/cobalt/dom/performance_entry.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "performance_entry.h"
+#include "cobalt/dom/performance_entry.h"
 
 #include "base/atomic_sequence_num.h"
 #include "base/strings/string_util.h"
@@ -31,17 +31,13 @@
                                    DOMHighResTimeStamp start_time,
                                    DOMHighResTimeStamp finish_time)
     : duration_(finish_time - start_time),
-    name_(name),
-    start_time_(start_time),
-    index_(index_seq.GetNext()) {}
+      name_(name),
+      start_time_(start_time),
+      index_(index_seq.GetNext()) {}
 
-DOMHighResTimeStamp PerformanceEntry::start_time() const {
-  return start_time_;
-}
+DOMHighResTimeStamp PerformanceEntry::start_time() const { return start_time_; }
 
-DOMHighResTimeStamp PerformanceEntry::duration() const {
-  return duration_;
-}
+DOMHighResTimeStamp PerformanceEntry::duration() const { return duration_; }
 
 PerformanceEntry::EntryType PerformanceEntry::ToEntryTypeEnum(
     const std::string& entry_type) {
@@ -49,7 +45,7 @@
 
   for (size_t i = 0; i < arraysize(PerformanceEntry::kEntryTypeString); ++i) {
     if (base::LowerCaseEqualsASCII(entry_type,
-        PerformanceEntry::kEntryTypeString[i])) {
+                                   PerformanceEntry::kEntryTypeString[i])) {
       return static_cast<PerformanceEntry::EntryType>(i);
     }
   }
@@ -60,8 +56,7 @@
 bool PerformanceEntry::StartTimeCompareLessThan(
     const scoped_refptr<PerformanceEntry>& a,
     const scoped_refptr<PerformanceEntry>& b) {
-  if (a->start_time() == b->start_time())
-    return a->index_ < b->index_;
+  if (a->start_time() == b->start_time()) return a->index_ < b->index_;
   return a->start_time() < b->start_time();
 }
 
diff --git a/cobalt/dom/performance_entry_list_impl.cc b/cobalt/dom/performance_entry_list_impl.cc
index 28e0459..158db70 100644
--- a/cobalt/dom/performance_entry_list_impl.cc
+++ b/cobalt/dom/performance_entry_list_impl.cc
@@ -24,8 +24,7 @@
 namespace {
 
 PerformanceEntryList FilterBufferByNameAndType(
-    PerformanceEntryList performance_entry_buffer,
-    const std::string& name,
+    PerformanceEntryList performance_entry_buffer, const std::string& name,
     const base::StringPiece& entry_type) {
   // Algorithm for filtering buffers.
   //   https://www.w3.org/TR/2019/WD-performance-timeline-2-20191024/#filter-buffer-by-name-and-type
@@ -45,8 +44,8 @@
     // match type in a case-sensitive manner, go to next entryObject.
     const PerformanceEntry::EntryType type =
         PerformanceEntry::ToEntryTypeEnum(entry_type.as_string());
-    bool is_entry_type_not_valid = type != PerformanceEntry::kInvalid &&
-        type != entry->EntryTypeEnum();
+    bool is_entry_type_not_valid =
+        type != PerformanceEntry::kInvalid && type != entry->EntryTypeEnum();
     if (is_entry_type_not_valid) {
       continue;
     }
@@ -63,14 +62,14 @@
   return buffer;
 }
 
-}
+}  // namespace
 
 // static
 PerformanceEntryList PerformanceEntryListImpl::GetEntries(
     PerformanceEntryList performance_entry_buffer) {
   std::string empty_name_type;
-  return FilterBufferByNameAndType(
-      performance_entry_buffer, empty_name_type, empty_name_type);
+  return FilterBufferByNameAndType(performance_entry_buffer, empty_name_type,
+                                   empty_name_type);
 }
 
 // static
@@ -78,19 +77,18 @@
     PerformanceEntryList performance_entry_buffer,
     const std::string& entry_type) {
   std::string empty_name;
-  return FilterBufferByNameAndType(
-      performance_entry_buffer, empty_name, entry_type);
+  return FilterBufferByNameAndType(performance_entry_buffer, empty_name,
+                                   entry_type);
 }
 
 // static
 PerformanceEntryList PerformanceEntryListImpl::GetEntriesByName(
-    PerformanceEntryList performance_entry_buffer,
-    const std::string& name,
+    PerformanceEntryList performance_entry_buffer, const std::string& name,
     const base::StringPiece& type) {
   if (!type.data()) {
     std::string empty_type;
-    return FilterBufferByNameAndType(
-        performance_entry_buffer, name, empty_type);
+    return FilterBufferByNameAndType(performance_entry_buffer, name,
+                                     empty_type);
   }
   return FilterBufferByNameAndType(performance_entry_buffer, name, type);
 }
diff --git a/cobalt/dom/performance_entry_list_impl.h b/cobalt/dom/performance_entry_list_impl.h
index 54f2616..98c382f 100644
--- a/cobalt/dom/performance_entry_list_impl.h
+++ b/cobalt/dom/performance_entry_list_impl.h
@@ -35,8 +35,7 @@
       PerformanceEntryList performance_entry_buffer,
       const std::string& entry_type);
   static PerformanceEntryList GetEntriesByName(
-      PerformanceEntryList performance_entry_buffer,
-      const std::string& name,
+      PerformanceEntryList performance_entry_buffer, const std::string& name,
       const base::StringPiece& type);
 };
 
diff --git a/cobalt/dom/performance_high_resolution_time.h b/cobalt/dom/performance_high_resolution_time.h
index 4388b2e..2786a5a 100644
--- a/cobalt/dom/performance_high_resolution_time.h
+++ b/cobalt/dom/performance_high_resolution_time.h
@@ -24,7 +24,7 @@
 //   https://w3c.github.io/hr-time/#dom-domhighrestimestamp
 typedef double DOMHighResTimeStamp;
 
-// Time converstion helper functions.
+// Time conversion helper functions.
 inline DOMHighResTimeStamp ConvertSecondsToDOMHighResTimeStamp(double seconds) {
   return static_cast<DOMHighResTimeStamp>(seconds * 1000.0);
 }
@@ -42,27 +42,27 @@
 // Clamp customized minimum clock resolution in milliseconds.
 //   https://w3c.github.io/hr-time/#clock-resolution
 inline DOMHighResTimeStamp ClampTimeStampMinimumResolution(
-    base::TimeTicks ticks,
-  int64_t min_resolution_in_microseconds) {
+    base::TimeTicks ticks, int64_t min_resolution_in_microseconds) {
   int64_t microseconds = ticks.since_origin().InMicroseconds();
-  return base::TimeDelta::FromMicroseconds(microseconds -
-      (microseconds % min_resolution_in_microseconds)).InMillisecondsF();
+  return base::TimeDelta::FromMicroseconds(
+             microseconds - (microseconds % min_resolution_in_microseconds))
+      .InMillisecondsF();
 }
 
 // Clamp customized minimum clock resolution in milliseconds.
 //   https://w3c.github.io/hr-time/#clock-resolution
-inline DOMHighResTimeStamp ClampTimeStampMinimumResolution(base::TimeDelta delta,
-    int64_t min_resolution_in_microseconds) {
+inline DOMHighResTimeStamp ClampTimeStampMinimumResolution(
+    base::TimeDelta delta, int64_t min_resolution_in_microseconds) {
   int64_t microseconds = delta.InMicroseconds();
-  return base::TimeDelta::FromMicroseconds(microseconds -
-      (microseconds % min_resolution_in_microseconds)).InMillisecondsF();
+  return base::TimeDelta::FromMicroseconds(
+             microseconds - (microseconds % min_resolution_in_microseconds))
+      .InMillisecondsF();
 }
 
-inline DOMHighResTimeStamp
-    ClampTimeStampMinimumResolution(DOMHighResTimeStamp time_delta,
-                                    int64_t min_resolution_in_microseconds) {
+inline DOMHighResTimeStamp ClampTimeStampMinimumResolution(
+    DOMHighResTimeStamp time_delta, int64_t min_resolution_in_microseconds) {
   return time_delta -
-      (static_cast<int64_t>(time_delta) % min_resolution_in_microseconds);
+         (static_cast<int64_t>(time_delta) % min_resolution_in_microseconds);
 }
 
 }  // namespace dom
diff --git a/cobalt/dom/performance_lifecycle_timing.cc b/cobalt/dom/performance_lifecycle_timing.cc
index e06763f..5387e16 100644
--- a/cobalt/dom/performance_lifecycle_timing.cc
+++ b/cobalt/dom/performance_lifecycle_timing.cc
@@ -14,6 +14,7 @@
 
 
 #include "cobalt/dom/performance_lifecycle_timing.h"
+
 #include "cobalt/dom/performance.h"
 
 namespace cobalt {
diff --git a/cobalt/dom/performance_lifecycle_timing.h b/cobalt/dom/performance_lifecycle_timing.h
index 01e3c79..e9ab9e3 100644
--- a/cobalt/dom/performance_lifecycle_timing.h
+++ b/cobalt/dom/performance_lifecycle_timing.h
@@ -53,8 +53,8 @@
 
   void SetApplicationState(base::ApplicationState state,
                            SbTimeMonotonic timestamp);
-  void SetApplicationStartOrPreloadTimestamp(
-      bool is_preload, SbTimeMonotonic timestamp);
+  void SetApplicationStartOrPreloadTimestamp(bool is_preload,
+                                             SbTimeMonotonic timestamp);
   void SetDeepLinkTimestamp(SbTimeMonotonic timestamp);
 
   DEFINE_WRAPPABLE_TYPE(PerformanceLifecycleTiming);
@@ -64,22 +64,20 @@
   DOMHighResTimeStamp ReportDOMHighResTimeStamp(
       SbTimeMonotonic timestamp) const;
   base::ApplicationState GetCurrentState() const;
- struct LifecycleTimingInfo {
-  SbTimeMonotonic app_preload = 0;
-  SbTimeMonotonic app_start = 0;
-  SbTimeMonotonic app_blur = 0;
-  SbTimeMonotonic app_conceal = 0;
-  SbTimeMonotonic app_focus = 0;
-  SbTimeMonotonic app_reveal = 0;
-  SbTimeMonotonic app_freeze = 0;
-  SbTimeMonotonic app_unfreeze = 0;
-  SbTimeMonotonic app_deeplink = 0;
+  struct LifecycleTimingInfo {
+    SbTimeMonotonic app_preload = 0;
+    SbTimeMonotonic app_start = 0;
+    SbTimeMonotonic app_blur = 0;
+    SbTimeMonotonic app_conceal = 0;
+    SbTimeMonotonic app_focus = 0;
+    SbTimeMonotonic app_reveal = 0;
+    SbTimeMonotonic app_freeze = 0;
+    SbTimeMonotonic app_unfreeze = 0;
+    SbTimeMonotonic app_deeplink = 0;
 
-  base::ApplicationState current_state =
-      base::kApplicationStateStopped;
-  base::ApplicationState last_state =
-      base::kApplicationStateStopped;
- };
+    base::ApplicationState current_state = base::kApplicationStateStopped;
+    base::ApplicationState last_state = base::kApplicationStateStopped;
+  };
 
   LifecycleTimingInfo lifecycle_timing_info_;
 
@@ -90,4 +88,4 @@
 }  // namespace dom
 }  // namespace cobalt
 
-#endif  // COBALT_DOM_PERFORMANCE_LIFECYCLE_TIMING_H_
\ No newline at end of file
+#endif  // COBALT_DOM_PERFORMANCE_LIFECYCLE_TIMING_H_
diff --git a/cobalt/dom/performance_navigation_timing.cc b/cobalt/dom/performance_navigation_timing.cc
index ca6c3eb..7c51e25 100644
--- a/cobalt/dom/performance_navigation_timing.cc
+++ b/cobalt/dom/performance_navigation_timing.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "cobalt/dom/performance_navigation_timing.h"
-#include "cobalt/dom/performance.h"
 
 #include "cobalt/dom/document.h"
+#include "cobalt/dom/performance.h"
 
 namespace cobalt {
 namespace dom {
diff --git a/cobalt/dom/performance_navigation_timing.h b/cobalt/dom/performance_navigation_timing.h
index 49b1a4b..485f24e 100644
--- a/cobalt/dom/performance_navigation_timing.h
+++ b/cobalt/dom/performance_navigation_timing.h
@@ -22,7 +22,6 @@
 #include "cobalt/dom/performance_entry.h"
 #include "cobalt/dom/performance_high_resolution_time.h"
 #include "cobalt/dom/performance_resource_timing.h"
-
 #include "cobalt/script/wrappable.h"
 #include "net/base/load_timing_info.h"
 
diff --git a/cobalt/dom/performance_observer.h b/cobalt/dom/performance_observer.h
index 4bd88d9..a458046 100644
--- a/cobalt/dom/performance_observer.h
+++ b/cobalt/dom/performance_observer.h
@@ -15,6 +15,7 @@
 #ifndef COBALT_DOM_PERFORMANCE_OBSERVER_H_
 #define COBALT_DOM_PERFORMANCE_OBSERVER_H_
 
+#include <memory>
 #include <string>
 
 #include "base/memory/weak_ptr.h"
@@ -22,8 +23,8 @@
 #include "cobalt/dom/performance_observer_init.h"
 #include "cobalt/script/callback_function.h"
 #include "cobalt/script/environment_settings.h"
-#include "cobalt/script/sequence.h"
 #include "cobalt/script/script_value.h"
+#include "cobalt/script/sequence.h"
 #include "cobalt/script/wrappable.h"
 
 namespace cobalt {
@@ -39,9 +40,12 @@
   // https://www.w3.org/TR/2019/WD-performance-timeline-2-20191024/#dom-performanceobservercallback
   typedef script::CallbackFunction<void(
       const scoped_refptr<PerformanceObserverEntryList>& entries,
-      const scoped_refptr<PerformanceObserver>& observer)> PerformanceObserverCallback;
-  typedef script::ScriptValue<PerformanceObserverCallback> PerformanceObserverCallbackArg;
-  typedef PerformanceObserverCallbackArg::Reference PerformanceObserverCallbackReference;
+      const scoped_refptr<PerformanceObserver>& observer)>
+      PerformanceObserverCallback;
+  typedef script::ScriptValue<PerformanceObserverCallback>
+      PerformanceObserverCallbackArg;
+  typedef PerformanceObserverCallbackArg::Reference
+      PerformanceObserverCallbackReference;
 
   typedef base::Callback<void(
       const scoped_refptr<PerformanceObserverEntryList>& entries,
@@ -69,17 +73,18 @@
 
   void EnqueuePerformanceEntry(const scoped_refptr<PerformanceEntry>& entry);
 
-  // Internal helper class to allow creation of a PerformanceObserver with either a
-  // native or script callback. Must be public so it can be inherited from in
-  // the .cc file.
+  // Internal helper class to allow creation of a PerformanceObserver with
+  // either a native or script callback. Must be public so it can be inherited
+  // from in the .cc file.
   class CallbackInternal {
    public:
-    virtual bool RunCallback(const scoped_refptr<PerformanceObserverEntryList>& entries,
-                             const scoped_refptr<PerformanceObserver>& observer) = 0;
+    virtual bool RunCallback(
+        const scoped_refptr<PerformanceObserverEntryList>& entries,
+        const scoped_refptr<PerformanceObserver>& observer) = 0;
     virtual ~CallbackInternal() {}
   };
 
-  void EmptyObserverBuffer() { observer_buffer_.clear();}
+  void EmptyObserverBuffer() { observer_buffer_.clear(); }
   PerformanceEntryList GetObserverBuffer() { return observer_buffer_; }
   std::unique_ptr<CallbackInternal>& GetPerformanceObserverCallback() {
     return callback_;
diff --git a/cobalt/dom/performance_observer_callback_options.idl b/cobalt/dom/performance_observer_callback_options.idl
index 031062b..a5c9252 100644
--- a/cobalt/dom/performance_observer_callback_options.idl
+++ b/cobalt/dom/performance_observer_callback_options.idl
@@ -14,4 +14,4 @@
 
 dictionary PerformanceObserverCallbackOptions {
   unsigned long long droppedEntriesCount;
-};
\ No newline at end of file
+};
diff --git a/cobalt/dom/performance_observer_entry_list.cc b/cobalt/dom/performance_observer_entry_list.cc
index c5828bf..f49d32b 100644
--- a/cobalt/dom/performance_observer_entry_list.cc
+++ b/cobalt/dom/performance_observer_entry_list.cc
@@ -31,14 +31,14 @@
 
 PerformanceEntryList PerformanceObserverEntryList::GetEntriesByType(
     const std::string& entry_type) {
-  return PerformanceEntryListImpl::GetEntriesByType(
-      observer_buffer_, entry_type);
+  return PerformanceEntryListImpl::GetEntriesByType(observer_buffer_,
+                                                    entry_type);
 }
 
 PerformanceEntryList PerformanceObserverEntryList::GetEntriesByName(
     const std::string& name, const base::StringPiece& type) {
-  return PerformanceEntryListImpl::GetEntriesByName(
-      observer_buffer_, name, type);
+  return PerformanceEntryListImpl::GetEntriesByName(observer_buffer_, name,
+                                                    type);
 }
 
 }  // namespace dom
diff --git a/cobalt/dom/performance_resource_timing.cc b/cobalt/dom/performance_resource_timing.cc
index 09e72a3..c32f3dd 100644
--- a/cobalt/dom/performance_resource_timing.cc
+++ b/cobalt/dom/performance_resource_timing.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/dom/performance_resource_timing.h"
+
 #include "cobalt/dom/performance.h"
 
 namespace cobalt {
diff --git a/cobalt/dom/performance_resource_timing.h b/cobalt/dom/performance_resource_timing.h
index a7fa31d..4b01b92 100644
--- a/cobalt/dom/performance_resource_timing.h
+++ b/cobalt/dom/performance_resource_timing.h
@@ -19,7 +19,6 @@
 
 #include "cobalt/dom/performance_entry.h"
 #include "cobalt/dom/performance_high_resolution_time.h"
-
 #include "cobalt/script/wrappable.h"
 #include "net/base/load_timing_info.h"
 
diff --git a/cobalt/dom/performance_test.cc b/cobalt/dom/performance_test.cc
index f0a28ed..a333247 100644
--- a/cobalt/dom/performance_test.cc
+++ b/cobalt/dom/performance_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/dom/performance.h"
+
 #include "cobalt/dom/performance_high_resolution_time.h"
 #include "cobalt/dom/testing/stub_environment_settings.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/cobalt/dom/plugin_array.idl b/cobalt/dom/plugin_array.idl
index 43f418f..33eb35c 100644
--- a/cobalt/dom/plugin_array.idl
+++ b/cobalt/dom/plugin_array.idl
@@ -17,4 +17,3 @@
 interface PluginArray {
   readonly attribute long length;
 };
-
diff --git a/cobalt/dom/pseudo_element.cc b/cobalt/dom/pseudo_element.cc
index c787e16..135be85 100644
--- a/cobalt/dom/pseudo_element.cc
+++ b/cobalt/dom/pseudo_element.cc
@@ -12,9 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/dom/pseudo_element.h"
+
 #include "base/logging.h"
 #include "cobalt/dom/dom_animatable.h"
-#include "cobalt/dom/pseudo_element.h"
 
 namespace cobalt {
 namespace dom {
diff --git a/cobalt/dom/pseudo_element.h b/cobalt/dom/pseudo_element.h
index e832639..b318665 100644
--- a/cobalt/dom/pseudo_element.h
+++ b/cobalt/dom/pseudo_element.h
@@ -16,6 +16,7 @@
 #define COBALT_DOM_PSEUDO_ELEMENT_H_
 
 #include <memory>
+#include <utility>
 
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
@@ -25,6 +26,7 @@
 #include "cobalt/cssom/css_transition_set.h"
 #include "cobalt/dom/css_animations_adapter.h"
 #include "cobalt/dom/css_transitions_adapter.h"
+#include "cobalt/dom/layout_boxes.h"
 
 namespace cobalt {
 namespace dom {
diff --git a/cobalt/dom/rule_matching.cc b/cobalt/dom/rule_matching.cc
index db703f4..c908472 100644
--- a/cobalt/dom/rule_matching.cc
+++ b/cobalt/dom/rule_matching.cc
@@ -16,6 +16,7 @@
 
 #include <algorithm>
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "base/bind.h"
diff --git a/cobalt/dom/serializer.cc b/cobalt/dom/serializer.cc
index 2388382..723279f 100644
--- a/cobalt/dom/serializer.cc
+++ b/cobalt/dom/serializer.cc
@@ -16,6 +16,7 @@
 
 #include <map>
 #include <string>
+#include <utility>
 
 #include "base/strings/stringprintf.h"
 #include "cobalt/dom/attr.h"
diff --git a/cobalt/dom/storage_area.cc b/cobalt/dom/storage_area.cc
index 50be9ee..d436ebd 100644
--- a/cobalt/dom/storage_area.cc
+++ b/cobalt/dom/storage_area.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/dom/storage_area.h"
 
+#include <memory>
+
 #include "base/bind.h"
 #include "base/strings/stringprintf.h"
 #include "cobalt/dom/local_storage_database.h"
diff --git a/cobalt/dom/storage_area_test.cc b/cobalt/dom/storage_area_test.cc
index ad87a48..69b8f91 100644
--- a/cobalt/dom/storage_area_test.cc
+++ b/cobalt/dom/storage_area_test.cc
@@ -17,8 +17,8 @@
 #include <set>
 #include <vector>
 
-#include "cobalt/dom/storage.h"
 #include "cobalt/dom/global_stats.h"
+#include "cobalt/dom/storage.h"
 #include "cobalt/storage/store/memory_store.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -33,9 +33,9 @@
 class MockStorage : public Storage {
  public:
   MockStorage() : Storage(NULL, kSessionStorage, NULL) {
-      ON_CALL(*this, origin()).WillByDefault(
-          Return(GURL("https://www.example.com")));
-      EXPECT_CALL(*this, origin()).Times(1);
+    ON_CALL(*this, origin())
+        .WillByDefault(Return(GURL("https://www.example.com")));
+    EXPECT_CALL(*this, origin()).Times(1);
   }
   MOCK_METHOD3(DispatchEvent, bool(const base::Optional<std::string>&,
                                    const base::Optional<std::string>&,
diff --git a/cobalt/dom/testing/fake_exception_state.h b/cobalt/dom/testing/fake_exception_state.h
index 990e7fd..2f13e26 100644
--- a/cobalt/dom/testing/fake_exception_state.h
+++ b/cobalt/dom/testing/fake_exception_state.h
@@ -15,9 +15,8 @@
 #ifndef COBALT_DOM_TESTING_FAKE_EXCEPTION_STATE_H_
 #define COBALT_DOM_TESTING_FAKE_EXCEPTION_STATE_H_
 
-#include "cobalt/script/exception_state.h"
-
 #include "base/memory/ref_counted.h"
+#include "cobalt/script/exception_state.h"
 #include "cobalt/web/dom_exception.h"
 
 namespace cobalt {
diff --git a/cobalt/dom/testing/stub_css_parser.cc b/cobalt/dom/testing/stub_css_parser.cc
index 0bc1c33..65f5a14 100644
--- a/cobalt/dom/testing/stub_css_parser.cc
+++ b/cobalt/dom/testing/stub_css_parser.cc
@@ -51,8 +51,7 @@
 void StubCSSParser::ParsePropertyIntoDeclarationData(
     const std::string& property_name, const std::string& property_value,
     const base::SourceLocation& property_location,
-    cssom::CSSDeclarationData* declaration_data) {
-}
+    cssom::CSSDeclarationData* declaration_data) {}
 
 scoped_refptr<cssom::MediaList> StubCSSParser::ParseMediaList(
     const std::string& media_list, const base::SourceLocation& input_location) {
diff --git a/cobalt/dom/text.h b/cobalt/dom/text.h
index 471f395..53ff065 100644
--- a/cobalt/dom/text.h
+++ b/cobalt/dom/text.h
@@ -21,7 +21,6 @@
 #include "cobalt/dom/character_data.h"
 #include "cobalt/dom/document.h"
 #include "cobalt/script/environment_settings.h"
-#include "nb/memory_scope.h"
 
 namespace cobalt {
 namespace dom {
@@ -47,7 +46,6 @@
   void Accept(ConstNodeVisitor* visitor) const override;
 
   scoped_refptr<Node> Duplicate() const override {
-    TRACK_MEMORY_SCOPE("DOM");
     return new Text(node_document(), data());
   }
 
diff --git a/cobalt/dom/url_media_source.cc b/cobalt/dom/url_media_source.cc
index 83e9c86..15fbd8a 100644
--- a/cobalt/dom/url_media_source.cc
+++ b/cobalt/dom/url_media_source.cc
@@ -12,8 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "cobalt/web/url.h"
-
 #include "base/guid.h"
 #include "base/logging.h"
 #include "cobalt/base/polymorphic_downcast.h"
@@ -21,6 +19,7 @@
 #include "cobalt/dom/media_source.h"
 #include "cobalt/web/context.h"
 #include "cobalt/web/environment_settings.h"
+#include "cobalt/web/url.h"
 #include "url/gurl.h"
 
 namespace cobalt {
diff --git a/cobalt/dom/video_track.h b/cobalt/dom/video_track.h
index 00235da..7bbf636 100644
--- a/cobalt/dom/video_track.h
+++ b/cobalt/dom/video_track.h
@@ -60,12 +60,9 @@
   //
   static bool IsValidKind(const char* kind) {
     // https://www.w3.org/TR/html51/semantics-embedded-content.html#dom-videotrack-videotrackkind
-    return strcmp(kind, "alternative") == 0 ||
-           strcmp(kind, "captions") == 0 ||
-           strcmp(kind, "main") == 0 ||
-           strcmp(kind, "sign") == 0 ||
-           strcmp(kind, "subtitles") == 0 ||
-           strcmp(kind, "commentary") == 0 ||
+    return strcmp(kind, "alternative") == 0 || strcmp(kind, "captions") == 0 ||
+           strcmp(kind, "main") == 0 || strcmp(kind, "sign") == 0 ||
+           strcmp(kind, "subtitles") == 0 || strcmp(kind, "commentary") == 0 ||
            strlen(kind) == 0;
   }
 
diff --git a/cobalt/dom/wheel_event.idl b/cobalt/dom/wheel_event.idl
index 215c008..00829a1 100644
--- a/cobalt/dom/wheel_event.idl
+++ b/cobalt/dom/wheel_event.idl
@@ -43,4 +43,4 @@
                    optional double deltaY = 0,
                    optional double deltaZ = 0,
                    optional unsigned long deltaMode = 0);
-};
\ No newline at end of file
+};
diff --git a/cobalt/dom_parser/libxml_html_parser_wrapper.h b/cobalt/dom_parser/libxml_html_parser_wrapper.h
index b6ee389..1dd7ee9 100644
--- a/cobalt/dom_parser/libxml_html_parser_wrapper.h
+++ b/cobalt/dom_parser/libxml_html_parser_wrapper.h
@@ -15,9 +15,8 @@
 #ifndef COBALT_DOM_PARSER_LIBXML_HTML_PARSER_WRAPPER_H_
 #define COBALT_DOM_PARSER_LIBXML_HTML_PARSER_WRAPPER_H_
 
-#include "cobalt/dom_parser/libxml_parser_wrapper.h"
-
 #include <libxml/HTMLparser.h>
+
 #include <string>
 
 #include "base/callback.h"
@@ -25,6 +24,7 @@
 #include "cobalt/base/source_location.h"
 #include "cobalt/dom/document.h"
 #include "cobalt/dom/node.h"
+#include "cobalt/dom_parser/libxml_parser_wrapper.h"
 #include "cobalt/loader/decoder.h"
 
 namespace cobalt {
diff --git a/cobalt/dom_parser/libxml_xml_parser_wrapper.h b/cobalt/dom_parser/libxml_xml_parser_wrapper.h
index fabb663..1cb91d4 100644
--- a/cobalt/dom_parser/libxml_xml_parser_wrapper.h
+++ b/cobalt/dom_parser/libxml_xml_parser_wrapper.h
@@ -15,9 +15,8 @@
 #ifndef COBALT_DOM_PARSER_LIBXML_XML_PARSER_WRAPPER_H_
 #define COBALT_DOM_PARSER_LIBXML_XML_PARSER_WRAPPER_H_
 
-#include "cobalt/dom_parser/libxml_parser_wrapper.h"
-
 #include <libxml/parser.h>
+
 #include <string>
 
 #include "base/callback.h"
@@ -25,6 +24,7 @@
 #include "cobalt/base/source_location.h"
 #include "cobalt/dom/node.h"
 #include "cobalt/dom/xml_document.h"
+#include "cobalt/dom_parser/libxml_parser_wrapper.h"
 #include "cobalt/loader/decoder.h"
 
 namespace cobalt {
diff --git a/cobalt/encoding/text_decoder.cc b/cobalt/encoding/text_decoder.cc
index 8f1a48c..0f05b59 100644
--- a/cobalt/encoding/text_decoder.cc
+++ b/cobalt/encoding/text_decoder.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/encoding/text_decoder.h"
+
 #include <algorithm>
 #include <cctype>
 
-#include "cobalt/encoding/text_decoder.h"
-
 #include "third_party/icu/source/common/unicode/uchriter.h"
 #include "third_party/icu/source/common/unicode/ucnv.h"
 #include "third_party/icu/source/common/unicode/unistr.h"
diff --git a/cobalt/encoding/text_decoder_test.cc b/cobalt/encoding/text_decoder_test.cc
index ca1c3b0..7fca0cb 100644
--- a/cobalt/encoding/text_decoder_test.cc
+++ b/cobalt/encoding/text_decoder_test.cc
@@ -27,7 +27,6 @@
 #include "cobalt/script/testing/mock_exception_state.h"
 #include "cobalt/script/typed_arrays.h"
 #include "cobalt/web/testing/stub_web_context.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::_;
diff --git a/cobalt/encoding/text_encoder_test.cc b/cobalt/encoding/text_encoder_test.cc
index 4b59a7d..fb84843 100644
--- a/cobalt/encoding/text_encoder_test.cc
+++ b/cobalt/encoding/text_encoder_test.cc
@@ -23,7 +23,6 @@
 #include "cobalt/script/array_buffer_view.h"
 #include "cobalt/script/environment_settings.h"
 #include "cobalt/script/typed_arrays.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 
diff --git a/cobalt/h5vcc/BUILD.gn b/cobalt/h5vcc/BUILD.gn
index f081ce4..1e42192 100644
--- a/cobalt/h5vcc/BUILD.gn
+++ b/cobalt/h5vcc/BUILD.gn
@@ -38,8 +38,6 @@
     "h5vcc.h",
     "h5vcc_accessibility.cc",
     "h5vcc_accessibility.h",
-    "h5vcc_account_info.cc",
-    "h5vcc_account_info.h",
     "h5vcc_audio_config.cc",
     "h5vcc_audio_config.h",
     "h5vcc_audio_config_array.cc",
diff --git a/cobalt/h5vcc/dial/dial_http_response.cc b/cobalt/h5vcc/dial/dial_http_response.cc
index 3fcd329..6e1696a 100644
--- a/cobalt/h5vcc/dial/dial_http_response.cc
+++ b/cobalt/h5vcc/dial/dial_http_response.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/h5vcc/dial/dial_http_response.h"
+
 #include <memory>
 #include <utility>
 
-#include "cobalt/h5vcc/dial/dial_http_response.h"
-
 #include "base/strings/stringprintf.h"
 #include "net/server/http_server_response_info.h"
 
diff --git a/cobalt/h5vcc/h5vcc.cc b/cobalt/h5vcc/h5vcc.cc
index 8d957b8..885b912 100644
--- a/cobalt/h5vcc/h5vcc.cc
+++ b/cobalt/h5vcc/h5vcc.cc
@@ -27,7 +27,6 @@
 
 H5vcc::H5vcc(const Settings& settings) {
   accessibility_ = new H5vccAccessibility(settings.event_dispatcher);
-  account_info_ = new H5vccAccountInfo();
   audio_config_array_ = new H5vccAudioConfigArray();
   c_val_ = new dom::CValView();
   crash_log_ = new H5vccCrashLog();
@@ -71,7 +70,6 @@
 
 void H5vcc::TraceMembers(script::Tracer* tracer) {
   tracer->Trace(accessibility_);
-  tracer->Trace(account_info_);
   tracer->Trace(audio_config_array_);
   tracer->Trace(c_val_);
   tracer->Trace(crash_log_);
diff --git a/cobalt/h5vcc/h5vcc.h b/cobalt/h5vcc/h5vcc.h
index 0d60a7c..c74551f 100644
--- a/cobalt/h5vcc/h5vcc.h
+++ b/cobalt/h5vcc/h5vcc.h
@@ -22,7 +22,6 @@
 #include "cobalt/dom/c_val_view.h"
 #include "cobalt/dom/mutation_observer_task_manager.h"
 #include "cobalt/h5vcc/h5vcc_accessibility.h"
-#include "cobalt/h5vcc/h5vcc_account_info.h"
 #include "cobalt/h5vcc/h5vcc_audio_config_array.h"
 #include "cobalt/h5vcc/h5vcc_crash_log.h"
 #include "cobalt/h5vcc/h5vcc_metrics.h"
@@ -73,9 +72,6 @@
   const scoped_refptr<H5vccAccessibility>& accessibility() const {
     return accessibility_;
   }
-  const scoped_refptr<H5vccAccountInfo>& account_info() const {
-    return account_info_;
-  }
   const scoped_refptr<H5vccAudioConfigArray>& audio_config() {
     return audio_config_array_;
   }
@@ -98,7 +94,6 @@
 
  private:
   scoped_refptr<H5vccAccessibility> accessibility_;
-  scoped_refptr<H5vccAccountInfo> account_info_;
   scoped_refptr<H5vccAudioConfigArray> audio_config_array_;
   scoped_refptr<dom::CValView> c_val_;
   scoped_refptr<H5vccCrashLog> crash_log_;
diff --git a/cobalt/h5vcc/h5vcc.idl b/cobalt/h5vcc/h5vcc.idl
index 188e66b..e65bfa4 100644
--- a/cobalt/h5vcc/h5vcc.idl
+++ b/cobalt/h5vcc/h5vcc.idl
@@ -32,7 +32,6 @@
 
 interface H5vcc {
   readonly attribute H5vccAccessibility accessibility;
-  readonly attribute H5vccAccountInfo accountInfo;
   readonly attribute H5vccAudioConfigArray audioConfig;
   readonly attribute H5vccCrashLog crashLog;
   readonly attribute CValView cVal;
diff --git a/cobalt/h5vcc/h5vcc_accessibility.h b/cobalt/h5vcc/h5vcc_accessibility.h
index bb74c88..34c2eab 100644
--- a/cobalt/h5vcc/h5vcc_accessibility.h
+++ b/cobalt/h5vcc/h5vcc_accessibility.h
@@ -42,8 +42,7 @@
   void OnApplicationEvent(const base::Event* event);
 
   bool text_to_speech() const;
-  void AddTextToSpeechListener(
-      const H5vccAccessibilityCallbackHolder& holder);
+  void AddTextToSpeechListener(const H5vccAccessibilityCallbackHolder& holder);
 
   bool built_in_screen_reader() const;
   void set_built_in_screen_reader(bool value);
@@ -62,8 +61,7 @@
   base::EventDispatcher* event_dispatcher_;
   std::unique_ptr<H5vccAccessibilityCallbackReference>
       high_contrast_text_listener_;
-  std::unique_ptr<H5vccAccessibilityCallbackReference>
-      text_to_speech_listener_;
+  std::unique_ptr<H5vccAccessibilityCallbackReference> text_to_speech_listener_;
 
   DISALLOW_COPY_AND_ASSIGN(H5vccAccessibility);
 };
diff --git a/cobalt/h5vcc/h5vcc_account_info.cc b/cobalt/h5vcc/h5vcc_account_info.cc
deleted file mode 100644
index c6b6303..0000000
--- a/cobalt/h5vcc/h5vcc_account_info.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2015 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/h5vcc/h5vcc_account_info.h"
-
-#include <memory>
-#include <string>
-
-#include "starboard/user.h"
-
-namespace cobalt {
-namespace h5vcc {
-
-namespace {
-const int kMaxValueLength = 64 * 1024;
-
-std::string GetCurrentUserProperty(SbUserPropertyId property_id) {
-  SbUser user = SbUserGetCurrent();
-
-  if (!SbUserIsValid(user)) {
-    return "";
-  }
-
-  int size = SbUserGetPropertySize(user, property_id);
-  if (!size || size > kMaxValueLength) {
-    return "";
-  }
-
-  std::unique_ptr<char[]> value(new char[size]);
-  if (!SbUserGetProperty(user, property_id, value.get(), size)) {
-    return "";
-  }
-
-  std::string result = value.get();
-  return result;
-}
-
-}  // namespace
-
-H5vccAccountInfo::H5vccAccountInfo() {}
-
-std::string H5vccAccountInfo::avatar_url() const {
-  return GetCurrentUserProperty(kSbUserPropertyAvatarUrl);
-}
-
-std::string H5vccAccountInfo::username() const {
-  return GetCurrentUserProperty(kSbUserPropertyUserName);
-}
-
-std::string H5vccAccountInfo::user_id() const {
-  return GetCurrentUserProperty(kSbUserPropertyUserId);
-}
-
-}  // namespace h5vcc
-}  // namespace cobalt
diff --git a/cobalt/h5vcc/h5vcc_account_info.h b/cobalt/h5vcc/h5vcc_account_info.h
deleted file mode 100644
index 6634217..0000000
--- a/cobalt/h5vcc/h5vcc_account_info.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2015 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_H5VCC_H5VCC_ACCOUNT_INFO_H_
-#define COBALT_H5VCC_H5VCC_ACCOUNT_INFO_H_
-
-#include <string>
-
-#include "cobalt/script/wrappable.h"
-
-namespace cobalt {
-namespace h5vcc {
-
-class H5vccAccountInfo : public script::Wrappable {
- public:
-  H5vccAccountInfo();
-  std::string avatar_url() const;
-  std::string username() const;
-  std::string user_id() const;
-
-  DEFINE_WRAPPABLE_TYPE(H5vccAccountInfo);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(H5vccAccountInfo);
-};
-
-}  // namespace h5vcc
-}  // namespace cobalt
-
-#endif  // COBALT_H5VCC_H5VCC_ACCOUNT_INFO_H_
diff --git a/cobalt/h5vcc/h5vcc_account_manager_internal.cc b/cobalt/h5vcc/h5vcc_account_manager_internal.cc
index d3897c1..ad81d01 100644
--- a/cobalt/h5vcc/h5vcc_account_manager_internal.cc
+++ b/cobalt/h5vcc/h5vcc_account_manager_internal.cc
@@ -20,7 +20,6 @@
 #include "base/memory/weak_ptr.h"
 #include "cobalt/browser/switches.h"
 #include "cobalt/web/environment_settings_helper.h"
-#include "starboard/user.h"
 
 namespace cobalt {
 namespace h5vcc {
@@ -104,25 +103,22 @@
     return;
   }
 
-  SbUser current_user = SbUserGetCurrent();
-  DCHECK(SbUserIsValid(current_user));
-
   std::unique_ptr<account::AccessToken> access_token(nullptr);
 
   switch (operation) {
     case kPairing:
-      access_token = user_authorizer->AuthorizeUser(current_user);
+      access_token = user_authorizer->AuthorizeUser();
       DLOG_IF(INFO, !access_token) << "User authorization request failed.";
       break;
     case kUnpairing:
-      if (user_authorizer->DeauthorizeUser(current_user)) {
+      if (user_authorizer->DeauthorizeUser()) {
         break;
       }
       // The user canceled the flow, or there was some error. Fall into the next
       // case to get an access token if available and return that.
       DLOG(INFO) << "User deauthorization request failed. Try to get token.";
     case kGetToken:
-      access_token = user_authorizer->RefreshAuthorization(current_user);
+      access_token = user_authorizer->RefreshAuthorization();
       DLOG_IF(INFO, !access_token) << "Authorization refresh request failed.";
       break;
   }
diff --git a/cobalt/h5vcc/h5vcc_crash_log.cc b/cobalt/h5vcc/h5vcc_crash_log.cc
index baccbac..b3e76e7 100644
--- a/cobalt/h5vcc/h5vcc_crash_log.cc
+++ b/cobalt/h5vcc/h5vcc_crash_log.cc
@@ -15,7 +15,9 @@
 #include "cobalt/h5vcc/h5vcc_crash_log.h"
 
 #include <map>
+#include <memory>
 #include <string>
+#include <vector>
 
 #include "base/atomicops.h"
 #include "base/memory/singleton.h"
@@ -171,9 +173,21 @@
   return false;
 }
 
-std::string H5vccCrashLog::GetWatchdogViolations() {
+std::string H5vccCrashLog::GetWatchdogViolations(
+    const script::Sequence<std::string>& clients) {
   watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
-  if (watchdog) return watchdog->GetWatchdogViolations();
+  if (watchdog) {
+    // If not clients name is given, return all clients' data.
+    if (clients.size() == 0) {
+      return watchdog->GetWatchdogViolations();
+    }
+    std::vector<std::string> client_names;
+    for (script::Sequence<std::string>::size_type i = 0; i < clients.size();
+         ++i) {
+      client_names.push_back(clients.at(i).c_str());
+    }
+    return watchdog->GetWatchdogViolations(client_names);
+  }
   return "";
 }
 
diff --git a/cobalt/h5vcc/h5vcc_crash_log.h b/cobalt/h5vcc/h5vcc_crash_log.h
index bb20a48..ea06c88 100644
--- a/cobalt/h5vcc/h5vcc_crash_log.h
+++ b/cobalt/h5vcc/h5vcc_crash_log.h
@@ -78,7 +78,8 @@
 
   bool Ping(const std::string& name, const std::string& ping_info);
 
-  std::string GetWatchdogViolations();
+  std::string GetWatchdogViolations(
+      const script::Sequence<std::string>& clients = {});
 
   bool GetPersistentSettingWatchdogEnable();
 
diff --git a/cobalt/h5vcc/h5vcc_crash_log.idl b/cobalt/h5vcc/h5vcc_crash_log.idl
index e93caac..8d4a3ba 100644
--- a/cobalt/h5vcc/h5vcc_crash_log.idl
+++ b/cobalt/h5vcc/h5vcc_crash_log.idl
@@ -84,7 +84,7 @@
   //     ]
   //   }
   // }
-  DOMString getWatchdogViolations();
+  DOMString getWatchdogViolations(optional sequence<DOMString> clients);
 
   // Gets a persistent Watchdog setting that determines whether or not Watchdog
   // is enabled. When disabled, Watchdog behaves like a stub except that
diff --git a/cobalt/h5vcc/h5vcc_metric_type.idl b/cobalt/h5vcc/h5vcc_metric_type.idl
index 1a9ffc1..79bf952 100644
--- a/cobalt/h5vcc/h5vcc_metric_type.idl
+++ b/cobalt/h5vcc/h5vcc_metric_type.idl
@@ -13,11 +13,14 @@
 // limitations under the License.
 
 // The various metric types we support to be published through the H5vccMetrics
-// API.
+// API. The proto will be serialized and then base64 encoded.
 enum H5vccMetricType {
   // //third_party/metrics_proto/chrome_user_metrics_extension.proto
   // ChromeUserMetricsExtension proto.
   "UMA",
   // //third_party/metrics_proto/ukm/report.proto Report proto.
-  "UKM"
+  "UKM",
+  // Cobalt's trimmed down version of the UMA proto
+  // //third_party/metrics_proto/cobalt_uma_event.proto
+  "COBALT_UMA",
 };
diff --git a/cobalt/h5vcc/h5vcc_metrics.idl b/cobalt/h5vcc/h5vcc_metrics.idl
index 29aa11f..1d7292c 100644
--- a/cobalt/h5vcc/h5vcc_metrics.idl
+++ b/cobalt/h5vcc/h5vcc_metrics.idl
@@ -25,8 +25,8 @@
   // Example usage in JS:
   //
   //   window.h5vcc.metrics.onMetricEvent((metricType, payload) => {
-  //     if (metricType == 'UMA') {
-  //       // log UMA payload here...
+  //     if (metricType == 'COBALT_UMA') {
+  //       // log Cobalt UMA payload here...
   //     }
   //   });
   void onMetricEvent(H5vccMetricEventHandler eventHandler);
@@ -44,7 +44,12 @@
   // should never get called afterward.
   void disable();
 
-  // Returns the current enabled state of metrics reporting.
+  // Returns the current enabled state of metrics reporting. Note, the enable()
+  // and disable() APIs are asynchronous under the hood. This means if you call
+  // isEnabled() immediately after enable/disable, you may get unexpected
+  // results.
+  // TODO(b/290064552): Update this when H5vccMetrics APIs support async
+  // behavior.
   boolean isEnabled();
 
   // Sets the frequency in which Cobalt metrics will be snapshotted and sent to
@@ -56,7 +61,8 @@
 };
 
 // Callback invoked when a new metric payload is ready to be published. The
-// payload is a serialized protobuf and the metric type should give the consumer
-// a hint on how to deserialize it. See h5vcc_metric_type.idl for more info.
+// payload is a base64 encoded serialized protobuf and the metric type should
+// give the consumer a hint on how to deserialize it. See h5vcc_metric_type.idl
+// for more info.
 callback H5vccMetricEventHandler =
     void(H5vccMetricType metricType, DOMString metricPayload);
diff --git a/cobalt/h5vcc/h5vcc_screen.idl b/cobalt/h5vcc/h5vcc_screen.idl
index a075606..4aacdaa 100644
--- a/cobalt/h5vcc/h5vcc_screen.idl
+++ b/cobalt/h5vcc/h5vcc_screen.idl
@@ -19,4 +19,3 @@
   // screen diagonal is.
   [CallWith=EnvironmentSettings] static float GetDiagonal();
 };
-
diff --git a/cobalt/h5vcc/h5vcc_settings.cc b/cobalt/h5vcc/h5vcc_settings.cc
index 4babfd9..e6c7b26 100644
--- a/cobalt/h5vcc/h5vcc_settings.cc
+++ b/cobalt/h5vcc/h5vcc_settings.cc
@@ -106,10 +106,16 @@
   }
 
   if (name.compare(kQUIC) == 0) {
-    if (!network_module_) {
+    if (!persistent_settings_) {
       return false;
     } else {
-      network_module_->SetEnableQuic(value != 0);
+      persistent_settings_->SetPersistentSetting(
+          network::kQuicEnabledPersistentSettingsKey,
+          std::make_unique<base::Value>(value != 0));
+      // Tell NetworkModule (if exists) to re-query persistent settings.
+      if (network_module_) {
+        network_module_->SetEnableQuicFromPersistentSettings();
+      }
       return true;
     }
   }
diff --git a/cobalt/h5vcc/h5vcc_storage.cc b/cobalt/h5vcc/h5vcc_storage.cc
index 2c1f332..f059e8e 100644
--- a/cobalt/h5vcc/h5vcc_storage.cc
+++ b/cobalt/h5vcc/h5vcc_storage.cc
@@ -31,7 +31,6 @@
 #include "net/disk_cache/cobalt/resource_type.h"
 #include "net/http/http_cache.h"
 #include "net/http/http_transaction_factory.h"
-#include "starboard/common/file.h"
 #include "starboard/common/string.h"
 
 namespace cobalt {
@@ -69,6 +68,11 @@
   return response;
 }
 
+void ClearDirectory(const base::FilePath& file_path) {
+  base::DeleteFile(file_path, /*recursive=*/true);
+  base::CreateDirectory(file_path);
+}
+
 void DeleteCacheResourceTypeDirectory(disk_cache::ResourceType type) {
   auto metadata = disk_cache::kTypeMetadata[type];
   std::vector<char> cache_dir(kSbFileMaxPath + 1, 0);
@@ -77,7 +81,7 @@
   base::FilePath cache_type_dir =
       base::FilePath(cache_dir.data())
           .Append(FILE_PATH_LITERAL(metadata.directory));
-  starboard::SbFileDeleteRecursive(cache_type_dir.value().data(), true);
+  ClearDirectory(cache_type_dir);
 }
 
 void ClearCacheHelper(disk_cache::Backend* backend) {
@@ -150,21 +154,17 @@
   SbSystemGetPath(kSbSystemPathCacheDirectory, cache_dir.data(),
                   kSbFileMaxPath);
 
-  // Delete the contents of cache_dir.
-  starboard::SbFileDeleteRecursive(cache_dir.data(), true);
+  ClearDirectory(base::FilePath(cache_dir.data()));
 
   // Try to Create the test_file.
-  std::string test_file_path =
-      std::string(cache_dir.data()) + kSbFileSepString + kTestFileName;
-  SbFileError test_file_error;
-  starboard::ScopedFile test_file(test_file_path.c_str(),
-                                  kSbFileOpenAlways | kSbFileWrite, NULL,
-                                  &test_file_error);
+  base::FilePath test_file_path =
+      base::FilePath(cache_dir.data()).Append(kTestFileName);
+  base::File test_file(test_file_path,
+                       base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_WRITE);
 
-  if (test_file_error != kSbFileOk) {
-    return WriteTestResponse(
-        starboard::FormatString("SbFileError: %d while opening ScopedFile: %s",
-                                test_file_error, test_file_path.c_str()));
+  if (!test_file.IsValid()) {
+    return WriteTestResponse(starboard::FormatString(
+        "Error while opening ScopedFile: %s", test_file_path.value().c_str()));
   }
 
   // Repeatedly write test_string to test_size bytes of write_buffer.
@@ -180,11 +180,11 @@
   uint32 total_bytes_written = 0;
 
   do {
-    auto bytes_written =
-        test_file.Write(write_buf.data() + total_bytes_written,
-                        std::min(kBufferSize, test_size - total_bytes_written));
+    auto bytes_written = test_file.WriteAtCurrentPosNoBestEffort(
+        write_buf.data() + total_bytes_written,
+        std::min(kBufferSize, test_size - total_bytes_written));
     if (bytes_written <= 0) {
-      SbFileDelete(test_file_path.c_str());
+      base::DeleteFile(test_file_path, /*recursive=*/false);
       return WriteTestResponse("SbWrite -1 return value error");
     }
     total_bytes_written += bytes_written;
@@ -201,17 +201,13 @@
   SbSystemGetPath(kSbSystemPathCacheDirectory, cache_dir.data(),
                   kSbFileMaxPath);
 
-  std::string test_file_path =
-      std::string(cache_dir.data()) + kSbFileSepString + kTestFileName;
-  SbFileError test_file_error;
-  starboard::ScopedFile test_file(test_file_path.c_str(),
-                                  kSbFileOpenOnly | kSbFileRead, NULL,
-                                  &test_file_error);
-
-  if (test_file_error != kSbFileOk) {
-    return VerifyTestResponse(
-        starboard::FormatString("SbFileError: %d while opening ScopedFile: %s",
-                                test_file_error, test_file_path.c_str()));
+  base::FilePath test_file_path =
+      base::FilePath(cache_dir.data()).Append(kTestFileName);
+  base::File test_file(test_file_path,
+                       base::File::FLAG_OPEN | base::File::FLAG_READ);
+  if (!test_file.IsValid()) {
+    return VerifyTestResponse(starboard::FormatString(
+        "Error while opening ScopedFile: %s", test_file_path.value().c_str()));
   }
 
   // Incremental Reads of test_data, copies SbReadAll, using a maximum
@@ -220,10 +216,10 @@
 
   do {
     auto read_buffer = std::make_unique<char[]>(kBufferSize);
-    auto bytes_read = test_file.Read(
+    auto bytes_read = test_file.ReadAtCurrentPosNoBestEffort(
         read_buffer.get(), std::min(kBufferSize, test_size - total_bytes_read));
     if (bytes_read <= 0) {
-      SbFileDelete(test_file_path.c_str());
+      base::DeleteFile(test_file_path, /*recursive=*/false);
       return VerifyTestResponse("SbRead -1 return value error");
     }
 
@@ -240,12 +236,12 @@
   } while (total_bytes_read < test_size);
 
   if (total_bytes_read != test_size) {
-    SbFileDelete(test_file_path.c_str());
+    base::DeleteFile(test_file_path, /*recursive=*/false);
     return VerifyTestResponse(
         "File test data size does not match kTestDataSize");
   }
 
-  SbFileDelete(test_file_path.c_str());
+  base::DeleteFile(test_file_path, /*recursive=*/false);
   return VerifyTestResponse("", true, total_bytes_read);
 }
 
@@ -421,10 +417,10 @@
   std::vector<char> storage_dir(kSbFileMaxPath, 0);
   SbSystemGetPath(kSbSystemPathCacheDirectory, storage_dir.data(),
                   kSbFileMaxPath);
-  std::string service_worker_file_path =
-      std::string(storage_dir.data()) + kSbFileSepString +
-      worker::ServiceWorkerConsts::kSettingsJson;
-  SbFileDelete(service_worker_file_path.c_str());
+  base::FilePath service_worker_file_path =
+      base::FilePath(storage_dir.data())
+          .Append(worker::ServiceWorkerConsts::kSettingsJson);
+  base::DeleteFile(service_worker_file_path, /*recursive=*/false);
 }
 
 bool H5vccStorage::ValidatedCacheBackend() {
diff --git a/cobalt/input/input_device_manager_fuzzer.h b/cobalt/input/input_device_manager_fuzzer.h
index 421d5cd..5bc37c9 100644
--- a/cobalt/input/input_device_manager_fuzzer.h
+++ b/cobalt/input/input_device_manager_fuzzer.h
@@ -24,7 +24,7 @@
 namespace cobalt {
 namespace input {
 
-// This input fuzzer will continously generate random input events.  It is a
+// This input fuzzer will continuously generate random input events.  It is a
 // debug tool that can be used in place of a platform-specific
 // InputDeviceManager that generates input events from an external controller
 // device.
diff --git a/cobalt/input/key_event_handler.h b/cobalt/input/key_event_handler.h
index c873762..5c9960d 100644
--- a/cobalt/input/key_event_handler.h
+++ b/cobalt/input/key_event_handler.h
@@ -35,7 +35,7 @@
  public:
   // Called to handle a key event. The base class implementation just calls
   // DispatchKeyboardEvent. Overridden versions of this function may modify the
-  // incoming event and/or generate new events. Overriden versions should call
+  // incoming event and/or generate new events. Overridden versions should call
   // DispatchKeyboardEvent for each event filtered/produced.
   virtual void HandleKeyboardEvent(base::Token type,
                                    const dom::KeyboardEventInit& event);
diff --git a/cobalt/layout/anonymous_block_box.cc b/cobalt/layout/anonymous_block_box.cc
index b99fb09..b326ff7 100644
--- a/cobalt/layout/anonymous_block_box.cc
+++ b/cobalt/layout/anonymous_block_box.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/layout/anonymous_block_box.h"
 
+#include <memory>
+
 #include "cobalt/cssom/keyword_value.h"
 #include "cobalt/layout/inline_formatting_context.h"
 #include "cobalt/layout/used_style.h"
diff --git a/cobalt/layout/block_container_box.cc b/cobalt/layout/block_container_box.cc
index 0c04ea1..9d9257a 100644
--- a/cobalt/layout/block_container_box.cc
+++ b/cobalt/layout/block_container_box.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/layout/block_container_box.h"
 
+#include <memory>
+
 #include "cobalt/layout/formatting_context.h"
 #include "cobalt/layout/used_style.h"
 
@@ -36,9 +36,8 @@
 // Updates used values of "width" and "margin" properties based on
 // https://www.w3.org/TR/CSS21/visudet.html#Computing_widths_and_margins.
 void BlockContainerBox::UpdateContentWidthAndMargins(
-    BaseDirection containing_block_direction,
-    LayoutUnit containing_block_width, bool shrink_to_fit_width_forced,
-    bool width_depends_on_containing_block,
+    BaseDirection containing_block_direction, LayoutUnit containing_block_width,
+    bool shrink_to_fit_width_forced, bool width_depends_on_containing_block,
     const base::Optional<LayoutUnit>& maybe_left,
     const base::Optional<LayoutUnit>& maybe_right,
     const base::Optional<LayoutUnit>& maybe_margin_left,
@@ -47,9 +46,9 @@
     const base::Optional<LayoutUnit>& maybe_height) {
   if (IsAbsolutelyPositioned()) {
     UpdateWidthAssumingAbsolutelyPositionedBox(
-        containing_block_direction, containing_block_width,
-        maybe_left, maybe_right, maybe_width,
-        maybe_margin_left, maybe_margin_right, maybe_height);
+        containing_block_direction, containing_block_width, maybe_left,
+        maybe_right, maybe_width, maybe_margin_left, maybe_margin_right,
+        maybe_height);
   } else {
     base::Optional<LayoutUnit> maybe_nulled_width = maybe_width;
     Level forced_level = GetLevel();
@@ -346,8 +345,7 @@
 //     + "padding-right" + "border-right-width" + "margin-right" + "right"
 //     = width of containing block
 void BlockContainerBox::UpdateWidthAssumingAbsolutelyPositionedBox(
-    BaseDirection containing_block_direction,
-    LayoutUnit containing_block_width,
+    BaseDirection containing_block_direction, LayoutUnit containing_block_width,
     const base::Optional<LayoutUnit>& maybe_left,
     const base::Optional<LayoutUnit>& maybe_right,
     const base::Optional<LayoutUnit>& maybe_width,
@@ -626,8 +624,7 @@
 //     + "padding-right" + "border-right-width" + "margin-right"
 //     = width of containing block
 void BlockContainerBox::UpdateWidthAssumingBlockLevelInFlowBox(
-    BaseDirection containing_block_direction,
-    LayoutUnit containing_block_width,
+    BaseDirection containing_block_direction, LayoutUnit containing_block_width,
     const base::Optional<LayoutUnit>& maybe_width,
     const base::Optional<LayoutUnit>& possibly_overconstrained_margin_left,
     const base::Optional<LayoutUnit>& possibly_overconstrained_margin_right) {
diff --git a/cobalt/layout/block_formatting_block_container_box.cc b/cobalt/layout/block_formatting_block_container_box.cc
index cf45f33..f6a4185 100644
--- a/cobalt/layout/block_formatting_block_container_box.cc
+++ b/cobalt/layout/block_formatting_block_container_box.cc
@@ -50,7 +50,7 @@
         PushBackDirectChild(child_box);
         break;
       }
-    // Fall through if child is out-of-flow.
+      // Fall through if child is out-of-flow.
 
     case kInlineLevel:
       // An inline formatting context required,
diff --git a/cobalt/layout/block_level_replaced_box.cc b/cobalt/layout/block_level_replaced_box.cc
index 359313b..def5961 100644
--- a/cobalt/layout/block_level_replaced_box.cc
+++ b/cobalt/layout/block_level_replaced_box.cc
@@ -43,16 +43,16 @@
 Box::Level BlockLevelReplacedBox::GetLevel() const { return kBlockLevel; }
 
 void BlockLevelReplacedBox::UpdateHorizontalMargins(
-    BaseDirection containing_block_direction,
-    LayoutUnit containing_block_width, LayoutUnit border_box_width,
+    BaseDirection containing_block_direction, LayoutUnit containing_block_width,
+    LayoutUnit border_box_width,
     const base::Optional<LayoutUnit>& maybe_margin_left,
     const base::Optional<LayoutUnit>& maybe_margin_right) {
-  // Calculate the horizonal margins for block-level, replaced elements in
+  // Calculate the horizontal margins for block-level, replaced elements in
   // normal flow.
   //   https://www.w3.org/TR/CSS21/visudet.html#block-replaced-width
   UpdateHorizontalMarginsAssumingBlockLevelInFlowBox(
-      containing_block_direction, containing_block_width,
-      border_box_width, maybe_margin_left, maybe_margin_right);
+      containing_block_direction, containing_block_width, border_box_width,
+      maybe_margin_left, maybe_margin_right);
 }
 
 #ifdef COBALT_BOX_DUMP_ENABLED
diff --git a/cobalt/layout/box_generator.cc b/cobalt/layout/box_generator.cc
index 6eee421..b279f0c 100644
--- a/cobalt/layout/box_generator.cc
+++ b/cobalt/layout/box_generator.cc
@@ -339,22 +339,31 @@
   // If the optional is disengaged, then we don't know if punch out is enabled
   // or not.
   base::Optional<ReplacedBox::ReplacedBoxMode> replaced_box_mode;
-  if (video_element->GetDecodeTargetProvider()) {
+  bool paint_to_black = false;
+  auto decode_target_provider =
+      video_element->GetDecodeTargetProvider(&paint_to_black);
+  if (decode_target_provider) {
     DecodeTargetProvider::OutputMode output_mode =
-        video_element->GetDecodeTargetProvider()->GetOutputMode();
-    if (output_mode != DecodeTargetProvider::kOutputModeInvalid) {
+        decode_target_provider->GetOutputMode();
+    if (output_mode == DecodeTargetProvider::kOutputModeInvalid) {
+      if (paint_to_black) {
+        replaced_box_mode = ReplacedBox::ReplacedBoxMode::kPaintToBlack;
+      }
+    } else {
       replaced_box_mode =
           (output_mode == DecodeTargetProvider::kOutputModePunchOut)
               ? ReplacedBox::ReplacedBoxMode::kPunchOutVideo
-              : ReplacedBox::ReplacedBoxMode::kVideo;
+              : ReplacedBox::ReplacedBoxMode::kDecodeToTextureVideo;
     }
+  } else {
+    // ReplacedBox won't paint anything when |decode_target_provider| is
+    // nullptr, as |replace_image_cb_| is also null in this case.
   }
 
   ReplacedBoxGenerator replaced_box_generator(
       video_element->css_computed_style_declaration(),
-      video_element->GetDecodeTargetProvider()
-          ? base::Bind(GetVideoFrame, video_element->GetDecodeTargetProvider(),
-                       resource_provider)
+      decode_target_provider
+          ? base::Bind(GetVideoFrame, decode_target_provider, resource_provider)
           : ReplacedBox::ReplaceImageCB(),
       video_element->GetSetBoundsCB(), *paragraph_, text_position,
       base::nullopt, base::nullopt, base::nullopt, context_, replaced_box_mode,
diff --git a/cobalt/layout/box_intersection_observer_module.cc b/cobalt/layout/box_intersection_observer_module.cc
index 124d36c..ed0c7be 100644
--- a/cobalt/layout/box_intersection_observer_module.cc
+++ b/cobalt/layout/box_intersection_observer_module.cc
@@ -14,6 +14,8 @@
 
 #include "cobalt/layout/box_intersection_observer_module.h"
 
+#include <utility>
+
 #include "base/trace_event/trace_event.h"
 #include "cobalt/layout/box.h"
 
diff --git a/cobalt/layout/container_box.cc b/cobalt/layout/container_box.cc
index 9bef557..3af5c12 100644
--- a/cobalt/layout/container_box.cc
+++ b/cobalt/layout/container_box.cc
@@ -15,6 +15,7 @@
 #include "cobalt/layout/container_box.h"
 
 #include <algorithm>
+#include <utility>
 
 #include "cobalt/cssom/computed_style_utils.h"
 #include "cobalt/cssom/keyword_value.h"
diff --git a/cobalt/layout/flex_formatting_context.cc b/cobalt/layout/flex_formatting_context.cc
index af19fc0..87656c1 100644
--- a/cobalt/layout/flex_formatting_context.cc
+++ b/cobalt/layout/flex_formatting_context.cc
@@ -15,6 +15,7 @@
 #include "cobalt/layout/flex_formatting_context.h"
 
 #include <algorithm>
+#include <utility>
 
 #include "base/logging.h"
 #include "cobalt/cssom/keyword_value.h"
diff --git a/cobalt/layout/flex_item.cc b/cobalt/layout/flex_item.cc
index 231594b..1740ab3 100644
--- a/cobalt/layout/flex_item.cc
+++ b/cobalt/layout/flex_item.cc
@@ -15,6 +15,7 @@
 #include "cobalt/layout/flex_item.h"
 
 #include <algorithm>
+#include <memory>
 
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
diff --git a/cobalt/layout/flex_item.h b/cobalt/layout/flex_item.h
index becc390..25daf27 100644
--- a/cobalt/layout/flex_item.h
+++ b/cobalt/layout/flex_item.h
@@ -15,6 +15,7 @@
 #ifndef COBALT_LAYOUT_FLEX_ITEM_H_
 #define COBALT_LAYOUT_FLEX_ITEM_H_
 
+#include <memory>
 #include <vector>
 
 #include "base/logging.h"
diff --git a/cobalt/layout/flex_line.cc b/cobalt/layout/flex_line.cc
index a55819f..f289c6b 100644
--- a/cobalt/layout/flex_line.cc
+++ b/cobalt/layout/flex_line.cc
@@ -16,6 +16,7 @@
 
 #include <algorithm>
 #include <list>
+#include <utility>
 #include <vector>
 
 #include "cobalt/cssom/css_computed_style_data.h"
diff --git a/cobalt/layout/inline_container_box.cc b/cobalt/layout/inline_container_box.cc
index 0a60a22..b36bdc1 100644
--- a/cobalt/layout/inline_container_box.cc
+++ b/cobalt/layout/inline_container_box.cc
@@ -58,7 +58,7 @@
         // container box.
         return false;
       }
-    // Fall through if out-of-flow.
+      // Fall through if out-of-flow.
 
     case kInlineLevel:
       // If the inline container box already contains a line break, then no
diff --git a/cobalt/layout/inline_level_replaced_box.cc b/cobalt/layout/inline_level_replaced_box.cc
index 3b71f0c..594ec57 100644
--- a/cobalt/layout/inline_level_replaced_box.cc
+++ b/cobalt/layout/inline_level_replaced_box.cc
@@ -67,11 +67,10 @@
 }
 
 void InlineLevelReplacedBox::UpdateHorizontalMargins(
-    BaseDirection containing_block_direction,
-    LayoutUnit containing_block_width, LayoutUnit border_box_width,
+    BaseDirection containing_block_direction, LayoutUnit containing_block_width,
+    LayoutUnit border_box_width,
     const base::Optional<LayoutUnit>& maybe_margin_left,
     const base::Optional<LayoutUnit>& maybe_margin_right) {
-
   // A computed value of "auto" for "margin-left" or "margin-right" becomes
   // a used value of "0".
   //   https://www.w3.org/TR/CSS21/visudet.html#inline-replaced-width
diff --git a/cobalt/layout/insets_layout_unit.h b/cobalt/layout/insets_layout_unit.h
index 5b4264d..7b6c379 100644
--- a/cobalt/layout/insets_layout_unit.h
+++ b/cobalt/layout/insets_layout_unit.h
@@ -1,3 +1,4 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
@@ -27,8 +28,7 @@
 
 inline InsetsLayoutUnit operator+(const InsetsLayoutUnit& lhs,
                                   const InsetsLayoutUnit& rhs) {
-  return InsetsLayoutUnit(lhs.left() + rhs.left(),
-                          lhs.top() + rhs.top(),
+  return InsetsLayoutUnit(lhs.left() + rhs.left(), lhs.top() + rhs.top(),
                           lhs.right() + rhs.right(),
                           lhs.bottom() + rhs.bottom());
 }
diff --git a/cobalt/layout/intersection_observer_target.cc b/cobalt/layout/intersection_observer_target.cc
index e114025..9b8c009 100644
--- a/cobalt/layout/intersection_observer_target.cc
+++ b/cobalt/layout/intersection_observer_target.cc
@@ -257,8 +257,9 @@
   // If targetArea is non-zero, let intersectionRatio be intersectionArea
   // divided by targetArea. Otherwise, let intersectionRatio be 1 if
   // isIntersecting is true, or 0 if isIntersecting is false.
-  float intersection_ratio = target_area > 0 ? intersection_area / target_area
-                                             : is_intersecting ? 1.0f : 0.0f;
+  float intersection_ratio = target_area > 0   ? intersection_area / target_area
+                             : is_intersecting ? 1.0f
+                                               : 0.0f;
 
   // Let thresholdIndex be the index of the first entry in observer.thresholds
   // whose value is greater than intersectionRatio, or the length of
diff --git a/cobalt/layout/layout_unit.h b/cobalt/layout/layout_unit.h
index 7b057ca..64df9ac 100644
--- a/cobalt/layout/layout_unit.h
+++ b/cobalt/layout/layout_unit.h
@@ -15,9 +15,8 @@
 #ifndef COBALT_LAYOUT_LAYOUT_UNIT_H_
 #define COBALT_LAYOUT_LAYOUT_UNIT_H_
 
-#include <cmath>
-
 #include <algorithm>
+#include <cmath>
 #include <iostream>
 #include <utility>
 
diff --git a/cobalt/layout/letterboxed_image_test.cc b/cobalt/layout/letterboxed_image_test.cc
index c895853..21ce79d 100644
--- a/cobalt/layout/letterboxed_image_test.cc
+++ b/cobalt/layout/letterboxed_image_test.cc
@@ -16,7 +16,6 @@
 
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/math/size.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/layout/paragraph.cc b/cobalt/layout/paragraph.cc
index 5118161..86f87a0 100644
--- a/cobalt/layout/paragraph.cc
+++ b/cobalt/layout/paragraph.cc
@@ -16,7 +16,6 @@
 
 #include "base/i18n/char_iterator.h"
 #include "cobalt/base/unicode/character_values.h"
-
 #include "third_party/icu/source/common/unicode/char16ptr.h"
 #include "third_party/icu/source/common/unicode/ubidi.h"
 
diff --git a/cobalt/layout/paragraph.h b/cobalt/layout/paragraph.h
index d64233c..025f5dc 100644
--- a/cobalt/layout/paragraph.h
+++ b/cobalt/layout/paragraph.h
@@ -24,7 +24,6 @@
 #include "cobalt/layout/layout_unit.h"
 #include "cobalt/layout/line_wrapping.h"
 #include "cobalt/render_tree/font.h"
-
 #include "third_party/icu/source/common/unicode/brkiter.h"
 #include "third_party/icu/source/common/unicode/locid.h"
 #include "third_party/icu/source/common/unicode/unistr.h"
diff --git a/cobalt/layout/rect_layout_unit.cc b/cobalt/layout/rect_layout_unit.cc
index 37af714..9b1e83e 100644
--- a/cobalt/layout/rect_layout_unit.cc
+++ b/cobalt/layout/rect_layout_unit.cc
@@ -1,3 +1,4 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
@@ -20,8 +21,8 @@
 namespace layout {
 
 typedef class math::RectBase<RectLayoutUnit, PointLayoutUnit, SizeLayoutUnit,
-                             InsetsLayoutUnit, Vector2dLayoutUnit,
-                             LayoutUnit> RectBaseT;
+                             InsetsLayoutUnit, Vector2dLayoutUnit, LayoutUnit>
+    RectBaseT;
 
 bool RectLayoutUnit::IsExpressibleAsRect() const {
   return math::IsExpressibleAsInt(x().toFloat()) &&
diff --git a/cobalt/layout/render_tree_animations.h b/cobalt/layout/render_tree_animations.h
index 04585b3..397c0c4 100644
--- a/cobalt/layout/render_tree_animations.h
+++ b/cobalt/layout/render_tree_animations.h
@@ -52,7 +52,8 @@
  public:
   typedef base::Callback<void(
       const scoped_refptr<const cssom::CSSComputedStyleData>&,
-      typename T::Builder*)> Function;
+      typename T::Builder*)>
+      Function;
 };
 
 // Helper function that applies an animation set to a base style to produce
diff --git a/cobalt/layout/replaced_box.cc b/cobalt/layout/replaced_box.cc
index 21eba9a..a31407e 100644
--- a/cobalt/layout/replaced_box.cc
+++ b/cobalt/layout/replaced_box.cc
@@ -316,9 +316,14 @@
     return;
   }
 
-  if (replaced_box_mode_ == base::nullopt) {
-    // If we don't have a data stream associated with this video [yet], then
-    // we don't yet know if it is punched out or not, and so render black.
+  if (!replaced_box_mode_.has_value()) {
+    // Don't render anything, so any background color or image will be visible.
+    return;
+  }
+
+  if (replaced_box_mode_ == ReplacedBoxMode::kPaintToBlack) {
+    // Explicitly render black if we don't have a data stream associated with
+    // this video [yet], this is the same as the previous behavior.
     border_node_builder->AddChild(new RectNode(
         math::RectF(content_box_size()),
         std::unique_ptr<render_tree::Brush>(new render_tree::SolidColorBrush(
@@ -327,7 +332,7 @@
     return;
   }
 
-  if (*replaced_box_mode_ == ReplacedBox::ReplacedBoxMode::kLottie) {
+  if (*replaced_box_mode_ == ReplacedBoxMode::kLottie) {
     AnimateNode::Builder animate_node_builder;
     scoped_refptr<LottieNode> lottie_node =
         new LottieNode(nullptr, math::RectF());
@@ -347,7 +352,7 @@
   // Map-to-mesh is only supported with decode-to-texture videos.
   const bool supports_mtm =
       replaced_box_mode_ &&
-      *replaced_box_mode_ == ReplacedBox::ReplacedBoxMode::kVideo;
+      *replaced_box_mode_ == ReplacedBoxMode::kDecodeToTextureVideo;
 
   if (supports_mtm && mtm_filter_function &&
       mtm_filter_function->mesh_spec().mesh_type() !=
@@ -759,7 +764,7 @@
   scoped_refptr<CompositionNode> composition_node =
       new CompositionNode(composition_node_builder);
 
-  if (*replaced_box_mode_ == ReplacedBox::ReplacedBoxMode::kPunchOutVideo) {
+  if (*replaced_box_mode_ == ReplacedBoxMode::kPunchOutVideo) {
     LetterboxDimensions letterbox_dims =
         GetLetterboxDimensions(content_size_, content_box_size());
     AddLetterboxedPunchThroughVideoNodeToRenderTree(
diff --git a/cobalt/layout/replaced_box.h b/cobalt/layout/replaced_box.h
index f4384e5..3837b7c 100644
--- a/cobalt/layout/replaced_box.h
+++ b/cobalt/layout/replaced_box.h
@@ -43,7 +43,12 @@
   typedef base::Callback<scoped_refptr<render_tree::Image>()> ReplaceImageCB;
   typedef render_tree::PunchThroughVideoNode::SetBoundsCB SetBoundsCB;
 
-  enum class ReplacedBoxMode { kVideo, kPunchOutVideo, kLottie };
+  enum class ReplacedBoxMode {
+    kPaintToBlack,  // Paint a black rectangle
+    kDecodeToTextureVideo,
+    kPunchOutVideo,
+    kLottie
+  };
 
   ReplacedBox(const scoped_refptr<cssom::CSSComputedStyleDeclaration>&
                   css_computed_style_declaration,
diff --git a/cobalt/layout/used_style.h b/cobalt/layout/used_style.h
index 0dbd9d3..c41805f 100644
--- a/cobalt/layout/used_style.h
+++ b/cobalt/layout/used_style.h
@@ -381,8 +381,7 @@
     const SizeLayoutUnit& containing_block_size);
 base::Optional<LayoutUnit> GetUsedFlexBasisIfNotContent(
     const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style,
-    bool main_direction_is_horizontal,
-    LayoutUnit main_space,
+    bool main_direction_is_horizontal, LayoutUnit main_space,
     bool* flex_basis_depends_on_available_space);
 base::Optional<LayoutUnit> GetUsedWidthIfNotAuto(
     const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style,
diff --git a/cobalt/layout/used_style_test.cc b/cobalt/layout/used_style_test.cc
index e381683..267f417 100644
--- a/cobalt/layout/used_style_test.cc
+++ b/cobalt/layout/used_style_test.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/layout/used_style.h"
 
+#include <memory>
+#include <utility>
+
 #include "cobalt/cssom/calc_value.h"
 #include "cobalt/cssom/keyword_value.h"
 #include "cobalt/cssom/length_value.h"
diff --git a/cobalt/layout_tests/layout_tests.cc b/cobalt/layout_tests/layout_tests.cc
index 6679e3f..dd21a35 100644
--- a/cobalt/layout_tests/layout_tests.cc
+++ b/cobalt/layout_tests/layout_tests.cc
@@ -361,13 +361,11 @@
     LottiePlayerLayoutTests, Layout,
     ::testing::ValuesIn(EnumerateLayoutTests("lottie-player")), GetTestName());
 
-// Disable on Windows until network stack is implemented.
-#if !defined(COBALT_WIN)
-// Content Security Policy test cases.
-INSTANTIATE_TEST_CASE_P(ContentSecurityPolicyTests, Layout,
+// Content Security Policy test cases
+// TODO(b/145689263): Move to blackbox tests to be hermetic
+INSTANTIATE_TEST_CASE_P(DISABLED_ContentSecurityPolicyTests, Layout,
                         ::testing::ValuesIn(EnumerateLayoutTests("csp")),
                         GetTestName());
-#endif  // !defined(COBALT_WIN)
 
 // Pixel-perfect tests.
 INSTANTIATE_TEST_CASE_P(
diff --git a/cobalt/layout_tests/test_utils.cc b/cobalt/layout_tests/test_utils.cc
index ffbe76b..a5f9937 100644
--- a/cobalt/layout_tests/test_utils.cc
+++ b/cobalt/layout_tests/test_utils.cc
@@ -21,7 +21,7 @@
 #include "cobalt/base/cobalt_paths.h"
 #include "url/gurl.h"
 
-    namespace cobalt {
+namespace cobalt {
 namespace layout_tests {
 
 namespace {
diff --git a/cobalt/layout_tests/testdata/bidi/inline-container-boxes-should-continue-active-paragraph.html b/cobalt/layout_tests/testdata/bidi/inline-container-boxes-should-continue-active-paragraph.html
index 169f063..98d0c8a 100644
--- a/cobalt/layout_tests/testdata/bidi/inline-container-boxes-should-continue-active-paragraph.html
+++ b/cobalt/layout_tests/testdata/bidi/inline-container-boxes-should-continue-active-paragraph.html
@@ -26,4 +26,4 @@
     <div>a<span>b<span>12دل</span>تد3<span>4</span>cd</span></div>
   </div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/bidi/mirror-characters-should-be-reversed-in-rtl.html b/cobalt/layout_tests/testdata/bidi/mirror-characters-should-be-reversed-in-rtl.html
index 95c2445..73242c6 100644
--- a/cobalt/layout_tests/testdata/bidi/mirror-characters-should-be-reversed-in-rtl.html
+++ b/cobalt/layout_tests/testdata/bidi/mirror-characters-should-be-reversed-in-rtl.html
@@ -25,4 +25,4 @@
     <span>ط(ل[ت{د}ل]ت)د</span>
   </div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/bidi/nested-block-boxes-should-close-active-paragraph.html b/cobalt/layout_tests/testdata/bidi/nested-block-boxes-should-close-active-paragraph.html
index 93e8b4c..a752259 100644
--- a/cobalt/layout_tests/testdata/bidi/nested-block-boxes-should-close-active-paragraph.html
+++ b/cobalt/layout_tests/testdata/bidi/nested-block-boxes-should-close-active-paragraph.html
@@ -26,4 +26,4 @@
     <div>د<div>دد</div>1دددد</div>
   </div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/bidi/numbers-should-have-weak-directionality-1.html b/cobalt/layout_tests/testdata/bidi/numbers-should-have-weak-directionality-1.html
index bf301c8..5eca78e 100644
--- a/cobalt/layout_tests/testdata/bidi/numbers-should-have-weak-directionality-1.html
+++ b/cobalt/layout_tests/testdata/bidi/numbers-should-have-weak-directionality-1.html
@@ -29,4 +29,4 @@
     <div>د1b2</div>
   </div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/bidi/numbers-should-have-weak-directionality-2.html b/cobalt/layout_tests/testdata/bidi/numbers-should-have-weak-directionality-2.html
index 3602e0f..94869e0 100644
--- a/cobalt/layout_tests/testdata/bidi/numbers-should-have-weak-directionality-2.html
+++ b/cobalt/layout_tests/testdata/bidi/numbers-should-have-weak-directionality-2.html
@@ -30,4 +30,4 @@
     <div>د1a2د</div>
   </div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/bidi/numbers-should-have-weak-directionality-3.html b/cobalt/layout_tests/testdata/bidi/numbers-should-have-weak-directionality-3.html
index c9eba5d..175ce8c 100644
--- a/cobalt/layout_tests/testdata/bidi/numbers-should-have-weak-directionality-3.html
+++ b/cobalt/layout_tests/testdata/bidi/numbers-should-have-weak-directionality-3.html
@@ -29,4 +29,4 @@
     <div>د1aد2د3دb4د</div>
   </div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/bidi/paragraph-should-maintain-directional-stack-with-nested-inline-container-blocks.html b/cobalt/layout_tests/testdata/bidi/paragraph-should-maintain-directional-stack-with-nested-inline-container-blocks.html
index 4aed6ac..6438070 100644
--- a/cobalt/layout_tests/testdata/bidi/paragraph-should-maintain-directional-stack-with-nested-inline-container-blocks.html
+++ b/cobalt/layout_tests/testdata/bidi/paragraph-should-maintain-directional-stack-with-nested-inline-container-blocks.html
@@ -34,4 +34,4 @@
     <div>a<span dir="rtl">b<span dir="rtl">12دل</span>تد3<span dir="ltr">4</span>.cd</span>.,</div>
   </div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/bidi/whitespace-should-be-handled-properly-with-bidirectional-text.html b/cobalt/layout_tests/testdata/bidi/whitespace-should-be-handled-properly-with-bidirectional-text.html
index 6767606..6958021 100644
--- a/cobalt/layout_tests/testdata/bidi/whitespace-should-be-handled-properly-with-bidirectional-text.html
+++ b/cobalt/layout_tests/testdata/bidi/whitespace-should-be-handled-properly-with-bidirectional-text.html
@@ -31,4 +31,4 @@
     <div dir="rtl"><span> 1234 ط1لتدل </span></div>
   </div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/cluster-fuzz/fuzz-222.html b/cobalt/layout_tests/testdata/cluster-fuzz/fuzz-222.html
index 9f6ed1a..81db0b2 100644
--- a/cobalt/layout_tests/testdata/cluster-fuzz/fuzz-222.html
+++ b/cobalt/layout_tests/testdata/cluster-fuzz/fuzz-222.html
@@ -14,4 +14,4 @@
 <!--  -->
  class="blockImageCaption"><small></small></div>
 >
-<!-- 
\ No newline at end of file
+<!--
diff --git a/cobalt/layout_tests/testdata/cluster-fuzz/layout_tests.txt b/cobalt/layout_tests/testdata/cluster-fuzz/layout_tests.txt
index 12a4567..e9a6f05 100644
--- a/cobalt/layout_tests/testdata/cluster-fuzz/layout_tests.txt
+++ b/cobalt/layout_tests/testdata/cluster-fuzz/layout_tests.txt
@@ -1 +1 @@
-fuzz-222
\ No newline at end of file
+fuzz-222
diff --git a/cobalt/layout_tests/testdata/cobalt/screenshot-with-animation.html b/cobalt/layout_tests/testdata/cobalt/screenshot-with-animation.html
index 6298fe3..031c87b 100644
--- a/cobalt/layout_tests/testdata/cobalt/screenshot-with-animation.html
+++ b/cobalt/layout_tests/testdata/cobalt/screenshot-with-animation.html
@@ -74,7 +74,7 @@
         }
         image.src = image_url;
       }).catch( () => {
-        console.log('window.screenshot() error occured.');
+        console.log('window.screenshot() error occurred.');
         if (window.testRunner) {
           window.testRunner.notifyDone();
         }
diff --git a/cobalt/layout_tests/testdata/cobalt/screenshot.html b/cobalt/layout_tests/testdata/cobalt/screenshot.html
index cc86f83..12a30cb 100644
--- a/cobalt/layout_tests/testdata/cobalt/screenshot.html
+++ b/cobalt/layout_tests/testdata/cobalt/screenshot.html
@@ -62,7 +62,7 @@
       }
       image.src = image_url;
     }).catch( () => {
-      console.log('window.screenshot() error occured.');
+      console.log('window.screenshot() error occurred.');
       if (window.testRunner) {
         window.testRunner.notifyDone();
       }
diff --git a/cobalt/layout_tests/testdata/css-2-1/10-1-absolute-positioned-elements-are-positioned-relative-to-parent-element-flow.html b/cobalt/layout_tests/testdata/css-2-1/10-1-absolute-positioned-elements-are-positioned-relative-to-parent-element-flow.html
index b20d1b1..d5e8546 100644
--- a/cobalt/layout_tests/testdata/css-2-1/10-1-absolute-positioned-elements-are-positioned-relative-to-parent-element-flow.html
+++ b/cobalt/layout_tests/testdata/css-2-1/10-1-absolute-positioned-elements-are-positioned-relative-to-parent-element-flow.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Absolutely positioned elements should have their static position set
- | to where they would have appeared if they were layed out within their
+ | to where they would have appeared if they were laid out within their
  | parent element's flow.  This test ensures that an absolutely positioned
  | element has static position set according to its parent element's flow, not
  | its containing block.
diff --git a/cobalt/layout_tests/testdata/css-2-1/10-1-absolute-positioned-elements-container-block-is-absolute-positioned-ancestor.html b/cobalt/layout_tests/testdata/css-2-1/10-1-absolute-positioned-elements-container-block-is-absolute-positioned-ancestor.html
index 1928dd3..6728cc3 100644
--- a/cobalt/layout_tests/testdata/css-2-1/10-1-absolute-positioned-elements-container-block-is-absolute-positioned-ancestor.html
+++ b/cobalt/layout_tests/testdata/css-2-1/10-1-absolute-positioned-elements-container-block-is-absolute-positioned-ancestor.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Absolutely positioned elements should have their static position set
- | to where they would have appeared if they were layed out within their
+ | to where they would have appeared if they were laid out within their
  | containing block.  For absolutely positioned elements, their containing block
  | is specified to be their first ancestor that has a position of 'absolute',
  | 'relative' or 'fixed'.  This test ensures that we locate the containing block
diff --git a/cobalt/layout_tests/testdata/css-2-1/10-3-7-blockification-should-not-affect-static-position-rtl.html b/cobalt/layout_tests/testdata/css-2-1/10-3-7-blockification-should-not-affect-static-position-rtl.html
index cf67983..6ca5cac 100644
--- a/cobalt/layout_tests/testdata/css-2-1/10-3-7-blockification-should-not-affect-static-position-rtl.html
+++ b/cobalt/layout_tests/testdata/css-2-1/10-3-7-blockification-should-not-affect-static-position-rtl.html
@@ -79,4 +79,3 @@
 </div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css-2-1/10-3-7-blockification-should-not-affect-static-position.html b/cobalt/layout_tests/testdata/css-2-1/10-3-7-blockification-should-not-affect-static-position.html
index 973e224..02f9925 100644
--- a/cobalt/layout_tests/testdata/css-2-1/10-3-7-blockification-should-not-affect-static-position.html
+++ b/cobalt/layout_tests/testdata/css-2-1/10-3-7-blockification-should-not-affect-static-position.html
@@ -79,4 +79,3 @@
 </div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css-2-1/18-4-outline-overflow-hidden.html b/cobalt/layout_tests/testdata/css-2-1/18-4-outline-overflow-hidden.html
index 1c2a197..6a50f01 100644
--- a/cobalt/layout_tests/testdata/css-2-1/18-4-outline-overflow-hidden.html
+++ b/cobalt/layout_tests/testdata/css-2-1/18-4-outline-overflow-hidden.html
@@ -30,4 +30,3 @@
   <div class="outline border"></div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css-2-1/18-4-outline.html b/cobalt/layout_tests/testdata/css-2-1/18-4-outline.html
index 961a1c1..e09ac2a 100644
--- a/cobalt/layout_tests/testdata/css-2-1/18-4-outline.html
+++ b/cobalt/layout_tests/testdata/css-2-1/18-4-outline.html
@@ -29,4 +29,3 @@
   <div class="outline border"></div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css-2-1/8-3-negative_margins-should-be-allowed-to-produce_negative-box-widths.html b/cobalt/layout_tests/testdata/css-2-1/8-3-negative_margins-should-be-allowed-to-produce_negative-box-widths.html
index 945e191..64c918a 100644
--- a/cobalt/layout_tests/testdata/css-2-1/8-3-negative_margins-should-be-allowed-to-produce_negative-box-widths.html
+++ b/cobalt/layout_tests/testdata/css-2-1/8-3-negative_margins-should-be-allowed-to-produce_negative-box-widths.html
@@ -26,4 +26,4 @@
     <div><span>Yes<span><span class="negative-margin"> a </span></span>No</span></div>
   </div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css-2-1/9-4-2-splitting-of-boxes-can-affect-containing-box-of-children.html b/cobalt/layout_tests/testdata/css-2-1/9-4-2-splitting-of-boxes-can-affect-containing-box-of-children.html
index ff44e91..93855d8 100644
--- a/cobalt/layout_tests/testdata/css-2-1/9-4-2-splitting-of-boxes-can-affect-containing-box-of-children.html
+++ b/cobalt/layout_tests/testdata/css-2-1/9-4-2-splitting-of-boxes-can-affect-containing-box-of-children.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | When a box is split in inline formatting context, the newly generated box
- | inherits the stacking context and the contaning block from the older sibling.
+ | inherits the stacking context and the containing block from the older sibling.
  -->
 <html>
 <body style="margin:0px; font-family: Roboto; font-size: 20px;">
diff --git a/cobalt/layout_tests/testdata/css-2-1/9-4-3-relative-positioned-elements-are-offset-from-normal-flow-via-right-and-bottom.html b/cobalt/layout_tests/testdata/css-2-1/9-4-3-relative-positioned-elements-are-offset-from-normal-flow-via-right-and-bottom.html
index 60a7f80..72fa737 100644
--- a/cobalt/layout_tests/testdata/css-2-1/9-4-3-relative-positioned-elements-are-offset-from-normal-flow-via-right-and-bottom.html
+++ b/cobalt/layout_tests/testdata/css-2-1/9-4-3-relative-positioned-elements-are-offset-from-normal-flow-via-right-and-bottom.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | This is a simple relative positioning test which checks that the element
- | is offset from its standard in-flow position by specifing right and bottom,
+ | is offset from its standard in-flow position by specifying right and bottom,
  | and does not affect the layout of surrounding elements in the flow.
  |   https://www.w3.org/TR/CSS21/visuren.html#relative-positioning
  -->
diff --git a/cobalt/layout_tests/testdata/css-2-1/9-9-1-stacking-contexts-and-containing-blocks-in-separate-subtrees.html b/cobalt/layout_tests/testdata/css-2-1/9-9-1-stacking-contexts-and-containing-blocks-in-separate-subtrees.html
index 5fabe2f..6b5421d 100644
--- a/cobalt/layout_tests/testdata/css-2-1/9-9-1-stacking-contexts-and-containing-blocks-in-separate-subtrees.html
+++ b/cobalt/layout_tests/testdata/css-2-1/9-9-1-stacking-contexts-and-containing-blocks-in-separate-subtrees.html
@@ -69,4 +69,3 @@
 </div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css-2-1/9-9-1-stacking-contexts-and-containing-blocks-with-transforms.html b/cobalt/layout_tests/testdata/css-2-1/9-9-1-stacking-contexts-and-containing-blocks-with-transforms.html
index 9743f20..3488dbf 100644
--- a/cobalt/layout_tests/testdata/css-2-1/9-9-1-stacking-contexts-and-containing-blocks-with-transforms.html
+++ b/cobalt/layout_tests/testdata/css-2-1/9-9-1-stacking-contexts-and-containing-blocks-with-transforms.html
@@ -70,4 +70,3 @@
 </div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css-2-1/DISABLED-10-3-7-absolute-elements-do-not-break-inline-boxes.html b/cobalt/layout_tests/testdata/css-2-1/DISABLED-10-3-7-absolute-elements-do-not-break-inline-boxes.html
index 5fdb3b9..f6bf6ce 100644
--- a/cobalt/layout_tests/testdata/css-2-1/DISABLED-10-3-7-absolute-elements-do-not-break-inline-boxes.html
+++ b/cobalt/layout_tests/testdata/css-2-1/DISABLED-10-3-7-absolute-elements-do-not-break-inline-boxes.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Absolutely positioned elements should not participate in layout though their
- | static position will be set as if they were layed out.  This test checks
+ | static position will be set as if they were laid out.  This test checks
  | that an absolute element that ordinarily would have caused a line break
  | within an inline box does not affect layout, and also that the absolute
  | element *does* appear to follow a line break.
diff --git a/cobalt/layout_tests/testdata/css-2-1/DISABLED-10-3-7-inline-absolute-elements-do-not-break-inline-boxes-but-appear-at-inline-position.html b/cobalt/layout_tests/testdata/css-2-1/DISABLED-10-3-7-inline-absolute-elements-do-not-break-inline-boxes-but-appear-at-inline-position.html
index 8dd18e8..55aca7f 100644
--- a/cobalt/layout_tests/testdata/css-2-1/DISABLED-10-3-7-inline-absolute-elements-do-not-break-inline-boxes-but-appear-at-inline-position.html
+++ b/cobalt/layout_tests/testdata/css-2-1/DISABLED-10-3-7-inline-absolute-elements-do-not-break-inline-boxes-but-appear-at-inline-position.html
@@ -3,7 +3,7 @@
  | Absolutely positioned elements should not participate in layout and therefore
  | if however their static position should be such that it was as if they did.
  | This test ensures that when the element has a display of 'inline', its
- | static is where it would have been had it been layed out, even though the
+ | static is where it would have been had it been laid out, even though the
  | layout of its siblings is not affected.
  -->
 <html>
diff --git a/cobalt/layout_tests/testdata/css-text-3/6-2-gracefully-handle-unbreakable-overflow-word-with-overflow-wrap-break-word.html b/cobalt/layout_tests/testdata/css-text-3/6-2-gracefully-handle-unbreakable-overflow-word-with-overflow-wrap-break-word.html
index 1a55dbb..c9e527b 100644
--- a/cobalt/layout_tests/testdata/css-text-3/6-2-gracefully-handle-unbreakable-overflow-word-with-overflow-wrap-break-word.html
+++ b/cobalt/layout_tests/testdata/css-text-3/6-2-gracefully-handle-unbreakable-overflow-word-with-overflow-wrap-break-word.html
@@ -22,4 +22,4 @@
 <body>
   <div class="containing-block">a</div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css-text-3/7-1-text-align-values-left-center-right-should-not-base-alignment-on-line-box-direction.html b/cobalt/layout_tests/testdata/css-text-3/7-1-text-align-values-left-center-right-should-not-base-alignment-on-line-box-direction.html
index 80ac02b..6f5d360 100644
--- a/cobalt/layout_tests/testdata/css-text-3/7-1-text-align-values-left-center-right-should-not-base-alignment-on-line-box-direction.html
+++ b/cobalt/layout_tests/testdata/css-text-3/7-1-text-align-values-left-center-right-should-not-base-alignment-on-line-box-direction.html
@@ -51,4 +51,4 @@
     <span>abcdefghijklm nopqrstuvwxyz</span>
   </div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css-transforms/15-1-scale-transform-function.html b/cobalt/layout_tests/testdata/css-transforms/15-1-scale-transform-function.html
index f25535c..0a700b9 100644
--- a/cobalt/layout_tests/testdata/css-transforms/15-1-scale-transform-function.html
+++ b/cobalt/layout_tests/testdata/css-transforms/15-1-scale-transform-function.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | One should be able to specify transform functions via scale functions.
- | A two time scaled green square is partically overlap with a red square.
+ | A two time scaled green square is partially overlap with a red square.
  -->
 <html>
 <head>
diff --git a/cobalt/layout_tests/testdata/css3-animations/layout_tests.txt b/cobalt/layout_tests/testdata/css3-animations/layout_tests.txt
index 7ea7b0f..a3bda5b 100644
--- a/cobalt/layout_tests/testdata/css3-animations/layout_tests.txt
+++ b/cobalt/layout_tests/testdata/css3-animations/layout_tests.txt
@@ -6,4 +6,3 @@
 3-simple-animation
 canceled_animation_should_not_get_animationend_event
 removed_animation_from_other_animationend_event_handler_should_still_get_animationend_event
-
diff --git a/cobalt/layout_tests/testdata/css3-background/14-2-1-background-with-color-image-repeat-position.html b/cobalt/layout_tests/testdata/css3-background/14-2-1-background-with-color-image-repeat-position.html
index 71aeffa..59611ed 100644
--- a/cobalt/layout_tests/testdata/css3-background/14-2-1-background-with-color-image-repeat-position.html
+++ b/cobalt/layout_tests/testdata/css3-background/14-2-1-background-with-color-image-repeat-position.html
@@ -36,4 +36,3 @@
   <div id='image'></div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-background/3-11-2-body-background-can-be-set-to-transparent-later.html b/cobalt/layout_tests/testdata/css3-background/3-11-2-body-background-can-be-set-to-transparent-later.html
index 6e33a15..1d732e1 100644
--- a/cobalt/layout_tests/testdata/css3-background/3-11-2-body-background-can-be-set-to-transparent-later.html
+++ b/cobalt/layout_tests/testdata/css3-background/3-11-2-body-background-can-be-set-to-transparent-later.html
@@ -21,7 +21,7 @@
       if (window.testRunner) {
         window.testRunner.DoNonMeasuredLayout();
       }
-      
+
       document.body.style.backgroundColor = 'transparent';
 
       if (window.testRunner) {
diff --git a/cobalt/layout_tests/testdata/css3-background/4-1-border-color-2-values-with-rounded-corners.html b/cobalt/layout_tests/testdata/css3-background/4-1-border-color-2-values-with-rounded-corners.html
index 1fc226b..f29c0c4 100644
--- a/cobalt/layout_tests/testdata/css3-background/4-1-border-color-2-values-with-rounded-corners.html
+++ b/cobalt/layout_tests/testdata/css3-background/4-1-border-color-2-values-with-rounded-corners.html
@@ -18,4 +18,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/4-1-border-color-3-values-with-rounded-corners.html b/cobalt/layout_tests/testdata/css3-background/4-1-border-color-3-values-with-rounded-corners.html
index eb6b3e8..e4484dd 100644
--- a/cobalt/layout_tests/testdata/css3-background/4-1-border-color-3-values-with-rounded-corners.html
+++ b/cobalt/layout_tests/testdata/css3-background/4-1-border-color-3-values-with-rounded-corners.html
@@ -18,4 +18,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/4-1-border-color-4-values-with-different-rounded-corners-and-different-border-widths.html b/cobalt/layout_tests/testdata/css3-background/4-1-border-color-4-values-with-different-rounded-corners-and-different-border-widths.html
index 9de0f5d..331495a 100644
--- a/cobalt/layout_tests/testdata/css3-background/4-1-border-color-4-values-with-different-rounded-corners-and-different-border-widths.html
+++ b/cobalt/layout_tests/testdata/css3-background/4-1-border-color-4-values-with-different-rounded-corners-and-different-border-widths.html
@@ -22,4 +22,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/4-1-border-color-4-values-with-different-rounded-corners.html b/cobalt/layout_tests/testdata/css3-background/4-1-border-color-4-values-with-different-rounded-corners.html
index 071f22c..66d58c6 100644
--- a/cobalt/layout_tests/testdata/css3-background/4-1-border-color-4-values-with-different-rounded-corners.html
+++ b/cobalt/layout_tests/testdata/css3-background/4-1-border-color-4-values-with-different-rounded-corners.html
@@ -20,4 +20,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/4-3-border-width-2-values-with-rounded-corners.html b/cobalt/layout_tests/testdata/css3-background/4-3-border-width-2-values-with-rounded-corners.html
index c092ca5..fd95b72 100644
--- a/cobalt/layout_tests/testdata/css3-background/4-3-border-width-2-values-with-rounded-corners.html
+++ b/cobalt/layout_tests/testdata/css3-background/4-3-border-width-2-values-with-rounded-corners.html
@@ -18,4 +18,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/4-3-border-width-3-values-with-rounded-corners.html b/cobalt/layout_tests/testdata/css3-background/4-3-border-width-3-values-with-rounded-corners.html
index 7693fff..bf0769a 100644
--- a/cobalt/layout_tests/testdata/css3-background/4-3-border-width-3-values-with-rounded-corners.html
+++ b/cobalt/layout_tests/testdata/css3-background/4-3-border-width-3-values-with-rounded-corners.html
@@ -18,4 +18,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/4-3-border-width-4-values-with-different-rounded-corners.html b/cobalt/layout_tests/testdata/css3-background/4-3-border-width-4-values-with-different-rounded-corners.html
index 4a33512..cc5a249 100644
--- a/cobalt/layout_tests/testdata/css3-background/4-3-border-width-4-values-with-different-rounded-corners.html
+++ b/cobalt/layout_tests/testdata/css3-background/4-3-border-width-4-values-with-different-rounded-corners.html
@@ -20,4 +20,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color-and-border-and-inset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color-and-border-and-inset-shadow.html
index a46b00a..5c87759 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color-and-border-and-inset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color-and-border-and-inset-shadow.html
@@ -22,4 +22,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color-and-border-and-outset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color-and-border-and-outset-shadow.html
index 1cc1359..530d7ac 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color-and-border-and-outset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color-and-border-and-outset-shadow.html
@@ -22,4 +22,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color-and-border.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color-and-border.html
index 63e2826..5e980d8 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color-and-border.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color-and-border.html
@@ -21,4 +21,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color.html
index 9dc4581..5772e67 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-background-color.html
@@ -19,4 +19,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-border-only.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-border-only.html
index 0b16b13..ef97127 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-border-only.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-2-values-with-border-only.html
@@ -19,4 +19,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color-and-border-and-outset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color-and-border-and-outset-shadow.html
index 3e5517a..19002fc 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color-and-border-and-outset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color-and-border-and-outset-shadow.html
@@ -22,4 +22,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color-and-inset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color-and-inset-shadow.html
index d453c0f..4e53fe2 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color-and-inset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color-and-inset-shadow.html
@@ -21,4 +21,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color-and-outset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color-and-outset-shadow.html
index dac58e5..f98e710 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color-and-outset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color-and-outset-shadow.html
@@ -21,4 +21,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color.html
index 47866c0..53d005d 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-background-color.html
@@ -19,4 +19,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-border-only.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-border-only.html
index 56de16a..950494b 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-border-only.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-3-values-with-border-only.html
@@ -19,4 +19,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-border-and-inset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-border-and-inset-shadow.html
index 4ec00df..2dab336 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-border-and-inset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-border-and-inset-shadow.html
@@ -22,4 +22,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-border-and-outset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-border-and-outset-shadow.html
index 256fe37..e2acc4a 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-border-and-outset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-border-and-outset-shadow.html
@@ -22,4 +22,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-border.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-border.html
index c419580..4526cbf 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-border.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-border.html
@@ -21,4 +21,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-inset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-inset-shadow.html
index c443b15..96e435c 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-inset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-inset-shadow.html
@@ -21,4 +21,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-outset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-outset-shadow.html
index c9bfeb8..f100868 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-outset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color-and-outset-shadow.html
@@ -21,4 +21,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color.html
index 035a589..bd1e169 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-background-color.html
@@ -19,4 +19,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-border-only.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-border-only.html
index 5cf86bb..363052c 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-border-only.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-4-values-with-border-only.html
@@ -19,4 +19,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-border-and-inset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-border-and-inset-shadow.html
index b969b0a..bf515c7 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-border-and-inset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-border-and-inset-shadow.html
@@ -22,4 +22,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-border-and-outset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-border-and-outset-shadow.html
index 3ec1d92..90101f0 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-border-and-outset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-border-and-outset-shadow.html
@@ -22,4 +22,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-border.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-border.html
index 390ecf9..ef733e5 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-border.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-border.html
@@ -21,4 +21,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-inset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-inset-shadow.html
index 30a32f8..d19f246 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-inset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-inset-shadow.html
@@ -21,4 +21,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-outset-shadow.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-outset-shadow.html
index 9f4781d..e4c8c8d 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-outset-shadow.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color-and-outset-shadow.html
@@ -21,4 +21,4 @@
 <body>
   <div></div>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color.html
index 6a23bd8..7e74ac8 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-background-color.html
@@ -20,4 +20,3 @@
   <div></div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-border-only.html b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-border-only.html
index 5cfffb1..fceff79 100644
--- a/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-border-only.html
+++ b/cobalt/layout_tests/testdata/css3-background/5-0-border-radius-with-zero-value-and-border-only.html
@@ -20,4 +20,3 @@
   <div></div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/combined-baseline.html b/cobalt/layout_tests/testdata/css3-flexbox/combined-baseline.html
index ec8d3a2..44a1a2a 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/combined-baseline.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/combined-baseline.html
@@ -77,7 +77,7 @@
   <span style="align-self: center;">center</span>
   <span class="vsized" style="align-self: stretch;">stretch</span>
 </div>
-hg- 
+hg-
 </div><div>
 -hg
 <div class="vsized inlineflex row container">
@@ -105,7 +105,7 @@
   <span style="font-size: 2em; align-self: baseline;">hg</span>
   <span class="vsized" style="align-self: stretch;">stretch</span>
 </div>
-hg- 
+hg-
 </div><div>
 -hg
 <div class="vsized inlineflex row container">
@@ -134,7 +134,7 @@
   <span style="font-size: 2em; align-self: baseline;">hg</span>
   <span style="align-self: baseline;">hg</span>
 </div>
-hg- 
+hg-
 </div><div>
 -hg
 <div class="vsized inlineflex row container">
@@ -178,4 +178,3 @@
 
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/combined-container-sizing-edge-cases.html b/cobalt/layout_tests/testdata/css3-flexbox/combined-container-sizing-edge-cases.html
index 7031bc3..edb56c2 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/combined-container-sizing-edge-cases.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/combined-container-sizing-edge-cases.html
@@ -116,4 +116,3 @@
 
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/combined-order-and-multiline.html b/cobalt/layout_tests/testdata/css3-flexbox/combined-order-and-multiline.html
index 927dfa9..249bfb6 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/combined-order-and-multiline.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/combined-order-and-multiline.html
@@ -77,4 +77,3 @@
 </div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/combined-positioning-tests.html b/cobalt/layout_tests/testdata/css3-flexbox/combined-positioning-tests.html
index 263384e..200d687 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/combined-positioning-tests.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/combined-positioning-tests.html
@@ -140,4 +140,3 @@
 
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/combined-shrinking-and-justify-content.html b/cobalt/layout_tests/testdata/css3-flexbox/combined-shrinking-and-justify-content.html
index 128a8f0..c7c663b 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/combined-shrinking-and-justify-content.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/combined-shrinking-and-justify-content.html
@@ -268,4 +268,3 @@
 
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/combined-with-baselines-percentages.html b/cobalt/layout_tests/testdata/css3-flexbox/combined-with-baselines-percentages.html
index dc516bd..b0af187 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/combined-with-baselines-percentages.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/combined-with-baselines-percentages.html
@@ -203,4 +203,3 @@
 
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/content-based-minimum-size.html b/cobalt/layout_tests/testdata/css3-flexbox/content-based-minimum-size.html
index c9dd6b7..76af0d1 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/content-based-minimum-size.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/content-based-minimum-size.html
@@ -67,4 +67,3 @@
 
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-001.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-001.html
index 815c29f..7458ab2 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-001.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-001.html
@@ -41,7 +41,6 @@
             <div id="flexItem1"></div>
             <div></div>
         </div>
-    
+
 
 </body></html>
-
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-002.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-002.html
index 707d15f..49f729e 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-002.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-002.html
@@ -58,6 +58,6 @@
             <div id="flexItem2"></div>
         </div>
         <div id="ref1"></div><div id="ref2"></div>
-    
+
 
 </body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-003.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-003.html
index 0051e30..a5f5ff3 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-003.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-003.html
@@ -59,6 +59,6 @@
             <div id="flexItem2"></div>
         </div>
         <div id="ref1"></div><div id="ref2"></div>
-    
+
 
 </body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-004.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-004.html
index 6ab472d..072ec9a 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-004.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flex-004.html
@@ -59,6 +59,6 @@
             <div id="flexItem2"></div>
         </div>
         <div id="ref1"></div><div id="ref2"></div>
-    
+
 
 </body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-unitless.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-unitless.html
index 13cd33d..ce0e38d 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-unitless.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-0-unitless.html
@@ -36,4 +36,3 @@
 	<span style="background: #808080;">four</span>
 </div>
 </body></html>
-
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-shrink.html
index 6fd71f1..e368250 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-unitless-basis.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-unitless-basis.html
index ff27572..5656b52 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-unitless-basis.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N-unitless-basis.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N.html
index 4282bbb..79e81bd 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-N.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-shrink.html
index 653d7fb..62dc9cf 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent.html
index cd52187..49da4c3 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-Npercent.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-shrink.html
index 82f3196..330777e 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-0-auto-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-unitless.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-unitless.html
index b5a184e..b1b4593 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-unitless.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0-unitless.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0.html
index f384e46..c51c7d3 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-0.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-1-unitless-basis.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-1-unitless-basis.html
index cfb60db..db30d11 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-1-unitless-basis.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-1-unitless-basis.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-shrink.html
index fee0867..b453da5 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-unitless-basis.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-unitless-basis.html
index ef1642c..0c26781 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-unitless-basis.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N-unitless-basis.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N.html
index 53b2092..f685f88 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-N.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-shrink.html
index 85de799..e478c80 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent.html
index cbbbfdf..d73333c 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-Npercent.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-shrink.html
index 6b5af92..a348f46 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto.html
index 8394293..15144de 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1-auto.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1.html
index 23133be..2eb285c 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-1.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-unitless.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-unitless.html
index ad11723..8d77f05 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-unitless.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0-unitless.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0.html
index 5591371..0a8121c 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-0.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-shrink.html
index c1f9664..1fc2920 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N.html
index 87a779a..045aa1f 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-N.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-shrink.html
index bdb31b9..a64bd60 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent.html
index c5ef228..27a2c79 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-Npercent.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-shrink.html
index 50b8362..a9e0576 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto.html
index 1cad65a..26fe531 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N-auto.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N.html
index 8ff465f..01475de 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-0-N.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-unitless.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-unitless.html
index 1d91ca7..a642524 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-unitless.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0-unitless.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0.html
index 1b872f3..b5386de 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-0.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-shrink.html
index 6db4e48..2fb4b99 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N.html
index 143a3f8..d708f48 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-N.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-shrink.html
index 16accb5..b245459 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent.html
index 49f167c..0f8df48 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-Npercent.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-shrink.html
index 3ac1b32..1c1a6ec 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto.html
index a47aa92..8d2c033 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0-auto.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0.html
index 5f81201..e60a8c2 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-0.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-unitless.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-unitless.html
index d0ca3ad..53b92ba 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-unitless.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0-unitless.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0.html
index 36b42cf..d58687b 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-0.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-shrink.html
index 19f6aaf..6415cfc 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N.html
index a4d66ef..e9141db 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-N.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-shrink.html
index 7767e48..a3d0d2c 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent.html
index d418b74..9718760 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-Npercent.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-shrink.html
index c450b73..35deb24 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto.html
index 2042924..a8b3899 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1-auto.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1.html
index 4beb0d0..48dbcac 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-1.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-unitless.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-unitless.html
index 50222c1..7588068 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-unitless.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0-unitless.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0.html
index 305b009..fb1075b 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-0.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-shrink.html
index d84e167..a090364 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N.html
index 0ab4625..c76b716 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-N.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-shrink.html
index 81a4616..ea0d563 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent.html
index 70a627a..198708e 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-Npercent.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-shrink.html
index ab9b624..4b1e082 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto.html
index 4db4360..1a80f2c 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N-auto.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N.html
index 963ac54..ea0e2f3 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-1-N.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-unitless.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-unitless.html
index 3615e92..d686ce5 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-unitless.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0-unitless.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0.html
index 2fc964e..57d5c56 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-0.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-shrink.html
index 49535e8..cc802b3 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N.html
index f92c08f..cb592c5 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-N.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-shrink.html
index 078e7de..5eb150e 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent.html
index 742276d..44f5790 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-Npercent.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-shrink.html
index 367c74f..d03276c 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto.html
index e828eb1..059b6e6 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0-auto.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0.html
index c7055f9..eb833e1 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-0.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-unitless.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-unitless.html
index 47692f2..bb13fc4 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-unitless.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0-unitless.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0.html
index 908d527..cf117eb 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-0.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-shrink.html
index a465efc..9ca70ae 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N.html
index 4ff4338..fe9f859 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-N.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-shrink.html
index 2f4aac2..a15899d 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent.html
index f265c9f..ff463a0 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-Npercent.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-shrink.html
index b1104db..2e7702e 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto.html
index cbdeebd..9de8462 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1-auto.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1.html
index b7b0dd5..2e2ea35 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-1.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-unitless.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-unitless.html
index caa8853..fef5697 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-unitless.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0-unitless.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0.html
index 13aa940..8bc9302 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-0.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-shrink.html
index 2b1ea71..ca0db7b 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N.html
index ef9ee60..42b6bbe 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-N.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-shrink.html
index 18cc941..3f057f5 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent.html
index f34d420..17b6b03 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-Npercent.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-shrink.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-shrink.html
index e9c477c..8114550 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-shrink.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto-shrink.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto.html
index 5632c6e..8cd37b9 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N-auto.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N.html
index af36e0b..63375ac 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-N-N.html
@@ -39,4 +39,4 @@
 	<span style="background: #ADD8E6;">three</span>
 	<span style="background: #808080;">four</span>
 </div>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-auto.html b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-auto.html
index eaee537..cb96fb0 100644
--- a/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-auto.html
+++ b/cobalt/layout_tests/testdata/css3-flexbox/csswg_flexbox_flex-natural-mixed-basis-auto.html
@@ -40,4 +40,3 @@
 	<span style="background: #808080;">&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;</span>
 </div>
 </body></html>
-
diff --git a/cobalt/layout_tests/testdata/css3-images/4-1-2-gradient-in-middle.html b/cobalt/layout_tests/testdata/css3-images/4-1-2-gradient-in-middle.html
index 4972e3d..37f57d9 100644
--- a/cobalt/layout_tests/testdata/css3-images/4-1-2-gradient-in-middle.html
+++ b/cobalt/layout_tests/testdata/css3-images/4-1-2-gradient-in-middle.html
@@ -13,4 +13,3 @@
   <div></div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-images/4-1-2-multistop-one-dimensional-gradient.html b/cobalt/layout_tests/testdata/css3-images/4-1-2-multistop-one-dimensional-gradient.html
index 03019b7..7e58f18 100644
--- a/cobalt/layout_tests/testdata/css3-images/4-1-2-multistop-one-dimensional-gradient.html
+++ b/cobalt/layout_tests/testdata/css3-images/4-1-2-multistop-one-dimensional-gradient.html
@@ -13,4 +13,3 @@
   <div></div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-images/4-1-2-to-bottom-linear-gradient.html b/cobalt/layout_tests/testdata/css3-images/4-1-2-to-bottom-linear-gradient.html
index 36cdbcb..ae0e528 100644
--- a/cobalt/layout_tests/testdata/css3-images/4-1-2-to-bottom-linear-gradient.html
+++ b/cobalt/layout_tests/testdata/css3-images/4-1-2-to-bottom-linear-gradient.html
@@ -13,4 +13,3 @@
   <div></div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-images/4-1-2-to-left-linear-gradient.html b/cobalt/layout_tests/testdata/css3-images/4-1-2-to-left-linear-gradient.html
index b161dbd..6d64d0e 100644
--- a/cobalt/layout_tests/testdata/css3-images/4-1-2-to-left-linear-gradient.html
+++ b/cobalt/layout_tests/testdata/css3-images/4-1-2-to-left-linear-gradient.html
@@ -13,4 +13,3 @@
   <div></div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-images/4-1-2-to-right-linear-gradient.html b/cobalt/layout_tests/testdata/css3-images/4-1-2-to-right-linear-gradient.html
index e56d490..2f8b718 100644
--- a/cobalt/layout_tests/testdata/css3-images/4-1-2-to-right-linear-gradient.html
+++ b/cobalt/layout_tests/testdata/css3-images/4-1-2-to-right-linear-gradient.html
@@ -13,4 +13,3 @@
   <div></div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-images/4-1-2-to-top-linear-gradient.html b/cobalt/layout_tests/testdata/css3-images/4-1-2-to-top-linear-gradient.html
index 683c1da..ad7df89 100644
--- a/cobalt/layout_tests/testdata/css3-images/4-1-2-to-top-linear-gradient.html
+++ b/cobalt/layout_tests/testdata/css3-images/4-1-2-to-top-linear-gradient.html
@@ -13,4 +13,3 @@
   <div></div>
 </body>
 </html>
-
diff --git a/cobalt/layout_tests/testdata/css3-transitions/2-transition-for-inheritable-property-from-ancestor-should-occur.html b/cobalt/layout_tests/testdata/css3-transitions/2-transition-for-inheritable-property-from-ancestor-should-occur.html
index 7e7f0fc..dd34ba5 100644
--- a/cobalt/layout_tests/testdata/css3-transitions/2-transition-for-inheritable-property-from-ancestor-should-occur.html
+++ b/cobalt/layout_tests/testdata/css3-transitions/2-transition-for-inheritable-property-from-ancestor-should-occur.html
@@ -64,4 +64,4 @@
   </script>
 
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-transitions/2-transition-for-not-inheritable-property-from-ancestor-should-not-occur.html b/cobalt/layout_tests/testdata/css3-transitions/2-transition-for-not-inheritable-property-from-ancestor-should-not-occur.html
index cfb1831..f0a1b60 100644
--- a/cobalt/layout_tests/testdata/css3-transitions/2-transition-for-not-inheritable-property-from-ancestor-should-not-occur.html
+++ b/cobalt/layout_tests/testdata/css3-transitions/2-transition-for-not-inheritable-property-from-ancestor-should-not-occur.html
@@ -70,4 +70,4 @@
   </script>
 
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/css3-ui/layout_tests.txt b/cobalt/layout_tests/testdata/css3-ui/layout_tests.txt
index fbfac8f..c493b14 100644
--- a/cobalt/layout_tests/testdata/css3-ui/layout_tests.txt
+++ b/cobalt/layout_tests/testdata/css3-ui/layout_tests.txt
@@ -20,4 +20,4 @@
 5-2-shaped-text-should-accurately-calculate-width-before-ellipsis
 5-2-text-overflow-clip-should-not-display-ellipsis-on-overflow
 5-2-text-overflow-ellipsis-should-display-ellipsis-on-overflow-when-overflow-is-hidden
-5-2-text-overflow-ellipsis-should-not-be-inherited
\ No newline at end of file
+5-2-text-overflow-ellipsis-should-not-be-inherited
diff --git a/cobalt/layout_tests/testdata/intersection-observer/observers-should-update-when-elements-move-without-threshold.html b/cobalt/layout_tests/testdata/intersection-observer/observers-should-update-when-elements-move-without-threshold.html
index 7d982cf..2460518 100644
--- a/cobalt/layout_tests/testdata/intersection-observer/observers-should-update-when-elements-move-without-threshold.html
+++ b/cobalt/layout_tests/testdata/intersection-observer/observers-should-update-when-elements-move-without-threshold.html
@@ -66,7 +66,7 @@
         window.testRunner.DoNonMeasuredLayout();
       }
 
-      // Without waiting for requestAnimationFrame, only the movement is observed. 
+      // Without waiting for requestAnimationFrame, only the movement is observed.
       requestAnimationFrame(() => {
         window.setTimeout(() => {
           // Move the target element so that it is clearly no longer
diff --git a/cobalt/layout_tests/testdata/intersection-observer/previous-threshold-index-and-is-intersecting-fields-should-be-updated.html b/cobalt/layout_tests/testdata/intersection-observer/previous-threshold-index-and-is-intersecting-fields-should-be-updated.html
index f0604d5..3b9b9ab 100644
--- a/cobalt/layout_tests/testdata/intersection-observer/previous-threshold-index-and-is-intersecting-fields-should-be-updated.html
+++ b/cobalt/layout_tests/testdata/intersection-observer/previous-threshold-index-and-is-intersecting-fields-should-be-updated.html
@@ -87,4 +87,4 @@
   </script>
 
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/cobalt/layout_tests/testdata/text-shaping/layout_tests.txt b/cobalt/layout_tests/testdata/text-shaping/layout_tests.txt
index 4b984e3..c35a025 100644
--- a/cobalt/layout_tests/testdata/text-shaping/layout_tests.txt
+++ b/cobalt/layout_tests/testdata/text-shaping/layout_tests.txt
@@ -1 +1 @@
-combining-character-sequences-should-be-handled-properly
\ No newline at end of file
+combining-character-sequences-should-be-handled-properly
diff --git a/cobalt/layout_tests/testdata/web-platform-tests/intersection-observer/web_platform_tests.txt b/cobalt/layout_tests/testdata/web-platform-tests/intersection-observer/web_platform_tests.txt
index e543994..14f170a 100644
--- a/cobalt/layout_tests/testdata/web-platform-tests/intersection-observer/web_platform_tests.txt
+++ b/cobalt/layout_tests/testdata/web-platform-tests/intersection-observer/web_platform_tests.txt
@@ -73,4 +73,4 @@
 v2/cross-origin-occlusion.sub.html,DISABLE
 v2/iframe-target.html,DISABLE
 v2/scaled-target.html,DISABLE
-v2/text-shadow.html,DISABLE
\ No newline at end of file
+v2/text-shadow.html,DISABLE
diff --git a/cobalt/loader/BUILD.gn b/cobalt/loader/BUILD.gn
index 2db902d..1aa47b7 100644
--- a/cobalt/loader/BUILD.gn
+++ b/cobalt/loader/BUILD.gn
@@ -115,7 +115,6 @@
     "//cobalt/render_tree",
     "//cobalt/renderer/test/png_utils",
     "//cobalt/web",
-    "//nb",
     "//net",
     "//third_party/libjpeg-turbo:libjpeg",
     "//third_party/libpng",
diff --git a/cobalt/loader/blob_fetcher_test.cc b/cobalt/loader/blob_fetcher_test.cc
index b5eef82..a88b0ee 100644
--- a/cobalt/loader/blob_fetcher_test.cc
+++ b/cobalt/loader/blob_fetcher_test.cc
@@ -27,10 +27,10 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::AtLeast;
 using ::testing::InSequence;
 using ::testing::StrictMock;
-using ::testing::_;
 
 namespace cobalt {
 namespace loader {
diff --git a/cobalt/loader/cors_preflight_cache.cc b/cobalt/loader/cors_preflight_cache.cc
index c56da2f..c16d313 100644
--- a/cobalt/loader/cors_preflight_cache.cc
+++ b/cobalt/loader/cors_preflight_cache.cc
@@ -14,11 +14,13 @@
  * limitations under the License.
  */
 
+#include "cobalt/loader/cors_preflight_cache.h"
+
 #include <algorithm>
+#include <utility>
 
 #include "base/message_loop/message_loop.h"
 #include "base/strings/string_util.h"
-#include "cobalt/loader/cors_preflight_cache.h"
 
 namespace {
 bool MethodNameToRequestType(const std::string& method,
diff --git a/cobalt/loader/file_fetcher_test.cc b/cobalt/loader/file_fetcher_test.cc
index 5dcbafa..8c1bb25 100644
--- a/cobalt/loader/file_fetcher_test.cc
+++ b/cobalt/loader/file_fetcher_test.cc
@@ -26,10 +26,10 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
 using ::testing::AtLeast;
 using ::testing::InSequence;
 using ::testing::StrictMock;
-using ::testing::_;
 
 namespace cobalt {
 namespace loader {
diff --git a/cobalt/loader/font/typeface_decoder.cc b/cobalt/loader/font/typeface_decoder.cc
index 0b8db13..04bf353 100644
--- a/cobalt/loader/font/typeface_decoder.cc
+++ b/cobalt/loader/font/typeface_decoder.cc
@@ -12,10 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/loader/font/typeface_decoder.h"
+
 #include <memory>
+#include <utility>
 
 #include "base/memory/ptr_util.h"
-#include "cobalt/loader/font/typeface_decoder.h"
 
 namespace cobalt {
 namespace loader {
diff --git a/cobalt/loader/font/typeface_decoder_test.cc b/cobalt/loader/font/typeface_decoder_test.cc
index 0c7c781..4b7aea2 100644
--- a/cobalt/loader/font/typeface_decoder_test.cc
+++ b/cobalt/loader/font/typeface_decoder_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/loader/font/typeface_decoder.h"
 
+#include <memory>
+
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
diff --git a/cobalt/loader/image/animated_image_tracker.cc b/cobalt/loader/image/animated_image_tracker.cc
index 98dadca..c7a3e73 100644
--- a/cobalt/loader/image/animated_image_tracker.cc
+++ b/cobalt/loader/image/animated_image_tracker.cc
@@ -15,7 +15,9 @@
 #include "cobalt/loader/image/animated_image_tracker.h"
 
 #include <algorithm>
+#include <utility>
 
+#include "base/strings/stringprintf.h"
 #include "base/trace_event/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
 
@@ -24,8 +26,22 @@
 namespace image {
 
 AnimatedImageTracker::AnimatedImageTracker(
+    const char* name,
     base::ThreadPriority animated_image_decode_thread_priority)
-    : animated_image_decode_thread_("AnimatedImage") {
+    : animated_image_decode_thread_("AnimatedImage"),
+      name_(name),
+      count_animated_images_active(
+          base::StringPrintf("Count.%s.AnimatedImage.Active", name), 0,
+          "Total number of active animated image decoders."),
+      count_animated_frames_decoded(
+          base::StringPrintf("Count.%s.AnimatedImage.DecodedFrames", name), 0,
+          "Total number of decoded animated image frames."),
+      count_animated_frames_decoding_underrun(
+          base::StringPrintf("Count.%s.AnimatedImage.DecodingUnderruns", name),
+          0, "Number of underruns from decoding animated images"),
+      count_animated_frames_decoding_overrun(
+          base::StringPrintf("Count.%s.AnimatedImage.DecodingOverruns", name),
+          0, "Number of overruns from decoding animated images") {
   TRACE_EVENT0("cobalt::loader::image", "AnimatedImageTracker::RecordImage()");
   base::Thread::Options options(base::MessageLoop::TYPE_DEFAULT,
                                 0 /* default stack size */);
@@ -123,6 +139,17 @@
   playing_urls_.clear();
 }
 
+void AnimatedImageTracker::OnRenderTreeRasterized() {
+  count_animated_images_active = playing_urls_.size();
+  for (const auto& playing_url : playing_urls_) {
+    auto image = image_map_[playing_url.first].get();
+    auto stats = image->GetFrameDeltaStats();
+    count_animated_frames_decoded += stats.frames_decoded;
+    count_animated_frames_decoding_underrun += stats.frames_underrun;
+    count_animated_frames_decoding_overrun += stats.frames_overrun;
+  }
+}
+
 }  // namespace image
 }  // namespace loader
 }  // namespace cobalt
diff --git a/cobalt/loader/image/animated_image_tracker.h b/cobalt/loader/image/animated_image_tracker.h
index f6f38e4..6df920b 100644
--- a/cobalt/loader/image/animated_image_tracker.h
+++ b/cobalt/loader/image/animated_image_tracker.h
@@ -20,6 +20,7 @@
 
 #include "base/containers/small_map.h"
 #include "base/threading/thread.h"
+#include "cobalt/base/c_val.h"
 #include "cobalt/base/unused.h"
 #include "cobalt/loader/image/image.h"
 #include "url/gurl.h"
@@ -33,7 +34,8 @@
 // playing status is updated hence decoding is turned on / off for it.
 class AnimatedImageTracker {
  public:
-  explicit AnimatedImageTracker(
+  AnimatedImageTracker(
+      const char* name,
       base::ThreadPriority animated_image_decode_thread_priority);
   ~AnimatedImageTracker();
 
@@ -54,6 +56,9 @@
   // animations.
   void Reset();
 
+  // Called from WebModule to compute image animation related stats.
+  void OnRenderTreeRasterized();
+
  private:
   void OnDisplayStart(loader::image::AnimatedImage* image);
   void OnDisplayEnd(loader::image::AnimatedImage* image);
@@ -72,6 +77,15 @@
   URLToIntMap current_url_counts_;
   URLSet playing_urls_;
 
+  // The name of the WebModule this AnimatedImage tracker belongs to, for CVals.
+  const std::string name_;
+
+  // Animated image counters
+  base::CVal<int, base::CValPublic> count_animated_images_active;
+  base::CVal<int, base::CValPublic> count_animated_frames_decoded;
+  base::CVal<int, base::CValPublic> count_animated_frames_decoding_underrun;
+  base::CVal<int, base::CValPublic> count_animated_frames_decoding_overrun;
+
   // Used to ensure that all AnimatedImageTracker methods are called on the
   // same thread (*not* |animated_image_decode_thread_|), the thread that we
   // were constructed on.
diff --git a/cobalt/loader/image/animated_webp_image.cc b/cobalt/loader/image/animated_webp_image.cc
index ed0b959..312098d 100644
--- a/cobalt/loader/image/animated_webp_image.cc
+++ b/cobalt/loader/image/animated_webp_image.cc
@@ -26,7 +26,6 @@
 #include "cobalt/render_tree/image_node.h"
 #include "cobalt/render_tree/node.h"
 #include "cobalt/render_tree/rect_node.h"
-#include "nb/memory_scope.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
@@ -101,7 +100,6 @@
 
 void AnimatedWebPImage::AppendChunk(const uint8* data, size_t size) {
   TRACE_EVENT0("cobalt::loader::image", "AnimatedWebPImage::AppendChunk()");
-  TRACK_MEMORY_SCOPE("Rendering");
   base::AutoLock lock(lock_);
 
   data_buffer_.insert(data_buffer_.end(), data, data + size);
@@ -148,6 +146,8 @@
     return;
   }
   is_playing_ = true;
+  current_stats.frames_underrun = 0;
+  current_stats.frames_overrun = 0;
 
   if (received_first_frame_) {
     StartDecoding();
@@ -171,7 +171,8 @@
 void AnimatedWebPImage::StartDecoding() {
   TRACE_EVENT0("cobalt::loader::image", "AnimatedWebPImage::StartDecoding()");
   lock_.AssertAcquired();
-  current_frame_time_ = base::TimeTicks::Now();
+  decoding_start_time_ = current_frame_time_ = base::TimeTicks::Now();
+  current_stats.frames_decoded = 0;
   if (task_runner_->BelongsToCurrentThread()) {
     DecodeFrames();
   } else {
@@ -192,7 +193,6 @@
 
 void AnimatedWebPImage::DecodeFrames() {
   TRACE_EVENT0("cobalt::loader::image", "AnimatedWebPImage::DecodeFrames()");
-  TRACK_MEMORY_SCOPE("Rendering");
   lock_.AssertAcquired();
   DCHECK(is_playing_ && received_first_frame_);
   DCHECK(task_runner_->BelongsToCurrentThread());
@@ -242,7 +242,6 @@
 
 bool AnimatedWebPImage::DecodeOneFrame(int frame_index) {
   TRACE_EVENT0("cobalt::loader::image", "AnimatedWebPImage::DecodeOneFrame()");
-  TRACK_MEMORY_SCOPE("Rendering");
   lock_.AssertAcquired();
 
   WebPIterator webp_iterator;
@@ -269,6 +268,7 @@
       LOG(ERROR) << "Failed to decode WebP image frame.";
       return false;
     }
+    current_stats.frames_decoded++;
   }
 
   // Alpha blend the current frame on top of the buffer.
@@ -329,7 +329,6 @@
 
 bool AnimatedWebPImage::AdvanceFrame() {
   TRACE_EVENT0("cobalt::loader::image", "AnimatedWebPImage::AdvanceFrame()");
-  TRACK_MEMORY_SCOPE("Rendering");
   DCHECK(task_runner_->BelongsToCurrentThread());
   lock_.AssertAcquired();
 
@@ -354,6 +353,7 @@
   // Always wait for a consumer to consume the previous frame before moving
   // forward with decoding the next frame.
   if (!frame_provider_->FrameConsumed()) {
+    current_stats.frames_overrun++;
     return false;
   }
 
@@ -386,6 +386,7 @@
   if (next_frame_time_ < current_time) {
     // Don't let the animation fall back for more than a frame.
     next_frame_time_ = current_time;
+    current_stats.frames_underrun++;
   }
 
   return true;
@@ -431,6 +432,25 @@
   return target_canvas;
 }
 
+AnimatedImage::AnimatedImageDecodingStats
+AnimatedWebPImage::GetFrameDeltaStats() {
+  AnimatedImageDecodingStats result;
+  if (current_stats.frames_decoded >= last_stats.frames_decoded) {
+    result.frames_decoded =
+        current_stats.frames_decoded - last_stats.frames_decoded;
+    result.frames_underrun =
+        current_stats.frames_underrun - last_stats.frames_underrun;
+    result.frames_overrun =
+        current_stats.frames_overrun - last_stats.frames_overrun;
+  } else {
+    // There was a reset somewhere
+    // Simply return total, this discards any overflow data we might have had.
+    result = current_stats;
+  }
+  last_stats = current_stats;
+  return result;
+}
+
 }  // namespace image
 }  // namespace loader
 }  // namespace cobalt
diff --git a/cobalt/loader/image/animated_webp_image.h b/cobalt/loader/image/animated_webp_image.h
index 135bf6a..4d1be04 100644
--- a/cobalt/loader/image/animated_webp_image.h
+++ b/cobalt/loader/image/animated_webp_image.h
@@ -66,6 +66,8 @@
   // Returns the render image of the frame for debugging
   scoped_refptr<render_tree::Image> GetFrameForDebugging(int target_frame);
 
+  AnimatedImageDecodingStats GetFrameDeltaStats() override;
+
  private:
   ~AnimatedWebPImage() override;
 
@@ -119,12 +121,17 @@
   base::CancelableClosure decode_closure_;
   base::TimeTicks current_frame_time_;
   base::Optional<base::TimeTicks> next_frame_time_;
+
   // The original encoded data.
   std::vector<uint8> data_buffer_;
   scoped_refptr<render_tree::Image> current_canvas_;
   scoped_refptr<FrameProvider> frame_provider_;
   base::Lock lock_;
 
+  base::TimeTicks decoding_start_time_;
+  AnimatedImageDecodingStats current_stats;
+  AnimatedImageDecodingStats last_stats;
+
   // Makes sure that the thread that sets the task_runner is always consistent.
   // This is the thread sending Play()/Stop() calls, and is not necessarily
   // the same thread that the task_runner itself is running on.
diff --git a/cobalt/loader/image/image.h b/cobalt/loader/image/image.h
index af99363..bac9849 100644
--- a/cobalt/loader/image/image.h
+++ b/cobalt/loader/image/image.h
@@ -145,6 +145,16 @@
     image_node_builder->destination_rect = destination_rect;
     image_node_builder->local_transform = local_transform;
   }
+
+  // Frame counters for decoding.
+  struct AnimatedImageDecodingStats {
+    unsigned int frames_decoded = 0;
+    unsigned int frames_underrun = 0;
+    unsigned int frames_overrun = 0;
+  };
+
+  // Returns decoded frame stats since the last call, as a delta.
+  virtual AnimatedImageDecodingStats GetFrameDeltaStats() = 0;
 };
 
 }  // namespace image
diff --git a/cobalt/loader/image/image_data_decoder.cc b/cobalt/loader/image/image_data_decoder.cc
index 0a19fdf..b9243ae 100644
--- a/cobalt/loader/image/image_data_decoder.cc
+++ b/cobalt/loader/image/image_data_decoder.cc
@@ -16,6 +16,7 @@
 
 #include <algorithm>
 #include <memory>
+#include <utility>
 
 #include "base/trace_event/trace_event.h"
 
diff --git a/cobalt/loader/image/image_decoder_unit_test.cc b/cobalt/loader/image/image_decoder_unit_test.cc
index a6dfc5d..0fe45c5 100644
--- a/cobalt/loader/image/image_decoder_unit_test.cc
+++ b/cobalt/loader/image/image_decoder_unit_test.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "cobalt/loader/image/image_decoder.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/loader/image/image_encoder.cc b/cobalt/loader/image/image_encoder.cc
index 6cd3787..6b5505e 100644
--- a/cobalt/loader/image/image_encoder.cc
+++ b/cobalt/loader/image/image_encoder.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/loader/image/image_encoder.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/trace_event/trace_event.h"
 #include "cobalt/renderer/test/jpeg_utils/jpeg_encode.h"
 #include "cobalt/renderer/test/png_utils/png_encode.h"
diff --git a/cobalt/loader/image/jpeg_image_decoder.cc b/cobalt/loader/image/jpeg_image_decoder.cc
index 5516e4a..9355188 100644
--- a/cobalt/loader/image/jpeg_image_decoder.cc
+++ b/cobalt/loader/image/jpeg_image_decoder.cc
@@ -20,7 +20,6 @@
 #include "base/logging.h"
 #include "base/trace_event/trace_event.h"
 #include "cobalt/base/console_log.h"
-#include "nb/memory_scope.h"
 #include "third_party/libjpeg-turbo/jpegint.h"
 
 namespace cobalt {
@@ -133,7 +132,6 @@
       allow_image_decoding_to_multi_plane_(
           allow_image_decoding_to_multi_plane) {
   TRACE_EVENT0("cobalt::loader::image", "JPEGImageDecoder::JPEGImageDecoder()");
-  TRACK_MEMORY_SCOPE("Rendering");
   memset(&info_, 0, sizeof(info_));
   memset(&source_manager_, 0, sizeof(source_manager_));
 
@@ -161,7 +159,6 @@
 
 size_t JPEGImageDecoder::DecodeChunkInternal(const uint8* data,
                                              size_t input_byte) {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image",
                "JPEGImageDecoder::DecodeChunkInternal()");
   // |client_data| is available for use by application.
@@ -278,7 +275,6 @@
 }
 
 bool JPEGImageDecoder::ReadHeader() {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image", "JPEGImageDecoder::ReadHeader()");
   if (jpeg_read_header(&info_, true) == JPEG_SUSPENDED) {
     // Since |jpeg_read_header| doesn't have enough data, go back to the state
@@ -332,7 +328,6 @@
 }
 
 bool JPEGImageDecoder::StartDecompress() {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image", "JPEGImageDecoder::StartDecompress()");
   // jpeg_has_multiple_scans() returns TRUE if the incoming image file has more
   // than one scan.
@@ -357,7 +352,6 @@
 // TODO: support displaying the low resolution image while decoding the
 // progressive JPEG.
 bool JPEGImageDecoder::DecodeProgressiveJPEG() {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image",
                "JPEGImageDecoder::DecodeProgressiveJPEG()");
   int status;
@@ -437,7 +431,6 @@
 
 bool JPEGImageDecoder::ReadYUVLines() {
   DCHECK(output_format_ == kOutputFormatYUV);
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image", "JPEGImageDecoder::ReadYUVLines()");
 
   while (info_.output_scanline < info_.output_height) {
@@ -475,7 +468,6 @@
   DCHECK(output_format_ == kOutputFormatRGBA ||
          output_format_ == kOutputFormatBGRA);
 
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image",
                "JPEGImageDecoder::ReadRgbaOrGbraLines()");
 
diff --git a/cobalt/loader/image/lottie_animation.cc b/cobalt/loader/image/lottie_animation.cc
index a759e67..373ebad 100644
--- a/cobalt/loader/image/lottie_animation.cc
+++ b/cobalt/loader/image/lottie_animation.cc
@@ -15,7 +15,6 @@
 #include "cobalt/loader/image/lottie_animation.h"
 
 #include "base/trace_event/trace_event.h"
-#include "nb/memory_scope.h"
 
 namespace cobalt {
 namespace loader {
diff --git a/cobalt/loader/image/lottie_animation_decoder.cc b/cobalt/loader/image/lottie_animation_decoder.cc
index a5f9340..d7957e5 100644
--- a/cobalt/loader/image/lottie_animation_decoder.cc
+++ b/cobalt/loader/image/lottie_animation_decoder.cc
@@ -15,7 +15,6 @@
 #include "cobalt/loader/image/lottie_animation_decoder.h"
 
 #include "base/trace_event/trace_event.h"
-#include "nb/memory_scope.h"
 
 namespace cobalt {
 namespace loader {
@@ -27,14 +26,12 @@
     : ImageDataDecoder(resource_provider, debugger_hooks) {
   TRACE_EVENT0("cobalt::loader::image",
                "LottieAnimationDecoder::LottieAnimationDecoder()");
-  TRACK_MEMORY_SCOPE("Rendering");
 }
 
 size_t LottieAnimationDecoder::DecodeChunkInternal(const uint8* data,
                                                    size_t input_byte) {
   TRACE_EVENT0("cobalt::loader::image",
                "LottieAnimationDecoder::DecodeChunkInternal()");
-  TRACK_MEMORY_SCOPE("Rendering");
   if (state() == kWaitingForHeader) {
     // TODO: Remove hard coded values.
     lottie_animation_ = new LottieAnimation(resource_provider());
diff --git a/cobalt/loader/image/png_image_decoder.cc b/cobalt/loader/image/png_image_decoder.cc
index fa27801..95e2405 100644
--- a/cobalt/loader/image/png_image_decoder.cc
+++ b/cobalt/loader/image/png_image_decoder.cc
@@ -14,10 +14,11 @@
 
 #include "cobalt/loader/image/png_image_decoder.h"
 
+#include <utility>
+
 #include "base/logging.h"
 #include "base/trace_event/trace_event.h"
 #include "cobalt/base/console_log.h"
-#include "nb/memory_scope.h"
 
 namespace cobalt {
 namespace loader {
@@ -74,7 +75,6 @@
       info_(NULL),
       has_alpha_(false),
       interlace_buffer_(0) {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image", "PNGImageDecoder::PNGImageDecoder()");
 
   png_ = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, DecodingFailed,
@@ -85,10 +85,9 @@
 }
 
 size_t PNGImageDecoder::DecodeChunkInternal(const uint8* data, size_t size) {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image",
                "PNGImageDecoder::DecodeChunkInternal()");
-  // int setjmp(jmp_buf env) saves the current environment (ths program state),
+  // int setjmp(jmp_buf env) saves the current environment (the program state),
   // at some point of program execution, into a platform-specific data
   // structure (jmp_buf) that can be used at some later point of program
   // execution by longjmp to restore the program state to that saved by setjmp
@@ -144,7 +143,6 @@
 // Called when we have obtained the header information (including the size).
 // static
 void PNGImageDecoder::HeaderAvailable(png_structp png, png_infop info) {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image", "PNGImageDecoder::~PNGImageDecoder()");
   PNGImageDecoder* decoder =
       static_cast<PNGImageDecoder*>(png_get_progressive_ptr(png));
@@ -163,7 +161,6 @@
 // Called when decoding is done.
 // static
 void PNGImageDecoder::DecodeDone(png_structp png, png_infop info) {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image", "PNGImageDecoder::DecodeDone()");
 
   PNGImageDecoder* decoder =
@@ -172,7 +169,6 @@
 }
 
 void PNGImageDecoder::HeaderAvailableCallback() {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image",
                "PNGImageDecoder::HeaderAvailableCallback()");
   DCHECK_EQ(state(), kWaitingForHeader);
@@ -295,7 +291,6 @@
 // from the previous pass.
 void PNGImageDecoder::RowAvailableCallback(png_bytep row_buffer,
                                            png_uint_32 row_index) {
-  TRACK_MEMORY_SCOPE("Rendering");
   DCHECK_EQ(state(), kReadLines);
 
   // Nothing to do if the row is unchanged, or the row is outside
diff --git a/cobalt/loader/image/stub_image_decoder.h b/cobalt/loader/image/stub_image_decoder.h
index cc13068..97976af 100644
--- a/cobalt/loader/image/stub_image_decoder.h
+++ b/cobalt/loader/image/stub_image_decoder.h
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/compiler_specific.h"
 #include "cobalt/loader/image/image.h"
@@ -37,9 +38,7 @@
   // From ImageDataDecoder
   std::string GetTypeString() const override { return "StubImageDecoder"; }
 
-  static bool IsValidSignature(const uint8* header) {
-    return true;
-  }
+  static bool IsValidSignature(const uint8* header) { return true; }
 
  private:
   // From ImageDataDecoder
diff --git a/cobalt/loader/image/webp_image_decoder.cc b/cobalt/loader/image/webp_image_decoder.cc
index 6e0d378..250f17e 100644
--- a/cobalt/loader/image/webp_image_decoder.cc
+++ b/cobalt/loader/image/webp_image_decoder.cc
@@ -14,10 +14,11 @@
 
 #include "cobalt/loader/image/webp_image_decoder.h"
 
+#include <utility>
+
 #include "base/logging.h"
 #include "base/trace_event/trace_event.h"
 #include "cobalt/loader/image/animated_webp_image.h"
-#include "nb/memory_scope.h"
 #include "starboard/configuration.h"
 #include "starboard/memory.h"
 
@@ -30,7 +31,6 @@
     const base::DebuggerHooks& debugger_hooks)
     : ImageDataDecoder(resource_provider, debugger_hooks),
       internal_decoder_(NULL) {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image", "WEBPImageDecoder::WEBPImageDecoder()");
   // Initialize the configuration as empty.
   WebPInitDecoderConfig(&config_);
@@ -50,7 +50,6 @@
 
 size_t WEBPImageDecoder::DecodeChunkInternal(const uint8* data,
                                              size_t input_byte) {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image",
                "WEBPImageDecoder::DecodeChunkInternal()");
   if (state() == kWaitingForHeader) {
@@ -151,7 +150,6 @@
 }
 
 bool WEBPImageDecoder::ReadHeader(const uint8* data, size_t size) {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image", "WEBPImageDecoder::ReadHeader()");
   // Retrieve features from the bitstream. The *features structure is filled
   // with information gathered from the bitstream.
@@ -172,7 +170,6 @@
 }
 
 bool WEBPImageDecoder::CreateInternalDecoder() {
-  TRACK_MEMORY_SCOPE("Rendering");
   TRACE_EVENT0("cobalt::loader::image",
                "WEBPImageDecoder::CreateInternalDecoder()");
   bool has_alpha = !!config_.input.has_alpha;
diff --git a/cobalt/loader/mesh/mesh_decoder.cc b/cobalt/loader/mesh/mesh_decoder.cc
index 25bb314..494f597 100644
--- a/cobalt/loader/mesh/mesh_decoder.cc
+++ b/cobalt/loader/mesh/mesh_decoder.cc
@@ -12,12 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/loader/mesh/mesh_decoder.h"
+
 #include <algorithm>
 #include <memory>
+#include <utility>
 
 #include "base/bits.h"
 #include "base/memory/ptr_util.h"
-#include "cobalt/loader/mesh/mesh_decoder.h"
 #include "cobalt/loader/mesh/projection_codec/projection_decoder.h"
 #include "cobalt/render_tree/resource_provider.h"
 
@@ -253,7 +255,7 @@
     mesh_available_callback_.Run(mesh_projection);
     load_complete_callback_.Run(base::nullopt);
   } else {
-    // Error must have occured in MeshDecoderSink::Decode.
+    // Error must have occurred in MeshDecoderSink::Decode.
     load_complete_callback_.Run(
         std::string("MeshDecoder passed an invalid mesh projection box."));
   }
diff --git a/cobalt/loader/mesh/mesh_decoder_test.cc b/cobalt/loader/mesh/mesh_decoder_test.cc
index 30088be..fe2d546 100644
--- a/cobalt/loader/mesh/mesh_decoder_test.cc
+++ b/cobalt/loader/mesh/mesh_decoder_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/loader/mesh/mesh_decoder.h"
 
+#include <memory>
+
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
diff --git a/cobalt/loader/mesh/mesh_projection.h b/cobalt/loader/mesh/mesh_projection.h
index a8da002..ec70d32 100644
--- a/cobalt/loader/mesh/mesh_projection.h
+++ b/cobalt/loader/mesh/mesh_projection.h
@@ -18,6 +18,7 @@
 #define COBALT_LOADER_MESH_MESH_PROJECTION_H_
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "base/basictypes.h"
diff --git a/cobalt/loader/mock_loader_factory.h b/cobalt/loader/mock_loader_factory.h
index 67e5694..1003705 100644
--- a/cobalt/loader/mock_loader_factory.h
+++ b/cobalt/loader/mock_loader_factory.h
@@ -17,14 +17,13 @@
 
 #include <memory>
 
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
 #include "cobalt/csp/content_security_policy.h"
 #include "cobalt/loader/font/typeface_decoder.h"
 #include "cobalt/loader/image/image_decoder.h"
 #include "cobalt/loader/loader.h"
 #include "cobalt/loader/loader_factory.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
 namespace cobalt {
diff --git a/cobalt/loader/net_fetcher.cc b/cobalt/loader/net_fetcher.cc
index 872194a..5ce5e29 100644
--- a/cobalt/loader/net_fetcher.cc
+++ b/cobalt/loader/net_fetcher.cc
@@ -102,6 +102,7 @@
       security_callback_(security_callback),
       ALLOW_THIS_IN_INITIALIZER_LIST(start_callback_(
           base::Bind(&NetFetcher::Start, base::Unretained(this)))),
+      cors_policy_(network_module->network_delegate()->cors_policy()),
       request_cross_origin_(false),
       origin_(origin),
       request_script_(options.resource_type == disk_cache::kUncompiledScript),
@@ -225,7 +226,8 @@
   if (request_cross_origin_ &&
       (!source->GetResponseHeaders() ||
        !CORSPreflight::CORSCheck(*source->GetResponseHeaders(),
-                                 origin_.SerializedOrigin(), false))) {
+                                 origin_.SerializedOrigin(), false,
+                                 cors_policy_))) {
     std::string msg(base::StringPrintf(
         "Cross origin request to %s was rejected by Same-Origin-Policy",
         source->GetURL().spec().c_str()));
diff --git a/cobalt/loader/net_fetcher.h b/cobalt/loader/net_fetcher.h
index 984bdcb..8e4cf8f 100644
--- a/cobalt/loader/net_fetcher.h
+++ b/cobalt/loader/net_fetcher.h
@@ -113,6 +113,7 @@
   // after being constructed, but before Start() runs.
   base::CancelableClosure start_callback_;
 
+  network::CORSPolicy cors_policy_;
   // True if request mode is CORS and request URL's origin is different from
   // request's origin.
   bool request_cross_origin_;
diff --git a/cobalt/loader/resource_cache.cc b/cobalt/loader/resource_cache.cc
index 493c62a..d5f1d6b 100644
--- a/cobalt/loader/resource_cache.cc
+++ b/cobalt/loader/resource_cache.cc
@@ -25,8 +25,7 @@
 
 CachedResourceBase::OnLoadedCallbackHandler::OnLoadedCallbackHandler(
     const scoped_refptr<CachedResourceBase>& cached_resource,
-    const base::Closure& success_callback,
-    const base::Closure& error_callback)
+    const base::Closure& success_callback, const base::Closure& error_callback)
     : cached_resource_(cached_resource),
       success_callback_(success_callback),
       error_callback_(error_callback) {
@@ -47,7 +46,7 @@
 }
 
 net::LoadTimingInfo
-    CachedResourceBase::OnLoadedCallbackHandler::GetLoadTimingInfo() {
+CachedResourceBase::OnLoadedCallbackHandler::GetLoadTimingInfo() {
   return cached_resource_->GetLoadTimingInfo();
 }
 
diff --git a/cobalt/loader/resource_cache.h b/cobalt/loader/resource_cache.h
index 7677f88..3d3816c 100644
--- a/cobalt/loader/resource_cache.h
+++ b/cobalt/loader/resource_cache.h
@@ -17,7 +17,9 @@
 
 #include <list>
 #include <map>
+#include <memory>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/bind.h"
@@ -94,9 +96,7 @@
   // Whether not the resource located at |url_| is finished loading.
   bool IsLoadingComplete();
 
-  net::LoadTimingInfo GetLoadTimingInfo() {
-    return load_timing_info_;
-  }
+  net::LoadTimingInfo GetLoadTimingInfo() { return load_timing_info_; }
 
   bool get_resource_timing_created_flag() {
     return is_resource_timing_created_flag_;
diff --git a/cobalt/loader/sync_loader.cc b/cobalt/loader/sync_loader.cc
index d64c379..5371936 100644
--- a/cobalt/loader/sync_loader.cc
+++ b/cobalt/loader/sync_loader.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/loader/sync_loader.h"
 
+#include <memory>
+
 #include "base/bind.h"
 #include "base/compiler_specific.h"
 #include "base/synchronization/waitable_event.h"
diff --git a/cobalt/loader/text_decoder_test.cc b/cobalt/loader/text_decoder_test.cc
index f4dcdb4..e1c5f6d 100644
--- a/cobalt/loader/text_decoder_test.cc
+++ b/cobalt/loader/text_decoder_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/loader/text_decoder.h"
 
+#include <memory>
+
 #include "base/bind.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/cobalt/loader/url_fetcher_string_writer.cc b/cobalt/loader/url_fetcher_string_writer.cc
index 2bfbcc8..f372e2e 100644
--- a/cobalt/loader/url_fetcher_string_writer.cc
+++ b/cobalt/loader/url_fetcher_string_writer.cc
@@ -1,3 +1,4 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
 // Copyright 2019 Google Inc. All Rights Reserved.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,7 +18,7 @@
 #include "base/logging.h"
 #include "net/base/net_errors.h"
 
-    namespace cobalt {
+namespace cobalt {
 namespace loader {
 
 // URLFetcherStringWriter::URLFetcherStringWriter(OnWriteCallback
diff --git a/cobalt/loader/url_fetcher_string_writer.h b/cobalt/loader/url_fetcher_string_writer.h
index 72d87e8..55fc3fc 100644
--- a/cobalt/loader/url_fetcher_string_writer.h
+++ b/cobalt/loader/url_fetcher_string_writer.h
@@ -1,3 +1,4 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
 // Copyright 2019 Google Inc. All Rights Reserved.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/cobalt/math/box_unittest.cc b/cobalt/math/box_unittest.cc
index ba9a322..02f654a 100644
--- a/cobalt/math/box_unittest.cc
+++ b/cobalt/math/box_unittest.cc
@@ -2,9 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "cobalt/math/box_f.h"
-
 #include "base/basictypes.h"
+#include "cobalt/math/box_f.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/math/cubic_bezier_unittest.cc b/cobalt/math/cubic_bezier_unittest.cc
index b1de805..904b725 100644
--- a/cobalt/math/cubic_bezier_unittest.cc
+++ b/cobalt/math/cubic_bezier_unittest.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include <memory>
-
 #include "cobalt/math/cubic_bezier.h"
 
+#include <memory>
+
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/math/matrix3_f.cc b/cobalt/math/matrix3_f.cc
index 2d39b63..f965dbc 100644
--- a/cobalt/math/matrix3_f.cc
+++ b/cobalt/math/matrix3_f.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 #include <cmath>
 #include <limits>
+#include <utility>
 
 namespace cobalt {
 namespace math {
diff --git a/cobalt/math/matrix3_unittest.cc b/cobalt/math/matrix3_unittest.cc
index d78d59b..e3caae6 100644
--- a/cobalt/math/matrix3_unittest.cc
+++ b/cobalt/math/matrix3_unittest.cc
@@ -2,12 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "cobalt/math/matrix3_f.h"
-
 #include <cmath>
 #include <limits>
 
 #include "base/basictypes.h"
+#include "cobalt/math/matrix3_f.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
@@ -171,8 +170,7 @@
 TEST(Matrix3fTest, MatrixMultiplyIdentityByArbitrary) {
   // The identity matrix times an arbitrary matrix should return that same
   // arbitrary matrix.
-  Matrix3F matrix_a =
-      Matrix3F::FromValues(1, 2, 3, 4, 5, 6, 7, 8, 9);
+  Matrix3F matrix_a = Matrix3F::FromValues(1, 2, 3, 4, 5, 6, 7, 8, 9);
   EXPECT_TRUE(matrix_a.IsNear(Matrix3F::Identity() * matrix_a, 0.00001f));
   EXPECT_TRUE(matrix_a.IsNear(matrix_a * Matrix3F::Identity(), 0.00001f));
 }
@@ -180,10 +178,8 @@
 TEST(Matrix3fTest, MatrixMultiplyArbitraryByArbitrary) {
   // Check that multiplying two arbitrary matrices together gives the expected
   // results.
-  Matrix3F matrix_a =
-      Matrix3F::FromValues(1, 2, 3, 4, 5, 6, 7, 8, 9);
-  Matrix3F matrix_b =
-      Matrix3F::FromValues(10, 11, 12, 13, 14, 15, 16, 17, 18);
+  Matrix3F matrix_a = Matrix3F::FromValues(1, 2, 3, 4, 5, 6, 7, 8, 9);
+  Matrix3F matrix_b = Matrix3F::FromValues(10, 11, 12, 13, 14, 15, 16, 17, 18);
 
   Matrix3F result = matrix_a * matrix_b;
   Matrix3F expected_result =
diff --git a/cobalt/math/matrix_interpolation_unittest.cc b/cobalt/math/matrix_interpolation_unittest.cc
index 4505e13..4672fcb 100644
--- a/cobalt/math/matrix_interpolation_unittest.cc
+++ b/cobalt/math/matrix_interpolation_unittest.cc
@@ -12,9 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/math/matrix_interpolation.h"
+
 #include <cmath>
 
-#include "cobalt/math/matrix_interpolation.h"
 #include "cobalt/math/transform_2d.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/cobalt/math/point3_unittest.cc b/cobalt/math/point3_unittest.cc
index 3599e03..16a484b 100644
--- a/cobalt/math/point3_unittest.cc
+++ b/cobalt/math/point3_unittest.cc
@@ -2,9 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "cobalt/math/point3_f.h"
-
 #include "base/basictypes.h"
+#include "cobalt/math/point3_f.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/math/point_unittest.cc b/cobalt/math/point_unittest.cc
index 94a1211..081c6c1 100644
--- a/cobalt/math/point_unittest.cc
+++ b/cobalt/math/point_unittest.cc
@@ -3,11 +3,11 @@
 // found in the LICENSE file.
 
 #include "cobalt/math/point.h"
-#include "cobalt/math/point_f.h"
 
 #include "base/basictypes.h"
 #include "cobalt/math/point_base.h"
 #include "cobalt/math/point_conversions.h"
+#include "cobalt/math/point_f.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/math/quad_f.h b/cobalt/math/quad_f.h
index e0869e3..9a7954f 100644
--- a/cobalt/math/quad_f.h
+++ b/cobalt/math/quad_f.h
@@ -81,9 +81,9 @@
     return RectF(rl, rt, rr - rl, rb - rt);
   }
 
-  // Add a vector to the quad, offseting each point in the quad by the vector.
+  // Add a vector to the quad, offsetting each point in the quad by the vector.
   void operator+=(const Vector2dF& rhs);
-  // Subtract a vector from the quad, offseting each point in the quad by the
+  // Subtract a vector from the quad, offsetting each point in the quad by the
   // inverse of the vector.
   void operator-=(const Vector2dF& rhs);
 
@@ -112,9 +112,9 @@
   return !(lhs == rhs);
 }
 
-// Add a vector to a quad, offseting each point in the quad by the vector.
+// Add a vector to a quad, offsetting each point in the quad by the vector.
 QuadF operator+(const QuadF& lhs, const Vector2dF& rhs);
-// Subtract a vector from a quad, offseting each point in the quad by the
+// Subtract a vector from a quad, offsetting each point in the quad by the
 // inverse of the vector.
 QuadF operator-(const QuadF& lhs, const Vector2dF& rhs);
 
diff --git a/cobalt/math/quad_unittest.cc b/cobalt/math/quad_unittest.cc
index c1ff1bd..2becc66 100644
--- a/cobalt/math/quad_unittest.cc
+++ b/cobalt/math/quad_unittest.cc
@@ -2,9 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "cobalt/math/quad_f.h"
-
 #include "base/basictypes.h"
+#include "cobalt/math/quad_f.h"
 #include "cobalt/math/rect_f.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/cobalt/math/rect_base_impl.h b/cobalt/math/rect_base_impl.h
index 4f328dd..dd8d082 100644
--- a/cobalt/math/rect_base_impl.h
+++ b/cobalt/math/rect_base_impl.h
@@ -58,22 +58,22 @@
 
 template <typename Class, typename PointClass, typename SizeClass,
           typename InsetsClass, typename VectorClass, typename Type>
-void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>::
-operator+=(const VectorClass& offset) {
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::operator+=(const VectorClass& offset) {
   origin_ += offset;
 }
 
 template <typename Class, typename PointClass, typename SizeClass,
           typename InsetsClass, typename VectorClass, typename Type>
-void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>::
-operator-=(const VectorClass& offset) {
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::operator-=(const VectorClass& offset) {
   origin_ -= offset;
 }
 
 template <typename Class, typename PointClass, typename SizeClass,
           typename InsetsClass, typename VectorClass, typename Type>
-bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>::
-operator<(const Class& other) const {
+bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::operator<(const Class& other) const {
   if (origin_ == other.origin_) {
     if (width() == other.width()) {
       return height() < other.height();
@@ -253,8 +253,8 @@
   c.Union(rect);
 
   const Type kEpsilon = std::numeric_limits<Type>::is_integer
-                                   ? Type(1)
-                                   : std::numeric_limits<Type>::epsilon();
+                            ? Type(1)
+                            : std::numeric_limits<Type>::epsilon();
 
   Type x =
       std::max<Type>(Type(0), c.width() - width() - rect.width() + kEpsilon);
diff --git a/cobalt/math/rect_unittest.cc b/cobalt/math/rect_unittest.cc
index c1548d9..44fd0fa 100644
--- a/cobalt/math/rect_unittest.cc
+++ b/cobalt/math/rect_unittest.cc
@@ -461,16 +461,16 @@
     float w2;
     float h2;
   } tests[] = {
-        {3, 3, 3, 3, 1.5f, 4.5f, 4.5f, 4.5f, 4.5f},
-        {3, 3, 3, 3, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f},
-        {3, 3, 3, 3, std::numeric_limits<float>::quiet_NaN(),
-         std::numeric_limits<float>::quiet_NaN(),
-         std::numeric_limits<float>::quiet_NaN(),
-         std::numeric_limits<float>::quiet_NaN(),
-         std::numeric_limits<float>::quiet_NaN()},
-        {3, 3, 3, 3, std::numeric_limits<float>::max(),
-         std::numeric_limits<float>::max(), std::numeric_limits<float>::max(),
-         std::numeric_limits<float>::max(), std::numeric_limits<float>::max()}};
+      {3, 3, 3, 3, 1.5f, 4.5f, 4.5f, 4.5f, 4.5f},
+      {3, 3, 3, 3, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f},
+      {3, 3, 3, 3, std::numeric_limits<float>::quiet_NaN(),
+       std::numeric_limits<float>::quiet_NaN(),
+       std::numeric_limits<float>::quiet_NaN(),
+       std::numeric_limits<float>::quiet_NaN(),
+       std::numeric_limits<float>::quiet_NaN()},
+      {3, 3, 3, 3, std::numeric_limits<float>::max(),
+       std::numeric_limits<float>::max(), std::numeric_limits<float>::max(),
+       std::numeric_limits<float>::max(), std::numeric_limits<float>::max()}};
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
     Rect r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
@@ -495,20 +495,20 @@
     int w2;
     int h2;
   } tests[] = {
-        {0.0f, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0},
-        {-1.5f, -1.5f, 3.0f, 3.0f, -1, -1, 2, 2},
-        {-1.5f, -1.5f, 3.5f, 3.5f, -1, -1, 3, 3},
-        {std::numeric_limits<float>::max(), std::numeric_limits<float>::max(),
-         2.0f, 2.0f, std::numeric_limits<int>::max(),
-         std::numeric_limits<int>::max(), 0, 0},
-        {0.0f, 0.0f, std::numeric_limits<float>::max(),
-         std::numeric_limits<float>::max(), 0, 0,
-         std::numeric_limits<int>::max(), std::numeric_limits<int>::max()},
-        {20000.5f, 20000.5f, 0.5f, 0.5f, 20001, 20001, 0, 0},
-        {std::numeric_limits<float>::quiet_NaN(),
-         std::numeric_limits<float>::quiet_NaN(),
-         std::numeric_limits<float>::quiet_NaN(),
-         std::numeric_limits<float>::quiet_NaN(), 0, 0, 0, 0}};
+      {0.0f, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0},
+      {-1.5f, -1.5f, 3.0f, 3.0f, -1, -1, 2, 2},
+      {-1.5f, -1.5f, 3.5f, 3.5f, -1, -1, 3, 3},
+      {std::numeric_limits<float>::max(), std::numeric_limits<float>::max(),
+       2.0f, 2.0f, std::numeric_limits<int>::max(),
+       std::numeric_limits<int>::max(), 0, 0},
+      {0.0f, 0.0f, std::numeric_limits<float>::max(),
+       std::numeric_limits<float>::max(), 0, 0, std::numeric_limits<int>::max(),
+       std::numeric_limits<int>::max()},
+      {20000.5f, 20000.5f, 0.5f, 0.5f, 20001, 20001, 0, 0},
+      {std::numeric_limits<float>::quiet_NaN(),
+       std::numeric_limits<float>::quiet_NaN(),
+       std::numeric_limits<float>::quiet_NaN(),
+       std::numeric_limits<float>::quiet_NaN(), 0, 0, 0, 0}};
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
     RectF r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
@@ -533,21 +533,21 @@
     int w2;
     int h2;
   } tests[] = {
-        {0.0f, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0},
-        {5.5f, 5.5f, 0.0f, 0.0f, 5, 5, 0, 0},
-        {-1.5f, -1.5f, 3.0f, 3.0f, -2, -2, 4, 4},
-        {-1.5f, -1.5f, 3.5f, 3.5f, -2, -2, 4, 4},
-        {std::numeric_limits<float>::max(), std::numeric_limits<float>::max(),
-         2.0f, 2.0f, std::numeric_limits<int>::max(),
-         std::numeric_limits<int>::max(), 0, 0},
-        {0.0f, 0.0f, std::numeric_limits<float>::max(),
-         std::numeric_limits<float>::max(), 0, 0,
-         std::numeric_limits<int>::max(), std::numeric_limits<int>::max()},
-        {20000.5f, 20000.5f, 0.5f, 0.5f, 20000, 20000, 1, 1},
-        {std::numeric_limits<float>::quiet_NaN(),
-         std::numeric_limits<float>::quiet_NaN(),
-         std::numeric_limits<float>::quiet_NaN(),
-         std::numeric_limits<float>::quiet_NaN(), 0, 0, 0, 0}};
+      {0.0f, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0},
+      {5.5f, 5.5f, 0.0f, 0.0f, 5, 5, 0, 0},
+      {-1.5f, -1.5f, 3.0f, 3.0f, -2, -2, 4, 4},
+      {-1.5f, -1.5f, 3.5f, 3.5f, -2, -2, 4, 4},
+      {std::numeric_limits<float>::max(), std::numeric_limits<float>::max(),
+       2.0f, 2.0f, std::numeric_limits<int>::max(),
+       std::numeric_limits<int>::max(), 0, 0},
+      {0.0f, 0.0f, std::numeric_limits<float>::max(),
+       std::numeric_limits<float>::max(), 0, 0, std::numeric_limits<int>::max(),
+       std::numeric_limits<int>::max()},
+      {20000.5f, 20000.5f, 0.5f, 0.5f, 20000, 20000, 1, 1},
+      {std::numeric_limits<float>::quiet_NaN(),
+       std::numeric_limits<float>::quiet_NaN(),
+       std::numeric_limits<float>::quiet_NaN(),
+       std::numeric_limits<float>::quiet_NaN(), 0, 0, 0, 0}};
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
     RectF r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
@@ -583,11 +583,11 @@
     int w2;
     int h2;
   } tests[] = {
-        {0.0f, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0},
-        {-1.5f, -1.5f, 3.0f, 3.0f, -2, -2, 3, 3},
-        {-1.5f, -1.5f, 3.5f, 3.5f, -2, -2, 3, 3},
-        {20000.5f, 20000.5f, 0.5f, 0.5f, 20000, 20000, 0, 0},
-    };
+      {0.0f, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0},
+      {-1.5f, -1.5f, 3.0f, 3.0f, -2, -2, 3, 3},
+      {-1.5f, -1.5f, 3.5f, 3.5f, -2, -2, 3, 3},
+      {20000.5f, 20000.5f, 0.5f, 0.5f, 20000, 20000, 0, 0},
+  };
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
     RectF r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
@@ -607,25 +607,39 @@
     float input_scale;
     Rect expected_rect;
   } tests[] = {{
-                Rect(), 5.f, Rect(),
+                   Rect(),
+                   5.f,
+                   Rect(),
                },
                {
-                Rect(1, 1, 1, 1), 5.f, Rect(5, 5, 5, 5),
+                   Rect(1, 1, 1, 1),
+                   5.f,
+                   Rect(5, 5, 5, 5),
                },
                {
-                Rect(-1, -1, 0, 0), 5.f, Rect(-5, -5, 0, 0),
+                   Rect(-1, -1, 0, 0),
+                   5.f,
+                   Rect(-5, -5, 0, 0),
                },
                {
-                Rect(1, -1, 0, 1), 5.f, Rect(5, -5, 0, 5),
+                   Rect(1, -1, 0, 1),
+                   5.f,
+                   Rect(5, -5, 0, 5),
                },
                {
-                Rect(-1, 1, 1, 0), 5.f, Rect(-5, 5, 5, 0),
+                   Rect(-1, 1, 1, 0),
+                   5.f,
+                   Rect(-5, 5, 5, 0),
                },
                {
-                Rect(1, 2, 3, 4), 1.5f, Rect(2, 3, 4, 6),
+                   Rect(1, 2, 3, 4),
+                   1.5f,
+                   Rect(2, 3, 4, 6),
                },
                {
-                Rect(-1, -2, 0, 0), 1.5f, Rect(-1, -3, 0, 0),
+                   Rect(-1, -2, 0, 0),
+                   1.5f,
+                   Rect(-1, -3, 0, 0),
                }};
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
@@ -641,25 +655,39 @@
     float input_scale;
     Rect expected_rect;
   } tests[] = {{
-                Rect(), 5.f, Rect(),
+                   Rect(),
+                   5.f,
+                   Rect(),
                },
                {
-                Rect(1, 1, 1, 1), 5.f, Rect(5, 5, 5, 5),
+                   Rect(1, 1, 1, 1),
+                   5.f,
+                   Rect(5, 5, 5, 5),
                },
                {
-                Rect(-1, -1, 0, 0), 5.f, Rect(-5, -5, 0, 0),
+                   Rect(-1, -1, 0, 0),
+                   5.f,
+                   Rect(-5, -5, 0, 0),
                },
                {
-                Rect(1, -1, 0, 1), 5.f, Rect(5, -5, 0, 5),
+                   Rect(1, -1, 0, 1),
+                   5.f,
+                   Rect(5, -5, 0, 5),
                },
                {
-                Rect(-1, 1, 1, 0), 5.f, Rect(-5, 5, 5, 0),
+                   Rect(-1, 1, 1, 0),
+                   5.f,
+                   Rect(-5, 5, 5, 0),
                },
                {
-                Rect(1, 2, 3, 4), 1.5f, Rect(1, 3, 5, 6),
+                   Rect(1, 2, 3, 4),
+                   1.5f,
+                   Rect(1, 3, 5, 6),
                },
                {
-                Rect(-1, -2, 0, 0), 1.5f, Rect(-2, -3, 0, 0),
+                   Rect(-1, -2, 0, 0),
+                   1.5f,
+                   Rect(-2, -3, 0, 0),
                }};
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
@@ -686,22 +714,23 @@
     Point a;
     Point b;
     Rect expected;
-  } int_tests[] = {// If point B dominates A, then A should be the origin.
-                   {Point(4, 6), Point(4, 6), Rect(4, 6, 0, 0)},
-                   {Point(4, 6), Point(8, 6), Rect(4, 6, 4, 0)},
-                   {Point(4, 6), Point(4, 9), Rect(4, 6, 0, 3)},
-                   {Point(4, 6), Point(8, 9), Rect(4, 6, 4, 3)},
-                   // If point A dominates B, then B should be the origin.
-                   {Point(4, 6), Point(4, 6), Rect(4, 6, 0, 0)},
-                   {Point(8, 6), Point(4, 6), Rect(4, 6, 4, 0)},
-                   {Point(4, 9), Point(4, 6), Rect(4, 6, 0, 3)},
-                   {Point(8, 9), Point(4, 6), Rect(4, 6, 4, 3)},
-                   // If neither point dominates, then the origin is a
-                   // combination of the two.
-                   {Point(4, 6), Point(6, 4), Rect(4, 4, 2, 2)},
-                   {Point(-4, -6), Point(-6, -4), Rect(-6, -6, 2, 2)},
-                   {Point(-4, 6), Point(6, -4), Rect(-4, -4, 10, 10)},
-    };
+  } int_tests[] = {
+      // If point B dominates A, then A should be the origin.
+      {Point(4, 6), Point(4, 6), Rect(4, 6, 0, 0)},
+      {Point(4, 6), Point(8, 6), Rect(4, 6, 4, 0)},
+      {Point(4, 6), Point(4, 9), Rect(4, 6, 0, 3)},
+      {Point(4, 6), Point(8, 9), Rect(4, 6, 4, 3)},
+      // If point A dominates B, then B should be the origin.
+      {Point(4, 6), Point(4, 6), Rect(4, 6, 0, 0)},
+      {Point(8, 6), Point(4, 6), Rect(4, 6, 4, 0)},
+      {Point(4, 9), Point(4, 6), Rect(4, 6, 0, 3)},
+      {Point(8, 9), Point(4, 6), Rect(4, 6, 4, 3)},
+      // If neither point dominates, then the origin is a
+      // combination of the two.
+      {Point(4, 6), Point(6, 4), Rect(4, 4, 2, 2)},
+      {Point(-4, -6), Point(-6, -4), Rect(-6, -6, 2, 2)},
+      {Point(-4, 6), Point(6, -4), Rect(-4, -4, 10, 10)},
+  };
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(int_tests); ++i) {
     Rect actual = BoundingRect(int_tests[i].a, int_tests[i].b);
@@ -713,23 +742,23 @@
     PointF b;
     RectF expected;
   } float_tests[] = {
-        // If point B dominates A, then A should be the origin.
-        {PointF(4.2f, 6.8f), PointF(4.2f, 6.8f), RectF(4.2f, 6.8f, 0, 0)},
-        {PointF(4.2f, 6.8f), PointF(8.5f, 6.8f), RectF(4.2f, 6.8f, 4.3f, 0)},
-        {PointF(4.2f, 6.8f), PointF(4.2f, 9.3f), RectF(4.2f, 6.8f, 0, 2.5f)},
-        {PointF(4.2f, 6.8f), PointF(8.5f, 9.3f), RectF(4.2f, 6.8f, 4.3f, 2.5f)},
-        // If point A dominates B, then B should be the origin.
-        {PointF(4.2f, 6.8f), PointF(4.2f, 6.8f), RectF(4.2f, 6.8f, 0, 0)},
-        {PointF(8.5f, 6.8f), PointF(4.2f, 6.8f), RectF(4.2f, 6.8f, 4.3f, 0)},
-        {PointF(4.2f, 9.3f), PointF(4.2f, 6.8f), RectF(4.2f, 6.8f, 0, 2.5f)},
-        {PointF(8.5f, 9.3f), PointF(4.2f, 6.8f), RectF(4.2f, 6.8f, 4.3f, 2.5f)},
-        // If neither point dominates, then the origin is a combination of the
-        // two.
-        {PointF(4.2f, 6.8f), PointF(6.8f, 4.2f), RectF(4.2f, 4.2f, 2.6f, 2.6f)},
-        {PointF(-4.2f, -6.8f), PointF(-6.8f, -4.2f),
-         RectF(-6.8f, -6.8f, 2.6f, 2.6f)},
-        {PointF(-4.2f, 6.8f), PointF(6.8f, -4.2f),
-         RectF(-4.2f, -4.2f, 11.0f, 11.0f)}};
+      // If point B dominates A, then A should be the origin.
+      {PointF(4.2f, 6.8f), PointF(4.2f, 6.8f), RectF(4.2f, 6.8f, 0, 0)},
+      {PointF(4.2f, 6.8f), PointF(8.5f, 6.8f), RectF(4.2f, 6.8f, 4.3f, 0)},
+      {PointF(4.2f, 6.8f), PointF(4.2f, 9.3f), RectF(4.2f, 6.8f, 0, 2.5f)},
+      {PointF(4.2f, 6.8f), PointF(8.5f, 9.3f), RectF(4.2f, 6.8f, 4.3f, 2.5f)},
+      // If point A dominates B, then B should be the origin.
+      {PointF(4.2f, 6.8f), PointF(4.2f, 6.8f), RectF(4.2f, 6.8f, 0, 0)},
+      {PointF(8.5f, 6.8f), PointF(4.2f, 6.8f), RectF(4.2f, 6.8f, 4.3f, 0)},
+      {PointF(4.2f, 9.3f), PointF(4.2f, 6.8f), RectF(4.2f, 6.8f, 0, 2.5f)},
+      {PointF(8.5f, 9.3f), PointF(4.2f, 6.8f), RectF(4.2f, 6.8f, 4.3f, 2.5f)},
+      // If neither point dominates, then the origin is a combination of the
+      // two.
+      {PointF(4.2f, 6.8f), PointF(6.8f, 4.2f), RectF(4.2f, 4.2f, 2.6f, 2.6f)},
+      {PointF(-4.2f, -6.8f), PointF(-6.8f, -4.2f),
+       RectF(-6.8f, -6.8f, 2.6f, 2.6f)},
+      {PointF(-4.2f, 6.8f), PointF(6.8f, -4.2f),
+       RectF(-4.2f, -4.2f, 11.0f, 11.0f)}};
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(float_tests); ++i) {
     RectF actual = BoundingRect(float_tests[i].a, float_tests[i].b);
diff --git a/cobalt/math/size_unittest.cc b/cobalt/math/size_unittest.cc
index 7ef23f8..f410ce4 100644
--- a/cobalt/math/size_unittest.cc
+++ b/cobalt/math/size_unittest.cc
@@ -3,10 +3,10 @@
 // found in the LICENSE file.
 
 #include "cobalt/math/size.h"
-#include "cobalt/math/size_f.h"
 
 #include "cobalt/math/size_base.h"
 #include "cobalt/math/size_conversions.h"
+#include "cobalt/math/size_f.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/math/transform_2d_test.cc b/cobalt/math/transform_2d_test.cc
index 301aebe..8afc5ea 100644
--- a/cobalt/math/transform_2d_test.cc
+++ b/cobalt/math/transform_2d_test.cc
@@ -12,41 +12,34 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/math/transform_2d.h"
+
 #include <cmath>
 
-#include "cobalt/math/transform_2d.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using cobalt::math::Matrix3F;
 
 TEST(Transform2DTest, Translation) {
-  Matrix3F expected_value = Matrix3F::FromValues(
-      1.0f, 0,    3.0f,
-      0,    1.0f, 4.0f,
-      0,    0,    1.0f);
+  Matrix3F expected_value =
+      Matrix3F::FromValues(1.0f, 0, 3.0f, 0, 1.0f, 4.0f, 0, 0, 1.0f);
 
-  EXPECT_TRUE(expected_value.IsNear(
-      cobalt::math::TranslateMatrix(3, 4), 0.00001f));
+  EXPECT_TRUE(
+      expected_value.IsNear(cobalt::math::TranslateMatrix(3, 4), 0.00001f));
 }
 
 TEST(Transform2DTest, AnisotropicScale) {
-  Matrix3F expected_value = Matrix3F::FromValues(
-      3.0f, 0,    0,
-      0,    4.0f, 0,
-      0,    0,    1.0f);
+  Matrix3F expected_value =
+      Matrix3F::FromValues(3.0f, 0, 0, 0, 4.0f, 0, 0, 0, 1.0f);
 
-  EXPECT_TRUE(expected_value.IsNear(
-      cobalt::math::ScaleMatrix(3, 4), 0.00001f));
+  EXPECT_TRUE(expected_value.IsNear(cobalt::math::ScaleMatrix(3, 4), 0.00001f));
 }
 
 TEST(Transform2DTest, IsotropicScale) {
-  Matrix3F expected_value = Matrix3F::FromValues(
-      3.0f, 0,    0,
-      0,    3.0f, 0,
-      0,    0,    1.0f);
+  Matrix3F expected_value =
+      Matrix3F::FromValues(3.0f, 0, 0, 0, 3.0f, 0, 0, 0, 1.0f);
 
-  EXPECT_TRUE(expected_value.IsNear(
-      cobalt::math::ScaleMatrix(3), 0.00001f));
+  EXPECT_TRUE(expected_value.IsNear(cobalt::math::ScaleMatrix(3), 0.00001f));
 }
 
 TEST(Transform2DTest, Rotation) {
@@ -54,10 +47,8 @@
 
   // Note that we account for the fact that up is represented by negative y.
   Matrix3F expected_value = Matrix3F::FromValues(
-      cos(kTheta),  sin(kTheta), 0,
-      -sin(kTheta), cos(kTheta), 0,
-      0,            0,           1.0f);
+      cos(kTheta), sin(kTheta), 0, -sin(kTheta), cos(kTheta), 0, 0, 0, 1.0f);
 
-  EXPECT_TRUE(expected_value.IsNear(
-      cobalt::math::RotateMatrix(kTheta), 0.00001f));
+  EXPECT_TRUE(
+      expected_value.IsNear(cobalt::math::RotateMatrix(kTheta), 0.00001f));
 }
diff --git a/cobalt/math/vector2d_unittest.cc b/cobalt/math/vector2d_unittest.cc
index e42e19c..fe8e748 100644
--- a/cobalt/math/vector2d_unittest.cc
+++ b/cobalt/math/vector2d_unittest.cc
@@ -3,12 +3,12 @@
 // found in the LICENSE file.
 
 #include "cobalt/math/vector2d.h"
-#include "cobalt/math/vector2d_f.h"
 
 #include <cmath>
 #include <limits>
 
 #include "base/basictypes.h"
+#include "cobalt/math/vector2d_f.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
@@ -90,15 +90,12 @@
 }
 
 TEST(Vector2dTest, Scale) {
-  float double_values[][4] = {{4.5f, 1.2f, 3.3f, 5.6f},
-                              {4.5f, -1.2f, 3.3f, 5.6f},
-                              {4.5f, 1.2f, 3.3f, -5.6f},
-                              {4.5f, 1.2f, -3.3f, -5.6f},
-                              {-4.5f, 1.2f, 3.3f, 5.6f},
-                              {-4.5f, 1.2f, 0, 5.6f},
-                              {-4.5f, 1.2f, 3.3f, 0},
-                              {4.5f, 0, 3.3f, 5.6f},
-                              {0, 1.2f, 3.3f, 5.6f}};
+  float double_values[][4] = {
+      {4.5f, 1.2f, 3.3f, 5.6f},  {4.5f, -1.2f, 3.3f, 5.6f},
+      {4.5f, 1.2f, 3.3f, -5.6f}, {4.5f, 1.2f, -3.3f, -5.6f},
+      {-4.5f, 1.2f, 3.3f, 5.6f}, {-4.5f, 1.2f, 0, 5.6f},
+      {-4.5f, 1.2f, 3.3f, 0},    {4.5f, 0, 3.3f, 5.6f},
+      {0, 1.2f, 3.3f, 5.6f}};
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(double_values); ++i) {
     Vector2dF v(double_values[i][0], double_values[i][1]);
@@ -113,15 +110,10 @@
     EXPECT_EQ(double_values[i][1] * double_values[i][3], v2.y());
   }
 
-  float single_values[][3] = {{4.5f, 1.2f, 3.3f},
-                              {4.5f, -1.2f, 3.3f},
-                              {4.5f, 1.2f, 3.3f},
-                              {4.5f, 1.2f, -3.3f},
-                              {-4.5f, 1.2f, 3.3f},
-                              {-4.5f, 1.2f, 0},
-                              {-4.5f, 1.2f, 3.3f},
-                              {4.5f, 0, 3.3f},
-                              {0, 1.2f, 3.3f}};
+  float single_values[][3] = {
+      {4.5f, 1.2f, 3.3f},  {4.5f, -1.2f, 3.3f}, {4.5f, 1.2f, 3.3f},
+      {4.5f, 1.2f, -3.3f}, {-4.5f, 1.2f, 3.3f}, {-4.5f, 1.2f, 0},
+      {-4.5f, 1.2f, 3.3f}, {4.5f, 0, 3.3f},     {0, 1.2f, 3.3f}};
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(single_values); ++i) {
     Vector2dF v(single_values[i][0], single_values[i][1]);
diff --git a/cobalt/math/vector3d_unittest.cc b/cobalt/math/vector3d_unittest.cc
index 33bd039..e25b605 100644
--- a/cobalt/math/vector3d_unittest.cc
+++ b/cobalt/math/vector3d_unittest.cc
@@ -2,12 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "cobalt/math/vector3d_f.h"
-
 #include <cmath>
 #include <limits>
 
 #include "base/basictypes.h"
+#include "cobalt/math/vector3d_f.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
@@ -29,9 +28,9 @@
     Vector3dF expected;
     Vector3dF actual;
   } float_tests[] = {
-        {Vector3dF(3.1F, 5.1F, 2.7f), f1 + Vector3dF()},
-        {Vector3dF(3.1f + 4.3f, 5.1f - 1.3f, 2.7f + 8.1f), f1 + f2},
-        {Vector3dF(3.1f - 4.3f, 5.1f + 1.3f, 2.7f - 8.1f), f1 - f2}};
+      {Vector3dF(3.1F, 5.1F, 2.7f), f1 + Vector3dF()},
+      {Vector3dF(3.1f + 4.3f, 5.1f - 1.3f, 2.7f + 8.1f), f1 + f2},
+      {Vector3dF(3.1f - 4.3f, 5.1f + 1.3f, 2.7f - 8.1f), f1 - f2}};
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(float_tests); ++i)
     EXPECT_EQ(float_tests[i].expected.ToString(),
@@ -43,12 +42,12 @@
     Vector3dF expected;
     Vector3dF actual;
   } float_tests[] = {
-        {Vector3dF(-0.0f, -0.0f, -0.0f), -Vector3dF(0, 0, 0)},
-        {Vector3dF(-0.3f, -0.3f, -0.3f), -Vector3dF(0.3f, 0.3f, 0.3f)},
-        {Vector3dF(0.3f, 0.3f, 0.3f), -Vector3dF(-0.3f, -0.3f, -0.3f)},
-        {Vector3dF(-0.3f, 0.3f, -0.3f), -Vector3dF(0.3f, -0.3f, 0.3f)},
-        {Vector3dF(0.3f, -0.3f, -0.3f), -Vector3dF(-0.3f, 0.3f, 0.3f)},
-        {Vector3dF(-0.3f, -0.3f, 0.3f), -Vector3dF(0.3f, 0.3f, -0.3f)}};
+      {Vector3dF(-0.0f, -0.0f, -0.0f), -Vector3dF(0, 0, 0)},
+      {Vector3dF(-0.3f, -0.3f, -0.3f), -Vector3dF(0.3f, 0.3f, 0.3f)},
+      {Vector3dF(0.3f, 0.3f, 0.3f), -Vector3dF(-0.3f, -0.3f, -0.3f)},
+      {Vector3dF(-0.3f, 0.3f, -0.3f), -Vector3dF(0.3f, -0.3f, 0.3f)},
+      {Vector3dF(0.3f, -0.3f, -0.3f), -Vector3dF(-0.3f, 0.3f, 0.3f)},
+      {Vector3dF(-0.3f, -0.3f, 0.3f), -Vector3dF(0.3f, 0.3f, -0.3f)}};
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(float_tests); ++i)
     EXPECT_EQ(float_tests[i].expected.ToString(),
@@ -93,20 +92,14 @@
     EXPECT_EQ(triple_values[i][2] * triple_values[i][5], v2.z());
   }
 
-  float single_values[][4] = {{4.5f, 1.2f, 1.8f, 3.3f},
-                              {4.5f, -1.2f, 1.8f, 3.3f},
-                              {4.5f, 1.2f, -1.8f, 3.3f},
-                              {4.5f, -1.2f, -1.8f, 3.3f},
-                              {-4.5f, 1.2f, 3.3f},
-                              {-4.5f, 1.2f, 0},
-                              {-4.5f, 1.2f, 1.8f, 3.3f},
-                              {-4.5f, 1.2f, 1.8f, 0},
-                              {4.5f, 0, 1.8f, 3.3f},
-                              {0, 1.2f, 1.8f, 3.3f},
-                              {4.5f, 0, 1.8f, 3.3f},
-                              {0, 1.2f, 1.8f, 3.3f},
-                              {4.5f, 1.2f, 0, 3.3f},
-                              {4.5f, 1.2f, 0, 3.3f}};
+  float single_values[][4] = {
+      {4.5f, 1.2f, 1.8f, 3.3f},  {4.5f, -1.2f, 1.8f, 3.3f},
+      {4.5f, 1.2f, -1.8f, 3.3f}, {4.5f, -1.2f, -1.8f, 3.3f},
+      {-4.5f, 1.2f, 3.3f},       {-4.5f, 1.2f, 0},
+      {-4.5f, 1.2f, 1.8f, 3.3f}, {-4.5f, 1.2f, 1.8f, 0},
+      {4.5f, 0, 1.8f, 3.3f},     {0, 1.2f, 1.8f, 3.3f},
+      {4.5f, 0, 1.8f, 3.3f},     {0, 1.2f, 1.8f, 3.3f},
+      {4.5f, 1.2f, 0, 3.3f},     {4.5f, 1.2f, 0, 3.3f}};
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(single_values); ++i) {
     Vector3dF v(single_values[i][0], single_values[i][1], single_values[i][2]);
@@ -166,13 +159,13 @@
     Vector3dF input1;
     Vector3dF input2;
   } tests[] = {
-        {0, Vector3dF(1, 0, 0), Vector3dF(0, 1, 1)},
-        {0, Vector3dF(0, 1, 0), Vector3dF(1, 0, 1)},
-        {0, Vector3dF(0, 0, 1), Vector3dF(1, 1, 0)},
-        {3, Vector3dF(1, 1, 1), Vector3dF(1, 1, 1)},
-        {1.2f, Vector3dF(1.2f, -1.2f, 1.2f), Vector3dF(1, 1, 1)},
-        {1.2f, Vector3dF(1, 1, 1), Vector3dF(1.2f, -1.2f, 1.2f)},
-        {38.72f, Vector3dF(1.1f, 2.2f, 3.3f), Vector3dF(4.4f, 5.5f, 6.6f)}};
+      {0, Vector3dF(1, 0, 0), Vector3dF(0, 1, 1)},
+      {0, Vector3dF(0, 1, 0), Vector3dF(1, 0, 1)},
+      {0, Vector3dF(0, 0, 1), Vector3dF(1, 1, 0)},
+      {3, Vector3dF(1, 1, 1), Vector3dF(1, 1, 1)},
+      {1.2f, Vector3dF(1.2f, -1.2f, 1.2f), Vector3dF(1, 1, 1)},
+      {1.2f, Vector3dF(1, 1, 1), Vector3dF(1.2f, -1.2f, 1.2f)},
+      {38.72f, Vector3dF(1.1f, 2.2f, 3.3f), Vector3dF(4.4f, 5.5f, 6.6f)}};
 
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
     float actual = DotProduct(tests[i].input1, tests[i].input2);
diff --git a/cobalt/media/BUILD.gn b/cobalt/media/BUILD.gn
index 813baa2..8f640ff 100644
--- a/cobalt/media/BUILD.gn
+++ b/cobalt/media/BUILD.gn
@@ -51,6 +51,8 @@
     "base/sbplayer_pipeline.h",
     "base/sbplayer_set_bounds_helper.cc",
     "base/sbplayer_set_bounds_helper.h",
+    "bidirectional_fit_reuse_allocator.cc",
+    "bidirectional_fit_reuse_allocator.h",
     "decoder_buffer_allocator.cc",
     "decoder_buffer_allocator.h",
     "decoder_buffer_memory_info.h",
@@ -80,6 +82,7 @@
     "progressive/progressive_parser.h",
     "progressive/rbsp_stream.cc",
     "progressive/rbsp_stream.h",
+    "starboard_memory_allocator.h",
     "url_fetcher_data_source.cc",
     "url_fetcher_data_source.h",
   ]
@@ -116,6 +119,7 @@
   sources = [
     "base/cval_stats_test.cc",
     "base/decoder_buffer_cache_test.cc",
+    "bidirectional_fit_reuse_allocator_test.cc",
     "file_data_source_test.cc",
     "progressive/demuxer_extension_wrapper_test.cc",
     "progressive/mock_data_source_reader.h",
@@ -131,6 +135,7 @@
     "//base/test:test_support",
     "//cobalt/base",
     "//cobalt/test:run_all_unittests",
+    "//nb",
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/chromium/media:media",
diff --git a/cobalt/media/base/audio_bus.cc b/cobalt/media/base/audio_bus.cc
index 4aaf9c7..e656769 100644
--- a/cobalt/media/base/audio_bus.cc
+++ b/cobalt/media/base/audio_bus.cc
@@ -33,7 +33,7 @@
                           AudioBus::SampleType dest_type, uint8* dest_ptr) {
   if (src_type == dest_type) {
     memcpy(dest_ptr, src_ptr,
-                 src_type == AudioBus::kInt16 ? sizeof(int16) : sizeof(float));
+           src_type == AudioBus::kInt16 ? sizeof(int16) : sizeof(float));
   } else if (src_type == AudioBus::kFloat32) {
     float sample_in_float = *reinterpret_cast<const float*>(src_ptr);
     int32 sample_in_int32 =
@@ -189,11 +189,11 @@
   }
   if (storage_type_ == kInterleaved) {
     memset(GetSamplePtr(0, start_frame), 0,
-                GetSampleSizeInBytes() * (end_frame - start_frame) * channels_);
+           GetSampleSizeInBytes() * (end_frame - start_frame) * channels_);
   } else {
     for (size_t channel = 0; channel < channels_; ++channel) {
       memset(GetSamplePtr(channel, start_frame), 0,
-                  GetSampleSizeInBytes() * (end_frame - start_frame));
+             GetSampleSizeInBytes() * (end_frame - start_frame));
     }
   }
 }
@@ -210,11 +210,11 @@
     size_t frames = std::min(frames_, source.frames_);
     if (storage_type_ == kInterleaved) {
       memcpy(GetSamplePtr(0, 0), source.GetSamplePtr(0, 0),
-                   GetSampleSizeInBytes() * frames * channels_);
+             GetSampleSizeInBytes() * frames * channels_);
     } else {
       for (size_t channel = 0; channel < channels_; ++channel) {
         memcpy(GetSamplePtr(channel, 0), source.GetSamplePtr(channel, 0),
-                     GetSampleSizeInBytes() * frames);
+               GetSampleSizeInBytes() * frames);
       }
     }
     return;
diff --git a/cobalt/media/base/interleaved_sinc_resampler.cc b/cobalt/media/base/interleaved_sinc_resampler.cc
index 5756cb8..ae83cb1 100644
--- a/cobalt/media/base/interleaved_sinc_resampler.cc
+++ b/cobalt/media/base/interleaved_sinc_resampler.cc
@@ -49,6 +49,7 @@
 
 #include <algorithm>
 #include <cmath>
+#include <utility>
 
 #include "base/logging.h"
 #include "starboard/memory.h"
@@ -149,7 +150,7 @@
             r1_ + kBufferSize * channel_count_);
 
   memset(kernel_storage_.get(), 0,
-              sizeof(*kernel_storage_.get()) * kKernelStorageSize);
+         sizeof(*kernel_storage_.get()) * kKernelStorageSize);
   memset(input_buffer_.get(), 0, frame_size_in_bytes_ * kBufferSize);
 
   InitializeKernel();
diff --git a/cobalt/media/base/sbplayer_bridge.cc b/cobalt/media/base/sbplayer_bridge.cc
index fad7fda..92dc4da 100644
--- a/cobalt/media/base/sbplayer_bridge.cc
+++ b/cobalt/media/base/sbplayer_bridge.cc
@@ -707,7 +707,11 @@
     // a method of querying that texture.
     decode_target_provider_->SetGetCurrentSbDecodeTargetFunction(base::Bind(
         &SbPlayerBridge::GetCurrentSbDecodeTarget, base::Unretained(this)));
+    SB_LOG(INFO) << "Playing in decode-to-texture mode.";
+  } else {
+    SB_LOG(INFO) << "Playing in punch-out mode.";
   }
+
   decode_target_provider_->SetOutputMode(
       ToVideoFrameProviderOutputMode(output_mode_));
 
@@ -773,7 +777,11 @@
     // a method of querying that texture.
     decode_target_provider_->SetGetCurrentSbDecodeTargetFunction(base::Bind(
         &SbPlayerBridge::GetCurrentSbDecodeTarget, base::Unretained(this)));
+    SB_LOG(INFO) << "Playing in decode-to-texture mode.";
+  } else {
+    SB_LOG(INFO) << "Playing in punch-out mode.";
   }
+
   decode_target_provider_->SetOutputMode(
       ToVideoFrameProviderOutputMode(output_mode_));
   set_bounds_helper_->SetPlayerBridge(this);
diff --git a/cobalt/media/base/sbplayer_pipeline.cc b/cobalt/media/base/sbplayer_pipeline.cc
index 9459ebb..ee6a1dc 100644
--- a/cobalt/media/base/sbplayer_pipeline.cc
+++ b/cobalt/media/base/sbplayer_pipeline.cc
@@ -81,6 +81,24 @@
 }
 #endif  // SB_API_VERSION >= 15
 
+// The function adjusts audio write duration proportionally to the playback
+// rate, when the playback rate is greater than 1.0.
+//
+// Having the right write duration is important:
+// 1. Too small of it causes audio underflow.
+// 2. Too large of it causes excessive audio switch latency.
+// When playback rate is 2x, an 0.5 seconds of write duration effectively only
+// lasts for 0.25 seconds and causes audio underflow, and the function will
+// adjust it to 1 second in this case.
+SbTime AdjustWriteDurationForPlaybackRate(SbTime write_duration,
+                                          float playback_rate) {
+  if (playback_rate <= 1.0) {
+    return write_duration;
+  }
+
+  return static_cast<SbTime>(write_duration * playback_rate);
+}
+
 }  // namespace
 
 SbPlayerPipeline::SbPlayerPipeline(
@@ -1060,13 +1078,16 @@
     // account that our estimate of playback time might be behind by
     // |kMediaTimeCheckInterval|.
     if (timestamp_of_last_written_audio_ - seek_time_.ToSbTime() >
-        audio_write_duration_for_preroll_) {
+        AdjustWriteDurationForPlaybackRate(audio_write_duration_for_preroll_,
+                                           playback_rate_)) {
       // The estimated time ahead of playback may be negative if no audio has
       // been written.
       SbTime time_ahead_of_playback =
           timestamp_of_last_written_audio_ - last_media_time_;
+      auto adjusted_write_duration = AdjustWriteDurationForPlaybackRate(
+          audio_write_duration_, playback_rate_);
       if (time_ahead_of_playback >
-          (audio_write_duration_ + kMediaTimeCheckInterval)) {
+          (adjusted_write_duration + kMediaTimeCheckInterval)) {
         task_runner_->PostDelayedTask(
             FROM_HERE,
             base::Bind(&SbPlayerPipeline::DelayedNeedData, this, max_buffers),
diff --git a/nb/bidirectional_fit_reuse_allocator.cc b/cobalt/media/bidirectional_fit_reuse_allocator.cc
similarity index 80%
rename from nb/bidirectional_fit_reuse_allocator.cc
rename to cobalt/media/bidirectional_fit_reuse_allocator.cc
index bf95517..73b33d4 100644
--- a/nb/bidirectional_fit_reuse_allocator.cc
+++ b/cobalt/media/bidirectional_fit_reuse_allocator.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "nb/bidirectional_fit_reuse_allocator.h"
+#include "cobalt/media/bidirectional_fit_reuse_allocator.h"
 
 #include <algorithm>
 
@@ -20,22 +20,19 @@
 #include "starboard/common/log.h"
 #include "starboard/types.h"
 
-namespace nb {
+namespace cobalt {
+namespace media {
 
 BidirectionalFitReuseAllocator::BidirectionalFitReuseAllocator(
-    Allocator* fallback_allocator,
-    std::size_t initial_capacity,
+    Allocator* fallback_allocator, std::size_t initial_capacity,
     std::size_t small_allocation_threshold,
-    std::size_t allocation_increment /*= 0*/,
-    std::size_t max_capacity /* =0 */
+    std::size_t allocation_increment /*= 0*/, std::size_t max_capacity /* =0 */
     )
-    : ReuseAllocatorBase(fallback_allocator,
-                         initial_capacity,
-                         allocation_increment,
-                         max_capacity),
+    : ReuseAllocatorBase(fallback_allocator, initial_capacity,
+                         allocation_increment, max_capacity),
       small_allocation_threshold_(small_allocation_threshold) {}
 
-ReuseAllocatorBase::FreeBlockSet::iterator
+nb::ReuseAllocatorBase::FreeBlockSet::iterator
 BidirectionalFitReuseAllocator::FindFreeBlock(std::size_t size,
                                               std::size_t alignment,
                                               FreeBlockSet::iterator begin,
@@ -66,4 +63,5 @@
   return end;
 }
 
-}  // namespace nb
+}  // namespace media
+}  // namespace cobalt
diff --git a/nb/bidirectional_fit_reuse_allocator.h b/cobalt/media/bidirectional_fit_reuse_allocator.h
similarity index 81%
rename from nb/bidirectional_fit_reuse_allocator.h
rename to cobalt/media/bidirectional_fit_reuse_allocator.h
index aa03dde..ecfe5fa 100644
--- a/nb/bidirectional_fit_reuse_allocator.h
+++ b/cobalt/media/bidirectional_fit_reuse_allocator.h
@@ -14,13 +14,14 @@
  * limitations under the License.
  */
 
-#ifndef NB_BIDIRECTIONAL_FIT_REUSE_ALLOCATOR_H_
-#define NB_BIDIRECTIONAL_FIT_REUSE_ALLOCATOR_H_
+#ifndef COBALT_MEDIA_BIDIRECTIONAL_FIT_REUSE_ALLOCATOR_H_
+#define COBALT_MEDIA_BIDIRECTIONAL_FIT_REUSE_ALLOCATOR_H_
 
 #include "nb/reuse_allocator_base.h"
 #include "starboard/configuration.h"
 
-namespace nb {
+namespace cobalt {
+namespace media {
 
 // This class uses first-fit allocation strategy to allocate memory block whose
 // size is greater than the |small_allocation_threshold|.  It uses last-fit
@@ -31,7 +32,7 @@
 // Note that when using this class a significant |initial_capacity| should be
 // set as otherwise new allocations will almost always allocate from the front
 // of the fallback allocator.
-class BidirectionalFitReuseAllocator : public ReuseAllocatorBase {
+class BidirectionalFitReuseAllocator : public nb::ReuseAllocatorBase {
  public:
   BidirectionalFitReuseAllocator(Allocator* fallback_allocator,
                                  std::size_t initial_capacity,
@@ -39,8 +40,7 @@
                                  std::size_t allocation_increment = 0,
                                  std::size_t max_capacity = 0);
 
-  FreeBlockSet::iterator FindFreeBlock(std::size_t size,
-                                       std::size_t alignment,
+  FreeBlockSet::iterator FindFreeBlock(std::size_t size, std::size_t alignment,
                                        FreeBlockSet::iterator begin,
                                        FreeBlockSet::iterator end,
                                        bool* allocate_from_front) override;
@@ -49,6 +49,7 @@
   std::size_t small_allocation_threshold_;
 };
 
-}  // namespace nb
+}  // namespace media
+}  // namespace cobalt
 
-#endif  // NB_BIDIRECTIONAL_FIT_REUSE_ALLOCATOR_H_
+#endif  // COBALT_MEDIA_BIDIRECTIONAL_FIT_REUSE_ALLOCATOR_H_
diff --git a/nb/bidirectional_fit_reuse_allocator_test.cc b/cobalt/media/bidirectional_fit_reuse_allocator_test.cc
similarity index 91%
rename from nb/bidirectional_fit_reuse_allocator_test.cc
rename to cobalt/media/bidirectional_fit_reuse_allocator_test.cc
index 21d841a..8d68b7b 100644
--- a/nb/bidirectional_fit_reuse_allocator_test.cc
+++ b/cobalt/media/bidirectional_fit_reuse_allocator_test.cc
@@ -14,18 +14,23 @@
  * limitations under the License.
  */
 
-#include "nb/bidirectional_fit_reuse_allocator.h"
+#include "cobalt/media/bidirectional_fit_reuse_allocator.h"
+
+#include <memory>
 
 #include "nb/fixed_no_free_allocator.h"
 #include "nb/pointer_arithmetic.h"
-#include "nb/scoped_ptr.h"
-#include "nb/starboard_aligned_memory_deleter.h"
 #include "starboard/configuration.h"
+#include "starboard/memory.h"
 #include "starboard/types.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
 
+struct AlignedMemoryDeleter {
+  void operator()(uint8_t* p) { SbMemoryDeallocateAligned(p); }
+};
+
 class BidirectionalFitReuseAllocatorTest : public ::testing::Test {
  public:
   static const int kBufferSize = 1 * 1024 * 1024;
@@ -39,18 +44,18 @@
     buffer_.reset(static_cast<uint8_t*>(
         SbMemoryAllocateAligned(nb::Allocator::kMinAlignment, kBufferSize)));
 
-    nb::scoped_ptr<nb::FixedNoFreeAllocator> fallback_allocator(
+    std::unique_ptr<nb::FixedNoFreeAllocator> fallback_allocator(
         new nb::FixedNoFreeAllocator(buffer_.get(), kBufferSize));
-    allocator_.reset(new nb::BidirectionalFitReuseAllocator(
+    allocator_.reset(new cobalt::media::BidirectionalFitReuseAllocator(
         fallback_allocator.get(), initial_capacity, small_allocation_threshold,
         allocation_increment));
 
     fallback_allocator_.swap(fallback_allocator);
   }
 
-  std::unique_ptr<uint8_t, nb::AlignedMemoryDeleter> buffer_;
-  nb::scoped_ptr<nb::FixedNoFreeAllocator> fallback_allocator_;
-  nb::scoped_ptr<nb::BidirectionalFitReuseAllocator> allocator_;
+  std::unique_ptr<uint8_t, AlignedMemoryDeleter> buffer_;
+  std::unique_ptr<nb::FixedNoFreeAllocator> fallback_allocator_;
+  std::unique_ptr<cobalt::media::BidirectionalFitReuseAllocator> allocator_;
 };
 
 }  // namespace
diff --git a/cobalt/media/decoder_buffer_allocator.cc b/cobalt/media/decoder_buffer_allocator.cc
index db38a23..1c95d2f 100644
--- a/cobalt/media/decoder_buffer_allocator.cc
+++ b/cobalt/media/decoder_buffer_allocator.cc
@@ -19,7 +19,6 @@
 
 #include "cobalt/math/size.h"
 #include "nb/allocator.h"
-#include "nb/memory_scope.h"
 #include "starboard/configuration.h"
 #include "starboard/media.h"
 #include "starboard/memory.h"
@@ -59,8 +58,6 @@
     return;
   }
 
-  TRACK_MEMORY_SCOPE("Media");
-
   ScopedLock scoped_lock(mutex_);
   EnsureReuseAllocatorIsCreated();
   Allocator::Set(this);
@@ -73,8 +70,6 @@
     return;
   }
 
-  TRACK_MEMORY_SCOPE("Media");
-
   ScopedLock scoped_lock(mutex_);
 
   if (reuse_allocator_) {
@@ -88,8 +83,6 @@
     return;
   }
 
-  TRACK_MEMORY_SCOPE("Media");
-
   ScopedLock scoped_lock(mutex_);
 
   if (reuse_allocator_ && reuse_allocator_->GetAllocated() == 0) {
@@ -104,15 +97,11 @@
     return;
   }
 
-  TRACK_MEMORY_SCOPE("Media");
-
   ScopedLock scoped_lock(mutex_);
   EnsureReuseAllocatorIsCreated();
 }
 
 void* DecoderBufferAllocator::Allocate(size_t size, size_t alignment) {
-  TRACK_MEMORY_SCOPE("Media");
-
   if (!using_memory_pool_) {
     sbmemory_bytes_used_.fetch_add(size);
     auto p = SbMemoryAllocateAligned(alignment, size);
@@ -133,8 +122,6 @@
 }
 
 void DecoderBufferAllocator::Free(void* p, size_t size) {
-  TRACK_MEMORY_SCOPE("Media");
-
   if (p == nullptr) {
     DCHECK_EQ(size, 0);
     return;
@@ -237,7 +224,7 @@
     return;
   }
 
-  reuse_allocator_.reset(new nb::BidirectionalFitReuseAllocator(
+  reuse_allocator_.reset(new BidirectionalFitReuseAllocator(
       &fallback_allocator_, initial_capacity_, kSmallAllocationThreshold,
       allocation_unit_, 0));
   DLOG(INFO) << "Allocated " << initial_capacity_
diff --git a/cobalt/media/decoder_buffer_allocator.h b/cobalt/media/decoder_buffer_allocator.h
index b324064..68ba5de 100644
--- a/cobalt/media/decoder_buffer_allocator.h
+++ b/cobalt/media/decoder_buffer_allocator.h
@@ -18,9 +18,9 @@
 #include <memory>
 
 #include "base/compiler_specific.h"
+#include "cobalt/media/bidirectional_fit_reuse_allocator.h"
 #include "cobalt/media/decoder_buffer_memory_info.h"
-#include "nb/bidirectional_fit_reuse_allocator.h"
-#include "nb/starboard_memory_allocator.h"
+#include "cobalt/media/starboard_memory_allocator.h"
 #include "starboard/common/atomic.h"
 #include "starboard/common/mutex.h"
 #include "starboard/media.h"
@@ -68,8 +68,8 @@
   const int allocation_unit_;
 
   starboard::Mutex mutex_;
-  nb::StarboardMemoryAllocator fallback_allocator_;
-  std::unique_ptr<nb::BidirectionalFitReuseAllocator> reuse_allocator_;
+  StarboardMemoryAllocator fallback_allocator_;
+  std::unique_ptr<BidirectionalFitReuseAllocator> reuse_allocator_;
 
   int max_buffer_capacity_ = 0;
 
diff --git a/cobalt/media/file_data_source_test.cc b/cobalt/media/file_data_source_test.cc
index 4fe7fe7..34989f8 100644
--- a/cobalt/media/file_data_source_test.cc
+++ b/cobalt/media/file_data_source_test.cc
@@ -31,6 +31,9 @@
 }
 
 TEST(FileDataSourceTest, SunnyDay) {
+  // TODO(b/292134341): Test fails on all platforms.
+  GTEST_SKIP();
+
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   FileDataSource data_source(
       GURL("file:///cobalt/media/testing/data/"
diff --git a/cobalt/media/media_module.cc b/cobalt/media/media_module.cc
index a952d2b..06e7e26 100644
--- a/cobalt/media/media_module.cc
+++ b/cobalt/media/media_module.cc
@@ -25,7 +25,6 @@
 #include "base/strings/string_split.h"
 #include "base/synchronization/waitable_event.h"
 #include "cobalt/media/base/format_support_query_metrics.h"
-#include "nb/memory_scope.h"
 #include "starboard/common/string.h"
 #include "starboard/media.h"
 #include "starboard/window.h"
@@ -218,7 +217,6 @@
 
 std::unique_ptr<WebMediaPlayer> MediaModule::CreateWebMediaPlayer(
     WebMediaPlayerClient* client) {
-  TRACK_MEMORY_SCOPE("Media");
   SbWindow window = kSbWindowInvalid;
   if (system_window_) {
     window = system_window_->GetSbWindow();
diff --git a/cobalt/media/progressive/mp4_parser.cc b/cobalt/media/progressive/mp4_parser.cc
index 123a0b1..70ceafd 100644
--- a/cobalt/media/progressive/mp4_parser.cc
+++ b/cobalt/media/progressive/mp4_parser.cc
@@ -15,6 +15,7 @@
 #include "cobalt/media/progressive/mp4_parser.h"
 
 #include <inttypes.h>
+
 #include <limits>
 #include <vector>
 
diff --git a/cobalt/media/progressive/rbsp_stream_unittest.cc b/cobalt/media/progressive/rbsp_stream_unittest.cc
index 0bcf519..89d1df5 100644
--- a/cobalt/media/progressive/rbsp_stream_unittest.cc
+++ b/cobalt/media/progressive/rbsp_stream_unittest.cc
@@ -16,6 +16,7 @@
 
 #include <list>
 #include <memory>
+#include <utility>
 
 #include "base/logging.h"
 #include "base/strings/stringprintf.h"
@@ -36,9 +37,9 @@
     bool is_negative = (num < 0);
     uint32 unum = 0;
     if (is_negative) {
-      unum = (uint32)(num * -1);
+      unum = static_cast<uint32>(num * -1);
     } else {
-      unum = (uint32)num;
+      unum = static_cast<uint32>(num);
     }
     // multiply unsigned value by 2
     unum = unum << 1;
diff --git a/cobalt/media/sandbox/BUILD.gn b/cobalt/media/sandbox/BUILD.gn
index 00f87a2..19be835 100644
--- a/cobalt/media/sandbox/BUILD.gn
+++ b/cobalt/media/sandbox/BUILD.gn
@@ -58,7 +58,7 @@
     "//url",
   ]
 
-  if (!sb_is_evergreen) {
+  if (!sb_is_modular) {
     deps += cobalt_platform_dependencies
   }
 }
diff --git a/cobalt/media/sandbox/media_sandbox.cc b/cobalt/media/sandbox/media_sandbox.cc
index bb2b09a..92673ed 100644
--- a/cobalt/media/sandbox/media_sandbox.cc
+++ b/cobalt/media/sandbox/media_sandbox.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/media/sandbox/media_sandbox.h"
 
+#include <memory>
+
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
diff --git a/cobalt/media/sandbox/media_source_demuxer.cc b/cobalt/media/sandbox/media_source_demuxer.cc
index f2c4013..7e5edfb 100644
--- a/cobalt/media/sandbox/media_source_demuxer.cc
+++ b/cobalt/media/sandbox/media_source_demuxer.cc
@@ -38,9 +38,9 @@
 
 using base::Bind;
 using ::media::BindToCurrentLoop;
+using ::media::ChunkDemuxer;
 using ::media::DecoderBuffer;
 using ::media::DemuxerStream;
-using ::media::ChunkDemuxer;
 
 typedef base::Callback<void(::media::DecoderBuffer*)> AppendBufferCB;
 
@@ -109,16 +109,12 @@
   const ::media::VideoDecoderConfig& config() const { return config_; }
 
  private:
-  void SetTotalBytes(int64 total_bytes) override {
-  }
-  void AddBufferedByteRange(int64 start, int64 end) override {
-  }
+  void SetTotalBytes(int64 total_bytes) override {}
+  void AddBufferedByteRange(int64 start, int64 end) override {}
   void AddBufferedTimeRange(base::TimeDelta start,
-                            base::TimeDelta end) override {
-  }
+                            base::TimeDelta end) override {}
 
-  void SetDuration(base::TimeDelta duration) override {
-  }
+  void SetDuration(base::TimeDelta duration) override {}
   void OnDemuxerError(::media::PipelineStatus error) override {
     valid_ = false;
   }
diff --git a/cobalt/media/sandbox/web_media_player_sandbox.cc b/cobalt/media/sandbox/web_media_player_sandbox.cc
index 1c9f4c6..cfa4a28 100644
--- a/cobalt/media/sandbox/web_media_player_sandbox.cc
+++ b/cobalt/media/sandbox/web_media_player_sandbox.cc
@@ -415,6 +415,8 @@
       break;
     }
 
-    default: { break; }
+    default: {
+      break;
+    }
   }
 }
diff --git a/nb/starboard_memory_allocator.h b/cobalt/media/starboard_memory_allocator.h
similarity index 84%
rename from nb/starboard_memory_allocator.h
rename to cobalt/media/starboard_memory_allocator.h
index 44d9ed3..bda99a2 100644
--- a/nb/starboard_memory_allocator.h
+++ b/cobalt/media/starboard_memory_allocator.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef NB_STARBOARD_MEMORY_ALLOCATOR_H_
-#define NB_STARBOARD_MEMORY_ALLOCATOR_H_
+#ifndef COBALT_MEDIA_STARBOARD_MEMORY_ALLOCATOR_H_
+#define COBALT_MEDIA_STARBOARD_MEMORY_ALLOCATOR_H_
 
 #include <algorithm>
 
@@ -21,12 +21,13 @@
 #include "starboard/configuration.h"
 #include "starboard/memory.h"
 
-namespace nb {
+namespace cobalt {
+namespace media {
 
 // StarboardMemoryAllocator is an allocator that allocates and frees memory
 // using SbMemoryAllocateAligned() and SbMemoryDeallocate() in
 // starboard/memory.h.
-class StarboardMemoryAllocator : public Allocator {
+class StarboardMemoryAllocator : public nb::Allocator {
  public:
   void* Allocate(std::size_t size) override { return Allocate(size, 1); }
 
@@ -50,6 +51,7 @@
   void PrintAllocations() const override {}
 };
 
-}  // namespace nb
+}  // namespace media
+}  // namespace cobalt
 
-#endif  // NB_STARBOARD_MEMORY_ALLOCATOR_H_
+#endif  // COBALT_MEDIA_STARBOARD_MEMORY_ALLOCATOR_H_
diff --git a/cobalt/media_capture/media_recorder.idl b/cobalt/media_capture/media_recorder.idl
index e850ff7..7a8972b 100644
--- a/cobalt/media_capture/media_recorder.idl
+++ b/cobalt/media_capture/media_recorder.idl
@@ -32,4 +32,3 @@
 
   static boolean isTypeSupported(DOMString type);
 };
-
diff --git a/cobalt/media_capture/media_recorder_options.idl b/cobalt/media_capture/media_recorder_options.idl
index 913e5b8..8391bbe 100644
--- a/cobalt/media_capture/media_recorder_options.idl
+++ b/cobalt/media_capture/media_recorder_options.idl
@@ -16,4 +16,3 @@
 dictionary MediaRecorderOptions {
   DOMString mimeType;
 };
-
diff --git a/cobalt/media_capture/media_recorder_test.cc b/cobalt/media_capture/media_recorder_test.cc
index 92760e1..9c7fa1a 100644
--- a/cobalt/media_capture/media_recorder_test.cc
+++ b/cobalt/media_capture/media_recorder_test.cc
@@ -29,10 +29,10 @@
 #include "cobalt/web/testing/mock_event_listener.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using cobalt::web::EventListener;
-using cobalt::web::testing::MockEventListener;
 using cobalt::script::testing::FakeScriptValue;
 using cobalt::script::testing::MockExceptionState;
+using cobalt::web::EventListener;
+using cobalt::web::testing::MockEventListener;
 using ::testing::_;
 using ::testing::Eq;
 using ::testing::Pointee;
diff --git a/cobalt/media_capture/navigator.idl b/cobalt/media_capture/navigator.idl
index 036bea7..8fd7b84 100644
--- a/cobalt/media_capture/navigator.idl
+++ b/cobalt/media_capture/navigator.idl
@@ -14,4 +14,4 @@
 
 partial interface Navigator {
   readonly attribute MediaDevices mediaDevices;
-};
\ No newline at end of file
+};
diff --git a/cobalt/media_capture/recording_state.idl b/cobalt/media_capture/recording_state.idl
index 96db55a..9878e97 100644
--- a/cobalt/media_capture/recording_state.idl
+++ b/cobalt/media_capture/recording_state.idl
@@ -20,4 +20,3 @@
   "recording",
   "paused"
 };
-
diff --git a/cobalt/media_integration_tests/endurance/endurance_test.py b/cobalt/media_integration_tests/endurance/endurance_test.py
index a5492b98d..4d84ec7 100644
--- a/cobalt/media_integration_tests/endurance/endurance_test.py
+++ b/cobalt/media_integration_tests/endurance/endurance_test.py
@@ -98,15 +98,15 @@
       self.last_media_time_update_time = current_running_time
 
     # Update written audio timestamp.
-    if (self.last_written_audio_timestamp !=
-        pipeline_state.last_written_audio_timestamp):
+    if (self.last_written_audio_timestamp
+        != pipeline_state.last_written_audio_timestamp):
       self.last_written_audio_timestamp = (
           pipeline_state.last_written_audio_timestamp)
       self.last_written_audio_update_time = current_running_time
 
     # Update written video timestamp.
-    if (self.last_written_video_timestamp !=
-        pipeline_state.last_written_video_timestamp):
+    if (self.last_written_video_timestamp
+        != pipeline_state.last_written_video_timestamp):
       self.last_written_video_timestamp = (
           pipeline_state.last_written_video_timestamp)
       self.last_written_video_update_time = current_running_time
@@ -192,8 +192,8 @@
         if not app.player_state_handler.IsPlayerPlaying():
           # TODO: identify network problem
           self.assertTrue(
-              current_running_time - self.last_state_check_time <
-              PLAYER_INITIALIZATION_WAITING_TIMEOUT,
+              current_running_time - self.last_state_check_time
+              < PLAYER_INITIALIZATION_WAITING_TIMEOUT,
               self.GenerateErrorString(
                   'Timed out waiting for player initialization (waited: '
                   f'{current_running_time - self.last_state_check_time}).'))
@@ -201,8 +201,8 @@
         self.last_state_check_time = current_running_time
         # Skip to next playback if it has been played for long time.
         if (self.playback_start_time != -1 and
-            current_running_time - self.playback_start_time >
-            SINGLE_PLAYBACK_WATCH_TIME_MAXIMUM):
+            current_running_time - self.playback_start_time
+            > SINGLE_PLAYBACK_WATCH_TIME_MAXIMUM):
           app.PlayNext()
           # Set start time to -1 here to avoid send same command in next loop.
           self.playback_start_time = -1
@@ -239,16 +239,16 @@
           if (self.audio_eos_written_time > 0 and
               self.video_eos_written_time > 0 and self.playback_end_time > 0):
             self.assertTrue(
-                current_running_time - self.playback_end_time <
-                PLAYBACK_END_WAITING_TIMEOUT,
+                current_running_time - self.playback_end_time
+                < PLAYBACK_END_WAITING_TIMEOUT,
                 self.GenerateErrorString(
                     'Timed out waiting for playback to end (waited: '
                     f'{current_running_time - self.playback_end_time}).'))
 
         # Send random actions.
         if (self.needs_random_action and
-            current_running_time - self.last_action_time >
-            self.random_action_interval):
+            current_running_time - self.last_action_time
+            > self.random_action_interval):
           self.SendRandomAction(app)
           self.last_action_time = current_running_time
 
diff --git a/cobalt/media_stream/audio_parameters_test.cc b/cobalt/media_stream/audio_parameters_test.cc
index fd6b7c9..e6e0baf 100644
--- a/cobalt/media_stream/audio_parameters_test.cc
+++ b/cobalt/media_stream/audio_parameters_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/media_stream/audio_parameters.h"
+
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/media_stream/media_stream_audio_deliverer.h b/cobalt/media_stream/media_stream_audio_deliverer.h
index b942bdd..ad6e9f1 100644
--- a/cobalt/media_stream/media_stream_audio_deliverer.h
+++ b/cobalt/media_stream/media_stream_audio_deliverer.h
@@ -26,7 +26,6 @@
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
-
 #include "cobalt/media/base/audio_bus.h"
 #include "cobalt/media_stream/audio_parameters.h"
 
@@ -118,7 +117,7 @@
     consumers_.clear();
   }
 
-// Deliver data to all consumers. This method may be called on any thread.
+  // Deliver data to all consumers. This method may be called on any thread.
 
   void OnData(const media::AudioBus& audio_bus,
               base::TimeTicks reference_time) {
diff --git a/cobalt/media_stream/media_stream_audio_sink.h b/cobalt/media_stream/media_stream_audio_sink.h
index 034dbec..af6c263 100644
--- a/cobalt/media_stream/media_stream_audio_sink.h
+++ b/cobalt/media_stream/media_stream_audio_sink.h
@@ -16,9 +16,7 @@
 #define COBALT_MEDIA_STREAM_MEDIA_STREAM_AUDIO_SINK_H_
 
 #include "cobalt/media/base/audio_bus.h"
-
 #include "cobalt/media_stream/audio_parameters.h"
-
 #include "cobalt/media_stream/media_stream_source.h"
 #include "cobalt/media_stream/media_stream_track.h"
 
@@ -38,8 +36,7 @@
                       base::TimeTicks reference_time) = 0;
   virtual void OnSetFormat(const media_stream::AudioParameters& params) = 0;
   virtual void OnReadyStateChanged(
-      media_stream::MediaStreamTrack::ReadyState new_state) {
-  }
+      media_stream::MediaStreamTrack::ReadyState new_state) {}
 
  private:
   MediaStreamAudioSink(const MediaStreamAudioSink&) = delete;
diff --git a/cobalt/media_stream/testing/mock_media_stream_audio_sink.h b/cobalt/media_stream/testing/mock_media_stream_audio_sink.h
index 7fa06b6..aa31283 100644
--- a/cobalt/media_stream/testing/mock_media_stream_audio_sink.h
+++ b/cobalt/media_stream/testing/mock_media_stream_audio_sink.h
@@ -16,7 +16,6 @@
 #define COBALT_MEDIA_STREAM_TESTING_MOCK_MEDIA_STREAM_AUDIO_SINK_H_
 
 #include "cobalt/media_stream/media_stream_audio_sink.h"
-
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace cobalt {
diff --git a/cobalt/media_stream/testing/mock_media_stream_audio_source.h b/cobalt/media_stream/testing/mock_media_stream_audio_source.h
index 26f1d79..8c0192b 100644
--- a/cobalt/media_stream/testing/mock_media_stream_audio_source.h
+++ b/cobalt/media_stream/testing/mock_media_stream_audio_source.h
@@ -16,7 +16,6 @@
 #define COBALT_MEDIA_STREAM_TESTING_MOCK_MEDIA_STREAM_AUDIO_SOURCE_H_
 
 #include "cobalt/media_stream/media_stream_audio_source.h"
-
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace cobalt {
diff --git a/cobalt/network/BUILD.gn b/cobalt/network/BUILD.gn
index adf0975..1a4fd75 100644
--- a/cobalt/network/BUILD.gn
+++ b/cobalt/network/BUILD.gn
@@ -80,7 +80,7 @@
     defines = [ "ENABLE_NETWORK_LOGGING" ]
   }
 
-  if (!sb_is_evergreen) {
+  if (!sb_is_modular) {
     deps += cobalt_platform_dependencies
   }
 }
diff --git a/cobalt/network/cookie_jar_impl.cc b/cobalt/network/cookie_jar_impl.cc
index f9a2d43..075c1a0 100644
--- a/cobalt/network/cookie_jar_impl.cc
+++ b/cobalt/network/cookie_jar_impl.cc
@@ -14,6 +14,8 @@
 
 #include "cobalt/network/cookie_jar_impl.h"
 
+#include <utility>
+
 #include "base/bind.h"
 #include "base/synchronization/waitable_event.h"
 
diff --git a/cobalt/network/net_log_constants.cc b/cobalt/network/net_log_constants.cc
index a012c4b..1b74e16 100644
--- a/cobalt/network/net_log_constants.cc
+++ b/cobalt/network/net_log_constants.cc
@@ -12,15 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/network/net_log_constants.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/basictypes.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "cobalt/version.h"
-#include "cobalt_build_id.h"  // NOLINT(build/include)
+#include "cobalt_build_id.h"  // NOLINT(build/include_subdir)
 #include "net/base/address_family.h"
 #include "net/base/load_states.h"
 #include "net/log/net_log.h"
@@ -31,7 +32,7 @@
 namespace {
 // Same log format as in M25.
 const int kLogFormatVersion = 1;
-}
+}  // namespace
 
 std::unique_ptr<base::DictionaryValue> NetLogConstants::GetConstants() {
   // This function is based on the implementation of
diff --git a/cobalt/network/net_poster.h b/cobalt/network/net_poster.h
index 6e55f24..cc615fd 100644
--- a/cobalt/network/net_poster.h
+++ b/cobalt/network/net_poster.h
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <string>
+#include <vector>
 
 #include "cobalt/network_bridge/net_poster.h"
 #include "net/url_request/url_fetcher.h"
diff --git a/cobalt/network/network_module.cc b/cobalt/network/network_module.cc
index 15e3dbd..8154b7c 100644
--- a/cobalt/network/network_module.cc
+++ b/cobalt/network/network_module.cc
@@ -98,11 +98,16 @@
                             custom_proxy_rules));
 }
 
-void NetworkModule::SetEnableQuic(bool enable_quic) {
-  task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&URLRequestContext::SetEnableQuic,
-                 base::Unretained(url_request_context_.get()), enable_quic));
+void NetworkModule::SetEnableQuicFromPersistentSettings() {
+  // Called on initialization and when the persistent setting is changed.
+  if (options_.persistent_settings != nullptr) {
+    bool enable_quic = options_.persistent_settings->GetPersistentSettingAsBool(
+        kQuicEnabledPersistentSettingsKey, false);
+    task_runner()->PostTask(
+        FROM_HERE,
+        base::Bind(&URLRequestContext::SetEnableQuic,
+                   base::Unretained(url_request_context_.get()), enable_quic));
+  }
 }
 
 void NetworkModule::SetEnableClientHintHeadersFlagsFromPersistentSettings() {
@@ -114,6 +119,11 @@
   }
 }
 
+void NetworkModule::EnsureStorageManagerStarted() {
+  DCHECK(storage_manager_);
+  storage_manager_->EnsureStarted();
+}
+
 void NetworkModule::Initialize(const std::string& user_agent_string,
                                base::EventDispatcher* event_dispatcher) {
   storage_manager_.reset(
@@ -188,6 +198,8 @@
   DCHECK(url_request_context_);
   url_request_context_getter_ = new network::URLRequestContextGetter(
       url_request_context_.get(), thread_.get());
+
+  SetEnableQuicFromPersistentSettings();
 }
 
 void NetworkModule::OnCreate(base::WaitableEvent* creation_event) {
diff --git a/cobalt/network/network_module.h b/cobalt/network/network_module.h
index 69f226d..b6c8bd2 100644
--- a/cobalt/network/network_module.h
+++ b/cobalt/network/network_module.h
@@ -59,6 +59,8 @@
   kCallTypeXHR = (1u << 5),
 };
 
+const char kQuicEnabledPersistentSettingsKey[] = "QUICEnabled";
+
 // Holds bit mask flag, read into |enable_client_hint_headers_flags_|.
 const char kClientHintHeadersEnabledPersistentSettingsKey[] =
     "clientHintHeadersEnabled";
@@ -98,6 +100,9 @@
                 const Options& options = Options());
   ~NetworkModule();
 
+  // Ensures that the storage manager is created.
+  void EnsureStorageManagerStarted();
+
   URLRequestContext* url_request_context() const {
     return url_request_context_.get();
   }
@@ -125,7 +130,7 @@
 #endif
   void SetProxy(const std::string& custom_proxy_rules);
 
-  void SetEnableQuic(bool enable_quic);
+  void SetEnableQuicFromPersistentSettings();
 
   // Checks persistent settings to determine if Client Hint Headers are enabled.
   void SetEnableClientHintHeadersFlagsFromPersistentSettings();
diff --git a/cobalt/network/starboard/network_system.cc b/cobalt/network/starboard/network_system.cc
index a4ac78a..cdd32a1 100644
--- a/cobalt/network/starboard/network_system.cc
+++ b/cobalt/network/starboard/network_system.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/network/network_system.h"
 
+#include <memory>
+
 namespace cobalt {
 namespace network {
 
diff --git a/cobalt/network_bridge/net_poster.h b/cobalt/network_bridge/net_poster.h
index c09a9c7..cbccc5e 100644
--- a/cobalt/network_bridge/net_poster.h
+++ b/cobalt/network_bridge/net_poster.h
@@ -41,7 +41,8 @@
 };
 
 typedef base::Callback<void(const GURL& url, const std::string& content_type,
-                            const std::string& data)> PostSender;
+                            const std::string& data)>
+    PostSender;
 
 }  // namespace network_bridge
 }  // namespace cobalt
diff --git a/cobalt/overlay_info/qr_code_overlay.cc b/cobalt/overlay_info/qr_code_overlay.cc
index 2e7e1ff..c3a4901 100644
--- a/cobalt/overlay_info/qr_code_overlay.cc
+++ b/cobalt/overlay_info/qr_code_overlay.cc
@@ -16,6 +16,7 @@
 
 #include <algorithm>
 #include <string>
+#include <utility>
 
 #include "base/compiler_specific.h"
 #include "base/logging.h"
diff --git a/cobalt/persistent_storage/persistent_settings.cc b/cobalt/persistent_storage/persistent_settings.cc
index ce64f97..52bc864 100644
--- a/cobalt/persistent_storage/persistent_settings.cc
+++ b/cobalt/persistent_storage/persistent_settings.cc
@@ -19,7 +19,6 @@
 
 #include "base/bind.h"
 #include "components/prefs/json_pref_store.h"
-#include "components/prefs/json_read_only_pref_store.h"
 #include "starboard/common/file.h"
 #include "starboard/common/log.h"
 #include "starboard/configuration_constants.h"
@@ -51,37 +50,23 @@
       std::string(storage_dir.data()) + kSbFileSepString + file_name;
   LOG(INFO) << "Persistent settings file path: " << persistent_settings_file_;
 
-  // Initialize pref_store_ with a JSONReadOnlyPrefStore, Used for
-  // synchronous PersistentSettings::Get calls made before the asynchronous
-  // InitializeWriteablePrefStore initializes pref_store_ with a writable
-  // instance.
-  {
-    base::AutoLock auto_lock(pref_store_lock_);
-    pref_store_ = base::MakeRefCounted<JsonReadOnlyPrefStore>(
-        base::FilePath(persistent_settings_file_));
-    pref_store_->ReadPrefs();
-  }
-
   message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&PersistentSettings::InitializeWriteablePrefStore,
+      FROM_HERE, base::Bind(&PersistentSettings::InitializePrefStore,
                             base::Unretained(this)));
+  pref_store_initialized_.Wait();
+  destruction_observer_added_.Wait();
 }
 
 PersistentSettings::~PersistentSettings() {
   DCHECK(message_loop());
   DCHECK(thread_.IsRunning());
 
-  // Ensure that the destruction observer got added and the pref store was
-  // initialized before stopping the thread. Stop the thread. This will cause
-  // the destruction observer to be notified.
-  writeable_pref_store_initialized_.Wait();
-  destruction_observer_added_.Wait();
   // Wait for all previously posted tasks to finish.
   thread_.message_loop()->task_runner()->WaitForFence();
   thread_.Stop();
 }
 
-void PersistentSettings::InitializeWriteablePrefStore() {
+void PersistentSettings::InitializePrefStore() {
   DCHECK_EQ(base::MessageLoop::current(), message_loop());
   // Register as a destruction observer to shut down the thread once all
   // pending tasks have been executed and the message loop is about to be
@@ -94,9 +79,7 @@
     pref_store_ = base::MakeRefCounted<JsonPrefStore>(
         base::FilePath(persistent_settings_file_));
     pref_store_->ReadPrefs();
-    // PersistentSettings Set and Remove Helper methods will now be able to
-    // access the pref_store_ initialized from the dedicated thread_.
-    writeable_pref_store_initialized_.Signal();
+    pref_store_initialized_.Signal();
   }
   validated_initial_settings_ = GetPersistentSettingAsBool(kValidated, false);
   if (!validated_initial_settings_) {
@@ -116,10 +99,9 @@
   DCHECK_EQ(base::MessageLoop::current(), message_loop());
   if (!validated_initial_settings_) {
     base::AutoLock auto_lock(pref_store_lock_);
-    writeable_pref_store()->SetValue(
-        kValidated, std::make_unique<base::Value>(true),
-        WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
-    writeable_pref_store()->CommitPendingWrite();
+    pref_store_->SetValue(kValidated, std::make_unique<base::Value>(true),
+                          WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
+    CommitPendingWrite(false);
     validated_initial_settings_ = true;
   }
 }
@@ -190,7 +172,7 @@
 
 void PersistentSettings::SetPersistentSetting(
     const std::string& key, std::unique_ptr<base::Value> value,
-    base::OnceClosure closure) {
+    base::OnceClosure closure, bool blocking) {
   if (key == kValidated) {
     LOG(ERROR) << "Cannot set protected persistent setting: " << key;
     return;
@@ -198,21 +180,20 @@
   message_loop()->task_runner()->PostTask(
       FROM_HERE, base::BindOnce(&PersistentSettings::SetPersistentSettingHelper,
                                 base::Unretained(this), key, std::move(value),
-                                std::move(closure)));
+                                std::move(closure), blocking));
 }
 
 void PersistentSettings::SetPersistentSettingHelper(
     const std::string& key, std::unique_ptr<base::Value> value,
-    base::OnceClosure closure) {
+    base::OnceClosure closure, bool blocking) {
   DCHECK_EQ(base::MessageLoop::current(), message_loop());
   if (validated_initial_settings_) {
     base::AutoLock auto_lock(pref_store_lock_);
-    writeable_pref_store()->SetValue(
-        kValidated, std::make_unique<base::Value>(false),
-        WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
-    writeable_pref_store()->SetValue(
-        key, std::move(value), WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
-    writeable_pref_store()->CommitPendingWrite();
+    pref_store_->SetValue(kValidated, std::make_unique<base::Value>(false),
+                          WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
+    pref_store_->SetValue(key, std::move(value),
+                          WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
+    CommitPendingWrite(blocking);
   } else {
     LOG(ERROR) << "Cannot set persistent setting while unvalidated: " << key;
   }
@@ -220,24 +201,24 @@
 }
 
 void PersistentSettings::RemovePersistentSetting(const std::string& key,
-                                                 base::OnceClosure closure) {
+                                                 base::OnceClosure closure,
+                                                 bool blocking) {
   message_loop()->task_runner()->PostTask(
       FROM_HERE,
       base::BindOnce(&PersistentSettings::RemovePersistentSettingHelper,
-                     base::Unretained(this), key, std::move(closure)));
+                     base::Unretained(this), key, std::move(closure),
+                     blocking));
 }
 
 void PersistentSettings::RemovePersistentSettingHelper(
-    const std::string& key, base::OnceClosure closure) {
+    const std::string& key, base::OnceClosure closure, bool blocking) {
   DCHECK_EQ(base::MessageLoop::current(), message_loop());
   if (validated_initial_settings_) {
     base::AutoLock auto_lock(pref_store_lock_);
-    writeable_pref_store()->SetValue(
-        kValidated, std::make_unique<base::Value>(false),
-        WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
-    writeable_pref_store()->RemoveValue(
-        key, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
-    writeable_pref_store()->CommitPendingWrite();
+    pref_store_->SetValue(kValidated, std::make_unique<base::Value>(false),
+                          WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
+    pref_store_->RemoveValue(key, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
+    CommitPendingWrite(blocking);
   } else {
     LOG(ERROR) << "Cannot remove persistent setting while unvalidated: " << key;
   }
@@ -257,12 +238,24 @@
   if (validated_initial_settings_) {
     starboard::SbFileDeleteRecursive(persistent_settings_file_.c_str(), true);
     base::AutoLock auto_lock(pref_store_lock_);
-    writeable_pref_store()->ReadPrefs();
+    pref_store_->ReadPrefs();
   } else {
     LOG(ERROR) << "Cannot delete persistent setting while unvalidated.";
   }
   std::move(closure).Run();
 }
 
+void PersistentSettings::CommitPendingWrite(bool blocking) {
+  if (blocking) {
+    base::WaitableEvent written;
+    pref_store_->CommitPendingWrite(
+        base::OnceClosure(),
+        base::BindOnce(&base::WaitableEvent::Signal, Unretained(&written)));
+    written.Wait();
+  } else {
+    pref_store_->CommitPendingWrite();
+  }
+}
+
 }  // namespace persistent_storage
 }  // namespace cobalt
diff --git a/cobalt/persistent_storage/persistent_settings.h b/cobalt/persistent_storage/persistent_settings.h
index 0cf789f..6c2c157 100644
--- a/cobalt/persistent_storage/persistent_settings.h
+++ b/cobalt/persistent_storage/persistent_settings.h
@@ -71,35 +71,34 @@
 
   void SetPersistentSetting(
       const std::string& key, std::unique_ptr<base::Value> value,
-      base::OnceClosure closure = std::move(base::DoNothing()));
+      base::OnceClosure closure = std::move(base::DoNothing()),
+      bool blocking = false);
 
   void RemovePersistentSetting(
       const std::string& key,
-      base::OnceClosure closure = std::move(base::DoNothing()));
+      base::OnceClosure closure = std::move(base::DoNothing()),
+      bool blocking = false);
 
   void DeletePersistentSettings(
       base::OnceClosure closure = std::move(base::DoNothing()));
 
  private:
   // Called by the constructor to initialize pref_store_ from
-  // the dedicated thread_ as a writeable JSONPrefStore.
-  void InitializeWriteablePrefStore();
+  // the dedicated thread_ as a JSONPrefStore.
+  void InitializePrefStore();
 
   void ValidatePersistentSettingsHelper();
 
   void SetPersistentSettingHelper(const std::string& key,
                                   std::unique_ptr<base::Value> value,
-                                  base::OnceClosure closure);
+                                  base::OnceClosure closure, bool blocking);
 
   void RemovePersistentSettingHelper(const std::string& key,
-                                     base::OnceClosure closure);
+                                     base::OnceClosure closure, bool blocking);
 
   void DeletePersistentSettingsHelper(base::OnceClosure closure);
 
-  scoped_refptr<PersistentPrefStore> writeable_pref_store() {
-    writeable_pref_store_initialized_.Wait();
-    return pref_store_;
-  }
+  void CommitPendingWrite(bool blocking);
 
   // Persistent settings file path.
   std::string persistent_settings_file_;
@@ -117,7 +116,7 @@
 
   // This event is used to signal when Initialize has been called and
   // pref_store_ mutations can now occur.
-  base::WaitableEvent writeable_pref_store_initialized_ = {
+  base::WaitableEvent pref_store_initialized_ = {
       base::WaitableEvent::ResetPolicy::MANUAL,
       base::WaitableEvent::InitialState::NOT_SIGNALED};
 
diff --git a/cobalt/persistent_storage/persistent_settings_test.cc b/cobalt/persistent_storage/persistent_settings_test.cc
index 3f88397..91b2bce 100644
--- a/cobalt/persistent_storage/persistent_settings_test.cc
+++ b/cobalt/persistent_storage/persistent_settings_test.cc
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/persistent_storage/persistent_settings.h"
+
 #include <utility>
 #include <vector>
 
@@ -20,9 +22,7 @@
 #include "base/callback_forward.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/test/scoped_task_environment.h"
-#include "base/threading/platform_thread.h"
 #include "base/values.h"
-#include "cobalt/persistent_storage/persistent_settings.h"
 #include "starboard/common/file.h"
 #include "starboard/common/log.h"
 #include "starboard/configuration_constants.h"
@@ -81,13 +81,13 @@
   base::OnceClosure closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsInt("key", true));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(4.2), std::move(closure));
+      "key", std::make_unique<base::Value>(4.2), std::move(closure), true);
   test_done_.Wait();
 }
 
@@ -99,32 +99,32 @@
   base::OnceClosure closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsBool("key", true));
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsBool("key", false));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
 
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(true), std::move(closure));
+      "key", std::make_unique<base::Value>(true), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
   closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_FALSE(
+        EXPECT_FALSE(
             persistent_settings->GetPersistentSettingAsBool("key", true));
-        ASSERT_FALSE(
+        EXPECT_FALSE(
             persistent_settings->GetPersistentSettingAsBool("key", false));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
 
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(false), std::move(closure));
+      "key", std::make_unique<base::Value>(false), std::move(closure), true);
 
   test_done_.Wait();
 }
@@ -143,13 +143,13 @@
   base::OnceClosure closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_EQ(8, persistent_settings->GetPersistentSettingAsInt("key", 8));
+        EXPECT_EQ(8, persistent_settings->GetPersistentSettingAsInt("key", 8));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
 
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(4.2), std::move(closure));
+      "key", std::make_unique<base::Value>(4.2), std::move(closure), true);
   test_done_.Wait();
 }
 
@@ -161,36 +161,36 @@
   base::OnceClosure closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_EQ(-1, persistent_settings->GetPersistentSettingAsInt("key", 8));
+        EXPECT_EQ(-1, persistent_settings->GetPersistentSettingAsInt("key", 8));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(-1), std::move(closure));
+      "key", std::make_unique<base::Value>(-1), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
   closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_EQ(0, persistent_settings->GetPersistentSettingAsInt("key", 8));
+        EXPECT_EQ(0, persistent_settings->GetPersistentSettingAsInt("key", 8));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(0), std::move(closure));
+      "key", std::make_unique<base::Value>(0), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
   closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_EQ(42, persistent_settings->GetPersistentSettingAsInt("key", 8));
+        EXPECT_EQ(42, persistent_settings->GetPersistentSettingAsInt("key", 8));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(42), std::move(closure));
+      "key", std::make_unique<base::Value>(42), std::move(closure), true);
   test_done_.Wait();
 }
 
@@ -214,13 +214,13 @@
   base::OnceClosure closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_EQ("hello", persistent_settings->GetPersistentSettingAsString(
+        EXPECT_EQ("hello", persistent_settings->GetPersistentSettingAsString(
                                "key", "hello"));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(4.2), std::move(closure));
+      "key", std::make_unique<base::Value>(4.2), std::move(closure), true);
   test_done_.Wait();
 }
 
@@ -232,21 +232,21 @@
   base::OnceClosure closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_EQ("", persistent_settings->GetPersistentSettingAsString(
+        EXPECT_EQ("", persistent_settings->GetPersistentSettingAsString(
                           "key", "hello"));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
 
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(""), std::move(closure));
+      "key", std::make_unique<base::Value>(""), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
   closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_EQ(
+        EXPECT_EQ(
             "hello there",
             persistent_settings->GetPersistentSettingAsString("key", "hello"));
         test_done->Signal();
@@ -254,46 +254,47 @@
       persistent_settings.get(), &test_done_);
 
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>("hello there"), std::move(closure));
+      "key", std::make_unique<base::Value>("hello there"), std::move(closure),
+      true);
   test_done_.Wait();
   test_done_.Reset();
 
   closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_EQ("42", persistent_settings->GetPersistentSettingAsString(
+        EXPECT_EQ("42", persistent_settings->GetPersistentSettingAsString(
                             "key", "hello"));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>("42"), std::move(closure));
+      "key", std::make_unique<base::Value>("42"), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
   closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_EQ("\n", persistent_settings->GetPersistentSettingAsString(
+        EXPECT_EQ("\n", persistent_settings->GetPersistentSettingAsString(
                             "key", "hello"));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>("\n"), std::move(closure));
+      "key", std::make_unique<base::Value>("\n"), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
   closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_EQ("\\n", persistent_settings->GetPersistentSettingAsString(
+        EXPECT_EQ("\\n", persistent_settings->GetPersistentSettingAsString(
                              "key", "hello"));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>("\\n"), std::move(closure));
+      "key", std::make_unique<base::Value>("\\n"), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 }
@@ -307,10 +308,10 @@
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
         auto test_list = persistent_settings->GetPersistentSettingAsList("key");
-        ASSERT_FALSE(test_list.empty());
-        ASSERT_EQ(1, test_list.size());
-        ASSERT_TRUE(test_list[0].is_string());
-        ASSERT_EQ("hello", test_list[0].GetString());
+        EXPECT_FALSE(test_list.empty());
+        EXPECT_EQ(1, test_list.size());
+        EXPECT_TRUE(test_list[0].is_string());
+        EXPECT_EQ("hello", test_list[0].GetString());
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
@@ -318,7 +319,7 @@
   std::vector<base::Value> list;
   list.emplace_back("hello");
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(list), std::move(closure));
+      "key", std::make_unique<base::Value>(list), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
@@ -326,19 +327,19 @@
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
         auto test_list = persistent_settings->GetPersistentSettingAsList("key");
-        ASSERT_FALSE(test_list.empty());
-        ASSERT_EQ(2, test_list.size());
-        ASSERT_TRUE(test_list[0].is_string());
-        ASSERT_EQ("hello", test_list[0].GetString());
-        ASSERT_TRUE(test_list[1].is_string());
-        ASSERT_EQ("there", test_list[1].GetString());
+        EXPECT_FALSE(test_list.empty());
+        EXPECT_EQ(2, test_list.size());
+        EXPECT_TRUE(test_list[0].is_string());
+        EXPECT_EQ("hello", test_list[0].GetString());
+        EXPECT_TRUE(test_list[1].is_string());
+        EXPECT_EQ("there", test_list[1].GetString());
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
 
   list.emplace_back("there");
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(list), std::move(closure));
+      "key", std::make_unique<base::Value>(list), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
@@ -346,21 +347,21 @@
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
         auto test_list = persistent_settings->GetPersistentSettingAsList("key");
-        ASSERT_FALSE(test_list.empty());
-        ASSERT_EQ(3, test_list.size());
-        ASSERT_TRUE(test_list[0].is_string());
-        ASSERT_EQ("hello", test_list[0].GetString());
-        ASSERT_TRUE(test_list[1].is_string());
-        ASSERT_EQ("there", test_list[1].GetString());
-        ASSERT_TRUE(test_list[2].is_int());
-        ASSERT_EQ(42, test_list[2].GetInt());
+        EXPECT_FALSE(test_list.empty());
+        EXPECT_EQ(3, test_list.size());
+        EXPECT_TRUE(test_list[0].is_string());
+        EXPECT_EQ("hello", test_list[0].GetString());
+        EXPECT_TRUE(test_list[1].is_string());
+        EXPECT_EQ("there", test_list[1].GetString());
+        EXPECT_TRUE(test_list[2].is_int());
+        EXPECT_EQ(42, test_list[2].GetInt());
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
 
   list.emplace_back(42);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(list), std::move(closure));
+      "key", std::make_unique<base::Value>(list), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 }
@@ -375,10 +376,10 @@
          base::WaitableEvent* test_done) {
         auto test_dict =
             persistent_settings->GetPersistentSettingAsDictionary("key");
-        ASSERT_FALSE(test_dict.empty());
-        ASSERT_EQ(1, test_dict.size());
-        ASSERT_TRUE(test_dict["key_string"]->is_string());
-        ASSERT_EQ("hello", test_dict["key_string"]->GetString());
+        EXPECT_FALSE(test_dict.empty());
+        EXPECT_EQ(1, test_dict.size());
+        EXPECT_TRUE(test_dict["key_string"]->is_string());
+        EXPECT_EQ("hello", test_dict["key_string"]->GetString());
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
@@ -386,7 +387,7 @@
   base::flat_map<std::string, std::unique_ptr<base::Value>> dict;
   dict.try_emplace("key_string", std::make_unique<base::Value>("hello"));
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(dict), std::move(closure));
+      "key", std::make_unique<base::Value>(dict), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
@@ -395,19 +396,19 @@
          base::WaitableEvent* test_done) {
         auto test_dict =
             persistent_settings->GetPersistentSettingAsDictionary("key");
-        ASSERT_FALSE(test_dict.empty());
-        ASSERT_EQ(2, test_dict.size());
-        ASSERT_TRUE(test_dict["key_string"]->is_string());
-        ASSERT_EQ("hello", test_dict["key_string"]->GetString());
-        ASSERT_TRUE(test_dict["key_int"]->is_int());
-        ASSERT_EQ(42, test_dict["key_int"]->GetInt());
+        EXPECT_FALSE(test_dict.empty());
+        EXPECT_EQ(2, test_dict.size());
+        EXPECT_TRUE(test_dict["key_string"]->is_string());
+        EXPECT_EQ("hello", test_dict["key_string"]->GetString());
+        EXPECT_TRUE(test_dict["key_int"]->is_int());
+        EXPECT_EQ(42, test_dict["key_int"]->GetInt());
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
 
   dict.try_emplace("key_int", std::make_unique<base::Value>(42));
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(dict), std::move(closure));
+      "key", std::make_unique<base::Value>(dict), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 }
@@ -425,10 +426,10 @@
          base::WaitableEvent* test_done) {
         auto test_dict = persistent_settings->GetPersistentSettingAsDictionary(
             "http://127.0.0.1:45019/");
-        ASSERT_FALSE(test_dict.empty());
-        ASSERT_EQ(1, test_dict.size());
-        ASSERT_TRUE(test_dict["http://127.0.0.1:45019/"]->is_string());
-        ASSERT_EQ("Dictionary URL Key Works!",
+        EXPECT_FALSE(test_dict.empty());
+        EXPECT_EQ(1, test_dict.size());
+        EXPECT_TRUE(test_dict["http://127.0.0.1:45019/"]->is_string());
+        EXPECT_EQ("Dictionary URL Key Works!",
                   test_dict["http://127.0.0.1:45019/"]->GetString());
         test_done->Signal();
       },
@@ -441,7 +442,7 @@
                    std::make_unique<base::Value>("Dictionary URL Key Works!"));
   persistent_settings->SetPersistentSetting("http://127.0.0.1:45019/",
                                             std::make_unique<base::Value>(dict),
-                                            std::move(closure));
+                                            std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
@@ -450,12 +451,12 @@
          base::WaitableEvent* test_done) {
         auto test_dict = persistent_settings->GetPersistentSettingAsDictionary(
             "http://127.0.0.1:45019/");
-        ASSERT_TRUE(test_dict.empty());
+        EXPECT_TRUE(test_dict.empty());
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->RemovePersistentSetting("http://127.0.0.1:45019/",
-                                               std::move(closure));
+                                               std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 }
@@ -471,29 +472,29 @@
   base::OnceClosure closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsBool("key", true));
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsBool("key", false));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(true), std::move(closure));
+      "key", std::make_unique<base::Value>(true), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
   closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsBool("key", true));
-        ASSERT_FALSE(
+        EXPECT_FALSE(
             persistent_settings->GetPersistentSettingAsBool("key", false));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
-  persistent_settings->RemovePersistentSetting("key", std::move(closure));
+  persistent_settings->RemovePersistentSetting("key", std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 }
@@ -509,24 +510,24 @@
   base::OnceClosure closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsBool("key", true));
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsBool("key", false));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(true), std::move(closure));
+      "key", std::make_unique<base::Value>(true), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
   closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsBool("key", true));
-        ASSERT_FALSE(
+        EXPECT_FALSE(
             persistent_settings->GetPersistentSettingAsBool("key", false));
         test_done->Signal();
       },
@@ -547,22 +548,18 @@
   base::OnceClosure closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsBool("key", true));
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsBool("key", false));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(true), std::move(closure));
+      "key", std::make_unique<base::Value>(true), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
-  // Sleep for one second to allow for the previous persistent_setting's
-  // JsonPrefStore instance time to write to disk before creating a new
-  // persistent_settings and JsonPrefStore instance.
-  base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
   persistent_settings =
       std::make_unique<PersistentSettings>(kPersistentSettingsJson);
   ASSERT_TRUE(persistent_settings->GetPersistentSettingAsBool("key", true));
@@ -571,15 +568,15 @@
   closure = base::BindOnce(
       [](PersistentSettings* persistent_settings,
          base::WaitableEvent* test_done) {
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsBool("key", true));
-        ASSERT_TRUE(
+        EXPECT_TRUE(
             persistent_settings->GetPersistentSettingAsBool("key", false));
         test_done->Signal();
       },
       persistent_settings.get(), &test_done_);
   persistent_settings->SetPersistentSetting(
-      "key", std::make_unique<base::Value>(false), std::move(closure));
+      "key", std::make_unique<base::Value>(false), std::move(closure), true);
   test_done_.Wait();
   test_done_.Reset();
 
diff --git a/cobalt/render_tree/animations/animate_node.cc b/cobalt/render_tree/animations/animate_node.cc
index de2ae68..cad3bbc 100644
--- a/cobalt/render_tree/animations/animate_node.cc
+++ b/cobalt/render_tree/animations/animate_node.cc
@@ -15,6 +15,7 @@
 #include "cobalt/render_tree/animations/animate_node.h"
 
 #include <algorithm>
+#include <utility>
 
 #include "base/trace_event/trace_event.h"
 #include "cobalt/base/enable_if.h"
@@ -375,8 +376,7 @@
   return *(iterator_++);
 }
 
-void AnimateNode::BoundsVisitor::ApplyTransform(Node* node) {
-}
+void AnimateNode::BoundsVisitor::ApplyTransform(Node* node) {}
 
 void AnimateNode::BoundsVisitor::ApplyTransform(CompositionNode* node) {
   transform_ = transform_ * math::TranslateMatrix(node->data().offset().x(),
diff --git a/cobalt/render_tree/animations/animate_node_test.cc b/cobalt/render_tree/animations/animate_node_test.cc
index 79207f0..2d7f73d 100644
--- a/cobalt/render_tree/animations/animate_node_test.cc
+++ b/cobalt/render_tree/animations/animate_node_test.cc
@@ -12,15 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/render_tree/animations/animate_node.h"
+
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/compiler_specific.h"
 #include "cobalt/math/rect_f.h"
 #include "cobalt/math/size_f.h"
 #include "cobalt/math/transform_2d.h"
-#include "cobalt/render_tree/animations/animate_node.h"
 #include "cobalt/render_tree/brush.h"
 #include "cobalt/render_tree/color_rgba.h"
 #include "cobalt/render_tree/composition_node.h"
@@ -32,15 +34,14 @@
 #include "cobalt/render_tree/node_visitor.h"
 #include "cobalt/render_tree/rect_node.h"
 #include "cobalt/render_tree/text_node.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
 namespace render_tree {
 namespace animations {
 
-using ::cobalt::math::SizeF;
 using ::cobalt::math::RectF;
+using ::cobalt::math::SizeF;
 
 // Helper function to create an animation set for a render tree that consists
 // of only one animation targeting only one node in the render tree.
diff --git a/cobalt/render_tree/border.h b/cobalt/render_tree/border.h
index e24fec9..4e2dbc2 100644
--- a/cobalt/render_tree/border.h
+++ b/cobalt/render_tree/border.h
@@ -37,9 +37,7 @@
   bool operator==(const BorderSide& rhs) const {
     return style == rhs.style && color == rhs.color && width == rhs.width;
   }
-  bool operator!=(const BorderSide& rhs) const {
-    return !(*this == rhs);
-  }
+  bool operator!=(const BorderSide& rhs) const { return !(*this == rhs); }
 
   float width;
   BorderStyle style;
diff --git a/cobalt/render_tree/child_iterator.h b/cobalt/render_tree/child_iterator.h
index f0dc58f..7844ee2 100644
--- a/cobalt/render_tree/child_iterator.h
+++ b/cobalt/render_tree/child_iterator.h
@@ -162,8 +162,7 @@
   explicit ChildIterator(
       FilterNode* filter,
       ChildIteratorDirection direction = kChildIteratorDirectionForwards)
-      : filter_node_(filter), source_(filter->data().source.get()) {
-  }
+      : filter_node_(filter), source_(filter->data().source.get()) {}
 
   Node* GetCurrent() const { return source_; }
   void Next() { source_ = NULL; }
@@ -196,8 +195,7 @@
       MatrixTransform3DNode* matrix_transform_3d,
       ChildIteratorDirection direction = kChildIteratorDirectionForwards)
       : matrix_transform_3d_node_(matrix_transform_3d),
-        source_(matrix_transform_3d->data().source.get()) {
-  }
+        source_(matrix_transform_3d->data().source.get()) {}
 
   Node* GetCurrent() const { return source_; }
   void Next() { source_ = NULL; }
@@ -230,8 +228,7 @@
       MatrixTransformNode* matrix_transform,
       ChildIteratorDirection direction = kChildIteratorDirectionForwards)
       : matrix_transform_node_(matrix_transform),
-        source_(matrix_transform->data().source.get()) {
-  }
+        source_(matrix_transform->data().source.get()) {}
 
   Node* GetCurrent() const { return source_; }
   void Next() { source_ = NULL; }
diff --git a/cobalt/render_tree/clear_rect_node.h b/cobalt/render_tree/clear_rect_node.h
index 2b7ac36..9d93eb3 100644
--- a/cobalt/render_tree/clear_rect_node.h
+++ b/cobalt/render_tree/clear_rect_node.h
@@ -15,6 +15,8 @@
 #ifndef COBALT_RENDER_TREE_CLEAR_RECT_NODE_H_
 #define COBALT_RENDER_TREE_CLEAR_RECT_NODE_H_
 
+#include <utility>
+
 #include "base/compiler_specific.h"
 #include "cobalt/base/type_id.h"
 #include "cobalt/math/rect_f.h"
@@ -47,7 +49,8 @@
 
   // Forwarding constructor to the set of Builder constructors.
   template <typename... Us>
-  ClearRectNode(Us&&... args) : data_(std::forward<Us>(args)...) {}
+  ClearRectNode(Us&&... args)  // NOLINT(runtime/explicit)
+      : data_(std::forward<Us>(args)...) {}
 
   void Accept(NodeVisitor* visitor) override;
   math::RectF GetBounds() const override { return data_.rect; }
diff --git a/cobalt/render_tree/composition_node.h b/cobalt/render_tree/composition_node.h
index 4d71a8c..b02e5a5 100644
--- a/cobalt/render_tree/composition_node.h
+++ b/cobalt/render_tree/composition_node.h
@@ -16,6 +16,7 @@
 #define COBALT_RENDER_TREE_COMPOSITION_NODE_H_
 
 #include <algorithm>
+#include <utility>
 #include <vector>
 
 #include "base/compiler_specific.h"
diff --git a/cobalt/render_tree/filter_node.cc b/cobalt/render_tree/filter_node.cc
index 6ec57a3..14d284e 100644
--- a/cobalt/render_tree/filter_node.cc
+++ b/cobalt/render_tree/filter_node.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/render_tree/filter_node.h"
+
 #include "cobalt/render_tree/node_visitor.h"
 
 namespace cobalt {
diff --git a/cobalt/render_tree/filter_node.h b/cobalt/render_tree/filter_node.h
index b2914c7..72c6525 100644
--- a/cobalt/render_tree/filter_node.h
+++ b/cobalt/render_tree/filter_node.h
@@ -15,6 +15,8 @@
 #ifndef COBALT_RENDER_TREE_FILTER_NODE_H_
 #define COBALT_RENDER_TREE_FILTER_NODE_H_
 
+#include <utility>
+
 #include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/optional.h"
@@ -85,7 +87,8 @@
 
   // Forwarding constructor to the set of Builder constructors.
   template <typename... Args>
-  FilterNode(Args&&... args) : data_(std::forward<Args>(args)...) {
+  FilterNode(Args&&... args)  // NOLINT(runtime/explicit)
+      : data_(std::forward<Args>(args)...) {
     if (DCHECK_IS_ON()) {
       AssertValid();
     }
diff --git a/cobalt/render_tree/image_node.h b/cobalt/render_tree/image_node.h
index 169bbd3..59af989 100644
--- a/cobalt/render_tree/image_node.h
+++ b/cobalt/render_tree/image_node.h
@@ -15,6 +15,8 @@
 #ifndef COBALT_RENDER_TREE_IMAGE_NODE_H_
 #define COBALT_RENDER_TREE_IMAGE_NODE_H_
 
+#include <utility>
+
 #include "base/compiler_specific.h"
 #include "cobalt/base/type_id.h"
 #include "cobalt/math/matrix3_f.h"
@@ -53,7 +55,7 @@
              local_transform == other.local_transform;
     }
 
-    // A source of pixels. May be smaller or larger than layed out image.
+    // A source of pixels. May be smaller or larger than laid out image.
     // The class does not own the image, it merely refers it from a resource
     // pool.
     scoped_refptr<Image> source;
@@ -72,7 +74,8 @@
 
   // Forwarding constructor to the set of Builder constructors.
   template <typename... Args>
-  ImageNode(Args&&... args) : data_(std::forward<Args>(args)...) {}
+  ImageNode(Args&&... args)  // NOLINT(runtime/explicit)
+      : data_(std::forward<Args>(args)...) {}
 
   void Accept(NodeVisitor* visitor) override;
   math::RectF GetBounds() const override;
diff --git a/cobalt/render_tree/lottie_node.h b/cobalt/render_tree/lottie_node.h
index c7dc889..840558b 100644
--- a/cobalt/render_tree/lottie_node.h
+++ b/cobalt/render_tree/lottie_node.h
@@ -15,6 +15,8 @@
 #ifndef COBALT_RENDER_TREE_LOTTIE_NODE_H_
 #define COBALT_RENDER_TREE_LOTTIE_NODE_H_
 
+#include <utility>
+
 #include "base/compiler_specific.h"
 #include "cobalt/base/type_id.h"
 #include "cobalt/math/rect_f.h"
@@ -51,7 +53,8 @@
 
   // Forwarding constructor to the set of Builder constructors.
   template <typename... Args>
-  LottieNode(Args&&... args) : data_(std::forward<Args>(args)...) {}
+  LottieNode(Args&&... args)  // NOLINT(runtime/explicit)
+      : data_(std::forward<Args>(args)...) {}
 
   void Accept(NodeVisitor* visitor) override;
   math::RectF GetBounds() const override;
diff --git a/cobalt/render_tree/matrix_transform_3d_node.h b/cobalt/render_tree/matrix_transform_3d_node.h
index 607b5ea..0ba97b1 100644
--- a/cobalt/render_tree/matrix_transform_3d_node.h
+++ b/cobalt/render_tree/matrix_transform_3d_node.h
@@ -16,6 +16,7 @@
 #define COBALT_RENDER_TREE_MATRIX_TRANSFORM_3D_NODE_H_
 
 #include <algorithm>
+#include <utility>
 #include <vector>
 
 #include "base/compiler_specific.h"
@@ -52,7 +53,8 @@
 
   // Forwarding constructor to the set of Builder constructors.
   template <typename... Args>
-  MatrixTransform3DNode(Args&&... args) : data_(std::forward<Args>(args)...) {}
+  MatrixTransform3DNode(Args&&... args)  // NOLINT(runtime/explicit)
+      : data_(std::forward<Args>(args)...) {}
 
   void Accept(NodeVisitor* visitor) override;
   math::RectF GetBounds() const override;
diff --git a/cobalt/render_tree/matrix_transform_node.h b/cobalt/render_tree/matrix_transform_node.h
index 68dcff3..a2672ec 100644
--- a/cobalt/render_tree/matrix_transform_node.h
+++ b/cobalt/render_tree/matrix_transform_node.h
@@ -16,6 +16,7 @@
 #define COBALT_RENDER_TREE_MATRIX_TRANSFORM_NODE_H_
 
 #include <algorithm>
+#include <utility>
 #include <vector>
 
 #include "base/compiler_specific.h"
@@ -49,7 +50,8 @@
 
   // Forwarding constructor to the set of Builder constructors.
   template <typename... Args>
-  MatrixTransformNode(Args&&... args) : data_(std::forward<Args>(args)...) {}
+  MatrixTransformNode(Args&&... args)  // NOLINT(runtime/explicit)
+      : data_(std::forward<Args>(args)...) {}
 
   void Accept(NodeVisitor* visitor) override;
   math::RectF GetBounds() const override;
diff --git a/cobalt/render_tree/mock_resource_provider.h b/cobalt/render_tree/mock_resource_provider.h
index 3825a9a..0c8791a 100644
--- a/cobalt/render_tree/mock_resource_provider.h
+++ b/cobalt/render_tree/mock_resource_provider.h
@@ -28,7 +28,6 @@
 #include "cobalt/render_tree/node.h"
 #include "cobalt/render_tree/resource_provider.h"
 #include "cobalt/render_tree/typeface.h"
-
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/cobalt/render_tree/node.cc b/cobalt/render_tree/node.cc
index 92a20a9..1463d87 100644
--- a/cobalt/render_tree/node.cc
+++ b/cobalt/render_tree/node.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/render_tree/node.h"
+
 #include "starboard/atomic.h"
 
 namespace cobalt {
diff --git a/cobalt/render_tree/node_visitor_test.cc b/cobalt/render_tree/node_visitor_test.cc
index 184970c..9b445ca 100644
--- a/cobalt/render_tree/node_visitor_test.cc
+++ b/cobalt/render_tree/node_visitor_test.cc
@@ -37,11 +37,10 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using cobalt::render_tree::animations::AnimateNode;
 using cobalt::render_tree::Brush;
 using cobalt::render_tree::BrushVisitor;
-using cobalt::render_tree::ColorRGBA;
 using cobalt::render_tree::ClearRectNode;
+using cobalt::render_tree::ColorRGBA;
 using cobalt::render_tree::CompositionNode;
 using cobalt::render_tree::FilterNode;
 using cobalt::render_tree::Font;
@@ -58,6 +57,7 @@
 using cobalt::render_tree::RectNode;
 using cobalt::render_tree::RectShadowNode;
 using cobalt::render_tree::TextNode;
+using cobalt::render_tree::animations::AnimateNode;
 
 class MockNodeVisitor : public NodeVisitor {
  public:
diff --git a/cobalt/render_tree/rect_node.cc b/cobalt/render_tree/rect_node.cc
index 1dbb094..d2b3c59 100644
--- a/cobalt/render_tree/rect_node.cc
+++ b/cobalt/render_tree/rect_node.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/render_tree/rect_node.h"
 
+#include <memory>
+#include <utility>
+
 #include "cobalt/render_tree/brush_visitor.h"
 #include "cobalt/render_tree/node_visitor.h"
 
diff --git a/cobalt/render_tree/rect_node.h b/cobalt/render_tree/rect_node.h
index c72072d..e3ca454 100644
--- a/cobalt/render_tree/rect_node.h
+++ b/cobalt/render_tree/rect_node.h
@@ -16,6 +16,7 @@
 #define COBALT_RENDER_TREE_RECT_NODE_H_
 
 #include <memory>
+#include <utility>
 
 #include "base/compiler_specific.h"
 #include "base/logging.h"
@@ -73,7 +74,8 @@
 
   // Forwarding constructor to the set of Builder constructors.
   template <typename... Args>
-  RectNode(Args&&... args) : data_(std::forward<Args>(args)...) {
+  RectNode(Args&&... args)  // NOLINT(runtime/explicit)
+      : data_(std::forward<Args>(args)...) {
     if (DCHECK_IS_ON()) {
       AssertValid();
     }
diff --git a/cobalt/render_tree/rect_shadow_node.h b/cobalt/render_tree/rect_shadow_node.h
index 3a4342a..21ff32b 100644
--- a/cobalt/render_tree/rect_shadow_node.h
+++ b/cobalt/render_tree/rect_shadow_node.h
@@ -15,6 +15,8 @@
 #ifndef COBALT_RENDER_TREE_RECT_SHADOW_NODE_H_
 #define COBALT_RENDER_TREE_RECT_SHADOW_NODE_H_
 
+#include <utility>
+
 #include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/optional.h"
@@ -69,7 +71,8 @@
 
   // Forwarding constructor to the set of Builder constructors.
   template <typename... Args>
-  RectShadowNode(Args&&... args) : data_(std::forward<Args>(args)...) {
+  RectShadowNode(Args&&... args)  // NOLINT(runtime/explicit)
+      : data_(std::forward<Args>(args)...) {
     if (DCHECK_IS_ON()) {
       AssertValid();
     }
diff --git a/cobalt/render_tree/resource_provider_stub.h b/cobalt/render_tree/resource_provider_stub.h
index 43ad4e8..9ea6c58 100644
--- a/cobalt/render_tree/resource_provider_stub.h
+++ b/cobalt/render_tree/resource_provider_stub.h
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/memory/aligned_memory.h"
@@ -257,13 +258,9 @@
 
   void Finish() override {}
 
-  bool PixelFormatSupported(PixelFormat pixel_format) override {
-    return true;
-  }
+  bool PixelFormatSupported(PixelFormat pixel_format) override { return true; }
 
-  bool AlphaFormatSupported(AlphaFormat alpha_format) override {
-    return true;
-  }
+  bool AlphaFormatSupported(AlphaFormat alpha_format) override { return true; }
 
   std::unique_ptr<ImageData> AllocateImageData(
       const math::Size& size, PixelFormat pixel_format,
diff --git a/cobalt/render_tree/testing/mock_image.h b/cobalt/render_tree/testing/mock_image.h
index 696578b..759d37d 100644
--- a/cobalt/render_tree/testing/mock_image.h
+++ b/cobalt/render_tree/testing/mock_image.h
@@ -16,7 +16,6 @@
 #define COBALT_RENDER_TREE_TESTING_MOCK_IMAGE_H_
 
 #include "cobalt/render_tree/image.h"
-
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace cobalt {
diff --git a/cobalt/render_tree/text_node.h b/cobalt/render_tree/text_node.h
index dc6b1f8..1337b8f 100644
--- a/cobalt/render_tree/text_node.h
+++ b/cobalt/render_tree/text_node.h
@@ -16,6 +16,7 @@
 #define COBALT_RENDER_TREE_TEXT_NODE_H_
 
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/compiler_specific.h"
@@ -67,7 +68,8 @@
 
   // Forwarding constructor to the set of Builder constructors.
   template <typename... Args>
-  TextNode(Args&&... args) : data_(std::forward<Args>(args)...) {}
+  TextNode(Args&&... args)  // NOLINT(runtime/explicit)
+      : data_(std::forward<Args>(args)...) {}
 
   void Accept(NodeVisitor* visitor) override;
   math::RectF GetBounds() const override;
diff --git a/cobalt/renderer/BUILD.gn b/cobalt/renderer/BUILD.gn
index 2b4ac9d..65e58da 100644
--- a/cobalt/renderer/BUILD.gn
+++ b/cobalt/renderer/BUILD.gn
@@ -65,7 +65,6 @@
     "//cobalt/renderer/rasterizer/skia:software_rasterizer",
     "//cobalt/system_window",
     "//cobalt/watchdog",
-    "//nb",
     "//starboard:starboard_headers_only",
   ]
 
diff --git a/cobalt/renderer/animations_test.cc b/cobalt/renderer/animations_test.cc
index 891158f..4389e07 100644
--- a/cobalt/renderer/animations_test.cc
+++ b/cobalt/renderer/animations_test.cc
@@ -27,13 +27,12 @@
 #include "cobalt/renderer/pipeline.h"
 #include "cobalt/renderer/renderer_module.h"
 #include "cobalt/renderer/submission.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
-using cobalt::render_tree::animations::AnimateNode;
 using cobalt::render_tree::Image;
 using cobalt::render_tree::ImageNode;
 using cobalt::render_tree::ResourceProvider;
+using cobalt::render_tree::animations::AnimateNode;
 
 namespace cobalt {
 namespace renderer {
diff --git a/cobalt/renderer/backend/egl/display.cc b/cobalt/renderer/backend/egl/display.cc
index e9398cc..2b1e042 100644
--- a/cobalt/renderer/backend/egl/display.cc
+++ b/cobalt/renderer/backend/egl/display.cc
@@ -12,13 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/backend/egl/display.h"
 
 #include "cobalt/configuration/configuration.h"
 #include "cobalt/renderer/backend/egl/render_target.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
diff --git a/cobalt/renderer/backend/egl/framebuffer.cc b/cobalt/renderer/backend/egl/framebuffer.cc
index 6348e81..ce4b619 100644
--- a/cobalt/renderer/backend/egl/framebuffer.cc
+++ b/cobalt/renderer/backend/egl/framebuffer.cc
@@ -12,8 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/backend/egl/framebuffer.h"
 
 #include "base/logging.h"
@@ -21,6 +19,7 @@
 #include "cobalt/renderer/backend/egl/texture.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
diff --git a/cobalt/renderer/backend/egl/framebuffer_render_target.h b/cobalt/renderer/backend/egl/framebuffer_render_target.h
index 700738c..f2fc22c 100644
--- a/cobalt/renderer/backend/egl/framebuffer_render_target.h
+++ b/cobalt/renderer/backend/egl/framebuffer_render_target.h
@@ -16,6 +16,7 @@
 #define COBALT_RENDERER_BACKEND_EGL_FRAMEBUFFER_RENDER_TARGET_H_
 
 #include <memory>
+
 #include "cobalt/math/size.h"
 #include "cobalt/renderer/backend/egl/framebuffer.h"
 #include "cobalt/renderer/backend/egl/render_target.h"
@@ -49,9 +50,7 @@
   }
 
   // Get the color texture attachment of the framebuffer.
-  TextureEGL* GetColorTexture() const {
-    return framebuffer_.GetColorTexture();
-  }
+  TextureEGL* GetColorTexture() const { return framebuffer_.GetColorTexture(); }
 
   bool CreationError() override { return framebuffer_.CreationError(); }
 
diff --git a/cobalt/renderer/backend/egl/graphics_system.cc b/cobalt/renderer/backend/egl/graphics_system.cc
index f4ed70a..cc35c7a 100644
--- a/cobalt/renderer/backend/egl/graphics_system.cc
+++ b/cobalt/renderer/backend/egl/graphics_system.cc
@@ -200,7 +200,6 @@
 }
 
 GraphicsSystemEGL::~GraphicsSystemEGL() {
-  LOG(INFO) << "GraphicsSystemEGL::~GraphicsSystemEGL()";
   if (window_surface_ != EGL_NO_SURFACE) {
     EGL_CALL_SIMPLE(eglDestroySurface(display_, window_surface_));
   }
@@ -208,7 +207,6 @@
   EGL_CALL_SIMPLE(eglTerminate(display_));
   EGLint result = EGL_CALL_SIMPLE(eglGetError());
   if (result != EGL_SUCCESS) LOG(INFO) << "eglTerminate returned " << result;
-  LOG(INFO) << "GraphicsSystemEGL::~GraphicsSystemEGL() done";
 }
 
 std::unique_ptr<Display> GraphicsSystemEGL::CreateDisplay(
diff --git a/cobalt/renderer/backend/egl/pbuffer_render_target.cc b/cobalt/renderer/backend/egl/pbuffer_render_target.cc
index 43c2499..bb8ddc8 100644
--- a/cobalt/renderer/backend/egl/pbuffer_render_target.cc
+++ b/cobalt/renderer/backend/egl/pbuffer_render_target.cc
@@ -12,12 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/backend/egl/pbuffer_render_target.h"
 
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
diff --git a/cobalt/renderer/backend/egl/pbuffer_render_target.h b/cobalt/renderer/backend/egl/pbuffer_render_target.h
index 2e73068..f5b2334 100644
--- a/cobalt/renderer/backend/egl/pbuffer_render_target.h
+++ b/cobalt/renderer/backend/egl/pbuffer_render_target.h
@@ -27,8 +27,8 @@
 // (Pixel Buffer Object) which can be used as an offscreen rendering target.
 class PBufferRenderTargetEGL : public RenderTargetEGL {
  public:
-  PBufferRenderTargetEGL(
-      EGLDisplay display, EGLConfig config, const math::Size& dimensions);
+  PBufferRenderTargetEGL(EGLDisplay display, EGLConfig config,
+                         const math::Size& dimensions);
 
   const math::Size& GetSize() const override;
 
diff --git a/cobalt/renderer/backend/egl/texture.h b/cobalt/renderer/backend/egl/texture.h
index 7fe1ad2..87ff058 100644
--- a/cobalt/renderer/backend/egl/texture.h
+++ b/cobalt/renderer/backend/egl/texture.h
@@ -16,6 +16,7 @@
 #define COBALT_RENDERER_BACKEND_EGL_TEXTURE_H_
 
 #include <memory>
+
 #include "base/callback.h"
 #include "cobalt/renderer/backend/egl/render_target.h"
 #include "cobalt/renderer/backend/egl/texture_data.h"
diff --git a/cobalt/renderer/backend/egl/texture_data.cc b/cobalt/renderer/backend/egl/texture_data.cc
index 3804155..d6c8f63 100644
--- a/cobalt/renderer/backend/egl/texture_data.cc
+++ b/cobalt/renderer/backend/egl/texture_data.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/backend/egl/texture_data.h"
+
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
diff --git a/cobalt/renderer/backend/egl/texture_data.h b/cobalt/renderer/backend/egl/texture_data.h
index 9f50a70..0b7bcbf 100644
--- a/cobalt/renderer/backend/egl/texture_data.h
+++ b/cobalt/renderer/backend/egl/texture_data.h
@@ -16,6 +16,8 @@
 #define COBALT_RENDERER_BACKEND_EGL_TEXTURE_DATA_H_
 
 #include <memory>
+#include <utility>
+
 #include "base/memory/ref_counted.h"
 #include "cobalt/math/size.h"
 #include "cobalt/renderer/egl_and_gles.h"
diff --git a/cobalt/renderer/backend/egl/texture_data_cpu.cc b/cobalt/renderer/backend/egl/texture_data_cpu.cc
index 4dfbdf6..7bf9189 100644
--- a/cobalt/renderer/backend/egl/texture_data_cpu.cc
+++ b/cobalt/renderer/backend/egl/texture_data_cpu.cc
@@ -15,6 +15,7 @@
 #include "cobalt/renderer/backend/egl/texture_data_cpu.h"
 
 #include <memory>
+
 #include "base/memory/aligned_memory.h"
 #include "cobalt/renderer/backend/egl/graphics_context.h"
 #include "cobalt/renderer/backend/egl/utils.h"
diff --git a/cobalt/renderer/backend/egl/texture_data_cpu.h b/cobalt/renderer/backend/egl/texture_data_cpu.h
index d5bef9b..d7d35bf 100644
--- a/cobalt/renderer/backend/egl/texture_data_cpu.h
+++ b/cobalt/renderer/backend/egl/texture_data_cpu.h
@@ -15,6 +15,8 @@
 #ifndef COBALT_RENDERER_BACKEND_EGL_TEXTURE_DATA_CPU_H_
 #define COBALT_RENDERER_BACKEND_EGL_TEXTURE_DATA_CPU_H_
 
+#include <memory>
+
 #include "base/memory/aligned_memory.h"
 #include "cobalt/renderer/backend/egl/texture_data.h"
 #include "cobalt/renderer/backend/egl/utils.h"
diff --git a/cobalt/renderer/backend/egl/utils.cc b/cobalt/renderer/backend/egl/utils.cc
index fe50838..3f23ec3 100644
--- a/cobalt/renderer/backend/egl/utils.cc
+++ b/cobalt/renderer/backend/egl/utils.cc
@@ -12,11 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/backend/egl/utils.h"
 
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
@@ -26,7 +25,9 @@
                               EGLContext share_context) {
   // Create an OpenGL ES 3.0 context.
   EGLint context_attrib_list[] = {
-      EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE,
+      EGL_CONTEXT_CLIENT_VERSION,
+      3,
+      EGL_NONE,
   };
   EGLContext context = EGL_CALL_SIMPLE(
       eglCreateContext(display, config, share_context, context_attrib_list));
@@ -38,7 +39,9 @@
     // as EGL_CONTEXT_CLIENT_VERSION.  Thus, this fallback code exists to
     // facilitate those platforms.
     EGLint context_attrib_list_gles2[] = {
-        EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE,
+        EGL_CONTEXT_CLIENT_VERSION,
+        2,
+        EGL_NONE,
     };
     context = EGL_CALL_SIMPLE(eglCreateContext(display, config, share_context,
                                                context_attrib_list_gles2));
diff --git a/cobalt/renderer/backend/graphics_system_test.cc b/cobalt/renderer/backend/graphics_system_test.cc
index 06514a4..eedee79 100644
--- a/cobalt/renderer/backend/graphics_system_test.cc
+++ b/cobalt/renderer/backend/graphics_system_test.cc
@@ -12,13 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/renderer/backend/graphics_system.h"
+
 #include <algorithm>
 #include <memory>
 
 #include "base/optional.h"
 #include "cobalt/renderer/backend/default_graphics_system.h"
 #include "cobalt/renderer/backend/graphics_context.h"
-#include "cobalt/renderer/backend/graphics_system.h"
 #include "starboard/log.h"
 #include "starboard/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -91,8 +92,8 @@
     graphics_context.reset();
     graphics_system.reset();
   }
-  SbTimeMonotonic time_per_initialization = kSbTimeMillisecond +
-      (SbTimeGetMonotonicNow() - start) / kReferenceCount;
+  SbTimeMonotonic time_per_initialization =
+      kSbTimeMillisecond + (SbTimeGetMonotonicNow() - start) / kReferenceCount;
   SB_LOG(INFO) << "Measured duration "
                << time_per_initialization / kSbTimeMillisecond
                << "ms per initialization.";
diff --git a/cobalt/renderer/backend/starboard/default_graphics_system.cc b/cobalt/renderer/backend/starboard/default_graphics_system.cc
index 8ce9d35..51edeb9 100644
--- a/cobalt/renderer/backend/starboard/default_graphics_system.cc
+++ b/cobalt/renderer/backend/starboard/default_graphics_system.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/renderer/backend/default_graphics_system.h"
+
 #include <memory>
 #include <string>
 
-#include "cobalt/renderer/backend/default_graphics_system.h"
-
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/configuration/configuration.h"
 #include "cobalt/renderer/backend/egl/graphics_system.h"
diff --git a/cobalt/renderer/backend/starboard/default_graphics_system_egl.cc b/cobalt/renderer/backend/starboard/default_graphics_system_egl.cc
index 7a9d502..ef01417 100644
--- a/cobalt/renderer/backend/starboard/default_graphics_system_egl.cc
+++ b/cobalt/renderer/backend/starboard/default_graphics_system_egl.cc
@@ -15,7 +15,6 @@
 #include <memory>
 
 #include "cobalt/renderer/backend/default_graphics_system.h"
-
 #include "cobalt/renderer/backend/egl/graphics_system.h"
 #include "cobalt/system_window/system_window.h"
 
diff --git a/cobalt/renderer/backend/texture_stub.h b/cobalt/renderer/backend/texture_stub.h
index 8633664..991a469 100644
--- a/cobalt/renderer/backend/texture_stub.h
+++ b/cobalt/renderer/backend/texture_stub.h
@@ -29,8 +29,8 @@
 // Maintains a scoped array of texture data.
 class TextureDataStub : public TextureData {
  public:
-  explicit TextureDataStub(const SurfaceInfo& surface_info) :
-      pixel_data_(new PixelDataStub(surface_info)) {}
+  explicit TextureDataStub(const SurfaceInfo& surface_info)
+      : pixel_data_(new PixelDataStub(surface_info)) {}
 
   const SurfaceInfo& GetSurfaceInfo() const override {
     return pixel_data_->surface_info();
@@ -95,9 +95,7 @@
     return pixel_data_->surface_info();
   }
 
-  const scoped_refptr<PixelDataStub>& pixel_data() const {
-    return pixel_data_;
-  }
+  const scoped_refptr<PixelDataStub>& pixel_data() const { return pixel_data_; }
 
   Origin GetOrigin() const override { return kBottomLeft; }
 
diff --git a/cobalt/renderer/fps_overlay.cc b/cobalt/renderer/fps_overlay.cc
index 26696c4..361cdbf 100644
--- a/cobalt/renderer/fps_overlay.cc
+++ b/cobalt/renderer/fps_overlay.cc
@@ -16,6 +16,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/strings/stringprintf.h"
diff --git a/cobalt/renderer/get_default_rasterizer_for_platform.cc b/cobalt/renderer/get_default_rasterizer_for_platform.cc
index 52c0cb0..863a1da 100644
--- a/cobalt/renderer/get_default_rasterizer_for_platform.cc
+++ b/cobalt/renderer/get_default_rasterizer_for_platform.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/renderer/get_default_rasterizer_for_platform.h"
 
+#include <memory>
+
 #include "cobalt/configuration/configuration.h"
 #include "cobalt/renderer/backend/graphics_context.h"
 #include "cobalt/renderer/rasterizer/egl/hardware_rasterizer.h"
diff --git a/cobalt/renderer/pipeline.cc b/cobalt/renderer/pipeline.cc
index 1b27cbf..9e83edf 100644
--- a/cobalt/renderer/pipeline.cc
+++ b/cobalt/renderer/pipeline.cc
@@ -29,7 +29,6 @@
 #include "cobalt/render_tree/composition_node.h"
 #include "cobalt/render_tree/dump_render_tree_to_string.h"
 #include "cobalt/watchdog/watchdog.h"
-#include "nb/memory_scope.h"
 #include "starboard/extension/graphics.h"
 #include "starboard/system.h"
 
@@ -272,7 +271,6 @@
     const scoped_refptr<render_tree::Node>& render_tree_root,
     const base::Optional<math::Rect>& clip_rect,
     const RasterizationCompleteCallback& complete) {
-  TRACK_MEMORY_SCOPE("Renderer");
   TRACE_EVENT0("cobalt::renderer", "Pipeline::RasterizeToRGBAPixels()");
 
   if (base::MessageLoop::current() != rasterizer_thread_.message_loop()) {
@@ -311,7 +309,6 @@
 }
 
 void Pipeline::TimeFence(base::TimeDelta time_fence) {
-  TRACK_MEMORY_SCOPE("Renderer");
   TRACE_EVENT0("cobalt::renderer", "Pipeline::TimeFence()");
 
   if (base::MessageLoop::current() != rasterizer_thread_.message_loop()) {
@@ -397,7 +394,6 @@
 }
 
 void Pipeline::RasterizeCurrentTree() {
-  TRACK_MEMORY_SCOPE("Renderer");
   DCHECK_CALLED_ON_VALID_THREAD(rasterizer_thread_checker_);
   TRACE_EVENT0("cobalt::renderer", "Pipeline::RasterizeCurrentTree()");
 
@@ -803,7 +799,6 @@
 }
 
 void Pipeline::ResetSubmissionQueue() {
-  TRACK_MEMORY_SCOPE("Renderer");
   TRACE_EVENT0("cobalt::renderer", "Pipeline::ResetSubmissionQueue()");
   submission_queue_ = base::nullopt;
   submission_queue_.emplace(
@@ -816,7 +811,6 @@
 
 void Pipeline::QueueSubmission(const Submission& submission,
                                base::TimeTicks receipt_time) {
-  TRACK_MEMORY_SCOPE("Renderer");
   TRACE_EVENT0("cobalt::renderer", "Pipeline::QueueSubmission()");
   // Upon each submission, check if the timeline has changed.  If it has,
   // reset our submission queue (possibly with a new configuration specified
diff --git a/cobalt/renderer/pipeline_test.cc b/cobalt/renderer/pipeline_test.cc
index a5fc24e..08e83db 100644
--- a/cobalt/renderer/pipeline_test.cc
+++ b/cobalt/renderer/pipeline_test.cc
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/renderer/pipeline.h"
+
 #include <cmath>
 #include <memory>
 
@@ -19,16 +21,15 @@
 #include "base/threading/platform_thread.h"
 #include "cobalt/render_tree/composition_node.h"
 #include "cobalt/render_tree/resource_provider_stub.h"
-#include "cobalt/renderer/pipeline.h"
 #include "cobalt/renderer/rasterizer/rasterizer.h"
 #include "cobalt/renderer/submission.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using ::testing::Between;
-using ::testing::_;
 using cobalt::renderer::Pipeline;
 using cobalt::renderer::rasterizer::Rasterizer;
+using ::testing::_;
+using ::testing::Between;
 
 namespace {
 // We explicitly state here how long our mock rasterizer will take to complete
@@ -39,7 +40,7 @@
 
 class MockResourceProvider : public cobalt::render_tree::ResourceProviderStub {
  public:
-  MockResourceProvider() : fonts_loaded_(false){};
+  MockResourceProvider() : fonts_loaded_(false) {}
   ~MockResourceProvider() override {}
   void LoadAdditionalFonts() override { fonts_loaded_ = true; }
   bool fonts_loaded_;
diff --git a/cobalt/renderer/rasterizer/benchmark.cc b/cobalt/renderer/rasterizer/benchmark.cc
index b2f271a..5173e1a 100644
--- a/cobalt/renderer/rasterizer/benchmark.cc
+++ b/cobalt/renderer/rasterizer/benchmark.cc
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/trace_event/benchmark.h"
+
 #include <memory>
 
 #include "cobalt/base/polymorphic_downcast.h"
@@ -24,23 +26,22 @@
 #include "cobalt/renderer/renderer_module.h"
 #include "cobalt/renderer/test/scenes/all_scenes_combined_scene.h"
 #include "cobalt/system_window/system_window.h"
-#include "cobalt/trace_event/benchmark.h"
 
 using cobalt::math::Size;
 using cobalt::math::SizeF;
 using cobalt::render_tree::AlphaFormat;
-using cobalt::render_tree::animations::AnimateNode;
 using cobalt::render_tree::ImageData;
 using cobalt::render_tree::Node;
 using cobalt::render_tree::PixelFormat;
 using cobalt::render_tree::ResourceProvider;
+using cobalt::render_tree::animations::AnimateNode;
+using cobalt::renderer::RendererModule;
 using cobalt::renderer::backend::Display;
 using cobalt::renderer::backend::GraphicsContext;
 using cobalt::renderer::backend::GraphicsSystem;
 using cobalt::renderer::backend::RenderTarget;
 using cobalt::renderer::backend::SurfaceInfo;
 using cobalt::renderer::rasterizer::Rasterizer;
-using cobalt::renderer::RendererModule;
 using cobalt::renderer::test::scenes::AddBlankBackgroundToScene;
 using cobalt::renderer::test::scenes::CreateAllScenesCombinedScene;
 using cobalt::system_window::SystemWindow;
diff --git a/cobalt/renderer/rasterizer/common/offscreen_render_coordinate_mapping.cc b/cobalt/renderer/rasterizer/common/offscreen_render_coordinate_mapping.cc
index f98f8ee..126f27a 100644
--- a/cobalt/renderer/rasterizer/common/offscreen_render_coordinate_mapping.cc
+++ b/cobalt/renderer/rasterizer/common/offscreen_render_coordinate_mapping.cc
@@ -24,10 +24,10 @@
 using math::Matrix3F;
 using math::Rect;
 using math::RectF;
+using math::ScaleMatrix;
+using math::TranslateMatrix;
 using math::Vector2dF;
 using math::Vector3dF;
-using math::TranslateMatrix;
-using math::ScaleMatrix;
 
 namespace {
 float GetFractionalComponent(float value) { return value - std::floor(value); }
diff --git a/cobalt/renderer/rasterizer/common/utils.cc b/cobalt/renderer/rasterizer/common/utils.cc
index d7049a2..757c14a 100644
--- a/cobalt/renderer/rasterizer/common/utils.cc
+++ b/cobalt/renderer/rasterizer/common/utils.cc
@@ -52,13 +52,9 @@
   return false;
 }
 
-bool IsOpaque(float opacity) {
-  return opacity >= 254.5f / 255.0f;
-}
+bool IsOpaque(float opacity) { return opacity >= 254.5f / 255.0f; }
 
-bool IsTransparent(float opacity) {
-  return opacity <= 0.5f / 255.0f;
-}
+bool IsTransparent(float opacity) { return opacity <= 0.5f / 255.0f; }
 
 }  // namespace utils
 }  // namespace common
diff --git a/cobalt/renderer/rasterizer/egl/draw_callback.cc b/cobalt/renderer/rasterizer/egl/draw_callback.cc
index c145dcc..0d3a263 100644
--- a/cobalt/renderer/rasterizer/egl/draw_callback.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_callback.cc
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
+#include "cobalt/renderer/rasterizer/egl/draw_callback.h"
 
 #include "base/basictypes.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
-#include "cobalt/renderer/rasterizer/egl/draw_callback.h"
 #include "egl/generated_shader_impl.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
diff --git a/cobalt/renderer/rasterizer/egl/draw_clear.cc b/cobalt/renderer/rasterizer/egl/draw_clear.cc
index a80e53c..ad356d1 100644
--- a/cobalt/renderer/rasterizer/egl/draw_clear.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_clear.cc
@@ -12,12 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/rasterizer/egl/draw_clear.h"
 
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
diff --git a/cobalt/renderer/rasterizer/egl/draw_rect_border.cc b/cobalt/renderer/rasterizer/egl/draw_rect_border.cc
index f7f3b20..833c729 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rect_border.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rect_border.cc
@@ -12,8 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/rasterizer/egl/draw_rect_border.h"
 
 #include "base/logging.h"
@@ -23,6 +21,7 @@
 #include "cobalt/renderer/egl_and_gles.h"
 #include "cobalt/renderer/rasterizer/common/utils.h"
 #include "egl/generated_shader_impl.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
diff --git a/cobalt/renderer/rasterizer/egl/draw_rect_color_texture.cc b/cobalt/renderer/rasterizer/egl/draw_rect_color_texture.cc
index b76320e..af1f139 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rect_color_texture.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rect_color_texture.cc
@@ -12,13 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/rasterizer/egl/draw_rect_color_texture.h"
 
 #include "base/basictypes.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
diff --git a/cobalt/renderer/rasterizer/egl/draw_rect_texture.cc b/cobalt/renderer/rasterizer/egl/draw_rect_texture.cc
index e16b9cc..93feafd 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rect_texture.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rect_texture.cc
@@ -12,13 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/rasterizer/egl/draw_rect_texture.h"
 
 #include "base/basictypes.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
diff --git a/cobalt/renderer/rasterizer/egl/draw_rrect_color.cc b/cobalt/renderer/rasterizer/egl/draw_rrect_color.cc
index aa4f2de..fe8804c 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rrect_color.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rrect_color.cc
@@ -12,13 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/rasterizer/egl/draw_rrect_color.h"
 
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
 #include "egl/generated_shader_impl.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
diff --git a/cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.cc b/cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.cc
index 4fae2f8..95fdbe5 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.cc
@@ -12,13 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.h"
 
 #include "base/basictypes.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
diff --git a/cobalt/renderer/rasterizer/egl/shader_base.cc b/cobalt/renderer/rasterizer/egl/shader_base.cc
index 3a7e451..1acab87 100644
--- a/cobalt/renderer/rasterizer/egl/shader_base.cc
+++ b/cobalt/renderer/rasterizer/egl/shader_base.cc
@@ -12,13 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/rasterizer/egl/shader_base.h"
 
 #include "base/logging.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
diff --git a/cobalt/renderer/rasterizer/egl/shader_program.cc b/cobalt/renderer/rasterizer/egl/shader_program.cc
index 7f00d47..2df92c5 100644
--- a/cobalt/renderer/rasterizer/egl/shader_program.cc
+++ b/cobalt/renderer/rasterizer/egl/shader_program.cc
@@ -12,13 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/rasterizer/egl/shader_program.h"
 
 #include "base/logging.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
diff --git a/cobalt/renderer/rasterizer/egl/shader_program_manager.cc b/cobalt/renderer/rasterizer/egl/shader_program_manager.cc
index dd92e02..f782824 100644
--- a/cobalt/renderer/rasterizer/egl/shader_program_manager.cc
+++ b/cobalt/renderer/rasterizer/egl/shader_program_manager.cc
@@ -12,13 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/rasterizer/egl/shader_program_manager.h"
 
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
 #include "egl/generated_shader_impl.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
diff --git a/cobalt/renderer/rasterizer/egl/software_rasterizer.cc b/cobalt/renderer/rasterizer/egl/software_rasterizer.cc
index 92316a8..d8156c5 100644
--- a/cobalt/renderer/rasterizer/egl/software_rasterizer.cc
+++ b/cobalt/renderer/rasterizer/egl/software_rasterizer.cc
@@ -61,7 +61,9 @@
       gl_format = GL_BGRA_EXT;
       break;
     }
-    default: { NOTREACHED() << "Unsupported GL color format."; }
+    default: {
+      NOTREACHED() << "Unsupported GL color format.";
+    }
   }
   std::unique_ptr<cobalt::renderer::backend::TextureDataEGL> bitmap_pixels =
       context_->system_egl()->AllocateTextureData(
diff --git a/cobalt/renderer/rasterizer/skia/cobalt_skia_type_conversions.cc b/cobalt/renderer/rasterizer/skia/cobalt_skia_type_conversions.cc
index 93454b7..0ddaa3c 100644
--- a/cobalt/renderer/rasterizer/skia/cobalt_skia_type_conversions.cc
+++ b/cobalt/renderer/rasterizer/skia/cobalt_skia_type_conversions.cc
@@ -49,7 +49,8 @@
       return kUnpremul_SkAlphaType;
     case render_tree::kAlphaFormatOpaque:
       return kOpaque_SkAlphaType;
-    default: DLOG(FATAL) << "Unknown render tree alpha format!";
+    default:
+      DLOG(FATAL) << "Unknown render tree alpha format!";
   }
   return kUnpremul_SkAlphaType;
 }
diff --git a/cobalt/renderer/rasterizer/skia/conversions.h b/cobalt/renderer/rasterizer/skia/conversions.h
index d90e602..e7bee4c 100644
--- a/cobalt/renderer/rasterizer/skia/conversions.h
+++ b/cobalt/renderer/rasterizer/skia/conversions.h
@@ -16,6 +16,7 @@
 #define COBALT_RENDERER_RASTERIZER_SKIA_CONVERSIONS_H_
 
 #include <vector>
+
 #include "third_party/skia/include/core/SkColor.h"
 
 namespace cobalt {
diff --git a/cobalt/renderer/rasterizer/skia/font.h b/cobalt/renderer/rasterizer/skia/font.h
index aa01e85..e39ff97 100644
--- a/cobalt/renderer/rasterizer/skia/font.h
+++ b/cobalt/renderer/rasterizer/skia/font.h
@@ -22,7 +22,6 @@
 #include "base/threading/thread_checker.h"
 #include "cobalt/render_tree/font.h"
 #include "cobalt/renderer/rasterizer/skia/typeface.h"
-
 #include "third_party/skia/include/core/SkFont.h"
 #include "third_party/skia/include/core/SkFontMetrics.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
diff --git a/cobalt/renderer/rasterizer/skia/gl_format_conversions.cc b/cobalt/renderer/rasterizer/skia/gl_format_conversions.cc
index 2e71cf2..3e67fe3 100644
--- a/cobalt/renderer/rasterizer/skia/gl_format_conversions.cc
+++ b/cobalt/renderer/rasterizer/skia/gl_format_conversions.cc
@@ -12,11 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/rasterizer/skia/gl_format_conversions.h"
 
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
@@ -39,7 +38,9 @@
       return GL_ALPHA;
     case render_tree::kPixelFormatUV8:
       return GL_LUMINANCE_ALPHA;
-    default: { NOTREACHED() << "Unknown format."; }
+    default: {
+      NOTREACHED() << "Unknown format.";
+    }
   }
   return GL_RGBA;
 }
@@ -64,7 +65,9 @@
     case GL_RG_EXT:
 #endif
       return GrColorType::kRGBA_8888;
-    default: { NOTREACHED() << "Unsupported GL format."; }
+    default: {
+      NOTREACHED() << "Unsupported GL format.";
+    }
   }
   return GrColorType::kRGBA_8888;
 }
@@ -91,7 +94,9 @@
     case GL_RG_EXT:
 #endif
       return GL_RGBA8_OES;
-    default: { NOTREACHED() << "Unsupported GL format."; }
+    default: {
+      NOTREACHED() << "Unsupported GL format.";
+    }
   }
   return GL_RGBA8_OES;
 }
diff --git a/cobalt/renderer/rasterizer/skia/glyph_buffer.h b/cobalt/renderer/rasterizer/skia/glyph_buffer.h
index d9d09e5..d96da01 100644
--- a/cobalt/renderer/rasterizer/skia/glyph_buffer.h
+++ b/cobalt/renderer/rasterizer/skia/glyph_buffer.h
@@ -16,7 +16,6 @@
 #define COBALT_RENDERER_RASTERIZER_SKIA_GLYPH_BUFFER_H_
 
 #include "cobalt/render_tree/glyph_buffer.h"
-
 #include "third_party/skia/include/core/SkTextBlob.h"
 
 namespace cobalt {
diff --git a/cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc b/cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc
index 23d3982..02a2b3c 100644
--- a/cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc
+++ b/cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc
@@ -364,7 +364,9 @@
         case AlternateRgbaFormat_UYVY: {
           result.type = egl::TexturedMeshRenderer::Image::YUV_UYVY_422_BT709;
         } break;
-        default: { NOTREACHED(); }
+        default: {
+          NOTREACHED();
+        }
       }
     }
 
diff --git a/cobalt/renderer/rasterizer/skia/harfbuzz_font.cc b/cobalt/renderer/rasterizer/skia/harfbuzz_font.cc
index 777d637..fa6954b 100644
--- a/cobalt/renderer/rasterizer/skia/harfbuzz_font.cc
+++ b/cobalt/renderer/rasterizer/skia/harfbuzz_font.cc
@@ -24,7 +24,6 @@
 
 #include "base/lazy_instance.h"
 #include "cobalt/render_tree/glyph.h"
-
 #include "third_party/skia/include/core/SkPaint.h"
 #include "third_party/skia/include/core/SkTypeface.h"
 
diff --git a/cobalt/renderer/rasterizer/skia/harfbuzz_font.h b/cobalt/renderer/rasterizer/skia/harfbuzz_font.h
index 1219111..770dbbf 100644
--- a/cobalt/renderer/rasterizer/skia/harfbuzz_font.h
+++ b/cobalt/renderer/rasterizer/skia/harfbuzz_font.h
@@ -18,7 +18,6 @@
 #include <map>
 
 #include "cobalt/renderer/rasterizer/skia/font.h"
-
 #include "third_party/harfbuzz-ng/src/hb.h"
 #include "third_party/skia/include/core/SkTypeface.h"
 
diff --git a/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc b/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc
index 29dc68d..41404b2 100644
--- a/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc
+++ b/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc
@@ -1637,7 +1637,9 @@
                        shadow_bounds.right(), shadow_bounds.bottom());
 
   SkRect* draw_rects[] = {
-      &left_shadow_rect, &top_shadow_rect, &right_shadow_rect,
+      &left_shadow_rect,
+      &top_shadow_rect,
+      &right_shadow_rect,
       &bottom_shadow_rect,
   };
 
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/gpu/gl/GrGLMakeNativeInterface_cobalt.cc b/cobalt/renderer/rasterizer/skia/skia/src/gpu/gl/GrGLMakeNativeInterface_cobalt.cc
index 216bba9..c2ebc0b 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/gpu/gl/GrGLMakeNativeInterface_cobalt.cc
+++ b/cobalt/renderer/rasterizer/skia/skia/src/gpu/gl/GrGLMakeNativeInterface_cobalt.cc
@@ -12,9 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 #include "third_party/skia/include/gpu/gl/GrGLAssembleInterface.h"
 #include "third_party/skia/include/gpu/gl/GrGLInterface.h"
 
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.cc b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.cc
index e37e258..bf1aa3c 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.cc
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.cc
@@ -17,6 +17,7 @@
 #include <ft2build.h>
 #include FT_TYPES_H
 #include <libxml/parser.h>
+
 #include <limits>
 #include <memory>
 #include <stack>
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt_factory.cc b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt_factory.cc
index 6b89985..308a41e 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt_factory.cc
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt_factory.cc
@@ -12,12 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h"
-
 #include "base/base_paths_starboard.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/path_service.h"
+#include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h"
 
 sk_sp<SkFontMgr> SkFontMgr::Factory() {
   base::FilePath cobalt_font_directory;
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkOSFile_cobalt.cc b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkOSFile_cobalt.cc
index ac1ec60..228947f 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkOSFile_cobalt.cc
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkOSFile_cobalt.cc
@@ -11,8 +11,8 @@
 #include "SkTFitsIn.h"
 #include "SkTemplates.h"
 #include "SkTypes.h"
-
 #include "base/files/file_path.h"
+#include "base/files/file_starboard.h"
 #include "base/files/file_util.h"
 #include "base/optional.h"
 #include "base/path_service.h"
@@ -86,7 +86,10 @@
 size_t sk_fwrite(const void* buffer, size_t byteCount, SkFile* sk_file) {
   SkASSERT(sk_file);
   SbFile file = ToSbFile(sk_file);
-  return SbFileWrite(file, reinterpret_cast<const char*>(buffer), byteCount);
+  int result =
+      SbFileWrite(file, reinterpret_cast<const char*>(buffer), byteCount);
+  base::RecordFileWriteStat(result);
+  return result;
 }
 
 void sk_fflush(SkFile* sk_file) {
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.cc b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.cc
index 52ca499..2f37f27 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.cc
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.cc
@@ -19,6 +19,7 @@
 #include <algorithm>
 #include <limits>
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "base/logging.h"
@@ -314,7 +315,7 @@
   return true;
 }
 
-bool SkFileMemoryChunkStream::move(long offset) {
+bool SkFileMemoryChunkStream::move(long offset) {  // NOLINT(runtime/int)
   // Rewind back to the start of the stream if the offset would move it to a
   // negative position.
   if (offset < 0 && std::abs(offset) > stream_position_) {
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.h b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.h
index 8561982..f7ecc6e 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.h
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.h
@@ -17,6 +17,9 @@
 
 #include <memory>
 #include <string>
+#include <unordered_map>
+#include <utility>
+#include <vector>
 
 #include "SkMutex.h"
 #include "SkStream.h"
@@ -178,7 +181,7 @@
   // Required by SkStreamSeekable
   size_t getPosition() const override;
   bool seek(size_t position) override;
-  bool move(long offset) override;
+  bool move(long offset) override;  // NOLINT(runtime/int)
   SkFileMemoryChunkStream* onFork() const override;
 
   // Required by SkStreamAsset
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTLS_cobalt.cc b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTLS_cobalt.cc
index ecffa76..07cdf37 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTLS_cobalt.cc
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTLS_cobalt.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "SkTLS.h"
-
 #include "base/lazy_instance.h"
 #include "base/threading/thread_local_storage.h"
 
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTime_cobalt.cc b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTime_cobalt.cc
index 09291ea..d2739e6 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTime_cobalt.cc
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTime_cobalt.cc
@@ -15,9 +15,7 @@
 #include "SkString.h"
 #include "SkTime.h"
 #include "SkTypes.h"
-
 #include "base/time/time.h"
-
 #include "starboard/time.h"
 
 // Taken from SkTime.cpp.
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
index eb6f55e..c26dd35 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h"
+
 #include <memory>
 #include <utility>
 
-#include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h"
-
 #include "SkFontDescriptor.h"
 #include "SkFontStyle.h"
 #include "SkTypefaceCache.h"
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/filter_fuzz_stub.cc b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/filter_fuzz_stub.cc
deleted file mode 100644
index e6a36df..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/filter_fuzz_stub.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/path_service.h"
-#include "cobalt/base/wrap_main.h"
-#include "third_party/skia/include/core/SkBitmapDevice.h"
-#include "third_party/skia/include/core/SkCanvas.h"
-#include "third_party/skia/include/core/SkFlattenableSerialization.h"
-#include "third_party/skia/include/core/SkImageFilter.h"
-
-namespace {
-
-static const int BitmapSize = 24;
-
-bool ReadTestCase(const char* filename, std::string* ipc_filter_message) {
-  base::FilePath filepath = base::FilePath::FromUTF8Unsafe(filename);
-
-  if (!base::ReadFileToString(filepath, ipc_filter_message)) {
-    LOG(ERROR) << filename << ": couldn't read file.";
-    return false;
-  }
-
-  return true;
-}
-
-void RunTestCase(const std::string& ipc_filter_message, const SkBitmap& bitmap,
-                 SkCanvas* canvas) {
-  // This call shouldn't crash or cause ASAN to flag any memory issues
-  // If nothing bad happens within this call, everything is fine
-  SkFlattenable* flattenable = SkValidatingDeserializeFlattenable(
-        ipc_filter_message.c_str(), ipc_filter_message.size(),
-        SkImageFilter::GetFlattenableType());
-
-  // Adding some info, but the test passed if we got here without any trouble
-  if (flattenable != NULL) {
-    LOG(INFO) << "Valid stream detected.";
-    // Let's see if using the filters can cause any trouble...
-    SkPaint paint;
-    paint.setImageFilter(static_cast<SkImageFilter*>(flattenable))->unref();
-    canvas->save();
-    canvas->clipRect(SkRect::MakeXYWH(
-        0, 0, SkIntToScalar(BitmapSize), SkIntToScalar(BitmapSize)));
-
-    // This call shouldn't crash or cause ASAN to flag any memory issues
-    // If nothing bad happens within this call, everything is fine
-    canvas->drawBitmap(bitmap, 0, 0, &paint);
-
-    LOG(INFO) << "Filter DAG rendered successfully";
-    canvas->restore();
-  } else {
-    LOG(INFO) << "Invalid stream detected.";
-  }
-}
-
-bool ReadAndRunTestCase(const char* filename, const SkBitmap& bitmap,
-                        SkCanvas* canvas) {
-  std::string ipc_filter_message;
-
-  LOG(INFO) << "Test case: " << filename;
-
-  // ReadTestCase will print a useful error message if it fails.
-  if (!ReadTestCase(filename, &ipc_filter_message))
-    return false;
-
-  RunTestCase(ipc_filter_message, bitmap, canvas);
-
-  return true;
-}
-
-int FilterFuzzStubMain(int argc, char** argv) {
-  int ret = 0;
-
-  SkBitmap bitmap;
-  bitmap.allocPixels(SkImageInfo::MakeN32Premul(BitmapSize, BitmapSize));
-  SkBitmapDevice device(bitmap);
-  SkCanvas canvas(&device);
-  canvas.clear(0x00000000);
-
-  for (int i = 1; i < argc; i++)
-    if (!ReadAndRunTestCase(argv[i], bitmap, &canvas))
-      ret = 2;
-
-  // Cluster-Fuzz likes "#EOF" as the last line of output to help distinguish
-  // successful runs from crashes.
-  printf("#EOF\n");
-
-  return ret;
-}
-
-}  // namespace
-
-COBALT_WRAP_SIMPLE_MAIN(FilterFuzzStubMain);
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/oom-repro-448423.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/oom-repro-448423.fil
deleted file mode 100644
index 8d84304..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/oom-repro-448423.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/oom-repro-465455.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/oom-repro-465455.fil
deleted file mode 100644
index 8d84304..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/oom-repro-465455.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/readme.txt b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/readme.txt
deleted file mode 100644
index 5f8d41e..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/readme.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-The files in this directory are inputs to filter_fuzz_stub.  They represent
-serialized Skia filters that have been found to cause bugs/security issues
-in the past.  Each test input file has the format, "repro-XXX.fil" where
-XXX is a bug ID associated with the test case, and can be looked up by
-navigating to https://bugs.chromium.org/p/chromium/issues/detail?id=XXX .
-
-Note that some tests are pre-pended with "oom-" (such as "oom-repro-448423.fil"
-and "oom-repro-465455.fil").  These tests are known to crash (in a controlled
-manner) from lack of memory while trying to make huge allocations.
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445807.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445807.fil
deleted file mode 100644
index 387f5bf..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445807.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445808.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445808.fil
deleted file mode 100644
index 8457228..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445808.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445809.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445809.fil
deleted file mode 100644
index 9b8c6bd..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445809.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445810.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445810.fil
deleted file mode 100644
index 1d0dfe2..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445810.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445831.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445831.fil
deleted file mode 100644
index 628332b..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-445831.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486944.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486944.fil
deleted file mode 100644
index ccd7a1c..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486944.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486945.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486945.fil
deleted file mode 100644
index 3bd9e40..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486945.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486946.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486946.fil
deleted file mode 100644
index 4c911ae..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486946.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486947.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486947.fil
deleted file mode 100644
index 8272db9..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486947.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486977.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486977.fil
deleted file mode 100644
index a4af750..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-486977.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-491660.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-491660.fil
deleted file mode 100644
index ec8f2f0..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-491660.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-491975.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-491975.fil
deleted file mode 100644
index 4bb9e83..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-491975.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-492263.fil b/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-492263.fil
deleted file mode 100644
index 294838e..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/test/filter_fuzz_stub/testdata/repro-492263.fil
+++ /dev/null
Binary files differ
diff --git a/cobalt/renderer/rasterizer/skia/skottie_animation.cc b/cobalt/renderer/rasterizer/skia/skottie_animation.cc
index 224b4a9..2d954ee 100644
--- a/cobalt/renderer/rasterizer/skia/skottie_animation.cc
+++ b/cobalt/renderer/rasterizer/skia/skottie_animation.cc
@@ -132,7 +132,7 @@
 }
 
 void SkottieAnimation::UpdateRenderCache(SkCanvas* render_target,
-    const math::SizeF& size) {
+                                         const math::SizeF& size) {
   DCHECK(render_target);
   if (cached_animation_time_ == last_updated_animation_time_) {
     // The render cache is already up-to-date.
diff --git a/cobalt/renderer/rasterizer/skia/software_image.cc b/cobalt/renderer/rasterizer/skia/software_image.cc
index b5ce247..9b26df6 100644
--- a/cobalt/renderer/rasterizer/skia/software_image.cc
+++ b/cobalt/renderer/rasterizer/skia/software_image.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/renderer/rasterizer/skia/software_image.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/memory/aligned_memory.h"
 #include "cobalt/renderer/rasterizer/skia/cobalt_skia_type_conversions.h"
 
diff --git a/cobalt/renderer/rasterizer/skia/software_mesh.h b/cobalt/renderer/rasterizer/skia/software_mesh.h
index 4b85b2f..2c81730 100644
--- a/cobalt/renderer/rasterizer/skia/software_mesh.h
+++ b/cobalt/renderer/rasterizer/skia/software_mesh.h
@@ -18,6 +18,7 @@
 #define COBALT_RENDERER_RASTERIZER_SKIA_SOFTWARE_MESH_H_
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "cobalt/render_tree/mesh.h"
diff --git a/cobalt/renderer/rasterizer/skia/software_rasterizer.cc b/cobalt/renderer/rasterizer/skia/software_rasterizer.cc
index 087d7cb..98218da 100644
--- a/cobalt/renderer/rasterizer/skia/software_rasterizer.cc
+++ b/cobalt/renderer/rasterizer/skia/software_rasterizer.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/renderer/rasterizer/skia/software_rasterizer.h"
 
+#include <memory>
+
 #include "base/trace_event/trace_event.h"
 #include "cobalt/renderer/rasterizer/skia/cobalt_skia_type_conversions.h"
 #include "cobalt/renderer/rasterizer/skia/render_tree_node_visitor.h"
diff --git a/cobalt/renderer/rasterizer/skia/software_resource_provider.cc b/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
index 25f9813..f43ec11 100644
--- a/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
+++ b/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/renderer/rasterizer/skia/software_resource_provider.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/trace_event/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/renderer/rasterizer/skia/cobalt_skia_type_conversions.h"
diff --git a/cobalt/renderer/rasterizer/skia/text_shaper.h b/cobalt/renderer/rasterizer/skia/text_shaper.h
index 6856d61..2897e4f 100644
--- a/cobalt/renderer/rasterizer/skia/text_shaper.h
+++ b/cobalt/renderer/rasterizer/skia/text_shaper.h
@@ -28,7 +28,6 @@
 #include "cobalt/renderer/rasterizer/skia/font.h"
 #include "cobalt/renderer/rasterizer/skia/glyph_buffer.h"
 #include "cobalt/renderer/rasterizer/skia/harfbuzz_font.h"
-
 #include "third_party/harfbuzz-ng/src/hb-icu.h"
 #include "third_party/harfbuzz-ng/src/hb.h"
 #include "third_party/icu/source/common/unicode/uscript.h"
diff --git a/cobalt/renderer/rasterizer/skia/typeface.cc b/cobalt/renderer/rasterizer/skia/typeface.cc
index 0a70a6c..0e544b7 100644
--- a/cobalt/renderer/rasterizer/skia/typeface.cc
+++ b/cobalt/renderer/rasterizer/skia/typeface.cc
@@ -15,7 +15,6 @@
 #include "cobalt/renderer/rasterizer/skia/typeface.h"
 
 #include "cobalt/renderer/rasterizer/skia/font.h"
-
 #include "third_party/skia/include/core/SkPaint.h"
 
 namespace cobalt {
diff --git a/cobalt/renderer/rasterizer/skia/typeface.h b/cobalt/renderer/rasterizer/skia/typeface.h
index 26aad50..b7f66e9 100644
--- a/cobalt/renderer/rasterizer/skia/typeface.h
+++ b/cobalt/renderer/rasterizer/skia/typeface.h
@@ -22,7 +22,6 @@
 #include "cobalt/render_tree/font.h"
 #include "cobalt/render_tree/typeface.h"
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h"
-
 #include "third_party/skia/include/core/SkPaint.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 
diff --git a/cobalt/renderer/rasterizer/stress_test.cc b/cobalt/renderer/rasterizer/stress_test.cc
index d5ab9da..e4f9cbc 100644
--- a/cobalt/renderer/rasterizer/stress_test.cc
+++ b/cobalt/renderer/rasterizer/stress_test.cc
@@ -140,7 +140,7 @@
 }
 
 namespace {
-// Creates a composition of |cascade_amount| render trees layed out in a
+// Creates a composition of |cascade_amount| render trees laid out in a
 // cascade on top of each other.
 scoped_refptr<Node> CreateCascadedRenderTrees(Node* node, int cascade_amount,
                                               float offset_amount) {
diff --git a/cobalt/renderer/rasterizer/testdata/hunter_gone_too_deep.json b/cobalt/renderer/rasterizer/testdata/hunter_gone_too_deep.json
index 7ec94d5..752a571 100644
--- a/cobalt/renderer/rasterizer/testdata/hunter_gone_too_deep.json
+++ b/cobalt/renderer/rasterizer/testdata/hunter_gone_too_deep.json
@@ -1 +1 @@
-{"assets":[],"ddd":0,"fr":60,"h":768,"ip":0,"layers":[{"ao":0,"bm":0,"ddd":0,"ind":11,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[0,0,0]},"o":{"a":0,"ix":11,"k":0},"p":{"a":0,"ix":2,"k":[512,491,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Null 6","op":480,"sr":1,"st":0,"ty":3},{"ao":0,"bm":0,"ddd":0,"ind":12,"ip":85,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.723],"y":[0.323]},"o":{"x":[0.222],"y":[-0.066]},"s":[558],"t":85},{"i":{"x":[0.751],"y":[0.586]},"o":{"x":[0.33],"y":[0.165]},"s":[517.048],"t":128},{"i":{"x":[0.532],"y":[0.691]},"o":{"x":[0.216],"y":[0.684]},"s":[317.348],"t":171},{"i":{"x":[0.606],"y":[0.66]},"o":{"x":[0.353],"y":[0.322]},"s":[176.07],"t":229},{"i":{"x":[0.52],"y":[0.366]},"o":{"x":[0.286],"y":[0.307]},"s":[103.522],"t":270},{"i":{"x":[0.87],"y":[0.968]},"o":{"x":[0.363],"y":[0.471]},"s":[-84.301],"t":402},{"s":[-188.5],"t":474}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.675],"y":[0.829]},"o":{"x":[0.206],"y":[0.013]},"s":[-14],"t":85},{"i":{"x":[0.474],"y":[0.581]},"o":{"x":[0.346],"y":[0.6]},"s":[82],"t":128},{"i":{"x":[0.748],"y":[0.537]},"o":{"x":[0.59],"y":[0.621]},"s":[111.156],"t":171},{"i":{"x":[0.719],"y":[1.207]},"o":{"x":[0.325],"y":[1.507]},"s":[140.939],"t":229},{"i":{"x":[0.658],"y":[-2.304]},"o":{"x":[0.268],"y":[-0.246]},"s":[149.301],"t":270},{"i":{"x":[0.824],"y":[0.972]},"o":{"x":[0.472],"y":[0.216]},"s":[170.943],"t":402},{"s":[419.5],"t":474}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.554],"y":[1.061]},"o":{"x":[0.167],"y":[0.167]},"s":[-75],"t":85},{"i":{"x":[0.431],"y":[0.998]},"o":{"x":[0.543],"y":[0.161]},"s":[-2],"t":171},{"i":{"x":[0.484],"y":[0.75]},"o":{"x":[0.448],"y":[-0.001]},"s":[-21],"t":220},{"i":{"x":[0.649],"y":[0.019]},"o":{"x":[0.357],"y":[-0.261]},"s":[7],"t":270},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.449],"y":[0.406]},"s":[-41.814],"t":402},{"s":[-75],"t":431}]},"s":{"a":0,"ix":6,"k":[20,20,100]}},"nm":"skinny fish 2","op":480,"parent":11,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[9.799,-0.668],[5.305,-4.476],[-6.346,-0.784],[-7.617,-0.431],[3.274,1.837]],"o":[[-9.799,0.668],[-5.305,4.476],[8.226,1.016],[23.752,1.343],[-8.565,-4.806]],"v":[[827.651,-889.492],[799.055,-882.726],[812.274,-869.016],[834.748,-873.343],[855.476,-882.087]]}},"mn":"ADBE Vector Shape - Group","nm":"side fin","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-10.607,1.745]],"o":[[7.65,6.434],[0,0]],"v":[[654.1,-885.684],[682.857,-878.995]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-1.151,-1.189],[-0.266,-8.19],[4.624,-6.46]],"o":[[5.7,5.887],[0.287,8.845],[-3.352,4.683]],"v":[[751.734,-916.389],[758.963,-895.845],[751.876,-872.29]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-1.43,-8.147],[-0.041,-3.616],[1.549,-4.99],[3.123,-4.858]],"o":[[5.598,6.09],[0.625,3.561],[0.059,5.225],[-1.549,4.99],[0,0]],"v":[[765.155,-926.346],[775.992,-904.394],[776.837,-893.592],[775.107,-878.079],[767.127,-863.392]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[1.168,0.712],[2.927,-3.333],[-3.049,-4.257],[-1.942,2.968]],"o":[[-5.661,-3.45],[-2.927,3.333],[2.065,2.884],[3.179,-4.86]],"v":[[719.162,-908.297],[704.881,-905.576],[705.58,-889.884],[720.407,-890.887]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"strokes","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-0.719,2.297],[-4.098,-0.144],[-0.938,-8.857],[0.179,-0.175],[0.343,0.012],[2.106,1.262]],"o":[[-0.084,-2.406],[0.93,-2.972],[7.353,0.258],[0.026,0.249],[-0.245,0.24],[-2.6,-0.091],[0,0]],"v":[[911.595,-858.003],[912.87,-865.075],[925.098,-877.106],[926.688,-856.893],[926.401,-856.213],[925.428,-855.981],[910.496,-857.722]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-1.437,2.995],[-3.621,1.097],[-0.208,-3.066],[2.323,-7.496],[4.276,-0.366]],"o":[[-0.184,-1.607],[1.674,-3.489],[2.831,-0.858],[0.394,5.805],[-4.014,-1.518],[0,0]],"v":[[940.958,-854.479],[946.503,-868.088],[952.169,-876.392],[957.483,-868.859],[953.838,-851.79],[941.193,-853.546]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"stripes","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[4.085,2.192],[12.552,-5.891],[13.336,-6.589],[-26.641,-0.837],[-0.164,1.112],[1.694,12.859]],"o":[[-7.985,-4.284],[-22.297,10.465],[0,0],[1.033,0.032],[1.297,-8.801],[-0.605,-4.596]],"v":[[861.485,-970.966],[823.948,-966.859],[787.664,-941.411],[862.382,-927.682],[867.203,-930.949],[868.964,-958.995]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"top fin","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[13.747,14.156],[48.014,5.637],[8.11,-43.35],[-49,21],[-24.346,-6.76],[-2.343,9.762]],"o":[[-12.769,-0.468],[-50.652,-5.946],[-8.11,43.35],[47.498,-20.356],[4.998,-8.401],[5.544,-20.327]],"v":[[950.912,-927.04],[771.386,-942.903],[653.742,-884.219],[817,-842],[959.831,-849.643],[971.5,-876.5]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"body","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-10.08,-8.253],[-2.161,1.189],[-18.243,10.28],[-0.744,10.463],[33.849,-8.167]],"o":[[10.08,8.253],[1.188,0.973],[15.458,-8.506],[7.85,-4.424],[-34.624,-3.694],[0,0]],"v":[[824.518,-847.929],[854.758,-823.171],[865.644,-822.867],[923,-835.748],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[0.711,0.627],[3.128,3.395]],"o":[[-0.879,0.355],[-3.464,-3.051],[0,0]],"v":[[861.249,-839.244],[858.723,-840.178],[848.826,-849.855]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[2.648,3.494]],"o":[[-2.511,-3.593],[0,0]],"v":[[874.064,-842.548],[866.326,-853.179]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[3.056,3.987]],"o":[[-4.994,-1.88],[0,0]],"v":[[896.994,-845.87],[885.961,-855.024]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"strokes","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-2.637,1.451],[-16.645,13.123],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[18.865,-10.381],[8.017,-6.321],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[853.425,-823.805],[866.711,-823.434],[922.584,-835.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[880.505,-836.038]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[880.505,-836.038]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"bottom fin","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-11.896,-3.394],[-0.703,5.898],[2.616,3.135],[5.418,-0.657],[4.597,-0.557]],"o":[[5.855,10.897],[3.104,0.886],[0.455,-3.817],[-0.461,-0.553],[-4.597,0.557],[0,0]],"v":[[761.339,-841.698],[797.453,-809.184],[813.703,-814.648],[800.737,-836.049],[775.541,-843.101],[761.751,-841.429]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"bottom fin 2","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-11,53],[9,-14],[0.702,0.026],[5.544,-20.327],[4.998,-8.401],[-0.674,-0.215],[9.099,33.797],[17,12]],"o":[[11,-53],[0,0],[13.747,14.156],[-2.343,9.762],[0.77,0.214],[22,7],[-5.25,-19.5],[-17,-12]],"v":[[1028,-928],[952,-927],[950.912,-927.04],[971.5,-876.5],[959.831,-849.643],[962,-849],[1032.75,-844.25],[1006,-885]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"tail","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":13,"ip":60,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.833],"y":[0.831]},"o":{"x":[0.167],"y":[0.167]},"s":[600],"t":60},{"i":{"x":[0.833],"y":[0.847]},"o":{"x":[0.167],"y":[0.164]},"s":[384],"t":120},{"i":{"x":[0.834],"y":[0.897]},"o":{"x":[0.167],"y":[0.195]},"s":[213],"t":166},{"i":{"x":[0.743],"y":[0.725]},"o":{"x":[0.287],"y":[0.507]},"s":[131],"t":194},{"i":{"x":[0.723],"y":[0.577]},"o":{"x":[0.167],"y":[0.124]},"s":[43],"t":280},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.543],"y":[0.373]},"s":[-120],"t":390},{"s":[-239],"t":426}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.84],"y":[1.468]},"o":{"x":[0.167],"y":[0.167]},"s":[91.5],"t":60},{"i":{"x":[0.543],"y":[0.956]},"o":{"x":[0.406],"y":[0.264]},"s":[68.5],"t":120},{"i":{"x":[0.545],"y":[0.672]},"o":{"x":[0.416],"y":[-0.058]},"s":[147.5],"t":166},{"i":{"x":[0.566],"y":[0.281]},"o":{"x":[0.231],"y":[-2.412]},"s":[114.5],"t":194},{"i":{"x":[0.841],"y":[-0.356]},"o":{"x":[0.376],"y":[0.238]},"s":[121.5],"t":280},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.437],"y":[0.132]},"s":[144.978],"t":390},{"s":[361.5],"t":426}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[9],"t":100},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-14],"t":120},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-34],"t":135},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-15],"t":160},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[23],"t":175},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[4],"t":205},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-19],"t":225},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-11],"t":270},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-4],"t":280},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-14],"t":375},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-52],"t":395},{"s":[-68],"t":426}]},"s":{"a":0,"ix":6,"k":[20,20,100]}},"nm":"skinny fish 3","op":540,"parent":11,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[7.628,-0.52],[4.13,-3.484],[-4.941,-0.61],[-5.93,-0.335],[2.549,1.43]],"o":[[-7.628,0.52],[-4.13,3.484],[6.404,0.791],[18.491,1.046],[-6.668,-3.741]],"v":[[840.79,-895.973],[818.529,-890.705],[828.819,-880.032],[846.315,-883.401],[862.451,-890.208]]}},"mn":"ADBE Vector Shape - Group","nm":"side fin","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.703,-2.695]],"o":[[5.964,2.798],[0,0]],"v":[[730.536,-889.298],[749.203,-880.805]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-0.854,-4.863],[-0.024,-2.158],[0.925,-2.979],[1.864,-2.9]],"o":[[3.342,3.635],[0.373,2.126],[0.035,3.119],[-0.925,2.979],[0,0]],"v":[[796.83,-913.571],[803.299,-900.466],[803.803,-894.018],[802.77,-884.758],[798.007,-875.991]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[1.377,0.839],[3.45,-3.928],[-3.594,-5.018],[-2.289,3.499]],"o":[[-6.673,-4.067],[-3.45,3.928],[2.435,3.399],[3.747,-5.729]],"v":[[775.785,-909.909],[758.95,-906.703],[759.775,-888.204],[777.253,-889.387]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"strokes","np":5,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"top fin","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"body","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-6.017,-4.926],[-1.29,0.71],[-10.89,6.137],[-0.444,6.246],[20.206,-4.875]],"o":[[6.017,4.926],[0.709,0.581],[9.227,-5.077],[4.686,-2.641],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.76],[850.318,-851.981],[856.816,-851.799],[891.054,-859.489],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"strokes","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[880.505,-836.038]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[880.505,-836.038]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"bottom fin","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"bottom fin 2","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"tail","np":3,"ty":"gr"}],"sr":1,"st":60,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":14,"ip":110,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.658],"y":[0.223]},"o":{"x":[0.255],"y":[0.072]},"s":[551.022],"t":110},{"i":{"x":[0.525],"y":[0.902]},"o":{"x":[0.433],"y":[0.234]},"s":[507.146],"t":159},{"i":{"x":[0.689],"y":[0.099]},"o":{"x":[0.357],"y":[0.154]},"s":[315.313],"t":210},{"i":{"x":[0.793],"y":[0.396]},"o":{"x":[0.445],"y":[1.113]},"s":[117.343],"t":320},{"i":{"x":[0.765],"y":[0.825]},"o":{"x":[0.378],"y":[0.57]},"s":[-103.549],"t":426},{"s":[-261],"t":465}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.838],"y":[0.733]},"o":{"x":[0.353],"y":[-0.056]},"s":[53.082],"t":110},{"i":{"x":[0.523],"y":[0.849]},"o":{"x":[0.258],"y":[0.398]},"s":[92.636],"t":159},{"i":{"x":[0.617],"y":[1.101]},"o":{"x":[0.236],"y":[0.17]},"s":[136.519],"t":210},{"i":{"x":[0.854],"y":[0.104]},"o":{"x":[0.431],"y":[-0.086]},"s":[178.068],"t":320},{"i":{"x":[0.826],"y":[0.659]},"o":{"x":[0.721],"y":[0.484]},"s":[231],"t":426},{"s":[408.5],"t":465}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.667],"y":[0.801]},"o":{"x":[0.436],"y":[-0.031]},"s":[-47.266],"t":110},{"i":{"x":[0.626],"y":[1.734]},"o":{"x":[0.456],"y":[0.405]},"s":[-16.016],"t":180},{"i":{"x":[0.721],"y":[0.411]},"o":{"x":[0.417],"y":[-3.306]},"s":[-6.996],"t":210},{"i":{"x":[0.609],"y":[0.219]},"o":{"x":[0.171],"y":[-0.097]},"s":[1.932],"t":330},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.577],"y":[0.294]},"s":[-24.672],"t":426},{"s":[-67],"t":465}]},"s":{"a":0,"ix":6,"k":[20,20,100]}},"nm":"skinny fish","op":479,"parent":11,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-5.885,-2.501],[-2.649,0.801],[-7.066,2.137],[1.003,0.797],[9.799,-0.668],[9.34,-3.038]],"o":[[5.648,2.998],[7.539,3.203],[7.066,-2.137],[0.437,-0.132],[-7.691,-6.108],[-9.799,0.668],[0,0]],"v":[[799.829,-882.761],[816.774,-873.766],[834.248,-871.843],[855.446,-878.255],[855.476,-882.087],[827.651,-889.492],[799.055,-882.726]]}},"mn":"ADBE Vector Shape - Group","nm":"side fin","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-13.462,8.788]],"o":[[14.395,7.157],[0,0]],"v":[[656.185,-861.497],[702.192,-864.19]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-1.282,-1.047],[-1.805,-7.993],[1.328,-5.604],[4.964,-2.92]],"o":[[1.647,0.164],[6.347,5.182],[1.269,5.618],[-1.328,5.604],[0,0]],"v":[[741.128,-910.099],[745.514,-907.933],[757.279,-886.867],[757.692,-869.744],[748.111,-855.928]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-2.37,-7.925],[11.09,-8.096]],"o":[[6.27,5.395],[1.036,3.464],[0,0]],"v":[[761.742,-914.83],[775.064,-894.291],[769.785,-854.654]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[1.227,0.716],[2.617,-3.793],[-7.25,-4.54],[-3.304,1.802]],"o":[[-3.98,-2.322],[-2.617,3.793],[3.123,1.956],[8.943,-4.877]],"v":[[716.127,-890.785],[703.94,-887.704],[706.562,-871.596],[717.557,-872.741]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"strokes","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-8.817,3.007],[-0.061,-0.952],[0.247,-5.866],[0.152,-0.17],[0.243,-0.026],[6.947,-0.738]],"o":[[2.096,-9.313],[4.291,-1.463],[0.377,5.859],[-0.01,0.228],[-0.163,0.182],[-6.947,0.738],[0,0]],"v":[[874.796,-856.081],[890.647,-879.099],[895.268,-875.519],[895.463,-857.914],[895.283,-857.268],[894.611,-857.023],[873.77,-854.81]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0.669,-0.239],[1.711,-2.601],[-0.084,-2.406],[-2.453,-0.086],[-2.6,-0.091],[-0.245,0.24],[-0.05,0.245],[0.377,6.21]],"o":[[-2.932,1.048],[-1.711,2.601],[0,0],[2.6,0.091],[0.343,0.012],[0.179,-0.175],[1.236,-6.097],[-0.105,-1.728]],"v":[[923.637,-879.497],[916.598,-873.606],[911.595,-858.003],[918.566,-857.192],[925.428,-855.981],[926.401,-856.213],[926.688,-856.893],[927.984,-875.458]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0.441,-0.193],[1.674,-3.489],[-0.184,-1.607],[-4.014,-1.518],[1.642,6.797]],"o":[[-3.544,1.554],[-1.437,2.995],[0,0],[2.323,-7.496],[-0.424,-1.756]],"v":[[953.669,-876.892],[946.503,-868.088],[940.958,-854.479],[953.838,-851.79],[957.983,-873.609]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"stripes","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-22.326,10.403],[-0.605,-4.596],[4.479,-12.172],[1.033,0.032],[26.641,0.837]],"o":[[15.167,-19.407],[23.239,-10.828],[1.694,12.859],[-0.388,1.055],[-26.641,-0.837],[0,0]],"v":[[782.341,-932.416],[837.948,-980.359],[871.464,-969.245],[867.203,-930.949],[862.382,-927.682],[782.458,-930.192]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"top fin","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[13.747,14.156],[48.343,0],[3,-44],[-49,21],[-24.346,-6.76],[-2.343,9.762]],"o":[[-12.769,-0.468],[-51,0],[-3,44],[47.498,-20.356],[4.998,-8.401],[5.544,-20.327]],"v":[[950.912,-927.04],[766,-932],[656,-860],[817,-842],[959.831,-849.643],[971.5,-876.5]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"body","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-1.831,-0.397],[-2.637,1.451],[-21.399,-2.398],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[2.942,0.637],[18.865,-10.381],[-7.015,-7.798],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[861.425,-816.555],[866.231,-813.748],[874.711,-816.184],[937.084,-828.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[0.868,0.765],[3.818,4.143]],"o":[[-1.073,0.433],[-4.228,-3.724],[0,0]],"v":[[869.347,-836.172],[866.264,-837.311],[854.185,-849.122]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[3.231,4.264]],"o":[[-3.064,-4.385],[0,0]],"v":[[884.987,-840.204],[875.543,-853.179]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[3.056,3.987]],"o":[[-3.056,-3.987],[0,0]],"v":[[901.378,-844.564],[892.211,-856.524]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"strokes","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-1.831,-0.397],[-2.637,1.451],[-21.399,-2.398],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[2.942,0.637],[18.865,-10.381],[-7.015,-7.798],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[861.425,-816.555],[866.231,-813.748],[874.711,-816.184],[937.084,-828.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[880.505,-836.038]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[880.505,-836.038]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"bottom fin","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.035,-2.859],[-0.602,3.172],[2.616,3.135],[0.654,0.302],[0.681,-0.01],[5.304,-1.284],[4.501,-1.089]],"o":[[7.086,10.14],[9.984,2.372],[0.717,-3.776],[-0.461,-0.553],[-0.619,-0.286],[-5.457,0.077],[-4.501,1.089],[0,0]],"v":[[767.821,-830.314],[797.453,-809.184],[813.703,-814.648],[801.487,-834.299],[799.888,-835.724],[797.882,-836.015],[781.763,-833.363],[768.261,-830.095]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"bottom fin 2","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-11,53],[9,-14],[0.702,0.026],[5.544,-20.327],[4.998,-8.401],[-0.674,-0.215],[0,35],[17,12]],"o":[[11,-53],[0,0],[13.747,14.156],[-2.343,9.762],[0.77,0.214],[22,7],[0,-35],[-17,-12]],"v":[[1038.625,-941.188],[952,-927],[950.912,-927.04],[971.5,-876.5],[959.831,-849.643],[962,-849],[1043,-832.75],[1006,-885]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"tail","np":3,"ty":"gr"}],"sr":1,"st":-1,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":15,"ip":137,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.83],"y":[0.874]},"o":{"x":[0.186],"y":[0.266]},"s":[558.5],"t":138},{"i":{"x":[0.832],"y":[0.65]},"o":{"x":[0.258],"y":[0.346]},"s":[421.438],"t":189},{"i":{"x":[0.584],"y":[0.701]},"o":{"x":[0.48],"y":[0.432]},"s":[267.562],"t":293},{"i":{"x":[0.556],"y":[0.587]},"o":{"x":[0.217],"y":[0.322]},"s":[174.972],"t":320},{"i":{"x":[0.816],"y":[0.6]},"o":{"x":[0.486],"y":[0.218]},"s":[70.592],"t":383},{"i":{"x":[0.822],"y":[1.009]},"o":{"x":[0.382],"y":[0.67]},"s":[-118.136],"t":438},{"s":[-190.5],"t":455}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.678],"y":[0.52]},"o":{"x":[0.012],"y":[-0.026]},"s":[114],"t":138},{"i":{"x":[0.881],"y":[1.274]},"o":{"x":[0.283],"y":[0.697]},"s":[97.773],"t":189},{"i":{"x":[0.552],"y":[0.324]},"o":{"x":[0.493],"y":[0.224]},"s":[77.739],"t":293},{"i":{"x":[0.553],"y":[0.763]},"o":{"x":[0.253],"y":[0.485]},"s":[104.163],"t":320},{"i":{"x":[0.845],"y":[0.394]},"o":{"x":[0.479],"y":[0.231]},"s":[152.723],"t":383},{"i":{"x":[0.965],"y":[0.829]},"o":{"x":[0.524],"y":[0.157]},"s":[199.341],"t":438},{"s":[387],"t":455}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.312],"y":[0.708]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":138},{"i":{"x":[0.75],"y":[4.983]},"o":{"x":[0.333],"y":[3.814]},"s":[7],"t":165},{"i":{"x":[0.626],"y":[0.814]},"o":{"x":[0.444],"y":[0.146]},"s":[7],"t":269},{"i":{"x":[0.64],"y":[-0.475]},"o":{"x":[0.336],"y":[-0.66]},"s":[-28.491],"t":345},{"i":{"x":[0.696],"y":[-1.301]},"o":{"x":[0.447],"y":[-1.322]},"s":[-24],"t":383},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.514],"y":[0.226]},"s":[-33],"t":438},{"s":[-81],"t":455}]},"s":{"a":0,"ix":6,"k":[24,24,100]}},"nm":"skinny fish 5","op":490,"parent":11,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[13.747,14.156],[48.014,5.637],[8.11,-43.35],[-49,21],[-24.346,-6.76],[-2.343,9.762]],"o":[[-12.769,-0.468],[-50.652,-5.946],[-8.11,43.35],[47.498,-20.356],[4.998,-8.401],[5.544,-20.327]],"v":[[950.912,-927.04],[771.386,-942.903],[653.742,-884.219],[817,-842],[959.831,-849.643],[971.5,-876.5]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[4.085,2.192],[12.552,-5.891],[13.336,-6.589],[-26.641,-0.837],[-0.164,1.112],[1.694,12.859]],"o":[[-7.985,-4.284],[-22.297,10.465],[0,0],[1.033,0.032],[1.297,-8.801],[-0.605,-4.596]],"v":[[861.485,-970.966],[823.948,-966.859],[787.664,-941.411],[862.382,-927.682],[867.203,-930.949],[868.964,-958.995]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-2.637,1.451],[-16.645,13.123],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[18.865,-10.381],[8.017,-6.321],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[853.425,-823.805],[866.711,-823.434],[922.584,-835.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-11.896,-3.394],[-0.703,5.898],[2.616,3.135],[5.418,-0.657],[4.597,-0.557]],"o":[[5.855,10.897],[3.104,0.886],[0.455,-3.817],[-0.461,-0.553],[-4.597,0.557],[0,0]],"v":[[761.339,-841.698],[797.453,-809.184],[813.703,-814.648],[800.737,-836.049],[775.541,-843.101],[761.751,-841.429]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-11,53],[9,-14],[0.702,0.026],[5.544,-20.327],[4.998,-8.401],[-0.674,-0.215],[9.099,33.797],[17,12]],"o":[[11,-53],[0,0],[13.747,14.156],[-2.343,9.762],[0.77,0.214],[22,7],[-5.25,-19.5],[-17,-12]],"v":[[1028,-928],[952,-927],[950.912,-927.04],[971.5,-876.5],[959.831,-849.643],[962,-849],[1032.75,-844.25],[1006,-885]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.10122525692,0.453768372536,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"body","np":6,"ty":"gr"}],"sr":1,"st":10,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":16,"ip":164,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.636],"y":[0.533]},"o":{"x":[0.437],"y":[-0.028]},"s":[554.5],"t":165},{"i":{"x":[0.702],"y":[0.775]},"o":{"x":[0.218],"y":[0.489]},"s":[489.5],"t":197},{"i":{"x":[0.547],"y":[0.172]},"o":{"x":[0.391],"y":[0.22]},"s":[398.687],"t":275},{"i":{"x":[0.675],"y":[0.686]},"o":{"x":[0.467],"y":[0.377]},"s":[261.522],"t":363},{"i":{"x":[0.91],"y":[0.733]},"o":{"x":[0.602],"y":[0.517]},"s":[14.121],"t":433},{"s":[-105],"t":463}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.528],"y":[0.883]},"o":{"x":[0.019],"y":[0.109]},"s":[93.5],"t":165},{"i":{"x":[0.825],"y":[0.718]},"o":{"x":[0.337],"y":[-0.424]},"s":[131.618],"t":197},{"i":{"x":[0.593],"y":[1.128]},"o":{"x":[0.227],"y":[0.593]},"s":[113.534],"t":274},{"i":{"x":[0.755],"y":[0.2]},"o":{"x":[0.35],"y":[0.014]},"s":[100.612],"t":363},{"i":{"x":[0.965],"y":[0.734]},"o":{"x":[0.435],"y":[0.203]},"s":[179.675],"t":433},{"s":[416.5],"t":463}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.36],"y":[0.75]},"o":{"x":[0.167],"y":[0.167]},"s":[-68.187],"t":165},{"i":{"x":[0.764],"y":[1.019]},"o":{"x":[0.312],"y":[1.086]},"s":[3.142],"t":210},{"i":{"x":[0.834],"y":[0.72]},"o":{"x":[0.167],"y":[0.014]},"s":[14.676],"t":275},{"i":{"x":[0.836],"y":[0.737]},"o":{"x":[0.468],"y":[0.286]},"s":[-0.577],"t":363},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.402],"y":[0.319]},"s":[-20.685],"t":405},{"s":[-64.207],"t":450}]},"s":{"a":0,"ix":6,"k":[19,19,100]}},"nm":"skinny fish 6","op":546,"parent":11,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.10122525692,0.453768372536,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":66,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":17,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.604],"y":[0.387]},"o":{"x":[0.353],"y":[0.242]},"s":[543.5],"t":195},{"i":{"x":[0.607],"y":[0.388]},"o":{"x":[0.318],"y":[0.132]},"s":[520.321],"t":237},{"i":{"x":[0.689],"y":[0.738]},"o":{"x":[0.306],"y":[0.265]},"s":[401.118],"t":295},{"i":{"x":[0.777],"y":[0.799]},"o":{"x":[0.475],"y":[0.515]},"s":[260.778],"t":333},{"i":{"x":[0.806],"y":[0.95]},"o":{"x":[0.564],"y":[0.688]},"s":[39.853],"t":410},{"s":[-95.5],"t":474}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.831],"y":[0.761]},"o":{"x":[0.533],"y":[0.308]},"s":[127.5],"t":195},{"i":{"x":[0.64],"y":[-0.541]},"o":{"x":[0.396],"y":[-1.016]},"s":[141.81],"t":237},{"i":{"x":[0.526],"y":[0.505]},"o":{"x":[0.344],"y":[0.335]},"s":[130.868],"t":295},{"i":{"x":[0.712],"y":[-0.181]},"o":{"x":[0.407],"y":[-0.87]},"s":[99.351],"t":333},{"i":{"x":[0.983],"y":[0.512]},"o":{"x":[0.345],"y":[0.153]},"s":[130.629],"t":410},{"s":[371],"t":474}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.625],"y":[0.799]},"o":{"x":[0.311],"y":[0.365]},"s":[-38.306],"t":195},{"i":{"x":[0.705],"y":[1.614]},"o":{"x":[0.291],"y":[1.098]},"s":[6.433],"t":263},{"i":{"x":[0.667],"y":[0.679]},"o":{"x":[0.642],"y":[0.119]},"s":[15.02],"t":355},{"i":{"x":[0.705],"y":[0.534]},"o":{"x":[0.364],"y":[0.833]},"s":[-21.72],"t":390},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.819],"y":[0.357]},"s":[-45.597],"t":444},{"s":[-87.188],"t":470}]},"s":{"a":0,"ix":6,"k":[15,15,100]}},"nm":"skinny fish 4","op":480,"parent":11,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.10122525692,0.453768372536,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":19,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[11.81,62.175,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[-1349.362,99.226,0],"t":15,"ti":[-1.038,5.415,0],"to":[0.165,-3.508,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[-1348.369,78.178,0],"t":30,"ti":[-0.229,-0.023,0],"to":[1.038,-5.415,0]},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1343.133,66.738,0],"t":125,"ti":[0.644,-1.93,0],"to":[0.229,0.023,0]},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[-1346.994,78.317,0],"t":141,"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[-1346.994,78.317,0],"t":203,"ti":[0.395,-3.485,0],"to":[0.644,-1.93,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[-1343.133,66.738,0],"t":218,"ti":[0.841,-6.841,0],"to":[-0.395,3.485,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[-1349.362,99.226,0],"t":240,"ti":[-1.038,5.415,0],"to":[-0.841,6.841,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1348.178,107.783,0],"t":300,"ti":[-0.197,4.911,0],"to":[1.038,-5.415,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[-1343.133,66.738,0],"t":313,"ti":[1.038,-5.415,0],"to":[0.197,-4.911,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1346.994,78.317,0],"t":435,"ti":[0.395,-3.485,0],"to":[-1.038,5.415,0]},{"s":[-1349.362,99.226,0],"t":457}]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.333],"y":[0]},"s":[-18.5],"t":15},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0],"y":[0]},"s":[-11.5],"t":30},{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"s":[0.5],"t":125},{"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]},"s":[-3.5],"t":141},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.45],"y":[0]},"s":[-3.5],"t":203},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.333],"y":[0]},"s":[0.5],"t":218},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"s":[-18.5],"t":240},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"s":[-21.5],"t":300},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0],"y":[0]},"s":[0.5],"t":313},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"s":[-3.5],"t":435},{"s":[-18.5],"t":457}]},"s":{"a":0,"ix":6,"k":[175,175,100]}},"nm":"Lamp beam","op":480,"parent":21,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-3.37,0.521],[-3.246,6.411],[7.763,7.942],[4.893,3.328]],"o":[[5.183,-0.801],[3.201,-6.323],[-3.352,-3.43],[-1.784,-1.213]],"v":[[-28.876,88],[-12.863,76.489],[-15.825,44.236],[-22.403,39.079]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-3.792,1.23],[0.125,3.25],[2.125,3.375],[2.25,0.98]],"o":[[4.625,-1.5],[-0.125,-3.25],[-2.125,-3.375],[-1.834,-0.799]],"v":[[-49.375,88.895],[-42.875,71.27],[-47.125,48.145],[-53,42.895]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-3.792,1.23],[0.125,3.25],[2.125,3.375],[2.25,0.98]],"o":[[4.625,-1.5],[-0.125,-3.25],[-2.125,-3.375],[-1.834,-0.799]],"v":[[-49.375,88.895],[-42.875,71.27],[-47.125,48.145],[-53,42.895]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-2.852,1.23],[0.094,3.25],[1.598,3.375],[1.692,0.98]],"o":[[3.478,-1.5],[-0.094,-3.25],[-1.598,-3.375],[-1.379,-0.799]],"v":[[-52.057,89.048],[-47.168,71.423],[-50.364,48.298],[-54.783,43.048]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[-1.719,1.23],[0.057,3.25],[0.963,3.375],[1.02,0.98]],"o":[[2.097,-1.5],[-0.057,-3.25],[-0.963,-3.375],[-0.831,-0.799]],"v":[[-54.794,89.048],[-51.848,71.423],[-53.774,48.298],[-56.438,43.048]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-3.792,1.23],[0.125,3.25],[2.125,3.375],[2.25,0.98]],"o":[[4.625,-1.5],[-0.125,-3.25],[-2.125,-3.375],[-1.834,-0.799]],"v":[[-49.375,88.895],[-42.875,71.27],[-47.125,48.145],[-53,42.895]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-3.37,0.521],[-3.246,6.411],[7.763,7.942],[4.893,3.328]],"o":[[5.183,-0.801],[3.201,-6.323],[-3.352,-3.43],[-1.784,-1.213]],"v":[[-28.876,88],[-12.863,76.489],[-15.825,44.236],[-22.403,39.079]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-3.652,0.521],[-3.517,6.411],[8.412,7.942],[5.302,3.328]],"o":[[5.616,-0.801],[3.469,-6.323],[-3.633,-3.43],[-1.933,-1.213]],"v":[[-19.704,87.813],[-4.834,76.764],[-8.043,44.51],[-15.172,39.353]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-3.792,1.23],[0.125,3.25],[2.125,3.375],[2.25,0.98]],"o":[[4.625,-1.5],[-0.125,-3.25],[-2.125,-3.375],[-1.834,-0.799]],"v":[[-49.375,88.895],[-42.875,71.27],[-47.125,48.145],[-53,42.895]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-1.719,1.23],[0.057,3.25],[0.963,3.375],[1.02,0.98]],"o":[[2.097,-1.5],[-0.057,-3.25],[-0.963,-3.375],[-0.831,-0.799]],"v":[[-54.794,89.048],[-51.848,71.423],[-53.774,48.298],[-56.438,43.048]]}],"t":435},{"s":[{"c":false,"i":[[-3.37,0.521],[-3.246,6.411],[7.763,7.942],[4.893,3.328]],"o":[[5.183,-0.801],[3.201,-6.323],[-3.352,-3.43],[-1.784,-1.213]],"v":[[-28.876,88],[-12.863,76.489],[-15.825,44.236],[-22.403,39.079]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.901960790157,0.623529434204,0.117647059262,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":2}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"beam circle line 1","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[4.239,0.723],[0.538,-3.467],[-7.243,-5.712],[-2.157,0]],"o":[[-18.623,-3.177],[-0.795,5.126],[5.44,4.29],[2.157,0]],"v":[[-23.56,38.546],[-48.09,58.521],[-41.046,83.153],[-28.141,88.094]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[3.747,-1.36],[-0.125,-3.25],[-3.375,-4.75],[-2,0]],"o":[[-6.308,2.29],[0.125,3.25],[2.31,3.251],[2,0]],"v":[[-56.178,42.815],[-63.625,61.625],[-59.125,85],[-50.625,89.125]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[3.747,-1.36],[-0.125,-3.25],[-3.375,-4.75],[-2,0]],"o":[[-6.308,2.29],[0.125,3.25],[2.31,3.251],[2,0]],"v":[[-56.178,42.815],[-63.625,61.625],[-59.125,85],[-50.625,89.125]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[2.818,-1.36],[-0.094,-3.25],[-2.538,-4.75],[-1.504,0]],"o":[[-4.744,2.29],[0.094,3.25],[1.737,3.251],[1.504,0]],"v":[[-57.173,42.968],[-62.774,61.777],[-59.39,85.152],[-52.997,89.277]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[1.699,-1.36],[-0.057,-3.25],[-1.53,-4.75],[-0.907,0]],"o":[[-2.86,2.29],[0.057,3.25],[1.047,3.251],[0.907,0]],"v":[[-57.878,42.968],[-61.254,61.777],[-59.214,85.152],[-55.361,89.277]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[3.747,-1.36],[-0.125,-3.25],[-3.375,-4.75],[-2,0]],"o":[[-6.308,2.29],[0.125,3.25],[2.31,3.251],[2,0]],"v":[[-56.178,42.815],[-63.625,61.625],[-59.125,85],[-50.625,89.125]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[4.239,0.723],[0.538,-3.467],[-7.243,-5.712],[-2.157,0]],"o":[[-18.623,-3.177],[-0.795,5.126],[5.44,4.29],[2.157,0]],"v":[[-23.56,38.546],[-48.09,58.521],[-41.046,83.153],[-28.141,88.094]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[4.593,0.723],[0.582,-3.467],[-7.849,-5.712],[-2.338,0]],"o":[[-20.18,-3.177],[-0.861,5.126],[5.895,4.29],[2.338,0]],"v":[[-16.426,38.82],[-43.007,58.795],[-35.373,83.427],[-21.39,88.368]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[3.747,-1.36],[-0.125,-3.25],[-3.375,-4.75],[-2,0]],"o":[[-6.308,2.29],[0.125,3.25],[2.31,3.251],[2,0]],"v":[[-56.178,42.815],[-63.625,61.625],[-59.125,85],[-50.625,89.125]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[1.699,-1.36],[-0.057,-3.25],[-1.53,-4.75],[-0.907,0]],"o":[[-2.86,2.29],[0.057,3.25],[1.047,3.251],[0.907,0]],"v":[[-57.878,42.968],[-61.254,61.777],[-59.214,85.152],[-55.361,89.277]]}],"t":435},{"s":[{"c":false,"i":[[4.239,0.723],[0.538,-3.467],[-7.243,-5.712],[-2.157,0]],"o":[[-18.623,-3.177],[-0.795,5.126],[5.44,4.29],[2.157,0]],"v":[[-23.56,38.546],[-48.09,58.521],[-41.046,83.153],[-28.141,88.094]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[1,1,1,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":2}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"inside highlight line","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[8.83,-3.254],[-0.167,-6.223],[-7.719,-5.279],[-1.393,5.668],[5.886,6.151]],"o":[[-7.142,2.632],[0.293,10.895],[9.236,6.316],[2.192,-8.916],[-1.977,-2.067]],"v":[[-29.938,43.275],[-41.414,63.345],[-31.975,84.648],[-12.044,70.86],[-15.763,46.021]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.895,0.487],[0,-5.772],[-4.25,0.25],[-0.625,5.375],[0.375,2.625]],"o":[[-6,-0.75],[0,8.125],[3.283,-0.193],[0.625,-5.375],[-0.375,-2.625]],"v":[[-49.125,48.375],[-56,66.25],[-47.25,86],[-43.875,75.5],[-45.5,55.25]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.895,0.487],[0,-5.772],[-4.25,0.25],[-0.625,5.375],[0.375,2.625]],"o":[[-6,-0.75],[0,8.125],[3.283,-0.193],[0.625,-5.375],[-0.375,-2.625]],"v":[[-49.125,48.375],[-56,66.25],[-47.25,86],[-43.875,75.5],[-45.5,55.25]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.929,0.487],[0,-5.772],[-3.196,0.25],[-0.47,5.375],[0.282,2.625]],"o":[[-4.513,-0.75],[0,8.125],[2.469,-0.193],[0.47,-5.375],[-0.282,-2.625]],"v":[[-51.869,48.527],[-57.039,66.402],[-50.458,86.152],[-47.92,75.652],[-49.142,55.402]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[1.766,0.487],[0,-5.772],[-1.927,0.25],[-0.283,5.375],[0.17,2.625]],"o":[[-2.72,-0.75],[0,8.125],[1.488,-0.193],[0.283,-5.375],[-0.17,-2.625]],"v":[[-54.681,48.527],[-57.798,66.402],[-53.831,86.152],[-52.301,75.652],[-53.038,55.402]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[3.895,0.487],[0,-5.772],[-4.25,0.25],[-0.625,5.375],[0.375,2.625]],"o":[[-6,-0.75],[0,8.125],[3.283,-0.193],[0.625,-5.375],[-0.375,-2.625]],"v":[[-49.125,48.375],[-56,66.25],[-47.25,86],[-43.875,75.5],[-45.5,55.25]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[8.83,-3.254],[-0.167,-6.223],[-7.719,-5.279],[-1.393,5.668],[5.886,6.151]],"o":[[-7.142,2.632],[0.293,10.895],[9.236,6.316],[2.192,-8.916],[-1.977,-2.067]],"v":[[-29.938,43.275],[-41.414,63.345],[-31.975,84.648],[-12.044,70.86],[-15.763,46.021]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[10.629,-3.254],[-0.201,-6.223],[-9.29,-5.279],[-1.677,5.668],[7.085,6.151]],"o":[[-8.596,2.632],[0.353,10.895],[11.117,6.316],[2.638,-8.916],[-2.38,-2.067]],"v":[[-25.748,43.549],[-39.56,63.619],[-28.2,84.922],[-4.209,71.134],[-8.686,46.296]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.895,0.487],[0,-5.772],[-4.25,0.25],[-0.625,5.375],[0.375,2.625]],"o":[[-6,-0.75],[0,8.125],[3.283,-0.193],[0.625,-5.375],[-0.375,-2.625]],"v":[[-49.125,48.375],[-56,66.25],[-47.25,86],[-43.875,75.5],[-45.5,55.25]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.766,0.487],[0,-5.772],[-1.927,0.25],[-0.283,5.375],[0.17,2.625]],"o":[[-2.72,-0.75],[0,8.125],[1.488,-0.193],[0.283,-5.375],[-0.17,-2.625]],"v":[[-54.681,48.527],[-57.798,66.402],[-53.831,86.152],[-52.301,75.652],[-53.038,55.402]]}],"t":435},{"s":[{"c":true,"i":[[8.83,-3.254],[-0.167,-6.223],[-7.719,-5.279],[-1.393,5.668],[5.886,6.151]],"o":[[-7.142,2.632],[0.293,10.895],[9.236,6.316],[2.192,-8.916],[-1.977,-2.067]],"v":[[-29.938,43.275],[-41.414,63.345],[-31.975,84.648],[-12.044,70.86],[-15.763,46.021]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[1,1,1,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"bulb","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.854,-4.315],[0.17,-6.492],[-6.863,-6.586],[-3.236,1.079],[0.539,11.596],[4.601,4.245]],"o":[[-4.342,3.859],[-0.251,9.576],[3.588,3.443],[3.236,-1.079],[-0.377,-8.099],[-3.909,-3.606]],"v":[[-38.034,41.558],[-47.475,59.359],[-41.151,82.942],[-25.218,87.484],[-9.932,62.123],[-17.666,42.58]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.5,-4],[0.5,-6],[-3,-3.5],[-3,1],[0.5,10.75],[1.98,3.366]],"o":[[-4.025,3.578],[-0.5,6],[3,3.5],[3,-1],[-0.349,-7.509],[-2.5,-4.25]],"v":[[-59,44.5],[-63.5,62.5],[-59.125,85.25],[-49.5,89],[-43.5,67],[-47.5,48]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.5,-4],[0.5,-6],[-3,-3.5],[-3,1],[0.5,10.75],[1.98,3.366]],"o":[[-4.025,3.578],[-0.5,6],[3,3.5],[3,-1],[-0.349,-7.509],[-2.5,-4.25]],"v":[[-59,44.5],[-63.5,62.5],[-59.125,85.25],[-49.5,89],[-43.5,67],[-47.5,48]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.384,-4],[0.376,-6],[-2.256,-3.5],[-2.256,1],[0.376,10.75],[1.489,3.366]],"o":[[-3.027,3.578],[-0.376,6],[2.256,3.5],[2.256,-1],[-0.263,-7.509],[-1.88,-4.25]],"v":[[-59.296,44.652],[-62.68,62.652],[-59.39,85.402],[-52.151,89.152],[-47.638,67.152],[-50.646,48.152]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[2.04,-4],[0.227,-6],[-1.36,-3.5],[-1.36,1],[0.227,10.75],[0.898,3.366]],"o":[[-1.825,3.578],[-0.227,6],[1.36,3.5],[1.36,-1],[-0.158,-7.509],[-1.133,-4.25]],"v":[[-59.158,44.652],[-61.198,62.652],[-59.214,85.402],[-54.851,89.152],[-52.131,67.152],[-53.944,48.152]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.5,-4],[0.5,-6],[-3,-3.5],[-3,1],[0.5,10.75],[1.98,3.366]],"o":[[-4.025,3.578],[-0.5,6],[3,3.5],[3,-1],[-0.349,-7.509],[-2.5,-4.25]],"v":[[-59,44.5],[-63.5,62.5],[-59.125,85.25],[-49.5,89],[-43.5,67],[-47.5,48]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.854,-4.315],[0.17,-6.492],[-6.863,-6.586],[-3.236,1.079],[0.539,11.596],[4.601,4.245]],"o":[[-4.342,3.859],[-0.251,9.576],[3.588,3.443],[3.236,-1.079],[-0.377,-8.099],[-3.909,-3.606]],"v":[[-38.034,41.558],[-47.475,59.359],[-41.151,82.942],[-25.218,87.484],[-9.932,62.123],[-17.666,42.58]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.26,-4.315],[0.184,-6.492],[-7.437,-6.586],[-3.507,1.079],[0.584,11.596],[4.986,4.245]],"o":[[-4.705,3.859],[-0.272,9.576],[3.888,3.443],[3.507,-1.079],[-0.408,-8.099],[-4.236,-3.606]],"v":[[-32.11,41.832],[-42.34,59.633],[-35.488,83.216],[-18.222,87.758],[-1.658,62.397],[-10.039,42.854]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.5,-4],[0.5,-6],[-3,-3.5],[-3,1],[0.5,10.75],[1.98,3.366]],"o":[[-4.025,3.578],[-0.5,6],[3,3.5],[3,-1],[-0.349,-7.509],[-2.5,-4.25]],"v":[[-59,44.5],[-63.5,62.5],[-59.125,85.25],[-49.5,89],[-43.5,67],[-47.5,48]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.04,-4],[0.227,-6],[-1.36,-3.5],[-1.36,1],[0.227,10.75],[0.898,3.366]],"o":[[-1.825,3.578],[-0.227,6],[1.36,3.5],[1.36,-1],[-0.158,-7.509],[-1.133,-4.25]],"v":[[-59.158,44.652],[-61.198,62.652],[-59.214,85.402],[-54.851,89.152],[-52.131,67.152],[-53.944,48.152]]}],"t":435},{"s":[{"c":true,"i":[[4.854,-4.315],[0.17,-6.492],[-6.863,-6.586],[-3.236,1.079],[0.539,11.596],[4.601,4.245]],"o":[[-4.342,3.859],[-0.251,9.576],[3.588,3.443],[3.236,-1.079],[-0.377,-8.099],[-3.909,-3.606]],"v":[[-38.034,41.558],[-47.475,59.359],[-41.151,82.942],[-25.218,87.484],[-9.932,62.123],[-17.666,42.58]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[1,0.96862745285,0.443137258291,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"inside cone","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[11.952,5.519],[32.652,-49.597],[4.82,-51.058],[-38.298,-54.1],[-26.103,12.489],[-37.47,18.992],[-28.409,13.772],[-7.944,3.972],[-0.41,10.177],[2.563,3.844],[21.151,12.055],[29.77,16.866]],"o":[[-7.742,-3.575],[-24.883,37.795],[-3.507,37.145],[16.719,23.618],[31.129,-14.893],[36.074,-18.284],[11.12,-5.39],[3.506,-1.753],[0.349,-8.677],[-5.393,-8.09],[-20.23,-11.53],[-40.969,-23.21]],"v":[[-270.04,-114.08],[-339.378,-83.257],[-380.924,43.3],[-352.332,182.436],[-287.86,217.19],[-182.026,166.112],[-64.608,106.562],[-35.327,91.875],[-10.431,70.718],[-13.093,48.577],[-56.434,18.289],[-118.844,-20.929]]}],"t":15},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.091,2.577],[14.242,-41.561],[1.412,-26.122],[-14.791,-25.908],[-6.795,2.442],[-62.476,17.687],[-28.591,7.926],[-7.509,3.754],[-0.387,9.621],[2.422,3.633],[21.153,6.237],[33.536,9.841]],"o":[[-7.814,-1.667],[-8.416,20.001],[-1.303,36.585],[11.132,22.391],[11.888,-4.272],[31.437,-8.9],[10.431,-2.944],[3.314,-1.657],[0.33,-8.202],[-5.098,-7.647],[-22.227,-6.371],[-60.086,-17.632]],"v":[[-353.897,-50.24],[-389.266,-18.891],[-404.513,59.623],[-388.834,158.539],[-351.74,176.907],[-171.538,125.789],[-70.051,97.162],[-44.838,88.498],[-35.526,68.727],[-38.726,48.707],[-73.046,33.791],[-177.387,2.236]]}],"t":22},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[12.137,1.599],[8.12,-38.889],[0.279,-17.83],[-6.975,-16.533],[0,0],[0,0],[-28.651,5.982],[-7.364,3.682],[-0.38,9.435],[2.376,3.564],[21.154,4.303],[12.5,3]],"o":[[-7.838,-1.032],[-2.941,14.084],[-0.57,36.399],[9.274,21.983],[0,0],[0,0],[10.202,-2.13],[3.25,-1.625],[0.324,-8.044],[-5,-7.5],[-22.891,-4.656],[-12.5,-3]],"v":[[-381.781,-29.012],[-405.854,2.511],[-412.357,65.051],[-400.971,150.594],[-372.98,163.512],[-157.491,113.168],[-71.86,94.036],[-48,87.375],[-43.87,68.065],[-47.25,48.75],[-78.679,36.759],[-193.301,15.24]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[10.2,2.065],[9.992,-45.581],[-0.127,-32.035],[-1.989,-4.834],[0,0],[0,0],[-28.651,5.982],[-7.364,3.682],[-0.38,9.435],[2.376,3.564],[21.172,4.214],[12.5,3]],"o":[[-7.748,-1.569],[-3.081,14.054],[0.083,20.896],[4.771,11.597],[0,0],[0,0],[10.202,-2.13],[3.25,-1.625],[0.324,-8.044],[-5,-7.5],[-23.454,-4.668],[-12.5,-3]],"v":[[-341.879,-17.315],[-372.904,16.394],[-376.678,84.672],[-368.055,136.802],[-350.602,157.052],[-155.405,112.011],[-70.138,93.527],[-48,87.375],[-43.87,68.065],[-47.25,48.75],[-78.375,37.25],[-191.387,15.686]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[8.967,0.213],[2.94,-15.953],[1.385,-12.467],[-1.247,-7.871],[0,0],[0,0],[-29.023,3.791],[-8.771,2.67],[-0.38,9.435],[2.376,3.564],[21.408,2.772],[19.06,2.948]],"o":[[-16.195,-3.341],[-2.902,15.748],[-2.409,21.682],[2.873,18.129],[0,0],[0,0],[10.49,-1.37],[3.476,-1.058],[0.324,-8.044],[-5,-7.5],[-20.829,-2.697],[-12.704,-1.965]],"v":[[-454.854,1.408],[-474.586,19.286],[-479.174,60.372],[-475.091,132.115],[-465.612,152.362],[-260.157,121.111],[-78.337,93.057],[-51.698,88.692],[-47.029,68.491],[-50.133,48.876],[-78.876,39.005],[-254.805,22.258]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[17.069,1.595],[0.421,-11.97],[0.346,-10.565],[-0.235,-7.756],[0,0],[0,0],[-33.812,3.951],[-7.364,3.682],[-0.38,9.435],[0.621,2.534],[21.532,1.417],[18.841,0.186]],"o":[[-4.687,6.037],[-0.301,8.562],[-0.513,15.682],[0.493,16.23],[0,0],[0,0],[9.12,-1.066],[3.25,-1.625],[0.324,-8.044],[-2.145,-8.755],[-20.723,-1.364],[-12.854,-0.127]],"v":[[-523.868,2.923],[-528.886,40.486],[-529.665,72.796],[-528.578,114.073],[-523.436,144.13],[-264.147,114.137],[-74.205,91.03],[-54.61,88.053],[-51.548,67.794],[-54.487,48.598],[-80.31,39.514],[-260.583,24.957]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[8.367,0.783],[8.341,-39.765],[-1.243,-18.908],[-6.75,-17.569],[0,0],[0,0],[-28.651,5.982],[-7.364,3.682],[-0.38,9.435],[2.376,3.564],[21.296,3.532],[12.5,3]],"o":[[-7.871,-0.737],[-2.954,14.081],[0.978,14.88],[9.171,23.869],[0,0],[0,0],[10.202,-2.13],[3.25,-1.625],[0.324,-8.044],[-5,-7.5],[-24.339,-4.037],[-12.5,-3]],"v":[[-377.25,-24.328],[-405.061,8.182],[-410.777,80.401],[-398.229,149.08],[-372.818,164.545],[-211.959,126.243],[-69.728,93.248],[-48,87.375],[-43.87,68.065],[-47.25,48.75],[-78.375,37.25],[-235.34,5.574]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[15.05,10.157],[29.468,-27.773],[5.531,-34.275],[-37.378,-53.991],[0,0],[-37.471,18.992],[-28.41,13.772],[-7.943,3.972],[-0.41,10.177],[2.563,3.844],[21.151,12.055],[30.992,19.487]],"o":[[-21.912,-14.788],[-32.569,30.696],[-3.493,21.646],[36.269,52.388],[0,0],[36.074,-18.284],[11.12,-5.391],[3.506,-1.753],[0.349,-8.677],[-5.393,-8.09],[-20.23,-11.53],[-39.862,-25.063]],"v":[[-260.375,-111.383],[-333.415,-95.852],[-387.241,20.902],[-363.65,179.185],[-288.332,218.776],[-182.854,167.102],[-66.321,107.507],[-28.438,88.398],[-10.24,68.674],[-14.491,47.433],[-56.544,18.382],[-163.317,-48.837]]}],"t":240},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.775,9.663],[59.203,-33.692],[16.607,-128.208],[-29.75,-19.69],[-50.491,37.725],[-29.609,20.711],[-24.828,19.502],[-7.195,5.269],[-0.41,10.178],[3.257,3.276],[17.473,13.381],[28.504,21.354]],"o":[[-25.488,-19.279],[-27.86,15.855],[-16.694,128.88],[63.612,42.1],[34.028,-25.424],[37.072,-25.931],[12.423,-9.758],[3.162,-2.316],[0.349,-8.677],[-6.636,-6.675],[-18.487,-14.157],[-38.802,-29.069]],"v":[[-235.681,-127.601],[-362.257,-151.685],[-493.509,53.749],[-411.075,267.823],[-262.456,258.354],[-173.112,196.968],[-62.42,118.434],[-26.421,92.326],[-2.535,69.552],[-5.883,47.592],[-51.247,14.198],[-118.974,-37.626]]}],"t":300},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[51.934,14.554],[15.764,-23.072],[0.441,-31.885],[-22.667,-27.668],[-18.423,5.452],[-50.925,15.469],[-27.942,8.49],[-7.333,3.976],[-0.385,9.573],[2.539,3.51],[20.538,5.64],[34.191,9.804]],"o":[[-16.201,-4.54],[-17.989,26.329],[-0.494,35.765],[12.176,14.862],[50.487,-14.94],[30.686,-9.321],[10.614,-3.545],[3.234,-1.753],[0.328,-8.162],[-5.303,-7.347],[-21.451,-5.917],[-48.149,-13.807]],"v":[[-320.322,-37.849],[-368.529,-22.884],[-399.516,67.621],[-371.21,171.125],[-313.587,172.509],[-167.701,127.894],[-68.797,98.154],[-43.997,88.293],[-36.202,68.341],[-39.576,48.535],[-73.342,32.974],[-176.528,5.782]]}],"t":306},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[16.106,2.829],[8.204,-31.825],[1.143,-26.169],[-7.019,-8.653],[0,0],[0,0],[-28.651,5.982],[-7.364,3.682],[-0.38,9.435],[2.376,3.564],[21.236,3.877],[12.5,3]],"o":[[-7.786,-1.368],[-4.352,16.885],[-1.312,30.035],[10.691,13.181],[0,0],[0,0],[10.202,-2.13],[3.25,-1.625],[0.324,-8.044],[-5,-7.5],[-22.127,-4.04],[-12.5,-3]],"v":[[-339.6,-17.406],[-369.958,6.451],[-378.109,70.781],[-362.13,149.1],[-325.233,152.957],[-157.198,112.704],[-70.249,93.535],[-48,87.375],[-43.87,68.065],[-47.25,48.75],[-78.375,37.25],[-189.636,15.669]]}],"t":313},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.967,0.213],[2.738,-15.015],[1.385,-12.467],[-1.247,-7.871],[0,0],[0,0],[-28.651,5.982],[-8.771,2.67],[-0.38,9.435],[1.081,4.285],[20.741,2.408],[19.06,2.948]],"o":[[-16.195,-3.341],[-2.873,15.753],[-2.409,21.682],[2.873,18.129],[0,0],[0,0],[10.202,-2.13],[3.476,-1.058],[0.324,-8.044],[-1.786,-7.076],[-20.863,-2.422],[-12.704,-1.965]],"v":[[-455.328,1.259],[-474.592,19.091],[-479.174,60.372],[-475.091,132.115],[-465.009,152.111],[-260.309,121.853],[-70.375,92.25],[-55.624,89.199],[-51.764,69.322],[-54.156,47.733],[-79.076,40.305],[-254.804,22.258]]}],"t":435},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[11.491,4.701],[28.039,-44.264],[4.291,-45.107],[-32.585,-46.971],[-22.078,10.563],[-31.692,16.063],[-28.447,12.571],[-8.071,3.771],[-0.405,10.063],[2.334,3.912],[21.088,10.567],[28.118,14.72]],"o":[[-9.045,-3.539],[-21.488,34.396],[-3.337,34.761],[14.584,22.771],[26.328,-12.597],[30.512,-15.465],[10.978,-4.888],[3.501,-1.646],[0.345,-8.58],[-4.837,-7.934],[-20.328,-10.125],[-36.61,-19.934]],"v":[[-298.612,-96.295],[-360.229,-67.474],[-396.075,45.933],[-371.262,174.676],[-315.178,207.155],[-194.098,159.287],[-65.498,104.355],[-38.457,91.463],[-16.805,70.503],[-19.425,48.447],[-59.925,21.684],[-146.392,-22.308]]}],"t":446},{"s":[{"c":true,"i":[[11.952,5.519],[32.652,-49.597],[4.82,-51.058],[-38.298,-54.1],[-26.103,12.489],[-37.47,18.992],[-28.409,13.772],[-7.944,3.972],[-0.41,10.177],[2.563,3.844],[21.151,12.055],[29.77,16.866]],"o":[[-7.742,-3.575],[-24.883,37.795],[-3.507,37.145],[16.719,23.618],[31.129,-14.893],[36.074,-18.284],[11.12,-5.39],[3.506,-1.753],[0.349,-8.677],[-5.393,-8.09],[-20.23,-11.53],[-40.969,-23.21]],"v":[[-270.04,-114.08],[-339.378,-83.257],[-380.924,43.3],[-352.332,182.436],[-287.86,217.19],[-182.026,166.112],[-64.608,106.562],[-35.327,91.875],[-10.431,70.718],[-13.093,48.577],[-56.434,18.289],[-118.844,-20.929]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"e":{"a":0,"ix":6,"k":[-39.242,69.189]},"g":{"k":{"a":0,"ix":9,"k":[0,1,0.969,0.443,0.5,1,0.969,0.443,1,1,0.969,0.443,0,0,0.5,0.5,1,1]},"p":3},"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","o":{"a":0,"ix":10,"k":100},"r":1,"s":{"a":0,"ix":5,"k":[-305.779,55.712]},"t":1,"ty":"gf"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":10},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"light beam","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":1,"ddd":0,"ind":20,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[512,384,0]},"o":{"a":0,"ix":11,"k":45},"p":{"a":0,"ix":2,"k":[512,384,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Royal Blue Solid 1","op":480,"sc":"#2e5fd8","sh":768,"sr":1,"st":0,"sw":1024,"ty":1},{"ao":0,"bm":0,"ddd":0,"ind":21,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1192.089,97.616,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1233.618,84.445,0],"t":0,"ti":[0.563,0.194,0],"to":[1.126,0.388,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1226.864,86.77,0],"t":125,"ti":[0.675,0.233,0],"to":[-0.563,-0.194,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.48,"y":0},"s":[-1236.995,83.282,0],"t":141,"ti":[-0.113,-0.039,0],"to":[-0.675,-0.233,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[-1230.917,85.375,0],"t":218,"ti":[-0.45,-0.155,0],"to":[0.113,0.039,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.333,"y":0},"s":[-1236.32,83.514,0],"t":240,"ti":[0.113,0.039,0],"to":[0.45,0.155,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1228.215,86.305,0],"t":300,"ti":[0.563,0.194,0],"to":[-0.113,-0.039,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.48,"y":0},"s":[-1236.995,83.282,0],"t":345,"ti":[-0.563,-0.194,0],"to":[-0.563,-0.194,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1231.592,85.142,0],"t":435,"ti":[0.338,0.116,0],"to":[0.563,0.194,0]},{"s":[-1233.618,84.445,0],"t":479}]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-33],"t":0},{"i":{"x":[0.4],"y":[0.92]},"o":{"x":[0.508],"y":[0]},"s":[-20],"t":125},{"i":{"x":[0.822],"y":[-3.493]},"o":{"x":[0.181],"y":[-5.313]},"s":[-69],"t":141},{"i":{"x":[0.886],"y":[0.887]},"o":{"x":[0.463],"y":[0.062]},"s":[-68.132],"t":203},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.141],"y":[0.378]},"s":[-28.5],"t":218},{"i":{"x":[0.737],"y":[1.211]},"o":{"x":[0.333],"y":[0]},"s":[-7],"t":240},{"i":{"x":[0.541],"y":[0.397]},"o":{"x":[0.627],"y":[0.147]},"s":[-15],"t":300},{"i":{"x":[0.565],"y":[1.438]},"o":{"x":[0.216],"y":[1.02]},"s":[-8.607],"t":314},{"i":{"x":[0.587],"y":[0.684]},"o":{"x":[0.49],"y":[0.077]},"s":[-4.683],"t":345},{"i":{"x":[0.755],"y":[1.203]},"o":{"x":[0.335],"y":[1.066]},"s":[-65],"t":419},{"i":{"x":[0.56],"y":[0.527]},"o":{"x":[0.985],"y":[0.137]},"s":[-68.132],"t":435},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.237],"y":[0.684]},"s":[-42.541],"t":457},{"s":[-33],"t":479}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Front arm","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-2.152,-3.921],[-1.174,-0.168],[-0.691,0.698],[0.131,3.718],[1.046,3.495]],"o":[[3.537,3.766],[0.659,1.2],[0.89,0.127],[2.346,-2.369],[-0.131,-3.718],[0,0]],"v":[[-1236.741,90.401],[-1228.246,101.042],[-1225.579,103.683],[-1223.135,102.551],[-1219.979,92.497],[-1225.527,83.709]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-2.634,-3.921],[-1.436,-0.168],[-0.845,0.698],[0.161,3.718],[1.28,3.495]],"o":[[1.572,4.454],[0.806,1.2],[1.089,0.127],[2.87,-2.369],[-0.161,-3.718],[0,0]],"v":[[-1249.157,90.401],[-1242.815,103.031],[-1239.552,105.672],[-1236.56,104.54],[-1232.699,94.486],[-1235.435,83.709]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-2.634,-3.921],[-1.436,-0.168],[-0.845,0.698],[0.161,3.718],[1.28,3.495]],"o":[[1.572,4.454],[0.806,1.2],[1.089,0.127],[2.87,-2.369],[-0.161,-3.718],[0,0]],"v":[[-1249.157,90.401],[-1242.815,103.031],[-1239.552,105.672],[-1236.56,104.54],[-1232.699,94.486],[-1235.435,83.709]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-2.567,-3.921],[-1.4,-0.168],[-0.824,0.698],[0.157,3.718],[1.248,3.495]],"o":[[1.845,4.359],[0.786,1.2],[1.061,0.127],[2.797,-2.369],[-0.157,-3.718],[0,0]],"v":[[-1247.205,90.123],[-1240.563,102.477],[-1237.383,105.118],[-1234.468,103.986],[-1230.705,93.932],[-1233.832,83.432]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-1.88,-4.586],[-1.331,-0.376],[-0.907,0.638],[-0.425,4.032],[0.668,3.942]],"o":[[2.515,4.75],[0.575,1.404],[1.009,0.285],[3.079,-2.166],[0.425,-4.032],[0,0]],"v":[[-1247.032,88.898],[-1240.366,102.273],[-1237.693,105.564],[-1234.692,104.749],[-1229.486,94.431],[-1233.032,83.545]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-1.99,-4.317],[-1.267,-0.291],[-0.819,0.662],[-0.199,3.905],[3.207,4.227]],"o":[[5.902,5.386],[0.609,1.321],[0.96,0.221],[2.781,-2.248],[0.199,-3.905],[0,0]],"v":[[-1249.606,91.113],[-1241.081,105.137],[-1238.41,108.164],[-1235.635,107.221],[-1232.378,95.253],[-1236.735,85.217]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-2.152,-3.921],[-1.174,-0.168],[-0.691,0.698],[1.974,3.38],[3.146,2.774]],"o":[[6.082,3.088],[0.659,1.2],[0.89,0.127],[2.346,-2.369],[-1.876,-3.213],[0,0]],"v":[[-1236.741,90.401],[-1224.211,100.493],[-1221.544,103.134],[-1219.1,102.002],[-1218.525,92.267],[-1225.527,83.709]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-2.152,-3.921],[-1.174,-0.168],[-0.691,0.698],[1.493,4.077],[3.577,2.701]],"o":[[6.148,2.392],[0.659,1.2],[0.89,0.127],[2.346,-2.369],[-1.279,-3.494],[0,0]],"v":[[-1234.024,92.261],[-1222.744,103.635],[-1220.078,106.276],[-1217.633,105.144],[-1217.632,92.977],[-1224.214,84.467]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.99,-4.317],[-1.267,-0.291],[-0.819,0.662],[-0.199,3.905],[3.207,4.227]],"o":[[5.902,5.386],[0.609,1.321],[0.96,0.221],[2.781,-2.248],[0.199,-3.905],[0,0]],"v":[[-1249.606,91.113],[-1241.081,105.137],[-1238.41,108.164],[-1235.635,107.221],[-1232.378,95.253],[-1236.735,85.217]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.88,-4.586],[-1.331,-0.376],[-0.907,0.638],[-0.425,4.032],[0.668,3.942]],"o":[[2.515,4.75],[0.575,1.404],[1.009,0.285],[3.079,-2.166],[0.425,-4.032],[0,0]],"v":[[-1247.032,88.898],[-1240.366,102.273],[-1237.693,105.564],[-1234.692,104.749],[-1229.486,94.431],[-1233.032,83.545]]}],"t":435},{"s":[{"c":false,"i":[[0,0],[-2.152,-3.921],[-1.174,-0.168],[-0.691,0.698],[0.131,3.718],[1.046,3.495]],"o":[[3.537,3.766],[0.659,1.2],[0.89,0.127],[2.346,-2.369],[-0.131,-3.718],[0,0]],"v":[[-1236.741,90.401],[-1228.246,101.042],[-1225.579,103.683],[-1223.135,102.551],[-1219.979,92.497],[-1225.527,83.709]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-1.239,-6.04],[-0.896,-0.015],[-0.539,0.502],[2.384,5.314],[3.274,1.799]],"o":[[6.652,3.744],[0.122,0.594],[1.119,0.019],[3.791,-3.531],[-1.592,-3.549],[0,0]],"v":[[-1258.577,106.077],[-1248.922,116.945],[-1245.797,120.407],[-1242.813,118.866],[-1241.597,104.753],[-1246.413,98.334]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.516,-6.04],[-0.528,-0.31],[-0.66,0.502],[-0.481,5.81],[-0.007,3.016]],"o":[[1.516,6.04],[0.149,0.594],[0.715,0.42],[4.639,-3.531],[0.249,-3.006],[0,0]],"v":[[-1277.611,103.125],[-1273.062,121.246],[-1272.191,122.806],[-1269.911,122.286],[-1263.518,106.574],[-1263.134,97.537]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.003,-6.146],[-0.5,-0.354],[-0.699,0.445],[-0.968,5.749],[-0.26,3.005]],"o":[[1.003,6.146],[0.099,0.605],[0.677,0.479],[4.92,-3.129],[0.5,-2.974],[0,0]],"v":[[-1276.416,99.542],[-1273.406,117.982],[-1272.67,119.61],[-1270.354,119.283],[-1262.663,104.163],[-1261.522,95.191]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.003,-6.146],[-0.5,-0.354],[-0.699,0.445],[0.121,7.484],[1.903,3.199]],"o":[[2.057,5.878],[0.099,0.605],[0.677,0.479],[4.92,-3.129],[-0.049,-3.015],[0,0]],"v":[[-1280.806,99.93],[-1270.736,119.225],[-1270,120.853],[-1267.684,120.525],[-1261.883,104.335],[-1264.76,95.785]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-1.432,-6.676],[-0.467,-0.396],[-0.736,0.381],[1.838,8.814],[1.614,3.354]],"o":[[3.526,4.425],[0.129,0.599],[0.632,0.537],[5.176,-2.683],[-0.616,-2.952],[0,0]],"v":[[-1278.825,100.509],[-1270.234,118.549],[-1269.643,120.235],[-1267.307,120.113],[-1260.826,104.838],[-1264.283,95.467]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-1.003,-6.146],[-0.5,-0.354],[-0.699,0.445],[-0.968,5.749],[-0.26,3.005]],"o":[[1.003,6.146],[0.099,0.605],[0.677,0.479],[4.92,-3.129],[0.5,-2.974],[0,0]],"v":[[-1276.416,99.542],[-1273.406,117.982],[-1272.67,119.61],[-1270.354,119.283],[-1262.663,104.163],[-1261.522,95.191]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-4.708,-4.5],[-0.884,0.145],[-0.44,0.59],[4.127,5.595],[3.274,1.799]],"o":[[8.962,3.994],[0.438,0.419],[1.105,-0.182],[3.097,-4.153],[-2.309,-3.13],[0,0]],"v":[[-1258.577,106.077],[-1241.868,117.161],[-1238.174,120.007],[-1235.514,117.957],[-1238.778,103.168],[-1246.413,98.334]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-2.668,-3.725],[-0.974,0.033],[-0.558,0.575],[4.606,4.175],[3.274,1.799]],"o":[[8.51,2.348],[1.675,2.338],[1.217,-0.041],[3.923,-4.046],[-2.882,-2.612],[0,0]],"v":[[-1255.555,106.315],[-1240.878,114.408],[-1235.055,122.204],[-1230.081,120.248],[-1235.825,102.837],[-1243.308,97.502]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.003,-6.146],[-0.5,-0.354],[-0.699,0.445],[-0.968,5.749],[-0.26,3.005]],"o":[[1.003,6.146],[0.099,0.605],[0.677,0.479],[4.92,-3.129],[0.5,-2.974],[0,0]],"v":[[-1276.416,99.542],[-1273.406,117.982],[-1272.67,119.61],[-1270.354,119.283],[-1262.663,104.163],[-1261.522,95.191]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.432,-6.676],[-0.467,-0.396],[-0.736,0.381],[1.838,8.814],[1.614,3.354]],"o":[[3.526,4.425],[0.129,0.599],[0.632,0.537],[5.176,-2.683],[-0.616,-2.952],[0,0]],"v":[[-1278.825,100.509],[-1270.234,118.549],[-1269.643,120.235],[-1267.307,120.113],[-1260.826,104.838],[-1264.283,95.467]]}],"t":435},{"s":[{"c":false,"i":[[0,0],[-1.239,-6.04],[-0.896,-0.015],[-0.539,0.502],[2.384,5.314],[3.274,1.799]],"o":[[6.652,3.744],[0.122,0.594],[1.119,0.019],[3.791,-3.531],[-1.592,-3.549],[0,0]],"v":[[-1258.577,106.077],[-1248.922,116.945],[-1245.797,120.407],[-1242.813,118.866],[-1241.597,104.753],[-1246.413,98.334]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-1.98,-3.787],[-1.492,-1.079],[-1.437,1.186],[-0.118,2.51],[6.302,5.259]],"o":[[7.373,1.861],[0.934,1.786],[1.492,1.079],[1.703,-1.406],[0.288,-6.155],[0,0]],"v":[[-1285.123,119.327],[-1269.574,130.881],[-1266.072,135.5],[-1261.148,135.659],[-1258.943,128.912],[-1271.189,111.235]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.525,-3.635],[-1.415,-1.206],[-1.696,0.761],[-0.501,2.147],[0.245,5.4]],"o":[[0.411,3.92],[0.719,1.714],[1.415,1.206],[2.011,-0.902],[1.227,-5.265],[0,0]],"v":[[-1308.868,112.916],[-1305.943,124.33],[-1302.933,128.964],[-1297.752,130.004],[-1294.408,124.581],[-1292.925,108.482]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.031,-3.805],[-1.243,-1.382],[-1.782,0.53],[-0.78,2.062],[-0.471,5.385]],"o":[[-0.111,3.94],[0.486,1.794],[1.243,1.382],[2.113,-0.628],[1.913,-5.056],[0,0]],"v":[[-1310.345,103.383],[-1308.956,115.084],[-1306.586,120.075],[-1301.588,121.792],[-1297.556,116.858],[-1293.956,101.098]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.959,-3.42],[-1.553,-1.023],[-1.59,0.964],[-0.233,2.192],[2.298,6.454]],"o":[[0.889,3.84],[0.924,1.613],[1.553,1.023],[1.885,-1.143],[0.572,-5.376],[0,0]],"v":[[-1308.616,110.992],[-1301.8,121.697],[-1298.244,125.926],[-1292.974,126.322],[-1290.322,120.529],[-1293.339,104.634]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-1.573,-3.614],[-1.431,-1.187],[-1.686,0.784],[-0.472,2.153],[1.578,6.666]],"o":[[0.464,3.914],[0.742,1.704],[1.431,1.187],[1.999,-0.929],[1.157,-5.281],[0,0]],"v":[[-1310.303,110.01],[-1304.699,121.397],[-1301.627,125.99],[-1296.432,126.96],[-1293.162,121.492],[-1294.421,105.362]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-1.031,-3.805],[-1.243,-1.382],[-1.782,0.53],[-0.78,2.062],[-0.471,5.385]],"o":[[-0.111,3.94],[0.486,1.794],[1.243,1.382],[2.113,-0.628],[1.913,-5.056],[0,0]],"v":[[-1310.345,103.383],[-1308.956,115.084],[-1306.586,120.075],[-1301.588,121.792],[-1297.556,116.858],[-1293.956,101.098]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-1.98,-3.787],[-1.492,-1.079],[-1.437,1.186],[-0.118,2.51],[6.302,5.259]],"o":[[7.373,1.861],[0.934,1.786],[1.492,1.079],[1.703,-1.406],[0.288,-6.155],[0,0]],"v":[[-1285.123,119.327],[-1269.574,130.881],[-1266.072,135.5],[-1261.148,135.659],[-1258.943,128.912],[-1271.189,111.235]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-2.361,-4.005],[-1.681,-1.09],[-1.495,1.368],[0.011,2.734],[9.514,4.918]],"o":[[8.113,1.614],[1.113,1.889],[1.681,1.09],[1.773,-1.622],[-0.028,-6.704],[0,0]],"v":[[-1277.957,121.391],[-1260.037,130.391],[-1255.976,135.216],[-1250.617,135.115],[-1248.595,127.663],[-1264.395,111.761]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.031,-3.805],[-1.243,-1.382],[-1.782,0.53],[-0.78,2.062],[-0.471,5.385]],"o":[[-0.111,3.94],[0.486,1.794],[1.243,1.382],[2.113,-0.628],[1.913,-5.056],[0,0]],"v":[[-1310.345,103.383],[-1308.956,115.084],[-1306.586,120.075],[-1301.588,121.792],[-1297.556,116.858],[-1293.956,101.098]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.573,-3.614],[-1.431,-1.187],[-1.686,0.784],[-0.472,2.153],[1.578,6.666]],"o":[[0.464,3.914],[0.742,1.704],[1.431,1.187],[1.999,-0.929],[1.157,-5.281],[0,0]],"v":[[-1310.303,110.01],[-1304.699,121.397],[-1301.627,125.99],[-1296.432,126.96],[-1293.162,121.492],[-1294.421,105.362]]}],"t":435},{"s":[{"c":false,"i":[[0,0],[-1.98,-3.787],[-1.492,-1.079],[-1.437,1.186],[-0.118,2.51],[6.302,5.259]],"o":[[7.373,1.861],[0.934,1.786],[1.492,1.079],[1.703,-1.406],[0.288,-6.155],[0,0]],"v":[[-1285.123,119.327],[-1269.574,130.881],[-1266.072,135.5],[-1261.148,135.659],[-1258.943,128.912],[-1271.189,111.235]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.964705884457,0.549019634724,0.129411771894,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Front arm stripes","np":5,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[16.826,-10.701],[39.173,-20.691],[-0.677,-9.061],[8.335,3.257],[2.714,-9.635],[-5.443,-8.012],[-13.163,9.37],[-15.21,7.307],[-21.31,10.273],[-14.634,9.513],[1.851,14.378]],"o":[[-34.794,22.128],[-2.064,1.09],[0.686,9.17],[-1.905,-0.744],[-4.58,16.258],[6.779,9.978],[16.56,-11.788],[13.43,-6.452],[22.218,-10.71],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1204.35,69.181],[-1289.768,121.534],[-1303.948,127.925],[-1335.985,136.347],[-1347.558,143.409],[-1340.674,177.869],[-1292.727,182.543],[-1243.477,157.165],[-1202.78,140.815],[-1154.705,116.767],[-1141.428,85.024]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[20.59,-10.701],[44.513,-10.687],[1.734,-6.34],[9.189,5.001],[2.362,-6.398],[-9.482,-3.942],[-20.194,1.752],[-17.192,4.746],[-26.496,7.667],[-14.634,9.513],[1.851,14.378]],"o":[[-42.576,22.128],[-2.345,0.563],[-2.056,7.516],[-1.88,-1.023],[-4.473,12.116],[8.505,3.536],[14.376,-1.362],[17.267,-4.783],[28.451,-8.232],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1209.521,69.181],[-1313.519,113.365],[-1328.186,116.559],[-1352.862,120.495],[-1361.96,127.966],[-1350.994,159.825],[-1313.619,162.147],[-1261.454,153.413],[-1209.68,138.947],[-1154.705,116.767],[-1141.428,85.024]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[20.59,-10.701],[45.535,-4.704],[5.698,-5.261],[8.446,6.173],[3.188,-6.029],[-8.877,-5.162],[-20.248,-0.936],[-17.782,1.373],[-26.496,7.667],[-14.634,9.513],[1.851,14.378]],"o":[[-42.576,22.128],[-2.399,0.248],[-5.725,5.286],[-1.728,-1.263],[-6.037,11.417],[7.963,4.631],[14.43,0.552],[17.938,-1.385],[28.451,-8.232],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1209.521,69.181],[-1315.015,103.213],[-1328.755,103.135],[-1354.955,105.075],[-1364.962,111.276],[-1358.307,144.306],[-1321.568,151.553],[-1262.426,149.958],[-1209.68,138.947],[-1154.705,116.767],[-1141.428,85.024]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[20.59,-10.701],[44.866,-16.525],[1.465,-6.408],[9.391,4.61],[2.091,-6.491],[-7.598,-6.908],[-11.451,2.353],[-17.418,3.833],[-27.514,6.093],[-14.634,9.513],[1.851,14.378]],"o":[[-42.576,22.128],[-2.263,0.834],[-1.737,7.596],[-1.921,-0.943],[-3.959,12.293],[9.304,8.46],[18.395,-3.779],[19.706,-4.336],[28.917,-6.404],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1209.521,69.181],[-1314.728,111.674],[-1329.525,115.258],[-1357.186,119.039],[-1365.961,126.887],[-1360.432,161.506],[-1326.879,168.755],[-1262.426,149.958],[-1209.283,137.89],[-1154.705,116.767],[-1141.428,85.024]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[20.59,-10.701],[44.023,-12.552],[1.465,-6.408],[9.391,4.61],[2.091,-6.491],[-7.598,-6.908],[-11.451,2.353],[-17.418,3.833],[-27.514,6.093],[-14.634,9.513],[1.851,14.378]],"o":[[-42.576,22.128],[-2.32,0.661],[-1.737,7.596],[-1.921,-0.943],[-3.959,12.293],[9.304,8.46],[18.395,-3.779],[19.706,-4.336],[28.917,-6.404],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1209.521,69.181],[-1318.178,110.259],[-1332.698,114.068],[-1357.186,119.039],[-1367.746,126.848],[-1362.217,161.467],[-1330.108,169.399],[-1262.426,149.958],[-1209.283,137.89],[-1154.705,116.767],[-1141.428,85.024]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[20.59,-10.701],[45.535,-4.704],[2.557,-6.055],[8.446,6.173],[3.188,-6.029],[-8.877,-5.162],[-20.248,-0.936],[-17.782,1.373],[-26.496,7.667],[-14.634,9.513],[1.851,14.378]],"o":[[-42.576,22.128],[-2.399,0.248],[-3.032,7.178],[-1.728,-1.263],[-6.037,11.417],[7.963,4.631],[14.43,0.552],[17.938,-1.385],[28.451,-8.232],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1209.521,69.181],[-1315.015,103.213],[-1329.975,104.438],[-1354.955,105.075],[-1364.962,111.276],[-1358.307,144.306],[-1321.568,151.553],[-1262.426,149.958],[-1209.68,138.947],[-1154.705,116.767],[-1141.428,85.024]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[16.826,-10.701],[39.173,-20.691],[0.751,-10.313],[7.479,4.495],[2.714,-9.635],[-5.443,-8.012],[-13.163,9.37],[-15.354,6.999],[-21.959,8.8],[-14.634,9.513],[1.851,14.378]],"o":[[-34.794,22.128],[-2.064,1.09],[-0.479,6.576],[-1.753,-1.054],[-4.58,16.258],[6.779,9.978],[16.56,-11.788],[13.557,-6.18],[24.843,-9.956],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1204.35,69.181],[-1289.768,121.534],[-1303.948,127.925],[-1335.985,136.347],[-1347.558,143.409],[-1340.674,177.869],[-1292.727,182.543],[-1243.477,157.165],[-1202.78,140.815],[-1154.705,116.767],[-1141.428,85.024]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[16.826,-10.701],[41.414,-24.649],[2.648,-9.509],[9.077,1.898],[2.415,-10.618],[-5.027,-5.802],[-13.782,10.909],[-16.527,7.989],[-21.31,10.273],[-14.634,9.513],[1.851,14.378]],"o":[[-34.794,22.128],[-2.182,1.299],[-2.378,8.538],[-2.178,-0.455],[-4.075,17.917],[7.287,8.411],[17.339,-13.724],[10.773,-5.208],[22.218,-10.71],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1204.35,69.181],[-1284.446,123.726],[-1300.718,131.043],[-1333.813,143.852],[-1344.012,156.809],[-1331.292,191.125],[-1285.737,186.126],[-1236.832,156.314],[-1202.78,140.815],[-1154.705,116.767],[-1141.428,85.024]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[20.59,-10.701],[45.535,-4.704],[4.418,-8.261],[8.446,6.173],[3.188,-6.029],[-8.297,-6.051],[-17.379,4.214],[-17.723,1.991],[-26.606,7.275],[-14.634,9.513],[2.179,14.332]],"o":[[-42.576,22.128],[-2.399,0.248],[-2.557,4.782],[-1.728,-1.263],[-6.037,11.417],[13.065,9.529],[23.245,-5.637],[19.709,-2.214],[27.971,-7.649],[8.245,-5.36],[-5.403,-35.53]],"v":[[-1209.521,69.181],[-1315.015,103.213],[-1329.975,104.438],[-1354.955,105.075],[-1366.884,111.335],[-1362.406,149.207],[-1321.796,152.82],[-1262.426,149.958],[-1209.395,139.602],[-1154.705,116.767],[-1141.428,85.024]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[20.59,-10.701],[44.023,-12.552],[1.465,-6.408],[9.391,4.61],[2.091,-6.491],[-7.598,-6.908],[-11.451,2.353],[-17.418,3.833],[-27.514,6.093],[-14.634,9.513],[1.851,14.378]],"o":[[-42.576,22.128],[-2.32,0.661],[-1.737,7.596],[-1.921,-0.943],[-3.959,12.293],[9.304,8.46],[18.395,-3.779],[19.706,-4.336],[28.917,-6.404],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1209.521,69.181],[-1318.178,110.259],[-1332.698,114.068],[-1357.186,119.039],[-1367.746,126.848],[-1362.217,161.467],[-1330.108,169.399],[-1262.426,149.958],[-1209.283,137.89],[-1154.705,116.767],[-1141.428,85.024]]}],"t":435},{"s":[{"c":true,"i":[[16.826,-10.701],[39.173,-20.691],[-4.865,-5.689],[8.335,3.257],[2.714,-9.635],[-5.443,-8.012],[-13.163,9.37],[-15.21,7.307],[-21.31,10.273],[-14.634,9.513],[1.851,14.378]],"o":[[-34.794,22.128],[-2.064,1.09],[5.976,6.989],[-1.905,-0.744],[-4.58,16.258],[6.779,9.978],[16.56,-11.788],[13.43,-6.452],[22.218,-10.71],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1204.35,69.181],[-1289.768,121.534],[-1303.948,127.925],[-1335.985,136.347],[-1347.558,143.409],[-1340.674,177.869],[-1292.727,182.543],[-1243.477,157.165],[-1202.78,140.815],[-1154.705,116.767],[-1141.428,85.024]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Front arm","np":3,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-1261.786,114.847]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1261.786,114.847]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Front arm","np":2,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":22,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[11.81,62.175,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[-1349.362,99.226,0],"t":15,"ti":[-1.038,5.415,0],"to":[0.165,-3.508,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[-1348.369,78.178,0],"t":30,"ti":[-0.229,-0.023,0],"to":[1.038,-5.415,0]},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1343.133,66.738,0],"t":125,"ti":[0.644,-1.93,0],"to":[0.229,0.023,0]},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[-1346.994,78.317,0],"t":141,"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[-1346.994,78.317,0],"t":203,"ti":[0.395,-3.485,0],"to":[0.644,-1.93,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[-1343.133,66.738,0],"t":218,"ti":[0.841,-6.841,0],"to":[-0.395,3.485,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[-1349.362,99.226,0],"t":240,"ti":[-1.038,5.415,0],"to":[-0.841,6.841,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1348.178,107.783,0],"t":300,"ti":[-0.197,4.911,0],"to":[1.038,-5.415,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[-1343.133,66.738,0],"t":313,"ti":[1.038,-5.415,0],"to":[0.197,-4.911,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1346.994,78.317,0],"t":435,"ti":[0.395,-3.485,0],"to":[-1.038,5.415,0]},{"s":[-1349.362,99.226,0],"t":457}]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.333],"y":[0]},"s":[-18.5],"t":15},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0],"y":[0]},"s":[-11.5],"t":30},{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"s":[0.5],"t":125},{"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]},"s":[-3.5],"t":141},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.45],"y":[0]},"s":[-3.5],"t":203},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.333],"y":[0]},"s":[0.5],"t":218},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"s":[-18.5],"t":240},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"s":[-21.5],"t":300},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0],"y":[0]},"s":[0.5],"t":313},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"s":[-3.5],"t":435},{"s":[-18.5],"t":457}]},"s":{"a":0,"ix":6,"k":[175,175,100]}},"nm":"Lamp","op":480,"parent":21,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-4.885,-0.596],[-3.089,3.307],[0.074,12.581],[25.166,-0.154]],"o":[[5.528,0.674],[6.57,-7.033],[-0.054,-9.21],[-5.688,0.035]],"v":[[-27.316,94.32],[-12.684,87.406],[-2.645,60.969],[-31.245,31.035]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-4.529,-0.552],[-2.058,3.655],[0.625,9.125],[9.5,0.875]],"o":[[5.125,0.625],[3.689,-6.551],[-0.581,-8.484],[-5.252,-0.484]],"v":[[-56.05,96.067],[-43.625,90.001],[-38.625,65.875],[-53.75,36.375]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-4.529,-0.552],[-2.058,3.655],[0.625,9.125],[9.5,0.875]],"o":[[5.125,0.625],[3.689,-6.551],[-0.581,-8.484],[-5.252,-0.484]],"v":[[-56.05,96.067],[-43.625,90.001],[-38.625,65.875],[-53.75,36.375]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-3.406,-0.552],[-1.548,3.655],[0.47,9.125],[7.145,0.875]],"o":[[3.855,0.625],[2.774,-6.551],[-0.437,-8.484],[-3.95,-0.484]],"v":[[-57.077,96.22],[-47.732,90.153],[-43.972,66.027],[-55.347,36.527]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[-2.053,-0.552],[-0.933,3.655],[0.283,9.125],[4.307,0.875]],"o":[[2.323,0.625],[1.672,-6.551],[-0.263,-8.484],[-2.381,-0.484]],"v":[[-57.82,96.22],[-52.188,90.153],[-49.921,66.027],[-56.778,36.527]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-4.529,-0.552],[-2.058,3.655],[0.625,9.125],[9.5,0.875]],"o":[[5.125,0.625],[3.689,-6.551],[-0.581,-8.484],[-5.252,-0.484]],"v":[[-56.05,96.067],[-43.625,90.001],[-38.625,65.875],[-53.75,36.375]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-4.885,-0.596],[-3.089,3.307],[0.074,12.581],[25.166,-0.154]],"o":[[5.528,0.674],[6.57,-7.033],[-0.054,-9.21],[-5.688,0.035]],"v":[[-27.316,94.32],[-12.684,87.406],[-2.645,60.969],[-31.245,31.035]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-5.293,-0.596],[-3.348,3.307],[0.08,12.581],[27.27,-0.154]],"o":[[5.99,0.674],[7.12,-7.033],[-0.059,-9.21],[-6.164,0.035]],"v":[[-20.496,94.594],[-4.641,87.681],[6.239,61.243],[-24.753,31.309]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-4.529,-0.552],[-2.058,3.655],[0.625,9.125],[9.5,0.875]],"o":[[5.125,0.625],[3.689,-6.551],[-0.581,-8.484],[-5.252,-0.484]],"v":[[-56.05,96.067],[-43.625,90.001],[-38.625,65.875],[-53.75,36.375]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-2.053,-0.552],[-0.933,3.655],[0.283,9.125],[4.307,0.875]],"o":[[2.323,0.625],[1.672,-6.551],[-0.263,-8.484],[-2.381,-0.484]],"v":[[-57.82,96.22],[-52.188,90.153],[-49.921,66.027],[-56.778,36.527]]}],"t":435},{"s":[{"c":false,"i":[[-4.885,-0.596],[-3.089,3.307],[0.074,12.581],[25.166,-0.154]],"o":[[5.528,0.674],[6.57,-7.033],[-0.054,-9.21],[-5.688,0.035]],"v":[[-27.316,94.32],[-12.684,87.406],[-2.645,60.969],[-31.245,31.035]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[4.05,-0.181]],"o":[[0,0],[-5.182,0.231]],"v":[[45.461,47.915],[25.487,48.661]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.861,49.841],[0.685,49.603]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.861,49.841],[0.685,49.603]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.861,49.841],[-5.242,49.842]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.861,49.841],[-10.005,49.978]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.861,49.841],[0.685,49.603]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[3.891,-0.544]],"o":[[0,0],[-5.137,0.719]],"v":[[45.461,47.915],[25.487,48.661]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[3.725,-0.619]],"o":[[0,0],[-5.117,0.85]],"v":[[45.461,47.915],[24.165,50.216]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.861,49.841],[0.685,49.603]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.937,49.909],[-10.005,49.978]]}],"t":435},{"s":[{"c":false,"i":[[0,0],[3.959,-0.261]],"o":[[0,0],[-5.176,0.341]],"v":[[45.461,47.915],[25.487,48.661]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[11.846,-0.002],[4.319,-1.638],[2.854,-9.341],[-4.505,-6.626],[-5.358,-1.71],[-5.393,0],[-3.702,2.28],[-1.374,7.972],[5.345,8.238]],"o":[[-9.723,0.001],[-10.375,3.934],[-3.231,10.575],[3.914,5.757],[5.675,1.811],[5.393,0],[7.73,-4.761],[1.288,-7.471],[-2.985,-4.601]],"v":[[-17.068,30.191],[-32.229,30.854],[-51.473,52.735],[-50.392,81.467],[-36.949,93.25],[-21.832,95.641],[-6.231,92.738],[8.291,70.698],[3.687,41]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-4.968,-1.585],[-5,0],[-2.63,3.055],[0,7.5],[2.285,5.585]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.261,1.679],[5,0],[3.875,-4.5],[0,-7.5],[-2.25,-5.5]],"v":[[-36.5,36],[-56,36.5],[-68,57],[-66.5,82.5],[-58.548,95.44],[-37.25,95.5],[-25.75,90.375],[-18.375,69.875],[-20.875,47]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-4.968,-1.585],[-5,0],[-2.63,3.055],[0,7.5],[2.285,5.585]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.261,1.679],[5,0],[3.875,-4.5],[0,-7.5],[-2.25,-5.5]],"v":[[-36.5,36],[-56,36.5],[-68,57],[-66.5,82.5],[-58.548,95.44],[-37.25,95.5],[-25.75,90.375],[-18.375,69.875],[-20.875,47]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[9,-0.5],[3.761,-0.5],[0.752,-9],[-1.88,-7],[-3.736,-1.585],[-5,0],[-2.63,3.055],[0,7.5],[2.285,5.585]],"o":[[-9,0.5],[-3.761,0.5],[-0.752,9],[1.02,3.796],[3.957,1.679],[5,0],[3.875,-4.5],[0,-7.5],[-2.25,-5.5]],"v":[[-36.5,36],[-57.039,36.652],[-66.065,57.152],[-64.936,82.652],[-58.955,95.592],[-40.502,94.999],[-29.002,89.874],[-21.627,69.374],[-24.127,46.499]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[9,-0.5],[2.267,-0.5],[0.453,-9],[-1.133,-7],[-2.252,-1.585],[-5,0],[-1.895,3.055],[0,7.5],[1.646,5.585]],"o":[[-9,0.5],[-2.267,0.5],[-0.453,9],[0.615,3.796],[2.385,1.679],[5,0],[2.792,-4.5],[0,-7.5],[-1.621,-5.5]],"v":[[-36.5,36],[-57.798,36.652],[-63.238,57.152],[-62.558,82.652],[-58.952,95.592],[-40.502,94.999],[-28.991,89.697],[-23.676,69.197],[-25.478,46.322]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-4.968,-1.585],[-5,0],[-2.63,3.055],[0,7.5],[2.285,5.585]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.261,1.679],[5,0],[3.875,-4.5],[0,-7.5],[-2.25,-5.5]],"v":[[-36.5,36],[-56,36.5],[-68,57],[-66.5,82.5],[-58.548,95.44],[-37.25,95.5],[-25.75,90.375],[-18.375,69.875],[-20.875,47]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[11.846,-0.002],[4.319,-1.638],[2.854,-9.341],[-4.505,-6.626],[-5.358,-1.71],[-5.393,0],[-3.702,2.28],[-1.374,7.972],[5.345,8.238]],"o":[[-9.723,0.001],[-10.375,3.934],[-3.231,10.575],[3.914,5.757],[5.675,1.811],[5.393,0],[7.73,-4.761],[1.288,-7.471],[-2.985,-4.601]],"v":[[-17.068,30.191],[-32.229,30.854],[-51.473,52.735],[-50.392,81.467],[-36.949,93.25],[-21.832,95.641],[-6.231,92.738],[8.291,70.698],[3.687,41]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.836,-0.002],[4.809,-1.207],[2.9,-9.453],[-4.388,-6.962],[-5.806,-1.71],[-5.844,0],[-4.827,1.754],[-1.374,7.972],[5.345,8.238]],"o":[[-10.536,0.001],[-12.583,3.158],[-3.267,10.649],[4.535,7.195],[6.15,1.811],[5.844,0],[9.056,-3.291],[1.288,-7.471],[-2.985,-4.601]],"v":[[-13.477,30.42],[-25.82,31.128],[-47.221,51.953],[-46.1,81.5],[-30.934,93.524],[-14.553,95.915],[-2.815,93.923],[12.772,70.972],[8.168,41.274]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-4.968,-1.585],[-5,0],[-2.63,3.055],[0,7.5],[2.285,5.585]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.261,1.679],[5,0],[3.875,-4.5],[0,-7.5],[-2.25,-5.5]],"v":[[-36.5,36],[-56,36.5],[-68,57],[-66.5,82.5],[-58.548,95.44],[-37.25,95.5],[-25.75,90.375],[-18.375,69.875],[-20.875,47]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[9,-0.5],[2.267,-0.5],[0.453,-9],[-1.133,-7],[-2.252,-1.585],[-5,0],[-1.895,3.055],[0,7.5],[1.646,5.585]],"o":[[-9,0.5],[-2.267,0.5],[-0.453,9],[0.615,3.796],[2.385,1.679],[5,0],[2.792,-4.5],[0,-7.5],[-1.621,-5.5]],"v":[[-36.5,36],[-57.798,36.652],[-63.238,57.152],[-62.558,82.652],[-58.952,95.592],[-40.502,94.999],[-28.991,89.697],[-23.676,69.197],[-25.478,46.322]]}],"t":435},{"s":[{"c":true,"i":[[11.846,-0.002],[4.319,-1.638],[2.854,-9.341],[-4.505,-6.626],[-5.358,-1.71],[-5.393,0],[-3.702,2.28],[-1.374,7.972],[5.345,8.238]],"o":[[-9.723,0.001],[-10.375,3.934],[-3.231,10.575],[3.914,5.757],[5.675,1.811],[5.393,0],[7.73,-4.761],[1.288,-7.471],[-2.985,-4.601]],"v":[[-17.068,30.191],[-32.229,30.854],[-51.473,52.735],[-50.392,81.467],[-36.949,93.25],[-21.832,95.641],[-6.231,92.738],[8.291,70.698],[3.687,41]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-4.846,-2.617],[-3.891,-1.518],[-3.333,-0.367],[-3.771,-2.148],[-0.328,-4.014],[-0.404,-2.833],[3.583,-0.665],[3.37,-0.72],[2.352,-0.301],[1.609,-0.948],[2.479,-2.159]],"o":[[5.012,2.706],[5.518,-0.075],[3.542,0.39],[1.799,1.025],[0.335,4.094],[0.404,2.833],[-3.583,0.665],[-3.37,0.72],[-2.352,0.301],[-1.609,0.948],[-1.643,1.431]],"v":[[-3.895,33.546],[8.078,40.249],[35.139,42.953],[45.464,46.988],[48.077,53.568],[47.625,70.284],[43.502,78.313],[26.242,79.989],[11.864,81.937],[6.085,83.155],[-1.939,89.439]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-4.888,-1.475],[-3.863,0.266],[-3.107,-0.101],[-4.051,-1.688],[-0.161,-2.484],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.741,-1.025]],"o":[[4.888,1.475],[3.863,-0.266],[2.311,0.075],[1.864,0.777],[0.209,3.22],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.741,1.025]],"v":[[-24.731,40.199],[-7,44.996],[23.291,45.241],[32.215,48.62],[33.899,55.573],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-27.378,92.003]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-4.888,-1.475],[-3.863,0.266],[-3.098,-0.253],[-3.643,-2.095],[-0.199,-3.761],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.741,-1.025]],"o":[[4.888,1.475],[3.863,-0.266],[3.853,0.315],[1.743,1.003],[0.17,3.222],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.741,1.025]],"v":[[-24.731,40.199],[-7,44.996],[23.291,45.241],[31.593,48.283],[33.899,55.573],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-27.378,92.003]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-4.888,-1.475],[-3.863,0.266],[-3.073,0.47],[-3.069,-2.871],[-0.275,-2.552],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.741,-1.025]],"o":[[4.888,1.475],[3.863,-0.266],[3.073,-0.47],[1.061,0.993],[0.346,3.208],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.741,1.025]],"v":[[-27.143,39.914],[-7,44.996],[25.716,46.127],[32.864,48.981],[33.899,55.573],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-30.63,91.502]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[-3.523,-1.475],[-3.863,0.266],[-3.073,0.47],[-0.546,-2.631],[-0.142,-2.81],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.254,-1.025]],"o":[[3.523,1.475],[3.863,-0.266],[3.073,-0.47],[0.854,4.115],[0.163,3.223],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.254,1.025]],"v":[[-28.256,39.521],[-7.249,45.591],[27.348,46.741],[32.864,48.981],[33.899,55.573],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-30.164,91.325]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-4.888,-1.475],[-3.863,0.266],[-3.108,-0.069],[-3.381,-1.903],[-0.24,-2.923],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.741,-1.025]],"o":[[4.888,1.475],[3.863,-0.266],[3.782,0.083],[3.662,2.061],[0.264,3.216],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.741,1.025]],"v":[[-24.731,40.199],[-7,44.996],[23.291,45.241],[31.073,47.41],[34.103,55.566],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-27.378,92.003]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-5.273,-1.591],[-3.891,-1.518],[-3.333,-0.367],[-3.771,-2.148],[0.04,-4.027],[0.054,-2.932],[3.583,-0.665],[3.37,-0.72],[2.352,-0.301],[1.609,-0.948],[2.479,-2.159]],"o":[[5.273,1.591],[5.518,-0.075],[3.542,0.39],[1.799,1.025],[-0.04,4.032],[-0.053,2.861],[-3.583,0.665],[-3.37,0.72],[-2.352,0.301],[-1.609,0.948],[-1.643,1.431]],"v":[[-4.211,34.08],[8.078,40.249],[35.139,42.953],[45.464,46.988],[47.341,53.319],[47.625,70.284],[43.502,78.313],[26.242,79.989],[11.864,81.937],[6.085,83.155],[-1.939,89.439]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-5.24,-2.778],[-3.891,-1.518],[-3.349,-0.154],[-3.771,-2.148],[0.105,-4.026],[0.058,-3.165],[3.583,-0.665],[3.37,-0.72],[2.352,-0.301],[1.609,-0.948],[2.479,-2.159]],"o":[[5.333,2.827],[5.518,-0.075],[3.559,0.164],[1.799,1.025],[-0.097,3.726],[-0.052,2.861],[-3.583,0.665],[-3.37,0.72],[-2.352,0.301],[-1.609,0.948],[-1.643,1.431]],"v":[[1.607,34.283],[12.559,40.523],[33.784,41.83],[45.464,46.988],[48.077,53.568],[47.625,70.284],[43.502,78.313],[26.242,79.989],[17.006,81.433],[9.016,85.379],[0.584,91.638]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-4.888,-1.475],[-3.863,0.266],[-3.105,-0.15],[-3.175,-1.433],[-0.361,-3.15],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.741,-1.025]],"o":[[4.888,1.475],[3.863,-0.266],[3.659,0.177],[3.83,1.729],[0.367,3.206],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.741,1.025]],"v":[[-24.731,40.199],[-7,44.996],[23.291,45.241],[31.049,47.668],[34.066,55.946],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-27.378,92.003]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-3.523,-1.475],[-3.863,0.266],[-3.073,0.47],[-0.546,-2.631],[-0.142,-2.81],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.254,-1.025]],"o":[[3.523,1.475],[3.863,-0.266],[3.073,-0.47],[0.854,4.115],[0.163,3.223],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.254,1.025]],"v":[[-28.256,39.521],[-7.249,45.591],[27.348,46.741],[32.864,48.981],[33.899,55.573],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-30.164,91.325]]}],"t":435},{"s":[{"c":false,"i":[[-4.604,-3.023],[-3.891,-1.518],[-3.333,-0.367],[-3.771,-2.148],[-0.766,-3.954],[0.048,-2.697],[3.583,-0.665],[3.37,-0.72],[2.352,-0.301],[1.609,-0.948],[2.479,-2.159]],"o":[[4.693,3.081],[5.518,-0.075],[3.542,0.39],[1.799,1.025],[0.662,3.417],[-0.051,2.861],[-3.583,0.665],[-3.37,0.72],[-2.352,0.301],[-1.609,0.948],[-1.643,1.431]],"v":[[-3.983,33.503],[8.078,40.249],[35.139,42.953],[45.464,46.988],[48.077,53.568],[47.625,70.284],[43.502,78.313],[26.242,79.989],[11.864,81.937],[6.085,83.155],[-1.939,89.439]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.84705889225,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":2}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"outlines","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.115,-0.447],[2.367,-3.649],[0.388,-2.953],[-0.944,-2.899],[-3.236,-2.427],[-3.489,1.131],[3.458,2.084],[0.978,6.537],[-2.745,4.933],[-8.494,-1.955]],"o":[[-4.787,1.011],[-2.639,4.067],[-1.663,12.664],[0.944,2.899],[3.066,2.3],[3.403,-1.103],[-3.455,-2.082],[-1.079,-7.214],[1.892,-3.399],[-1.955,-3.775]],"v":[[-34.402,32.316],[-46.215,42.003],[-52.635,58.015],[-50.991,81.296],[-43.118,90.023],[-25.462,93.338],[-37.357,85.791],[-48.155,72.985],[-45.258,48.946],[-21.117,35.368]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.961,-0.414],[1.125,-2.625],[0.25,-2.75],[-0.875,-2.688],[-3,-2.25],[-2,2.75],[3.688,0.625],[0.906,6.06],[-0.562,3.562],[-7.875,-1.812]],"o":[[-4.438,0.938],[-1.125,2.625],[-0.25,2.75],[0.875,2.688],[2.843,2.132],[2,-2.75],[-3.688,-0.625],[-1,-6.688],[0.562,-3.562],[-1.812,-3.5]],"v":[[-55.688,37.812],[-64.312,46.75],[-67.688,60.562],[-65.375,83.188],[-60.5,90.875],[-47.438,90.375],[-54.125,88.688],[-62.25,75.188],[-63.125,52],[-49.562,41.812]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.961,-0.414],[1.125,-2.625],[0.25,-2.75],[-0.875,-2.688],[-3,-2.25],[-2,2.75],[3.688,0.625],[0.906,6.06],[-0.562,3.562],[-7.875,-1.812]],"o":[[-4.438,0.938],[-1.125,2.625],[-0.25,2.75],[0.875,2.688],[2.843,2.132],[2,-2.75],[-3.688,-0.625],[-1,-6.688],[0.562,-3.562],[-1.812,-3.5]],"v":[[-55.688,37.812],[-64.312,46.75],[-67.688,60.562],[-65.375,83.188],[-60.5,90.875],[-47.438,90.375],[-54.125,88.688],[-62.25,75.188],[-63.125,52],[-49.562,41.812]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.475,-0.414],[0.846,-2.625],[0.188,-2.75],[-0.658,-2.688],[-2.256,-2.25],[-1.504,2.75],[2.773,0.625],[0.682,6.06],[-0.423,3.562],[-5.923,-1.812]],"o":[[-3.337,0.938],[-0.846,2.625],[-0.188,2.75],[0.658,2.688],[2.138,2.132],[1.504,-2.75],[-2.773,-0.625],[-0.752,-6.688],[0.423,-3.562],[-1.363,-3.5]],"v":[[-56.804,37.965],[-63.291,46.902],[-65.83,60.715],[-64.09,83.34],[-60.424,91.027],[-50.599,90.527],[-55.629,88.84],[-61.74,75.34],[-62.398,52.152],[-52.198,41.965]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[0.889,-0.414],[0.51,-2.625],[0.113,-2.75],[-0.397,-2.688],[-1.36,-2.25],[-0.907,2.75],[1.672,0.625],[0.411,6.06],[-0.255,3.562],[-3.57,-1.812]],"o":[[-2.012,0.938],[-0.51,2.625],[-0.113,2.75],[0.397,2.688],[1.289,2.132],[0.907,-2.75],[-1.672,-0.625],[-0.453,-6.688],[0.255,-3.562],[-0.822,-3.5]],"v":[[-57.656,37.965],[-61.566,46.902],[-63.096,60.715],[-62.048,83.34],[-59.838,91.027],[-53.916,90.527],[-56.948,88.84],[-60.631,75.34],[-61.028,52.152],[-54.879,41.965]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[1.961,-0.414],[1.125,-2.625],[0.25,-2.75],[-0.875,-2.688],[-3,-2.25],[-2,2.75],[3.688,0.625],[0.906,6.06],[-0.562,3.562],[-7.875,-1.812]],"o":[[-4.438,0.938],[-1.125,2.625],[-0.25,2.75],[0.875,2.688],[2.843,2.132],[2,-2.75],[-3.688,-0.625],[-1,-6.688],[0.562,-3.562],[-1.812,-3.5]],"v":[[-55.688,37.812],[-64.312,46.75],[-67.688,60.562],[-65.375,83.188],[-60.5,90.875],[-47.438,90.375],[-54.125,88.688],[-62.25,75.188],[-63.125,52],[-49.562,41.812]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.115,-0.447],[2.367,-3.649],[0.388,-2.953],[-0.944,-2.899],[-3.236,-2.427],[-3.489,1.131],[3.458,2.084],[0.978,6.537],[-2.745,4.933],[-8.494,-1.955]],"o":[[-4.787,1.011],[-2.639,4.067],[-1.663,12.664],[0.944,2.899],[3.066,2.3],[3.403,-1.103],[-3.455,-2.082],[-1.079,-7.214],[1.892,-3.399],[-1.955,-3.775]],"v":[[-34.402,32.316],[-46.215,42.003],[-52.635,58.015],[-50.991,81.296],[-43.118,90.023],[-25.462,93.338],[-37.357,85.791],[-48.155,72.985],[-45.258,48.946],[-21.117,35.368]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.292,-0.447],[2.565,-3.649],[0.42,-2.953],[-1.023,-2.899],[-3.507,-2.427],[-2.643,2.931],[3.748,2.084],[1.059,6.537],[-10.413,9.29],[-1.412,2.937]],"o":[[-5.187,1.011],[-2.86,4.067],[-1.802,12.664],[1.023,2.899],[3.322,2.3],[2.995,-3.322],[-3.744,-2.082],[-1.169,-7.214],[2.962,-2.643],[-2.119,-3.775]],"v":[[-28.174,32.59],[-41.752,41.616],[-48.276,57.245],[-46.15,81.57],[-37.619,90.297],[-18.486,93.612],[-31.376,86.065],[-43.077,73.259],[-32.983,42.489],[-13.779,35.642]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.961,-0.414],[1.125,-2.625],[0.25,-2.75],[-0.875,-2.688],[-3,-2.25],[-2,2.75],[3.688,0.625],[0.906,6.06],[-0.562,3.562],[-7.875,-1.812]],"o":[[-4.438,0.938],[-1.125,2.625],[-0.25,2.75],[0.875,2.688],[2.843,2.132],[2,-2.75],[-3.688,-0.625],[-1,-6.688],[0.562,-3.562],[-1.812,-3.5]],"v":[[-55.688,37.812],[-64.312,46.75],[-67.688,60.562],[-65.375,83.188],[-60.5,90.875],[-47.438,90.375],[-54.125,88.688],[-62.25,75.188],[-63.125,52],[-49.562,41.812]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.889,-0.414],[0.51,-2.625],[0.113,-2.75],[-0.397,-2.688],[-1.36,-2.25],[-0.907,2.75],[1.672,0.625],[0.411,6.06],[-0.255,3.562],[-3.57,-1.812]],"o":[[-2.012,0.938],[-0.51,2.625],[-0.113,2.75],[0.397,2.688],[1.289,2.132],[0.907,-2.75],[-1.672,-0.625],[-0.453,-6.688],[0.255,-3.562],[-0.822,-3.5]],"v":[[-57.656,37.965],[-61.566,46.902],[-63.096,60.715],[-62.048,83.34],[-59.838,91.027],[-53.916,90.527],[-56.948,88.84],[-60.631,75.34],[-61.028,52.152],[-54.879,41.965]]}],"t":435},{"s":[{"c":true,"i":[[2.115,-0.447],[2.367,-3.649],[0.388,-2.953],[-0.944,-2.899],[-3.236,-2.427],[-3.489,1.131],[3.458,2.084],[0.978,6.537],[-2.745,4.933],[-8.494,-1.955]],"o":[[-4.787,1.011],[-2.639,4.067],[-1.663,12.664],[0.944,2.899],[3.066,2.3],[3.403,-1.103],[-3.455,-2.082],[-1.079,-7.214],[1.892,-3.399],[-1.955,-3.775]],"v":[[-34.402,32.316],[-46.215,42.003],[-52.635,58.015],[-50.991,81.296],[-43.118,90.023],[-25.462,93.338],[-37.357,85.791],[-48.155,72.985],[-45.258,48.946],[-21.117,35.368]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.427450984716,1,0.811764717102,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"front highlight","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[3.094,-1.409],[0.859,0.04],[6.029,-6.524],[10.144,-5.113],[-1.496,0.289],[-1.775,1.334],[-2.841,6.865],[0.045,2.036]],"o":[[-2.816,1.282],[-0.859,-0.04],[-2.14,2.316],[-1.439,0.725],[3.775,-0.729],[3.26,-2.45],[2.559,-6.185],[-0.06,-2.664]],"v":[[2.934,59.706],[-1.98,61.787],[-8.687,82.136],[-23.157,94.439],[-12.99,94.374],[-3.413,91.073],[5.981,78.08],[8.616,56.62]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.861,-2.232],[0.859,0.04],[0.861,-2.665],[4.778,-6.256],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-3.97,1.823],[-0.859,-0.04],[-0.969,3],[-0.978,1.28],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[-29.287,75.336],[-38.665,78.203],[-40.93,84.843],[-47.07,94.576],[-39.623,95.317],[-30.118,94.176],[-20.725,81.184],[-18.12,67.701]]}],"t":30},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.861,-2.232],[0.859,0.04],[0.861,-2.665],[4.778,-6.256],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-3.97,1.823],[-0.859,-0.04],[-0.969,3],[-0.978,1.28],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[-29.287,75.336],[-38.665,78.203],[-40.93,84.843],[-47.07,94.576],[-39.623,95.317],[-30.118,94.176],[-20.725,81.184],[-18.12,67.701]]}],"t":125},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.682,-3.394],[0.859,0.04],[0.861,-2.665],[4.778,-6.256],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-3.895,1.978],[-0.859,-0.04],[-0.969,3],[-0.978,1.28],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[-33.18,73.844],[-43.749,77.558],[-45.368,84.098],[-50.831,94.452],[-43.384,95.192],[-33.879,94.052],[-24.486,81.059],[-21.881,67.576]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.441,-4.554],[0.859,0.04],[0.861,-2.665],[2.81,-7.701],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.569,3.87]],"o":[[-4.91,2.649],[-0.859,-0.04],[-0.969,3],[-0.552,1.513],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.388,-2.636]],"v":[[-36.928,63.227],[-49.537,66.775],[-50.424,82.509],[-53.591,94.067],[-46.144,94.807],[-33.19,93.32],[-26.288,82.208],[-24.336,56.405]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.861,-2.232],[0.859,0.04],[0.861,-2.665],[4.778,-6.256],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-3.97,1.823],[-0.859,-0.04],[-0.969,3],[-0.978,1.28],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[-29.287,75.336],[-38.665,78.203],[-40.93,84.843],[-47.07,94.576],[-39.623,95.317],[-30.118,94.176],[-20.725,81.184],[-18.12,67.701]]}],"t":218},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.199,-2.666],[2.895,-0.803],[2.381,-3.744],[11.287,-6.94],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-3.688,2.341],[-0.829,0.23],[-1.692,2.661],[-1.372,0.844],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[4.073,64.829],[-2.971,68.741],[-7.826,80.19],[-22.308,94.47],[-14.861,95.21],[-7.541,93.628],[4.037,81.077],[8.957,61.886]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.181,-1.208],[1.272,-0.88],[2.381,-3.744],[13.48,-3.698],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-0.746,0.763],[-0.707,0.489],[-1.692,2.661],[-1.554,0.426],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[10.442,60.317],[6.43,63.752],[3.238,76.829],[-17.485,94.506],[-10.039,95.246],[-2.718,93.664],[10.502,78.425],[13.285,57.244]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.861,-2.232],[0.859,0.04],[0.861,-2.665],[4.778,-6.256],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-3.97,1.823],[-0.859,-0.04],[-0.969,3],[-0.978,1.28],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[-29.287,75.336],[-38.665,78.203],[-40.93,84.843],[-47.07,94.576],[-39.623,95.317],[-30.118,94.176],[-20.725,81.184],[-18.12,67.701]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.792,-4.426],[0.926,0.043],[0.263,-3.006],[2.773,-6.311],[-1.635,-0.147],[-3.898,2.138],[-1.624,8.182],[0.049,2.194]],"o":[[-5.785,2.912],[-0.926,-0.043],[-0.411,4.699],[-0.698,1.589],[1.635,0.147],[1.104,-0.605],[1.404,-7.075],[-0.064,-2.871]],"v":[[-38.929,60.022],[-49.611,63.653],[-50.132,78.311],[-53.393,94.168],[-50.177,95.438],[-32.426,92.828],[-24.913,77.462],[-24.612,52.603]]}],"t":435},{"s":[{"c":true,"i":[[3.094,-1.409],[0.859,0.04],[6.029,-6.524],[10.144,-5.113],[-1.496,0.289],[-1.775,1.334],[-2.841,6.865],[0.045,2.036]],"o":[[-2.816,1.282],[-0.859,-0.04],[-2.14,2.316],[-1.439,0.725],[3.775,-0.729],[3.26,-2.45],[2.559,-6.185],[-0.06,-2.664]],"v":[[2.934,59.706],[-1.98,61.787],[-8.687,82.136],[-23.157,94.439],[-12.99,94.374],[-3.413,91.073],[5.981,78.08],[8.616,56.62]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.852,0.058],[2.356,-2.356],[3.842,0.067],[-0.055,-1.574],[0.482,-3.395],[4.928,-5.647],[-3.777,-0.147],[-5.427,0.458],[-0.145,3.111],[0.239,4.634]],"o":[[-2.852,-0.058],[-3.813,3.813],[-3.369,-0.059],[0.075,2.138],[-0.482,3.395],[3.553,-1.255],[3.777,0.147],[5.427,-0.458],[0.218,-4.677],[-0.148,-2.874]],"v":[[32.12,42.47],[22.358,48.175],[11.006,53.551],[9.257,57.052],[9.076,62.499],[2.655,83.919],[16.451,81.281],[43.575,78.771],[47.228,62.227],[47.121,49.643]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.644,0.053],[3.709,-0.451],[2.606,-1.723],[1.983,0.04],[0.447,-3.147],[-3.424,2.328],[-3.502,-0.137],[-5.031,0.424],[-0.134,2.885],[0.221,4.296]],"o":[[-2.644,-0.053],[-3.709,0.451],[-2.606,1.723],[-1.983,-0.04],[-0.447,3.147],[9.065,-6.163],[3.502,0.137],[5.031,-0.424],[0.202,-4.335],[-0.137,-2.664]],"v":[[32.812,50.181],[7.618,50.526],[-3.664,57.333],[-16.828,61.933],[-17.664,68.688],[-24.151,91.008],[-2.193,81.668],[31.113,78.447],[34.499,63.11],[34.324,54.255]]}],"t":30},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.644,0.053],[3.709,-0.451],[2.606,-1.723],[1.983,0.04],[0.447,-3.147],[-3.424,2.328],[-3.502,-0.137],[-5.031,0.424],[-0.134,2.885],[0.221,4.296]],"o":[[-2.644,-0.053],[-3.709,0.451],[-2.606,1.723],[-1.983,-0.04],[-0.447,3.147],[9.065,-6.163],[3.502,0.137],[5.031,-0.424],[0.202,-4.335],[-0.137,-2.664]],"v":[[32.812,50.181],[7.618,50.526],[-3.664,57.333],[-16.828,61.933],[-17.664,68.688],[-24.151,91.008],[-2.193,81.668],[31.113,78.447],[34.499,63.11],[34.324,54.255]]}],"t":125},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.644,0.053],[3.709,-0.451],[5.22,-2.696],[1.983,0.04],[0.447,-3.147],[-3.855,1.51],[-3.502,-0.137],[-5.031,0.424],[-0.134,2.885],[0.221,4.296]],"o":[[-2.644,-0.053],[-3.709,0.451],[-2.776,1.434],[-1.983,-0.04],[-0.447,3.147],[11.214,-4.393],[3.502,0.137],[5.031,-0.424],[0.202,-4.335],[-0.137,-2.664]],"v":[[31,50.043],[7.618,50.526],[-5.263,57.114],[-20.796,62.034],[-21.337,68.921],[-27.016,89.905],[-2.193,81.668],[31.113,78.447],[34.499,63.11],[33.541,54.505]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.644,0.053],[3.709,-0.451],[4.912,-0.17],[2.598,-0.547],[0.447,-3.147],[2.934,-3.18],[-3.502,-0.137],[-5.031,0.424],[-0.134,2.885],[0.221,4.296]],"o":[[-2.644,-0.053],[-3.709,0.451],[-3.121,0.108],[-1.94,0.409],[-0.447,3.147],[12.306,-4.815],[3.502,0.137],[5.031,-0.424],[0.202,-4.335],[-0.137,-2.664]],"v":[[32.679,50.171],[7.618,50.526],[-12.052,50.648],[-23.441,51.543],[-23.577,68.604],[-29.785,90.885],[-2.193,81.668],[31.113,78.447],[34.499,63.11],[34.267,54.273]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.644,0.053],[3.709,-0.451],[2.606,-1.723],[1.983,0.04],[0.447,-3.147],[-3.424,2.328],[-3.502,-0.137],[-5.031,0.424],[-0.134,2.885],[0.221,4.296]],"o":[[-2.644,-0.053],[-3.709,0.451],[-2.606,1.723],[-1.983,-0.04],[-0.447,3.147],[9.065,-6.163],[3.502,0.137],[5.031,-0.424],[0.202,-4.335],[-0.137,-2.664]],"v":[[32.812,50.181],[7.618,50.526],[-3.664,57.333],[-16.828,61.933],[-17.664,68.688],[-24.151,91.008],[-2.193,81.668],[31.113,78.447],[34.499,63.11],[34.324,54.255]]}],"t":218},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.916,0.629],[2.994,-1.991],[4.583,-2.398],[1.512,0.04],[0.341,-3.147],[4.318,-6.469],[-2.671,-0.137],[-3.837,0.424],[-0.102,2.885],[-0.135,4.297]],"o":[[-4.38,-1.437],[-2.79,1.856],[-2.33,1.219],[-0.022,0.706],[-0.341,3.147],[7.867,-4.292],[2.671,0.137],[3.837,-0.424],[0.154,-4.335],[0.239,-7.603]],"v":[[39.352,43.894],[26.343,48.971],[17.821,54.236],[9.048,58.02],[8.174,68.274],[2.521,85.531],[19.974,81.253],[45.375,78.032],[47.959,62.695],[47.825,53.84]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.916,0.629],[3.007,-2.581],[4.671,-2.699],[1.763,-0.801],[0.341,-3.147],[6.499,-8.079],[-2.671,-0.137],[-3.837,0.424],[-0.102,2.885],[-0.135,4.297]],"o":[[-4.38,-1.437],[-2.543,2.182],[-1.754,1.014],[-0.022,0.706],[-0.341,3.147],[7.867,-4.292],[2.671,0.137],[3.837,-0.424],[0.154,-4.335],[0.239,-7.603]],"v":[[34.76,41.83],[24.559,46.149],[18.068,50.721],[12.742,52.638],[13.224,63.612],[6.207,86.978],[19.974,81.253],[45.375,78.032],[47.959,62.695],[47.825,53.84]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.644,0.053],[3.709,-0.451],[2.606,-1.723],[1.983,0.04],[0.447,-3.147],[-3.424,2.328],[-3.502,-0.137],[-5.031,0.424],[-0.134,2.885],[0.221,4.296]],"o":[[-2.644,-0.053],[-3.709,0.451],[-2.606,1.723],[-1.983,-0.04],[-0.447,3.147],[9.065,-6.163],[3.502,0.137],[5.031,-0.424],[0.202,-4.335],[-0.137,-2.664]],"v":[[32.812,50.181],[7.618,50.526],[-3.664,57.333],[-16.828,61.933],[-17.664,68.688],[-24.151,91.008],[-2.193,81.668],[31.113,78.447],[34.499,63.11],[34.324,54.255]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.849,0.058],[4.465,0.468],[4.736,-0.186],[2.137,0.043],[-1.173,-5.898],[7.484,-11.108],[-4.003,0.771],[-5.422,0.457],[-0.145,3.108],[0.239,4.629]],"o":[[-2.849,-0.058],[-4.005,-0.42],[-3.364,0.132],[-2.137,-0.043],[1.19,5.983],[13.127,-6.091],[3.708,-0.714],[5.422,-0.457],[0.218,-4.672],[-0.148,-2.871]],"v":[[32.196,50.086],[5.453,50],[-7.071,50.002],[-15.464,50.641],[-24.998,51.095],[-30.622,91.854],[-5.289,81.908],[31.161,78.114],[34.014,64.019],[33.826,54.476]]}],"t":435},{"s":[{"c":true,"i":[[2.852,0.058],[2.356,-2.356],[3.842,0.067],[-0.055,-1.574],[0.482,-3.395],[4.928,-5.647],[-3.777,-0.147],[-5.427,0.458],[-0.145,3.111],[0.239,4.634]],"o":[[-2.852,-0.058],[-3.813,3.813],[-3.369,-0.059],[0.075,2.138],[-0.482,3.395],[3.553,-1.255],[3.777,0.147],[5.427,-0.458],[0.218,-4.677],[-0.148,-2.874]],"v":[[32.12,42.47],[22.358,48.175],[11.006,53.551],[9.257,57.052],[9.076,62.499],[2.655,83.919],[16.451,81.281],[43.575,78.771],[47.228,62.227],[47.121,49.643]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.001,-0.486],[3.789,-0.337],[0.911,-4.371],[-3.057,-2.224],[-5.076,4.217],[-0.359,5.683],[-0.665,4.555]],"o":[[-4.001,0.486],[-2.131,0.19],[-1.132,5.428],[4.63,3.368],[4.189,-3.481],[0.295,-4.672],[0.416,-2.847]],"v":[[23.414,80.937],[13.376,81.559],[12.137,96.684],[12.749,118.214],[26.826,118.513],[30.148,95.759],[31.955,81.245]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.845,-4.053],[-3.35,-1.398],[-5.173,1.609],[1.96,4.302],[-0.617,4.223]],"o":[[-3.709,0.451],[-1.827,0.771],[-1.049,5.032],[3.35,1.398],[5.173,-1.609],[-1.799,-3.95],[0.386,-2.64]],"v":[[12.421,80.455],[5.893,81.196],[5.043,95.232],[3.599,114.838],[16.988,115.55],[21.872,93.512],[20.252,80.706]]}],"t":30},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.845,-4.053],[-3.502,-0.137],[-5.031,0.424],[1.96,4.302],[-0.617,4.223]],"o":[[-3.709,0.451],[-1.827,0.771],[-1.049,5.032],[3.502,0.137],[5.031,-0.424],[-1.799,-3.95],[0.386,-2.64]],"v":[[12.421,80.455],[5.893,81.196],[5.043,95.232],[3.616,114.318],[17.005,115.03],[21.872,93.512],[20.252,80.706]]}],"t":125},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.845,-4.053],[-2.26,-2.678],[-4.806,1.547],[0.656,4.681],[0.19,4.523]],"o":[[-3.709,0.451],[-1.827,0.771],[-1.049,5.032],[3.317,3.93],[4.815,-1.55],[-0.609,-4.346],[-0.112,-2.665]],"v":[[12.421,80.455],[5.893,81.196],[5.043,95.232],[4.5,114.712],[19.443,116.296],[22.624,92.541],[20.252,80.706]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.71,-0.451],[2.43,-1.025],[0.553,-5.172],[-5.604,-4.913],[-2.85,3.045],[1.864,4.329],[-0.558,4.245]],"o":[[-3.709,0.451],[-1.827,0.771],[-0.547,5.111],[4.06,3.559],[3.118,-3.332],[-1.712,-3.979],[0.349,-2.641]],"v":[[12.421,80.455],[5.893,81.196],[4.62,95.402],[8.554,117.312],[22.81,116.165],[23.266,94.085],[20.252,80.706]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.845,-4.053],[-3.502,-0.137],[-5.031,0.424],[1.96,4.302],[-0.617,4.223]],"o":[[-3.709,0.451],[-1.827,0.771],[-1.049,5.032],[3.502,0.137],[5.031,-0.424],[-1.799,-3.95],[0.386,-2.64]],"v":[[12.421,80.455],[5.893,81.196],[5.043,95.232],[3.616,114.318],[17.005,115.03],[21.872,93.512],[20.252,80.706]]}],"t":218},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.408,-3.881],[-1.689,-3.214],[-5.173,1.609],[-0.145,4.725],[-0.617,4.223]],"o":[[-3.709,0.451],[-1.827,0.771],[-0.538,5.112],[2.787,5.305],[5.173,-1.609],[0.15,-4.898],[0.386,-2.64]],"v":[[19.944,81.092],[13.416,81.832],[11.963,96.019],[11.319,116.687],[25.901,119.557],[29.395,94.149],[31.107,80.773]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.408,-3.881],[-1.689,-3.214],[-5.173,1.609],[-0.145,4.725],[-0.617,4.223]],"o":[[-3.709,0.451],[-1.827,0.771],[-0.538,5.112],[2.787,5.305],[5.173,-1.609],[0.15,-4.898],[0.386,-2.64]],"v":[[19.944,81.092],[13.416,81.832],[11.963,96.019],[11.319,116.687],[25.901,119.557],[31.204,91.787],[32.494,80.315]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.845,-4.053],[-3.502,-0.137],[-5.031,0.424],[1.96,4.302],[-0.617,4.223]],"o":[[-3.709,0.451],[-1.827,0.771],[-1.049,5.032],[3.502,0.137],[5.031,-0.424],[-1.799,-3.95],[0.386,-2.64]],"v":[[12.421,80.455],[5.893,81.196],[5.043,95.232],[3.616,114.318],[17.005,115.03],[21.872,93.512],[20.252,80.706]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.997,-0.486],[1.782,-0.859],[0.094,-4.46],[-3.086,-2.177],[-4.548,2.518],[2.112,4.636],[-0.665,4.551]],"o":[[-3.997,0.486],[-0.701,0.355],[-0.191,9.032],[3.169,2.236],[4.76,-2.636],[-1.939,-4.256],[0.415,-2.845]],"v":[[15.459,79.584],[5.204,80.933],[6.932,96.771],[6.301,115.55],[20.356,118.581],[25.068,94.917],[23.322,81.117]]}],"t":435},{"s":[{"c":true,"i":[[4.001,-0.486],[3.789,-0.337],[0.911,-4.371],[-3.057,-2.224],[-5.076,4.217],[-0.359,5.683],[-0.665,4.555]],"o":[[-4.001,0.486],[-2.131,0.19],[-1.132,5.428],[4.63,3.368],[4.189,-3.481],[0.295,-4.672],[0.416,-2.847]],"v":[[23.414,80.937],[13.376,81.559],[12.137,96.684],[12.749,118.214],[26.826,118.513],[30.148,95.759],[31.955,81.245]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.68235296011,0.658823549747,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"shadows","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.854,-0.27],[4.488,2.906],[0.27,-4.045],[9.012,-9.367],[-2.977,0.735],[-2.682,0.36],[0.623,-6.118],[-1.299,9.644],[-0.768,4.591],[-2.697,1.348],[-4.002,0.232],[0.008,4.97],[1.935,2.935],[3.775,0.27]],"o":[[-5.126,-1.182],[8.961,6.763],[-0.27,4.045],[3.065,-2.016],[0.629,-0.195],[1.348,3.506],[-0.86,8.448],[0.793,-5.889],[0.93,-5.56],[2.697,-1.348],[5.377,-0.311],[-0.007,-4.52],[-1.532,-2.323],[-3.775,-0.27]],"v":[[11.094,40.608],[-3.2,34.29],[8.789,60.047],[-0.473,87],[8.113,82.258],[12.221,81.766],[10.375,113.204],[28.879,114.534],[29.311,91.623],[32.329,79.336],[41.87,78.277],[47.652,70.143],[46.416,47.6],[34.738,42.41]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.25,-3.75],[-3.077,1.046],[-9.057,3.305],[-3.353,0.132],[1.5,-5.5],[-2.704,6.31],[0.75,4.25],[-2.5,1.25],[-3.71,0.215],[0.007,4.608],[1.397,2.289],[2.763,-0.011]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.25,3.75],[13.824,-4.698],[4.473,-0.554],[1.25,3.25],[-1.118,4.1],[2.25,-5.25],[-0.75,-4.25],[2.5,-1.25],[4.985,-0.289],[-0.007,-4.191],[-1.397,-2.289],[-2.952,0.012]],"v":[[-7.328,45.163],[-30.329,38.733],[-31.25,65.25],[-31.479,92.984],[-5.764,82.123],[4.94,81.03],[2.5,111.75],[20.75,112],[20.75,91.5],[20.283,79.692],[29.526,77.981],[34.886,70.44],[33.15,49.821],[22.552,45.378]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.25,-3.75],[-3.077,1.046],[-9.057,3.305],[-3.353,0.132],[1.5,-5.5],[-2.704,6.31],[0.75,4.25],[-2.5,1.25],[-3.71,0.215],[0.393,4.591],[0.25,3.25],[3.5,0.25]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.25,3.75],[13.824,-4.698],[4.473,-0.554],[1.25,3.25],[-1.118,4.1],[2.25,-5.25],[-0.75,-4.25],[2.5,-1.25],[4.985,-0.289],[-0.463,-5.4],[-0.25,-3.25],[-3.5,-0.25]],"v":[[-7.328,45.163],[-30.329,38.733],[-31.25,65.25],[-31.479,92.984],[-5.764,82.123],[4.94,81.03],[2.5,111.75],[20.75,112],[20.75,91.5],[20.283,79.692],[29.526,77.981],[34.886,70.44],[32.967,50.41],[22.914,44.729]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.188,-3.75],[-3.077,1.046],[-9.057,3.305],[-3.353,0.132],[1.287,-8.382],[-4.909,4.798],[0.802,4.686],[-1.405,0.319],[-3.71,0.215],[0.007,4.608],[0.25,3.25],[3.5,0.25]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.188,3.75],[13.824,-4.698],[4.473,-0.554],[1.25,3.25],[-0.645,4.201],[4.155,-4.061],[-0.862,-5.035],[1.405,-0.319],[4.985,-0.289],[-0.007,-4.191],[-0.25,-3.25],[-3.5,-0.25]],"v":[[-7.328,45.163],[-33.581,38.232],[-38.447,65.402],[-34.731,92.483],[-5.764,82.123],[4.94,81.03],[3.266,112.098],[20.917,114.741],[22.198,91.191],[20.264,79.26],[29.526,77.981],[34.886,70.44],[33.026,51.377],[25.338,45.615]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.113,-3.75],[-2.217,1.046],[-9.057,3.305],[-3.353,0.132],[-2.301,-8.441],[-4.69,8.763],[2.368,6.629],[-0.905,0.331],[-3.71,0.215],[0.007,4.608],[0.25,3.25],[3.5,0.25]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.113,3.75],[9.961,-4.698],[4.473,-0.554],[1.25,3.25],[1.624,5.958],[3.534,-6.604],[-1.452,-4.064],[2.578,-1.08],[4.985,-0.289],[-0.007,-4.191],[-0.25,-3.25],[-3.5,-0.25]],"v":[[-7.577,45.758],[-33.581,38.232],[-46.627,65.402],[-33.144,92.306],[-5.764,82.123],[4.94,81.03],[4.791,112.226],[23.357,114.452],[22.216,91.623],[20.283,79.692],[29.526,77.981],[34.886,70.44],[33.74,49.54],[26.97,46.229]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.25,-3.75],[-3.077,1.046],[-9.057,3.305],[-3.353,0.132],[1.5,-5.5],[-2.704,6.31],[0.75,4.25],[-2.5,1.25],[-3.71,0.215],[0.007,4.608],[0.25,3.25],[3.5,0.25]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.25,3.75],[13.824,-4.698],[4.473,-0.554],[1.25,3.25],[-1.118,4.1],[2.25,-5.25],[-0.75,-4.25],[2.5,-1.25],[4.985,-0.289],[-0.007,-4.191],[-0.25,-3.25],[-3.5,-0.25]],"v":[[-7.328,45.163],[-30.329,38.733],[-31.25,65.25],[-31.479,92.984],[-5.764,82.123],[4.94,81.03],[2.5,111.75],[20.75,112],[20.75,91.5],[20.283,79.692],[29.526,77.981],[34.886,70.44],[33.74,49.54],[22.914,44.729]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.854,-0.27],[4.488,2.906],[0.27,-4.045],[9.012,-9.367],[-2.97,0.761],[-3.617,0.143],[0.623,-6.118],[-1.299,9.644],[-0.768,4.591],[-2.697,1.348],[-4.002,0.232],[0.008,4.97],[1.935,2.935],[3.775,0.27]],"o":[[-5.126,-1.182],[8.961,6.763],[-0.27,4.045],[3.065,-2.016],[2.107,-0.54],[1.348,3.506],[-0.86,8.448],[0.793,-5.889],[0.93,-5.56],[2.697,-1.348],[5.377,-0.311],[-0.007,-4.52],[-1.532,-2.323],[-3.775,-0.27]],"v":[[11.094,40.608],[-3.2,34.29],[8.789,60.047],[-0.473,87],[12.352,81.275],[12.258,80.33],[10.375,113.204],[28.879,114.534],[29.311,91.623],[32.329,79.336],[41.87,78.277],[47.652,70.143],[46.416,47.6],[34.738,42.41]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.854,-0.27],[4.863,2.906],[0.27,-4.045],[9.012,-9.367],[-2.554,1.696],[-2.988,1.348],[0.623,-6.118],[-1.299,9.644],[-0.346,4.642],[-0.209,-0.023],[-4.002,0.232],[0.008,4.97],[1.935,2.935],[3.785,0.029]],"o":[[-5.126,-1.182],[9.711,6.763],[-0.27,4.045],[3.065,-2.016],[2.568,-1.705],[-0.082,3.979],[-0.86,8.448],[0.793,-5.889],[0.403,-5.412],[2.685,-1.372],[5.377,-0.311],[-0.007,-4.52],[-1.532,-2.323],[-3.785,-0.029]],"v":[[15.576,40.882],[2.552,34.988],[13.27,60.321],[4.304,89.132],[10.511,84.638],[12.742,83.078],[10.375,113.204],[28.879,114.534],[30.966,91.315],[32.329,79.336],[41.87,78.277],[47.652,70.143],[46.416,47.6],[33.357,41.308]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.25,-3.75],[-3.077,1.046],[-9.057,3.305],[-3.353,0.132],[1.5,-5.5],[-2.704,6.31],[0.75,4.25],[-2.5,1.25],[-3.71,0.215],[0.007,4.608],[0.25,3.25],[3.5,0.25]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.25,3.75],[13.824,-4.698],[4.473,-0.554],[1.25,3.25],[-1.118,4.1],[2.25,-5.25],[-0.75,-4.25],[2.5,-1.25],[4.985,-0.289],[-0.007,-4.191],[-0.25,-3.25],[-3.5,-0.25]],"v":[[-7.328,45.163],[-30.329,38.733],[-31.25,65.25],[-31.479,92.984],[-5.764,82.123],[4.94,81.03],[2.5,111.75],[20.75,112],[20.75,91.5],[20.283,79.692],[29.526,77.981],[34.886,70.44],[33.74,49.54],[22.914,44.729]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.113,-3.75],[-2.217,1.046],[-9.057,3.305],[-3.353,0.132],[2.966,-6.559],[-4.586,10.307],[2.368,6.629],[-1.353,0.05],[-3.71,0.215],[0.007,4.608],[0.25,3.25],[3.5,0.25]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.113,3.75],[9.961,-4.698],[4.473,-0.554],[1.25,3.25],[-2.544,5.627],[3.045,-6.843],[-1.452,-4.064],[2.259,-0.083],[4.985,-0.289],[-0.007,-4.191],[-0.25,-3.25],[-3.5,-0.25]],"v":[[-7.577,45.758],[-33.581,38.232],[-46.627,65.402],[-33.144,92.306],[-5.764,82.123],[4.94,81.03],[5.062,110.692],[23.357,114.452],[24.564,93.437],[23.461,78.421],[29.526,77.981],[34.886,70.44],[32.884,49.735],[26.97,46.229]]}],"t":435},{"s":[{"c":true,"i":[[4.854,-0.27],[4.488,2.906],[0.27,-4.045],[9.012,-9.367],[-2.97,0.761],[-3.617,0.143],[0.623,-6.118],[-1.299,9.644],[-0.768,4.591],[-2.697,1.348],[-4.002,0.232],[0.008,4.97],[1.935,2.935],[3.775,0.27]],"o":[[-5.126,-1.182],[8.961,6.763],[-0.27,4.045],[3.065,-2.016],[2.107,-0.54],[1.348,3.506],[-0.86,8.448],[0.793,-5.889],[0.93,-5.56],[2.697,-1.348],[5.377,-0.311],[-0.007,-4.52],[-1.532,-2.323],[-3.775,-0.27]],"v":[[11.094,40.608],[-3.2,34.29],[8.789,60.047],[-0.307,87.516],[7.048,82.37],[12.396,81.782],[10.375,113.204],[28.879,114.534],[29.311,91.623],[32.329,79.336],[41.87,78.277],[47.652,70.143],[46.416,47.6],[34.738,42.41]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[12.54,1.014],[5.764,-2.861],[3.074,-9.856],[-3.298,-7.308],[-6.772,-3.28],[-5.393,0],[-3.489,2.594],[-1.162,8.006],[1.649,4.533]],"o":[[-8.945,-0.723],[-4.855,2.41],[-2.908,9.325],[2.295,5.086],[5.361,2.597],[5.393,0],[6.67,-4.959],[1.214,-8.36],[-2.157,-5.933]],"v":[[-15.612,30.083],[-37.984,32.486],[-52.473,53.526],[-50.96,80.551],[-38.113,92.826],[-21.279,94.782],[-2.125,89.307],[7.623,66.015],[6.859,47.587]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-5.5,-0.5],[-5,0],[-2,3.5],[-1.077,7.422],[1.528,4.203]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.5,0.5],[5,0],[2,-3.5],[1.125,-7.75],[-2,-5.5]],"v":[[-36.84,35.886],[-56.09,36.386],[-68.09,56.886],[-66.59,82.386],[-59.09,95.386],[-37.34,95.386],[-25.84,90.261],[-18.715,69.386],[-21.59,48.386]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-5.5,-0.5],[-5,0],[-2,3.5],[-1.077,7.422],[1.528,4.203]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.5,0.5],[5,0],[2,-3.5],[1.125,-7.75],[-2,-5.5]],"v":[[-36.84,35.886],[-56.09,36.386],[-68.09,56.886],[-66.59,82.386],[-59.09,95.386],[-37.34,95.386],[-25.84,90.261],[-18.715,69.386],[-21.59,48.386]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[9,-0.5],[3.761,-0.5],[0.752,-9],[-1.88,-7],[-4.137,-0.5],[-5,0],[-2,3.5],[-1.077,7.422],[1.528,4.203]],"o":[[-9,0.5],[-3.761,0.5],[-0.752,9],[1.02,3.796],[4.137,0.5],[5,0],[2,-3.5],[1.125,-7.75],[-2,-5.5]],"v":[[-36.84,35.886],[-57.129,36.539],[-66.155,57.039],[-65.026,82.539],[-59.386,95.539],[-40.592,94.885],[-29.092,89.76],[-21.967,68.885],[-24.842,47.885]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[9,-0.5],[2.267,-0.5],[0.453,-9],[-1.133,-7],[-2.493,-0.5],[-5,0],[-1.441,3.5],[-0.776,7.422],[1.101,4.203]],"o":[[-9,0.5],[-2.267,0.5],[-0.453,9],[0.615,3.796],[2.493,0.5],[5,0],[1.441,-3.5],[0.811,-7.75],[-1.441,-5.5]],"v":[[-36.84,35.886],[-57.888,36.539],[-63.327,57.039],[-62.648,82.539],[-59.248,95.539],[-40.592,94.885],[-29.081,89.583],[-23.946,68.708],[-26.018,47.708]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-5.5,-0.5],[-5,0],[-2,3.5],[-1.077,7.422],[1.528,4.203]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.5,0.5],[5,0],[2,-3.5],[1.125,-7.75],[-2,-5.5]],"v":[[-36.84,35.886],[-56.09,36.386],[-68.09,56.886],[-66.59,82.386],[-59.09,95.386],[-37.34,95.386],[-25.84,90.261],[-18.715,69.386],[-21.59,48.386]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[12.54,1.014],[5.764,-2.861],[3.074,-9.856],[-3.298,-7.308],[-6.772,-3.28],[-5.393,0],[-3.13,3.019],[-1.162,8.006],[1.649,4.533]],"o":[[-8.945,-0.723],[-4.855,2.41],[-2.908,9.325],[2.295,5.086],[5.361,2.597],[5.393,0],[4.74,-4.572],[1.214,-8.36],[-2.157,-5.933]],"v":[[-15.612,30.083],[-37.984,32.486],[-52.473,53.526],[-50.96,80.551],[-38.113,92.826],[-21.279,94.782],[-3.457,90.809],[8.335,65.959],[6.859,47.587]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[13.588,1.014],[6.246,-2.861],[3.331,-9.856],[-3.573,-7.308],[-7.338,-3.28],[-5.844,0],[-4.244,0.947],[0.792,8.47],[1.649,4.533]],"o":[[-9.693,-0.723],[-5.261,2.41],[-3.152,9.325],[2.487,5.086],[5.81,2.597],[5.844,0],[6.027,-1.345],[-0.787,-8.411],[-2.157,-5.933]],"v":[[-11.892,30.311],[-32.048,32.76],[-47.748,53.8],[-46.109,80.825],[-32.188,93.1],[-13.946,95.056],[-0.633,92.434],[12.703,66.53],[11.34,47.862]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-5.5,-0.5],[-5,0],[-2,3.5],[-1.077,7.422],[1.528,4.203]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.5,0.5],[5,0],[2,-3.5],[1.125,-7.75],[-2,-5.5]],"v":[[-36.84,35.886],[-56.09,36.386],[-68.09,56.886],[-66.59,82.386],[-59.09,95.386],[-37.34,95.386],[-25.84,90.261],[-18.715,69.386],[-21.59,48.386]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[9,-0.5],[2.267,-0.5],[0.453,-9],[-1.133,-7],[-2.493,-0.5],[-5,0],[-1.441,3.5],[-0.776,7.422],[1.101,4.203]],"o":[[-9,0.5],[-2.267,0.5],[-0.453,9],[0.615,3.796],[2.493,0.5],[5,0],[1.441,-3.5],[0.811,-7.75],[-1.441,-5.5]],"v":[[-36.84,35.886],[-57.888,36.539],[-63.327,57.039],[-62.648,82.539],[-59.248,95.539],[-40.592,94.885],[-29.081,89.583],[-23.946,68.708],[-26.018,47.708]]}],"t":435},{"s":[{"c":true,"i":[[12.54,1.014],[5.764,-2.861],[3.074,-9.856],[-3.298,-7.308],[-6.772,-3.28],[-5.393,0],[-3.611,2.422],[-0.609,8.067],[1.649,4.533]],"o":[[-8.945,-0.723],[-4.855,2.41],[-2.908,9.325],[2.295,5.086],[5.361,2.597],[5.393,0],[7.832,-5.252],[0.651,-8.622],[-2.157,-5.933]],"v":[[-15.612,30.083],[-37.984,32.486],[-52.473,53.526],[-50.96,80.551],[-38.113,92.826],[-21.279,94.782],[-4.444,91.146],[8.427,66.261],[6.859,47.587]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0.09,0.114]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"fill","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":23,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1186.375,89.045,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-1160.358,116.389,0]},"r":{"a":0,"ix":10,"k":75},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Front arm strap","op":480,"parent":21,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[12.857,2.5],[2.764,25.439],[-26.459,-0.537],[-6.407,-2.007],[-3.831,-6.997],[18.082,-18.824]],"o":[[-12.857,-2.5],[-2.821,-25.97],[6.713,0.136],[7.502,2.35],[5.398,9.859],[0,0]],"v":[[-1216.656,124.95],[-1259.419,93.797],[-1216.64,44.711],[-1193.813,47.808],[-1171.316,69.561],[-1181.867,126.018]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.278431385756,0.745098054409,0.666666686535,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Front strap","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":24,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1295.661,56.187,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-1295.661,56.187,0]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0],"y":[0.926]},"o":{"x":[0.226],"y":[-0.013]},"s":[-24],"t":0},{"i":{"x":[0.687],"y":[0.869]},"o":{"x":[0.585],"y":[-0.198]},"s":[-36.742],"t":33},{"i":{"x":[0.955],"y":[0.565]},"o":{"x":[0.587],"y":[-0.088]},"s":[-31.84],"t":91},{"i":{"x":[0.226],"y":[1.052]},"o":{"x":[0.02],"y":[0.024]},"s":[-40.546],"t":128},{"i":{"x":[0.658],"y":[1.501]},"o":{"x":[0.597],"y":[-0.816]},"s":[-69.071],"t":143},{"i":{"x":[0.625],"y":[0.881]},"o":{"x":[0.299],"y":[0.036]},"s":[-74.765],"t":204},{"i":{"x":[0.574],"y":[1.769]},"o":{"x":[0.267],"y":[0.827]},"s":[-43.204],"t":232},{"i":{"x":[0.597],"y":[0.901]},"o":{"x":[0.266],"y":[-0.089]},"s":[-35.123],"t":302},{"i":{"x":[0.615],"y":[1.3]},"o":{"x":[0.407],"y":[-0.131]},"s":[-18.224],"t":329},{"i":{"x":[0.935],"y":[0.735]},"o":{"x":[0.482],"y":[0.199]},"s":[-50.369],"t":396},{"i":{"x":[0.654],"y":[0.876]},"o":{"x":[0.044],"y":[0.536]},"s":[-38.603],"t":409},{"i":{"x":[0.833],"y":[0.951]},"o":{"x":[0.353],"y":[0.48]},"s":[-26.41],"t":449},{"s":[-24],"t":479}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Head","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[5.89,6.29],[6.173,10.555],[-31.869,41.718],[-36.964,8.089],[-22.543,-6.035],[-28.001,-21.569],[-7.57,-23.772],[10.449,-25.082],[11.602,-15.659],[38.213,-10.108]],"o":[[-20.212,-6.536],[-8.358,-8.925],[-25.392,-43.416],[31.869,-41.718],[26.695,-5.842],[17.838,4.776],[14.275,10.996],[8.245,25.89],[-7.441,17.862],[-7.5,10.122],[0,0]],"v":[[-1364.594,64.448],[-1407.25,36.836],[-1426.34,14.633],[-1419.443,-140.192],[-1320.859,-204.684],[-1242.125,-201.011],[-1170.206,-163.671],[-1131.645,-104.785],[-1134.655,-19.767],[-1159.368,23.794],[-1225.449,64.952]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Helmet","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[6.215,-6.562],[-1.842,-2.745],[-0.868,5.473],[-2.758,7.671]],"o":[[-6.749,7.126],[3.458,5.153],[0.312,-1.97],[2.018,-5.614]],"v":[[-1419.524,-106.473],[-1428.594,-78.459],[-1417.324,-79.167],[-1409.596,-101.248]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[11.173,3.061],[26.271,-9.478],[20.055,-21.006],[-6.194,1.313],[-7.789,8.079],[-12.587,6.129],[-20.168,0.294]],"o":[[-25.199,-6.905],[-27.942,10.081],[-19.713,20.647],[6.859,-1.454],[8.751,-9.077],[27.19,-13.24],[13.305,-0.194]],"v":[[-1256.206,-188.055],[-1332.986,-183.559],[-1396.688,-139.562],[-1400.137,-113.137],[-1375.442,-136.589],[-1337.667,-164.576],[-1258.15,-175.655]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[1,1,1,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Helmet highlights","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.512,7.595],[-0.635,0.143],[-0.427,-0.359],[-0.672,-1.633],[-1.303,-6.385]],"o":[[1.509,-8.231],[0.273,-0.591],[0.544,-0.122],[1.352,1.136],[2.48,6.026],[0,0]],"v":[[-1365.8,-105.074],[-1358.227,-128.939],[-1356.959,-130.329],[-1355.442,-129.783],[-1352.661,-125.338],[-1346.97,-106.666]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.3,7.69],[-0.631,0.16],[-0.437,-0.347],[-0.425,-1.714],[-1.48,-6.346]],"o":[[1.281,-8.27],[0.257,-0.598],[0.54,-0.137],[1.383,1.098],[1.902,7.674],[0,0]],"v":[[-1364.701,-104.599],[-1356.78,-128.316],[-1355.551,-129.74],[-1354.02,-129.236],[-1351.116,-124.871],[-1348.879,-99.233]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.512,7.595],[-0.635,0.143],[-0.427,-0.359],[-0.377,-1.725],[-1.303,-6.385]],"o":[[1.51,-8.231],[0.273,-0.591],[0.544,-0.122],[1.352,1.136],[1.688,7.724],[0,0]],"v":[[-1371.9,-108.131],[-1363.324,-131.619],[-1362.056,-133.009],[-1360.539,-132.463],[-1357.758,-128.018],[-1356.233,-102.328]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-2.577,7.595],[-0.466,0.143],[-0.313,-0.359],[-0.277,-1.725],[-0.956,-6.385]],"o":[[1.108,-8.231],[0.201,-0.591],[0.399,-0.122],[0.992,1.136],[1.239,7.724],[0,0]],"v":[[-1363.96,-108.131],[-1357.667,-131.619],[-1356.737,-133.009],[-1356.344,-132.991],[-1355.119,-128.038],[-1354.97,-102.837]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-2.577,7.595],[-0.466,0.143],[-0.313,-0.359],[-0.277,-1.725],[-0.956,-6.385]],"o":[[1.108,-8.231],[0.201,-0.591],[0.399,-0.122],[0.992,1.136],[1.239,7.724],[0,0]],"v":[[-1363.96,-108.131],[-1357.667,-131.619],[-1356.737,-133.009],[-1356.344,-132.991],[-1355.119,-128.038],[-1354.97,-102.837]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.079,7.781],[-0.626,0.178],[-0.446,-0.334],[-0.474,-1.701],[-1.66,-6.301]],"o":[[1.044,-8.303],[0.24,-0.605],[0.536,-0.153],[1.413,1.058],[2.12,7.617],[0,0]],"v":[[-1364.337,-102.569],[-1357.096,-126.502],[-1355.908,-127.961],[-1354.363,-127.501],[-1351.336,-123.22],[-1348.368,-97.656]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-3.066,7.786],[-0.626,0.179],[-0.447,-0.333],[-0.476,-1.7],[-1.671,-6.298]],"o":[[1.03,-8.304],[0.239,-0.606],[0.536,-0.154],[1.415,1.056],[2.133,7.613],[0,0]],"v":[[-1365.605,-104.545],[-1358.404,-128.49],[-1357.218,-129.951],[-1355.673,-129.494],[-1352.638,-125.218],[-1349.628,-99.659]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-2.577,7.595],[-0.466,0.143],[-0.313,-0.359],[-0.277,-1.725],[-0.956,-6.385]],"o":[[1.108,-8.231],[0.201,-0.591],[0.399,-0.122],[0.992,1.136],[1.239,7.724],[0,0]],"v":[[-1358.841,-107.556],[-1352.549,-131.044],[-1351.618,-132.434],[-1351.226,-132.416],[-1350.001,-127.463],[-1349.852,-102.262]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-2.577,7.595],[-0.466,0.143],[-0.313,-0.359],[-0.277,-1.725],[-0.956,-6.385]],"o":[[1.108,-8.231],[0.201,-0.591],[0.399,-0.122],[0.992,1.136],[1.239,7.724],[0,0]],"v":[[-1358.841,-107.556],[-1352.549,-131.044],[-1351.618,-132.434],[-1351.226,-132.416],[-1350.001,-127.463],[-1349.852,-102.262]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.3,7.69],[-0.631,0.16],[-0.437,-0.347],[-0.425,-1.714],[-0.446,-7.909]],"o":[[1.281,-8.27],[0.257,-0.598],[0.54,-0.137],[1.383,1.098],[1.902,7.674],[0,0]],"v":[[-1364.701,-104.599],[-1356.78,-128.316],[-1355.551,-129.74],[-1353.308,-131.969],[-1351.116,-124.871],[-1347.846,-99.839]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[-3.512,7.595],[-0.635,0.143],[-0.427,-0.359],[-0.672,-1.633],[-1.303,-6.385]],"o":[[1.509,-8.231],[0.273,-0.591],[0.544,-0.122],[1.352,1.136],[2.48,6.026],[0,0]],"v":[[-1365.8,-105.074],[-1358.227,-128.939],[-1356.959,-130.329],[-1355.442,-129.783],[-1352.661,-125.338],[-1346.97,-106.666]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.07,5.251],[-0.108,-0.675],[3.571,-8.522]],"o":[[4.995,-7.253],[0.557,0.396],[1.463,9.123],[0,0]],"v":[[-1225.614,-100.355],[-1206.01,-123.816],[-1205.181,-122.003],[-1209.769,-90.298]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-6.937,5.362],[-0.194,-1.684],[2.484,-8.594]],"o":[[4.792,-7.389],[1.199,-0.927],[1.022,8.858],[0,0]],"v":[[-1242.087,-106.267],[-1220.747,-130.683],[-1218.565,-123.91],[-1222.645,-97.95]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.083,5.167],[-0.148,-1.689],[2.722,-8.522]],"o":[[4.995,-7.253],[1.225,-0.893],[0.776,8.883],[0,0]],"v":[[-1249.287,-106.397],[-1227.278,-130.212],[-1225.284,-123.382],[-1230.083,-97.545]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-5.785,5.167],[0.287,-1.669],[2.223,-8.522]],"o":[[4.08,-7.253],[1,-0.893],[-1.641,9.531],[0,0]],"v":[[-1251.409,-107.732],[-1228.961,-134.023],[-1230.232,-124.448],[-1235.725,-98.879]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-5.785,5.167],[0.287,-1.669],[2.223,-8.522]],"o":[[4.08,-7.253],[1,-0.893],[-1.641,9.531],[0,0]],"v":[[-1251.409,-107.732],[-1228.961,-134.023],[-1230.232,-124.448],[-1235.725,-98.879]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-6.781,5.557],[-0.242,-1.678],[2.238,-8.662]],"o":[[4.58,-7.523],[1.172,-0.961],[1.274,8.825],[0,0]],"v":[[-1241.821,-107.734],[-1221.186,-132.749],[-1218.811,-126.042],[-1222.149,-99.976]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-6.772,5.568],[-0.245,-1.678],[2.224,-8.665]],"o":[[4.567,-7.53],[1.171,-0.963],[1.289,8.823],[0,0]],"v":[[-1243.098,-109.916],[-1222.505,-134.965],[-1220.119,-128.262],[-1223.412,-102.19]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-5.785,5.167],[0.287,-1.669],[2.223,-8.522]],"o":[[4.08,-7.253],[1,-0.893],[-1.641,9.531],[0,0]],"v":[[-1244.767,-102.713],[-1221.914,-132.847],[-1223.177,-122.872],[-1230.606,-98.305]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-5.785,5.167],[0.287,-1.669],[2.223,-8.522]],"o":[[4.08,-7.253],[1,-0.893],[-1.641,9.531],[0,0]],"v":[[-1244.767,-102.713],[-1221.914,-132.847],[-1223.177,-122.872],[-1230.606,-98.305]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-6.093,5.849],[-0.194,-1.684],[2.484,-8.594]],"o":[[4.792,-7.389],[1.094,-1.05],[1.022,8.858],[0,0]],"v":[[-1238.151,-104.132],[-1217.559,-129.035],[-1215.376,-122.263],[-1219.456,-96.302]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[-7.07,5.251],[-0.108,-0.675],[3.571,-8.522]],"o":[[4.995,-7.253],[0.557,0.396],[1.463,9.123],[0,0]],"v":[[-1225.614,-100.355],[-1206.01,-123.816],[-1205.181,-122.003],[-1209.769,-90.298]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Ear lines","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-25.907,60.866],[-5.612,13.435],[-2.809,-1.873],[-3.178,-8.896],[0.936,-15.607],[-15.607,0.312],[-9.988,-2.497],[-0.936,-0.312],[-4.603,5.992],[-3.746,-1.249],[2.185,-33.086],[0.48,-4.519],[0.708,-2.374],[3.746,-11.861],[38.08,-4.682],[29.029,23.098]],"o":[[0,0],[5.695,-13.633],[2.809,1.873],[3.337,9.34],[0,0],[15.607,-0.312],[9.988,2.497],[0.936,0.312],[7.745,-10.082],[3.746,1.249],[-2.185,33.086],[-0.558,5.25],[-0.736,2.466],[-3.746,11.861],[-38.08,4.682],[-29.029,-23.098]],"v":[[-1374.467,-97.702],[-1360.421,-143.274],[-1348.56,-158.569],[-1339.508,-138.28],[-1333.89,-107.066],[-1302.364,-104.569],[-1237.128,-100.511],[-1233.694,-99.575],[-1216.839,-122.049],[-1194.365,-145.147],[-1186.25,-112.685],[-1187.498,-65.552],[-1188.123,-51.818],[-1198.735,23.094],[-1243.37,54.308],[-1380.398,42.134]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-26.057,60.924],[-7.142,12.688],[-2.86,-1.794],[-1.508,-9.326],[0.503,-15.627],[-13.17,0.678],[-8.504,-2.262],[-0.799,-0.29],[-7.645,7.817],[-5.72,3.409],[0.747,-33.12],[0.24,-4.528],[0.474,-2.388],[2.524,-11.936],[37.936,-5.736],[33.586,15.752]],"o":[[0,0],[7.142,-12.688],[2.86,1.794],[1.508,9.326],[0,0],[13.17,-0.678],[8.504,2.262],[0.799,0.29],[6.582,-6.73],[2.724,-1.624],[-0.747,33.12],[-0.279,5.26],[-0.492,2.481],[-2.524,11.936],[-37.936,5.736],[-27.879,-13.075]],"v":[[-1366.978,-94.103],[-1354.201,-140.046],[-1342.769,-155.664],[-1338.391,-137.439],[-1335.827,-104.344],[-1311.092,-102.931],[-1255.894,-100.403],[-1252.969,-99.548],[-1227.771,-129.242],[-1207.068,-149.273],[-1193.274,-113.911],[-1192.918,-66.77],[-1193.012,-53.028],[-1199.02,22.08],[-1231.716,54.213],[-1374.57,46.578]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-27.737,60.178],[-7.491,12.485],[-2.809,-1.873],[-1.249,-9.364],[0.936,-15.607],[-13.183,0.312],[-8.437,-2.497],[-0.791,-0.312],[-7.859,7.602],[-5.813,3.249],[1.665,-33.086],[0.366,-4.519],[0.54,-2.374],[2.854,-11.861],[38.08,-4.682],[36.619,19.677]],"o":[[0,0],[7.491,-12.485],[2.809,1.873],[1.249,9.364],[0,0],[13.183,-0.312],[8.437,2.497],[0.791,0.312],[6.766,-6.545],[2.768,-1.547],[-1.665,33.086],[-0.425,5.25],[-0.561,2.467],[-2.854,11.861],[-38.08,4.682],[-27.125,-14.576]],"v":[[-1374.467,-97.702],[-1360.421,-143.274],[-1348.56,-158.569],[-1344.69,-140.229],[-1343.044,-107.075],[-1318.357,-104.977],[-1263.251,-100.919],[-1260.351,-99.983],[-1234.339,-128.967],[-1213.089,-148.416],[-1200.281,-112.685],[-1201.232,-65.552],[-1201.708,-51.818],[-1209.796,23.094],[-1243.37,54.308],[-1385.958,42.714]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-20.352,60.178],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-7.859,7.602],[-5.813,3.249],[1.665,-33.086],[0.366,-4.519],[0.54,-2.374],[2.854,-11.861],[38.08,-4.682],[33.137,16.677]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.766,-6.545],[2.768,-1.547],[-1.665,33.086],[-0.425,5.25],[-0.561,2.466],[-2.854,11.861],[-38.08,4.682],[-27.506,-13.843]],"v":[[-1365.844,-97.702],[-1355.537,-143.274],[-1346.834,-158.569],[-1337.848,-140.879],[-1330.687,-106.336],[-1312.745,-104.977],[-1262.506,-100.919],[-1260.351,-99.983],[-1234.339,-128.967],[-1213.089,-148.416],[-1200.281,-112.685],[-1201.232,-65.552],[-1201.708,-51.818],[-1209.796,23.094],[-1243.37,54.308],[-1369.772,46.612]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-20.352,60.178],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-7.859,7.602],[-5.813,3.249],[1.665,-33.086],[0.366,-4.519],[0.54,-2.374],[2.854,-11.861],[38.08,-4.682],[33.137,16.677]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.766,-6.545],[2.768,-1.547],[-1.665,33.086],[-0.425,5.25],[-0.561,2.466],[-2.854,11.861],[-38.08,4.682],[-27.506,-13.843]],"v":[[-1365.844,-97.702],[-1355.537,-143.274],[-1346.834,-158.569],[-1337.848,-140.879],[-1330.687,-106.336],[-1312.745,-104.977],[-1262.506,-100.919],[-1260.351,-99.983],[-1234.339,-128.967],[-1213.089,-148.416],[-1200.281,-112.685],[-1201.232,-65.552],[-1201.708,-51.818],[-1209.796,23.094],[-1243.37,54.308],[-1369.772,46.612]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-24.308,61.643],[-6.777,12.887],[-2.91,-1.712],[-1.773,-9.279],[0.057,-15.635],[-13.145,1.053],[-8.565,-2.019],[-0.807,-0.267],[-7.419,8.032],[-5.621,3.571],[-0.198,-33.128],[0.111,-4.533],[0.406,-2.4],[2.183,-12.003],[37.757,-6.816],[34.022,14.787]],"o":[[0,0],[6.777,-12.887],[2.91,1.712],[1.773,9.279],[0,0],[13.145,-1.053],[8.565,2.019],[0.807,0.267],[6.387,-6.915],[2.677,-1.701],[0.198,33.128],[-0.129,5.266],[-0.422,2.494],[-2.183,12.003],[-37.757,6.816],[-28.241,-12.275]],"v":[[-1366.314,-92.012],[-1354.853,-138.302],[-1343.871,-154.239],[-1338.975,-136.146],[-1335.468,-103.138],[-1310.702,-102.431],[-1255.455,-101.479],[-1252.506,-100.707],[-1228.165,-131.108],[-1208.043,-151.722],[-1193.246,-116.768],[-1191.545,-69.656],[-1191.247,-55.917],[-1195.109,19.331],[-1226.875,52.384],[-1369.889,48.828]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-24.205,61.684],[-6.755,12.898],[-2.913,-1.707],[-1.789,-9.276],[0.031,-15.635],[-13.143,1.075],[-8.568,-2.004],[-0.808,-0.266],[-7.406,8.045],[-5.615,3.58],[-0.254,-33.127],[0.104,-4.533],[0.401,-2.401],[2.163,-12.007],[37.745,-6.88],[35.931,18.029]],"o":[[0,0],[6.755,-12.898],[2.913,1.707],[1.789,9.276],[0,0],[13.143,-1.075],[8.568,2.004],[0.808,0.266],[6.375,-6.926],[2.674,-1.705],[0.254,33.127],[-0.12,5.266],[-0.417,2.495],[-2.163,12.007],[-37.745,6.88],[-27.522,-13.81]],"v":[[-1367.564,-93.985],[-1356.181,-140.294],[-1345.226,-156.25],[-1337.467,-137.057],[-1332.635,-104.335],[-1311.97,-104.497],[-1256.721,-103.638],[-1253.771,-102.871],[-1229.481,-133.313],[-1209.394,-153.96],[-1194.538,-119.031],[-1192.758,-71.922],[-1192.437,-58.184],[-1196.172,17.071],[-1227.883,50.177],[-1370.903,46.861]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[-20.352,60.178],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-7.859,7.602],[-5.813,3.249],[1.479,-38.3],[0.366,-4.519],[0.54,-2.374],[2.854,-11.861],[38.08,-4.682],[33.136,16.677]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.766,-6.545],[2.768,-1.547],[-1.278,33.104],[-0.425,5.25],[-0.561,2.466],[-2.854,11.861],[-38.081,4.682],[-27.506,-13.843]],"v":[[-1360.725,-97.127],[-1350.419,-142.699],[-1341.716,-157.994],[-1332.73,-140.304],[-1325.568,-105.762],[-1307.626,-104.402],[-1251.518,-98.38],[-1249.363,-97.444],[-1229.22,-128.392],[-1207.97,-147.841],[-1195.162,-112.11],[-1196.114,-64.978],[-1196.589,-51.244],[-1204.677,23.669],[-1238.252,54.882],[-1364.653,47.186]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[-20.352,60.178],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-7.859,7.602],[-5.813,3.249],[1.479,-38.3],[0.366,-4.519],[0.54,-2.374],[2.854,-11.861],[38.08,-4.682],[33.136,16.677]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.766,-6.545],[2.768,-1.547],[-1.278,33.104],[-0.425,5.25],[-0.561,2.466],[-2.854,11.861],[-38.081,4.682],[-27.506,-13.843]],"v":[[-1360.725,-97.127],[-1350.419,-142.699],[-1341.716,-157.994],[-1332.73,-140.304],[-1325.568,-105.762],[-1307.626,-104.402],[-1251.518,-98.38],[-1249.363,-97.444],[-1229.22,-128.392],[-1207.97,-147.841],[-1195.162,-112.11],[-1196.114,-64.978],[-1196.589,-51.244],[-1204.677,23.669],[-1238.252,54.882],[-1364.653,47.186]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-26.057,60.924],[-5.899,13.117],[-2.86,-1.794],[-2.173,-9.194],[0.503,-15.627],[-13.17,0.678],[-8.504,-2.262],[-0.799,-0.29],[-5.615,9.383],[-5.72,3.409],[0.747,-33.12],[0.24,-4.528],[0.474,-2.388],[2.524,-11.936],[37.936,-5.736],[33.586,15.752]],"o":[[0,0],[5.972,-13.279],[2.86,1.794],[2.173,9.194],[0,0],[13.17,-0.678],[8.504,2.262],[0.799,0.29],[5.335,-8.916],[2.724,-1.624],[-0.747,33.12],[-0.279,5.26],[-0.492,2.481],[-2.524,11.936],[-37.936,5.736],[-27.879,-13.075]],"v":[[-1366.978,-94.103],[-1354.201,-140.046],[-1342.769,-155.664],[-1334.667,-136.525],[-1328.926,-102.838],[-1311.092,-102.931],[-1251.081,-99.616],[-1248.155,-98.76],[-1225.929,-128.47],[-1207.068,-149.273],[-1193.274,-113.911],[-1192.918,-66.77],[-1193.012,-53.028],[-1199.02,22.08],[-1231.716,54.213],[-1374.57,46.578]]}],"t":420},{"s":[{"c":true,"i":[[-25.907,60.866],[-7.139,16.883],[-2.809,-1.873],[-2.959,-8.971],[-2.355,-14.174],[-15.607,0.312],[-9.988,-2.497],[-0.936,-0.312],[-4.426,6.124],[-3.746,-1.249],[2.185,-33.086],[0.48,-4.519],[0.708,-2.374],[3.746,-11.861],[38.08,-4.682],[29.029,23.098]],"o":[[0,0],[5.671,-13.411],[2.809,1.873],[2.746,8.326],[0,0],[15.607,-0.312],[9.988,2.497],[0.936,0.312],[7.256,-10.039],[3.746,1.249],[-2.185,33.086],[-0.558,5.25],[-0.736,2.466],[-3.746,11.861],[-38.08,4.682],[-29.029,-23.098]],"v":[[-1374.467,-97.702],[-1361.132,-143.843],[-1348.56,-158.569],[-1339.508,-138.28],[-1331.577,-106.874],[-1302.364,-104.569],[-1237.128,-100.511],[-1233.694,-99.575],[-1216.839,-122.049],[-1194.365,-145.147],[-1186.25,-112.685],[-1187.498,-65.552],[-1188.123,-51.818],[-1198.735,23.094],[-1243.37,54.308],[-1380.398,42.134]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Head stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.702,-6.793],[-0.692,-0.545],[-1.433,0.197],[-2.218,3.534],[-1.528,5.368]],"o":[[1.788,7.527],[0.422,0.774],[1.136,0.896],[4.133,-0.57],[2.967,-4.728],[0,0]],"v":[[-1271.674,-103.325],[-1267.398,-80.658],[-1265.79,-78.583],[-1261.669,-77.664],[-1252.295,-85.328],[-1245.506,-100.574]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.314,-6.704],[-0.599,-0.529],[-1.205,0.231],[-1.775,3.585],[-5.223,1.186]],"o":[[-7.028,6.578],[0.378,0.763],[0.984,0.869],[3.474,-0.666],[2.374,-4.795],[0,0]],"v":[[-1285.143,-102.406],[-1292.063,-81.996],[-1290.648,-79.96],[-1287.142,-79.137],[-1279.439,-87.018],[-1262.971,-100.269]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.127,-6.793],[-0.584,-0.545],[-1.21,0.197],[-1.873,3.534],[-5.254,1.041]],"o":[[-7.208,6.38],[0.356,0.774],[0.96,0.896],[3.492,-0.57],[2.506,-4.728],[0,0]],"v":[[-1292.433,-103.733],[-1299.917,-83.523],[-1298.559,-81.448],[-1295.077,-80.528],[-1287.158,-88.193],[-1270.329,-100.982]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-2.851,-6.793],[-0.533,-0.545],[-1.104,0.197],[-1.708,3.534],[-8.131,-0.591]],"o":[[-10.107,3.648],[0.325,0.774],[0.875,0.896],[3.183,-0.57],[2.285,-4.728],[0,0]],"v":[[-1294.295,-104.212],[-1308.058,-85.107],[-1306.82,-83.032],[-1303.646,-82.112],[-1296.427,-89.777],[-1274.143,-101.462]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-2.851,-6.793],[-0.533,-0.545],[-1.104,0.197],[-1.708,3.534],[-8.131,-0.591]],"o":[[-10.107,3.648],[0.325,0.774],[0.875,0.896],[3.183,-0.57],[2.285,-4.728],[0,0]],"v":[[-1294.295,-104.212],[-1308.058,-85.107],[-1306.82,-83.032],[-1303.646,-82.112],[-1296.427,-89.777],[-1274.143,-101.462]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.504,-6.606],[-0.614,-0.512],[-1.198,0.265],[-1.672,3.634],[-5.187,1.335]],"o":[[-6.837,6.775],[0.399,0.752],[1.008,0.84],[3.454,-0.765],[2.236,-4.861],[0,0]],"v":[[-1284.749,-102.647],[-1291.084,-82.048],[-1289.611,-80.053],[-1286.083,-79.33],[-1278.608,-87.428],[-1262.525,-101.143]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-3.515,-6.6],[-0.615,-0.511],[-1.197,0.267],[-1.666,3.637],[-5.184,1.344]],"o":[[-6.826,6.787],[0.4,0.752],[1.01,0.839],[3.453,-0.771],[2.228,-4.865],[0,0]],"v":[[-1286.017,-104.756],[-1292.317,-84.147],[-1290.841,-82.154],[-1287.312,-81.438],[-1279.851,-89.548],[-1263.79,-103.29]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-2.851,-6.793],[-0.533,-0.545],[-1.104,0.197],[-1.708,3.534],[-8.131,-0.591]],"o":[[-10.107,3.648],[0.325,0.774],[0.875,0.896],[3.183,-0.57],[2.285,-4.728],[0,0]],"v":[[-1289.176,-103.638],[-1302.939,-84.532],[-1301.701,-82.457],[-1298.527,-81.537],[-1291.308,-89.202],[-1269.024,-100.887]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-2.851,-6.793],[-0.533,-0.545],[-1.104,0.197],[-1.708,3.534],[-8.131,-0.591]],"o":[[-10.107,3.648],[0.325,0.774],[0.875,0.896],[3.183,-0.57],[2.285,-4.728],[0,0]],"v":[[-1289.176,-103.638],[-1302.939,-84.532],[-1301.701,-82.457],[-1298.527,-81.537],[-1291.308,-89.202],[-1269.024,-100.887]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.314,-6.704],[-0.599,-0.529],[-1.205,0.231],[-1.775,3.585],[-5.223,1.186]],"o":[[-7.028,6.578],[0.378,0.763],[0.984,0.869],[3.474,-0.666],[2.374,-4.795],[0,0]],"v":[[-1285.143,-102.406],[-1292.063,-81.996],[-1290.648,-79.96],[-1287.142,-79.137],[-1279.439,-87.018],[-1262.971,-100.269]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[-3.702,-6.793],[-0.692,-0.545],[-1.433,0.197],[-2.218,3.534],[-1.528,5.368]],"o":[[1.788,7.527],[0.422,0.774],[1.136,0.896],[4.133,-0.57],[2.967,-4.728],[0,0]],"v":[[-1271.674,-103.325],[-1267.398,-80.658],[-1265.79,-78.583],[-1261.669,-77.664],[-1252.295,-85.328],[-1245.506,-100.574]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.418,-6.418],[-1.79,-1.189],[-1.503,0.676],[-1.644,3.403],[-1.947,4.029],[0.573,0.931]],"o":[[0.418,6.418],[0.14,2.144],[1.373,0.912],[3.446,-1.551],[1.947,-4.029],[0.476,-0.984],[0,0]],"v":[[-1303.011,-103.964],[-1301.758,-84.71],[-1299.518,-78.921],[-1294.784,-78.857],[-1287.793,-87.472],[-1281.952,-99.559],[-1281.58,-102.672]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.743,-6.385],[-1.288,-1.428],[-1.366,0.451],[-1.947,3.117],[-5.434,5.833],[0.51,0.917]],"o":[[-4.323,6.408],[-0.248,2.133],[0.988,1.096],[3.133,-1.034],[2.306,-3.691],[0.724,-0.778],[0,0]],"v":[[-1311.622,-102.311],[-1319.015,-86.57],[-1318.134,-80.545],[-1314.204,-79.801],[-1306.92,-87.287],[-1296.586,-99.391],[-1292.01,-102.523]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.919,-6.362],[-1.248,-1.464],[-1.378,0.413],[-2.033,3.062],[-5.594,5.68],[0.485,0.931]],"o":[[-4.5,6.285],[-0.307,2.125],[0.957,1.123],[3.16,-0.947],[2.407,-3.626],[0.746,-0.757],[0,0]],"v":[[-1318.904,-104.372],[-1326.731,-88.842],[-1326.018,-82.795],[-1322.11,-81.942],[-1314.622,-89.224],[-1303.956,-101.036],[-1299.295,-104.04]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.838,-6.362],[-1.137,-1.464],[-1.256,0.413],[-1.853,3.062],[-6.073,3.736],[0.442,0.931]],"o":[[-6.365,4.614],[-0.28,2.125],[0.872,1.123],[2.881,-0.947],[2.194,-3.626],[0.867,-0.533],[0,0]],"v":[[-1314.175,-104.612],[-1324.43,-90.263],[-1323.78,-84.215],[-1320.217,-83.363],[-1313.39,-90.645],[-1300.374,-101.813],[-1294.723,-104.011]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[0.838,-6.362],[-1.137,-1.464],[-1.256,0.413],[-1.853,3.062],[-6.073,3.736],[0.442,0.931]],"o":[[-6.365,4.614],[-0.28,2.125],[0.872,1.123],[2.881,-0.947],[2.194,-3.626],[0.867,-0.533],[0,0]],"v":[[-1314.175,-104.612],[-1324.43,-90.263],[-1323.78,-84.215],[-1320.217,-83.363],[-1313.39,-90.645],[-1300.374,-101.813],[-1294.723,-104.011]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.56,-6.403],[-1.328,-1.391],[-1.352,0.49],[-1.857,3.172],[-5.266,5.985],[0.536,0.902]],"o":[[-4.139,6.528],[-0.187,2.139],[1.019,1.067],[3.102,-1.123],[2.199,-3.755],[0.702,-0.798],[0,0]],"v":[[-1311.214,-101.796],[-1318.155,-85.851],[-1317.102,-79.853],[-1313.153,-79.222],[-1306.086,-86.913],[-1296.102,-99.306],[-1291.617,-102.568]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[0.55,-6.404],[-1.33,-1.389],[-1.351,0.492],[-1.852,3.175],[-5.256,5.994],[0.538,0.901]],"o":[[-4.128,6.535],[-0.184,2.139],[1.02,1.065],[3.1,-1.128],[2.193,-3.759],[0.701,-0.799],[0,0]],"v":[[-1312.481,-103.861],[-1319.395,-87.905],[-1318.332,-81.908],[-1314.382,-81.284],[-1307.328,-88.987],[-1297.364,-101.397],[-1292.885,-104.666]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[0.838,-6.362],[-1.137,-1.464],[-1.256,0.413],[-1.853,3.062],[-6.073,3.736],[0.442,0.931]],"o":[[-6.365,4.614],[-0.28,2.125],[0.873,1.123],[2.881,-0.947],[2.195,-3.626],[0.867,-0.533],[0,0]],"v":[[-1309.056,-104.037],[-1319.312,-89.688],[-1318.661,-83.641],[-1315.099,-82.788],[-1308.272,-90.07],[-1295.255,-101.239],[-1289.604,-103.436]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[0.838,-6.362],[-1.137,-1.464],[-1.256,0.413],[-1.853,3.062],[-6.073,3.736],[0.442,0.931]],"o":[[-6.365,4.614],[-0.28,2.125],[0.873,1.123],[2.881,-0.947],[2.195,-3.626],[0.867,-0.533],[0,0]],"v":[[-1309.056,-104.037],[-1319.312,-89.688],[-1318.661,-83.641],[-1315.099,-82.788],[-1308.272,-90.07],[-1295.255,-101.239],[-1289.604,-103.436]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.743,-6.385],[-1.288,-1.428],[-1.366,0.451],[-1.947,3.117],[-5.434,5.833],[0.51,0.917]],"o":[[-4.323,6.408],[-0.248,2.133],[0.988,1.096],[3.133,-1.034],[2.305,-3.691],[0.725,-0.778],[0,0]],"v":[[-1309.293,-102.288],[-1316.687,-86.547],[-1315.805,-80.522],[-1311.876,-79.778],[-1304.592,-87.264],[-1294.258,-99.368],[-1289.682,-102.5]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[-0.418,-6.418],[-1.79,-1.189],[-1.503,0.676],[-1.644,3.403],[-1.947,4.029],[0.573,0.931]],"o":[[0.418,6.418],[0.14,2.144],[1.373,0.912],[3.446,-1.551],[1.947,-4.029],[0.476,-0.984],[0,0]],"v":[[-1303.011,-103.964],[-1301.758,-84.71],[-1299.518,-78.921],[-1294.784,-78.857],[-1287.793,-87.472],[-1281.952,-99.559],[-1281.58,-102.672]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.712,-6.854],[-0.489,-0.806],[-0.898,-0.188],[-2.445,1.689],[-2.394,7.522]],"o":[[-3.059,6.174],[-0.097,0.938],[0.476,0.784],[2.908,0.608],[6.495,-4.486],[0,0]],"v":[[-1330.445,-105.569],[-1336.162,-85.818],[-1335.829,-83.061],[-1333.548,-81.666],[-1325.256,-84.177],[-1311.419,-102.87]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.411,-6.868],[-0.435,-0.794],[-0.764,-0.167],[-2.017,1.745],[-9.281,4.937]],"o":[[-8.148,5.793],[-0.056,0.94],[0.423,0.773],[2.473,0.539],[5.36,-4.637],[0,0]],"v":[[-1334.831,-103.273],[-1344.292,-84.803],[-1343.934,-82.056],[-1341.969,-80.714],[-1335.037,-83.419],[-1318.056,-102.313]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.602,-6.854],[-0.413,-0.806],[-0.759,-0.188],[-2.065,1.688],[-9.415,4.677]],"o":[[-8.306,5.564],[-0.082,0.938],[0.402,0.784],[2.457,0.608],[5.487,-4.486],[0,0]],"v":[[-1342.078,-105.977],[-1352.047,-87.777],[-1351.766,-85.021],[-1349.839,-83.625],[-1342.835,-86.137],[-1325.336,-104.552]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[1.204,-6.441],[-0.377,-0.806],[-0.692,-0.188],[-1.883,1.688],[-8.583,4.677]],"o":[[-5.984,3.407],[-0.173,0.923],[0.366,0.784],[2.24,0.608],[5.002,-4.486],[0,0]],"v":[[-1330.117,-105.737],[-1342.47,-91.262],[-1343.222,-86.807],[-1341.465,-85.411],[-1335.08,-87.922],[-1314.854,-104.312]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[1.204,-6.441],[-0.377,-0.806],[-0.692,-0.188],[-1.883,1.688],[-8.583,4.677]],"o":[[-5.984,3.407],[-0.173,0.923],[0.366,0.784],[2.24,0.608],[5.002,-4.486],[0,0]],"v":[[-1330.117,-105.737],[-1342.47,-91.262],[-1343.222,-86.807],[-1341.465,-85.411],[-1335.08,-87.922],[-1314.854,-104.312]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.215,-6.877],[-0.458,-0.782],[-0.768,-0.145],[-1.967,1.802],[-9.136,5.2]],"o":[[-7.979,6.023],[-0.029,0.941],[0.445,0.76],[2.487,0.468],[5.226,-4.788],[0,0]],"v":[[-1334.441,-102.095],[-1343.371,-83.364],[-1342.935,-80.628],[-1340.933,-79.342],[-1334.081,-82.244],[-1317.646,-101.614]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[0.204,-6.877],[-0.459,-0.781],[-0.768,-0.143],[-1.964,1.805],[-9.128,5.215]],"o":[[-7.969,6.036],[-0.028,0.941],[0.447,0.76],[2.488,0.464],[5.218,-4.797],[0,0]],"v":[[-1332.516,-104.224],[-1341.414,-85.478],[-1340.974,-82.742],[-1338.969,-81.461],[-1332.122,-84.373],[-1315.72,-103.771]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[1.204,-6.441],[-0.377,-0.806],[-0.692,-0.188],[-1.883,1.688],[-8.583,4.677]],"o":[[-5.984,3.407],[-0.173,0.923],[0.366,0.784],[2.24,0.608],[5.002,-4.486],[0,0]],"v":[[-1324.999,-105.162],[-1337.352,-90.687],[-1338.104,-86.232],[-1336.347,-84.836],[-1329.961,-87.347],[-1309.736,-103.737]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[1.204,-6.441],[-0.377,-0.806],[-0.692,-0.188],[-1.883,1.688],[-8.583,4.677]],"o":[[-5.984,3.407],[-0.173,0.923],[0.366,0.784],[2.24,0.608],[5.002,-4.486],[0,0]],"v":[[-1324.999,-105.162],[-1337.352,-90.687],[-1338.104,-86.232],[-1336.347,-84.836],[-1329.961,-87.347],[-1309.736,-103.737]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.412,-6.868],[-0.435,-0.794],[-0.764,-0.167],[-2.017,1.745],[-9.281,4.937]],"o":[[-8.148,5.793],[-0.056,0.94],[0.423,0.773],[2.473,0.539],[5.36,-4.637],[0,0]],"v":[[-1329.972,-102.882],[-1339.433,-84.413],[-1339.076,-81.666],[-1337.111,-80.324],[-1330.179,-83.028],[-1313.198,-101.922]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[0.712,-6.854],[-0.489,-0.806],[-0.898,-0.188],[-2.445,1.689],[-2.394,7.522]],"o":[[-3.059,6.174],[-0.097,0.938],[0.476,0.784],[2.908,0.608],[6.495,-4.486],[0,0]],"v":[[-1330.445,-105.569],[-1336.162,-85.818],[-1335.829,-83.061],[-1333.548,-81.666],[-1325.256,-84.177],[-1311.419,-102.87]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.964705884457,0.549019634724,0.129411771894,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Head stripes","np":5,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[5.846,-2.085]],"o":[[-6.025,1.49],[0,0]],"v":[[-1395.712,19.525],[-1413.534,24.893]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[5.786,-2.247]],"o":[[-5.982,1.656],[0,0]],"v":[[-1388.584,24.31],[-1402.629,29.529]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[5.846,-2.085]],"o":[[-6.025,1.49],[0,0]],"v":[[-1399.349,20.065],[-1413.534,24.893]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[4.289,-2.085]],"o":[[-4.421,1.49],[0,0]],"v":[[-1385.704,20.439],[-1394.509,24.893]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[4.289,-2.085]],"o":[[-4.421,1.49],[0,0]],"v":[[-1385.704,20.439],[-1394.509,24.893]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[5.719,-2.411]],"o":[[-5.932,1.826],[0,0]],"v":[[-1384.533,26.968],[-1398.423,32.586]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[5.715,-2.421]],"o":[[-5.929,1.836],[0,0]],"v":[[-1385.583,25.026],[-1399.465,30.667]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[4.29,-2.085]],"o":[[-4.421,1.49],[0,0]],"v":[[-1380.585,21.014],[-1389.39,25.468]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[4.29,-2.085]],"o":[[-4.421,1.49],[0,0]],"v":[[-1380.585,21.014],[-1389.39,25.468]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[5.786,-2.247]],"o":[[-5.982,1.656],[0,0]],"v":[[-1388.584,24.31],[-1402.629,29.529]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[5.846,-2.085]],"o":[[-6.025,1.49],[0,0]],"v":[[-1395.712,19.525],[-1413.534,24.893]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[4.212,1.4]],"o":[[-4.212,-1.4],[0,0]],"v":[[-1398.483,3.866],[-1411.12,-0.335]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[3.891,1.293]],"o":[[-3.891,-1.293],[0,0]],"v":[[-1391.212,5.777],[-1401.905,2.09]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[3.854,1.4]],"o":[[-3.854,-1.4],[0,0]],"v":[[-1401.462,1.467],[-1412.049,-2.516]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[3.091,1.4]],"o":[[-3.091,-1.4],[0,0]],"v":[[-1386.509,3.184],[-1392.738,-0.335]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[3.091,1.4]],"o":[[-3.091,-1.4],[0,0]],"v":[[-1386.509,3.184],[-1392.738,-0.335]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[3.926,1.181]],"o":[[-3.926,-1.181],[0,0]],"v":[[-1387.689,8.519],[-1398.483,5.138]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[3.928,1.175]],"o":[[-3.928,-1.175],[0,0]],"v":[[-1388.77,6.582],[-1399.57,3.219]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[3.091,1.4]],"o":[[-3.091,-1.4],[0,0]],"v":[[-1381.39,3.759],[-1387.619,0.24]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[3.091,1.4]],"o":[[-3.091,-1.4],[0,0]],"v":[[-1381.39,3.759],[-1387.619,0.24]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[3.891,1.293]],"o":[[-3.891,-1.293],[0,0]],"v":[[-1391.212,5.777],[-1401.905,2.09]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[4.212,1.4]],"o":[[-4.212,-1.4],[0,0]],"v":[[-1398.483,3.866],[-1411.12,-0.335]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-13.475,-3.726]],"o":[[13.978,0.278],[0,0]],"v":[[-1228.81,33.984],[-1187.414,40.022]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-10.369,-3.44]],"o":[[10.656,-0.017],[0,0]],"v":[[-1242.375,30.226],[-1183.72,39.391]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-10.269,-3.726]],"o":[[10.653,0.278],[0,0]],"v":[[-1253.361,30.034],[-1194.982,40.823]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-10.269,-3.726]],"o":[[10.653,0.278],[0,0]],"v":[[-1259.581,29.459],[-1202.912,40.765]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-10.269,-3.726]],"o":[[10.653,0.278],[0,0]],"v":[[-1259.581,29.459],[-1202.912,40.765]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-10.463,-3.143]],"o":[[10.651,-0.321],[0,0]],"v":[[-1238.215,28.711],[-1179.322,36.199]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-10.468,-3.125]],"o":[[10.651,-0.339],[0,0]],"v":[[-1239.263,26.523],[-1180.357,33.912]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-10.27,-3.726]],"o":[[10.653,0.278],[0,0]],"v":[[-1254.463,30.033],[-1197.793,41.34]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-10.27,-3.726]],"o":[[10.653,0.278],[0,0]],"v":[[-1254.463,30.033],[-1197.793,41.34]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-10.369,-3.44]],"o":[[10.656,-0.017],[0,0]],"v":[[-1242.375,30.226],[-1183.72,39.391]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[-13.475,-3.726]],"o":[[13.978,0.278],[0,0]],"v":[[-1228.81,33.984],[-1187.414,40.022]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-13.841,4.238]],"o":[[13.095,-6.169],[0,0]],"v":[[-1226.817,23.281],[-1186.343,7.644]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-13.211,1.379]],"o":[[9.805,-6.443],[0,0]],"v":[[-1241.154,19.485],[-1184.571,4.848]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-13.244,1.012]],"o":[[9.98,-6.169],[0,0]],"v":[[-1251.842,19.331],[-1194.875,6.27]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-13.244,1.012]],"o":[[9.98,-6.169],[0,0]],"v":[[-1258.063,18.755],[-1202.804,6.212]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-13.244,1.012]],"o":[[9.98,-6.169],[0,0]],"v":[[-1258.063,18.755],[-1202.804,6.212]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-13.166,1.755]],"o":[[9.617,-6.72],[0,0]],"v":[[-1237.301,17.939],[-1181.158,1.695]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-13.164,1.777]],"o":[[9.606,-6.736],[0,0]],"v":[[-1238.366,15.75],[-1182.251,-0.589]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-13.244,1.012]],"o":[[9.98,-6.169],[0,0]],"v":[[-1252.944,19.33],[-1197.686,6.787]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-13.244,1.012]],"o":[[9.98,-6.169],[0,0]],"v":[[-1252.944,19.33],[-1197.686,6.787]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-13.211,1.379]],"o":[[9.805,-6.443],[0,0]],"v":[[-1241.154,19.485],[-1184.571,4.848]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[-13.841,4.238]],"o":[[13.095,-6.169],[0,0]],"v":[[-1226.817,23.281],[-1186.343,7.644]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Whiskers","np":5,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.191,-6.555]],"o":[[-0.191,6.555],[0,0]],"v":[[-1317.113,14.782],[-1317.64,34.805]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.308,-7.153]],"o":[[-2.949,5.557],[0,0]],"v":[[-1355.016,8.906],[-1358.548,29.292]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.109,-7.159]],"o":[[-3.102,5.473],[0,0]],"v":[[-1365.367,5.599],[-1369.463,25.879]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.668,-7.129]],"o":[[-4.044,4.834],[0,0]],"v":[[-1367.168,2.167],[-1373.923,27.665]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.668,-7.129]],"o":[[-4.044,4.834],[0,0]],"v":[[-1367.168,2.167],[-1373.923,27.665]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.512,-7.141]],"o":[[-2.789,5.639],[0,0]],"v":[[-1351.418,10.614],[-1354.367,31.092]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.524,-7.141]],"o":[[-2.779,5.644],[0,0]],"v":[[-1352.496,8.616],[-1355.411,29.099]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-0.668,-7.129]],"o":[[-4.044,4.834],[0,0]],"v":[[-1362.05,2.742],[-1368.805,28.24]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-0.668,-7.129]],"o":[[-4.044,4.834],[0,0]],"v":[[-1362.05,2.742],[-1368.805,28.24]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.308,-7.153]],"o":[[-2.949,5.557],[0,0]],"v":[[-1355.016,8.906],[-1358.548,29.292]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[0.191,-6.555]],"o":[[-0.191,6.555],[0,0]],"v":[[-1317.113,14.782],[-1317.64,34.805]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Line","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[1.697,3.601],[-0.052,0.286],[-0.587,0.063],[-4.056,-1.044],[-0.413,-0.714],[0.686,-0.936],[3.421,-1.344]],"o":[[-3.617,-1.661],[-0.124,-0.263],[0.105,-0.581],[4.164,-0.448],[0.799,0.206],[0.581,1.005],[-2.173,2.964],[0,0]],"v":[[-1316.287,14.381],[-1323.567,5.244],[-1323.767,4.41],[-1322.354,3.568],[-1309.89,4.471],[-1307.809,5.683],[-1308.529,8.885],[-1317.149,15.523]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[1.567,3.558],[-0.037,0.287],[-0.506,0.077],[-3.703,-1.528],[-0.377,-0.704],[2.238,-1.428],[2.699,-2.496]],"o":[[-3.174,-1.573],[-0.114,-0.26],[0.075,-0.583],[3.589,-0.548],[0.667,0.275],[0.53,0.99],[-3.686,2.353],[0,0]],"v":[[-1354.313,8.485],[-1360.726,-0.049],[-1360.435,-1.465],[-1358.471,-2.644],[-1346.413,-0.474],[-1344.58,0.687],[-1347.28,3.064],[-1355.027,9.648]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[1.468,3.601],[-0.045,0.286],[-0.508,0.063],[-3.659,-1.63],[-0.357,-0.714],[2.276,-1.366],[2.767,-2.421]],"o":[[-3.129,-1.661],[-0.107,-0.263],[0.091,-0.581],[3.602,-0.448],[0.659,0.294],[0.502,1.005],[-3.75,2.25],[0,0]],"v":[[-1364.652,5.198],[-1370.826,-3.511],[-1370.496,-4.919],[-1368.5,-6.043],[-1356.507,-3.539],[-1354.707,-2.328],[-1357.472,-0.027],[-1365.398,6.34]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.015,3.977],[-0.033,0.286],[-0.373,0.063],[-2.574,-1.044],[-0.262,-0.715],[0.435,-0.936],[2.171,-1.344]],"o":[[-2.296,-1.661],[-0.001,-0.274],[0.067,-0.581],[2.643,-0.448],[0.507,0.206],[0.369,1.005],[-1.379,2.964],[0,0]],"v":[[-1366.855,2.054],[-1370.781,-6.946],[-1370.907,-7.78],[-1368.811,-8.296],[-1359.443,-6.074],[-1358.123,-4.862],[-1359.024,-2.079],[-1367.402,3.196]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[0.015,3.977],[-0.033,0.286],[-0.373,0.063],[-2.574,-1.044],[-0.262,-0.715],[0.435,-0.936],[2.171,-1.344]],"o":[[-2.296,-1.661],[-0.001,-0.274],[0.067,-0.581],[2.643,-0.448],[0.507,0.206],[0.369,1.005],[-1.379,2.964],[0,0]],"v":[[-1366.855,2.054],[-1370.781,-6.946],[-1370.907,-7.78],[-1368.811,-8.296],[-1359.443,-6.074],[-1358.123,-4.862],[-1359.024,-2.079],[-1367.402,3.196]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[1.668,3.512],[-0.029,0.288],[-0.503,0.092],[-3.745,-1.422],[-0.397,-0.693],[2.196,-1.492],[2.627,-2.572]],"o":[[-3.218,-1.482],[-0.122,-0.256],[0.058,-0.585],[3.571,-0.65],[0.675,0.256],[0.558,0.975],[-3.618,2.457],[0,0]],"v":[[-1350.727,10.173],[-1357.381,1.825],[-1357.13,0.401],[-1355.201,-0.833],[-1343.086,0.992],[-1341.221,2.1],[-1343.852,4.553],[-1351.407,11.355]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[1.674,3.509],[-0.028,0.288],[-0.503,0.092],[-3.747,-1.416],[-0.398,-0.693],[2.193,-1.495],[2.622,-2.577]],"o":[[-3.22,-1.477],[-0.122,-0.256],[0.057,-0.585],[3.57,-0.656],[0.675,0.255],[0.56,0.974],[-3.614,2.463],[0,0]],"v":[[-1351.806,8.174],[-1358.473,-0.163],[-1358.225,-1.588],[-1356.298,-2.825],[-1344.18,-1.02],[-1342.313,0.085],[-1344.94,2.543],[-1352.484,9.358]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[0.015,3.977],[-0.033,0.286],[-0.373,0.063],[-2.574,-1.044],[-0.262,-0.715],[0.435,-0.936],[2.171,-1.344]],"o":[[-2.296,-1.661],[-0.001,-0.274],[0.067,-0.581],[2.643,-0.448],[0.507,0.206],[0.369,1.005],[-1.379,2.964],[0,0]],"v":[[-1361.736,2.628],[-1365.663,-6.371],[-1365.789,-7.205],[-1363.692,-7.721],[-1354.325,-5.499],[-1353.004,-4.287],[-1353.906,-1.504],[-1362.283,3.771]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[0.015,3.977],[-0.033,0.286],[-0.373,0.063],[-2.574,-1.044],[-0.262,-0.715],[0.435,-0.936],[2.171,-1.344]],"o":[[-2.296,-1.661],[-0.001,-0.274],[0.067,-0.581],[2.643,-0.448],[0.507,0.206],[0.369,1.005],[-1.379,2.964],[0,0]],"v":[[-1361.736,2.628],[-1365.663,-6.371],[-1365.789,-7.205],[-1363.692,-7.721],[-1354.325,-5.499],[-1353.004,-4.287],[-1353.906,-1.504],[-1362.283,3.771]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[1.567,3.558],[-0.037,0.287],[-0.506,0.077],[-3.703,-1.528],[-0.377,-0.704],[2.238,-1.428],[2.699,-2.496]],"o":[[-3.174,-1.573],[-0.114,-0.26],[0.075,-0.583],[3.589,-0.548],[0.667,0.275],[0.53,0.99],[-3.686,2.353],[0,0]],"v":[[-1354.313,8.485],[-1360.726,-0.049],[-1360.435,-1.465],[-1358.471,-2.644],[-1346.413,-0.474],[-1344.58,0.687],[-1347.28,3.064],[-1355.027,9.648]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[1.697,3.601],[-0.052,0.286],[-0.587,0.063],[-4.056,-1.044],[-0.413,-0.714],[0.686,-0.936],[3.421,-1.344]],"o":[[-3.617,-1.661],[-0.124,-0.263],[0.105,-0.581],[4.164,-0.448],[0.799,0.206],[0.581,1.005],[-2.173,2.964],[0,0]],"v":[[-1316.287,14.381],[-1323.567,5.244],[-1323.767,4.41],[-1322.354,3.568],[-1309.89,4.471],[-1307.809,5.683],[-1308.529,8.885],[-1317.149,15.523]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.101960793138,0.254901975393,0.780392229557,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Nose","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.52,-0.118],[0.609,-1.647],[-0.496,-1.37],[-2.43,0.033],[-2.43,-0.083],[-0.858,0.089],[1.893,0.501]],"o":[[-3.014,0.064],[-0.505,1.367],[0.473,1.306],[2.353,-0.032],[2.633,0.09],[2.086,-0.216],[-1.926,-0.51]],"v":[[-1317,36.911],[-1326.038,38.789],[-1325.242,40.285],[-1318.575,39.775],[-1313.078,39.871],[-1308.515,40.702],[-1307.831,38.231]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.737,0.616],[1.764,-1.793],[-1.079,-0.948],[-2.466,0.193],[-2.088,-0.376],[-0.768,0.34],[0.799,1.007]],"o":[[-2.587,-0.336],[-1.006,1.023],[0.818,0.719],[2.814,-0.221],[2.484,0.447],[2.156,-0.954],[-1.227,-1.545]],"v":[[-1359.165,31.313],[-1366.208,32.681],[-1365.974,37.123],[-1361.092,38.178],[-1355.147,37.095],[-1350.499,38.629],[-1348.246,34.885]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.986,0.239],[1.551,-1.42],[-1.358,-0.466],[-3.367,-0.122],[-2.041,-0.578],[-0.768,0.34],[1.159,0.557]],"o":[[-2.6,-0.208],[-2.691,2.464],[4.01,1.375],[3.027,0.11],[2.912,0.824],[2.156,-0.954],[-2.782,-1.337]],"v":[[-1368.759,26.382],[-1374.669,27.423],[-1375.678,33.183],[-1369.224,33.185],[-1363.958,33.72],[-1359.011,33.926],[-1359.808,28.531]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.039,0.77],[1.032,0.071],[-0.047,-1.434],[-1.055,-1.23],[-1.43,-0.252],[-1.997,1.785],[0.431,1.926]],"o":[[-1.781,-0.451],[-1.302,-0.089],[0.045,1.367],[0.775,0.903],[1.485,0.262],[0.725,-0.517],[-0.343,-1.533]],"v":[[-1373.259,27.627],[-1376.026,27.517],[-1378.557,30.194],[-1377.647,33.392],[-1374.514,34.871],[-1369.844,33.457],[-1369.411,30.609]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[1.23,0.959],[1.596,0.156],[1.011,-0.856],[-0.734,0.044],[-1.4,-0.385],[-0.536,-0.217],[-0.543,1.897]],"o":[[-1.449,-1.13],[-1.299,-0.127],[-1.044,0.884],[1.685,-0.045],[1.339,0.368],[2.356,0.953],[0.543,-1.897]],"v":[[-1367.968,29.078],[-1374.19,27.193],[-1378.757,28.139],[-1377.968,30.481],[-1374.306,30.668],[-1370.042,33.245],[-1366.329,32.12]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.753,0.481],[1.29,-0.176],[-0.502,-0.744],[-2.096,-0.292],[-2.12,0.065],[-1.091,0.797],[1.334,0.529]],"o":[[-2.595,-0.263],[-1.422,0.194],[0.708,1.171],[1.83,0.255],[1.448,-0.044],[1.021,-0.746],[-1.835,-0.727]],"v":[[-1354.926,33.129],[-1359.094,33.02],[-1359.932,35.681],[-1355.191,37.159],[-1351.54,37.43],[-1347.355,36.921],[-1348.166,34.005]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.754,0.473],[0.726,-1.569],[-1.409,-0.277],[-1.982,-0.742],[-2.106,-0.25],[-2.402,-0.196],[1.695,0.581]],"o":[[-2.596,-0.258],[-0.603,1.302],[1.636,0.321],[1.984,0.743],[1.576,0.187],[1.933,0.158],[-1.867,-0.64]],"v":[[-1355.966,31.137],[-1361.863,31.407],[-1360.169,33.115],[-1356.963,33.948],[-1353.673,34.64],[-1349.198,35.567],[-1347.975,33.739]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[2.244,1.028],[1.466,-0.08],[1.112,-0.907],[-1.595,-1.381],[-1.748,0.395],[-0.575,-0.054],[-0.487,1.912]],"o":[[-1.671,-0.765],[-1.303,0.071],[-1.86,1.516],[1.219,1.055],[1.355,-0.306],[1.667,0.157],[0.487,-1.912]],"v":[[-1363.559,29.133],[-1369.36,27.851],[-1373.816,29.097],[-1373.399,33.896],[-1369.324,33.562],[-1365.078,33.31],[-1360.964,33.037]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[2.244,1.028],[1.466,-0.08],[1.112,-0.907],[-1.595,-1.381],[-1.748,0.395],[-0.575,-0.054],[-0.487,1.912]],"o":[[-1.671,-0.765],[-1.303,0.071],[-1.86,1.516],[1.219,1.055],[1.355,-0.306],[1.667,0.157],[0.487,-1.912]],"v":[[-1363.559,29.133],[-1369.36,27.851],[-1373.816,29.097],[-1373.399,33.896],[-1369.324,33.562],[-1365.078,33.31],[-1360.964,33.037]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.086,0.358],[0.773,-1.546],[-1.422,-0.201],[-1.996,-0.264],[-2.119,-0.103],[-0.818,-0.189],[1.292,0.579]],"o":[[-2.571,-0.442],[-0.642,1.284],[1.688,0.238],[2.1,0.278],[1.811,0.088],[2.247,0.519],[-1.801,-0.807]],"v":[[-1359.165,31.313],[-1367.47,32.847],[-1365.479,35.675],[-1361.38,34.959],[-1356.591,35.325],[-1353.547,36.067],[-1352.678,33.273]]}],"t":420},{"s":[{"c":true,"i":[[5.52,-0.118],[0.609,-1.647],[-0.496,-1.37],[-2.43,0.033],[-2.43,-0.083],[-0.858,0.089],[1.893,0.501]],"o":[[-3.014,0.064],[-0.505,1.367],[0.473,1.306],[2.353,-0.032],[2.633,0.09],[2.086,-0.216],[-1.926,-0.51]],"v":[[-1317,36.911],[-1326.038,38.789],[-1325.242,40.285],[-1318.575,39.775],[-1313.078,39.871],[-1308.515,40.702],[-1307.831,38.231]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.101960793138,0.254901975393,0.780392229557,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Mouth","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[1.251,3.984],[-0.876,4.083],[-6.114,8.507],[-7.356,1.577],[-5.068,-3.687],[-2.913,-5.549],[0.386,-12.057],[4.059,-2.456],[3.007,0.111],[15.477,2.937]],"o":[[-4.148,-0.479],[-1.251,-3.984],[2.198,-10.243],[4.391,-6.11],[6.128,-1.314],[5.068,3.687],[5.607,10.682],[-0.152,4.742],[-2.574,1.558],[-15.742,-0.579],[0,0]],"v":[[-1342.869,54.095],[-1351.574,46.065],[-1351.489,33.68],[-1338.442,5.333],[-1321.075,-8.251],[-1303.352,-3.894],[-1291.624,10.587],[-1283.615,45.471],[-1288.861,58.052],[-1297.639,59.479],[-1344.556,54.195]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[2.898,2.893],[-0.535,9.729],[-4.386,8.632],[-5.518,1.731],[-3.934,-3.579],[-2.356,-5.486],[-0.043,-12.061],[3.001,-2.54],[2.277,0.048],[11.783,2.611]],"o":[[-3.15,-0.392],[-3.818,-3.812],[0.756,-13.749],[3.15,-6.199],[4.597,-1.442],[3.934,3.579],[4.535,10.56],[0.017,4.743],[-1.903,1.611],[-11.918,-0.249],[0,0]],"v":[[-1366.278,49.812],[-1374.585,45.228],[-1379.114,28.737],[-1369.802,-0.549],[-1353.556,-13.665],[-1338.009,-8.984],[-1328.741,5.246],[-1321.718,39.949],[-1325.335,52.634],[-1331.932,54.245],[-1367.551,49.947]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[2.816,2.972],[-0.805,9.71],[-4.624,8.507],[-5.564,1.577],[-3.833,-3.687],[-2.203,-5.549],[0.292,-12.057],[3.07,-2.456],[2.274,0.111],[11.706,2.937]],"o":[[-3.137,-0.479],[-3.711,-3.916],[1.137,-13.723],[3.321,-6.11],[4.635,-1.314],[3.833,3.687],[4.24,10.682],[-0.115,4.742],[-1.947,1.558],[-11.906,-0.579],[0,0]],"v":[[-1377.759,46.176],[-1385.935,41.364],[-1390.005,24.753],[-1379.885,-4.263],[-1363.281,-16.923],[-1347.87,-11.812],[-1339,2.669],[-1332.943,37.553],[-1336.91,50.133],[-1343.55,51.56],[-1379.036,46.277]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[2.067,2.972],[-0.59,9.71],[-5.018,8.052],[-5.057,0.831],[-4.613,-2.647],[-2.203,-5.549],[2.679,-13.921],[4.069,-2.151],[2.274,0.111],[11.706,2.937]],"o":[[-3.137,-0.479],[-2.723,-3.916],[0.834,-13.723],[3.479,-5.582],[3.598,-0.591],[4.503,2.584],[4.24,10.682],[-0.896,4.658],[-2.205,1.165],[-11.906,-0.579],[0,0]],"v":[[-1363.579,49.488],[-1376.265,40.778],[-1383.859,22.449],[-1376.428,-6.12],[-1359.642,-17.509],[-1349.243,-13.262],[-1339.778,0.106],[-1334.949,36.967],[-1342.977,50.556],[-1349.487,52.41],[-1364.856,49.588]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[2.067,2.972],[-0.59,9.71],[-5.018,8.052],[-5.057,0.831],[-4.613,-2.647],[-2.203,-5.549],[2.679,-13.921],[4.069,-2.151],[2.274,0.111],[11.706,2.937]],"o":[[-3.137,-0.479],[-2.723,-3.916],[0.834,-13.723],[3.479,-5.582],[3.598,-0.591],[4.503,2.584],[4.24,10.682],[-0.896,4.658],[-2.205,1.165],[-11.906,-0.579],[0,0]],"v":[[-1363.579,49.488],[-1376.265,40.778],[-1383.859,22.449],[-1376.428,-6.12],[-1359.642,-17.509],[-1349.243,-13.262],[-1339.778,0.106],[-1334.949,36.967],[-1342.977,50.556],[-1349.487,52.41],[-1364.856,49.588]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[2.979,2.809],[-0.257,9.74],[-4.138,8.754],[-5.466,1.888],[-4.034,-3.465],[-2.511,-5.416],[-0.388,-12.055],[2.927,-2.625],[2.277,-0.017],[11.853,2.273]],"o":[[-3.159,-0.302],[-3.926,-3.701],[0.364,-13.765],[2.972,-6.287],[4.553,-1.572],[4.034,3.465],[4.834,10.426],[0.152,4.741],[-1.857,1.665],[-11.92,0.091],[0,0]],"v":[[-1361.509,51.824],[-1369.942,47.479],[-1374.94,31.123],[-1366.468,1.585],[-1350.602,-11.99],[-1334.928,-7.754],[-1325.258,6.205],[-1317.248,40.693],[-1320.501,53.477],[-1327.05,55.275],[-1362.777,51.996]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[2.984,2.804],[-0.241,9.74],[-4.124,8.761],[-5.463,1.897],[-4.04,-3.458],[-2.521,-5.412],[-0.408,-12.054],[2.923,-2.63],[2.277,-0.021],[11.856,2.254]],"o":[[-3.16,-0.297],[-3.932,-3.695],[0.341,-13.765],[2.961,-6.292],[4.551,-1.58],[4.04,3.458],[4.852,10.418],[0.16,4.741],[-1.854,1.668],[-11.92,0.111],[0,0]],"v":[[-1362.517,49.843],[-1370.958,45.512],[-1375.983,29.165],[-1367.561,-0.388],[-1351.718,-13.989],[-1336.037,-9.78],[-1326.343,4.164],[-1318.275,38.638],[-1321.508,51.427],[-1328.053,53.236],[-1363.786,50.017]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[2.067,2.972],[-0.59,9.71],[-5.018,8.052],[-5.057,0.831],[-4.613,-2.647],[-2.203,-5.549],[2.679,-13.921],[4.069,-2.151],[2.274,0.111],[11.706,2.937]],"o":[[-3.137,-0.479],[-2.723,-3.916],[0.834,-13.723],[3.479,-5.582],[3.598,-0.591],[4.503,2.584],[4.24,10.682],[-0.896,4.658],[-2.205,1.165],[-11.906,-0.579],[0,0]],"v":[[-1358.461,50.063],[-1371.146,41.353],[-1378.74,23.024],[-1371.31,-5.545],[-1354.524,-16.934],[-1344.125,-12.687],[-1334.659,0.68],[-1329.83,37.542],[-1337.858,51.13],[-1344.369,52.985],[-1359.737,50.163]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[2.067,2.972],[-0.59,9.71],[-5.018,8.052],[-5.057,0.831],[-4.613,-2.647],[-2.203,-5.549],[2.679,-13.921],[4.069,-2.151],[2.274,0.111],[11.706,2.937]],"o":[[-3.137,-0.479],[-2.723,-3.916],[0.834,-13.723],[3.479,-5.582],[3.598,-0.591],[4.503,2.584],[4.24,10.682],[-0.896,4.658],[-2.205,1.165],[-11.906,-0.579],[0,0]],"v":[[-1358.461,50.063],[-1371.146,41.353],[-1378.74,23.024],[-1371.31,-5.545],[-1354.524,-16.934],[-1344.125,-12.687],[-1334.659,0.68],[-1329.83,37.542],[-1337.858,51.13],[-1344.369,52.985],[-1359.737,50.163]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[2.898,2.893],[-0.535,9.729],[-4.386,8.632],[-5.518,1.731],[-3.934,-3.579],[-2.356,-5.486],[-0.043,-12.061],[3.001,-2.54],[2.277,0.048],[11.783,2.611]],"o":[[-3.15,-0.392],[-3.818,-3.812],[0.756,-13.749],[3.15,-6.199],[4.597,-1.442],[3.934,3.579],[4.535,10.56],[0.017,4.743],[-1.903,1.611],[-11.918,-0.249],[0,0]],"v":[[-1366.278,49.812],[-1374.585,45.228],[-1379.114,28.737],[-1369.802,-0.549],[-1353.556,-13.665],[-1338.009,-8.984],[-1328.741,5.246],[-1321.718,39.949],[-1325.335,52.634],[-1331.932,54.245],[-1367.551,49.947]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[1.251,3.984],[-0.876,4.083],[-6.114,8.507],[-7.356,1.577],[-5.068,-3.687],[-2.913,-5.549],[0.386,-12.057],[4.059,-2.456],[3.007,0.111],[15.477,2.937]],"o":[[-4.148,-0.479],[-1.251,-3.984],[2.198,-10.243],[4.391,-6.11],[6.128,-1.314],[5.068,3.687],[5.607,10.682],[-0.152,4.742],[-2.574,1.558],[-15.742,-0.579],[0,0]],"v":[[-1342.869,54.095],[-1351.574,46.065],[-1351.489,33.68],[-1338.442,5.333],[-1321.075,-8.251],[-1303.352,-3.894],[-1291.624,10.587],[-1283.615,45.471],[-1288.861,58.052],[-1297.639,59.479],[-1344.556,54.195]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.933333337307,0.933333337307,0.933333337307,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Snout","np":3,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-1328.447,25.019]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1328.447,25.019]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Snout","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.767},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.725,3.062],[-2.94,1.12],[-1.102,-0.247],[-0.956,-1.446],[0.4,-2.948],[2.899,-0.67],[0.293,2.961]],"o":[[-2.126,-2.32],[0.725,-3.062],[1.055,-0.402],[1.692,0.378],[1.64,2.482],[-0.4,2.948],[-2.899,0.67],[0,0]],"v":[[-1265.202,-2.882],[-1267.487,-11.66],[-1261.509,-18.481],[-1258.191,-18.852],[-1254.268,-15.64],[-1251.975,-7.214],[-1257.364,-0.783],[-1265.218,-4.347]]}],"t":9},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.233},"s":[{"c":false,"i":[[0,0],[-0.53,3.076],[-2.448,1.184],[-0.935,-0.222],[-0.844,-1.425],[0.26,-2.956],[2.426,-0.733],[0.325,2.953]],"o":[[-1.853,-2.272],[0.53,-3.076],[0.879,-0.425],[1.436,0.341],[1.448,2.445],[-0.26,2.956],[-2.425,0.733],[0,0]],"v":[[-1315.748,2.079],[-1317.904,-6.645],[-1313.046,-13.595],[-1310.259,-14.038],[-1306.869,-10.913],[-1304.714,-2.54],[-1309.087,4.006],[-1315.801,0.616]]}],"t":19},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.53,3.076],[-2.448,1.184],[-0.935,-0.222],[-0.844,-1.425],[0.26,-2.956],[2.426,-0.733],[0.325,2.953]],"o":[[-1.853,-2.272],[0.53,-3.076],[0.879,-0.425],[1.436,0.341],[1.448,2.445],[-0.26,2.956],[-2.425,0.733],[0,0]],"v":[[-1323.984,0.356],[-1326.141,-8.368],[-1321.282,-15.318],[-1318.496,-15.762],[-1315.105,-12.637],[-1312.951,-4.264],[-1317.324,2.283],[-1324.037,-1.108]]}],"t":73},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.519,3.077],[-2.421,1.188],[-0.925,-0.221],[-0.837,-1.423],[0.252,-2.956],[2.399,-0.736],[0.327,2.953]],"o":[[-1.837,-2.27],[0.519,-3.077],[0.869,-0.426],[1.421,0.339],[1.437,2.443],[-0.252,2.956],[-2.399,0.736],[0,0]],"v":[[-1328.084,-12.224],[-1330.233,-20.945],[-1325.437,-27.902],[-1322.68,-28.35],[-1319.32,-25.23],[-1317.173,-16.86],[-1321.489,-10.307],[-1328.138,-13.688]]}],"t":77},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.561,3.07],[-2.436,1.155],[-0.922,-0.234],[-0.817,-1.435],[0.292,-2.952],[2.408,-0.703],[0.286,2.957]],"o":[[-1.806,-2.294],[0.561,-3.07],[0.874,-0.414],[1.416,0.359],[1.403,2.462],[-0.292,2.952],[-2.408,0.703],[0,0]],"v":[[-1339.133,-9.096],[-1341.162,-17.845],[-1336.273,-24.735],[-1333.51,-25.145],[-1330.193,-21.98],[-1328.161,-13.582],[-1332.566,-7.089],[-1339.167,-10.56]]}],"t":113},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1329.609,18.859],[-1331.515,10.081],[-1326.529,3.26],[-1323.761,2.889],[-1320.488,6.101],[-1318.574,14.527],[-1323.07,20.958],[-1329.623,17.394]]}],"t":120},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1329.609,18.859],[-1331.515,10.081],[-1326.529,3.26],[-1323.761,2.889],[-1320.488,6.101],[-1318.574,14.527],[-1323.07,20.958],[-1329.623,17.394]]}],"t":128},{"i":{"x":0,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1337.565,8.259],[-1339.471,-0.518],[-1334.485,-7.339],[-1331.717,-7.71],[-1328.444,-4.498],[-1326.531,3.928],[-1331.026,10.359],[-1337.579,6.795]]}],"t":143},{"i":{"x":0.833,"y":0.727},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1339.393,-1.863],[-1341.299,-10.64],[-1336.313,-17.462],[-1333.545,-17.833],[-1330.272,-14.621],[-1328.358,-6.194],[-1332.854,0.237],[-1339.407,-3.328]]}],"t":160},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.273},"s":[{"c":false,"i":[[0,0],[-0.604,0.376],[-2.453,0.138],[-0.919,-0.03],[-0.797,-0.178],[0.334,-0.362],[2.418,-0.082],[0.245,0.364]],"o":[[-1.773,-0.285],[0.604,-0.376],[0.88,-0.049],[1.411,0.047],[1.368,0.305],[-0.334,0.362],[-2.418,0.082],[0,0]],"v":[[-1338.469,-17.7],[-1340.375,-18.779],[-1335.388,-19.617],[-1332.62,-19.663],[-1329.348,-19.268],[-1327.434,-18.232],[-1331.93,-17.442],[-1338.483,-17.88]]}],"t":163.111},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1339.393,-1.863],[-1341.299,-10.64],[-1336.313,-17.462],[-1333.545,-17.833],[-1330.272,-14.621],[-1328.358,-6.194],[-1332.854,0.237],[-1339.407,-3.328]]}],"t":171},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1339.393,-1.863],[-1341.299,-10.64],[-1336.313,-17.462],[-1333.545,-17.833],[-1330.272,-14.621],[-1328.358,-6.194],[-1332.854,0.237],[-1339.407,-3.328]]}],"t":187},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1336.846,11.722],[-1338.752,2.945],[-1333.766,-3.876],[-1330.997,-4.247],[-1327.725,-1.035],[-1325.811,7.391],[-1330.307,13.822],[-1336.86,10.258]]}],"t":193},{"i":{"x":0,"y":0},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1336.846,11.722],[-1338.752,2.945],[-1333.766,-3.876],[-1330.997,-4.247],[-1327.725,-1.035],[-1325.811,7.391],[-1330.307,13.822],[-1336.86,10.258]]}],"t":203},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.444,3.089],[-2.391,1.247],[-0.93,-0.198],[-0.872,-1.402],[0.179,-2.961],[2.38,-0.795],[0.399,2.943]],"o":[[-1.892,-2.224],[0.443,-3.089],[0.858,-0.447],[1.429,0.304],[1.496,2.407],[-0.179,2.961],[-2.379,0.795],[0,0]],"v":[[-1320.019,-18.701],[-1322.38,-27.366],[-1317.758,-34.438],[-1315.013,-34.953],[-1311.578,-31.917],[-1309.226,-23.603],[-1313.38,-16.947],[-1320.109,-20.163]]}],"t":214},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.444,3.089],[-2.391,1.247],[-0.93,-0.198],[-0.872,-1.402],[0.179,-2.961],[2.38,-0.795],[0.399,2.943]],"o":[[-1.892,-2.224],[0.443,-3.089],[0.858,-0.447],[1.429,0.304],[1.496,2.407],[-0.179,2.961],[-2.379,0.795],[0,0]],"v":[[-1297.984,-21.208],[-1300.345,-29.873],[-1295.723,-36.945],[-1292.978,-37.46],[-1289.542,-34.424],[-1287.191,-26.11],[-1291.344,-19.454],[-1298.074,-22.67]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.444,3.089],[-2.391,1.247],[-0.93,-0.198],[-0.872,-1.402],[0.179,-2.961],[2.38,-0.795],[0.399,2.943]],"o":[[-1.892,-2.224],[0.443,-3.089],[0.858,-0.447],[1.429,0.304],[1.496,2.407],[-0.179,2.961],[-2.379,0.795],[0,0]],"v":[[-1302.516,-23.194],[-1304.878,-31.859],[-1300.255,-38.931],[-1297.51,-39.446],[-1294.075,-36.41],[-1291.724,-28.096],[-1295.877,-21.44],[-1302.606,-24.656]]}],"t":296},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1344.909,-22.774],[-1346.815,-31.551],[-1341.829,-38.373],[-1339.061,-38.744],[-1335.788,-35.532],[-1333.874,-27.106],[-1338.37,-20.675],[-1344.923,-24.239]]}],"t":312},{"i":{"x":0.25,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1344.909,-22.774],[-1346.815,-31.551],[-1341.829,-38.373],[-1339.061,-38.744],[-1335.788,-35.532],[-1333.874,-27.106],[-1338.37,-20.675],[-1344.923,-24.239]]}],"t":366},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.431,3.091],[-2.386,1.257],[-0.931,-0.194],[-0.877,-1.399],[0.167,-2.962],[2.377,-0.805],[0.411,2.942]],"o":[[-1.901,-2.216],[0.431,-3.091],[0.856,-0.451],[1.43,0.299],[1.506,2.401],[-0.167,2.962],[-2.376,0.805],[0,0]],"v":[[-1334.779,4.666],[-1337.176,-3.99],[-1332.581,-11.081],[-1329.838,-11.607],[-1326.39,-8.584],[-1324.005,-0.279],[-1328.132,6.394],[-1334.875,3.205]]}],"t":371},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1333.045,3.371],[-1334.952,-5.407],[-1329.965,-12.228],[-1327.197,-12.599],[-1323.924,-9.387],[-1322.011,-0.961],[-1326.506,5.47],[-1333.059,1.906]]}],"t":384},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1333.651,8.8],[-1335.557,0.023],[-1330.571,-6.799],[-1327.803,-7.169],[-1324.53,-3.958],[-1322.616,4.469],[-1327.112,10.9],[-1333.665,7.336]]}],"t":403},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.333},"s":[{"c":false,"i":[[0,0],[-0.55,0.581],[-2.422,0.431],[-0.919,0.048],[-0.818,-0.169],[0.283,-0.535],[2.396,-0.35],[0.293,0.481]],"o":[[-1.804,-0.222],[0.55,-0.581],[0.869,-0.154],[1.411,-0.073],[1.403,0.29],[-0.283,0.535],[-2.396,0.35],[0,0]],"v":[[-1317.214,-13.937],[-1319.258,-15.248],[-1314.41,-16.898],[-1311.661,-17.231],[-1308.35,-17.003],[-1306.305,-15.753],[-1310.672,-14.217],[-1317.253,-14.185]]}],"t":404},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.333},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1317.286,-1.55],[-1319.192,-10.327],[-1314.205,-17.149],[-1311.437,-17.52],[-1308.165,-14.308],[-1306.251,-5.881],[-1310.747,0.549],[-1317.3,-3.015]]}],"t":405},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.333},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1317.286,-1.55],[-1319.192,-10.327],[-1314.205,-17.149],[-1311.437,-17.52],[-1308.165,-14.308],[-1306.251,-5.881],[-1310.747,0.549],[-1317.3,-3.015]]}],"t":410},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.519,3.077],[-2.421,1.188],[-0.926,-0.221],[-0.837,-1.423],[0.252,-2.956],[2.399,-0.736],[0.327,2.953]],"o":[[-1.837,-2.27],[0.519,-3.077],[0.869,-0.426],[1.421,0.339],[1.437,2.443],[-0.252,2.956],[-2.399,0.736],[0,0]],"v":[[-1303.67,7.409],[-1305.819,-1.313],[-1301.024,-8.27],[-1298.267,-8.717],[-1294.907,-5.597],[-1292.76,2.773],[-1297.076,9.326],[-1303.725,5.945]]}],"t":420},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.725,3.062],[-2.94,1.12],[-1.102,-0.247],[-0.956,-1.446],[0.4,-2.948],[2.899,-0.67],[0.293,2.961]],"o":[[-2.126,-2.32],[0.725,-3.062],[1.055,-0.402],[1.692,0.378],[1.64,2.482],[-0.4,2.948],[-2.899,0.67],[0,0]],"v":[[-1276.29,1.547],[-1278.575,-7.231],[-1272.598,-14.052],[-1269.28,-14.423],[-1265.357,-11.211],[-1263.063,-2.785],[-1268.452,3.646],[-1276.307,0.082]]}],"t":461},{"s":[{"c":false,"i":[[0,0],[-0.725,3.062],[-2.94,1.12],[-1.102,-0.247],[-0.956,-1.446],[0.4,-2.948],[2.899,-0.67],[0.293,2.961]],"o":[[-2.126,-2.32],[0.725,-3.062],[1.055,-0.402],[1.692,0.378],[1.64,2.482],[-0.4,2.948],[-2.899,0.67],[0,0]],"v":[[-1295.904,-3.752],[-1298.189,-12.529],[-1292.211,-19.351],[-1288.893,-19.722],[-1284.97,-16.51],[-1282.677,-8.083],[-1288.065,-1.653],[-1295.92,-5.217]]}],"t":475}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Front pupil","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[7.881,0.157],[5.323,-5.016],[-0.849,-14.064],[-2.164,-2.424],[-2.847,-1.093],[-8.994,4.376],[-2.066,7.956],[1.855,5.121],[4.646,3.454]],"o":[[-3.447,-0.069],[-7.037,6.63],[0.256,4.236],[2.164,2.424],[9.256,3.553],[6.565,-3.194],[1.382,-5.322],[-3.489,-9.633],[-4.858,-3.612]],"v":[[-1277.036,-47.926],[-1295.86,-41.682],[-1306.029,-14.062],[-1300.775,1.838],[-1292.963,6.858],[-1264.371,5.568],[-1249.609,-11.302],[-1249.935,-27.778],[-1260.336,-42.78]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[7.001,-0.037],[4.997,-4.394],[-1.145,-14.038],[-1.988,-2.37],[-2.558,-1.022],[-7.863,4.596],[-1.614,8.004],[1.56,5.037],[4.22,3.338]],"o":[[-3.062,0.016],[-6.843,6.017],[0.345,4.228],[1.988,2.37],[8.316,3.324],[5.74,-3.355],[1.079,-5.354],[-2.545,-8.216],[-4.413,-3.49]],"v":[[-1298.132,-45.679],[-1313.908,-39.137],[-1326.075,-10.357],[-1321.127,4.22],[-1312.708,10.076],[-1281.708,7.575],[-1269.304,-8.977],[-1270.787,-25.418],[-1281.422,-41.001]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[7,0.157],[4.728,-5.016],[-0.754,-14.064],[-1.922,-2.424],[-2.529,-1.093],[-7.988,4.376],[-1.835,7.956],[1.255,5.121],[4.126,3.454]],"o":[[-3.061,-0.069],[-6.25,6.63],[0.227,4.236],[1.921,2.424],[8.22,3.553],[5.831,-3.194],[1.227,-5.322],[-2.361,-9.633],[-4.315,-3.612]],"v":[[-1306.224,-47.53],[-1322.942,-41.286],[-1335.903,-12.855],[-1331.361,1.854],[-1323.107,7.941],[-1292.05,6.302],[-1279.192,-9.9],[-1280.219,-26.376],[-1291.393,-42.384]]}],"t":128},{"i":{"x":0.833,"y":0.727},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[5.278,0.157],[4.628,-4.625],[-0.624,-14.064],[-1.589,-2.424],[-2.091,-1.093],[-6.607,4.376],[-1.518,7.956],[1.038,5.121],[3.413,3.454]],"o":[[-2.308,-0.069],[-5.754,5.75],[0.188,4.236],[1.589,2.424],[6.799,3.553],[4.823,-3.194],[1.015,-5.322],[-1.953,-9.633],[-3.569,-3.612]],"v":[[-1315.11,-48.015],[-1329.324,-41.842],[-1340.163,-14.151],[-1336.303,1.749],[-1330.565,6.77],[-1307.142,5.817],[-1296.507,-10.385],[-1297.356,-26.861],[-1304.673,-43.229]]}],"t":143},{"i":{"x":0.833,"y":0.727},"o":{"x":0.167,"y":0.273},"s":[{"c":true,"i":[[5.278,0.157],[4.628,-4.625],[-0.624,-14.064],[-1.589,-2.424],[-2.091,-1.093],[-6.607,4.376],[-1.518,7.956],[1.038,5.121],[3.413,3.454]],"o":[[-2.308,-0.069],[-5.754,5.75],[0.188,4.236],[1.589,2.424],[6.799,3.553],[4.823,-3.194],[1.015,-5.322],[-1.953,-9.633],[-3.569,-3.612]],"v":[[-1315.11,-48.015],[-1329.324,-41.842],[-1340.163,-14.151],[-1336.303,1.749],[-1330.565,6.77],[-1307.142,5.817],[-1296.507,-10.385],[-1297.356,-26.861],[-1304.673,-43.229]]}],"t":157},{"i":{"x":0.833,"y":0.727},"o":{"x":0.167,"y":0.273},"s":[{"c":true,"i":[[5.278,0.006],[4.628,-0.168],[-0.624,-0.51],[-1.589,-0.088],[-2.091,-0.04],[-6.607,0.159],[-1.518,0.289],[1.038,0.186],[3.413,0.125]],"o":[[-2.308,-0.003],[-5.754,0.209],[0.188,0.154],[1.589,0.088],[6.799,0.129],[4.823,-0.116],[1.015,-0.193],[-1.953,-0.349],[-3.569,-0.131]],"v":[[-1315.11,-19.937],[-1329.324,-19.713],[-1340.163,-18.709],[-1336.303,-18.132],[-1330.565,-17.95],[-1307.142,-17.985],[-1296.507,-18.572],[-1297.356,-19.17],[-1304.673,-19.764]]}],"t":163.111},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.273},"s":[{"c":true,"i":[[5.278,0.157],[4.628,-4.625],[-0.624,-14.064],[-1.589,-2.424],[-2.091,-1.093],[-6.607,4.376],[-1.518,7.956],[1.038,5.121],[3.413,3.454]],"o":[[-2.308,-0.069],[-5.754,5.75],[0.188,4.236],[1.589,2.424],[6.799,3.553],[4.823,-3.194],[1.015,-5.322],[-1.953,-9.633],[-3.569,-3.612]],"v":[[-1315.11,-48.015],[-1329.324,-41.842],[-1340.163,-14.151],[-1336.303,1.749],[-1330.565,6.77],[-1307.142,5.817],[-1296.507,-10.385],[-1297.356,-26.861],[-1304.673,-43.229]]}],"t":168},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[5.278,0.157],[4.628,-4.625],[-0.624,-14.064],[-1.589,-2.424],[-2.091,-1.093],[-6.607,4.376],[-1.518,7.956],[1.038,5.121],[3.413,3.454]],"o":[[-2.308,-0.069],[-5.754,5.75],[0.188,4.236],[1.589,2.424],[6.799,3.553],[4.823,-3.194],[1.015,-5.322],[-1.953,-9.633],[-3.569,-3.612]],"v":[[-1315.11,-48.015],[-1329.324,-41.842],[-1340.163,-14.151],[-1336.303,1.749],[-1330.565,6.77],[-1307.142,5.817],[-1296.507,-10.385],[-1297.356,-26.861],[-1304.673,-43.229]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[6.997,-0.237],[4.438,-5.274],[-1.545,-13.999],[-2.055,-2.312],[-2.586,-0.949],[-7.729,4.819],[-1.384,8.047],[1.541,5.043],[4.314,3.216]],"o":[[-3.06,0.104],[-5.867,6.971],[0.465,4.217],[2.055,2.312],[8.407,3.085],[5.642,-3.517],[0.926,-5.382],[-2.9,-9.485],[-4.511,-3.363]],"v":[[-1295.357,-45.757],[-1311.697,-38.583],[-1323.039,-9.468],[-1317.676,4.962],[-1309.093,10.576],[-1278.178,7.192],[-1266.251,-9.707],[-1268.203,-26.1],[-1280.26,-41.454]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[6.997,-0.248],[4.43,-5.281],[-1.568,-13.997],[-2.059,-2.309],[-2.588,-0.945],[-7.721,4.831],[-1.371,8.049],[1.55,5.04],[4.319,3.209]],"o":[[-3.06,0.109],[-5.855,6.981],[0.472,4.216],[2.059,2.309],[8.412,3.071],[5.636,-3.527],[0.917,-5.384],[-2.915,-9.48],[-4.517,-3.356]],"v":[[-1296.53,-47.849],[-1312.858,-40.647],[-1324.15,-11.513],[-1318.764,2.908],[-1310.171,8.507],[-1279.262,5.071],[-1267.363,-11.848],[-1269.342,-28.237],[-1281.425,-43.571]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[5.278,0.157],[4.628,-4.625],[-0.624,-14.064],[-1.589,-2.424],[-2.091,-1.093],[-6.607,4.376],[-1.518,7.956],[1.038,5.121],[3.413,3.454]],"o":[[-2.308,-0.069],[-5.754,5.75],[0.188,4.236],[1.589,2.424],[6.799,3.553],[4.823,-3.194],[1.015,-5.322],[-1.953,-9.633],[-3.569,-3.612]],"v":[[-1309.992,-47.44],[-1324.206,-41.268],[-1335.044,-13.576],[-1331.185,2.324],[-1325.446,7.344],[-1302.024,6.392],[-1291.389,-9.81],[-1292.238,-26.286],[-1299.555,-42.654]]}],"t":312},{"i":{"x":0.833,"y":0.667},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[5.278,0.157],[4.628,-4.625],[-0.624,-14.064],[-1.589,-2.424],[-2.091,-1.093],[-6.607,4.376],[-1.518,7.956],[1.038,5.121],[3.413,3.454]],"o":[[-2.308,-0.069],[-5.754,5.75],[0.188,4.236],[1.589,2.424],[6.799,3.553],[4.823,-3.194],[1.015,-5.322],[-1.953,-9.633],[-3.569,-3.612]],"v":[[-1309.992,-47.44],[-1324.206,-41.268],[-1335.044,-13.576],[-1331.185,2.324],[-1325.446,7.344],[-1302.024,6.392],[-1291.389,-9.81],[-1292.238,-26.286],[-1299.555,-42.654]]}],"t":400},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.333},"s":[{"c":true,"i":[[6.965,-0.228],[4.584,-0.191],[-1.138,-0.076],[-1.979,0.046],[-2.548,0.075],[-7.834,0.293],[-1.609,0.117],[1.391,-0.005],[4.203,-0.111]],"o":[[-3.046,0.1],[-6.053,0.252],[0.343,0.023],[1.979,-0.046],[8.283,-0.244],[5.718,-0.214],[1.076,-0.078],[-2.616,0.009],[-4.396,0.116]],"v":[[-1297.623,-16.528],[-1314.106,-15.936],[-1326.234,-15.308],[-1321.305,-15.352],[-1312.94,-15.578],[-1282.103,-16.606],[-1269.744,-17.143],[-1271.219,-17.227],[-1282.748,-16.977]]}],"t":404},{"i":{"x":0.6,"y":1},"o":{"x":0.5,"y":1},"s":[{"c":true,"i":[[6.891,-0.025],[4.59,-5.112],[-1.111,-14.039],[-1.962,-2.373],[-2.528,-1.027],[-7.783,4.582],[-1.607,8.001],[1.374,5.087],[4.169,3.345]],"o":[[-3.014,0.011],[-6.044,6.734],[0.335,4.229],[1.962,2.373],[8.219,3.338],[5.681,-3.345],[1.075,-5.351],[-2.585,-9.569],[-4.359,-3.498]],"v":[[-1298.177,-45.945],[-1314.566,-39.273],[-1326.649,-10.563],[-1321.77,4.098],[-1313.522,9.901],[-1283.007,7.5],[-1270.716,-9.03],[-1272.159,-25.474],[-1283.498,-41.208]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[7.001,-0.037],[4.587,-5.145],[-1.145,-14.038],[-1.988,-2.37],[-2.558,-1.022],[-7.863,4.596],[-1.614,8.004],[1.397,5.085],[4.22,3.338]],"o":[[-3.062,0.016],[-6.064,6.801],[0.345,4.228],[1.988,2.37],[8.316,3.324],[5.74,-3.355],[1.079,-5.354],[-2.628,-9.564],[-4.413,-3.49]],"v":[[-1297.37,-45.843],[-1313.908,-39.137],[-1326.075,-10.357],[-1321.127,4.22],[-1312.708,10.076],[-1281.708,7.575],[-1269.304,-8.977],[-1270.787,-25.418],[-1282.401,-41.11]]}],"t":420},{"s":[{"c":true,"i":[[7.881,0.157],[5.323,-5.016],[-0.849,-14.064],[-2.164,-2.424],[-2.847,-1.093],[-8.994,4.376],[-2.066,7.956],[1.855,5.121],[4.646,3.454]],"o":[[-3.447,-0.069],[-7.037,6.63],[0.256,4.236],[2.164,2.424],[9.256,3.553],[6.565,-3.194],[1.382,-5.322],[-3.489,-9.633],[-4.858,-3.612]],"v":[[-1277.036,-47.926],[-1295.86,-41.682],[-1306.029,-14.062],[-1300.775,1.838],[-1292.963,6.858],[-1264.371,5.568],[-1249.609,-11.302],[-1249.935,-27.778],[-1260.336,-42.78]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[1,1,1,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-1298.635,-16.776]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1298.635,-16.776]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[145,145]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":9,"mn":"ADBE Vector Group","nm":"Front eye","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.767},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.062,3.491],[-3.285,1.185],[-1.146,-0.25],[-0.845,-2.422],[0.566,-2.246],[2.21,-0.691],[0.858,1.588]],"o":[[-3.434,-0.634],[0.062,-3.491],[1.104,-0.398],[2.506,0.546],[0.763,2.187],[-0.566,2.246],[-1.723,0.539],[0,0]],"v":[[-1342.852,-8.695],[-1348.82,-16.258],[-1342.95,-24.17],[-1339.493,-24.508],[-1334.526,-19.079],[-1333.972,-12.253],[-1338.356,-7.255],[-1343.104,-8.804]]}],"t":9},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.233},"s":[{"c":false,"i":[[0,0],[0.042,3.491],[-2.622,1.253],[-0.933,-0.226],[-0.746,-2.404],[0.398,-2.257],[1.767,-0.737],[0.734,1.569]],"o":[[-2.79,-0.561],[-0.042,-3.491],[0.881,-0.421],[2.039,0.493],[0.673,2.17],[-0.398,2.257],[-1.377,0.574],[0,0]],"v":[[-1381.126,-3.297],[-1386.145,-10.732],[-1381.612,-18.764],[-1378.828,-19.175],[-1374.673,-13.852],[-1374.046,-7.04],[-1377.457,-1.952],[-1381.332,-3.401]]}],"t":19},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.042,3.491],[-2.622,1.253],[-0.933,-0.226],[-0.746,-2.404],[0.398,-2.257],[1.767,-0.737],[0.734,1.569]],"o":[[-2.79,-0.561],[-0.042,-3.491],[0.881,-0.421],[2.039,0.493],[0.673,2.17],[-0.398,2.257],[-1.377,0.574],[0,0]],"v":[[-1383.363,-6.829],[-1388.382,-14.264],[-1383.849,-22.296],[-1381.065,-22.706],[-1376.91,-17.383],[-1376.283,-10.571],[-1379.694,-5.484],[-1383.569,-6.932]]}],"t":73},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.047,3.491],[-2.585,1.257],[-0.921,-0.224],[-0.74,-2.403],[0.389,-2.257],[1.742,-0.74],[0.728,1.568]],"o":[[-2.754,-0.557],[-0.047,-3.491],[0.869,-0.422],[2.012,0.49],[0.668,2.169],[-0.389,2.257],[-1.358,0.576],[0,0]],"v":[[-1383.718,-18.309],[-1388.683,-25.737],[-1384.225,-33.776],[-1381.479,-34.191],[-1377.37,-28.874],[-1376.739,-22.063],[-1380.095,-16.97],[-1383.921,-18.413]]}],"t":77},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0,3.491],[-2.601,1.222],[-0.917,-0.237],[-0.707,-2.412],[0.419,-2.251],[1.752,-0.716],[0.706,1.578]],"o":[[-2.746,-0.595],[0,-3.491],[0.874,-0.41],[2.005,0.518],[0.638,2.178],[-0.419,2.251],[-1.365,0.558],[0,0]],"v":[[-1390.361,-16.711],[-1395.224,-24.205],[-1390.657,-32.181],[-1387.906,-32.558],[-1383.871,-27.186],[-1383.332,-20.368],[-1386.757,-15.322],[-1390.563,-16.817]]}],"t":113},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.05,3.491],[-2.619,1.185],[-0.914,-0.25],[-0.673,-2.422],[0.451,-2.246],[1.762,-0.691],[0.684,1.588]],"o":[[-2.738,-0.634],[0.05,-3.491],[0.88,-0.398],[1.998,0.546],[0.608,2.187],[-0.451,2.246],[-1.373,0.539],[0,0]],"v":[[-1391.939,4.219],[-1396.697,-3.344],[-1392.017,-11.256],[-1389.261,-11.594],[-1385.301,-6.165],[-1384.859,0.661],[-1388.355,5.659],[-1392.14,4.11]]}],"t":120},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.05,3.491],[-2.619,1.185],[-0.914,-0.25],[-0.673,-2.422],[0.451,-2.246],[1.762,-0.691],[0.684,1.588]],"o":[[-2.738,-0.634],[0.05,-3.491],[0.88,-0.398],[1.998,0.546],[0.608,2.187],[-0.451,2.246],[-1.373,0.539],[0,0]],"v":[[-1391.939,4.219],[-1396.697,-3.344],[-1392.017,-11.256],[-1389.261,-11.594],[-1385.301,-6.165],[-1384.859,0.661],[-1388.355,5.659],[-1392.14,4.11]]}],"t":128},{"i":{"x":0,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.05,3.491],[-2.619,1.185],[-0.914,-0.25],[-0.673,-2.422],[0.451,-2.246],[1.762,-0.691],[0.684,1.588]],"o":[[-2.738,-0.634],[0.05,-3.491],[0.88,-0.398],[1.998,0.546],[0.608,2.187],[-0.451,2.246],[-1.373,0.539],[0,0]],"v":[[-1381.497,-5.244],[-1386.254,-12.807],[-1381.575,-20.719],[-1378.819,-21.057],[-1374.859,-15.628],[-1374.417,-8.802],[-1377.912,-3.804],[-1381.697,-5.353]]}],"t":143},{"i":{"x":0.833,"y":0.727},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1379.336,-10.049],[-1382.827,-17.612],[-1379.394,-25.524],[-1377.371,-25.862],[-1374.466,-20.434],[-1374.141,-13.607],[-1376.706,-8.61],[-1379.484,-10.158]]}],"t":160},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.273},"s":[{"c":false,"i":[[0,0],[-0.074,0.199],[-1.903,-0.278],[-0.656,-0.136],[-0.459,-0.232],[0.35,-0.072],[1.279,0.193],[0.476,0.185]],"o":[[-1.969,-0.401],[0.074,-0.199],[0.639,0.093],[1.436,0.298],[0.415,0.21],[-0.35,0.072],[-0.997,-0.151],[0,0]],"v":[[-1379.207,-26.935],[-1382.558,-28.013],[-1379.095,-27.858],[-1377.103,-27.512],[-1374.304,-26.665],[-1374.06,-26.204],[-1376.636,-26.374],[-1379.351,-26.968]]}],"t":163.111},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1379.336,-10.049],[-1382.827,-17.612],[-1379.394,-25.524],[-1377.371,-25.862],[-1374.466,-20.434],[-1374.141,-13.607],[-1376.706,-8.61],[-1379.484,-10.158]]}],"t":171},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1379.336,-10.049],[-1382.827,-17.612],[-1379.394,-25.524],[-1377.371,-25.862],[-1374.466,-20.434],[-1374.141,-13.607],[-1376.706,-8.61],[-1379.484,-10.158]]}],"t":187},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.922,1.185],[-0.671,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1383.109,0.293],[-1386.6,-7.269],[-1383.166,-15.182],[-1381.144,-15.52],[-1378.238,-10.091],[-1377.914,-3.265],[-1380.479,1.733],[-1383.256,0.185]]}],"t":193},{"i":{"x":0,"y":0},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[0.147,3.489],[-2.548,1.33],[-0.927,-0.198],[-0.808,-2.38],[0.324,-2.267],[1.72,-0.789],[0.772,1.547]],"o":[[-2.769,-0.479],[-0.147,-3.489],[0.856,-0.447],[2.026,0.433],[0.73,2.149],[-0.324,2.267],[-1.341,0.615],[0,0]],"v":[[-1382.23,0.698],[-1387.406,-6.585],[-1383.178,-14.748],[-1380.446,-15.241],[-1376.187,-10.043],[-1375.361,-3.253],[-1378.571,1.934],[-1382.436,0.6]]}],"t":203},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.134,3.489],[-2.503,1.32],[-0.909,-0.202],[-0.786,-2.383],[0.324,-2.266],[1.69,-0.782],[0.752,1.55]],"o":[[-2.715,-0.49],[-0.134,-3.489],[0.841,-0.444],[1.986,0.441],[0.709,2.152],[-0.325,2.266],[-1.317,0.61],[0,0]],"v":[[-1369.085,-26.199],[-1374.141,-33.502],[-1369.971,-41.647],[-1367.288,-42.129],[-1363.125,-36.915],[-1362.335,-30.122],[-1365.499,-24.949],[-1369.287,-26.298]]}],"t":214},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.134,3.489],[-2.503,1.32],[-0.909,-0.202],[-0.786,-2.383],[0.324,-2.266],[1.69,-0.782],[0.752,1.55]],"o":[[-2.715,-0.49],[-0.134,-3.489],[0.841,-0.444],[1.986,0.441],[0.709,2.152],[-0.325,2.266],[-1.317,0.61],[0,0]],"v":[[-1359.342,-22.665],[-1364.397,-29.968],[-1360.227,-38.113],[-1357.544,-38.595],[-1353.381,-33.381],[-1352.592,-26.588],[-1355.755,-21.415],[-1359.543,-22.763]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.134,3.489],[-2.503,1.32],[-0.909,-0.202],[-0.786,-2.383],[0.324,-2.266],[1.69,-0.782],[0.752,1.55]],"o":[[-2.715,-0.49],[-0.134,-3.489],[0.841,-0.444],[1.986,0.441],[0.709,2.152],[-0.325,2.266],[-1.317,0.61],[0,0]],"v":[[-1361.147,-27.071],[-1366.203,-34.374],[-1362.032,-42.519],[-1359.35,-43.001],[-1355.187,-37.787],[-1354.397,-30.994],[-1357.561,-25.821],[-1361.349,-27.169]]}],"t":296},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1373.525,-28.795],[-1377.016,-36.358],[-1373.582,-44.27],[-1371.56,-44.608],[-1368.654,-39.179],[-1368.33,-32.353],[-1370.895,-27.355],[-1373.672,-28.904]]}],"t":312},{"i":{"x":0.25,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1373.525,-28.795],[-1377.016,-36.358],[-1373.582,-44.27],[-1371.56,-44.608],[-1368.654,-39.179],[-1368.33,-32.353],[-1370.895,-27.355],[-1373.672,-28.904]]}],"t":366},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.147,3.489],[-2.548,1.33],[-0.927,-0.198],[-0.808,-2.38],[0.324,-2.267],[1.72,-0.789],[0.772,1.547]],"o":[[-2.769,-0.479],[-0.147,-3.489],[0.856,-0.447],[2.026,0.433],[0.73,2.149],[-0.324,2.267],[-1.341,0.615],[0,0]],"v":[[-1374.434,-4.377],[-1379.609,-11.66],[-1375.382,-19.823],[-1372.649,-20.315],[-1368.39,-15.118],[-1367.565,-8.327],[-1370.774,-3.141],[-1374.64,-4.474]]}],"t":371},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1376.408,-5.237],[-1379.899,-12.8],[-1376.465,-20.712],[-1374.443,-21.05],[-1371.537,-15.621],[-1371.213,-8.795],[-1373.778,-3.797],[-1376.555,-5.346]]}],"t":384},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1377.477,-0.705],[-1380.968,-8.268],[-1377.535,-16.18],[-1375.512,-16.518],[-1372.607,-11.089],[-1372.282,-4.263],[-1374.847,0.735],[-1377.625,-0.814]]}],"t":403},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.333},"s":[{"c":false,"i":[[0,0],[-0.135,0.312],[-1.869,-0.461],[-0.633,-0.222],[-0.402,-0.371],[0.381,-0.109],[1.255,0.32],[0.433,0.296]],"o":[[-1.9,-0.655],[0.135,-0.312],[0.628,0.155],[1.384,0.486],[0.363,0.335],[-0.381,0.109],[-0.978,-0.249],[0,0]],"v":[[-1372.669,-22.399],[-1375.785,-24.135],[-1372.279,-23.847],[-1370.338,-23.278],[-1367.72,-21.913],[-1367.606,-21.186],[-1370.199,-21.485],[-1372.807,-22.453]]}],"t":404},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.333},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1373.517,-8.855],[-1377.321,-14.471],[-1373.887,-22.383],[-1371.865,-22.721],[-1368.959,-17.292],[-1368.635,-10.466],[-1371.012,-8.369],[-1372.843,-8.57]]}],"t":405},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.333},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1373.83,-6.908],[-1377.321,-14.471],[-1373.887,-22.383],[-1371.865,-22.721],[-1368.959,-17.292],[-1368.635,-10.466],[-1371.2,-5.468],[-1373.977,-7.017]]}],"t":410},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.047,3.491],[-2.585,1.257],[-0.921,-0.224],[-0.74,-2.403],[0.389,-2.257],[1.742,-0.74],[0,0]],"o":[[-2.152,-1.252],[-0.047,-3.491],[0.869,-0.422],[2.012,0.49],[0.668,2.169],[-0.389,2.257],[-1.358,0.576],[0,0]],"v":[[-1367.706,-2.994],[-1372.2,-11.18],[-1367.742,-19.219],[-1364.996,-19.634],[-1360.887,-14.317],[-1360.256,-7.506],[-1363.612,-2.413],[-1367.91,-3.098]]}],"t":420},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.062,3.491],[-3.285,1.185],[-1.146,-0.25],[-0.845,-2.422],[0.566,-2.246],[2.21,-0.691],[1.008,0.696]],"o":[[-2.01,-1.357],[0.062,-3.491],[1.104,-0.398],[2.506,0.546],[0.763,2.187],[-0.566,2.246],[-1.723,0.539],[0,0]],"v":[[-1345.63,-8.706],[-1350.333,-16.858],[-1344.463,-24.77],[-1341.007,-25.108],[-1336.04,-19.679],[-1335.485,-12.853],[-1339.87,-7.855],[-1345.882,-8.815]]}],"t":461},{"s":[{"c":false,"i":[[0,0],[-0.062,3.491],[-3.285,1.185],[-1.146,-0.25],[-0.845,-2.422],[0.566,-2.246],[2.21,-0.691],[1.008,0.696]],"o":[[-2.01,-1.357],[0.062,-3.491],[1.104,-0.398],[2.506,0.546],[0.763,2.187],[-0.566,2.246],[-1.723,0.539],[0,0]],"v":[[-1356.267,-6.6],[-1360.998,-15.173],[-1355.129,-23.086],[-1351.672,-23.424],[-1346.705,-17.995],[-1346.15,-11.169],[-1350.535,-6.171],[-1356.519,-6.709]]}],"t":475}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":10,"mn":"ADBE Vector Group","nm":"Back pupil","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.836,2.426],[6.311,-2.495],[3.518,-5.242],[1.616,-6.512],[-0.654,-3.285],[-1.52,-2.202],[-6.479,-1.448],[-5.388,3.355],[-2.497,5.611],[0.894,7.369]],"o":[[-5.48,-3.466],[-6.092,2.409],[-3.799,5.661],[-0.807,3.255],[0.513,2.577],[3.614,5.238],[6.479,1.448],[5.007,-3.118],[2.9,-6.516],[-0.522,-4.306]],"v":[[-1344.228,-47.153],[-1365.365,-48.626],[-1378.915,-38.905],[-1384.241,-25.266],[-1383.285,-14.435],[-1380.09,-7.214],[-1364.044,1.094],[-1344.736,-2.607],[-1334.377,-13.355],[-1333.264,-32.062]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.573,2.356],[4.098,-2.539],[1.659,-5.751],[1.063,-6.261],[0.257,-3.303],[-1.054,-2.174],[-4.273,-1.33],[-3.427,3.452],[-1.476,5.654],[0.788,7.35]],"o":[[-3.676,-3.365],[-2.408,1.492],[-1.714,5.94],[-0.552,3.251],[-0.24,3.084],[2.506,5.17],[4.273,1.33],[3.184,-3.207],[1.714,-6.566],[-0.461,-4.295]],"v":[[-1362.236,-45.393],[-1376.084,-46.482],[-1380.722,-35.214],[-1383.849,-21.239],[-1385.236,-10.81],[-1384.554,-4.819],[-1373.842,3.195],[-1361.332,-0.855],[-1354.864,-11.786],[-1354.655,-30.506]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.932,2.426],[3.178,-2.495],[1.771,-5.242],[1.215,-6.45],[1.145,-4.822],[-1.315,-1.925],[-4.115,0.266],[-2.713,3.355],[-1.258,5.611],[0.45,7.369]],"o":[[-2.76,-3.466],[-3.068,2.409],[-1.913,5.661],[-0.993,5.271],[-0.598,2.52],[3.583,5.246],[3.562,-0.23],[2.521,-3.118],[1.46,-6.516],[-0.263,-4.306]],"v":[[-1369.166,-48.879],[-1379.81,-50.352],[-1386.633,-40.631],[-1389.315,-26.993],[-1390.771,-16.522],[-1389.461,-6.351],[-1379.145,-0.632],[-1369.422,-4.334],[-1364.206,-15.081],[-1363.645,-33.788]]}],"t":128},{"i":{"x":0.833,"y":0.727},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.258,2.043],[3.295,-1.414],[0.793,-5.669],[0.775,-6.512],[-0.313,-3.285],[-0.318,-2.332],[-3.107,-1.448],[-2.584,3.355],[-1.197,5.611],[0.584,7.369]],"o":[[-2.12,-1.918],[-4.276,1.835],[-1.168,8.344],[-0.387,3.255],[0.246,2.577],[0.746,5.466],[3.107,1.448],[2.401,-3.118],[1.391,-6.516],[-0.341,-4.306]],"v":[[-1363.648,-46.499],[-1372.775,-49.661],[-1378.006,-38.174],[-1379.998,-23.979],[-1381.038,-13.915],[-1382.943,-8.701],[-1372.858,-0.632],[-1366.517,-4.871],[-1361.939,-15.316],[-1359.949,-33.639]]}],"t":143},{"i":{"x":0.833,"y":0.727},"o":{"x":0.167,"y":0.273},"s":[{"c":true,"i":[[2.258,2.043],[3.295,-1.414],[1.15,-5.607],[0.775,-6.512],[-0.313,-3.285],[-0.119,-2.317],[-4.478,0.548],[-2.584,3.355],[-1.197,5.611],[0.584,7.369]],"o":[[-2.12,-1.918],[-4.276,1.835],[-1.472,7.183],[-0.387,3.255],[0.246,2.577],[0.316,6.146],[3.402,-0.417],[2.401,-3.118],[1.391,-6.516],[-0.341,-4.306]],"v":[[-1364.816,-48.399],[-1372.775,-49.661],[-1378.034,-39.369],[-1379.692,-25.121],[-1381.079,-16.342],[-1381.963,-9.447],[-1372.858,-0.632],[-1363.6,-4.334],[-1359.659,-13.99],[-1358.952,-33.157]]}],"t":157},{"i":{"x":0.833,"y":0.727},"o":{"x":0.167,"y":0.273},"s":[{"c":true,"i":[[2.17,0.678],[3.208,0.706],[2.246,0.209],[0.812,-0.232],[-0.273,-0.287],[-0.669,-0.321],[-3.036,-0.789],[-2.536,-0.409],[-1.214,0.071],[0.497,0.615]],"o":[[-2.037,-0.636],[-4.163,-0.916],[-2.432,-0.194],[-0.406,0.116],[0.214,0.225],[1.591,0.781],[3.006,0.793],[2.357,0.38],[1.409,-0.083],[-0.29,-0.36]],"v":[[-1364.787,-25.127],[-1372.491,-27.134],[-1377.035,-27.528],[-1379.609,-27.272],[-1380.159,-26.737],[-1378.809,-25.911],[-1373.032,-23.999],[-1364.022,-21.998],[-1359.135,-21.458],[-1359.941,-22.897]]}],"t":163},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.273},"s":[{"c":true,"i":[[2.258,2.043],[3.295,-1.414],[0.925,-5.649],[0.775,-6.512],[0.605,-3.244],[-0.729,-2.202],[-3.107,-1.448],[-2.584,3.355],[-1.197,5.611],[0.584,7.369]],"o":[[-2.12,-1.918],[-4.276,1.835],[-1.003,6.128],[-0.387,3.255],[-0.681,3.649],[1.733,5.238],[3.107,1.448],[2.401,-3.118],[1.391,-6.516],[-0.341,-4.306]],"v":[[-1364.816,-48.399],[-1372.775,-49.661],[-1377.666,-38.857],[-1379.801,-25.638],[-1381.024,-14.82],[-1381.635,-7.373],[-1372.858,-0.632],[-1363.6,-4.334],[-1358.633,-15.081],[-1358.88,-34.902]]}],"t":168},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.258,2.043],[3.295,-1.414],[1.629,-7.57],[0.775,-6.512],[0.452,-3.269],[0.514,-2.242],[-3.107,-1.448],[-2.584,3.355],[-1.197,5.611],[0.584,7.369]],"o":[[-2.12,-1.918],[-4.276,1.835],[-1.124,5.226],[-0.387,3.255],[-0.461,3.333],[1.733,5.238],[3.107,1.448],[2.401,-3.118],[1.391,-6.516],[-0.341,-4.306]],"v":[[-1364.816,-48.399],[-1372.775,-49.661],[-1377.364,-39.12],[-1380.083,-25.454],[-1381.216,-15.319],[-1382.222,-8.168],[-1372.858,-0.632],[-1363.6,-4.334],[-1358.633,-15.081],[-1359.689,-32.905]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.639,2.281],[3.977,-2.723],[2,-5.363],[0.688,-6.561],[0.254,-2.745],[-1.115,-2.143],[-4.309,-1.208],[-3.327,3.548],[-1.314,5.694],[0.998,7.325]],"o":[[-3.77,-3.259],[-3.84,2.629],[-2.16,5.792],[-0.344,3.28],[-0.335,3.623],[2.653,5.096],[4.309,1.208],[3.091,-3.297],[1.526,-6.613],[-0.583,-4.28]],"v":[[-1360.184,-43.457],[-1374.057,-44.151],[-1379.34,-33.034],[-1382.085,-18.351],[-1383.373,-9.771],[-1381.336,-2.264],[-1370.4,5.442],[-1358.01,1.037],[-1351.856,-10.075],[-1352.181,-28.793]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.643,2.277],[3.973,-2.73],[1.349,-5.563],[0.677,-6.563],[0.449,-3.282],[-1.119,-2.141],[-4.311,-1.201],[-3.321,3.553],[-1.304,5.696],[1.01,7.323]],"o":[[-3.776,-3.252],[-3.835,2.635],[-1.477,6.091],[-0.338,3.28],[-0.408,2.98],[2.661,5.092],[4.311,1.201],[3.086,-3.302],[1.515,-6.615],[-0.59,-4.279]],"v":[[-1361.353,-45.44],[-1375.227,-46.111],[-1380.155,-35.585],[-1382.421,-21.253],[-1383.622,-11.132],[-1382.435,-4.211],[-1371.486,3.476],[-1359.104,-0.95],[-1352.969,-12.072],[-1353.326,-30.789]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[2.258,2.043],[3.295,-1.414],[0.924,-5.649],[0.775,-6.512],[0.039,-3.3],[-0.729,-2.202],[-3.107,-1.448],[-2.583,3.355],[-1.198,5.611],[-0.154,7.391]],"o":[[-2.12,-1.918],[-4.276,1.835],[-1.062,6.496],[-0.387,3.255],[-0.045,3.824],[1.733,5.238],[3.107,1.448],[2.401,-3.118],[1.39,-6.516],[0.11,-5.266]],"v":[[-1359.698,-47.825],[-1367.657,-49.086],[-1373.832,-39.24],[-1376.535,-25.403],[-1377.995,-15.001],[-1377.824,-8.126],[-1367.74,-0.057],[-1358.482,-3.759],[-1353.515,-14.507],[-1354.57,-32.33]]}],"t":312},{"i":{"x":0.833,"y":0.667},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[2.258,2.043],[3.295,-1.414],[0.924,-5.649],[0.775,-6.512],[0.039,-3.3],[-0.729,-2.202],[-3.107,-1.448],[-2.583,3.355],[-1.198,5.611],[-0.154,7.391]],"o":[[-2.12,-1.918],[-4.276,1.835],[-1.062,6.496],[-0.387,3.255],[-0.045,3.824],[1.733,5.238],[3.107,1.448],[2.401,-3.118],[1.39,-6.516],[0.11,-5.266]],"v":[[-1359.698,-47.825],[-1367.657,-49.086],[-1373.832,-39.24],[-1376.535,-25.403],[-1377.995,-15.001],[-1377.824,-8.126],[-1367.74,-0.057],[-1358.482,-3.759],[-1353.515,-14.507],[-1354.57,-32.33]]}],"t":400},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.333},"s":[{"c":true,"i":[[2.443,0.793],[3.91,1.017],[2.112,0.459],[0.892,0.062],[-0.466,-0.238],[-0.987,-0.358],[-4.066,-1.24],[-3.3,-0.867],[-1.458,-0.255],[0.691,0.43]],"o":[[-3.469,-1.126],[-2.393,-0.623],[-2.281,-0.496],[-0.446,-0.031],[0.365,0.187],[2.346,0.851],[4.066,1.24],[3.066,0.805],[1.693,0.297],[-0.404,-0.251]],"v":[[-1362.337,-20.608],[-1371.733,-23.365],[-1373.515,-23.726],[-1376.329,-24.011],[-1375.914,-23.548],[-1373.794,-22.702],[-1373.81,-22.493],[-1361.836,-19.088],[-1355.568,-17.577],[-1355.235,-18.055]]}],"t":404},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.513,1.773],[2.825,-0.513],[0.676,-2.891],[0.355,-2.866],[-0.111,-2.19],[-0.537,-1.65],[-4.15,-1.302],[-3.346,1.873],[-1.458,3.497],[0.745,4.827]],"o":[[-3.537,-2.49],[-1.389,1.872],[-0.657,2.812],[-0.254,2.051],[0.071,2.277],[1.261,3.778],[4.15,1.302],[3.109,-1.74],[1.693,-4.061],[-0.435,-2.821]],"v":[[-1362.17,-36.453],[-1372.886,-38.918],[-1375.518,-30.41],[-1376.874,-21.854],[-1377.343,-15.671],[-1376.758,-10.717],[-1373.583,-6.305],[-1361.4,-7.622],[-1355.066,-14.008],[-1354.863,-26.039]]}],"t":406},{"i":{"x":0.833,"y":0.833},"o":{"x":0.5,"y":1},"s":[{"c":true,"i":[[2.553,2.336],[2.203,-1.391],[1.24,-5.878],[0.704,-5.457],[0.093,-3.31],[-0.279,-2.392],[-4.198,-1.338],[-3.373,3.446],[-1.458,5.651],[0.775,7.351]],"o":[[-3.576,-3.272],[-0.813,3.304],[-1.276,6.049],[-0.422,3.269],[-0.098,3.476],[0.638,5.458],[4.198,1.338],[3.134,-3.201],[1.693,-6.563],[-0.453,-4.296]],"v":[[-1362.074,-45.548],[-1371.572,-47.779],[-1374.78,-33.802],[-1377.187,-20.616],[-1378.164,-11.149],[-1378.459,-3.837],[-1373.452,2.987],[-1361.15,-1.041],[-1354.777,-11.96],[-1354.65,-30.623]]}],"t":407},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.572,2.354],[2.371,-1.506],[1.304,-5.593],[1.36,-6.64],[0.408,-3.842],[-0.013,-2.407],[-4.268,-1.331],[-3.423,3.451],[-1.475,5.654],[0.788,7.35]],"o":[[-3.669,-3.359],[-0.992,0.867],[-1.138,4.889],[-0.658,3.23],[-0.364,3.428],[0.03,5.597],[4.268,1.331],[3.181,-3.207],[1.713,-6.566],[-0.46,-4.295]],"v":[[-1362.225,-45.403],[-1373.148,-47.26],[-1375.906,-35.918],[-1378.459,-22.122],[-1379.733,-11.334],[-1379.98,-4.36],[-1373.817,3.182],[-1361.32,-0.867],[-1354.858,-11.798],[-1354.655,-30.514]]}],"t":415},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.573,2.356],[4.051,-2.612],[1.309,-5.573],[1.406,-6.724],[0.648,-3.851],[-1.054,-2.174],[-4.273,-1.33],[-3.427,3.452],[-1.476,5.654],[0.788,7.35]],"o":[[-3.676,-3.365],[-2.628,1.694],[-1.129,4.807],[-0.675,3.228],[-0.431,2.563],[2.506,5.17],[4.273,1.33],[3.184,-3.207],[1.714,-6.566],[-0.461,-4.295]],"v":[[-1362.236,-45.393],[-1376.084,-46.482],[-1380.847,-36.517],[-1383.848,-22.044],[-1385.258,-11.434],[-1384.554,-4.819],[-1373.842,3.195],[-1361.332,-0.855],[-1354.864,-11.786],[-1354.655,-30.506]]}],"t":420},{"s":[{"c":true,"i":[[3.836,2.426],[6.311,-2.495],[3.518,-5.242],[1.616,-6.512],[-0.654,-3.285],[-1.52,-2.202],[-6.479,-1.448],[-5.388,3.355],[-2.497,5.611],[0.894,7.369]],"o":[[-5.48,-3.466],[-6.092,2.409],[-3.799,5.661],[-0.807,3.255],[0.513,2.577],[3.614,5.238],[6.479,1.448],[5.007,-3.118],[2.9,-6.516],[-0.522,-4.306]],"v":[[-1344.228,-47.153],[-1365.365,-48.626],[-1378.915,-38.905],[-1384.241,-25.266],[-1383.285,-14.435],[-1380.09,-7.214],[-1364.044,1.094],[-1344.736,-2.607],[-1334.377,-13.355],[-1333.264,-32.062]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[1,1,1,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-1371.872,-21.895]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1371.872,-21.895]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[145,145]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":11,"mn":"ADBE Vector Group","nm":"Back eye ","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.504,2.82],[1.357,-5.179],[5.023,-22.061],[12.439,-18.899],[21.977,-5.377],[8.311,-0.28],[21.013,2.818],[-18.796,-3.705],[-36.855,6.146],[-8.057,9.03],[-1.601,11.361],[0.016,46.36]],"o":[[-3.6,3.963],[-5.734,21.887],[-5.023,22.061],[-12.439,18.899],[-8.077,1.976],[-21.189,0.715],[0,0],[36.658,7.227],[11.937,-1.991],[7.638,-8.561],[6.469,-45.906],[-0.001,-3.771]],"v":[[-1189.616,-140.561],[-1196.176,-126.077],[-1210.157,-59.666],[-1232.685,10.82],[-1287.483,43.235],[-1312.224,46.052],[-1375.675,42.889],[-1352.25,54.133],[-1240.566,55.083],[-1208.001,40.731],[-1196.651,8.792],[-1186.956,-129.835]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.986,2.766],[0.89,-5.206],[3.215,-22.159],[8.952,-19.155],[21.82,-5.984],[8.3,-0.511],[21.083,2.234],[-18.891,-3.183],[-33.08,4.316],[-5.887,9.196],[-0.905,11.39],[1.298,46.342]],"o":[[-2.632,4.038],[-3.761,22],[-3.215,22.159],[-8.952,19.155],[-8.02,2.199],[-21.161,1.302],[0,0],[36.844,6.207],[12,-1.566],[5.582,-8.719],[3.655,-46.025],[-0.106,-3.769]],"v":[[-1196.612,-141.705],[-1201.208,-127.088],[-1210.016,-60.407],[-1225.223,10.528],[-1276.118,44.368],[-1300.771,47.87],[-1364.286,46.468],[-1339.808,55.996],[-1228.894,53.767],[-1203.554,40.766],[-1197.829,7.739],[-1194.288,-131.039]]}],"t":26},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.908,2.82],[1.034,-5.179],[3.828,-22.061],[9.48,-18.899],[21.977,-5.377],[8.311,-0.28],[21.013,2.818],[-18.796,-3.705],[-33.187,3.397],[-6.14,9.03],[-1.22,11.361],[0.012,46.36]],"o":[[-2.743,3.963],[-4.37,21.887],[-3.828,22.061],[-9.48,18.899],[-8.077,1.976],[-21.189,0.715],[0,0],[36.658,7.227],[12.039,-1.232],[5.821,-8.561],[4.93,-45.906],[-0.001,-3.771]],"v":[[-1202.846,-140.561],[-1207.845,-126.077],[-1218.5,-59.666],[-1235.669,10.82],[-1287.483,43.235],[-1312.224,46.052],[-1375.675,42.889],[-1350.856,53.741],[-1240.538,53.94],[-1214.373,42.313],[-1208.208,8.792],[-1200.819,-129.835]]}],"t":128},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[1.908,2.82],[1.034,-5.179],[3.828,-22.061],[9.48,-18.899],[21.977,-5.377],[8.311,-0.28],[21.013,2.818],[-18.796,-3.705],[-36.855,6.146],[-6.14,9.03],[-1.22,11.361],[0.012,46.36]],"o":[[-2.743,3.963],[-4.37,21.887],[-3.828,22.061],[-9.48,18.899],[-8.077,1.976],[-21.189,0.715],[0,0],[36.658,7.227],[11.937,-1.991],[5.821,-8.561],[4.93,-45.906],[-0.001,-3.771]],"v":[[-1202.846,-140.561],[-1207.845,-126.077],[-1218.5,-59.666],[-1235.669,10.82],[-1287.483,43.235],[-1312.224,46.052],[-1375.675,42.889],[-1352.25,54.133],[-1239.642,53.98],[-1214.301,41.661],[-1208.208,8.792],[-1200.819,-129.835]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.064,2.708],[0.741,-5.229],[2.581,-22.241],[8.402,-19.403],[21.64,-6.605],[8.282,-0.747],[21.139,1.632],[-19.066,-1.872],[-36.451,8.209],[-5.623,9.361],[-0.579,11.411],[2.62,46.286]],"o":[[-2.516,4.111],[-3.131,22.098],[-2.581,22.241],[-8.402,19.403],[-7.953,2.427],[-21.115,1.905],[0,0],[37.782,3.709],[11.806,-2.659],[5.331,-8.875],[2.341,-46.111],[-0.213,-3.765]],"v":[[-1197.375,-144.455],[-1201.552,-129.713],[-1208.455,-62.808],[-1221.631,8.532],[-1271.54,43.81],[-1296.084,48.014],[-1359.612,48.424],[-1335.031,57.202],[-1222.662,50.692],[-1199.077,38.574],[-1194.328,4.962],[-1194.748,-133.86]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.068,2.705],[0.732,-5.231],[2.544,-22.246],[8.369,-19.417],[21.629,-6.641],[8.281,-0.761],[21.141,1.597],[-19.072,-1.81],[-36.89,5.106],[-5.607,9.37],[-0.56,11.412],[2.698,46.281]],"o":[[-2.509,4.116],[-3.095,22.103],[-2.544,22.246],[-8.369,19.417],[-7.949,2.441],[-21.112,1.941],[0,0],[38.917,3.693],[11.987,-1.659],[5.316,-8.884],[2.263,-46.115],[-0.219,-3.765]],"v":[[-1198.713,-146.711],[-1202.865,-131.962],[-1209.656,-65.046],[-1222.713,6.316],[-1272.562,41.678],[-1297.099,45.923],[-1360.627,46.44],[-1336.701,55.354],[-1225.149,49.833],[-1200.054,36.476],[-1195.416,2.701],[-1196.068,-136.121]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[1.908,2.82],[1.034,-5.179],[3.828,-22.061],[9.48,-18.899],[21.978,-5.377],[8.311,-0.28],[21.013,2.818],[-18.796,-3.705],[-36.855,6.146],[-6.14,9.03],[-1.22,11.361],[0.012,46.36]],"o":[[-2.743,3.963],[-4.369,21.887],[-3.828,22.061],[-9.48,18.899],[-8.077,1.976],[-21.189,0.715],[0,0],[36.658,7.227],[11.937,-1.991],[5.821,-8.561],[4.93,-45.906],[-0.001,-3.771]],"v":[[-1197.728,-139.986],[-1202.727,-125.502],[-1213.382,-59.091],[-1230.55,11.395],[-1282.364,43.81],[-1307.105,46.627],[-1370.556,43.463],[-1347.132,54.708],[-1235.448,55.658],[-1209.728,42.608],[-1203.089,9.366],[-1195.7,-129.26]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[1.908,2.82],[1.034,-5.179],[3.828,-22.061],[9.48,-18.899],[21.978,-5.377],[8.311,-0.28],[21.013,2.818],[-18.796,-3.705],[-36.855,6.146],[-6.14,9.03],[-1.22,11.361],[0.012,46.36]],"o":[[-2.743,3.963],[-4.369,21.887],[-3.828,22.061],[-9.48,18.899],[-8.077,1.976],[-21.189,0.715],[0,0],[36.658,7.227],[11.937,-1.991],[5.821,-8.561],[4.93,-45.906],[-0.001,-3.771]],"v":[[-1197.728,-139.986],[-1202.727,-125.502],[-1213.382,-59.091],[-1230.55,11.395],[-1282.364,43.81],[-1307.105,46.627],[-1370.556,43.463],[-1347.132,54.708],[-1235.448,55.658],[-1209.728,42.608],[-1203.089,9.366],[-1195.7,-129.26]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.986,2.766],[0.89,-5.206],[3.215,-22.159],[8.952,-19.155],[21.82,-5.984],[8.3,-0.511],[21.083,2.234],[-18.891,-3.183],[-33.08,4.316],[-5.887,9.196],[-0.905,11.39],[1.298,46.342]],"o":[[-2.632,4.038],[-3.761,22],[-3.215,22.159],[-8.952,19.155],[-8.02,2.199],[-21.161,1.302],[0,0],[36.844,6.207],[12,-1.566],[5.582,-8.719],[3.655,-46.025],[-0.106,-3.769]],"v":[[-1196.612,-141.705],[-1201.208,-127.088],[-1210.016,-60.407],[-1225.223,10.528],[-1276.118,44.368],[-1300.771,47.87],[-1364.286,46.468],[-1339.808,55.996],[-1228.894,53.767],[-1203.24,40.525],[-1197.829,7.739],[-1194.288,-131.039]]}],"t":420},{"s":[{"c":true,"i":[[2.504,2.82],[1.357,-5.179],[5.023,-22.061],[12.439,-18.899],[21.977,-5.377],[8.311,-0.28],[21.013,2.818],[-18.796,-3.705],[-36.855,6.146],[-8.057,9.03],[-1.601,11.361],[0.016,46.36]],"o":[[-3.6,3.963],[-5.734,21.887],[-5.023,22.061],[-12.439,18.899],[-8.077,1.976],[-21.189,0.715],[0,0],[36.658,7.227],[11.937,-1.991],[7.638,-8.561],[6.469,-45.906],[-0.001,-3.771]],"v":[[-1189.616,-140.561],[-1196.176,-126.077],[-1210.157,-59.666],[-1232.685,10.82],[-1287.483,43.235],[-1312.224,46.052],[-1375.675,42.889],[-1352.25,54.133],[-1240.566,55.083],[-1208.001,40.731],[-1196.651,8.792],[-1186.956,-129.835]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.964705884457,0.549019634724,0.129411771894,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":12,"mn":"ADBE Vector Group","nm":"Head shadow","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-25.907,60.866],[-7.491,12.485],[-2.809,-1.873],[-2.243,-9.177],[0.936,-15.607],[-15.607,0.312],[-9.988,-2.497],[-0.936,-0.312],[-5.931,4.682],[-3.746,-1.249],[2.185,-33.086],[1.249,-4.37],[-0.624,-2.497],[3.746,-11.861],[38.08,-4.682],[29.029,23.098]],"o":[[0,0],[7.491,-12.485],[2.809,1.873],[2.297,9.397],[0,0],[15.607,-0.312],[9.988,2.497],[0.936,0.312],[5.931,-4.682],[3.746,1.249],[-2.185,33.086],[-1.249,4.37],[0.624,2.497],[-3.746,11.861],[-38.08,4.682],[-29.029,-23.098]],"v":[[-1374.467,-97.702],[-1360.421,-143.274],[-1348.56,-158.569],[-1339.508,-138.28],[-1333.89,-107.066],[-1302.364,-104.569],[-1237.128,-100.511],[-1233.694,-99.575],[-1216.839,-122.049],[-1194.365,-145.147],[-1186.25,-112.685],[-1187.498,-65.552],[-1188.123,-51.818],[-1198.735,23.094],[-1243.37,54.308],[-1380.398,42.134]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-24.209,61.562],[-7.142,12.688],[-2.86,-1.794],[-1.508,-9.326],[0.503,-15.627],[-13.17,0.678],[-8.504,-2.262],[-0.799,-0.29],[-5.114,5.562],[-2.888,-1.169],[0.747,-33.12],[0.83,-4.395],[-0.545,-2.483],[2.524,-11.936],[37.936,-5.736],[30.711,18.46]],"o":[[0,0],[7.142,-12.688],[2.86,1.794],[1.508,9.326],[0,0],[13.17,-0.678],[8.504,2.262],[0.799,0.29],[6.153,-6.692],[2.888,1.169],[-0.747,33.12],[-0.83,4.395],[0.545,2.483],[-2.524,11.936],[-37.936,5.736],[-31.795,-19.111]],"v":[[-1366.978,-94.103],[-1354.201,-140.046],[-1342.769,-155.664],[-1337.925,-138.789],[-1335.931,-105.136],[-1311.092,-102.931],[-1255.894,-100.403],[-1252.969,-99.548],[-1228.276,-128.297],[-1204.829,-150.127],[-1193.274,-113.911],[-1192.918,-66.77],[-1193.012,-53.028],[-1199.02,22.08],[-1231.716,54.213],[-1375.234,45.216]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-25.907,60.866],[-7.491,12.485],[-2.809,-1.873],[-1.249,-9.364],[0.936,-15.607],[-13.183,0.312],[-8.437,-2.497],[-0.791,-0.312],[-5.266,5.418],[-2.855,-1.249],[1.665,-33.086],[0.951,-4.37],[-0.476,-2.497],[2.854,-11.861],[38.08,-4.682],[30.187,19.304]],"o":[[0,0],[7.491,-12.485],[2.809,1.873],[1.249,9.364],[0,0],[13.183,-0.312],[8.437,2.497],[0.791,0.312],[6.336,-6.519],[2.855,1.249],[-1.665,33.086],[-0.951,4.37],[0.476,2.497],[-2.854,11.861],[-38.08,4.682],[-31.253,-19.986]],"v":[[-1374.467,-97.702],[-1360.421,-143.274],[-1348.56,-158.569],[-1344.186,-141.566],[-1343.126,-107.87],[-1318.357,-104.977],[-1263.251,-100.919],[-1260.351,-99.983],[-1234.87,-128.037],[-1210.826,-149.207],[-1200.281,-112.685],[-1201.232,-65.552],[-1201.708,-51.818],[-1209.796,23.094],[-1243.37,54.308],[-1386.584,41.334]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-19.009,60.866],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-5.266,5.418],[-2.855,-1.249],[1.665,-33.086],[0.951,-4.37],[-0.476,-2.497],[2.854,-11.861],[38.08,-4.682],[22.15,19.304]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.336,-6.519],[2.855,1.249],[-1.665,33.086],[-0.951,4.37],[0.476,2.497],[-2.854,11.861],[-38.08,4.682],[-22.932,-19.986]],"v":[[-1365.844,-97.702],[-1355.537,-143.274],[-1346.834,-158.569],[-1337.713,-142.26],[-1330.742,-107.131],[-1312.745,-104.977],[-1262.506,-100.919],[-1260.351,-99.983],[-1234.87,-128.037],[-1210.826,-149.207],[-1200.281,-112.685],[-1201.232,-65.552],[-1201.708,-51.818],[-1209.796,23.094],[-1243.37,54.308],[-1374.734,41.334]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-19.009,60.866],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-5.266,5.418],[-2.855,-1.249],[1.665,-33.086],[0.951,-4.37],[-0.476,-2.497],[2.854,-11.861],[38.08,-4.682],[22.15,19.304]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.336,-6.519],[2.855,1.249],[-1.665,33.086],[-0.951,4.37],[0.476,2.497],[-2.854,11.861],[-38.08,4.682],[-22.932,-19.986]],"v":[[-1365.844,-97.702],[-1355.537,-143.274],[-1346.834,-158.569],[-1337.713,-142.26],[-1330.742,-107.131],[-1312.745,-104.977],[-1262.506,-100.919],[-1260.351,-99.983],[-1234.87,-128.037],[-1210.826,-149.207],[-1200.281,-112.685],[-1201.232,-65.552],[-1201.708,-51.818],[-1209.796,23.094],[-1243.37,54.308],[-1374.734,41.334]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-22.443,62.227],[-6.777,12.887],[-2.91,-1.712],[-1.773,-9.279],[0.057,-15.635],[-13.145,1.053],[-8.565,-2.019],[-0.807,-0.267],[-4.953,5.706],[-2.92,-1.086],[-0.198,-33.128],[0.704,-4.416],[-0.615,-2.466],[2.183,-12.003],[37.757,-6.816],[31.225,17.576]],"o":[[0,0],[6.777,-12.887],[2.91,1.712],[1.773,9.279],[0,0],[13.145,-1.053],[8.565,2.019],[0.807,0.267],[5.96,-6.865],[2.92,1.086],[0.198,33.128],[-0.704,4.416],[0.615,2.466],[-2.183,12.003],[-37.757,6.816],[-32.327,-18.197]],"v":[[-1366.314,-92.012],[-1354.853,-138.302],[-1343.871,-154.239],[-1338.548,-137.509],[-1335.594,-103.926],[-1310.702,-102.431],[-1255.455,-101.479],[-1252.506,-100.707],[-1228.643,-130.15],[-1205.829,-152.639],[-1193.246,-116.768],[-1191.545,-69.656],[-1191.247,-55.917],[-1195.109,19.331],[-1226.875,52.384],[-1370.591,47.486]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-22.338,62.265],[-6.755,12.898],[-2.913,-1.707],[-1.789,-9.276],[0.031,-15.635],[-13.143,1.075],[-8.568,-2.004],[-0.808,-0.266],[-4.944,5.714],[-2.922,-1.081],[-0.254,-33.127],[0.697,-4.418],[-0.62,-2.465],[2.163,-12.007],[37.745,-6.88],[31.254,17.523]],"o":[[0,0],[6.755,-12.898],[2.913,1.707],[1.789,9.276],[0,0],[13.143,-1.075],[8.568,2.004],[0.808,0.266],[5.948,-6.875],[2.922,1.081],[0.254,33.127],[-0.697,4.418],[0.62,2.465],[-2.163,12.007],[-37.745,6.88],[-32.358,-18.142]],"v":[[-1367.564,-93.985],[-1356.181,-140.294],[-1345.226,-156.25],[-1337.683,-138.48],[-1332.763,-105.124],[-1311.97,-104.497],[-1256.721,-103.638],[-1253.771,-102.871],[-1229.958,-132.354],[-1207.181,-154.881],[-1194.538,-119.031],[-1192.758,-71.922],[-1192.437,-58.184],[-1196.172,17.071],[-1227.883,50.177],[-1371.607,45.52]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[-19.009,60.866],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-5.267,5.418],[-2.855,-1.249],[1.665,-33.086],[0.951,-4.37],[-0.476,-2.497],[2.854,-11.861],[38.08,-4.682],[22.15,19.304]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.336,-6.519],[2.854,1.249],[-1.665,33.086],[-0.951,4.37],[0.476,2.497],[-2.854,11.861],[-38.081,4.682],[-22.932,-19.986]],"v":[[-1360.725,-97.127],[-1350.419,-142.699],[-1341.716,-157.994],[-1332.594,-141.685],[-1325.624,-106.556],[-1307.626,-104.402],[-1251.518,-98.38],[-1249.363,-97.444],[-1229.751,-127.462],[-1205.708,-148.632],[-1195.162,-112.11],[-1196.114,-64.978],[-1196.589,-51.244],[-1204.677,23.669],[-1238.252,54.882],[-1369.615,41.909]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[-19.009,60.866],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-5.267,5.418],[-2.855,-1.249],[1.665,-33.086],[0.951,-4.37],[-0.476,-2.497],[2.854,-11.861],[38.08,-4.682],[22.15,19.304]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.336,-6.519],[2.854,1.249],[-1.665,33.086],[-0.951,4.37],[0.476,2.497],[-2.854,11.861],[-38.081,4.682],[-22.932,-19.986]],"v":[[-1360.725,-97.127],[-1350.419,-142.699],[-1341.716,-157.994],[-1332.594,-141.685],[-1325.624,-106.556],[-1307.626,-104.402],[-1251.518,-98.38],[-1249.363,-97.444],[-1229.751,-127.462],[-1205.708,-148.632],[-1195.162,-112.11],[-1196.114,-64.978],[-1196.589,-51.244],[-1204.677,23.669],[-1238.252,54.882],[-1369.615,41.909]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-24.209,61.562],[-7.142,12.688],[-2.86,-1.794],[-2.173,-9.194],[0.503,-15.627],[-13.17,0.678],[-8.504,-2.262],[-0.799,-0.29],[-6.127,9.197],[-3.807,-2.701],[0.747,-33.12],[0.83,-4.395],[-0.545,-2.483],[2.524,-11.936],[37.936,-5.736],[30.711,18.46]],"o":[[0,0],[7.142,-12.688],[2.86,1.794],[2.173,9.194],[0,0],[13.17,-0.678],[8.504,2.262],[0.799,0.29],[5.041,-7.566],[2.541,1.803],[-0.747,33.12],[-0.83,4.395],[0.545,2.483],[-2.524,11.936],[-37.936,5.736],[-31.795,-19.111]],"v":[[-1366.978,-94.103],[-1354.201,-140.046],[-1342.769,-155.664],[-1334.299,-137.905],[-1329.03,-103.629],[-1311.092,-102.931],[-1251.081,-99.616],[-1248.155,-98.76],[-1227.228,-127.616],[-1204.829,-150.127],[-1193.274,-113.911],[-1192.918,-66.77],[-1193.012,-53.028],[-1199.02,22.08],[-1231.716,54.213],[-1375.234,45.216]]}],"t":420},{"s":[{"c":true,"i":[[-25.907,60.866],[-7.491,12.485],[-2.809,-1.873],[-2.955,-8.973],[-1.346,-14.959],[-15.607,0.312],[-9.988,-2.497],[-0.936,-0.312],[-5.931,4.682],[-3.746,-1.249],[2.185,-33.086],[1.249,-4.37],[-0.624,-2.497],[3.746,-11.861],[38.08,-4.682],[29.029,23.098]],"o":[[0,0],[7.491,-12.485],[2.809,1.873],[2.861,8.687],[0,0],[15.607,-0.312],[9.988,2.497],[0.936,0.312],[5.931,-4.682],[3.746,1.249],[-2.185,33.086],[-1.249,4.37],[0.624,2.497],[-3.746,11.861],[-38.08,4.682],[-29.029,-23.098]],"v":[[-1374.467,-97.702],[-1360.421,-143.274],[-1348.56,-158.569],[-1339.508,-138.28],[-1331.415,-106.992],[-1302.364,-104.569],[-1237.128,-100.511],[-1233.694,-99.575],[-1216.839,-122.049],[-1194.365,-145.147],[-1186.25,-112.685],[-1187.498,-65.552],[-1188.123,-51.818],[-1198.735,23.094],[-1243.37,54.308],[-1380.398,42.134]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":13,"mn":"ADBE Vector Group","nm":"Head fill","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-0.227,-2.778],[-1.353,-0.367],[-6.471,-0.544],[-9.867,-0.295],[-27.649,6.141],[-0.11,0.604],[0.126,4.4],[23.479,-1.053],[22.589,6.489]],"o":[[-0.46,2.749],[0.276,3.372],[6.944,1.884],[9.96,0.837],[28.31,0.848],[0.53,-0.118],[0.79,-4.331],[-23.364,2.552],[-23.479,1.053],[0,0]],"v":[[-1363.494,52.882],[-1363.618,60.993],[-1360.808,65.864],[-1340.115,69.258],[-1311.792,71.49],[-1227.493,66.408],[-1225.32,64.112],[-1224.321,50.967],[-1294.474,57.901],[-1364.349,51.193]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372618675,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":14,"mn":"ADBE Vector Group","nm":"Helmet collar","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[23.023,-3.817],[33.186,-39.093],[-12.733,-48.658],[-9.231,-8.019],[0,0],[-44.404,6.65],[-17.923,25.701],[-7.441,17.862],[7.154,26.212],[82.928,18.735]],"o":[[-49.619,8.226],[-26.764,31.528],[8.177,31.247],[23.191,20.147],[44.717,4.039],[13.81,-2.068],[11.068,-15.872],[10.449,-25.081],[-4.744,-17.383],[-22.763,-5.143]],"v":[[-1304.764,-207.839],[-1414.922,-146.333],[-1438.469,-15.523],[-1407.347,36.657],[-1363.455,64.003],[-1228.244,63.996],[-1159.167,21.376],[-1131.354,-31.799],[-1131.22,-103.357],[-1246.445,-202.29]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.243137255311,0.65098041296,1,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":15,"mn":"ADBE Vector Group","nm":"Helmet fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-1280.449,-66.313]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1280.449,-66.313]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Head and Helmet","np":15,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":25,"ip":45,"ks":{"a":{"a":0,"ix":1,"k":[-365,-428,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.77],"y":[0.604]},"o":{"x":[0.291],"y":[0.2]},"s":[179],"t":45},{"i":{"x":[0.674],"y":[0.494]},"o":{"x":[0.436],"y":[0.467]},"s":[372],"t":190.139},{"i":{"x":[0.754],"y":[0.922]},"o":{"x":[0.106],"y":[0.184]},"s":[663],"t":326},{"s":[925],"t":462}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.677],"y":[0.967]},"o":{"x":[0.304],"y":[0.004]},"s":[193],"t":45},{"i":{"x":[0.307],"y":[0.87]},"o":{"x":[0.59],"y":[-0.043]},"s":[219],"t":190.139},{"i":{"x":[0.579],"y":[1.231]},"o":{"x":[0.211],"y":[-1.351]},"s":[185],"t":326},{"s":[186],"t":462}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.247],"y":[1.161]},"o":{"x":[0.167],"y":[0.167]},"s":[-9],"t":45},{"i":{"x":[0.712],"y":[0.509]},"o":{"x":[0.488],"y":[0.067]},"s":[2],"t":133},{"i":{"x":[0.459],"y":[1.036]},"o":{"x":[0.207],"y":[0.301]},"s":[-14.225],"t":216},{"i":{"x":[0.384],"y":[0.716]},"o":{"x":[0.499],"y":[0.027]},"s":[-23.61],"t":257},{"i":{"x":[0.713],"y":[0.925]},"o":{"x":[0.305],"y":[0.876]},"s":[-12],"t":298},{"s":[-9],"t":364}]},"s":{"a":0,"ix":6,"k":[-21,21,100]}},"nm":"striped fish 3","op":480,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.644,1.367],[-1.367,-2.644],[2.644,-1.367],[1.367,2.644]],"o":[[2.644,-1.367],[1.367,2.644],[-2.644,1.367],[-1.367,-2.644]],"v":[[-278.01,-464.082],[-270.748,-461.771],[-273.06,-454.508],[-280.322,-456.82]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 18","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":186.213},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":197.193},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":208.18},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":219.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":230.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":241.125},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":252.107},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":303.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":316.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":329.578},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":376.518},{"s":[0],"t":385.373046875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"dots 18","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.397,1.24],[-1.24,-2.397],[2.397,-1.24],[1.24,2.397]],"o":[[2.397,-1.24],[1.24,2.397],[-2.397,1.24],[-1.24,-2.397]],"v":[[-271.779,-452.636],[-265.195,-450.54],[-267.29,-443.955],[-273.875,-446.051]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 12","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":199.391},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":212.207},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.016},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":237.832},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":250.646},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":263.455},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":276.27},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":303.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":316.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":329.578},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":376.518},{"s":[0],"t":385.373046875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"dots 12","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.637,1.363],[-1.363,-2.637],[2.637,-1.363],[1.363,2.637]],"o":[[2.637,-1.363],[1.363,2.637],[-2.637,1.363],[-1.363,-2.637]],"v":[[-269.885,-474.475],[-262.643,-472.169],[-264.948,-464.927],[-272.19,-467.232]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 17","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":186.213},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":197.928},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":209.643},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":221.357},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":233.072},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":244.783},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":256.5},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":314.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":327.008},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":339.861},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":374.746},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":383.602},{"s":[0],"t":392.458984375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"dots 17","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.41,1.246],[-1.246,-2.41],[2.41,-1.246],[1.246,2.41]],"o":[[2.41,-1.246],[1.246,2.41],[-2.41,1.246],[-1.246,-2.41]],"v":[[-258.674,-446.065],[-252.052,-443.958],[-254.16,-437.336],[-260.781,-439.444]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 11","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.193},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208.18},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":233.438},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":247.715},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":261.992},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":276.27},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":314.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":327.008},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":339.861},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":374.746},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":383.602},{"s":[0],"t":392.458984375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"dots 11","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.805,1.451],[-1.451,-2.805],[2.805,-1.451],[1.451,2.805]],"o":[[2.805,-1.451],[1.451,2.805],[-2.805,1.451],[-1.451,-2.805]],"v":[[-262.366,-484.789],[-254.66,-482.337],[-257.113,-474.63],[-264.819,-477.083]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 16","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190.605},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":204.336},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":218.062},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":231.791},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":245.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":256.5},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":267.484},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":319.299},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.152},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":345},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":378.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":387.143},{"s":[0],"t":396}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"dots 16","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.784,1.44],[-1.44,-2.784],[2.784,-1.44],[1.44,2.784]],"o":[[2.784,-1.44],[1.44,2.784],[-2.784,1.44],[-1.44,-2.784]],"v":[[-242.346,-444.75],[-234.699,-442.316],[-237.133,-434.67],[-244.78,-437.103]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 10","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":203.785},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":211.838},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.895},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":227.945},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":244.783},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":261.627},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":278.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":319.299},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.152},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":345},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":378.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":387.143},{"s":[0],"t":396}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"dots 10","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.607,1.348],[-1.348,-2.607],[2.607,-1.348],[1.348,2.607]],"o":[[2.607,-1.348],[1.348,2.607],[-2.607,1.348],[-1.348,-2.607]],"v":[[-331.273,-454.413],[-324.112,-452.133],[-326.391,-444.972],[-333.552,-447.252]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 15","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":192.803},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":203.785},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.768},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":225.748},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":255.922},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":272.689},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":300},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":303.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":316.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":329.578},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":376.518},{"s":[0],"t":385.373046875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"dots 15","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.896,1.497],[-1.497,-2.896],[2.896,-1.497],[1.497,2.896]],"o":[[2.896,-1.497],[1.497,2.896],[-2.896,1.497],[-1.497,-2.896]],"v":[[-329.246,-442.538],[-321.292,-440.007],[-323.824,-432.052],[-331.778,-434.584]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 9","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":188.41},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":202.322},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":223.555},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":233.375},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":241.125},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":252.107},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":271.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":303.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":316.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":329.578},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":376.518},{"s":[0],"t":385.373046875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"dots 9","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.823,1.46],[-1.46,-2.823],[2.823,-1.46],[1.46,2.823]],"o":[[2.823,-1.46],[1.46,2.823],[-2.823,1.46],[-1.46,-2.823]],"v":[[-322.06,-463.812],[-314.305,-461.344],[-316.773,-453.589],[-324.528,-456.057]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 14","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":208.18},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":217.691},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":227.217},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":236.734},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":246.246},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":255.771},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":265.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":311.586},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":324.439},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":337.291},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":372.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":381.83},{"s":[0],"t":390.6875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":9,"mn":"ADBE Vector Group","nm":"dots 14","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.459,1.271],[-1.271,-2.459],[2.459,-1.271],[1.271,2.459]],"o":[[2.459,-1.271],[1.271,2.459],[-2.459,1.271],[-1.271,-2.459]],"v":[[-317.719,-435.153],[-310.965,-433.003],[-313.114,-426.249],[-319.868,-428.399]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 8","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.193},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":204.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":211.838},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":219.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":230.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":241.125},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":252.107},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":311.586},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":324.439},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":337.291},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":372.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":381.83},{"s":[0],"t":390.6875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":10,"mn":"ADBE Vector Group","nm":"dots 8","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.93,1.515],[-1.515,-2.93],[2.93,-1.515],[1.515,2.93]],"o":[[2.93,-1.515],[1.515,2.93],[-2.93,1.515],[-1.515,-2.93]],"v":[[-312.483,-475.015],[-304.435,-472.453],[-306.996,-464.405],[-315.045,-466.966]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 13","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":192.803},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":207.08},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":221.357},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":235.635},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":249.912},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":264.189},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":278.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":319.299},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.152},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":345},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":378.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":387.143},{"s":[0],"t":396}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":11,"mn":"ADBE Vector Group","nm":"dots 13","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.807,1.452],[-1.452,-2.807],[2.807,-1.452],[1.452,2.807]],"o":[[2.807,-1.452],[1.452,2.807],[-2.807,1.452],[-1.452,-2.807]],"v":[[-306.368,-430.793],[-298.656,-428.339],[-301.111,-420.626],[-308.823,-423.081]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 7","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.193},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":207.809},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":218.432},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":229.043},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":242.59},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":256.135},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":269.682},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":319.299},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.152},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":345},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":378.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":387.143},{"s":[0],"t":396}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":12,"mn":"ADBE Vector Group","nm":"dots 7","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.748,1.421],[-1.421,-2.748],[2.748,-1.421],[1.421,2.748]],"o":[[2.748,-1.421],[1.421,2.748],[-2.748,1.421],[-1.421,-2.748]],"v":[[-383.108,-444.271],[-375.559,-441.868],[-377.962,-434.319],[-385.511,-436.722]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190.605},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":204.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":218.426},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":232.34},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":246.252},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":260.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":274.072},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":303.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":316.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":329.578},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":376.518},{"s":[0],"t":385.373046875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":13,"mn":"ADBE Vector Group","nm":"dots 5","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.766,1.43],[-1.43,-2.766],[2.766,-1.43],[1.43,2.766]],"o":[[2.766,-1.43],[1.43,2.766],[-2.766,1.43],[-1.43,-2.766]],"v":[[-384.125,-430.303],[-376.527,-427.885],[-378.945,-420.287],[-386.543,-422.705]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 6","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":199.391},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208.912},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":218.426},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":227.945},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":253.57},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":269.682},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":303.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":316.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":329.578},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":376.518},{"s":[0],"t":385.373046875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":14,"mn":"ADBE Vector Group","nm":"dots 6","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.6,1.345],[-1.345,-2.6],[2.6,-1.345],[1.345,2.6]],"o":[[2.6,-1.345],[1.345,2.6],[-2.6,1.345],[-1.345,-2.6]],"v":[[-373.851,-454.409],[-366.708,-452.136],[-368.982,-444.992],[-376.125,-447.266]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":192.803},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":203.785},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":212.57},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":221.357},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":230.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":238.93},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":247.715},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":311.586},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":324.439},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":337.291},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":372.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":381.83},{"s":[0],"t":390.6875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":15,"mn":"ADBE Vector Group","nm":"dots 3","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.597,1.343],[-1.343,-2.597],[2.597,-1.343],[1.343,2.597]],"o":[[2.597,-1.343],[1.343,2.597],[-2.597,1.343],[-1.343,-2.597]],"v":[[-370.848,-424.403],[-363.714,-422.133],[-365.985,-414.998],[-373.119,-417.269]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":185.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":195},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":212.57},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":230.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":241.125},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":252.107},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":276.27},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":311.586},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":324.439},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":337.291},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":372.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":381.83},{"s":[0],"t":390.6875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":16,"mn":"ADBE Vector Group","nm":"dots 4","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.944,1.522],[-1.522,-2.944],[2.944,-1.522],[1.522,2.944]],"o":[[2.944,-1.522],[1.522,2.944],[-2.944,1.522],[-1.522,-2.944]],"v":[[-364.496,-466.04],[-356.41,-463.466],[-358.983,-455.38],[-367.07,-457.953]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":192.803},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":203.785},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.768},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":243.322},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":252.932},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":262.543},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":278.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":319.299},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.152},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":345},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":378.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":387.143},{"s":[0],"t":396}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":17,"mn":"ADBE Vector Group","nm":"dots","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.68,1.386],[-1.386,-2.68],[2.68,-1.386],[1.386,2.68]],"o":[[2.68,-1.386],[1.386,2.68],[-2.68,1.386],[-1.386,-2.68]],"v":[[-358.249,-418.562],[-350.888,-416.219],[-353.231,-408.858],[-360.591,-411.201]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":199.391},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":210.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":221.357},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":232.34},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243.322},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":254.305},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":265.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":319.299},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.152},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":345},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":378.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":387.143},{"s":[0],"t":396}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":18,"mn":"ADBE Vector Group","nm":"dots 2","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-0.787,4.783],[-3.53,3.322],[-0.752,0.191],[-1.009,-1.757],[-0.469,-5.598],[0.123,-0.319],[0.443,-0.254],[5.377,-2.171]],"o":[[-0.264,-4.84],[0.787,-4.783],[0.565,-0.532],[1.964,-0.499],[2.797,4.872],[0.029,0.341],[-0.184,0.476],[-5.031,2.884],[0,0]],"v":[[-268.562,-391.745],[-268.301,-406.254],[-262.051,-419.097],[-260.105,-420.326],[-255.349,-417.283],[-251.552,-401.011],[-251.62,-399.996],[-252.718,-398.975],[-268.356,-391.382]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-3.975,8.311],[-2.071,0.172],[-1.196,-1.654],[0.251,-6.78],[0.168,-0.307],[0.439,-0.211],[5.253,-2.343],[0.466,0.522]],"o":[[-0.343,-9.206],[0.896,-1.875],[2.034,-0.169],[3.976,5.497],[-0.013,0.35],[-0.234,0.427],[-5.186,2.487],[-0.639,0.285],[0,0]],"v":[[-303.201,-377.675],[-299.375,-404.766],[-295.016,-408.806],[-290.098,-405.644],[-284.296,-386.523],[-284.5,-385.503],[-285.64,-384.628],[-301.299,-377.383],[-303.254,-377.374]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-4.199,9.826],[-1.482,0.717],[-1.691,-1.506],[-0.941,-4.257],[0.521,-4.392],[0.3,-0.433],[0.422,-0.251],[6.634,-0.542]],"o":[[-0.985,-10.584],[0.632,-1.478],[2.058,-0.995],[3.317,2.954],[0.956,4.324],[-0.061,0.517],[-0.275,0.397],[-5.664,3.373],[0,0]],"v":[[-348.784,-363.5],[-343.867,-394.716],[-340.962,-398.475],[-334.688,-396.895],[-328.963,-385.294],[-327.977,-372.124],[-328.422,-370.639],[-329.548,-369.721],[-348.342,-363.739]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-2.124,7.058],[-4.732,1.899],[-1.513,-0.992],[-0.554,-1.002],[0.458,-8.291],[0.277,-0.457],[0.394,-0.233],[2.439,-0.322],[5.037,-0.665]],"o":[[0.451,-7.357],[1.469,-4.883],[1.679,-0.674],[0.957,0.628],[4.019,7.266],[-0.029,0.534],[-0.237,0.391],[-2.119,1.25],[-5.037,0.665],[0,0]],"v":[[-390.46,-353.652],[-385.747,-375.201],[-377.547,-387.47],[-372.333,-387.239],[-370.162,-384.622],[-366.949,-360.269],[-367.292,-358.72],[-368.311,-357.822],[-375.384,-355.902],[-390.495,-353.906]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":157},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":167.199},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":177.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":187.6},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":440.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":450.801},{"s":[0],"t":462}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":19,"mn":"ADBE Vector Group","nm":"stripes","np":5,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[4.818,-7.964],[-0.071,-0.543],[-0.388,-0.372],[-12.193,-0.364]],"o":[[-5.794,7.284],[-0.283,0.468],[0.07,0.533],[8.803,8.444],[0,0]],"v":[[-260.836,-478.945],[-276.775,-456.042],[-277.279,-454.514],[-276.418,-453.19],[-243.427,-439.348]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[6.274,-9.991],[-9.235,-4.045]],"o":[[-8.82,7.836],[7.735,6.466],[0,0]],"v":[[-309.475,-468.673],[-332.269,-441.751],[-306.642,-425.877]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[8.256,-11.093],[-10.904,-5.377]],"o":[[-9.424,10.119],[10.904,5.377],[0,0]],"v":[[-361.705,-460.818],[-388.252,-428.968],[-355.539,-412.837]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.344,0.488]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-190.818,-472.842]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-20.97,12.957]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-200.277,-485.07]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-24.621,1.19]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-187.841,-459.3]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-21.837,11.436]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-194.923,-485.111]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-21.837,11.436]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-194.923,-485.111]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-21.837,11.436]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-194.923,-485.111]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-24.409,3.438]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-188.459,-464.901]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.823,9.314]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-193.995,-478.552]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-24.645,0.499]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.94,-455.493]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-21.837,11.436]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-194.923,-485.111]]}],"t":384},{"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-24.409,3.438]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-188.459,-464.901]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[1.097,-1.636],[0.372,-2.467],[-1.219,-1.825],[-1.689,0.394],[-1.224,1.71],[-0.272,1.637],[1.022,1.762],[1.499,0.806]],"o":[[-1.559,-0.417],[-1.222,1.822],[-0.372,2.467],[1.182,1.769],[1.689,-0.394],[0.842,-1.176],[0.37,-2.226],[-1.022,-1.762],[0,0]],"v":[[-448.595,-443.882],[-452.744,-441.185],[-455.36,-434.713],[-454.154,-427.647],[-449.429,-425.61],[-444.988,-429.06],[-443.138,-433.282],[-444.347,-439.673],[-448.306,-443.422]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":157},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":167.199},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":177.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":187.6},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":256},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":440.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":450.801},{"s":[0],"t":462}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":20,"mn":"ADBE Vector Group","nm":"strokes","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106,-10],[25,-14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106,10],[-25,14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-209,-491],[-209,-421],[-432,-353],[-521.357,-405.581]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-104.511,20.332],[20.031,-20.488],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.511,-20.332],[-20.031,20.488],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-222.846,-497.356],[-203.083,-430.203],[-432,-353],[-521.357,-405.581]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-101.298,-32.784],[27.444,-8.236],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[101.298,32.784],[-27.444,8.236],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-201.646,-480.973],[-216.849,-412.644],[-432,-353],[-521.357,-405.581]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.974,23.231],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.089,-22.395],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.974,23.231],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.089,-22.395],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.974,23.231],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.089,-22.395],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-109.504,-14.378],[26.575,-10.713],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.564,13.861],[-26.575,10.713],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-204.189,-485.22],[-213.075,-415.786],[-432,-353],[-515.729,-412.062]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-109.69,12.889],[23.14,-16.898],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.743,-12.425],[-23.14,16.898],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-214.224,-494.398],[-205.828,-424.903],[-432,-353],[-515.729,-412.062]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.285,11.221],[12,6],[-35,13],[-107.003,-27.354],[27.664,-7.462],[78,9],[6.18,21.925]],"o":[[0,0],[-12,-6],[35,-13],[103.153,26.37],[-27.664,7.462],[-78,-9],[0,0]],"v":[[-483,-409],[-511.576,-420.114],[-470,-460],[-203.131,-477.545],[-220.247,-409.67],[-432,-353],[-516.727,-396.945]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.974,23.231],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.089,-22.395],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":384},{"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-109.504,-14.378],[26.575,-10.713],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.564,13.861],[-26.575,10.713],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-204.189,-485.22],[-213.075,-415.786],[-432,-353],[-515.729,-412.062]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":157},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":167.199},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":177.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":187.6},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":256},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":440.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":450.801},{"s":[0],"t":462}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":21,"mn":"ADBE Vector Group","nm":"body stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106,-10],[25,-14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106,10],[-25,14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-209,-491],[-209,-421],[-432,-353],[-521.357,-405.581]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-104.511,20.332],[20.031,-20.488],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.511,-20.332],[-20.031,20.488],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-222.846,-497.356],[-203.083,-430.203],[-432,-353],[-521.357,-405.581]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-101.298,-32.784],[27.444,-8.236],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[101.298,32.784],[-27.444,8.236],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-201.646,-480.973],[-216.849,-412.644],[-432,-353],[-521.357,-405.581]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.872,21.351],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.444,-20.673],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.872,21.351],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.444,-20.673],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.872,21.351],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.444,-20.673],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-108.777,-16.115],[26.575,-10.713],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.321,15.603],[-26.575,10.713],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-204.189,-485.22],[-213.075,-415.786],[-432,-353],[-515.729,-412.062]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-109.41,11.028],[23.14,-16.898],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.934,-10.677],[-23.14,16.898],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-214.224,-494.398],[-205.828,-424.903],[-432,-353],[-515.729,-412.062]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.603,11.715],[12,6],[-35,13],[-106.074,-28.991],[27.664,-7.462],[78,9],[6.18,21.925]],"o":[[0,0],[-12,-6],[35,-13],[102.704,28.07],[-27.664,7.462],[-78,-9],[0,0]],"v":[[-483,-409],[-511.89,-421.262],[-470,-460],[-203.131,-477.545],[-220.247,-409.67],[-432,-353],[-516.727,-396.945]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.872,21.351],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.444,-20.673],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":384},{"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-108.777,-16.115],[26.575,-10.713],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.321,15.603],[-26.575,10.713],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-204.189,-485.22],[-213.075,-415.786],[-432,-353],[-515.729,-412.062]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":22,"mn":"ADBE Vector Group","nm":"body","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-18.348,-0.263]],"o":[[18.348,0.263],[0,0]],"v":[[-166.761,-456.561],[-111.717,-455.773]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.82,10.821]],"o":[[17.676,-4.928],[0,0]],"v":[[-172.602,-476.242],[-119.976,-506.493]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-16.357,-9.638]],"o":[[17.853,4.241],[0,0]],"v":[[-167.895,-438.182],[-112.758,-422.061]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-13.779,12.238]],"o":[[17.981,-3.661],[0,0]],"v":[[-167.944,-474.342],[-113.382,-509.203]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-17.693,5.159]],"o":[[17.981,-3.661],[0,0]],"v":[[-167.944,-474.342],[-110.794,-485.904]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.762,11.033]],"o":[[17.981,-3.661],[0,0]],"v":[[-167.944,-474.342],[-111.038,-505.592]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-11.866,-10.865]],"o":[[18.166,2.59],[0,0]],"v":[[-166.664,-445.697],[-114.7,-424.739]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.953,9.951]],"o":[[18.247,-1.94],[0,0]],"v":[[-168.159,-465.274],[-106.558,-489.544]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-19.153,-7.987]],"o":[[17.727,4.741],[0,0]],"v":[[-170.595,-433.824],[-117.731,-420.503]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-13.779,12.238]],"o":[[17.981,-3.661],[0,0]],"v":[[-167.944,-474.342],[-113.382,-509.203]]}],"t":384},{"s":[{"c":false,"i":[[0,0],[-11.866,-10.865]],"o":[[18.166,2.59],[0,0]],"v":[[-166.664,-445.697],[-114.7,-424.739]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.713,1.78],[-8.214,-1.295]],"o":[[7.881,0.74],[8.102,-1.87],[0,0]],"v":[[-163.585,-469.139],[-139.992,-470.712],[-115.533,-474.547]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-6.896,3.885],[-3.972,8.323]],"o":[[7.769,-1.515],[7.245,-4.081],[0,0]],"v":[[-173.106,-489.205],[-152.479,-503.119],[-135.428,-522.797]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.662,-1.989],[-8.356,-3.398]],"o":[[7.532,2.434],[8.049,2.089],[0,0]],"v":[[-162.063,-449.77],[-137.816,-448.22],[-112.569,-444.524]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-6.308,4.782],[-4.819,9.708]],"o":[[7.857,-0.96],[7.288,-5.525],[0,0]],"v":[[-167.527,-487.308],[-147.414,-500.863],[-130.23,-524.02]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.748,1.62],[-8.512,6.709]],"o":[[7.857,-0.96],[8.952,-1.871],[0,0]],"v":[[-167.527,-487.308],[-145.119,-492.942],[-119.673,-506.509]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-5.666,5.813],[-5.62,9.267]],"o":[[7.857,-0.96],[6.384,-6.549],[0,0]],"v":[[-167.527,-487.308],[-145.867,-499.111],[-126.576,-521.777]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.842,-1.076],[-10.547,-5.09]],"o":[[7.723,1.735],[9.061,1.244],[0,0]],"v":[[-161.916,-457.77],[-138.917,-455.551],[-111.479,-446.943]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.541,5.06],[-8.728,9.689]],"o":[[7.416,-1.818],[7.594,-5.096],[0,0]],"v":[[-166.514,-478.142],[-143.098,-488.388],[-120.318,-507.266]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-12.352,-0.281],[-13.01,-0.883]],"o":[[7.574,0.966],[9.143,0.208],[0,0]],"v":[[-164.439,-445.243],[-138.905,-446.398],[-112.288,-442.269]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-6.308,4.782],[-4.819,9.708]],"o":[[7.857,-0.96],[7.288,-5.525],[0,0]],"v":[[-167.527,-487.308],[-147.414,-500.863],[-130.23,-524.02]]}],"t":384},{"s":[{"c":false,"i":[[0,0],[-7.842,-1.076],[-10.547,-5.09]],"o":[[7.723,1.735],[9.061,1.244],[0,0]],"v":[[-161.916,-457.77],[-138.917,-455.551],[-111.479,-446.943]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-19.901,2.69]],"o":[[19.516,-4.733],[0,0]],"v":[[-170.618,-481.143],[-113.533,-499.985]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-6.566,17.502]],"o":[[17.386,-10.051],[0,0]],"v":[[-183.242,-498.735],[-148.006,-540.732]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-22.937,-1.122]],"o":[[20.079,-0.381],[0,0]],"v":[[-166.321,-463.015],[-109.18,-466.166]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-6.098,15.635]],"o":[[18.056,-8.791],[0,0]],"v":[[-176.961,-497.534],[-145.53,-537.216]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-12.206,11.517]],"o":[[18.056,-8.791],[0,0]],"v":[[-176.961,-497.534],[-127.848,-524.986]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.395,15.065]],"o":[[18.056,-8.791],[0,0]],"v":[[-176.961,-497.534],[-139.448,-534.819]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-16.3,-4.326]],"o":[[19.959,-2.217],[0,0]],"v":[[-167.369,-470.57],[-108.772,-466.966]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-9.083,14.579]],"o":[[18.808,-7.04],[0,0]],"v":[[-174.937,-489.216],[-132.865,-523.103]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-18.533,-0.856]],"o":[[20.081,0.182],[0,0]],"v":[[-168.324,-458.603],[-107.576,-461.917]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-6.098,15.635]],"o":[[18.056,-8.791],[0,0]],"v":[[-176.961,-497.534],[-145.53,-537.216]]}],"t":384},{"s":[{"c":false,"i":[[0,0],[-16.3,-4.326]],"o":[[19.959,-2.217],[0,0]],"v":[[-167.369,-470.57],[-108.772,-466.966]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[-141.167,-477.879]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":157},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":167.199},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":177.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":187.6},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":440.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":450.801},{"s":[0],"t":462}]},"p":{"a":0,"ix":2,"k":[-141.167,-477.879]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"stripes","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.988,8.335],[-17.113,-1.114],[-5.373,-3.45],[-0.325,-6.378],[1.556,-8.315],[-4.554,-9.947],[0.793,-3.386],[6.326,-0.918],[31.449,6.016],[4.565,16.367]],"o":[[13.134,-11.027],[14.988,-8.335],[6.372,0.415],[5.373,3.45],[0.431,8.448],[-2.012,10.753],[1.448,3.162],[-1.458,6.224],[-31.688,4.597],[-2.685,-16.778],[0,0]],"v":[[-189.538,-489.9],[-148.179,-520.36],[-99.054,-533.075],[-80.845,-527.823],[-71.001,-512.225],[-78.119,-488.054],[-70.044,-456.83],[-67.995,-446.802],[-83.34,-437.409],[-178.93,-439.558],[-189.817,-489.328]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.816,15.265],[-5.727,10.201],[-4.344,0.323],[-2.793,-3.343],[-2.528,-8.072],[-8.69,-6.646],[-0.889,-3.362],[5.155,-3.779],[31.868,-3.107],[9,14.412]],"o":[[9.487,-14.286],[7.816,-15.265],[2.132,-3.799],[4.344,-0.323],[3.7,4.429],[3.27,10.44],[2.763,2.113],[1.634,6.18],[-25.823,18.932],[-7.313,-15.337],[0,0]],"v":[[-203.864,-501.795],[-169.553,-539.871],[-144.145,-573.62],[-132.998,-578.96],[-121.235,-574.495],[-105.978,-540.861],[-78.351,-510.697],[-71.835,-502.803],[-80.976,-487.307],[-179.476,-456.496],[-203.971,-501.168]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-16.811,3.393],[-11.49,-2.199],[-3.352,-2.783],[0.309,-4.345],[3.782,-7.567],[-1.644,-10.815],[1.693,-3.038],[3.809,5.134],[29.392,12.703],[0.901,16.968]],"o":[[15.216,-7.911],[16.811,-3.393],[4.279,0.819],[3.352,2.783],[-0.41,5.756],[-4.891,9.786],[0.523,3.438],[-3.112,5.583],[-19.078,-25.715],[1.023,-16.961],[0,0]],"v":[[-182.887,-475.672],[-127.277,-489.888],[-86.258,-489.963],[-71.844,-483.274],[-66.473,-471.896],[-78.83,-437.092],[-79.871,-396.201],[-80.658,-385.996],[-106.43,-384.271],[-183.466,-424.228],[-183.283,-475.175]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-9.19,14.479],[-8.733,7.784],[-4.247,0.969],[-3.262,-2.888],[-3.707,-7.604],[-9.586,-5.272],[-1.382,-3.192],[5.305,-3.566],[32.008,-0.838],[7.955,15.014]],"o":[[12.797,-7.774],[9.19,-14.479],[3.252,-2.898],[4.247,-0.969],[4.32,3.825],[4.794,9.833],[3.047,1.676],[2.54,5.866],[-26.573,17.864],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-159.228,-539.772],[-143.982,-571.308],[-136.407,-577.26],[-124.109,-574.603],[-103.994,-543.629],[-72.166,-517.937],[-64.544,-511.106],[-81.387,-491.633],[-176.202,-455.133],[-197.465,-501.431]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.505,9.149],[-11.225,3.294],[-4.253,-0.943],[-1.711,-4.006],[-0.094,-8.459],[-6.405,-8.869],[0.118,-3.476],[6.367,0.561],[32.008,-0.838],[7.955,15.014]],"o":[[12.797,-7.774],[14.505,-9.149],[4.18,-1.227],[4.253,0.943],[2.266,5.307],[0.121,10.939],[2.036,2.82],[-0.217,6.388],[-31.896,-2.812],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-145.812,-538.037],[-111.849,-555.13],[-102.456,-557.265],[-92.48,-549.598],[-87.567,-512.994],[-69.808,-476.146],[-65.845,-466.709],[-86.005,-460.587],[-176.202,-455.133],[-197.465,-501.431]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-10.379,13.652],[-9.359,7.02],[-4.314,0.607],[-3.006,-3.153],[-3.053,-7.889],[-9.107,-6.061],[-1.108,-3.297],[5.218,-3.692],[32.008,-0.838],[7.955,15.014]],"o":[[12.797,-7.774],[10.379,-13.652],[3.485,-2.614],[4.314,-0.607],[3.982,4.176],[3.948,10.203],[2.895,1.927],[2.036,6.059],[-26.136,18.496],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-156.212,-537.575],[-136.291,-570.056],[-128.242,-575.348],[-116.211,-571.664],[-98.78,-539.104],[-69.232,-510.818],[-62.213,-503.369],[-79.134,-486.2],[-176.202,-455.133],[-197.465,-501.431]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-17.148,0.202],[-11.289,-3.069],[-3.13,-3.03],[0.64,-4.309],[4.348,-7.256],[-0.815,-10.909],[1.92,-2.9],[5.131,3.811],[30.431,9.96],[2.45,16.814]],"o":[[14.664,-3.025],[17.148,-0.202],[4.204,1.143],[3.13,3.03],[-0.847,5.708],[-5.623,9.384],[0.259,3.468],[-3.529,5.33],[-25.704,-19.092],[-0.533,-16.983],[0,0]],"v":[[-185.024,-481.658],[-117.247,-487.489],[-79.361,-484.275],[-70.24,-481.177],[-65.754,-469.422],[-80.729,-435.662],[-84.886,-394.97],[-86.449,-384.855],[-106.831,-390.191],[-180.893,-430.377],[-185.373,-481.126]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-11.749,12.493],[-10.041,6.003],[-4.354,0.153],[-2.66,-3.45],[-2.211,-8.165],[-8.424,-6.98],[-0.757,-3.395],[6.07,-2.002],[31.944,2.201],[6.495,15.701]],"o":[[13.476,-6.526],[11.749,-12.493],[3.739,-2.235],[4.354,-0.153],[3.524,4.57],[2.86,10.559],[2.678,2.219],[1.391,6.239],[-30.408,10.03],[-4.678,-16.335],[0,0]],"v":[[-194.77,-495.64],[-153.526,-531.234],[-124.933,-556.296],[-116.375,-560.717],[-104.795,-555.795],[-90.863,-521.591],[-64.435,-490.372],[-58.232,-482.23],[-77.151,-465.805],[-178.201,-446.934],[-194.979,-495.039]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-17.081,-1.528],[-10.922,-4.192],[-2.808,-3.33],[1.071,-4.223],[5.057,-6.781],[0.29,-10.936],[2.203,-2.691],[5.323,3.539],[29.023,13.523],[0.425,16.986]],"o":[[14.921,-1.252],[17.081,1.528],[4.067,1.561],[2.808,3.33],[-1.419,5.593],[-6.54,8.769],[-0.092,3.477],[-4.049,4.947],[-26.665,-17.727],[1.499,-16.925],[0,0]],"v":[[-184.528,-471.72],[-113.938,-483.19],[-76.57,-476.172],[-67.807,-472.17],[-64.529,-460.023],[-82.832,-427.945],[-91.071,-387.879],[-93.647,-377.973],[-118.248,-382.713],[-186.551,-420.312],[-184.939,-471.234]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-9.19,14.479],[-8.733,7.784],[-4.247,0.969],[-3.262,-2.888],[-3.707,-7.604],[-9.586,-5.272],[-1.382,-3.192],[5.305,-3.566],[32.008,-0.838],[7.955,15.014]],"o":[[12.797,-7.774],[9.19,-14.479],[3.252,-2.898],[4.247,-0.969],[4.32,3.825],[4.794,9.833],[3.047,1.676],[2.54,5.866],[-26.573,17.864],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-159.228,-539.772],[-143.982,-571.308],[-136.407,-577.26],[-124.109,-574.603],[-103.994,-543.629],[-72.166,-517.937],[-64.544,-511.106],[-81.387,-491.633],[-176.202,-455.133],[-197.465,-501.431]]}],"t":384},{"s":[{"c":false,"i":[[0,0],[-17.148,0.202],[-11.289,-3.069],[-3.13,-3.03],[0.64,-4.309],[4.348,-7.256],[-0.815,-10.909],[1.92,-2.9],[5.131,3.811],[30.431,9.96],[2.45,16.814]],"o":[[14.664,-3.025],[17.148,-0.202],[4.204,1.143],[3.13,3.03],[-0.847,5.708],[-5.623,9.384],[0.259,3.468],[-3.529,5.33],[-25.704,-19.092],[-0.533,-16.983],[0,0]],"v":[[-185.024,-481.658],[-117.247,-487.489],[-79.361,-484.275],[-70.24,-481.177],[-65.754,-469.422],[-80.729,-435.662],[-84.886,-394.97],[-86.449,-384.855],[-106.831,-390.191],[-180.893,-430.377],[-185.373,-481.126]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":157},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":167.199},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":177.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":187.6},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":440.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":450.801},{"s":[0],"t":462}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.988,8.335],[-17.113,-1.114],[-5.373,-3.45],[-0.325,-6.378],[1.556,-8.315],[-4.554,-9.947],[0.793,-3.386],[6.326,-0.918],[31.449,6.016],[4.565,16.367]],"o":[[13.134,-11.027],[14.988,-8.335],[6.372,0.415],[5.373,3.45],[0.431,8.448],[-2.012,10.753],[1.448,3.162],[-1.458,6.224],[-31.688,4.597],[-2.685,-16.778],[0,0]],"v":[[-189.538,-489.9],[-148.179,-520.36],[-99.054,-533.075],[-80.845,-527.823],[-71.001,-512.225],[-78.119,-488.054],[-70.044,-456.83],[-67.995,-446.802],[-83.34,-437.409],[-178.93,-439.558],[-189.817,-489.328]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.816,15.265],[-5.727,10.201],[-4.344,0.323],[-2.793,-3.343],[-2.528,-8.072],[-8.69,-6.646],[-0.889,-3.362],[5.155,-3.779],[31.868,-3.107],[9,14.412]],"o":[[9.487,-14.286],[7.816,-15.265],[2.132,-3.799],[4.344,-0.323],[3.7,4.429],[3.27,10.44],[2.763,2.113],[1.634,6.18],[-25.823,18.932],[-7.313,-15.337],[0,0]],"v":[[-203.864,-501.795],[-169.553,-539.871],[-144.145,-573.62],[-132.998,-578.96],[-121.235,-574.495],[-105.978,-540.861],[-78.351,-510.697],[-71.835,-502.803],[-80.976,-487.307],[-179.476,-456.496],[-203.971,-501.168]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-16.811,3.393],[-11.49,-2.199],[-3.352,-2.783],[0.309,-4.345],[3.782,-7.567],[-1.644,-10.815],[1.693,-3.038],[3.809,5.134],[29.392,12.703],[0.901,16.968]],"o":[[15.216,-7.911],[16.811,-3.393],[4.279,0.819],[3.352,2.783],[-0.41,5.756],[-4.891,9.786],[0.523,3.438],[-3.112,5.583],[-19.078,-25.715],[1.023,-16.961],[0,0]],"v":[[-182.887,-475.672],[-127.277,-489.888],[-86.258,-489.963],[-71.844,-483.274],[-66.473,-471.896],[-78.83,-437.092],[-79.871,-396.201],[-80.658,-385.996],[-106.43,-384.271],[-183.466,-424.228],[-183.283,-475.175]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-9.19,14.479],[-8.733,7.784],[-4.247,0.969],[-3.262,-2.888],[-3.707,-7.604],[-9.586,-5.272],[-1.382,-3.192],[5.305,-3.566],[32.008,-0.838],[7.955,15.014]],"o":[[13.056,-9.08],[9.19,-14.479],[3.252,-2.898],[4.247,-0.969],[4.32,3.825],[4.794,9.833],[3.047,1.676],[2.54,5.866],[-26.573,17.864],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-159.228,-539.772],[-143.982,-571.308],[-136.407,-577.26],[-124.109,-574.603],[-103.994,-543.629],[-72.166,-517.937],[-64.544,-511.106],[-81.387,-491.633],[-176.202,-455.133],[-197.465,-501.431]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.505,9.149],[-11.225,3.294],[-4.253,-0.943],[-1.711,-4.006],[-0.094,-8.459],[-6.405,-8.869],[0.118,-3.476],[6.367,0.561],[32.008,-0.838],[7.955,15.014]],"o":[[13.056,-9.08],[14.505,-9.149],[4.18,-1.227],[4.253,0.943],[2.266,5.307],[0.121,10.939],[2.036,2.82],[-0.217,6.388],[-31.896,-2.812],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-145.812,-538.037],[-111.849,-555.13],[-102.456,-557.265],[-92.48,-549.598],[-87.567,-512.994],[-69.808,-476.146],[-65.845,-466.709],[-86.005,-460.587],[-176.202,-455.133],[-197.465,-501.431]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-10.379,13.652],[-9.359,7.02],[-4.314,0.607],[-3.006,-3.153],[-3.053,-7.889],[-9.107,-6.061],[-1.108,-3.297],[5.218,-3.692],[32.008,-0.838],[7.955,15.014]],"o":[[13.056,-9.08],[10.379,-13.652],[3.485,-2.614],[4.314,-0.607],[3.982,4.176],[3.948,10.203],[2.895,1.927],[2.036,6.059],[-26.136,18.496],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-156.212,-537.575],[-136.291,-570.056],[-128.242,-575.348],[-116.211,-571.664],[-98.78,-539.104],[-69.232,-510.818],[-62.213,-503.369],[-79.134,-486.2],[-176.202,-455.133],[-197.465,-501.431]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-17.148,0.202],[-11.289,-3.069],[-3.13,-3.03],[0.64,-4.309],[4.348,-7.256],[-0.815,-10.909],[1.92,-2.9],[5.131,3.811],[30.431,9.96],[2.45,16.814]],"o":[[15.347,-4.168],[17.148,-0.202],[4.204,1.143],[3.13,3.03],[-0.847,5.708],[-5.623,9.384],[0.259,3.468],[-3.529,5.33],[-25.704,-19.092],[-0.533,-16.983],[0,0]],"v":[[-185.024,-481.658],[-117.247,-487.489],[-79.361,-484.275],[-70.24,-481.177],[-65.754,-469.422],[-80.729,-435.662],[-84.886,-394.97],[-86.449,-384.855],[-106.831,-390.191],[-180.893,-430.377],[-185.373,-481.126]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-11.749,12.493],[-10.041,6.003],[-4.354,0.153],[-2.66,-3.45],[-2.211,-8.165],[-8.424,-6.98],[-0.757,-3.395],[6.07,-2.002],[31.944,2.201],[6.495,15.701]],"o":[[13.858,-7.801],[11.749,-12.493],[3.739,-2.235],[4.354,-0.153],[3.524,4.57],[2.86,10.559],[2.678,2.219],[1.391,6.239],[-30.408,10.03],[-4.678,-16.335],[0,0]],"v":[[-194.77,-495.64],[-153.526,-531.234],[-124.933,-556.296],[-116.375,-560.717],[-104.795,-555.795],[-90.863,-521.591],[-64.435,-490.372],[-58.232,-482.23],[-77.151,-465.805],[-178.201,-446.934],[-194.979,-495.039]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-17.081,-1.528],[-10.922,-4.192],[-2.808,-3.33],[1.071,-4.223],[5.057,-6.781],[0.29,-10.936],[2.203,-2.691],[5.323,3.539],[29.023,13.523],[0.425,16.986]],"o":[[15.735,-2.305],[17.081,1.528],[4.067,1.561],[2.808,3.33],[-1.419,5.593],[-6.54,8.769],[-0.092,3.477],[-4.049,4.947],[-26.665,-17.727],[1.499,-16.925],[0,0]],"v":[[-184.528,-471.72],[-113.938,-483.19],[-76.57,-476.172],[-67.807,-472.17],[-64.529,-460.023],[-82.832,-427.945],[-91.071,-387.879],[-93.647,-377.973],[-118.248,-382.713],[-186.551,-420.312],[-184.939,-471.234]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-9.19,14.479],[-8.733,7.784],[-4.247,0.969],[-3.262,-2.888],[-3.707,-7.604],[-9.586,-5.272],[-1.382,-3.192],[5.305,-3.566],[32.008,-0.838],[7.955,15.014]],"o":[[13.056,-9.08],[9.19,-14.479],[3.252,-2.898],[4.247,-0.969],[4.32,3.825],[4.794,9.833],[3.047,1.676],[2.54,5.866],[-26.573,17.864],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-159.228,-539.772],[-143.982,-571.308],[-136.407,-577.26],[-124.109,-574.603],[-103.994,-543.629],[-72.166,-517.937],[-64.544,-511.106],[-81.387,-491.633],[-176.202,-455.133],[-197.465,-501.431]]}],"t":384},{"s":[{"c":false,"i":[[0,0],[-17.148,0.202],[-11.289,-3.069],[-3.13,-3.03],[0.64,-4.309],[4.348,-7.256],[-0.815,-10.909],[1.92,-2.9],[5.131,3.811],[30.431,9.96],[2.45,16.814]],"o":[[15.347,-4.168],[17.148,-0.202],[4.204,1.143],[3.13,3.03],[-0.847,5.708],[-5.623,9.384],[0.259,3.468],[-3.529,5.33],[-25.704,-19.092],[-0.533,-16.983],[0,0]],"v":[[-185.024,-481.658],[-117.247,-487.489],[-79.361,-484.275],[-70.24,-481.177],[-65.754,-469.422],[-80.729,-435.662],[-84.886,-394.97],[-86.449,-384.855],[-106.831,-390.191],[-180.893,-430.377],[-185.373,-481.126]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":23,"mn":"ADBE Vector Group","nm":"tail","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":26,"ip":83,"ks":{"a":{"a":0,"ix":1,"k":[-365,-428,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.731],"y":[0.806]},"o":{"x":[0.252],"y":[0.129]},"s":[183],"t":84},{"i":{"x":[0.601],"y":[0.479]},"o":{"x":[0.294],"y":[0.23]},"s":[355.01],"t":186},{"i":{"x":[0.843],"y":[0.836]},"o":{"x":[0.198],"y":[0.187]},"s":[532.832],"t":300},{"s":[856],"t":450}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.699],"y":[1.154]},"o":{"x":[0.149],"y":[0.089]},"s":[148],"t":84},{"i":{"x":[0.427],"y":[0.668]},"o":{"x":[0.603],"y":[0.082]},"s":[150.802],"t":186},{"i":{"x":[0.463],"y":[0.923]},"o":{"x":[0.228],"y":[0.663]},"s":[139.072],"t":300},{"s":[136],"t":450}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.836],"y":[0.523]},"o":{"x":[0.247],"y":[0.019]},"s":[-6],"t":84},{"i":{"x":[0.356],"y":[1.056]},"o":{"x":[0.293],"y":[0.668]},"s":[-9.642],"t":186},{"i":{"x":[0.554],"y":[0.972]},"o":{"x":[0.221],"y":[0.033]},"s":[-12.279],"t":244},{"s":[-10],"t":330}]},"s":{"a":0,"ix":6,"k":[-35,35,100]}},"nm":"striped fish","op":502,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.644,1.367],[-1.367,-2.644],[2.644,-1.367],[1.367,2.644]],"o":[[2.644,-1.367],[1.367,2.644],[-2.644,1.367],[-1.367,-2.644]],"v":[[-278.01,-464.082],[-270.748,-461.771],[-273.06,-454.508],[-280.322,-456.82]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 18","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":110.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":119.52},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":128.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":161.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":170.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":179.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":223.516},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":232.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":309.701},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":320.02},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":330.34},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":340.658},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":350.979},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":361.297},{"s":[0],"t":371.615234375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"dots 18","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.397,1.24],[-1.24,-2.397],[2.397,-1.24],[1.24,2.397]],"o":[[2.397,-1.24],[1.24,2.397],[-2.397,1.24],[-1.24,-2.397]],"v":[[-271.779,-452.636],[-265.195,-450.54],[-267.29,-443.955],[-273.875,-446.051]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 12","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":110.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":119.52},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":128.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":161.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":170.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":179.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":223.516},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":232.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":322.084},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":334.125},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":346.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":358.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":370.242},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":382.277},{"s":[0],"t":394.318359375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"dots 12","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.637,1.363],[-1.363,-2.637],[2.637,-1.363],[1.363,2.637]],"o":[[2.637,-1.363],[1.363,2.637],[-2.637,1.363],[-1.363,-2.637]],"v":[[-269.885,-474.475],[-262.643,-472.169],[-264.948,-464.927],[-272.19,-467.232]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 17","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":117.748},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":126.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":135.459},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":168.746},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":177.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":186.459},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":228.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":309.701},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":320.709},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":331.715},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":342.723},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":353.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":364.734},{"s":[0],"t":375.744140625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"dots 17","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.41,1.246],[-1.246,-2.41],[2.41,-1.246],[1.246,2.41]],"o":[[2.41,-1.246],[1.246,2.41],[-2.41,1.246],[-1.246,-2.41]],"v":[[-258.674,-446.065],[-252.052,-443.958],[-254.16,-437.336],[-260.781,-439.444]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 11","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":117.748},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":126.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":135.459},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":168.746},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":177.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":186.459},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":228.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":320.02},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":330.34},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":340.658},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":354.074},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.488},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":380.902},{"s":[0],"t":394.318359375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"dots 11","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.805,1.451],[-1.451,-2.805],[2.805,-1.451],[1.451,2.805]],"o":[[2.805,-1.451],[1.451,2.805],[-2.805,1.451],[-1.451,-2.805]],"v":[[-262.366,-484.789],[-254.66,-482.337],[-257.113,-474.63],[-264.819,-477.083]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 16","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":121.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":130.146},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":139},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":172.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":181.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":234.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":313.828},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":326.729},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":339.627},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":352.525},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":365.424},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":375.744},{"s":[0],"t":386.0625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"dots 16","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.784,1.44],[-1.44,-2.784],[2.784,-1.44],[1.44,2.784]],"o":[[2.784,-1.44],[1.44,2.784],[-2.784,1.44],[-1.44,-2.784]],"v":[[-242.346,-444.75],[-234.699,-442.316],[-237.133,-434.67],[-244.78,-437.103]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 10","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":121.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":130.146},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":139},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":172.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":181.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":234.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":326.211},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":333.777},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":341.348},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":348.914},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":364.734},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":380.561},{"s":[0],"t":396.3828125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"dots 10","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.607,1.348],[-1.348,-2.607],[2.607,-1.348],[1.348,2.607]],"o":[[2.607,-1.348],[1.348,2.607],[-2.607,1.348],[-1.348,-2.607]],"v":[[-331.273,-454.413],[-324.112,-452.133],[-326.391,-444.972],[-333.552,-447.252]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 15","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":110.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":119.52},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":128.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":161.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":170.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":179.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":223.516},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":232.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":315.893},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":326.211},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":336.531},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":346.85},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":375.199},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":390.953},{"s":[0],"t":400}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"dots 15","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.896,1.497],[-1.497,-2.896],[2.896,-1.497],[1.497,2.896]],"o":[[2.896,-1.497],[1.497,2.896],[-2.896,1.497],[-1.497,-2.896]],"v":[[-329.246,-442.538],[-321.292,-440.007],[-323.824,-432.052],[-331.778,-434.584]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 9","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":110.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":119.52},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":128.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":161.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":170.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":179.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":223.516},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":232.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":311.766},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":324.838},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":344.787},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":354.014},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":361.297},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":371.615},{"s":[0],"t":390.19140625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"dots 9","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.823,1.46],[-1.46,-2.823],[2.823,-1.46],[1.46,2.823]],"o":[[2.823,-1.46],[1.46,2.823],[-2.823,1.46],[-1.46,-2.823]],"v":[[-322.06,-463.812],[-314.305,-461.344],[-316.773,-453.589],[-324.528,-456.057]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 14","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":115.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":124.832},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":133.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":166.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":175.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":184.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":228.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":330.34},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":339.279},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":348.229},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":357.17},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":366.109},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":375.059},{"s":[0],"t":384}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":9,"mn":"ADBE Vector Group","nm":"dots 14","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.459,1.271],[-1.271,-2.459],[2.459,-1.271],[1.271,2.459]],"o":[[2.459,-1.271],[1.271,2.459],[-2.459,1.271],[-1.271,-2.459]],"v":[[-317.719,-435.153],[-310.965,-433.003],[-313.114,-426.249],[-319.868,-428.399]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 8","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":115.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":124.832},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":133.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":166.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":175.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":184.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":228.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":320.02},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":326.9},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":333.777},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":340.658},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":350.979},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":361.297},{"s":[0],"t":371.615234375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":10,"mn":"ADBE Vector Group","nm":"dots 8","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.93,1.515],[-1.515,-2.93],[2.93,-1.515],[1.515,2.93]],"o":[[2.93,-1.515],[1.515,2.93],[-2.93,1.515],[-1.515,-2.93]],"v":[[-312.483,-475.015],[-304.435,-472.453],[-306.996,-464.405],[-315.045,-466.966]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 13","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":121.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":130.146},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":139},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":172.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":181.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":234.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":315.893},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":329.307},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":342.723},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":356.137},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":369.553},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":382.967},{"s":[0],"t":396.3828125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":11,"mn":"ADBE Vector Group","nm":"dots 13","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.807,1.452],[-1.452,-2.807],[2.807,-1.452],[1.452,2.807]],"o":[[2.807,-1.452],[1.452,2.807],[-2.807,1.452],[-1.452,-2.807]],"v":[[-306.368,-430.793],[-298.656,-428.339],[-301.111,-420.626],[-308.823,-423.081]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 7","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":121.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":130.146},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":139},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":172.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":181.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":234.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":320.02},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":329.992},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":339.973},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":349.945},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":362.672},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":375.4},{"s":[0],"t":388.126953125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":12,"mn":"ADBE Vector Group","nm":"dots 7","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.748,1.421],[-1.421,-2.748],[2.748,-1.421],[1.421,2.748]],"o":[[2.748,-1.421],[1.421,2.748],[-2.748,1.421],[-1.421,-2.748]],"v":[[-383.108,-444.271],[-375.559,-441.868],[-377.962,-434.319],[-385.511,-436.722]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":110.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":119.52},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":128.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":161.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":170.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":179.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":223.516},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":232.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":313.828},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":326.9},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":339.969},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":353.041},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":366.113},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":379.182},{"s":[0],"t":392.25390625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":13,"mn":"ADBE Vector Group","nm":"dots 5","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.766,1.43],[-1.43,-2.766],[2.766,-1.43],[1.43,2.766]],"o":[[2.766,-1.43],[1.43,2.766],[-2.766,1.43],[-1.43,-2.766]],"v":[[-384.125,-430.303],[-376.527,-427.885],[-378.945,-420.287],[-386.543,-422.705]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 6","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":110.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":119.52},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":128.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":161.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":170.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":179.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":223.516},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":232.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":322.084},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":331.029},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":339.969},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":348.914},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":357.859},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":372.99},{"s":[0],"t":388.126953125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":14,"mn":"ADBE Vector Group","nm":"dots 6","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.6,1.345],[-1.345,-2.6],[2.6,-1.345],[1.345,2.6]],"o":[[2.6,-1.345],[1.345,2.6],[-2.6,1.345],[-1.345,-2.6]],"v":[[-373.851,-454.409],[-366.708,-452.136],[-368.982,-444.992],[-376.125,-447.266]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":115.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":124.832},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":133.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":166.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":175.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":184.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":228.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":315.893},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":326.211},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":334.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":342.723},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":350.979},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":359.232},{"s":[0],"t":367.48828125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":15,"mn":"ADBE Vector Group","nm":"dots 3","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.597,1.343],[-1.343,-2.597],[2.597,-1.343],[1.343,2.597]],"o":[[2.597,-1.343],[1.343,2.597],[-2.597,1.343],[-1.343,-2.597]],"v":[[-370.848,-424.403],[-363.714,-422.133],[-365.985,-414.998],[-373.119,-417.269]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":115.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":124.832},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":133.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":166.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":175.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":184.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":228.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":309},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":317.957},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":334.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":350.979},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":361.297},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":371.615},{"s":[0],"t":394.318359375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":16,"mn":"ADBE Vector Group","nm":"dots 4","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.944,1.522],[-1.522,-2.944],[2.944,-1.522],[1.522,2.944]],"o":[[2.944,-1.522],[1.522,2.944],[-2.944,1.522],[-1.522,-2.944]],"v":[[-364.496,-466.04],[-356.41,-463.466],[-358.983,-455.38],[-367.07,-457.953]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":121.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":130.146},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":139},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":172.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":181.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":234.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":315.893},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":326.211},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":336.531},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":363.361},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":372.391},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":381.42},{"s":[0],"t":396.3828125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":17,"mn":"ADBE Vector Group","nm":"dots","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.68,1.386],[-1.386,-2.68],[2.68,-1.386],[1.386,2.68]],"o":[[2.68,-1.386],[1.386,2.68],[-2.68,1.386],[-1.386,-2.68]],"v":[[-358.249,-418.562],[-350.888,-416.219],[-353.231,-408.858],[-360.591,-411.201]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":121.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":130.146},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":139},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":172.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":181.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":234.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":322.084},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.402},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":342.723},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":353.041},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":363.361},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":373.68},{"s":[0],"t":384}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":18,"mn":"ADBE Vector Group","nm":"dots 2","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-0.787,4.783],[-3.53,3.322],[-0.752,0.191],[-1.009,-1.757],[-0.469,-5.598],[0.123,-0.319],[0.443,-0.254],[5.377,-2.171]],"o":[[-0.264,-4.84],[0.787,-4.783],[0.565,-0.532],[1.964,-0.499],[2.797,4.872],[0.029,0.341],[-0.184,0.476],[-5.031,2.884],[0,0]],"v":[[-268.562,-391.745],[-268.301,-406.254],[-262.051,-419.097],[-260.105,-420.326],[-255.349,-417.283],[-251.552,-401.011],[-251.62,-399.996],[-252.718,-398.975],[-268.356,-391.382]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-3.975,8.311],[-2.071,0.172],[-1.196,-1.654],[0.251,-6.78],[0.168,-0.307],[0.439,-0.211],[5.253,-2.343],[0.466,0.522]],"o":[[-0.343,-9.206],[0.896,-1.875],[2.034,-0.169],[3.976,5.497],[-0.013,0.35],[-0.234,0.427],[-5.186,2.487],[-0.639,0.285],[0,0]],"v":[[-303.201,-377.675],[-299.375,-404.766],[-295.016,-408.806],[-290.098,-405.644],[-284.296,-386.523],[-284.5,-385.503],[-285.64,-384.628],[-301.299,-377.383],[-303.254,-377.374]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-4.199,9.826],[-1.482,0.717],[-1.691,-1.506],[-0.941,-4.257],[0.521,-4.392],[0.3,-0.433],[0.422,-0.251],[6.634,-0.542]],"o":[[-0.985,-10.584],[0.632,-1.478],[2.058,-0.995],[3.317,2.954],[0.956,4.324],[-0.061,0.517],[-0.275,0.397],[-5.664,3.373],[0,0]],"v":[[-348.784,-363.5],[-343.867,-394.716],[-340.962,-398.475],[-334.688,-396.895],[-328.963,-385.294],[-327.977,-372.124],[-328.422,-370.639],[-329.548,-369.721],[-348.342,-363.739]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-2.124,7.058],[-4.732,1.899],[-1.513,-0.992],[-0.554,-1.002],[0.458,-8.291],[0.277,-0.457],[0.394,-0.233],[2.439,-0.322],[5.037,-0.665]],"o":[[0.451,-7.357],[1.469,-4.883],[1.679,-0.674],[0.957,0.628],[4.019,7.266],[-0.029,0.534],[-0.237,0.391],[-2.119,1.25],[-5.037,0.665],[0,0]],"v":[[-390.46,-353.652],[-385.747,-375.201],[-377.547,-387.47],[-372.333,-387.239],[-370.162,-384.622],[-366.949,-360.269],[-367.292,-358.72],[-368.311,-357.822],[-375.384,-355.902],[-390.495,-353.906]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":83.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":94},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":104.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":114.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":124.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":134.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":390},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":400.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.801},{"s":[0],"t":442}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":19,"mn":"ADBE Vector Group","nm":"stripes","np":5,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[4.818,-7.964],[-0.071,-0.543],[-0.388,-0.372],[-12.193,-0.364]],"o":[[-5.794,7.284],[-0.283,0.468],[0.07,0.533],[8.803,8.444],[0,0]],"v":[[-260.836,-478.945],[-276.775,-456.042],[-277.279,-454.514],[-276.418,-453.19],[-243.427,-439.348]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[6.274,-9.991],[-9.235,-4.045]],"o":[[-8.82,7.836],[7.735,6.466],[0,0]],"v":[[-309.475,-468.673],[-332.269,-441.751],[-306.642,-425.877]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[8.256,-11.093],[-10.904,-5.377]],"o":[[-9.424,10.119],[10.904,5.377],[0,0]],"v":[[-361.705,-460.818],[-388.252,-428.968],[-355.539,-412.837]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-21.53,4.849]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-190.718,-466.198]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.258,-2.013]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.933,-465.562]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.249,2.117]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-193.662,-476.038]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.347,-0.273]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.73,-470.067]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-23.035,8.671]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-193.194,-477.839]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-24.385,3.343]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.131,-460.877]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-21.53,4.849]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-190.718,-466.198]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.258,-2.013]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.933,-465.562]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.249,2.117]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-193.662,-476.038]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.347,-0.273]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.73,-470.067]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-23.035,8.671]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-193.194,-477.839]]}],"t":449},{"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-24.385,3.343]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.131,-460.877]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[1.097,-1.636],[0.372,-2.467],[-1.219,-1.825],[-1.689,0.394],[-1.224,1.71],[-0.272,1.637],[1.022,1.762],[1.499,0.806]],"o":[[-1.559,-0.417],[-1.222,1.822],[-0.372,2.467],[1.182,1.769],[1.689,-0.394],[0.842,-1.176],[0.37,-2.226],[-1.022,-1.762],[0,0]],"v":[[-448.595,-443.882],[-452.744,-441.185],[-455.36,-434.713],[-454.154,-427.647],[-449.429,-425.61],[-444.988,-429.06],[-443.138,-433.282],[-444.347,-439.673],[-448.306,-443.422]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":83.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":94},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":104.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":114.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":124.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":134.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":390},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":400.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.801},{"s":[0],"t":442}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":20,"mn":"ADBE Vector Group","nm":"strokes","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106,-10],[25,-14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106,10],[-25,14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-209,-491],[-209,-421],[-432,-353],[-521.357,-405.581]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-104.217,-21.79],[26.409,-11.117],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.217,21.79],[-26.409,11.117],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-205.97,-485.639],[-213.798,-416.078],[-432,-353],[-521.357,-405.581]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106.447,-2.24],[23.912,-15.786],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106.447,2.24],[-23.912,15.786],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-213.121,-492.821],[-208.014,-423.007],[-432,-353],[-521.357,-405.581]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-105.598,-13.606],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.598,13.606],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-207.283,-488.834],[-209.668,-418.874],[-432,-353],[-521.357,-405.581]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[5.662,2.507],[-35,13],[-106.44,-2.573],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12.267,-5.432],[35,-13],[106.44,2.573],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-212.6,-494.682],[-211.064,-418.57],[-432,-353],[-515.836,-410.438]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[5.662,2.507],[-35,13],[-103.215,-26.128],[27.732,-7.206],[78,9],[-0.532,22.773]],"o":[[0,0],[-12.267,-5.432],[35,-13],[103.215,26.127],[-31.343,8.144],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-204.316,-481.606],[-218.019,-413.46],[-432,-353],[-515.836,-410.438]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106,-10],[25,-14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106,10],[-25,14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-209,-491],[-209,-421],[-432,-353],[-521.357,-405.581]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-104.217,-21.79],[26.409,-11.117],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.217,21.79],[-26.409,11.117],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-205.97,-485.639],[-213.798,-416.078],[-432,-353],[-521.357,-405.581]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106.447,-2.24],[23.912,-15.786],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106.447,2.24],[-23.912,15.786],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-213.121,-492.821],[-208.014,-423.007],[-432,-353],[-521.357,-405.581]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-105.598,-13.606],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.598,13.606],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-207.283,-488.834],[-209.668,-418.874],[-432,-353],[-521.357,-405.581]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[5.662,2.507],[-35,13],[-106.44,-2.573],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12.267,-5.432],[35,-13],[106.44,2.573],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-212.6,-494.682],[-211.064,-418.57],[-432,-353],[-515.836,-410.438]]}],"t":449},{"s":[{"c":true,"i":[[-14.908,5.03],[5.662,2.507],[-35,13],[-103.215,-26.128],[27.732,-7.206],[78,9],[-0.532,22.773]],"o":[[0,0],[-12.267,-5.432],[35,-13],[103.215,26.127],[-31.343,8.144],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-204.316,-481.606],[-218.019,-413.46],[-432,-353],[-515.836,-410.438]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":83.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":94},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":104.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":114.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":124.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":134.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":390},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":400.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.801},{"s":[0],"t":442}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":21,"mn":"ADBE Vector Group","nm":"body stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106,-10],[25,-14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106,10],[-25,14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-209,-491],[-209,-421],[-432,-353],[-521.357,-405.581]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-104.217,-21.79],[26.409,-11.117],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.217,21.79],[-26.409,11.117],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-205.97,-485.639],[-213.798,-416.078],[-432,-353],[-521.357,-405.581]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106.447,-2.24],[23.912,-15.786],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106.447,2.24],[-23.912,15.786],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-213.121,-492.821],[-208.014,-423.007],[-432,-353],[-521.357,-405.581]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-105.598,-13.606],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.598,13.606],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-207.283,-488.834],[-209.668,-418.874],[-432,-353],[-521.357,-405.581]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106.44,-2.573],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106.44,2.573],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-212.6,-494.682],[-209.668,-418.874],[-432,-353],[-515.836,-410.438]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-103.215,-26.128],[27.743,-7.162],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[103.215,26.127],[-27.743,7.162],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-204.316,-481.606],[-219.86,-411.085],[-432,-353],[-515.836,-410.438]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106,-10],[25,-14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106,10],[-25,14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-209,-491],[-209,-421],[-432,-353],[-521.357,-405.581]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-104.217,-21.79],[26.409,-11.117],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.217,21.79],[-26.409,11.117],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-205.97,-485.639],[-213.798,-416.078],[-432,-353],[-521.357,-405.581]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106.447,-2.24],[23.912,-15.786],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106.447,2.24],[-23.912,15.786],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-213.121,-492.821],[-208.014,-423.007],[-432,-353],[-521.357,-405.581]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-105.598,-13.606],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.598,13.606],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-207.283,-488.834],[-209.668,-418.874],[-432,-353],[-521.357,-405.581]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106.44,-2.573],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106.44,2.573],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-212.6,-494.682],[-209.668,-418.874],[-432,-353],[-515.836,-410.438]]}],"t":449},{"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-103.215,-26.128],[27.743,-7.162],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[103.215,26.127],[-27.743,7.162],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-204.316,-481.606],[-219.86,-411.085],[-432,-353],[-515.836,-410.438]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":22,"mn":"ADBE Vector Group","nm":"body","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-18.348,-0.263]],"o":[[18.348,0.263],[0,0]],"v":[[-166.761,-456.561],[-111.717,-455.773]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-20.99,-10.632]],"o":[[19.349,-0.768],[0,0]],"v":[[-167.847,-446.693],[-113.237,-439.755]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-19.429,3.808]],"o":[[18.877,-4.315],[0,0]],"v":[[-168.481,-461.555],[-113.527,-464.785]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.161,-6.546]],"o":[[19.23,-2.273],[0,0]],"v":[[-166.242,-452.975],[-116.603,-447.66]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.252,8.444]],"o":[[18.89,-4.256],[0,0]],"v":[[-168.058,-463.277],[-114.861,-480.077]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.401,-7.305]],"o":[[19.364,0.042],[0,0]],"v":[[-167.854,-441.1],[-123.549,-431.15]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-18.348,-0.263]],"o":[[18.348,0.263],[0,0]],"v":[[-166.761,-456.561],[-111.717,-455.773]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-20.99,-10.632]],"o":[[19.349,-0.768],[0,0]],"v":[[-167.847,-446.693],[-113.237,-439.755]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-19.429,3.808]],"o":[[18.877,-4.315],[0,0]],"v":[[-168.481,-461.555],[-113.527,-464.785]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.161,-6.546]],"o":[[19.23,-2.273],[0,0]],"v":[[-166.242,-452.975],[-116.603,-447.66]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.252,8.444]],"o":[[18.89,-4.256],[0,0]],"v":[[-168.058,-463.277],[-114.861,-480.077]]}],"t":449},{"s":[{"c":false,"i":[[0,0],[-14.401,-7.305]],"o":[[19.364,0.042],[0,0]],"v":[[-167.854,-441.1],[-123.549,-431.15]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.713,1.78],[-8.214,-1.295]],"o":[[7.881,0.74],[8.102,-1.87],[0,0]],"v":[[-163.585,-469.139],[-139.992,-470.712],[-115.533,-474.547]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.863,0.907],[-8.017,-2.205]],"o":[[7.749,1.617],[8.26,-0.952],[0,0]],"v":[[-163.284,-458.837],[-140.399,-462.045],[-114.929,-458.839]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.562,2.338],[-9.414,5.006]],"o":[[7.914,0.163],[7.944,-2.456],[0,0]],"v":[[-166.231,-474.331],[-142.231,-476.936],[-119.091,-486.061]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.769,1.516],[-10.394,-2.79]],"o":[[7.851,1.008],[8.161,-1.593],[0,0]],"v":[[-162.639,-465.438],[-139.422,-468.259],[-115.254,-465.481]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-6.528,4.476],[-6.59,4.181]],"o":[[7.913,0.188],[8.713,-5.974],[0,0]],"v":[[-165.768,-476.046],[-144.542,-483.752],[-124.93,-499.087]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.259,-1.345],[-7.729,-1.079]],"o":[[7.674,1.939],[10.388,1.924],[0,0]],"v":[[-162.788,-453.043],[-140.381,-455.846],[-118.919,-452.158]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.713,1.78],[-8.214,-1.295]],"o":[[7.881,0.74],[8.102,-1.87],[0,0]],"v":[[-163.585,-469.139],[-139.992,-470.712],[-115.533,-474.547]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.863,0.907],[-8.017,-2.205]],"o":[[7.749,1.617],[8.26,-0.952],[0,0]],"v":[[-163.284,-458.837],[-140.399,-462.045],[-114.929,-458.839]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.562,2.338],[-9.414,5.006]],"o":[[7.914,0.163],[7.944,-2.456],[0,0]],"v":[[-166.231,-474.331],[-142.231,-476.936],[-119.091,-486.061]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.769,1.516],[-10.394,-2.79]],"o":[[7.851,1.008],[8.161,-1.593],[0,0]],"v":[[-162.639,-465.438],[-139.422,-468.259],[-115.254,-465.481]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-6.528,4.476],[-6.59,4.181]],"o":[[7.913,0.188],[8.713,-5.974],[0,0]],"v":[[-165.768,-476.046],[-144.542,-483.752],[-124.93,-499.087]]}],"t":449},{"s":[{"c":false,"i":[[0,0],[-7.259,-1.345],[-7.729,-1.079]],"o":[[7.674,1.939],[10.388,1.924],[0,0]],"v":[[-162.788,-453.043],[-140.381,-455.846],[-118.919,-452.158]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-19.901,2.69]],"o":[[19.516,-4.733],[0,0]],"v":[[-170.618,-481.143],[-113.533,-499.985]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-20.077,0.448]],"o":[[20.262,-10.908],[0,0]],"v":[[-168.931,-471.552],[-110.098,-483.893]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-17.23,11.389]],"o":[[22.344,-7.208],[0,0]],"v":[[-174.121,-485.79],[-118.563,-508.747]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-22.777,-1.154]],"o":[[22.987,-4.778],[0,0]],"v":[[-169.259,-477.675],[-117.996,-487.479]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-8.642,11.641]],"o":[[22.367,-7.138],[0,0]],"v":[[-173.623,-487.53],[-137.079,-515.404]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-10.441,-2.265]],"o":[[19.115,-8.372],[0,0]],"v":[[-167.898,-465.983],[-117.618,-472.46]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-19.901,2.69]],"o":[[19.516,-4.733],[0,0]],"v":[[-170.618,-481.143],[-113.533,-499.985]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-20.077,0.448]],"o":[[20.262,-10.908],[0,0]],"v":[[-168.931,-471.552],[-110.098,-483.893]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-17.23,11.389]],"o":[[22.344,-7.208],[0,0]],"v":[[-174.121,-485.79],[-118.563,-508.747]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-22.777,-1.154]],"o":[[22.987,-4.778],[0,0]],"v":[[-169.259,-477.675],[-117.996,-487.479]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-8.642,11.641]],"o":[[22.367,-7.138],[0,0]],"v":[[-173.623,-487.53],[-137.079,-515.404]]}],"t":449},{"s":[{"c":false,"i":[[0,0],[-10.441,-2.265]],"o":[[19.115,-8.372],[0,0]],"v":[[-167.898,-465.983],[-117.618,-472.46]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[-141.167,-477.879]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":83.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":94},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":104.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":114.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":124.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":134.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":390},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":400.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.801},{"s":[0],"t":442}]},"p":{"a":0,"ix":2,"k":[-141.167,-477.879]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"stripes","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.988,8.335],[-17.113,-1.114],[-5.373,-3.45],[-0.325,-6.378],[1.556,-8.315],[-4.554,-9.947],[0.793,-3.386],[6.326,-0.918],[31.449,6.016],[4.565,16.367]],"o":[[13.134,-11.027],[14.988,-8.335],[6.372,0.415],[5.373,3.45],[0.431,8.448],[-2.012,10.753],[1.448,3.162],[-1.458,6.224],[-31.688,4.597],[-2.685,-16.778],[0,0]],"v":[[-189.538,-489.9],[-148.179,-520.36],[-99.054,-533.075],[-80.845,-527.823],[-71.001,-512.225],[-78.119,-488.054],[-70.044,-456.83],[-67.995,-446.802],[-83.34,-437.409],[-178.93,-439.558],[-189.817,-489.328]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.826,6.607],[-16.882,-3.02],[-4.954,-4.03],[0.39,-6.374],[2.476,-8.089],[-3.413,-10.394],[1.167,-3.276],[5.276,3.609],[29.749,7.044],[2.706,16.775]],"o":[[14.285,-9.489],[15.826,-6.607],[6.286,1.125],[4.954,4.03],[-0.516,8.443],[-3.202,10.461],[1.085,3.304],[-2.145,6.022],[-36.044,-24.654],[-0.792,-16.973],[0,0]],"v":[[-186.753,-482.37],[-142.223,-503.014],[-85.532,-505.188],[-68.024,-497.932],[-67.854,-483.436],[-77.63,-460.213],[-73.097,-428.282],[-72.183,-418.087],[-88.481,-410.469],[-181.841,-431.158],[-187.094,-481.833]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.34,9.406],[-16.175,9.378],[-6.085,-1.937],[-1.97,-6.074],[-0.656,-8.434],[-6.98,-8.424],[-0.113,-3.476],[5.737,-2.819],[30.537,1.449],[5.747,15.99]],"o":[[12.295,-11.956],[14.34,-9.406],[5.524,-3.203],[6.085,1.937],[2.609,8.047],[0.848,10.907],[2.219,2.678],[0.208,6.389],[-28.688,14.097],[-3.902,-16.537],[0,0]],"v":[[-193.63,-493.143],[-149.953,-515.65],[-107.597,-545.16],[-88.648,-544.814],[-83.185,-531.386],[-83.785,-506.196],[-67.881,-478.138],[-63.3,-468.986],[-75.68,-455.932],[-179.378,-443.71],[-193.866,-492.553]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.595,5.152],[-20.896,-2.154],[-5.457,-3.317],[-0.483,-6.368],[1.35,-8.351],[-4.798,-9.831],[0.709,-3.405],[5.971,2.281],[30.207,4.705],[4.005,16.513]],"o":[[13.503,-10.573],[16.171,-5.709],[6.352,0.655],[5.457,3.317],[0.64,8.435],[-1.746,10.799],[1.525,3.126],[-1.304,6.258],[-31.041,-11.86],[-2.112,-16.86],[0,0]],"v":[[-187.87,-487.071],[-147.448,-510.108],[-92.687,-515.72],[-74.354,-510.919],[-72.209,-496.581],[-78.729,-472.242],[-69.884,-441.227],[-67.589,-431.253],[-89.001,-419.582],[-178.983,-436.397],[-188.168,-486.51]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-12.722,8.816],[-13.537,16.063],[-6.386,0.068],[-3.775,-5.151],[-3.267,-7.803],[-9.269,-5.811],[-1.197,-3.265],[5.677,-2.938],[30.532,1.544],[5.697,16.008]],"o":[[12.332,-11.917],[14.096,-9.768],[4.115,-4.883],[6.386,-0.068],[5,6.823],[4.224,10.091],[2.947,1.847],[2.2,6.001],[-29.511,15.273],[-3.85,-16.549],[0,0]],"v":[[-193.108,-494.944],[-155.404,-521.745],[-129.028,-550.681],[-112.423,-556.108],[-103.025,-545.07],[-95.698,-520.961],[-71.8,-499.305],[-64.58,-492.049],[-77.866,-474.575],[-179.01,-445.466],[-193.346,-494.354]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.033,3.687],[-20.916,-1.945],[-4.911,-4.081],[0.456,-6.369],[2.561,-8.062],[-3.304,-10.429],[1.201,-3.264],[5.549,3.172],[29.428,8.281],[2.003,16.873]],"o":[[14.669,-8.884],[16.656,-4.085],[6.358,0.591],[4.911,4.081],[-0.605,8.438],[-3.312,10.426],[1.05,3.315],[-2.207,5.999],[-28.849,-16.49],[-0.082,-16.991],[0,0]],"v":[[-185.252,-477.536],[-141.89,-491.688],[-89.168,-495.827],[-72.477,-487.527],[-72.458,-473.03],[-82.478,-449.911],[-82.103,-422.24],[-81.296,-412.036],[-104.249,-403.555],[-182.485,-426.164],[-185.615,-477.014]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.988,8.335],[-16.703,3.889],[-5.373,-3.45],[-0.325,-6.378],[1.556,-8.315],[-4.554,-9.947],[0.793,-3.386],[6.326,-0.918],[31.449,6.016],[4.565,16.367]],"o":[[13.134,-11.027],[14.988,-8.335],[6.22,-1.448],[5.373,3.45],[0.431,8.448],[-2.012,10.753],[1.448,3.162],[-1.458,6.224],[-31.688,4.597],[-2.685,-16.778],[0,0]],"v":[[-189.538,-489.9],[-151.674,-511.728],[-105.303,-528.435],[-80.845,-527.823],[-71.001,-512.225],[-78.119,-488.054],[-70.044,-456.83],[-67.995,-446.802],[-83.34,-437.409],[-178.93,-439.558],[-189.817,-489.328]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.826,6.607],[-16.882,-3.02],[-4.954,-4.03],[0.39,-6.374],[2.476,-8.089],[-3.413,-10.394],[1.167,-3.276],[5.276,3.609],[29.749,7.044],[2.706,16.775]],"o":[[14.285,-9.489],[15.826,-6.607],[6.286,1.125],[4.954,4.03],[-0.516,8.443],[-3.202,10.461],[1.085,3.304],[-2.145,6.022],[-36.044,-24.654],[-0.792,-16.973],[0,0]],"v":[[-186.753,-482.37],[-142.223,-503.014],[-85.532,-505.188],[-68.024,-497.932],[-67.854,-483.436],[-77.63,-460.213],[-73.097,-428.282],[-72.183,-418.087],[-88.481,-410.469],[-181.841,-431.158],[-187.094,-481.833]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.34,9.406],[-16.175,9.378],[-6.085,-1.937],[-1.97,-6.074],[-0.656,-8.434],[-6.98,-8.424],[-0.113,-3.476],[5.737,-2.819],[30.537,1.449],[5.747,15.99]],"o":[[12.295,-11.956],[14.34,-9.406],[5.524,-3.203],[6.085,1.937],[2.609,8.047],[0.848,10.907],[2.219,2.678],[0.208,6.389],[-28.688,14.097],[-3.902,-16.537],[0,0]],"v":[[-193.63,-493.143],[-149.953,-515.65],[-107.597,-545.16],[-88.648,-544.814],[-83.185,-531.386],[-83.785,-506.196],[-67.881,-478.138],[-63.3,-468.986],[-75.68,-455.932],[-179.378,-443.71],[-193.866,-492.553]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.595,5.152],[-20.896,-2.154],[-5.457,-3.317],[-0.483,-6.368],[1.35,-8.351],[-4.798,-9.831],[0.709,-3.405],[5.971,2.281],[30.207,4.705],[4.005,16.513]],"o":[[13.503,-10.573],[16.171,-5.709],[6.352,0.655],[5.457,3.317],[0.64,8.435],[-1.746,10.799],[1.525,3.126],[-1.304,6.258],[-31.041,-11.86],[-2.112,-16.86],[0,0]],"v":[[-187.87,-487.071],[-147.448,-510.108],[-92.687,-515.72],[-74.354,-510.919],[-72.209,-496.581],[-78.729,-472.242],[-69.884,-441.227],[-67.589,-431.253],[-89.001,-419.582],[-178.983,-436.397],[-188.168,-486.51]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-12.722,8.816],[-13.537,16.063],[-6.386,0.068],[-3.775,-5.151],[-3.267,-7.803],[-9.269,-5.811],[-1.197,-3.265],[5.677,-2.938],[30.532,1.544],[5.697,16.008]],"o":[[12.332,-11.917],[14.096,-9.768],[4.115,-4.883],[6.386,-0.068],[5,6.823],[4.224,10.091],[2.947,1.847],[2.2,6.001],[-29.511,15.273],[-3.85,-16.549],[0,0]],"v":[[-193.108,-494.944],[-155.404,-521.745],[-129.028,-550.681],[-112.423,-556.108],[-103.025,-545.07],[-95.698,-520.961],[-71.8,-499.305],[-64.58,-492.049],[-77.866,-474.575],[-179.01,-445.466],[-193.346,-494.354]]}],"t":449},{"s":[{"c":false,"i":[[0,0],[-15.033,3.687],[-20.916,-1.945],[-4.911,-4.081],[0.456,-6.369],[2.561,-8.062],[-3.304,-10.429],[1.201,-3.264],[5.549,3.172],[29.428,8.281],[2.003,16.873]],"o":[[14.669,-8.884],[16.656,-4.085],[6.358,0.591],[4.911,4.081],[-0.605,8.438],[-3.312,10.426],[1.05,3.315],[-2.207,5.999],[-28.849,-16.49],[-0.082,-16.991],[0,0]],"v":[[-185.252,-477.536],[-141.89,-491.688],[-89.168,-495.827],[-72.477,-487.527],[-72.458,-473.03],[-82.478,-449.911],[-82.103,-422.24],[-81.296,-412.036],[-104.249,-403.555],[-182.485,-426.164],[-185.615,-477.014]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":83.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":94},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":104.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":114.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":124.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":134.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":390},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":400.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.801},{"s":[0],"t":442}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.988,8.335],[-17.113,-1.114],[-5.373,-3.45],[-0.325,-6.378],[1.556,-8.315],[-4.554,-9.947],[0.793,-3.386],[6.326,-0.918],[31.449,6.016],[4.565,16.367]],"o":[[13.134,-11.027],[14.988,-8.335],[6.372,0.415],[5.373,3.45],[0.431,8.448],[-2.012,10.753],[1.448,3.162],[-1.458,6.224],[-31.688,4.597],[-2.685,-16.778],[0,0]],"v":[[-189.538,-489.9],[-148.179,-520.36],[-99.054,-533.075],[-80.845,-527.823],[-71.001,-512.225],[-78.119,-488.054],[-70.044,-456.83],[-67.995,-446.802],[-83.34,-437.409],[-178.93,-439.558],[-189.817,-489.328]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.826,6.607],[-16.882,-3.02],[-4.954,-4.03],[0.39,-6.374],[2.476,-8.089],[-3.413,-10.394],[1.167,-3.276],[5.411,3.402],[30.55,3.439],[2.706,16.775]],"o":[[14.285,-9.489],[15.826,-6.607],[6.286,1.125],[4.954,4.03],[-0.516,8.443],[-3.202,10.461],[1.085,3.304],[-2.145,6.022],[-32.795,-20.619],[-0.792,-16.973],[0,0]],"v":[[-186.753,-482.37],[-142.223,-503.014],[-85.532,-505.188],[-68.024,-497.932],[-67.854,-483.436],[-77.63,-460.213],[-73.097,-428.282],[-72.183,-418.087],[-88.481,-410.469],[-181.841,-431.158],[-187.094,-481.833]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.34,9.406],[-15.98,10.794],[-6.085,-1.937],[-1.97,-6.074],[-0.656,-8.434],[-6.98,-8.424],[-0.113,-3.476],[5.824,-2.635],[30.661,-2.241],[5.747,15.99]],"o":[[12.295,-11.956],[14.34,-9.406],[5.292,-3.574],[6.085,1.937],[2.609,8.047],[0.848,10.907],[2.219,2.678],[0.208,6.389],[-32.226,14.584],[-3.902,-16.537],[0,0]],"v":[[-193.63,-493.143],[-149.953,-515.65],[-107.597,-545.16],[-88.648,-544.814],[-83.185,-531.386],[-83.785,-506.196],[-67.881,-478.138],[-63.3,-468.986],[-75.68,-455.932],[-179.378,-443.71],[-193.866,-492.553]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.263,7.82],[-18.6,-0.177],[-5.457,-3.317],[-0.483,-6.368],[1.35,-8.351],[-4.798,-9.831],[0.709,-3.405],[5.948,2.341],[30.725,1.049],[4.005,16.513]],"o":[[13.503,-10.573],[15.263,-7.82],[6.386,0.061],[5.457,3.317],[0.64,8.435],[-1.746,10.799],[1.525,3.126],[-1.304,6.258],[-31.806,-12.519],[-2.112,-16.86],[0,0]],"v":[[-187.87,-487.071],[-145.97,-509.502],[-92.687,-515.72],[-74.354,-510.919],[-72.209,-496.581],[-78.729,-472.242],[-69.884,-441.227],[-67.589,-431.253],[-89.001,-419.582],[-178.983,-436.397],[-188.168,-486.51]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-12.663,11.565],[-10.61,15.277],[-6.386,0.068],[-3.775,-5.151],[-3.267,-7.803],[-9.269,-5.811],[-1.197,-3.265],[5.706,-2.881],[30.668,-2.145],[5.697,16.008]],"o":[[12.332,-11.917],[12.663,-11.565],[3.643,-5.245],[6.386,-0.068],[5,6.823],[4.224,10.091],[2.947,1.847],[2.2,6.001],[-30.512,15.406],[-3.85,-16.549],[0,0]],"v":[[-193.108,-494.944],[-153.819,-521.55],[-129.028,-550.681],[-112.423,-556.108],[-103.025,-545.07],[-95.698,-520.961],[-71.8,-499.305],[-64.58,-492.049],[-77.866,-474.575],[-179.01,-445.466],[-193.346,-494.354]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.96,6.276],[-18.6,0.01],[-4.911,-4.081],[0.456,-6.369],[2.561,-8.062],[-3.304,-10.429],[1.201,-3.264],[5.517,3.228],[30.379,4.713],[2.003,16.873]],"o":[[14.669,-8.884],[15.96,-6.276],[6.386,-0.003],[4.911,4.081],[-0.605,8.438],[-3.312,10.426],[1.05,3.315],[-2.207,5.999],[-29.504,-17.259],[-0.082,-16.991],[0,0]],"v":[[-185.252,-477.536],[-140.48,-490.939],[-89.168,-495.827],[-72.477,-487.527],[-72.458,-473.03],[-82.478,-449.911],[-82.103,-422.24],[-81.296,-412.036],[-104.249,-403.555],[-182.485,-426.164],[-185.615,-477.014]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.988,8.335],[-16.703,3.889],[-5.373,-3.45],[-0.325,-6.378],[1.556,-8.315],[-4.554,-9.947],[0.793,-3.386],[6.326,-0.918],[31.449,6.016],[4.565,16.367]],"o":[[13.134,-11.027],[14.988,-8.335],[6.22,-1.448],[5.373,3.45],[0.431,8.448],[-2.012,10.753],[1.448,3.162],[-1.458,6.224],[-31.688,4.597],[-2.685,-16.778],[0,0]],"v":[[-189.538,-489.9],[-151.674,-511.728],[-105.303,-528.435],[-80.845,-527.823],[-71.001,-512.225],[-78.119,-488.054],[-70.044,-456.83],[-67.995,-446.802],[-83.34,-437.409],[-178.93,-439.558],[-189.817,-489.328]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.826,6.607],[-16.882,-3.02],[-4.954,-4.03],[0.39,-6.374],[2.476,-8.089],[-3.413,-10.394],[1.167,-3.276],[5.411,3.402],[30.55,3.439],[2.706,16.775]],"o":[[14.285,-9.489],[15.826,-6.607],[6.286,1.125],[4.954,4.03],[-0.516,8.443],[-3.202,10.461],[1.085,3.304],[-2.145,6.022],[-32.795,-20.619],[-0.792,-16.973],[0,0]],"v":[[-186.753,-482.37],[-142.223,-503.014],[-85.532,-505.188],[-68.024,-497.932],[-67.854,-483.436],[-77.63,-460.213],[-73.097,-428.282],[-72.183,-418.087],[-88.481,-410.469],[-181.841,-431.158],[-187.094,-481.833]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.34,9.406],[-15.98,10.794],[-6.085,-1.937],[-1.97,-6.074],[-0.656,-8.434],[-6.98,-8.424],[-0.113,-3.476],[5.824,-2.635],[30.661,-2.241],[5.747,15.99]],"o":[[12.295,-11.956],[14.34,-9.406],[5.292,-3.574],[6.085,1.937],[2.609,8.047],[0.848,10.907],[2.219,2.678],[0.208,6.389],[-32.226,14.584],[-3.902,-16.537],[0,0]],"v":[[-193.63,-493.143],[-149.953,-515.65],[-107.597,-545.16],[-88.648,-544.814],[-83.185,-531.386],[-83.785,-506.196],[-67.881,-478.138],[-63.3,-468.986],[-75.68,-455.932],[-179.378,-443.71],[-193.866,-492.553]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.263,7.82],[-18.6,-0.177],[-5.457,-3.317],[-0.483,-6.368],[1.35,-8.351],[-4.798,-9.831],[0.709,-3.405],[5.948,2.341],[30.725,1.049],[4.005,16.513]],"o":[[13.503,-10.573],[15.263,-7.82],[6.386,0.061],[5.457,3.317],[0.64,8.435],[-1.746,10.799],[1.525,3.126],[-1.304,6.258],[-31.806,-12.519],[-2.112,-16.86],[0,0]],"v":[[-187.87,-487.071],[-145.97,-509.502],[-92.687,-515.72],[-74.354,-510.919],[-72.209,-496.581],[-78.729,-472.242],[-69.884,-441.227],[-67.589,-431.253],[-89.001,-419.582],[-178.983,-436.397],[-188.168,-486.51]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-12.663,11.565],[-10.61,15.277],[-6.386,0.068],[-3.775,-5.151],[-3.267,-7.803],[-9.269,-5.811],[-1.197,-3.265],[5.706,-2.881],[30.668,-2.145],[5.697,16.008]],"o":[[12.332,-11.917],[12.663,-11.565],[3.643,-5.245],[6.386,-0.068],[5,6.823],[4.224,10.091],[2.947,1.847],[2.2,6.001],[-30.512,15.406],[-3.85,-16.549],[0,0]],"v":[[-193.108,-494.944],[-153.819,-521.55],[-129.028,-550.681],[-112.423,-556.108],[-103.025,-545.07],[-95.698,-520.961],[-71.8,-499.305],[-64.58,-492.049],[-77.866,-474.575],[-179.01,-445.466],[-193.346,-494.354]]}],"t":449},{"s":[{"c":false,"i":[[0,0],[-15.96,6.276],[-18.6,0.01],[-4.911,-4.081],[0.456,-6.369],[2.561,-8.062],[-3.304,-10.429],[1.201,-3.264],[5.517,3.228],[30.379,4.713],[2.003,16.873]],"o":[[14.669,-8.884],[15.96,-6.276],[6.386,-0.003],[4.911,4.081],[-0.605,8.438],[-3.312,10.426],[1.05,3.315],[-2.207,5.999],[-29.504,-17.259],[-0.082,-16.991],[0,0]],"v":[[-185.252,-477.536],[-140.48,-490.939],[-89.168,-495.827],[-72.477,-487.527],[-72.458,-473.03],[-82.478,-449.911],[-82.103,-422.24],[-81.296,-412.036],[-104.249,-403.555],[-182.485,-426.164],[-185.615,-477.014]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":23,"mn":"ADBE Vector Group","nm":"tail","np":3,"ty":"gr"}],"sr":1,"st":22,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":27,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1173.598,40.967,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":1,"ix":2,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1189.947,1.902,0],"t":0,"ti":[0.238,-0.119,0],"to":[0,-1.19,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1189.947,-5.241,0],"t":59.881,"ti":[-0.119,0.119,0],"to":[-0.238,0.119,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1191.375,2.616,0],"t":119.76,"ti":[-0.238,0.595,0],"to":[0.119,-0.119,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1189.232,-5.955,0],"t":179.637,"ti":[0.238,-0.238,0],"to":[0.238,-0.595,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1189.947,-0.955,0],"t":239.518,"ti":[0.119,0.119,0],"to":[-0.238,0.238,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1190.661,-4.527,0],"t":299.396,"ti":[-0.119,0.119,0],"to":[-0.119,-0.119,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1190.661,-1.67,0],"t":359.277,"ti":[-0.119,-0.595,0],"to":[0.119,-0.119,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"s":[-1189.947,-5.241,0],"t":419.156,"ti":[0.238,-0.357,0],"to":[0.119,0.595,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1189.947,1.902,0],"t":479,"ti":[0.238,0.833,0],"to":[-0.238,0.357,0]},{"s":[-1191.375,-3.098,0],"t":479.037109375}]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[14],"t":0},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[12.5],"t":59.881},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[13],"t":119.76},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[13],"t":179.637},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[15],"t":239.518},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[13],"t":299.396},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[15],"t":359.277},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[13],"t":419.156},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[14],"t":479},{"s":[16],"t":479.037109375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Tank","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.226,"y":0.156},"s":[{"c":true,"i":[[16.189,-0.55],[17.288,-2.157],[-1.01,-0.127],[-12.162,3.423],[-2.606,-10.311],[10.601,-3.992],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-3.685,1.943],[4.904,23.433]],"o":[[-25.696,0.872],[-1.01,0.126],[12.863,1.614],[11.264,-3.17],[2.337,9.249],[-17.784,6.696],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[22.237,-11.724],[-3.586,-17.133]],"v":[[-1086.781,-55.194],[-1130.649,-28.594],[-1121.427,-17.909],[-1089.709,-37.184],[-1070.818,-26.143],[-1095.856,-3.676],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1094.474,16.935],[-1053.633,-29.618]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.35},"s":[{"c":true,"i":[[16.196,-0.298],[17.288,-2.157],[-1.01,-0.127],[-6.726,2.164],[-0.47,-7.794],[6.798,-7.556],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-4.513,6.428],[3.905,22.436]],"o":[[-21.185,0.398],[-1.01,0.126],[12.863,1.614],[11.287,-3.679],[0.515,10.232],[-7.707,8.03],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[10.979,-14.26],[-2.125,-12.101]],"v":[[-1103.779,-47.018],[-1150.046,-23.44],[-1140.824,-12.755],[-1111.02,-27.655],[-1093.199,-18.138],[-1107.977,2.771],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1097.138,16.259],[-1076.369,-24.419]]}],"t":17},{"i":{"x":0.7,"y":1},"o":{"x":1,"y":1},"s":[{"c":true,"i":[[16.196,-0.298],[17.288,-2.157],[-1.01,-0.127],[-6.726,2.164],[-0.47,-7.794],[6.798,-7.556],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-4.513,6.428],[3.905,22.436]],"o":[[-21.185,0.398],[-1.01,0.126],[12.863,1.614],[11.287,-3.679],[0.515,10.232],[-7.707,8.03],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[10.979,-14.26],[-2.125,-12.101]],"v":[[-1103.779,-47.018],[-1150.046,-23.44],[-1140.824,-12.755],[-1111.02,-27.655],[-1093.199,-18.138],[-1107.977,2.771],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1097.138,16.259],[-1076.369,-24.419]]}],"t":62},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[16.159,1.124],[17.409,-0.665],[-0.995,-0.213],[-6.234,1.485],[0.427,-7.487],[6.349,-7.978],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-4.611,6.958],[1.856,22.561]],"o":[[-20.605,-1.433],[-1.017,0.039],[12.676,2.713],[11.57,-2.756],[-0.59,10.336],[-6.516,8.188],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[9.649,-14.56],[-0.957,-11.631]],"v":[[-1093.373,-51.23],[-1141.746,-32.091],[-1133.475,-20.654],[-1102.772,-32.445],[-1085.944,-21.623],[-1109.41,3.533],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1097.453,16.179],[-1068.65,-26.77]]}],"t":90},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[14.773,-3.009],[15.491,-4.373],[-0.903,0.092],[-5.633,2.521],[-3.699,-5.792],[3.19,-8.191],[2.303,-13.237],[-3.222,0.337],[-0.635,3.176],[-2.254,7.153],[6.899,16.744]],"o":[[-18.713,3.716],[-0.914,0.266],[11.306,-0.966],[10.226,-4.434],[2.543,7.521],[-3.3,8.342],[-0.387,2.788],[3.222,-0.337],[1.271,-6.352],[9.491,-13.88],[-5.38,-9.122]],"v":[[-1110.694,-46.701],[-1150.381,-22.628],[-1139.864,-12.239],[-1111.677,-29.121],[-1095.789,-20.914],[-1114.487,6.298],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1100.516,14.095],[-1079.818,-31.3]]}],"t":125},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0.8},"s":[{"c":true,"i":[[11.893,-11.59],[11.506,-12.071],[-0.713,0.725],[-4.386,4.67],[-12.267,-2.272],[-3.369,-8.635],[-0.592,-8.821],[-3.222,0.337],[-0.635,3.176],[2.641,7.559],[17.369,4.666]],"o":[[-14.784,14.408],[-0.702,0.736],[8.46,-8.605],[7.435,-7.917],[9.048,1.676],[3.379,8.66],[0.19,2.836],[3.222,-0.337],[1.271,-6.352],[-5.157,-14.761],[-14.565,-3.912]],"v":[[-1180.132,-13.732],[-1203.483,12.613],[-1188.302,20.827],[-1169.568,1.139],[-1141.384,-7.459],[-1125.029,12.041],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1106.877,9.767],[-1138.181,-25.116]]}],"t":142},{"i":{"x":0.62,"y":0.62},"o":{"x":0.45,"y":0.45},"s":[{"c":true,"i":[[11.893,-11.59],[11.506,-12.071],[-0.713,0.725],[-4.386,4.67],[-11.16,0.456],[-3.369,-8.635],[-0.592,-8.821],[-3.222,0.337],[-0.635,3.176],[2.641,7.559],[15.075,1.637]],"o":[[-14.784,14.408],[-0.702,0.736],[8.46,-8.605],[7.435,-7.917],[9.194,-0.375],[3.379,8.66],[0.19,2.836],[3.222,-0.337],[1.271,-6.352],[-5.157,-14.761],[-14.993,-1.628]],"v":[[-1190.761,-2.477],[-1212.088,20.714],[-1196.907,28.928],[-1180.197,12.395],[-1149.015,0.35],[-1125.029,12.041],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1106.877,9.767],[-1145.812,-17.307]]}],"t":204},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[14.773,-3.009],[15.491,-4.373],[-0.903,0.092],[-5.633,2.521],[-3.699,-5.792],[3.19,-8.191],[2.303,-13.237],[-3.222,0.337],[-0.635,3.176],[-2.254,7.153],[6.899,16.744]],"o":[[-18.713,3.716],[-0.914,0.266],[11.306,-0.966],[10.226,-4.434],[2.543,7.521],[-3.3,8.342],[-0.387,2.788],[3.222,-0.337],[1.271,-6.352],[4.836,-14.625],[-5.38,-9.122]],"v":[[-1121.575,-39.041],[-1161.814,-17.56],[-1151.297,-7.171],[-1124.484,-21.528],[-1107.222,-15.846],[-1114.487,6.298],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1100.516,14.095],[-1091.251,-26.232]]}],"t":235},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.35},"s":[{"c":true,"i":[[16.196,-0.298],[17.288,-2.157],[-1.01,-0.127],[-6.726,2.164],[0.424,-7.797],[6.798,-7.556],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-4.513,6.428],[1.348,22.734]],"o":[[-21.185,0.398],[-1.01,0.126],[12.863,1.614],[11.287,-3.679],[-0.658,10.224],[-7.707,8.03],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[10.979,-14.26],[-0.727,-12.264]],"v":[[-1096.637,-50.072],[-1142.905,-26.494],[-1133.683,-15.81],[-1103.879,-30.71],[-1088.032,-23.044],[-1107.977,2.771],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1097.138,16.259],[-1070.594,-27.36]]}],"t":274},{"i":{"x":0.833,"y":1},"o":{"x":0.35,"y":0.35},"s":[{"c":true,"i":[[16.196,-0.298],[17.288,-2.157],[-1.01,-0.127],[-6.726,2.164],[0.424,-7.797],[6.798,-7.556],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-4.513,6.428],[1.348,22.734]],"o":[[-21.185,0.398],[-1.01,0.126],[12.863,1.614],[11.287,-3.679],[-0.658,10.224],[-7.707,8.03],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[10.979,-14.26],[-0.727,-12.264]],"v":[[-1096.637,-50.072],[-1142.905,-26.494],[-1133.683,-15.81],[-1103.879,-30.71],[-1088.032,-23.044],[-1107.977,2.771],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1097.138,16.259],[-1070.594,-27.36]]}],"t":305},{"i":{"x":0.731,"y":1},"o":{"x":0.226,"y":0.156},"s":[{"c":true,"i":[[16.189,-0.55],[17.288,-2.157],[-1.01,-0.127],[-12.162,3.423],[-2.606,-10.311],[10.601,-3.992],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-3.685,1.943],[4.904,23.433]],"o":[[-25.696,0.872],[-1.01,0.126],[12.863,1.614],[11.264,-3.17],[2.337,9.249],[-17.784,6.696],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[22.237,-11.724],[-3.586,-17.133]],"v":[[-1086.781,-55.194],[-1130.649,-28.594],[-1121.427,-17.909],[-1089.709,-37.184],[-1070.818,-26.143],[-1095.856,-3.676],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1094.474,16.935],[-1053.633,-29.618]]}],"t":335},{"i":{"x":0.55,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[16.093,-1.845],[11.125,-8.191],[-0.914,0.447],[-6.687,1.433],[-5.573,-5.245],[-0.129,-7.479],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-1.152,8.267],[5.449,11.749]],"o":[[-20.539,2.355],[-0.819,0.603],[14.003,-6.85],[11.055,-2.368],[5.006,4.712],[0.18,10.463],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[1.969,-14.129],[-4.595,-9.908]],"v":[[-1138.584,-33.109],[-1178.883,-14.629],[-1168.792,-1.954],[-1143.238,-13.056],[-1122.45,-9.265],[-1117.496,6.947],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1099.381,16.15],[-1103.426,-14.879]]}],"t":387},{"s":[{"c":true,"i":[[16.189,-0.55],[17.288,-2.157],[-1.01,-0.127],[-12.162,3.423],[-2.606,-10.311],[10.601,-3.992],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-3.685,1.943],[4.904,23.433]],"o":[[-25.696,0.872],[-1.01,0.126],[12.863,1.614],[11.264,-3.17],[2.337,9.249],[-17.784,6.696],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[22.237,-11.724],[-3.586,-17.133]],"v":[[-1086.781,-55.194],[-1130.649,-28.594],[-1121.427,-17.909],[-1089.709,-37.184],[-1070.818,-26.143],[-1095.856,-3.676],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1094.474,16.935],[-1053.633,-29.618]]}],"t":450}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.866666674614,0.866666674614,0.86274510622,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-78.686,-16.815]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Tank hose","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.068,0.243],[4.75,-0.388],[2.069,-7.9],[-2.31,-4.314],[2.841,-15.555],[6.064,-5.896],[-2.385,-5.098],[-7.227,0.444],[-3.119,1.172],[-2.111,6.054],[-0.222,9.997],[2.833,11.369],[2.563,1.932]],"o":[[-4.285,-0.503],[-4.594,0.376],[-0.504,1.924],[6.477,12.098],[-1.871,10.244],[-1.5,1.458],[2.385,5.098],[4.954,-0.304],[6.001,-2.256],[3.656,-10.484],[0.231,-10.374],[-0.776,-3.114],[-1.662,-1.253]],"v":[[-1041.765,-2.261],[-1045.242,-2.633],[-1061.311,3.45],[-1055.682,6.471],[-1050.376,49.613],[-1060.842,79.482],[-1065.555,85.631],[-1051.61,88.648],[-1042.27,87.81],[-1030.49,70.791],[-1026.302,41.208],[-1028.238,9.117],[-1034.43,0.412]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[1,0.752941191196,0.054901961237,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-116.188,-0.01]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Tank strap 2","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.068,0.243],[4.75,-0.388],[2.069,-7.9],[-2.31,-4.314],[2.841,-15.555],[6.064,-5.896],[-2.385,-5.098],[-7.227,0.444],[-3.119,1.172],[-2.111,6.054],[-0.222,9.997],[2.833,11.369],[2.563,1.932]],"o":[[-4.285,-0.503],[-4.594,0.376],[-0.504,1.924],[6.477,12.098],[-1.871,10.244],[-1.5,1.458],[2.385,5.098],[4.954,-0.304],[6.001,-2.256],[3.656,-10.484],[0.231,-10.374],[-0.776,-3.114],[-1.662,-1.253]],"v":[[-1041.765,-2.261],[-1055.155,-2.161],[-1071.224,3.922],[-1065.596,6.943],[-1060.289,50.085],[-1070.756,79.953],[-1075.469,86.103],[-1051.61,88.648],[-1042.27,87.81],[-1030.49,70.791],[-1026.302,41.208],[-1028.238,9.117],[-1034.43,0.412]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[1,0.752941191196,0.054901961237,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Tank strap","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[2.674,-5.377],[-0.984,-2.083],[-1.516,-0.803],[-4.456,0.202],[-3.039,1.633],[0.48,3.389],[3.946,1.506],[3.27,-1.329]],"o":[[-5.67,-2.103],[-1.026,2.063],[0.728,1.542],[3.933,2.083],[3.454,-0.156],[3.039,-1.633],[-0.587,-4.145],[-3.298,-1.259],[0,0]],"v":[[-1109.03,26.342],[-1127.512,33.158],[-1127.955,39.812],[-1124.309,43.299],[-1111.24,45.231],[-1101.18,43.131],[-1096.235,34.819],[-1105.074,26.68],[-1117.548,26.491]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[1,0.752941191196,0.054901961237,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-78.686,-16.815]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Tank valve","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[18.439,-0.647],[43.24,-5.798],[3.119,-4.413],[0.438,-2.965],[-1.431,-10.009],[-1.016,-1.664],[-1.774,-0.81],[-14.615,-0.979],[-35.21,-2.358],[-20.032,4.919],[-2.24,3.361],[-0.225,3.035],[-0.422,5.692],[9.605,7.903],[5.137,1.114]],"o":[[-43.6,1.531],[-5.356,0.718],[-1.73,2.448],[-1.572,10.629],[0,0],[1.016,1.664],[13.325,6.084],[35.21,2.358],[20.581,1.378],[3.922,-0.963],[1.688,-2.533],[0.422,-5.692],[0.919,-12.405],[-4.059,-3.34],[-18.032,-3.91]],"v":[[-1079.871,6.375],[-1211.109,8.812],[-1225.538,15.081],[-1228.247,23.565],[-1228.082,61.031],[-1226.697,71.34],[-1222.083,74.789],[-1183.443,80.779],[-1077.099,83.568],[-1015.516,81.375],[-1005.177,75.629],[-1002.401,60.065],[-1001.726,49.798],[-1010.32,15.022],[-1024.734,9.009]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Tank stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-0.422,5.692],[9.605,7.903],[5.137,1.114],[18.44,-0.647],[43.24,-5.798],[3.119,-4.413],[0.438,-2.965],[0.061,-0.432],[-36.056,-2.367],[1.375,15.964],[-0.06,0.808]],"o":[[0.919,-12.405],[-4.059,-3.34],[-18.032,-3.91],[-43.6,1.531],[-5.356,0.718],[-1.73,2.448],[-0.064,0.431],[4.14,35.561],[42.24,2.459],[0.093,-0.815],[0.422,-5.692]],"v":[[-1001.547,49.738],[-1010.142,14.963],[-1024.555,8.949],[-1079.693,6.315],[-1210.93,8.753],[-1225.359,15.022],[-1228.068,23.505],[-1228.249,24.801],[-1127.788,73.266],[-1002.751,61.975],[-1002.222,60.005]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.039215687662,0.184313729405,0.674509823322,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Tank fill","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[42.24,2.459],[5.083,37.712],[-1.808,-13.275],[-0.882,-1.446],[-1.774,-0.81],[-14.615,-0.979],[-35.21,-2.358],[-20.032,4.919],[-2.24,3.361],[-0.255,2.244]],"o":[[-36.056,-2.367],[-1.362,9.576],[0.212,1.56],[1.016,1.664],[13.325,6.084],[35.21,2.358],[20.581,1.378],[3.922,-0.963],[1.238,-1.858],[-4.41,14.363]],"v":[[-1126.914,71.709],[-1227.937,22.501],[-1227.69,61.028],[-1226.518,71.28],[-1221.905,74.73],[-1183.264,80.719],[-1076.92,83.508],[-1015.337,81.315],[-1004.998,75.569],[-1002.256,60.365]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Tank shadow","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-1116.402,24.689]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1116.402,24.689]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Tank","np":7,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-4.289,-8.926],[-18.405,-1.77],[-34.442,-2.169],[-29.248,16.919],[3.431,4.239],[0,0]],"o":[[4.585,9.542],[43.588,4.192],[34.297,2.16],[7.211,-4.171],[-65.933,-10.005],[0,0]],"v":[[-1232.34,76.162],[-1198.149,90.561],[-1103.431,91.164],[-1000.586,83.998],[-999.104,70.33],[-1205.137,64.677]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.964705884457,0.549019634724,0.129411771894,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Body tank shadow","np":2,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":28,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-884.232,101.187,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-884.232,101.187,0]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":0},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-36],"t":59.881},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[15],"t":119.76},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-27],"t":179.637},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[14],"t":239.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-26],"t":299.396},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[14],"t":359.277},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-24],"t":419.156},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":479},{"s":[-1],"t":479.037109375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Front fin","op":480,"parent":29,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[0.1,-6.191],[3.656,-7.718],[-7.571,-6.481],[-3.118,-3.162],[-4.545,-2.559],[1.241,5.726],[3.206,1.465]],"o":[[0,0],[-0.139,8.603],[1.627,1.231],[4.956,4.243],[2.555,2.591],[5.227,2.944],[-0.323,-1.491],[-2.1,-0.96]],"v":[[-873.706,108.59],[-879.875,111.255],[-885.961,126.219],[-867.834,133.039],[-854.568,148.966],[-846.883,157.007],[-849.682,137.796],[-861.876,114.839]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.046,1.808],[0.622,-6.073],[4.047,-7.52],[-6.739,-6.228],[-2.957,-3.476],[-2.947,-2.52],[1.22,6.36],[3.289,2.864]],"o":[[-0.588,-0.205],[-0.872,8.512],[1.562,1.313],[4.524,4.182],[2.679,3.149],[3.963,2.893],[-0.585,-2.74],[-2.079,-1.81]],"v":[[-873.78,106.277],[-880.145,108.532],[-888.012,124.128],[-871.094,132.336],[-861.013,146.994],[-853.736,157.178],[-854.1,135.197],[-862.652,114.038]]}],"t":11.977},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.96,2.502],[0.454,-6.021],[3.656,-7.718],[-6.601,-5.385],[-3.168,-3.428],[-1.845,-2.205],[1.796,6.759],[3.595,3.746]],"o":[[-1.095,-0.319],[-0.681,8.498],[1.627,1.231],[4.546,3.696],[3.071,3.354],[3.171,2.472],[-1.059,-3.719],[-2.226,-2.32]],"v":[[-872.735,98.118],[-879.036,100.623],[-886.904,117.446],[-870.264,125.203],[-861.487,137.822],[-853.611,149.084],[-854.009,124.884],[-861.491,106.076]]}],"t":21.955},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.595,1.339],[0.807,-5.851],[3.656,-7.718],[-5.631,-4.288],[-2.57,-1.979],[-5.078,-4.109],[4.042,5.397],[4.791,3.166]],"o":[[-2.191,-0.639],[-1.223,8.392],[1.627,1.231],[4.136,3.15],[5.52,4.25],[5.513,4.461],[-3.42,-4.565],[-3.993,-2.639]],"v":[[-869.833,85.277],[-874.677,90.115],[-879.407,101.286],[-862.238,105.681],[-853.655,112.26],[-835.53,127.19],[-843.868,103.291],[-857.756,90.05]]}],"t":43.912},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.906,1.853],[1.064,-5.727],[3.656,-7.718],[-5.026,-3.369],[-3.884,-3.042],[-1.39,-1.074],[8.124,9.252],[4.287,5.057]],"o":[[-2.151,-0.798],[-1.616,8.316],[1.627,1.231],[3.973,2.63],[5.131,4.018],[0.557,1],[-4.113,-4.684],[-2.947,-3.466]],"v":[[-865.495,81.358],[-872.023,83.587],[-878.109,98.551],[-864.094,103.369],[-852.713,112.829],[-837.057,124.541],[-844.696,105.847],[-852.882,90.77]]}],"t":59.881},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.139,2.239],[1.257,-5.634],[3.656,-7.718],[-4.572,-2.679],[-3.282,-3.243],[-0.347,-0.269],[3.277,7.105],[4.043,4.4]],"o":[[-2.12,-0.918],[-1.289,8.129],[1.627,1.231],[3.85,2.24],[6.035,5.965],[0.139,0.25],[-2.209,-5.713],[-4.19,-4.511]],"v":[[-869.168,82.315],[-875.062,84.841],[-879.662,100.158],[-866.132,104.583],[-854.844,112.58],[-838.544,126.374],[-845.011,108.446],[-854.067,93.052]]}],"t":71.855},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-3.751,-2.506],[0,0],[1.661,6.389],[3.962,4.181]],"o":[[-2.11,-0.958],[-1.179,8.066],[1.627,1.231],[3.809,2.11],[6.09,4.069],[0,0],[-1.575,-6.056],[-4.604,-4.86]],"v":[[-870.392,82.634],[-876.074,85.259],[-880.179,100.693],[-866.812,104.988],[-855.554,112.497],[-837.29,124.714],[-845.116,109.312],[-854.462,93.812]]}],"t":75.848},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.155,1.287],[0.968,-5.652],[3.027,-7.985],[-4.846,-1.589],[-4.52,-1.258],[0.909,0.167],[3.411,5.088],[4.388,3.113]],"o":[[-2.2,-0.525],[-0.985,8.208],[1.72,1.097],[4.289,1.341],[7.016,2.06],[-2.741,-0.504],[-2.935,-4.65],[-4.843,-3.512]],"v":[[-873.179,84.575],[-878.85,87.591],[-882.671,103.307],[-868.814,105.908],[-855.249,109.998],[-834.016,116.985],[-845.812,104.178],[-857.382,92.154]]}],"t":81.834},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.735,0.576],[1.578,-5.479],[3.656,-7.718],[-5.174,-1.174],[-5.495,-0.131],[2.38,0.638],[5.212,3.603],[4.397,2.242]],"o":[[-2.218,-0.27],[-2.404,8.163],[1.627,1.231],[4.765,0.961],[8.059,0.192],[-7.177,-1.925],[-4.185,-2.893],[-4.449,-2.269]],"v":[[-875.808,96.19],[-882.053,98.622],[-888.723,113.856],[-874.724,116.57],[-858.303,117.823],[-833.794,120.565],[-849.373,109.673],[-861.984,101.076]]}],"t":91.816},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.831,1.159],[1.803,-5.371],[4.96,-6.597],[-5.834,-0.058],[-4.895,0.501],[7.618,5.671],[9.798,2.654],[4.953,2.346]],"o":[[-4.573,-1.384],[-2.749,8.096],[1.627,1.231],[5.602,-0.044],[9.287,-1.29],[-4.779,-3.558],[-5.408,-1.465],[-3.617,-1.713]],"v":[[-873.049,106.128],[-882.642,109.469],[-891.196,123.508],[-871.409,127.549],[-853.145,127.94],[-823.963,125.792],[-845.054,115.421],[-861.569,111.07]]}],"t":105.787},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.028,-5.263],[3.656,-7.718],[-4.62,-2.003],[-5.866,-4.115],[-2.657,9.85],[3.676,5.628],[4.741,4.106]],"o":[[0,0],[-3.093,8.029],[1.627,1.231],[6.186,2.682],[5.017,3.519],[1.776,-6.583],[-3.43,-5.251],[-3.752,-3.25]],"v":[[-872.989,109.462],[-879.875,111.255],[-885.961,126.219],[-870.654,130.678],[-855.561,139.401],[-833.849,145.118],[-848.063,131.053],[-859.775,116.327]]}],"t":119.76},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.581,1.911],[2.028,-5.263],[4.372,-6.996],[-4.74,-4.98],[-3.119,-4.279],[-6.064,3.449],[2.267,8.341],[5.2,6.121]],"o":[[-2.657,-1.109],[-3.093,8.029],[1.627,1.231],[4.009,4.212],[4.74,6.504],[6.112,-3.476],[-2.206,-8.113],[-3.124,-3.677]],"v":[[-871.882,108.396],[-881.358,107.322],[-889.714,122.801],[-872.654,129.349],[-862.237,143.673],[-847.08,163.024],[-847.521,137.073],[-859.775,116.327]]}],"t":135.729},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.636,1.743],[2.233,-5.179],[4.746,-6.94],[-4.06,-4.164],[-3.719,-5.084],[-6.36,-3.172],[2.315,9.663],[5.225,7.089]],"o":[[-2.219,-0.864],[-3.406,7.901],[1.577,1.294],[4.093,4.13],[4.053,5.643],[4.963,1.421],[-1.674,-6.989],[-2.909,-3.946]],"v":[[-875.257,100.755],[-882.818,101.478],[-891.087,116.393],[-876.451,122.106],[-865.512,135.665],[-853.232,152.189],[-854.024,128.57],[-862.984,109.062]]}],"t":143.711},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.791,1.297],[2.028,-5.263],[4.545,-7.215],[-3.83,-3.268],[-4.513,-5.425],[-6.792,-7.697],[3.048,10.473],[5.704,7.463]],"o":[[-1.947,-0.527],[-3.093,8.029],[1.627,1.231],[4.433,3.782],[3.919,4.711],[4.193,4.752],[-1.753,-6.022],[-3.014,-3.944]],"v":[[-876.958,92.934],[-883.025,95.523],[-890.194,110.562],[-877.003,114.639],[-864.758,126.855],[-853.518,140.394],[-856.193,118.609],[-864.008,100.671]]}],"t":149.699},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.872,1.106],[1.854,-5.327],[3.883,-7.581],[-3.936,-3.14],[-4.689,-5.274],[-8.102,-6.823],[6.547,9.84],[5.947,7.271]],"o":[[-2.217,-0.503],[-2.828,8.126],[1.667,1.177],[4.555,3.635],[4.072,4.58],[4.794,4.077],[-3.205,-5.149],[-3.142,-3.842]],"v":[[-874.602,78.917],[-880.488,82.653],[-886.655,97.868],[-872.343,101.654],[-860.509,112.993],[-847.74,123.943],[-850.236,104.703],[-860.808,87.121]]}],"t":163.67},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.028,-5.263],[3.656,-7.718],[-3.83,-3.268],[-4.513,-5.425],[-9.109,-6.387],[9.844,9.566],[5.704,7.463]],"o":[[0,0],[-3.094,8.029],[1.627,1.231],[4.433,3.782],[3.919,4.711],[5.188,3.638],[-4.498,-4.371],[-3.014,-3.944]],"v":[[-869.357,78.04],[-876.244,79.833],[-882.33,94.797],[-867.022,99.256],[-856.469,110.413],[-842.739,119.291],[-843.672,102.806],[-856.143,84.905]]}],"t":179.637},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.776,1.328],[1.674,-5.433],[3.656,-7.718],[-3.953,-3.022],[-4.074,-3.552],[-4.554,-3.194],[5.753,7.978],[5.007,6.654]],"o":[[-1.055,-0.479],[-2.552,8.134],[3.442,0.999],[5.02,3.839],[4.246,3.702],[2.594,1.819],[-3.036,-5.214],[-2.964,-3.947]],"v":[[-871.38,79.555],[-878.135,81.508],[-883.69,96.848],[-871.502,100.428],[-857.487,113.235],[-845.018,124.326],[-847.67,106.33],[-857.674,88.904]]}],"t":187.621},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.356,2.107],[1.409,-5.561],[3.656,-7.718],[-3.21,-3.777],[-2.986,-3.254],[-1.139,-0.798],[2.684,6.787],[4.484,6.047]],"o":[[-1.846,-0.838],[-2.146,8.213],[4.804,0.824],[3.092,3.638],[4.028,4.352],[0.649,0.455],[-1.94,-5.846],[-2.926,-3.949]],"v":[[-872.897,80.692],[-879.553,82.764],[-884.711,98.386],[-872.179,105.061],[-861.177,116.351],[-847.972,129.929],[-850.669,108.974],[-858.823,91.902]]}],"t":193.611},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-2.768,-2.944],[0,0],[1.661,6.389],[4.31,5.844]],"o":[[-2.11,-0.958],[-2.01,8.239],[5.258,0.766],[3.809,2.11],[4.043,4.3],[0,0],[-1.575,-6.056],[-2.913,-3.95]],"v":[[-873.402,81.07],[-880.026,83.183],[-885.051,98.899],[-870.761,105.412],[-861.357,113.669],[-845.354,127.282],[-851.669,109.855],[-859.206,92.902]]}],"t":195.605},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.125,1.61],[1.064,-5.637],[3.258,-7.386],[-4.697,-1.851],[-3.49,-2.122],[0.609,0.091],[2.822,5.416],[4.858,5.064]],"o":[[-2.191,-0.65],[-1.633,8.319],[4.396,0.682],[4.122,1.573],[5.664,3.275],[-1.838,-0.273],[-2.917,-5.252],[-3.3,-3.435]],"v":[[-875.295,83.091],[-881.129,85.957],[-886.207,101.522],[-871.216,104.934],[-859.221,111.214],[-840.817,120.565],[-850.911,106.273],[-860.85,92.354]]}],"t":199.598},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.033,0.853],[0.807,-5.671],[2.859,-7.054],[-4.973,-1.252],[-4.212,-1.301],[1.219,0.181],[3.983,4.443],[5.406,4.284]],"o":[[-2.271,-0.342],[-1.256,8.4],[3.534,0.599],[4.435,1.036],[7.285,2.25],[-3.675,-0.546],[-4.259,-4.447],[-3.686,-2.921]],"v":[[-877.188,85.111],[-882.231,88.731],[-887.362,104.145],[-872.783,107.112],[-859.133,110.782],[-839.057,117.153],[-851.226,103.875],[-862.493,91.807]]}],"t":203.59},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.589,0.477],[1.578,-5.479],[3.656,-7.718],[-5.174,-1.174],[-5.495,-0.131],[2.38,0.638],[5.237,3.348],[5.439,3.916]],"o":[[-2.324,-0.242],[-2.404,8.163],[1.627,1.231],[4.765,0.961],[8.059,0.192],[-7.177,-1.925],[-5.872,-3.754],[-3.744,-2.696]],"v":[[-877.724,94.557],[-884.553,97.259],[-890.639,112.223],[-876.64,114.937],[-860.218,116.19],[-835.995,117.78],[-852.16,108.988],[-864.253,99.388]]}],"t":211.574},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.991,0.303],[2.275,-5.189],[4.304,-7.376],[-5.807,-0.558],[-4.92,0.079],[7.104,6.303],[8.323,0.683],[4.734,2.762]],"o":[[-2.488,-0.189],[-3.432,7.831],[1.516,1.366],[5.585,0.436],[9.363,-0.49],[-4.457,-3.955],[-5.584,-0.458],[-3.457,-2.017]],"v":[[-874.642,106.378],[-881.614,109.1],[-888.96,123.487],[-874.575,126.059],[-855.983,125.846],[-826.561,118.69],[-848.241,114.851],[-863.359,110.484]]}],"t":225.547},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.028,-5.263],[3.656,-7.718],[-4.62,-2.003],[-5.866,-4.115],[-2.657,9.85],[3.676,5.628],[4.741,4.106]],"o":[[0,0],[-3.093,8.029],[1.627,1.231],[6.186,2.682],[5.017,3.519],[1.776,-6.583],[-3.43,-5.251],[-3.752,-3.25]],"v":[[-872.989,109.462],[-879.875,111.255],[-885.961,126.219],[-870.654,130.678],[-855.561,139.401],[-833.849,145.118],[-848.063,131.053],[-859.775,116.327]]}],"t":239.518},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.763,1.395],[1.37,-4.367],[4.564,-6.521],[-4.344,-3.062],[-3.489,-4.133],[-8.645,3.125],[3.261,7.637],[5.255,5.897]],"o":[[-1.708,-0.5],[-2.575,8.21],[1.627,1.231],[4.335,3.056],[4.779,5.66],[6.613,-2.391],[-2.758,-6.459],[-3.358,-3.62]],"v":[[-876.348,105.687],[-882.063,106.918],[-889.909,122.181],[-875.984,125.97],[-865.284,139.539],[-848.427,155.594],[-849.473,133.102],[-863.723,112.29]]}],"t":255.486},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.785,2.52],[1.429,-4.179],[4.74,-6.769],[-3.703,-3.578],[-3.576,-5.248],[-7.245,-3.795],[2.207,9.523],[4.812,7.304]],"o":[[-0.707,-0.286],[-2.9,8.481],[1.497,1.387],[4.026,3.889],[3.759,5.517],[5.037,2.201],[-1.558,-6.395],[-2.769,-4.099]],"v":[[-878.127,102.339],[-884.634,103.25],[-892.936,117.591],[-879.976,122.765],[-869.514,137.286],[-857.5,152.641],[-857.278,130.466],[-865.888,110.863]]}],"t":263.469},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.938,2.339],[0.767,-4.243],[3.656,-7.718],[-3.83,-3.268],[-4.513,-5.425],[-6.792,-7.697],[3.048,10.473],[5.704,7.463]],"o":[[0,0],[-1.648,9.114],[1.627,1.231],[4.433,3.782],[3.919,4.711],[4.193,4.752],[-1.753,-6.022],[-3.014,-3.944]],"v":[[-877.892,94.388],[-884.779,96.181],[-890.865,111.145],[-877.844,115.066],[-865.131,128.363],[-854.189,140.976],[-856.864,119.191],[-864.571,102.157]]}],"t":269.459},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.89,1.422],[0.88,-4.488],[3.67,-7.027],[-4.002,-3.056],[-5.377,-4.495],[-8.395,-6.553],[7.205,9.613],[6.101,7.143]],"o":[[-1.241,-0.243],[-1.662,8.738],[1.691,1.141],[4.632,3.536],[4.377,3.71],[4.942,3.895],[-3.491,-4.959],[-3.224,-3.774]],"v":[[-874.72,80.19],[-880.148,82.854],[-885.918,97.859],[-872.357,100.927],[-858.762,113.066],[-845.776,122.997],[-848.547,104.161],[-859.699,87.801]]}],"t":285.426},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.813,1.215],[1.433,-4.601],[4.387,-6.031],[-3.83,-3.268],[-5.66,-4.215],[-9.109,-6.387],[9.844,9.566],[5.704,7.463]],"o":[[-2.3,-0.58],[-2.56,8.215],[1.627,1.231],[4.433,3.782],[4.389,3.268],[5.188,3.638],[-4.498,-4.371],[-3.014,-3.944]],"v":[[-871.468,77.46],[-875.874,80.326],[-882.879,94.739],[-869.194,98.431],[-856.1,110.906],[-842.37,119.784],[-843.303,103.299],[-855.775,86.44]]}],"t":299.396},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-3.071,-2.626],[0,0],[1.661,6.389],[4.31,5.844]],"o":[[-2.11,-0.958],[-2.01,8.239],[1.627,1.231],[3.809,2.11],[5.036,4.306],[0,0],[-1.575,-6.056],[-2.913,-3.95]],"v":[[-873.875,82.145],[-880.498,84.258],[-886.584,99.222],[-873.217,103.517],[-862.573,111.45],[-844.783,125.302],[-853.026,109.107],[-860.739,93.225]]}],"t":315.365},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.221,1.215],[1.578,-5.479],[3.656,-7.718],[-5.174,-1.174],[-5.495,-0.131],[2.38,0.638],[4.891,3.976],[5.854,3.264]],"o":[[-2.276,-0.529],[-2.404,8.163],[1.627,1.231],[4.765,0.961],[8.059,0.192],[-7.177,-1.925],[-5.408,-4.396],[-4.898,-2.731]],"v":[[-876.932,93.515],[-883.798,96.931],[-889.884,111.895],[-875.885,114.609],[-859.463,115.862],[-835.063,117.46],[-851.003,107.786],[-863.649,98.515]]}],"t":331.334},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.869,1.025],[1.098,-3.689],[3.656,-7.718],[-5.834,-0.058],[-4.895,0.501],[5.706,7.592],[10.221,1.283],[4.953,2.346]],"o":[[-3.158,-0.836],[-2.439,8.195],[1.627,1.231],[5.602,-0.044],[9.287,-1.29],[-3.562,-4.739],[-5.559,-0.698],[-3.617,-1.713]],"v":[[-877.455,104.384],[-882.744,108.518],[-890.3,123.392],[-875.617,125.424],[-857.28,125.648],[-830.887,118.242],[-850.471,111.299],[-865.908,108.243]]}],"t":345.305},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.028,-5.263],[3.656,-7.718],[-4.62,-2.003],[-5.866,-4.115],[-2.657,9.85],[3.676,5.628],[4.741,4.106]],"o":[[0,0],[-3.093,8.029],[1.627,1.231],[6.186,2.682],[5.017,3.519],[1.776,-6.583],[-3.43,-5.251],[-3.752,-3.25]],"v":[[-872.989,109.462],[-879.875,111.255],[-885.961,126.219],[-870.654,130.678],[-855.561,139.401],[-833.849,145.118],[-848.063,131.053],[-859.775,116.327]]}],"t":359.277},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.631,1.786],[1.353,-3.356],[4.559,-7.221],[-3.845,-3.164],[-4.306,-6.01],[-6.745,6.245],[2.317,7.974],[4.506,6.487]],"o":[[-2.213,-0.853],[-3.218,7.98],[1.467,1.418],[4.819,3.878],[3.538,4.938],[4.428,-4.099],[-1.959,-6.745],[-2.898,-3.998]],"v":[[-874.583,105.651],[-881.693,106.249],[-889.335,121.604],[-874.677,127.875],[-864.579,140.693],[-847.489,157.693],[-850.51,137.318],[-862.148,114.94]]}],"t":375.246},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.731,1.502],[1.64,-5.396],[4.211,-6.688],[-3.627,-3.492],[-4.179,-5.687],[-6.317,-8.091],[2.414,10.637],[5.246,7.792]],"o":[[-2.261,-0.718],[-1.711,5.63],[1.55,1.327],[4.198,4.042],[3.629,4.938],[3.9,4.995],[-1.388,-6.116],[-2.772,-4.118]],"v":[[-877.856,94.473],[-885.269,96.893],[-892.243,111.464],[-879.51,116.139],[-867.94,129.103],[-857.426,143.446],[-858.787,121.54],[-865.763,104.22]]}],"t":389.217},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.557,0.17],[1.067,-5.534],[2.924,-7.645],[-4.154,-2.841],[-5.062,-4.913],[-8.554,-6.174],[7.224,9.228],[6.462,6.812]],"o":[[-1.247,-0.213],[-1.401,7.01],[1.748,1.051],[4.808,3.289],[4.395,4.266],[5.06,3.699],[-3.544,-4.859],[-3.415,-3.599]],"v":[[-875.661,80.253],[-882.466,83.35],[-886.926,98.869],[-872.493,101.475],[-859.831,111.947],[-846.303,121.968],[-850.128,102.938],[-862.006,86.833]]}],"t":403.189},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.028,-5.263],[3.656,-7.718],[-3.83,-3.268],[-5.63,-4.255],[-9.109,-6.387],[9.844,9.566],[5.704,7.463]],"o":[[0,0],[-3.093,8.029],[1.627,1.231],[4.433,3.782],[5.039,3.808],[5.188,3.638],[-4.498,-4.371],[-3.014,-3.944]],"v":[[-871.406,77.876],[-878.293,79.669],[-884.378,94.633],[-870.823,98.938],[-858.518,110.249],[-844.788,119.127],[-845.721,102.642],[-858.192,84.742]]}],"t":419.156},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-3.071,-2.626],[0,0],[1.661,6.389],[4.31,5.844]],"o":[[-2.11,-0.958],[-2.01,8.239],[1.627,1.231],[3.809,2.11],[5.036,4.306],[0,0],[-1.575,-6.056],[-2.913,-3.95]],"v":[[-873.875,82.145],[-880.498,84.258],[-886.584,99.222],[-873.217,103.517],[-862.573,111.45],[-844.783,125.302],[-853.026,109.107],[-860.739,93.225]]}],"t":435.125},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.221,1.215],[1.578,-5.479],[3.656,-7.718],[-5.174,-1.174],[-5.495,-0.131],[2.38,0.638],[4.891,3.976],[5.854,3.264]],"o":[[-2.276,-0.529],[-2.404,8.163],[1.627,1.231],[4.765,0.961],[8.059,0.192],[-7.177,-1.925],[-5.408,-4.396],[-4.898,-2.731]],"v":[[-876.932,93.515],[-883.798,96.931],[-889.884,111.895],[-875.885,114.609],[-859.463,115.862],[-835.063,117.46],[-851.003,107.786],[-863.649,98.515]]}],"t":451.094},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.869,1.025],[1.098,-3.689],[3.656,-7.718],[-5.834,-0.058],[-4.895,0.501],[5.706,7.592],[10.221,1.283],[4.953,2.346]],"o":[[-3.158,-0.836],[-2.439,8.195],[1.627,1.231],[5.602,-0.044],[9.287,-1.29],[-3.562,-4.739],[-5.559,-0.698],[-3.617,-1.713]],"v":[[-877.455,104.384],[-882.744,108.518],[-890.3,123.392],[-875.617,125.424],[-857.28,125.648],[-830.887,118.242],[-850.471,111.299],[-865.908,108.243]]}],"t":465.064},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[0.1,-6.191],[3.656,-7.718],[-7.571,-6.481],[-3.118,-3.162],[-4.545,-2.559],[1.241,5.726],[3.206,1.465]],"o":[[0,0],[-0.139,8.603],[1.627,1.231],[4.956,4.243],[2.555,2.591],[5.227,2.944],[-0.323,-1.491],[-2.1,-0.96]],"v":[[-873.706,108.59],[-879.875,111.255],[-885.961,126.219],[-867.834,133.039],[-854.568,148.966],[-846.883,157.007],[-849.682,137.796],[-861.876,114.839]]}],"t":479},{"s":[{"c":true,"i":[[6.336,0.289],[0.1,-6.191],[3.656,-7.718],[-7.571,-6.481],[-3.118,-3.162],[-4.545,-2.559],[1.241,5.726],[3.206,1.465]],"o":[[0,0],[-0.139,8.603],[1.627,1.231],[4.956,4.243],[2.555,2.591],[5.227,2.944],[-0.323,-1.491],[-2.1,-0.96]],"v":[[-873.706,108.59],[-879.875,111.255],[-885.961,126.219],[-867.834,133.039],[-854.568,148.966],[-846.883,157.007],[-849.682,137.796],[-861.876,114.839]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.68235296011,0.658823549747,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Front fin top","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.367,9.005],[15.747,-6.232],[15.739,10.707],[3.167,10.649],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.925],[-5.612,-6.43],[-4.918,-5.521],[-7.289,-4.03],[-14.011,-0.63],[-10.368,7.724]],"o":[[12.313,-15.05],[-27.355,10.826],[-10.374,-7.058],[-5.517,-18.55],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.719,8.665],[18.88,10.438],[12.748,0.574],[10.569,-7.874]],"v":[[-737.04,157.551],[-756.875,148.321],[-825.1,144.184],[-840.255,113.855],[-865.994,77.069],[-881.654,81.623],[-878.956,110.612],[-885.84,126.215],[-868.405,133.331],[-852.462,151.82],[-829.897,172.994],[-786.622,188.216],[-762.477,180.144]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.588,4.27],[8.096,2.958],[9.506,16.175],[3.39,10.887],[20.604,1.913],[0,0],[2.491,-10.218],[4.206,-4.544],[-4.971,-6.937],[-3.915,-6.247],[-10.02,-12.31],[-9.354,-6.56],[-8.688,2.267]],"o":[[6.649,-5.08],[-17.011,-6.216],[-6.047,-10.289],[-5.169,-17.305],[-8.898,-0.826],[3.86,7.571],[-1.122,4.602],[5.724,2.06],[6.911,9.644],[6.569,10.628],[5.342,6.564],[7.446,5.222],[11.066,-2.888]],"v":[[-760.612,203.089],[-780.083,187.245],[-827.524,147.704],[-839.507,113.966],[-864.354,76.951],[-880.377,79.987],[-880.463,109.101],[-888.807,123.975],[-872.132,132.725],[-857.218,154.109],[-836.941,181.64],[-808.165,210.538],[-781.692,212.491]]}],"t":13.971},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.158,1.019],[3.431,9.602],[8.969,19.033],[4.472,10.733],[20.656,1.218],[0,0],[2.145,-10.296],[4.05,-4.683],[-5.203,-6.766],[-3.87,-6.281],[-3.693,-10.053],[-2.456,-11.66],[-6.719,-2.886]],"o":[[10.011,-0.805],[-6.46,-18.081],[-5.389,-11.216],[-6.545,-16.129],[-8.921,-0.526],[4.113,7.436],[-0.966,4.637],[5.79,1.866],[7.232,9.406],[6.786,11.129],[3.578,9.739],[1.399,6.639],[6.364,2.733]],"v":[[-794.524,222.695],[-794.83,188.816],[-823.464,138.836],[-837.033,104.682],[-863.242,71.567],[-880.185,76.361],[-879.656,102.432],[-887.494,117.578],[-870.533,125.762],[-854.416,147.446],[-839.332,175.815],[-832.847,202.257],[-814.975,219.017]]}],"t":21.955},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.007,-1.863],[-2.601,21.847],[9.255,21.688],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-4.009,-6.213],[1.973,-11.54],[-5.904,-12.722],[-6.408,-6.237]],"o":[[13.75,2.844],[3.026,-25.421],[-5.145,-12.056],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.37,11.422],[-3.468,20.282],[3.21,6.918],[4.74,4.613]],"v":[[-823.342,226.507],[-805.503,189.548],[-817.853,128.155],[-834.021,94.098],[-865.187,62.275],[-880.847,66.829],[-878.149,95.818],[-885.032,111.421],[-867.597,118.537],[-849.625,139.964],[-838.815,169.257],[-853.438,203.188],[-841.768,217.818]]}],"t":29.939},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.173,-0.307],[-0.292,20.456],[12.833,18.632],[6.944,9.653],[20.56,-2.336],[0,0],[0.351,-10.511],[3.188,-5.308],[-6.284,-5.775],[-5.113,-5.3],[0.694,-11.687],[-6.003,-10.862],[-6.632,-3.389]],"o":[[13.08,0.502],[0.365,-25.597],[-7.783,-11.107],[-9.824,-13.657],[-8.879,1.009],[5.325,6.622],[-0.158,4.734],[6.024,0.847],[8.736,8.029],[10.089,10.333],[-1.22,20.54],[4.157,7.523],[5.697,2.633]],"v":[[-810.961,203.449],[-790.205,171.167],[-810.462,110.241],[-832.201,79.712],[-866.672,51.503],[-880.017,56.34],[-874.153,84.858],[-879.282,101.122],[-861.171,106.281],[-838.635,124.239],[-822.786,152.996],[-844.395,182.368],[-826.083,199.328]]}],"t":43.912},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.341,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-811.237,208.504],[-792.806,182.132],[-810.329,115.034],[-830.973,83.819],[-862.138,51.997],[-873.802,53.955],[-871.104,82.944],[-877.988,98.547],[-860.552,105.663],[-837.318,124.725],[-821.068,161.753],[-843.392,196.62],[-822.493,206.242]]}],"t":59.881},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.89,2.029],[8.663,12.792],[15.292,14.622],[6.578,9.906],[20.633,-1.567],[0,0],[0.744,-10.491],[3.385,-5.185],[-6.064,-6.006],[-5.439,-5.009],[-13.943,-17.582],[-9.938,1.212],[-3.61,0.603]],"o":[[7.576,-3.952],[-13.25,-15.548],[-10.238,-9.746],[-9.307,-14.015],[-8.911,0.677],[5.074,6.817],[-0.335,4.725],[5.988,1.071],[8.43,8.35],[11.429,10.525],[13.094,16.511],[7.318,-0.893],[4.328,-0.723]],"v":[[-763.524,181.686],[-765.566,155.136],[-809.99,109.982],[-832.845,80.347],[-866.237,50.87],[-877.728,53.669],[-872.934,82.387],[-878.667,98.448],[-861.269,105.413],[-837.955,124.608],[-802.512,151.864],[-796.425,190.349],[-785.619,188.405]]}],"t":67.863},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.296,4.464],[10.982,5.579],[11.967,14.426],[5.084,10.749],[20.55,-2.419],[0,0],[0.309,-10.513],[3.167,-5.32],[-6.307,-5.75],[-5.642,-4.78],[-10.522,-5.134],[-12.44,-2.874],[-2.337,2.185]],"o":[[4.53,-6.136],[-22.823,-11.595],[-8.812,-10.623],[-7.191,-15.204],[-8.875,1.045],[5.352,6.601],[-0.139,4.734],[6.027,0.823],[8.768,7.993],[11.855,10.043],[10.194,4.974],[6.467,1.494],[5.578,-5.214]],"v":[[-743.782,164.877],[-779.488,148.365],[-820.685,110.863],[-835.426,79.917],[-870.01,51.847],[-881.375,55.12],[-875.397,83.614],[-880.46,99.899],[-863.135,107.002],[-839.919,126.656],[-796.797,154.702],[-757.654,167.969],[-744.989,167.114]]}],"t":73.852},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.402,4.036],[10.008,-1.427],[14.217,10.782],[8.582,9.116],[19.203,-3.47],[0,0],[-0.105,-10.517],[2.955,-5.441],[-6.65,-2.551],[-7.612,-2.689],[-15.628,-2.233],[-10.783,2.975],[-0.778,3.07]],"o":[[1.27,-12.753],[-16.413,2.34],[-9.154,-6.858],[-9.652,-11.231],[-8.755,1.667],[5.608,6.385],[0.047,4.736],[6.055,0.585],[10.619,3.227],[16.169,4.826],[18.942,2.707],[5.72,-0.894],[0.458,-4.626]],"v":[[-737.576,104.15],[-767.578,108.572],[-818.753,96.357],[-839.319,73.254],[-874.29,55.142],[-885.74,59.377],[-878.645,87.614],[-883.063,104.086],[-862.93,107.386],[-837.5,115.892],[-791.62,127.641],[-745.342,122.895],[-737.736,116.316]]}],"t":81.834},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.325,6.397],[13.09,-8.505],[14.557,9.96],[10.348,9.382],[18.324,-0.925],[0,0],[1.503,-10.409],[3.752,-4.926],[-6.751,-0.643],[-9.163,-2.251],[-15.948,-1.35],[-10.19,6.855],[0.094,3.925]],"o":[[-1.64,-9.035],[-16.003,10.398],[-8.452,-4.795],[-10.231,-9.225],[-8.877,0.591],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[12.2,0.685],[19.849,3.153],[25.561,-0.052],[5.323,-2.24],[-0.496,-5.642]],"v":[[-735.289,83.203],[-756.789,96.994],[-817.543,99.158],[-840.008,79.634],[-872.427,64.972],[-884.69,67.884],[-881.993,96.874],[-888.876,112.477],[-866.495,116.125],[-839.661,118.54],[-792.218,123.011],[-736.679,110.139],[-732.314,98.868]]}],"t":89.818},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.323,6.378],[13.998,-10.278],[12.624,7.635],[8.954,7.559],[15.965,0.707],[0,0],[2.885,-10.114],[4.378,-4.378],[-7.257,-0.429],[-8.118,-1.296],[-13.493,0.587],[-14.475,12.418],[0.565,3.94]],"o":[[-4.297,-8.778],[-16.284,11.957],[-8.756,-3.845],[-9.068,-7.491],[-8.892,-0.181],[3.564,7.715],[-1.299,4.555],[5.64,2.28],[14.244,0.278],[20.373,0.775],[28.307,-5.346],[5.427,-4.342],[-1.292,-6.391]],"v":[[-741.365,73.39],[-759.704,98.41],[-819.111,106.184],[-839.985,90.07],[-868.201,77.759],[-881.313,79.684],[-882.526,108.773],[-891.44,123.312],[-865.517,127.741],[-836.735,128.054],[-789.843,125.415],[-737.776,106.214],[-734.531,90.214]]}],"t":105.787},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.714,4.903],[8.23,-2.543],[13.194,10.37],[6.527,9.109],[18.646,0.627],[0,0],[2.214,-10.281],[4.081,-4.656],[-6.841,-2.858],[-7.504,-3.117],[-11.443,-1.572],[-19.533,3.64],[-2.86,3.044]],"o":[[1.096,-6.213],[-19.813,6.122],[-8.486,-5.848],[-7.23,-10.695],[-8.903,-0.161],[4.063,7.463],[-0.997,4.63],[5.778,1.904],[12.322,4.153],[13.502,3.922],[17.234,2.368],[4.627,-0.862],[2.735,-4.722]],"v":[[-726.647,118.69],[-749.567,126.069],[-818.914,122.514],[-837.853,98.827],[-866.219,78.385],[-880.665,81.183],[-879.963,110.289],[-887.901,125.383],[-865.229,131.302],[-839.747,140.236],[-805.928,147.784],[-746.601,142],[-734.639,134.498]]}],"t":113.771},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.769,4.239],[8.666,0.846],[14.131,12.116],[5.074,10.401],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.925],[-6.85,-4.579],[-7.312,-4.394],[-9.084,-4.803],[-12.107,-1.995],[-5.444,2.787]],"o":[[5.243,-4.887],[-19.907,-1.943],[-8.623,-7.214],[-6.414,-13.148],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[11.396,6.997],[8.824,6.698],[9.814,4.638],[6.18,1.018],[5.811,-3.952]],"v":[[-740.446,156.523],[-759.267,149.787],[-817.776,132.926],[-836.551,103.722],[-866.321,77.753],[-881.654,81.623],[-878.956,110.612],[-885.84,126.215],[-865.258,133.143],[-841.12,148.342],[-815.757,164.135],[-778.453,175.582],[-759.273,173.266]]}],"t":119.76},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.371,6.262],[10.762,5.642],[11.143,16.013],[4.433,10.719],[20.655,1.241],[0,0],[2.157,-10.293],[4.055,-4.679],[-6.031,-5.63],[-5.441,-5.566],[-6.222,-7.712],[-8.044,-5.614],[-6.163,-0.228]],"o":[[4.559,-5.315],[-16.407,-8.602],[-6.763,-9.483],[-6.049,-14.832],[-8.92,-0.536],[4.104,7.441],[-0.971,4.636],[5.788,1.872],[8.76,7.588],[7.578,9.189],[6.534,7.495],[5.51,3.846],[6.205,-0.418]],"v":[[-765.689,192.95],[-779.892,176.691],[-822.845,141.424],[-838.057,109.174],[-865.876,77.797],[-881.607,81.022],[-880.745,110.124],[-888.6,125.262],[-869.761,132.906],[-850.461,152.667],[-830.778,175.542],[-809.296,195.656],[-790.726,203.496]]}],"t":127.744},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.177,0.874],[3.236,9.669],[8.584,19.21],[4.255,10.821],[20.628,1.634],[0,0],[2.353,-10.251],[4.144,-4.601],[-5.396,-6.361],[-3.742,-6.358],[-3.49,-10.126],[-2.221,-11.707],[-6.659,-3.021]],"o":[[10.025,-0.603],[-6.094,-18.208],[-5.162,-11.322],[-6.219,-16.258],[-8.908,-0.706],[3.962,7.518],[-1.059,4.616],[5.751,1.982],[6.445,7.598],[6.56,11.263],[3.38,9.809],[1.264,6.666],[6.308,2.861]],"v":[[-798.85,229.521],[-798.472,195.644],[-826.093,145.096],[-838.971,110.675],[-865.868,75.201],[-881.848,78.453],[-881.54,107.566],[-889.681,122.552],[-872.245,129.96],[-857.212,153.08],[-842.703,181.748],[-836.753,208.315],[-819.222,225.432]]}],"t":135.729},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.868,-2.441],[-4.005,21.634],[7.836,22.24],[5.161,10.712],[20.653,1.27],[0,0],[2.172,-10.29],[4.062,-4.673],[-5.185,-6.779],[-3.6,-6.459],[2.714,-11.389],[-5.071,-13.076],[-5.992,-6.637]],"o":[[13.538,3.726],[4.66,-25.172],[-4.356,-12.363],[-7.303,-15.156],[-8.919,-0.549],[4.094,7.447],[-0.978,4.634],[5.785,1.88],[7.208,9.424],[6.617,11.874],[-4.769,20.016],[2.757,7.11],[4.432,4.909]],"v":[[-837.314,235.237],[-817.127,199.507],[-825.49,137.445],[-839.427,102.415],[-868.474,68.647],[-884.395,72.181],[-883.573,101.284],[-891.449,116.41],[-874.51,124.637],[-857.958,147.179],[-849.06,177.108],[-865.843,210.025],[-855.141,225.377]]}],"t":143.711},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.007,-1.863],[-2.601,21.847],[9.255,21.688],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-4.009,-6.213],[1.973,-11.54],[-5.904,-12.722],[-6.408,-6.237]],"o":[[13.75,2.844],[3.026,-25.421],[-5.145,-12.056],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.37,11.422],[-3.468,20.282],[3.21,6.918],[4.74,4.613]],"v":[[-828.755,225.788],[-810.916,188.829],[-823.267,127.436],[-839.434,93.379],[-870.6,61.556],[-886.26,66.11],[-883.562,95.099],[-890.446,110.702],[-873.01,117.818],[-855.038,139.246],[-844.228,168.538],[-858.851,202.469],[-847.181,217.099]]}],"t":149.699},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.148,-0.75],[-1.279,20.418],[11.919,19.23],[6.47,9.977],[20.649,-1.341],[0,0],[0.858,-10.482],[3.441,-5.148],[-5.998,-6.072],[-4.851,-5.541],[1.258,-11.64],[-5.471,-11.139],[-6.46,-3.706]],"o":[[13.04,1.133],[1.6,-25.55],[-7.238,-11.47],[-9.153,-14.116],[-8.917,0.579],[4.999,6.872],[-0.387,4.721],[5.976,1.137],[8.338,8.441],[9.578,10.808],[-2.211,20.457],[3.789,7.715],[5.563,2.905]],"v":[[-823.9,203.883],[-801.61,172.641],[-818.901,110.807],[-839.142,79.265],[-872.211,49.424],[-885.773,53.611],[-881.293,82.379],[-887.201,98.377],[-869.36,104.404],[-847.718,123.429],[-833.275,152.917],[-856.278,181.212],[-838.805,199.037]]}],"t":163.67},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.34,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-815.458,204.75],[-797.027,178.379],[-814.549,111.281],[-835.193,80.066],[-866.359,48.243],[-878.022,50.201],[-875.325,79.19],[-882.208,94.793],[-864.773,101.909],[-841.538,120.972],[-825.289,157.999],[-847.612,192.867],[-826.713,202.488]]}],"t":179.637},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.982,1.842],[8.045,13.19],[14.578,15.334],[6.099,10.208],[20.684,-0.582],[0,0],[1.242,-10.443],[3.628,-5.018],[-5.771,-6.288],[-5.195,-5.263],[-13.09,-18.226],[-9.985,0.738],[-3.634,0.431]],"o":[[7.755,-3.587],[-12.494,-16.161],[-9.762,-10.222],[-8.629,-14.442],[-8.932,0.252],[4.744,7.051],[-0.559,4.703],[5.93,1.355],[8.023,8.741],[10.915,11.058],[12.293,17.116],[7.352,-0.543],[4.357,-0.516]],"v":[[-774.528,183.727],[-775.304,157.11],[-817.527,109.892],[-838.945,79.203],[-870.897,48.169],[-882.508,50.418],[-878.015,77.859],[-884.728,96.672],[-868.531,102.887],[-846.157,123.17],[-812.052,152.082],[-807.804,190.814],[-796.918,189.387]]}],"t":187.621},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.702,4.133],[10.407,6.59],[10.554,15.49],[4.048,11.181],[20.687,-0.471],[0,0],[1.298,-10.437],[3.654,-4.998],[-5.737,-6.319],[-5.166,-5.29],[-9.991,-6.103],[-12.113,-4.034],[-2.533,1.955]],"o":[[5.088,-5.682],[-21.629,-13.695],[-7.771,-11.406],[-5.726,-15.814],[-8.934,0.203],[4.706,7.076],[-0.585,4.7],[5.923,1.387],[7.976,8.784],[10.855,11.116],[9.68,5.913],[6.298,2.097],[6.045,-4.665]],"v":[[-758.855,174.26],[-792.846,154.456],[-830.324,113.237],[-842.083,81.04],[-873.867,49.835],[-885.49,52.021],[-879.934,79.887],[-884.987,97.7],[-872.221,105.392],[-850.961,127.147],[-810.674,159.133],[-772.956,176.031],[-760.268,176.373]]}],"t":193.611},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.587,4.013],[10.063,-0.965],[13.706,11.424],[8.153,9.501],[19.343,-2.584],[0,0],[0.378,-10.51],[3.202,-5.299],[-6.525,-2.854],[-7.481,-3.037],[-15.509,-2.949],[-10.909,2.476],[-0.918,3.031]],"o":[[1.855,-12.681],[-16.504,1.583],[-8.83,-7.271],[-9.126,-11.663],[-8.822,1.263],[5.308,6.636],[-0.17,4.733],[6.022,0.863],[10.459,3.712],[15.931,5.564],[18.797,3.575],[5.755,-0.63],[0.671,-4.6]],"v":[[-741.291,109.373],[-771.464,112.412],[-822.025,97.857],[-841.506,73.834],[-875.607,54.134],[-887.241,57.837],[-881.451,86.37],[-886.622,102.622],[-866.661,106.844],[-841.649,116.51],[-796.357,130.355],[-749.91,127.742],[-742.01,121.519]]}],"t":201.594},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.325,6.397],[13.09,-8.505],[14.557,9.96],[10.348,9.382],[18.324,-0.925],[0,0],[1.503,-10.409],[3.752,-4.926],[-6.751,-0.643],[-9.163,-2.251],[-15.948,-1.35],[-10.19,6.855],[0.094,3.925]],"o":[[-1.64,-9.035],[-16.003,10.398],[-8.452,-4.795],[-10.231,-9.225],[-8.877,0.591],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[12.2,0.685],[19.849,3.153],[25.561,-0.052],[5.323,-2.24],[-0.496,-5.642]],"v":[[-738.061,81.376],[-759.561,95.167],[-820.315,97.331],[-842.78,77.807],[-875.199,63.145],[-887.462,66.057],[-884.764,95.047],[-891.648,110.65],[-869.267,114.298],[-842.433,116.713],[-794.99,121.184],[-739.45,108.312],[-735.086,97.041]]}],"t":209.578},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.739,6.144],[13.286,-11.184],[13.103,6.781],[9.435,6.949],[15.977,-0.353],[0,0],[2.208,-10.283],[4.078,-4.659],[-7.269,0.053],[-8.186,-0.755],[-13.425,1.48],[-13.62,13.35],[0.825,3.894]],"o":[[-4.869,-8.474],[-15.455,13.01],[-8.991,-3.256],[-9.544,-6.873],[-8.884,0.409],[4.067,7.461],[-0.994,4.631],[5.779,1.901],[14.231,-0.667],[20.38,-0.577],[27.891,-7.211],[5.128,-4.692],[-1.713,-6.291]],"v":[[-743.436,63.989],[-760.076,90.169],[-818.837,101.864],[-840.733,87.17],[-869.704,76.756],[-882.659,79.546],[-881.941,108.652],[-889.871,123.75],[-863.712,126.45],[-834.973,124.855],[-788.358,119.113],[-737.679,96.502],[-735.502,80.322]]}],"t":225.547},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.582,4.92],[8.159,-2.763],[13.468,10.012],[6.769,8.93],[18.656,0.125],[0,0],[1.937,-10.337],[3.954,-4.764],[-6.915,-2.673],[-7.585,-2.914],[-11.481,-1.264],[-19.428,4.164],[-2.778,3.12]],"o":[[0.928,-6.24],[-19.641,6.652],[-8.64,-5.618],[-7.515,-10.497],[-8.904,0.078],[4.263,7.352],[-0.872,4.656],[5.827,1.748],[12.429,3.821],[13.603,3.557],[17.291,1.904],[4.602,-0.986],[2.607,-4.793]],"v":[[-726.69,114.847],[-749.404,122.839],[-818.821,121.149],[-838.39,97.98],[-867.296,78.308],[-881.661,81.493],[-880.177,110.57],[-887.706,125.872],[-864.883,131.18],[-839.171,139.425],[-805.161,146.062],[-746.011,138.685],[-734.255,130.864]]}],"t":233.531},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.769,4.239],[8.666,0.846],[14.131,12.116],[5.074,10.401],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.925],[-6.85,-4.579],[-7.312,-4.394],[-9.084,-4.803],[-12.107,-1.995],[-5.444,2.787]],"o":[[5.243,-4.887],[-19.907,-1.943],[-8.623,-7.214],[-6.414,-13.148],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[11.396,6.997],[8.824,6.698],[9.814,4.638],[6.18,1.018],[5.811,-3.952]],"v":[[-740.446,156.523],[-759.267,149.787],[-817.776,132.926],[-836.551,103.722],[-866.321,77.753],[-881.654,81.623],[-878.956,110.612],[-885.84,126.215],[-865.258,133.143],[-841.12,148.342],[-815.757,164.135],[-778.453,175.582],[-759.273,173.266]]}],"t":239.518},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.329,6.298],[10.8,5.57],[11.25,15.938],[4.505,10.689],[20.663,1.103],[0,0],[2.088,-10.308],[4.024,-4.706],[-6.069,-5.589],[-5.478,-5.529],[-6.274,-7.67],[-8.081,-5.56],[-6.164,-0.187]],"o":[[4.523,-5.346],[-16.465,-8.491],[-6.827,-9.438],[-6.148,-14.791],[-8.923,-0.476],[4.154,7.413],[-0.94,4.642],[5.801,1.833],[8.811,7.53],[7.64,9.138],[6.584,7.451],[5.536,3.809],[6.202,-0.46]],"v":[[-764.652,192.121],[-778.964,175.957],[-822.152,140.979],[-837.58,108.832],[-865.609,77.643],[-881.318,80.973],[-880.261,110.068],[-888.014,125.258],[-869.124,132.776],[-849.692,152.407],[-829.856,175.15],[-808.24,195.119],[-789.618,202.834]]}],"t":247.502},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.165,0.968],[3.362,9.626],[8.834,19.096],[4.396,10.764],[20.647,1.364],[0,0],[2.218,-10.281],[4.083,-4.655],[-5.478,-6.29],[-3.825,-6.308],[-3.622,-10.079],[-2.374,-11.677],[-6.698,-2.933]],"o":[[10.016,-0.734],[-6.332,-18.126],[-5.309,-11.254],[-6.431,-16.175],[-8.917,-0.589],[4.06,7.465],[-0.999,4.63],[5.777,1.907],[6.544,7.513],[6.707,11.177],[3.508,9.764],[1.351,6.649],[6.345,2.778]],"v":[[-797.937,227.887],[-798.002,194.007],[-826.282,143.826],[-839.609,109.576],[-866.968,74.457],[-882.904,77.918],[-882.215,107.025],[-890.16,122.115],[-872.628,129.295],[-857.294,152.216],[-842.411,180.691],[-836.114,207.179],[-818.361,224.065]]}],"t":255.486},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.725,-2.91],[-5.153,21.389],[6.639,22.627],[4.583,10.972],[20.556,2.37],[0,0],[2.717,-10.16],[4.305,-4.45],[-4.816,-7.046],[-3.25,-6.642],[3.318,-11.228],[-4.366,-13.328],[-5.629,-6.947]],"o":[[13.32,4.443],[5.996,-24.888],[-3.69,-12.578],[-6.484,-15.524],[-8.877,-1.024],[3.691,7.655],[-1.224,4.576],[5.677,2.186],[6.695,9.795],[5.974,12.21],[-5.831,19.733],[2.374,7.247],[4.164,5.139]],"v":[[-846.085,238.919],[-824.021,204.317],[-829.061,141.897],[-841.109,106.174],[-868.313,70.905],[-884.4,73.584],[-885.132,102.689],[-893.804,117.374],[-877.327,126.492],[-862.002,149.885],[-854.714,180.247],[-873.228,212.221],[-863.36,228.123]]}],"t":263.469},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.007,-1.863],[-2.601,21.847],[9.255,21.688],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-4.009,-6.213],[1.973,-11.54],[-5.904,-12.722],[-6.408,-6.237]],"o":[[13.75,2.844],[3.026,-25.421],[-5.145,-12.056],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.37,11.422],[-3.468,20.282],[3.21,6.918],[4.74,4.613]],"v":[[-829.793,226.527],[-811.954,189.568],[-824.305,128.175],[-840.473,94.118],[-871.638,62.295],[-887.298,66.848],[-884.6,95.838],[-891.484,111.441],[-874.048,118.557],[-856.076,139.984],[-845.266,169.277],[-859.89,203.208],[-848.219,217.838]]}],"t":269.459},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.162,-0.553],[-0.839,20.441],[12.33,18.969],[6.683,9.835],[20.615,-1.785],[0,0],[0.633,-10.498],[3.329,-5.22],[-6.127,-5.942],[-4.969,-5.435],[1.007,-11.664],[-5.71,-11.019],[-6.539,-3.566]],"o":[[13.062,0.852],[1.05,-25.578],[-7.483,-11.311],[-9.455,-13.916],[-8.903,0.771],[5.146,6.763],[-0.285,4.728],[5.999,1.008],[8.518,8.26],[9.808,10.599],[-1.77,20.5],[3.955,7.632],[5.625,2.785]],"v":[[-821.378,203.101],[-799.765,171.387],[-818.383,109.94],[-839.297,78.84],[-873,49.717],[-886.469,54.195],[-881.371,82.86],[-886.934,98.981],[-868.967,104.623],[-846.921,123.178],[-831.848,152.349],[-854.236,181.132],[-836.384,198.577]]}],"t":283.43},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.34,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-816.313,204.508],[-797.882,178.136],[-815.404,111.038],[-836.048,79.823],[-867.214,48],[-878.878,49.958],[-876.18,78.948],[-883.063,94.551],[-865.628,101.667],[-842.393,120.729],[-826.144,157.757],[-848.468,192.624],[-827.568,202.246]]}],"t":299.396},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.968,1.873],[8.147,13.127],[14.697,15.22],[6.178,10.16],[20.679,-0.743],[0,0],[1.161,-10.453],[3.589,-5.046],[-5.82,-6.243],[-5.235,-5.222],[-13.231,-18.124],[-9.979,0.815],[-3.631,0.459]],"o":[[7.727,-3.647],[-12.619,-16.064],[-9.841,-10.146],[-8.741,-14.375],[-8.93,0.321],[4.798,7.014],[-0.523,4.708],[5.941,1.309],[8.09,8.679],[11,10.973],[12.426,17.02],[7.347,-0.6],[4.353,-0.55]],"v":[[-773.386,183.437],[-774.369,156.827],[-816.957,109.938],[-838.612,79.415],[-870.803,48.63],[-882.396,50.969],[-878.751,79.855],[-885.12,95.675],[-868.013,103.328],[-845.483,123.437],[-811.154,152.084],[-806.607,190.782],[-795.732,189.27]]}],"t":307.381},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.462,4.336],[10.763,5.991],[11.413,14.869],[4.674,10.934],[20.627,-1.64],[0,0],[0.706,-10.493],[3.366,-5.197],[-6.085,-5.984],[-5.457,-4.99],[-10.32,-5.528],[-12.322,-3.343],[-2.418,2.095]],"o":[[4.759,-5.961],[-22.369,-12.45],[-8.404,-10.948],[-6.611,-15.465],[-8.908,0.708],[5.098,6.799],[-0.318,4.726],[5.992,1.05],[8.459,8.319],[11.466,10.484],[9.999,5.356],[6.406,1.738],[5.771,-5]],"v":[[-751.701,167.622],[-786.757,149.772],[-826.507,110.739],[-840.067,79.258],[-873.565,49.9],[-885.045,52.74],[-880.149,81.44],[-885.824,97.522],[-868.779,105.275],[-846.324,125.793],[-804.293,155.45],[-765.68,170.188],[-752.992,169.811]]}],"t":313.371},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.859,3.964],[10.105,-0.279],[12.897,12.33],[7.488,10.033],[19.474,-1.262],[0,0],[1.092,-10.46],[3.555,-5.069],[-6.316,-3.291],[-7.257,-3.538],[-15.272,-3.997],[-11.052,1.728],[-1.122,2.961]],"o":[[2.713,-12.526],[-16.573,0.457],[-8.315,-7.855],[-8.311,-12.257],[-8.887,0.66],[4.844,6.982],[-0.492,4.711],[5.949,1.27],[10.182,4.415],[15.515,6.635],[18.511,4.845],[5.784,-0.237],[0.982,-4.544]],"v":[[-745.505,120.492],[-775.815,121.471],[-825.268,103.511],[-843.071,78.218],[-875.754,56.245],[-887.612,59.149],[-883.776,88.009],[-890.04,103.871],[-870.413,109.442],[-846.116,120.786],[-801.871,137.68],[-755.354,138.231],[-747.048,132.561]]}],"t":321.352},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.325,6.397],[13.09,-8.505],[14.557,9.96],[10.348,9.382],[18.324,-0.925],[0,0],[1.503,-10.409],[3.752,-4.926],[-6.751,-0.643],[-9.163,-2.251],[-15.948,-1.35],[-10.19,6.855],[0.094,3.925]],"o":[[-1.64,-9.035],[-16.003,10.398],[-8.452,-4.795],[-10.231,-9.225],[-8.877,0.591],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[12.2,0.685],[19.849,3.153],[25.561,-0.052],[5.323,-2.24],[-0.496,-5.642]],"v":[[-736.962,81.114],[-758.462,94.905],[-819.217,97.069],[-841.682,77.544],[-874.101,62.882],[-886.364,65.795],[-883.666,94.784],[-890.549,110.387],[-868.168,114.035],[-841.334,116.451],[-793.892,120.922],[-738.352,108.049],[-733.987,96.779]]}],"t":329.336},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.748,6.138],[13.269,-11.205],[13.114,6.76],[9.446,6.934],[15.977,-0.378],[0,0],[2.192,-10.286],[4.071,-4.665],[-7.269,0.064],[-8.187,-0.742],[-13.423,1.501],[-13.599,13.371],[0.831,3.893]],"o":[[-4.883,-8.466],[-15.435,13.034],[-8.996,-3.242],[-9.555,-6.858],[-8.884,0.423],[4.079,7.455],[-0.987,4.632],[5.782,1.892],[14.23,-0.689],[20.379,-0.609],[27.879,-7.255],[5.12,-4.7],[-1.723,-6.288]],"v":[[-744.346,63.286],[-760.944,89.492],[-819.686,101.279],[-841.606,86.62],[-870.592,76.252],[-883.544,79.062],[-882.78,108.167],[-890.686,123.278],[-864.523,125.936],[-835.786,124.296],[-789.181,118.481],[-738.537,95.79],[-736.385,79.606]]}],"t":345.305},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.606,4.918],[8.172,-2.723],[13.42,10.077],[6.726,8.963],[18.655,0.216],[0,0],[1.987,-10.328],[3.977,-4.745],[-6.902,-2.707],[-7.571,-2.951],[-11.475,-1.32],[-19.448,4.07],[-2.793,3.107]],"o":[[0.958,-6.236],[-19.674,6.557],[-8.612,-5.66],[-7.464,-10.533],[-8.904,0.035],[4.227,7.372],[-0.895,4.651],[5.818,1.776],[12.41,3.881],[13.585,3.623],[17.282,1.988],[4.607,-0.964],[2.63,-4.781]],"v":[[-726.403,115.111],[-749.155,122.993],[-818.563,120.967],[-838.019,97.703],[-866.829,77.891],[-881.21,81.006],[-879.867,110.09],[-887.47,125.355],[-864.673,130.774],[-839.001,139.144],[-805.024,145.945],[-745.838,138.855],[-734.045,131.092]]}],"t":353.289},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.769,4.239],[8.666,0.846],[14.131,12.116],[5.074,10.401],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.925],[-6.85,-4.579],[-7.312,-4.394],[-9.084,-4.803],[-12.107,-1.995],[-5.444,2.787]],"o":[[5.243,-4.887],[-19.907,-1.943],[-8.623,-7.214],[-6.414,-13.148],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[11.396,6.997],[8.824,6.698],[9.814,4.638],[6.18,1.018],[5.811,-3.952]],"v":[[-740.446,156.523],[-759.267,149.787],[-817.776,132.926],[-836.551,103.722],[-866.321,77.753],[-881.654,81.623],[-878.956,110.612],[-885.84,126.215],[-865.258,133.143],[-841.12,148.342],[-815.757,164.135],[-778.453,175.582],[-759.273,173.266]]}],"t":359.277},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.297,6.325],[10.828,5.515],[11.331,15.881],[4.56,10.666],[20.668,0.997],[0,0],[2.035,-10.318],[4,-4.726],[-6.097,-5.558],[-5.506,-5.501],[-6.313,-7.638],[-8.11,-5.519],[-6.165,-0.155]],"o":[[4.496,-5.369],[-16.508,-8.407],[-6.875,-9.403],[-6.224,-14.759],[-8.926,-0.431],[4.192,7.392],[-0.917,4.647],[5.81,1.804],[8.849,7.484],[7.686,9.099],[6.622,7.418],[5.555,3.78],[6.199,-0.492]],"v":[[-764.608,191.087],[-779.002,174.997],[-822.369,140.24],[-837.961,108.172],[-866.149,77.127],[-881.841,80.537],[-880.635,109.627],[-888.31,124.856],[-869.382,132.277],[-849.85,151.809],[-829.898,174.449],[-808.18,194.308],[-789.519,201.928]]}],"t":367.262},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.175,0.89],[3.257,9.662],[8.625,19.192],[4.278,10.811],[20.631,1.59],[0,0],[2.331,-10.256],[4.134,-4.61],[-5.409,-6.349],[-3.756,-6.35],[-3.511,-10.118],[-2.246,-11.702],[-6.666,-3.006]],"o":[[10.024,-0.624],[-6.133,-18.195],[-5.186,-11.311],[-6.254,-16.245],[-8.91,-0.687],[3.978,7.509],[-1.05,4.619],[5.756,1.97],[6.461,7.584],[6.584,11.249],[3.401,9.802],[1.279,6.663],[6.314,2.847]],"v":[[-799.067,228.689],[-798.762,194.81],[-826.49,144.322],[-839.442,109.928],[-866.414,74.512],[-882.388,77.798],[-882.017,106.911],[-890.127,121.913],[-872.675,129.284],[-857.592,152.372],[-843.023,181.009],[-837.015,207.563],[-819.448,224.643]]}],"t":375.246},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.778,-2.744],[-4.748,21.483],[7.066,22.497],[4.789,10.884],[20.597,1.981],[0,0],[2.525,-10.21],[4.22,-4.53],[-4.949,-6.954],[-3.375,-6.579],[3.104,-11.288],[-4.617,-13.243],[-5.76,-6.84]],"o":[[13.402,4.19],[5.524,-24.997],[-3.928,-12.506],[-6.776,-15.399],[-8.895,-0.855],[3.835,7.583],[-1.137,4.598],[5.717,2.078],[6.88,9.667],[6.204,12.095],[-5.456,19.84],[2.511,7.201],[4.26,5.059]],"v":[[-842.783,237.577],[-821.377,202.564],[-827.597,140.251],[-840.319,104.761],[-868.186,70.013],[-884.219,72.996],[-884.4,102.111],[-892.793,116.957],[-876.146,125.761],[-860.381,148.861],[-852.52,179.079],[-870.426,211.397],[-860.259,227.11]]}],"t":383.229},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.909,-2.287],[-3.63,21.7],[8.22,22.101],[5.346,10.621],[20.672,0.912],[0,0],[1.993,-10.326],[3.98,-4.743],[-5.302,-6.688],[-3.711,-6.396],[2.516,-11.434],[-5.297,-12.987],[-6.106,-6.532]],"o":[[13.601,3.491],[4.224,-25.249],[-4.57,-12.286],[-7.564,-15.027],[-8.927,-0.394],[4.222,7.375],[-0.898,4.651],[5.817,1.78],[7.371,9.298],[6.822,11.757],[-4.422,20.095],[2.88,7.062],[4.516,4.832]],"v":[[-836.408,229.436],[-816.843,193.361],[-826.28,131.453],[-840.821,96.67],[-870.448,63.411],[-886.305,67.219],[-884.98,96.304],[-892.593,111.564],[-875.513,119.496],[-858.574,141.749],[-849.159,171.519],[-865.369,204.721],[-854.403,219.886]]}],"t":389.217},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.355],[-0.398,20.455],[12.736,18.699],[6.893,9.689],[20.572,-2.229],[0,0],[0.406,-10.509],[3.216,-5.291],[-6.254,-5.808],[-5.085,-5.327],[0.755,-11.683],[-5.946,-10.893],[-6.614,-3.424]],"o":[[13.077,0.57],[0.498,-25.595],[-7.726,-11.147],[-9.753,-13.708],[-8.884,0.963],[5.291,6.65],[-0.183,4.733],[6.02,0.878],[8.694,8.074],[10.035,10.385],[-1.327,20.533],[4.118,7.544],[5.683,2.663]],"v":[[-819.687,201.346],[-798.764,169.172],[-818.703,108.141],[-840.284,77.5],[-874.607,49.112],[-887.977,53.879],[-882.261,82.427],[-887.475,98.665],[-869.391,103.918],[-846.949,121.993],[-831.25,150.831],[-853.012,180.091],[-834.788,197.146]]}],"t":403.189},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.34,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-818.391,204.709],[-799.96,178.337],[-817.482,111.239],[-838.126,80.024],[-869.292,48.201],[-880.956,50.159],[-878.258,79.149],[-885.142,94.752],[-867.706,101.868],[-844.471,120.93],[-828.222,157.958],[-850.546,192.825],[-829.646,202.446]]}],"t":419.156},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.968,1.873],[8.147,13.127],[14.697,15.22],[6.178,10.16],[20.679,-0.743],[0,0],[1.161,-10.453],[3.589,-5.046],[-5.82,-6.243],[-5.235,-5.222],[-13.231,-18.124],[-9.979,0.815],[-3.631,0.459]],"o":[[7.727,-3.647],[-12.619,-16.064],[-9.841,-10.146],[-8.741,-14.375],[-8.93,0.321],[4.798,7.014],[-0.523,4.708],[5.941,1.309],[8.09,8.679],[11,10.973],[12.426,17.02],[7.347,-0.6],[4.353,-0.55]],"v":[[-773.386,183.437],[-774.369,156.827],[-816.957,109.938],[-838.612,79.415],[-870.803,48.63],[-882.396,50.969],[-878.751,79.855],[-885.12,95.675],[-868.013,103.328],[-845.483,123.437],[-811.154,152.084],[-806.607,190.782],[-795.732,189.27]]}],"t":427.141},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.462,4.336],[10.763,5.991],[11.413,14.869],[4.674,10.934],[20.627,-1.64],[0,0],[0.706,-10.493],[3.366,-5.197],[-6.085,-5.984],[-5.457,-4.99],[-10.32,-5.528],[-12.322,-3.343],[-2.418,2.095]],"o":[[4.759,-5.961],[-22.369,-12.45],[-8.404,-10.948],[-6.611,-15.465],[-8.908,0.708],[5.098,6.799],[-0.318,4.726],[5.992,1.05],[8.459,8.319],[11.466,10.484],[9.999,5.356],[6.406,1.738],[5.771,-5]],"v":[[-751.701,167.622],[-786.757,149.772],[-826.507,110.739],[-840.067,79.258],[-873.565,49.9],[-885.045,52.74],[-880.149,81.44],[-885.824,97.522],[-868.779,105.275],[-846.324,125.793],[-804.293,155.45],[-765.68,170.188],[-752.992,169.811]]}],"t":433.129},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.859,3.964],[10.105,-0.279],[12.897,12.33],[7.488,10.033],[19.474,-1.262],[0,0],[1.092,-10.46],[3.555,-5.069],[-6.316,-3.291],[-7.257,-3.538],[-15.272,-3.997],[-11.052,1.728],[-1.122,2.961]],"o":[[2.713,-12.526],[-16.573,0.457],[-8.315,-7.855],[-8.311,-12.257],[-8.887,0.66],[4.844,6.982],[-0.492,4.711],[5.949,1.27],[10.182,4.415],[15.515,6.635],[18.511,4.845],[5.784,-0.237],[0.982,-4.544]],"v":[[-745.505,120.492],[-775.815,121.471],[-825.268,103.511],[-843.071,78.218],[-875.754,56.245],[-887.612,59.149],[-883.776,88.009],[-890.04,103.871],[-870.413,109.442],[-846.116,120.786],[-801.871,137.68],[-755.354,138.231],[-747.048,132.561]]}],"t":441.111},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.325,6.397],[13.09,-8.505],[14.557,9.96],[10.348,9.382],[18.324,-0.925],[0,0],[1.503,-10.409],[3.752,-4.926],[-6.751,-0.643],[-9.163,-2.251],[-15.948,-1.35],[-10.19,6.855],[0.094,3.925]],"o":[[-1.64,-9.035],[-16.003,10.398],[-8.452,-4.795],[-10.231,-9.225],[-8.877,0.591],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[12.2,0.685],[19.849,3.153],[25.561,-0.052],[5.323,-2.24],[-0.496,-5.642]],"v":[[-736.962,81.114],[-758.462,94.905],[-819.217,97.069],[-841.682,77.544],[-874.101,62.882],[-886.364,65.795],[-883.666,94.784],[-890.549,110.387],[-868.168,114.035],[-841.334,116.451],[-793.892,120.922],[-738.352,108.049],[-733.987,96.779]]}],"t":449.096},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.748,6.138],[13.269,-11.205],[13.114,6.76],[9.446,6.934],[15.977,-0.378],[0,0],[2.192,-10.286],[4.071,-4.665],[-7.269,0.064],[-8.187,-0.742],[-13.423,1.501],[-13.599,13.371],[0.831,3.893]],"o":[[-4.883,-8.466],[-15.435,13.034],[-8.996,-3.242],[-9.555,-6.858],[-8.884,0.423],[4.079,7.455],[-0.987,4.632],[5.782,1.892],[14.23,-0.689],[20.379,-0.609],[27.879,-7.255],[5.12,-4.7],[-1.723,-6.288]],"v":[[-744.346,63.286],[-760.944,89.492],[-819.686,101.279],[-841.606,86.62],[-870.592,76.252],[-883.544,79.062],[-882.78,108.167],[-890.686,123.278],[-864.523,125.936],[-835.786,124.296],[-789.181,118.481],[-738.537,95.79],[-736.385,79.606]]}],"t":465.064},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.606,4.918],[8.172,-2.723],[13.42,10.077],[6.726,8.963],[18.655,0.216],[0,0],[1.987,-10.328],[3.977,-4.745],[-6.902,-2.707],[-7.571,-2.951],[-11.475,-1.32],[-19.448,4.07],[-2.793,3.107]],"o":[[0.958,-6.236],[-19.674,6.557],[-8.612,-5.66],[-7.464,-10.533],[-8.904,0.035],[4.227,7.372],[-0.895,4.651],[5.818,1.776],[12.41,3.881],[13.585,3.623],[17.282,1.988],[4.607,-0.964],[2.63,-4.781]],"v":[[-726.403,115.111],[-749.155,122.993],[-818.563,120.967],[-838.019,97.703],[-866.829,77.891],[-881.21,81.006],[-879.867,110.09],[-887.47,125.355],[-864.673,130.774],[-839.001,139.144],[-805.024,145.945],[-745.838,138.855],[-734.045,131.092]]}],"t":473.049},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.367,9.005],[15.747,-6.232],[15.739,10.707],[3.167,10.649],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.925],[-5.612,-6.43],[-4.918,-5.521],[-7.289,-4.03],[-14.011,-0.63],[-10.368,7.724]],"o":[[12.313,-15.05],[-27.355,10.826],[-10.374,-7.058],[-5.517,-18.55],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.719,8.665],[18.88,10.438],[12.748,0.574],[10.569,-7.874]],"v":[[-737.04,157.551],[-756.875,148.321],[-825.1,144.184],[-840.255,113.855],[-865.994,77.069],[-881.654,81.623],[-878.956,110.612],[-885.84,126.215],[-868.405,133.331],[-852.462,151.82],[-829.897,172.994],[-786.622,188.216],[-762.477,180.144]]}],"t":479},{"s":[{"c":true,"i":[[-7.367,9.005],[15.747,-6.232],[15.739,10.707],[3.167,10.649],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.925],[-5.612,-6.43],[-4.918,-5.521],[-7.289,-4.03],[-14.011,-0.63],[-10.368,7.724]],"o":[[12.313,-15.05],[-27.355,10.826],[-10.374,-7.058],[-5.517,-18.55],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.719,8.665],[18.88,10.438],[12.748,0.574],[10.569,-7.874]],"v":[[-737.04,157.551],[-756.875,148.321],[-825.1,144.184],[-840.255,113.855],[-865.994,77.069],[-881.654,81.623],[-878.956,110.612],[-885.84,126.215],[-868.405,133.331],[-852.462,151.82],[-829.897,172.994],[-786.622,188.216],[-762.477,180.144]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0.075,0.089]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Front fin bottom","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":29,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1073.875,105.473,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-1073.875,105.473,0]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[7],"t":0},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-8],"t":59.881},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[6],"t":119.76},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-5],"t":179.637},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[8],"t":239.518},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-5],"t":299.396},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[7],"t":359.277},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-5],"t":419.156},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[7],"t":479},{"s":[10],"t":479.037109375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Front leg","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-40.292,16.342],[-33.029,8.646],[-8.312,1.622],[-2.372,0.66],[-2.569,11.479],[1.417,0.164],[18.897,2.431],[22.655,3.122],[22.373,3.338]],"o":[[35.009,-14.199],[23.972,-6.275],[4.018,-0.784],[1.409,-0.177],[2.097,-9.368],[-17.855,-2.069],[-15.177,-1.952],[-18.658,-2.572],[0,0]],"v":[[-1033.04,168.725],[-946.09,138.338],[-895.138,127.431],[-886.426,125.986],[-878.306,103.938],[-879.872,83.09],[-927.192,75.117],[-977.525,66.828],[-1040.1,58.04]]}],"t":0},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-42.046,11.075],[-36.938,18.988],[-7.388,4.141],[-2.046,1.369],[4.713,10.778],[1.331,-0.516],[18.938,-4.523],[23.72,0.894],[23.05,5.482]],"o":[[44.458,-11.71],[19.89,-10.225],[3.571,-2.002],[1.283,-0.609],[-3.846,-8.796],[-15.787,6.119],[-14.884,3.555],[-18.821,-0.71],[0,0]],"v":[[-1045.039,171.198],[-943.389,129.475],[-889.562,101.231],[-881.344,96.203],[-882.23,77.848],[-902.574,55.765],[-932.553,65.992],[-979.945,68.652],[-1040.1,58.04]]}],"t":59.881},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-41.409,13.26],[-39.393,12.294],[-8.312,1.622],[-2.372,0.66],[-2.569,11.479],[1.417,0.164],[18.897,2.431],[22.655,3.122],[22.373,3.338]],"o":[[39.301,-12.585],[16.596,-5.18],[4.018,-0.784],[1.409,-0.177],[2.097,-9.368],[-17.855,-2.069],[-15.177,-1.952],[-18.658,-2.572],[0,0]],"v":[[-1036.044,165.594],[-944.981,137.162],[-902.073,126.364],[-893.362,124.92],[-878.306,103.938],[-876.6,83.465],[-927.249,77.996],[-979.002,69.856],[-1040.1,58.04]]}],"t":119.76},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-41.859,11.761],[-36.077,20.355],[-7.712,7.738],[-1.335,2.069],[5.7,10.29],[1.038,-0.979],[17.948,-2.309],[21.737,2.632],[22.373,3.338]],"o":[[39.728,-11.163],[24.674,-13.921],[2.89,-2.9],[0.936,-1.068],[-4.651,-8.398],[-14.122,13.315],[-11.181,1.438],[-18.698,-2.264],[0,0]],"v":[[-1039.425,170.524],[-935.513,131.047],[-892.197,101.675],[-886.254,94.486],[-888.925,68.801],[-901.242,52.358],[-939.742,72.322],[-979.545,71.96],[-1040.1,58.04]]}],"t":179.637},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-41.983,15.695],[-52.345,16.392],[-8.312,1.622],[-2.372,0.66],[-2.569,11.479],[1.417,0.164],[18.897,2.431],[22.655,3.122],[22.373,3.338]],"o":[[32.234,-12.05],[8.125,-2.544],[4.018,-0.784],[1.409,-0.177],[2.097,-9.368],[-17.855,-2.069],[-15.177,-1.952],[-18.658,-2.572],[0,0]],"v":[[-1034.133,166.675],[-944.664,135.903],[-902.073,126.364],[-893.362,124.92],[-878.306,103.938],[-876.6,83.465],[-927.249,77.996],[-979.002,69.856],[-1040.1,58.04]]}],"t":239.518},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-41.988,11.291],[-37.164,18.296],[-7.712,7.738],[-1.335,2.069],[5.7,10.29],[1.038,-0.979],[17.948,-2.309],[21.737,2.632],[22.373,3.338]],"o":[[40.737,-10.955],[7.639,-3.761],[2.89,-2.9],[0.936,-1.068],[-4.651,-8.398],[-14.122,13.315],[-11.181,1.438],[-18.698,-2.264],[0,0]],"v":[[-1051.355,171.85],[-935.771,128.803],[-892.197,101.675],[-886.254,94.486],[-888.925,68.801],[-901.242,52.358],[-939.742,72.322],[-979.545,71.96],[-1040.1,58.04]]}],"t":299.396},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-41.38,13.349],[-37.52,11.878],[-8.312,1.622],[-2.372,0.66],[-2.569,11.479],[1.417,0.164],[18.897,2.431],[22.655,3.122],[22.373,3.338]],"o":[[40.052,-12.921],[8.117,-2.57],[4.018,-0.784],[1.409,-0.177],[2.097,-9.368],[-17.855,-2.069],[-15.177,-1.952],[-18.658,-2.572],[0,0]],"v":[[-1033.118,167.508],[-945.771,138.473],[-902.073,126.364],[-893.362,124.92],[-878.306,103.938],[-876.6,83.465],[-927.249,77.996],[-979.002,69.856],[-1040.1,58.04]]}],"t":359.277},{"i":{"x":0.833,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-41.728,12.219],[-31.928,16.808],[-7.712,7.738],[-1.335,2.069],[5.7,10.29],[1.038,-0.979],[17.948,-2.309],[21.737,2.632],[22.373,3.338]],"o":[[39.604,-11.597],[25.699,-13.529],[2.89,-2.9],[0.936,-1.068],[-4.651,-8.398],[-14.122,13.315],[-11.181,1.438],[-18.698,-2.264],[0,0]],"v":[[-1043.212,172.33],[-939.397,132.858],[-892.197,101.675],[-886.254,94.486],[-888.925,68.801],[-901.242,52.358],[-939.742,72.322],[-979.545,71.96],[-1040.1,58.04]]}],"t":419.156},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-40.292,16.342],[-33.029,8.646],[-8.312,1.622],[-2.372,0.66],[-2.569,11.479],[1.417,0.164],[18.897,2.431],[22.655,3.122],[22.373,3.338]],"o":[[35.009,-14.199],[23.972,-6.275],[4.018,-0.784],[1.409,-0.177],[2.097,-9.368],[-17.855,-2.069],[-15.177,-1.952],[-18.658,-2.572],[0,0]],"v":[[-1033.04,168.725],[-946.09,138.338],[-895.138,127.431],[-886.426,125.986],[-878.306,103.938],[-879.872,83.09],[-927.192,75.117],[-977.525,66.828],[-1040.1,58.04]]}],"t":479},{"s":[{"c":false,"i":[[-40.173,16.633],[-41.972,11.417],[-8.312,1.622],[-2.372,0.66],[-2.569,11.479],[1.417,0.164],[18.897,2.431],[22.655,3.122],[22.373,3.338]],"o":[[34.811,-14.413],[26.053,-7.087],[4.018,-0.784],[1.409,-0.177],[2.097,-9.368],[-17.855,-2.069],[-15.177,-1.952],[-18.658,-2.572],[0,0]],"v":[[-1031.966,168.567],[-944.088,137.742],[-895.138,127.431],[-886.426,125.986],[-878.306,103.938],[-879.872,83.09],[-927.192,75.117],[-977.525,66.828],[-1040.1,58.04]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Body stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.299,-2.545],[0.194,3.732]],"o":[[0,0],[6.299,2.545],[0,0]],"v":[[-929.042,74.788],[-926.073,95.111],[-915.709,76.822]]}],"t":0},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.786,0.328],[1.74,3.307]],"o":[[0,0],[6.786,-0.328],[0,0]],"v":[[-935.283,67.157],[-924.073,84.367],[-922.325,63.419]]}],"t":59.881},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.299,-2.545],[0.194,3.732]],"o":[[0,0],[6.299,2.545],[0,0]],"v":[[-929.099,77.667],[-926.13,97.99],[-915.766,79.701]]}],"t":119.76},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.793,0.13],[1.643,3.357]],"o":[[0,0],[6.793,-0.13],[0,0]],"v":[[-941.728,74.524],[-931.026,92.053],[-928.667,71.165]]}],"t":179.637},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.299,-2.545],[0.194,3.732]],"o":[[0,0],[6.299,2.545],[0,0]],"v":[[-929.099,77.667],[-926.13,97.99],[-915.766,79.701]]}],"t":239.518},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.793,0.13],[1.643,3.357]],"o":[[0,0],[6.793,-0.13],[0,0]],"v":[[-941.728,74.524],[-931.026,92.053],[-928.667,71.165]]}],"t":299.396},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.299,-2.545],[0.194,3.732]],"o":[[0,0],[6.299,2.545],[0,0]],"v":[[-929.099,77.667],[-926.13,97.99],[-915.766,79.701]]}],"t":359.277},{"i":{"x":0.833,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.793,0.13],[1.643,3.357]],"o":[[0,0],[6.793,-0.13],[0,0]],"v":[[-941.728,74.524],[-931.026,92.053],[-928.667,71.165]]}],"t":419.156},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.299,-2.545],[0.194,3.732]],"o":[[0,0],[6.299,2.545],[0,0]],"v":[[-929.042,74.788],[-926.073,95.111],[-915.709,76.822]]}],"t":479},{"s":[{"c":false,"i":[[0,0],[-6.299,-2.545],[0.194,3.732]],"o":[[0,0],[6.299,2.545],[0,0]],"v":[[-929.042,74.788],[-926.073,95.111],[-915.709,76.822]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[0.003,-4.207],[-8.026,11.778],[0,0]],"o":[[0,0],[-0.003,4.207],[8.026,-11.778],[0,0]],"v":[[-966.188,71.086],[-967.557,93.113],[-954.721,93.113],[-947.099,73.455]]}],"t":0},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-0.336,-4.193],[-7.048,12.388],[0,0]],"o":[[0,0],[0.336,4.193],[7.048,-12.388],[0,0]],"v":[[-967.396,70.28],[-966.982,92.347],[-954.188,91.31],[-948.178,71.101]]}],"t":59.881},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[0.003,-4.207],[-8.026,11.778],[0,0]],"o":[[0,0],[-0.003,4.207],[8.026,-11.778],[0,0]],"v":[[-966.711,72.936],[-968.081,94.964],[-955.245,94.964],[-947.623,75.306]]}],"t":119.76},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-0.502,-4.176],[-6.552,12.658],[0,0]],"o":[[0,0],[0.502,4.176],[6.552,-12.657],[0,0]],"v":[[-968.677,74.147],[-967.389,96.18],[-954.647,94.638],[-952.185,73.573]]}],"t":179.637},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[0.003,-4.207],[-8.026,11.778],[0,0]],"o":[[0,0],[-0.003,4.207],[8.026,-11.778],[0,0]],"v":[[-966.711,72.936],[-968.081,94.964],[-955.245,94.964],[-947.623,75.306]]}],"t":239.518},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-0.502,-4.176],[-6.552,12.658],[0,0]],"o":[[0,0],[0.502,4.176],[6.552,-12.657],[0,0]],"v":[[-968.677,74.147],[-967.389,96.18],[-954.647,94.638],[-952.185,73.573]]}],"t":299.396},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[0.003,-4.207],[-8.026,11.778],[0,0]],"o":[[0,0],[-0.003,4.207],[8.026,-11.778],[0,0]],"v":[[-966.711,72.936],[-968.081,94.964],[-955.245,94.964],[-947.623,75.306]]}],"t":359.277},{"i":{"x":0.833,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-0.502,-4.176],[-6.552,12.658],[0,0]],"o":[[0,0],[0.502,4.176],[6.552,-12.657],[0,0]],"v":[[-968.677,74.147],[-967.389,96.18],[-954.647,94.638],[-952.185,73.573]]}],"t":419.156},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[0.003,-4.207],[-8.026,11.778],[0,0]],"o":[[0,0],[-0.003,4.207],[8.026,-11.778],[0,0]],"v":[[-966.188,71.086],[-967.557,93.113],[-954.721,93.113],[-947.099,73.455]]}],"t":479},{"s":[{"c":false,"i":[[0,0],[0.003,-4.207],[-8.026,11.778],[0,0]],"o":[[0,0],[-0.003,4.207],[8.026,-11.778],[0,0]],"v":[[-966.188,71.086],[-967.557,93.113],[-954.721,93.113],[-947.099,73.455]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.964705884457,0.549019634724,0.129411771894,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Front leg stripes","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.399,0.439],[18.781,3.915],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-1.814,-7.068],[-3.865,-14.502],[-5.415,2.069],[-39.37,12.366],[-8.264,1.851],[-2.908,0.377],[-2.559,11.263]],"o":[[-17.12,-5.368],[-21.396,-4.46],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[1.842,7.174],[2.792,10.475],[38.55,-14.727],[8.123,-2.552],[3.572,-0.8],[1.377,-0.173],[2.195,-9.657]],"v":[[-880.05,83.285],[-927.907,73.168],[-993.058,64.6],[-1042.754,57.733],[-1043.953,75.951],[-1040.275,107.689],[-1035.983,136.56],[-1021.07,163.518],[-946.203,138.095],[-895.942,127.358],[-886.337,126.091],[-879.105,103.294]]}],"t":0},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.333,-0.61],[17.812,-3.607],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.648,1.307],[-37.863,16.776],[-7.27,4.344],[-2.649,1.258],[4.593,10.597]],"o":[[-14.717,6.735],[-21.422,4.338],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[1.842,7.174],[0.62,9.748],[42.676,-9.879],[7.785,-3.449],[3.142,-1.877],[1.254,-0.596],[-3.939,-9.087]],"v":[[-902.683,56.005],[-936.626,66.148],[-993.809,67.38],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1037.089,168.24],[-943.484,129.224],[-889.953,100.482],[-881.226,96.275],[-883.255,77.8]]}],"t":59.881},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.453,0.196],[21.572,2.678],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.521,1.768],[-39.72,11.191],[-8.264,1.851],[-2.908,0.377],[-2.559,11.263]],"o":[[-20.041,-2.707],[-21.69,-2.693],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[1.842,7.174],[0.62,9.748],[39.301,-12.585],[8.195,-2.309],[3.572,-0.8],[1.377,-0.173],[2.195,-9.657]],"v":[[-876.779,83.659],[-929.197,77.973],[-994.573,67.273],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1036.16,164.725],[-944.746,137.992],[-902.877,126.291],[-893.272,125.025],[-879.105,103.294]]}],"t":119.76},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.217,-0.818],[23.139,-2.196],[21.402,4.457],[18.263,4.572],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.581,1.568],[-37.407,17.425],[-4.951,6.871],[-1.932,2.205],[5.564,10.122]],"o":[[-16.784,11.281],[-21.758,2.065],[-4.694,-0.978],[-4.864,-1.218],[0.511,20.071],[1.842,7.174],[0.62,9.748],[39.728,-11.163],[13.214,-6.155],[2.14,-2.97],[0.915,-1.044],[-4.77,-8.679]],"v":[[-901.247,52.622],[-942.873,71.873],[-995.053,68.665],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1039.51,169.651],[-934.896,130.872],[-892.46,101.829],[-886.117,94.506],[-889.95,68.849]]}],"t":179.637},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.453,0.196],[21.572,2.678],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-0.341,-7.289],[-3.264,-16.174],[-5.481,1.889],[-35.943,9.646],[-8.264,1.851],[-2.908,0.377],[-2.559,11.263]],"o":[[-20.041,-2.707],[-21.69,-2.693],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[0.386,8.254],[1.932,9.574],[38.292,-13.201],[8.223,-2.207],[3.572,-0.8],[1.377,-0.173],[2.195,-9.657]],"v":[[-876.779,83.659],[-929.197,77.973],[-994.573,67.273],[-1042.754,57.733],[-1043.953,75.951],[-1043.333,103.193],[-1040.703,133.856],[-1026.683,163.151],[-944.754,135.651],[-902.877,126.291],[-893.272,125.025],[-879.105,103.294]]}],"t":239.518},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.217,-0.818],[23.139,-2.196],[21.402,4.457],[18.263,4.572],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.583,1.564],[-37.407,17.425],[-4.951,6.871],[-1.932,2.205],[5.564,10.122]],"o":[[-16.784,11.281],[-21.758,2.065],[-4.694,-0.978],[-4.864,-1.218],[0.511,20.071],[1.842,7.174],[0.62,9.748],[39.531,-11.072],[13.214,-6.155],[2.14,-2.97],[0.915,-1.044],[-4.77,-8.679]],"v":[[-901.247,52.622],[-942.873,71.873],[-995.053,68.665],[-1042.754,57.733],[-1043.953,75.951],[-1041.706,106.106],[-1040.703,133.856],[-1041.259,168.215],[-935.952,128.606],[-892.46,101.829],[-886.117,94.506],[-889.95,68.849]]}],"t":299.396},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.453,0.196],[21.572,2.678],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.535,1.723],[-39.481,14.128],[-8.264,1.851],[-2.908,0.377],[-2.559,11.263]],"o":[[-20.041,-2.707],[-21.69,-2.693],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[1.842,7.174],[0.62,9.748],[39.401,-12.267],[8.017,-2.869],[3.572,-0.8],[1.377,-0.173],[2.195,-9.657]],"v":[[-876.779,83.659],[-929.197,77.973],[-994.573,67.273],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1033.157,166.137],[-945.876,138.227],[-902.877,126.291],[-893.272,125.025],[-879.105,103.294]]}],"t":359.277},{"i":{"x":0.833,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.217,-0.818],[23.139,-2.196],[21.402,4.457],[18.263,4.572],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.564,1.629],[-37.407,17.425],[-4.951,6.871],[-1.932,2.205],[5.564,10.122]],"o":[[-16.784,11.281],[-21.758,2.065],[-4.694,-0.978],[-4.864,-1.218],[0.511,20.071],[1.842,7.174],[0.62,9.748],[39.604,-11.597],[13.214,-6.155],[2.14,-2.97],[0.915,-1.044],[-4.77,-8.679]],"v":[[-901.247,52.622],[-942.873,71.873],[-995.053,68.665],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1043.307,171.458],[-939.578,132.661],[-892.46,101.829],[-886.117,94.506],[-889.95,68.849]]}],"t":419.156},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.399,0.439],[18.781,3.915],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-0.02,-7.297],[-3.003,-14.567],[-5.415,2.069],[-39.37,12.366],[-8.264,1.851],[-2.908,0.377],[-2.559,11.263]],"o":[[-17.12,-5.368],[-21.396,-4.46],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[0.022,8.144],[1.972,9.566],[38.55,-14.727],[8.123,-2.552],[3.572,-0.8],[1.377,-0.173],[2.195,-9.657]],"v":[[-880.05,83.285],[-927.907,73.168],[-993.058,64.6],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1022.487,163.203],[-946.203,138.095],[-895.942,127.358],[-886.337,126.091],[-879.105,103.294]]}],"t":479},{"s":[{"c":true,"i":[[1.399,0.439],[18.781,3.915],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.433,2.023],[-28.721,6.105],[-8.264,1.851],[-2.908,0.377],[-2.559,11.263]],"o":[[-17.12,-5.368],[-21.396,-4.46],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[1.842,7.174],[0.62,9.748],[38.674,-14.397],[8.328,-1.77],[3.572,-0.8],[1.377,-0.173],[2.195,-9.657]],"v":[[-880.05,83.285],[-927.907,73.168],[-993.058,64.6],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1020.11,163.685],[-944.189,137.494],[-895.942,127.358],[-886.337,126.091],[-879.105,103.294]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Body fill","np":2,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":30,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1107.804,-2.384,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[699.196,282.616,0]},"r":{"a":0,"ix":10,"k":30},"s":{"a":0,"ix":6,"k":[55,55,100]}},"nm":"Body","op":480,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-9.643,2.5],[-10.714,-5]],"o":[[9.643,-2.5],[10.714,5]],"v":[[-1255.941,20.307],[-1217.727,21.736]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392156863,0.372549019608,0.847058823529,1]},"hd":false,"lc":1,"lj":1,"ml":4,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Back stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[2.744,6.946],[0.714,1.964]],"o":[[0,0],[-2.797,-7.082],[-0.714,-1.964]],"v":[[-1314.101,113.308],[-1324.413,90.448],[-1330.214,68.56]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392156863,0.372549019608,0.847058823529,1]},"hd":false,"lc":1,"lj":1,"ml":4,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Neck stroke","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[10.373,3.468],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-1.613,5.208],[-4.97,-4.077],[-15.274,-6.539],[-28.536,-3.208],[-42.389,9.68]],"o":[[-13.173,-4.404],[-7.855,2.563],[8.522,16.414],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[42.6,4.79],[39.337,-8.983]],"v":[[-1246.03,82.507],[-1295.763,79.593],[-1313.439,98.917],[-1295.559,120.796],[-1298.078,105.635],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1037.76,149.779]]}],"t":0},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[9.772,2.502],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[0.352,3.422],[-10.506,-8.72],[-15.274,-6.539],[-28.536,-3.208],[-49.164,18.593]],"o":[[-13.653,-3.496],[-7.855,2.563],[8.522,13.557],[-1.453,-5.936],[3.387,9.315],[19.123,10.673],[20.539,8.793],[42.6,4.79],[38.599,-14.598]],"v":[[-1235.049,76.656],[-1295.763,74.593],[-1315.892,96.215],[-1301.631,111.689],[-1303.079,102.421],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1034.906,144.76]]}],"t":59.881},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-13.75,-1.964],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-1.613,5.208],[-4.97,-4.077],[-15.274,-6.539],[-28.655,-1.864],[-47.436,11.182]],"o":[[13.75,1.964],[-7.855,2.563],[8.522,16.414],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[44.048,2.866],[40.166,-9.468]],"v":[[-1251.563,84.365],[-1291.477,84.593],[-1311.249,101.929],[-1295.559,120.796],[-1298.078,105.635],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1037.489,145.274]]}],"t":120},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-17.008,-2.329],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-0.006,2.529],[-4.97,-4.077],[-15.274,-6.539],[-28.536,-3.208],[-45.238,15.188]],"o":[[13.761,1.885],[-7.855,2.563],[5.843,7.842],[-0.024,-5.489],[2.439,11.595],[19.123,10.673],[20.539,8.793],[42.6,4.79],[39.121,-13.134]],"v":[[-1244.34,80.045],[-1293.62,79.236],[-1315.535,97.286],[-1302.346,110.796],[-1302.007,104.028],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1034.371,145.567]]}],"t":180},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-13.75,-1.964],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-1.613,5.208],[-4.97,-4.077],[-15.274,-6.539],[-28.652,-1.911],[-40.849,8.456]],"o":[[13.75,1.964],[-7.855,2.563],[8.522,16.414],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[47.329,3.157],[40.602,-8.404]],"v":[[-1249.659,83.597],[-1292.548,82.45],[-1311.606,100.858],[-1295.559,120.796],[-1298.078,105.635],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1042.009,149.269]]}],"t":239},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[16.869,2.178],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-0.184,2.529],[-4.97,-4.077],[-15.274,-6.539],[-28.536,-3.208],[-41.33,13.504]],"o":[[-13.776,-1.779],[-7.855,2.563],[6.558,11.235],[-1.096,-5.311],[2.137,7.886],[19.123,10.673],[20.539,8.793],[42.6,4.79],[40.953,-13.381]],"v":[[-1235.955,75.836],[-1294.691,77.807],[-1315.892,96.215],[-1300.381,115.261],[-1301.471,107.243],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1038.714,145.237]]}],"t":299},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[10.064,2.561],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-1.613,5.208],[-4.97,-4.077],[-15.274,-6.539],[-28.536,-3.208],[-42.611,9.208]],"o":[[-13.461,-3.425],[-7.855,2.563],[8.522,16.414],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[42.6,4.79],[40.336,-8.716]],"v":[[-1248.731,83.85],[-1294.334,81.379],[-1313.392,100.144],[-1295.559,120.796],[-1298.078,105.635],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1037.368,148.506]]}],"t":360},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-13.75,-1.964],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-0.006,0.743],[-4.97,-4.077],[-15.274,-6.539],[-28.536,-3.208],[-41.864,11.743]],"o":[[13.75,1.964],[-7.855,2.563],[9.593,13.378],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[42.6,4.79],[38.884,-10.908]],"v":[[-1244.114,81.007],[-1293.62,79.236],[-1315.535,97.286],[-1299.845,115.261],[-1300.936,106.35],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1039.498,147.782]]}],"t":420},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[10.373,3.468],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-1.613,5.208],[-4.97,-4.077],[-15.274,-6.539],[-28.536,-3.208],[-42.389,9.68]],"o":[[-13.173,-4.404],[-7.855,2.563],[8.522,16.414],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[42.6,4.79],[39.337,-8.983]],"v":[[-1246.03,82.507],[-1295.763,79.593],[-1313.439,98.917],[-1295.559,120.796],[-1298.078,105.635],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1037.76,149.779]]}],"t":479},{"s":[{"c":false,"i":[[-13.75,-1.964],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-1.613,5.208],[-4.97,-4.077],[-15.274,-6.539],[-28.7,-0.957],[-43.474,7.821]],"o":[[13.75,1.964],[-7.855,2.563],[8.522,16.414],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[46.257,1.543],[40.099,-7.214]],"v":[[-1256.298,85.307],[-1291.477,84.593],[-1311.249,101.929],[-1295.559,120.796],[-1298.078,105.635],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1037.403,150.317]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.667,-3.608],[-9,-3.291],[-11.523,-2.936],[-2.802,-6.168]],"o":[[14.26,4.062],[16.499,6.033],[13.932,3.55],[4.737,10.425]],"v":[[-1207.46,94.306],[-1148.093,115.555],[-1088.67,132.069],[-1039.595,149.676]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.667,-3.608],[-9,-3.291],[-6.184,-2.263],[-3.682,-5.009]],"o":[[14.26,4.062],[16.499,6.033],[13.502,4.941],[6.783,9.226]],"v":[[-1199.004,84.682],[-1146.968,101.722],[-1084.936,125.891],[-1042.976,147.07]]}],"t":60},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.667,-3.608],[-9.292,-2.345],[-19.314,-2.623],[-3.682,-5.009]],"o":[[14.26,4.062],[15.848,4],[14.246,1.935],[6.783,9.226]],"v":[[-1207.615,98.59],[-1151.915,115.616],[-1077.756,129.589],[-1042.976,147.07]]}],"t":120},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.905,-2.632],[-9.292,-2.345],[-20.733,-9.898],[-3.682,-5.009]],"o":[[14.399,2.936],[15.848,4],[12.974,6.194],[6.783,9.226]],"v":[[-1208.438,86.679],[-1150.633,101.736],[-1077.515,127.186],[-1040.833,147.135]]}],"t":180},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.905,-2.632],[-9.292,-2.345],[-26.039,-5.637],[-3.682,-5.009]],"o":[[14.399,2.936],[15.848,4],[14.052,3.042],[6.783,9.226]],"v":[[-1219.753,95.327],[-1156.239,113.451],[-1070.957,130.739],[-1040.833,147.135]]}],"t":239},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.905,-2.632],[-9.1,-3.005],[-24.479,-10.515],[-4.427,-4.191]],"o":[[14.399,2.936],[16.56,5.468],[13.966,5.999],[8.316,7.872]],"v":[[-1208.326,80.918],[-1152.769,97.332],[-1072.806,127.56],[-1039.35,145.021]]}],"t":299},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.905,-2.632],[-9.1,-3.005],[-27.009,-7.888],[-5.836,-3.941]],"o":[[14.399,2.936],[16.56,5.468],[14.59,4.261],[9.49,6.408]],"v":[[-1219.77,92.141],[-1161.783,109.844],[-1076.748,133.875],[-1041.021,148.827]]}],"t":360},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.905,-2.632],[-9.1,-3.005],[-27.555,-9.896],[-7.911,-7.462]],"o":[[14.399,2.936],[16.56,5.468],[14.735,5.292],[8.33,7.857]],"v":[[-1212.875,84.343],[-1157.957,97.426],[-1082.188,122.914],[-1039.932,146.911]]}],"t":420},{"s":[{"c":false,"i":[[-12.667,-3.608],[-9,-3.291],[-11.523,-2.936],[-2.802,-6.168]],"o":[[14.26,4.062],[16.499,6.033],[13.932,3.55],[4.737,10.425]],"v":[[-1207.46,94.306],[-1148.093,115.555],[-1088.67,132.069],[-1039.595,149.676]]}],"t":479}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,115]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Body stroke","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[33.991,-19.305],[3.088,-9.11],[-9.125,-5.056],[-1.366,4.59],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-35.397,6.169],[19.41,5.144]],"o":[[-5.188,2.946],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-17.238,-11.627],[-57.952,-15.357]],"v":[[-1302.432,82.648],[-1313.672,98.703],[-1294.488,120.634],[-1298.078,104.758],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1038.964,149.872],[-1114.01,126.202]]}],"t":0},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[33.991,-19.305],[3.088,-9.11],[-6.81,-5.862],[-0.184,3.585],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-39.347,13.459],[30.835,13.035]],"o":[[-5.188,2.946],[3.623,5.711],[-2.826,-7.055],[3.03,8.406],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-16.44,-11.668],[-57.818,-24.441]],"v":[[-1302.432,77.648],[-1315.458,97.275],[-1301.453,112.062],[-1303.079,102.437],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1042.571,146.304],[-1108.254,116.857]]}],"t":59.881},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[27.919,-13.055],[3.088,-9.11],[-9.125,-5.056],[-1.366,4.59],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-35.397,6.169],[29.773,4.603]],"o":[[-5.404,2.527],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-10.076,-14.505],[-63.874,-9.875]],"v":[[-1293.503,86.22],[-1310.862,100.691],[-1294.488,120.634],[-1298.078,104.758],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1043.499,146.77],[-1108.656,124.948]]}],"t":119.76},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[27.919,-13.055],[3.088,-9.11],[-9.125,-5.056],[-0.542,3.763],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-36.219,10.095],[24.563,7.936]],"o":[[-5.404,2.527],[3.445,7.676],[-0.738,-4.076],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-15.921,-10.931],[-59.501,-19.223]],"v":[[-1295.646,80.863],[-1315.458,96.203],[-1301.274,110.634],[-1302.007,103.151],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1038.977,147.369],[-1113.146,113.217]]}],"t":180},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[29.37,-9.346],[3.088,-9.11],[-9.125,-5.056],[-1.366,4.59],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-34.568,7.149],[28.261,3.569]],"o":[[-11.724,3.731],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-7.01,-14.133],[-71.026,-8.969]],"v":[[-1293.503,82.648],[-1311.172,102.275],[-1294.488,120.634],[-1298.078,104.758],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1040.968,148.872],[-1111.548,122.455]]}],"t":239},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[46,-16.206],[3.088,-9.11],[-9.125,-5.056],[-0.006,3.049],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-33.958,10.395],[22.32,8.333]],"o":[[-11.604,4.088],[3.445,7.676],[-2.826,-7.055],[3.208,9.478],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-15.921,-10.931],[-57.141,-21.332]],"v":[[-1295.646,78.005],[-1315.458,97.632],[-1299.31,115.098],[-1301.471,106.365],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1038.99,144.865],[-1111.112,112.554]]}],"t":299},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[29.37,-9.346],[3.088,-9.11],[-9.125,-5.056],[-1.366,4.59],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-35.397,6.169],[21.736,5.604]],"o":[[-11.724,3.731],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-15.921,-10.931],[-63.187,-16.29]],"v":[[-1294.218,81.577],[-1313.315,99.418],[-1294.488,120.634],[-1298.078,104.758],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1040.38,148.757],[-1108.965,125.103]]}],"t":360},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[27.919,-13.055],[3.088,-9.11],[-1.989,-1.398],[0.173,2.871],[-2.841,-2.082],[-13.885,-5.039],[-32.131,-4.558],[-37.522,9.906],[19.491,7.317]],"o":[[-5.404,2.527],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.237,5.424],[-9.801,-12.85],[-61.091,-22.934]],"v":[[-1295.646,80.863],[-1315.458,96.203],[-1298.774,115.098],[-1300.936,105.473],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1039.774,147.41],[-1107.828,113.774]]}],"t":420},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[33.991,-19.305],[3.088,-9.11],[-9.125,-5.056],[-1.366,4.59],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-35.397,6.169],[19.41,5.144]],"o":[[-5.188,2.946],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-17.238,-11.627],[-57.952,-15.357]],"v":[[-1302.432,82.648],[-1313.672,98.703],[-1294.488,120.634],[-1298.078,104.758],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1038.964,149.872],[-1114.01,126.202]]}],"t":479},{"s":[{"c":true,"i":[[27.919,-13.055],[3.088,-9.11],[-9.125,-5.056],[-1.366,4.59],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-35.397,6.169],[23.396,4.936]],"o":[[-5.404,2.527],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-15.921,-10.931],[-63.25,-13.343]],"v":[[-1293.503,86.22],[-1311.172,100.846],[-1294.488,120.634],[-1298.078,104.758],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1040.119,149.376],[-1104.989,131.714]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.933333337307,0.933333337307,0.933333337307,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,115]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Stomach fill","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[23.666,8.925],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-21.669,4.519],[-6.396,1.771],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-30.661,-11.563],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.962,-1.661],[21.498,-5.953],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1185.517,17.404],[-1276.026,9.248],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1053.062,152.536],[-1031.275,147.86],[-1032.083,110.145]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[23.666,8.925],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-21.669,4.519],[-5.731,1.105],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-30.661,-11.563],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.962,-1.661],[21.904,-4.222],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1185.517,17.404],[-1276.026,9.248],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1052.663,147.999],[-1033.775,144.094],[-1032.083,110.145]]}],"t":120},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[23.666,8.925],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-19.079,5.489],[-5.484,2],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-30.661,-11.563],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.816,-2.249],[19.524,-7.121],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1185.517,17.404],[-1276.026,9.248],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1050.057,150.342],[-1033.487,145.319],[-1032.083,110.145]]}],"t":180},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[21.942,5.281],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-19.079,5.489],[-5.484,2],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-31.859,-7.668],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.816,-2.249],[19.524,-7.121],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1191.582,26.904],[-1268.596,24.165],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1050.057,150.342],[-1032.66,146.876],[-1032.083,110.145]]}],"t":239},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[21.942,5.281],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-19.079,5.489],[-5.484,2],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-31.859,-7.668],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.816,-2.249],[19.524,-7.121],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1191.582,26.904],[-1268.596,24.165],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1050.088,148.744],[-1033.916,143.741],[-1032.083,110.145]]}],"t":299},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[21.942,5.281],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-19.079,5.489],[-5.484,2],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-31.859,-7.668],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.816,-2.249],[19.524,-7.121],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1191.582,26.904],[-1268.596,24.165],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1050.287,150.531],[-1030.193,144.69],[-1032.083,110.145]]}],"t":420},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[23.666,8.925],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-21.669,4.519],[-5.731,1.105],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-30.661,-11.563],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.962,-1.661],[21.904,-4.222],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1185.517,17.404],[-1276.026,9.248],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1051.851,152.384],[-1031.472,147.959],[-1032.083,110.145]]}],"t":479},{"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[21.942,5.281],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-19.079,5.489],[-5.484,2],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-31.859,-7.668],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.816,-2.249],[19.524,-7.121],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1191.582,26.904],[-1268.596,24.165],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1050.384,151.403],[-1025.3,148.022],[-1032.083,110.145]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,115]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Body fill","np":2,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":31,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1021.732,79.759,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-1022.249,79.437,0]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.786],"y":[0.766]},"o":{"x":[0.449],"y":[0]},"s":[-9.418],"t":0},{"i":{"x":[0.612],"y":[1.279]},"o":{"x":[0.2],"y":[0.598]},"s":[1.248],"t":100},{"i":{"x":[0.873],"y":[0.898]},"o":{"x":[0.499],"y":[0.047]},"s":[4.179],"t":175},{"i":{"x":[0.903],"y":[1.418]},"o":{"x":[0.184],"y":[0.649]},"s":[-23.418],"t":267},{"i":{"x":[0],"y":[0.925]},"o":{"x":[0.289],"y":[0.097]},"s":[-29.778],"t":360},{"i":{"x":[0.55],"y":[1]},"o":{"x":[0.283],"y":[-0.336]},"s":[-4.418],"t":389},{"s":[-9.418],"t":479}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Tail","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-2.465,-1.022],[-1.704,1.687],[0.179,2.36],[4.732,4.643]],"o":[[2.069,1.82],[2.465,1.022],[1.535,-1.519],[-0.479,-6.29],[0,0]],"v":[[-943.805,6.761],[-935.356,11.463],[-928.274,10.815],[-925.517,3.416],[-933.513,-11.861]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.896,-1.878],[-2.215,0.918],[-0.725,2.253],[2.628,6.086]],"o":[[1.228,2.466],[1.896,1.878],[1.995,-0.827],[1.933,-6.005],[0,0]],"v":[[-931.841,14.251],[-925.794,21.795],[-918.992,23.87],[-913.644,18.061],[-915.278,0.896]]}],"t":100},{"i":{"x":0.35,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.935,-2.382],[-2.299,-0.054],[-1.51,1.695],[-0.056,6.357]],"o":[[0.12,2.639],[0.935,2.382],[2.071,0.048],[4.024,-4.517],[0,0]],"v":[[-922.293,20.266],[-919.915,29.228],[-914.754,33.685],[-907.812,30.664],[-902.587,14.977]]}],"t":125},{"i":{"x":0.667,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.467,-2.627],[-2.34,-0.526],[-1.891,1.423],[-1.36,6.488]],"o":[[-0.418,2.723],[0.467,2.627],[2.107,0.474],[5.04,-3.793],[0,0]],"v":[[-922.389,26.388],[-921.795,36.039],[-917.433,41.654],[-909.942,41.899],[-901.384,26.93]]}],"t":175},{"i":{"x":0.35,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.467,-2.627],[-2.34,-0.526],[-1.891,1.423],[-1.36,6.488]],"o":[[-0.418,2.723],[0.467,2.627],[2.107,0.474],[5.04,-3.793],[0,0]],"v":[[-922.389,26.388],[-921.795,36.039],[-917.433,41.654],[-909.715,39.989],[-901.156,25.02]]}],"t":222},{"i":{"x":0.5,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-2.465,-1.022],[-1.704,1.687],[0.179,2.36],[4.732,4.643]],"o":[[2.069,1.82],[2.465,1.022],[1.535,-1.519],[-0.479,-6.29],[0,0]],"v":[[-943.805,6.761],[-935.356,11.463],[-928.274,10.815],[-925.517,3.416],[-933.513,-11.861]]}],"t":267},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-2.465,-1.022],[-1.704,1.687],[0.974,2.157],[6.033,2.748]],"o":[[2.069,1.82],[2.465,1.022],[1.535,-1.519],[-2.597,-5.749],[0,0]],"v":[[-943.805,6.761],[-935.356,11.463],[-928.274,10.815],[-927.673,0.611],[-940.404,-11.018]]}],"t":360},{"i":{"x":0.45,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.944,-2.244],[-2.188,0.002],[-1.207,1.598],[0.405,5.595]],"o":[[0.175,2.508],[0.944,2.244],[1.971,-0.002],[3.217,-4.26],[0,0]],"v":[[-927.521,20.989],[-925.051,29.458],[-920.04,33.578],[-914.021,29.875],[-910.545,15.703]]}],"t":375},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.467,-2.627],[-2.34,-0.526],[-1.891,1.423],[-1.36,6.488]],"o":[[-0.418,2.723],[0.467,2.627],[2.107,0.474],[5.04,-3.793],[0,0]],"v":[[-922.389,26.388],[-921.795,36.039],[-917.433,41.654],[-909.715,39.989],[-901.156,25.02]]}],"t":389},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.577,-1.736],[-2.339,-0.147],[-0.445,2.032],[2.811,5.103]],"o":[[0.963,2.221],[1.577,1.736],[1.894,0.119],[1.186,-5.415],[0,0]],"v":[[-930.528,11.668],[-926.153,14.886],[-919.03,20.502],[-914.84,14.971],[-917.712,0.093]]}],"t":440},{"s":[{"c":false,"i":[[0,0],[-2.465,-1.022],[-1.704,1.687],[0.179,2.36],[4.732,4.643]],"o":[[2.069,1.82],[2.465,1.022],[1.535,-1.519],[-0.479,-6.29],[0,0]],"v":[[-943.805,6.761],[-935.356,11.463],[-928.274,10.815],[-925.517,3.416],[-933.513,-11.861]]}],"t":479}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-4.079,0.025],[-0.464,0.962],[0.016,0.594],[2.986,4.979]],"o":[[2.476,3.543],[1.089,-0.007],[0.248,-0.513],[-0.149,-5.606],[0,0]],"v":[[-967.217,29.482],[-953.059,38.81],[-950.328,37.503],[-950.09,35.782],[-954.555,18.784]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.991,-0.844],[-0.659,0.841],[-0.111,0.583],[1.858,5.501]],"o":[[1.665,3.989],[1.065,0.225],[0.352,-0.449],[1.048,-5.51],[0,0]],"v":[[-963.088,31.387],[-951.239,43.515],[-948.293,42.82],[-947.694,41.188],[-948.438,23.629]]}],"t":100},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.859,-1.281],[-0.746,0.76],[-0.175,0.566],[1.227,5.656]],"o":[[1.205,4.137],[1.03,0.342],[0.398,-0.405],[1.652,-5.342],[0,0]],"v":[[-960.669,28.82],[-949.82,43.542],[-946.823,43.182],[-946.048,41.632],[-944.829,24.154]]}],"t":125},{"i":{"x":0.35,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-3.796,-1.494],[-0.789,0.72],[-0.206,0.557],[0.921,5.732]],"o":[[0.981,4.209],[1.013,0.399],[0.421,-0.384],[1.946,-5.26],[0,0]],"v":[[-960.671,32.171],[-950.307,48.155],[-947.286,47.957],[-946.426,46.447],[-944.251,29.008]]}],"t":222},{"i":{"x":0.5,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-4.079,0.025],[-0.464,0.962],[0.016,0.594],[2.986,4.979]],"o":[[2.476,3.543],[1.089,-0.007],[0.248,-0.513],[-0.149,-5.606],[0,0]],"v":[[-967.217,29.482],[-953.059,38.81],[-950.328,37.503],[-950.09,35.782],[-954.555,18.784]]}],"t":267},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-4.079,0.025],[-0.464,0.962],[0.016,0.594],[2.986,4.979]],"o":[[2.476,3.543],[1.089,-0.007],[0.248,-0.513],[-0.149,-5.606],[0,0]],"v":[[-967.217,29.482],[-953.059,38.81],[-950.328,37.503],[-950.09,35.782],[-954.555,18.784]]}],"t":360},{"i":{"x":0.45,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.863,-1.131],[-0.711,0.778],[-0.153,0.566],[1.414,5.552]],"o":[[1.338,4.05],[1.031,0.302],[0.38,-0.415],[1.446,-5.343],[0,0]],"v":[[-963.005,29.406],[-951.735,43.801],[-948.784,43.339],[-948.071,41.778],[-947.482,24.444]]}],"t":375},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.796,-1.494],[-0.789,0.72],[-0.206,0.557],[0.921,5.732]],"o":[[0.981,4.209],[1.013,0.399],[0.421,-0.384],[1.946,-5.26],[0,0]],"v":[[-960.671,32.171],[-950.307,48.155],[-947.286,47.957],[-946.426,46.447],[-944.251,29.008]]}],"t":389},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.865,-1.122],[-0.71,0.779],[-0.152,0.566],[1.425,5.548]],"o":[[1.347,4.047],[1.031,0.3],[0.379,-0.416],[1.434,-5.345],[0,0]],"v":[[-962.389,29.732],[-951.098,44.088],[-948.148,43.62],[-947.439,42.058],[-946.887,24.727]]}],"t":411},{"s":[{"c":false,"i":[[0,0],[-4.079,0.025],[-0.464,0.962],[0.016,0.594],[2.986,4.979]],"o":[[2.476,3.543],[1.089,-0.007],[0.248,-0.513],[-0.149,-5.606],[0,0]],"v":[[-967.217,29.482],[-953.059,38.81],[-950.328,37.503],[-950.09,35.782],[-954.555,18.784]]}],"t":479}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.964705884457,0.549019634724,0.129411771894,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Tail stripes","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.73,-8.645],[5.475,-7.296],[19.79,-7.061],[11.697,-11.071],[-4.091,-2.787],[0.608,4.912],[-26.134,13.811],[-12.754,15.819],[-1.216,11.843],[5.176,7.759],[6.726,-0.508],[3.627,-8.165]],"o":[[-3.14,9.946],[-9.457,12.601],[-22.588,8.059],[0,0],[4.091,2.787],[-1.433,-11.582],[13.876,-7.333],[10.529,-13.059],[0.664,-6.467],[-3.608,-5.408],[-8.909,0.673],[-3.689,8.303]],"v":[[-934.108,-16.865],[-947.567,7.143],[-990.219,40.002],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-952.04,59.68],[-907.978,25.406],[-888.376,-18.425],[-892.367,-45.608],[-909.175,-54.287],[-929.079,-40.243]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.793,-6.973],[7.825,-4.687],[19.79,-7.061],[11.697,-11.071],[-4.091,-2.787],[0.608,4.912],[-28.475,7.931],[-17.784,9.83],[-5.599,10.507],[1.862,9.139],[6.419,2.07],[6.443,-6.19]],"o":[[-6.665,8.023],[-13.516,8.095],[-22.588,8.059],[0,0],[4.091,2.787],[-1.433,-11.582],[15.119,-4.211],[14.681,-8.115],[3.057,-5.737],[-1.298,-6.37],[-8.503,-2.742],[-6.552,6.295]],"v":[[-913.983,-3.94],[-935.884,15.433],[-990.219,40.002],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-954.71,64.138],[-905.756,45.069],[-871.05,11.89],[-864.477,-14.787],[-876.762,-29.172],[-900.496,-23.687]]}],"t":100},{"i":{"x":0.35,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[10.806,-1.498],[12.204,-2.842],[20.226,-9.798],[14.416,-11.45],[-4.091,-2.787],[-3.41,3.588],[-28.793,6.62],[-16.146,1.303],[-10.409,2.045],[-5.265,6.43],[2.183,5.599],[7.902,0.967]],"o":[[-9.833,1.363],[-14.927,4.074],[-24.436,11.837],[0,0],[4.091,2.787],[7.645,-8.045],[16.795,-3.826],[15.433,-1.246],[5.684,-1.117],[3.67,-4.482],[-2.892,-7.417],[-8.036,-0.983]],"v":[[-902.522,13.767],[-932.399,19.878],[-989.261,37.393],[-1035.189,65.133],[-1035.866,71.507],[-991.717,79.369],[-955.175,63.419],[-906.595,56.131],[-868.545,54.335],[-852.86,43.273],[-851.321,23.863],[-870.597,11.312]]}],"t":125},{"i":{"x":0.667,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[19.97,5.88],[15.44,-0.965],[15.928,-6.282],[11.697,-11.071],[-4.091,-2.787],[0.608,4.912],[-26.873,12.312],[-16.823,-3.387],[-8.747,-3.952],[-8.563,3.696],[-0.71,6.708],[7.379,5.037]],"o":[[-10.447,-3.076],[-15.725,0.983],[-22.31,8.8],[0,0],[4.091,2.787],[-1.433,-11.582],[19.149,-8.773],[12.837,2.584],[5.924,2.677],[5.969,-2.576],[0.94,-8.885],[-7.504,-5.123]],"v":[[-893.909,28.164],[-931.069,25.376],[-986.464,36.902],[-1035.258,64.111],[-1035.934,70.485],[-991.717,79.369],[-959.467,69.379],[-910.841,64.299],[-885.68,78.513],[-859.232,81.227],[-847.831,67.037],[-859.563,43.484]]}],"t":175},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[8.466,-0.786],[14.333,-1.944],[21.628,-8.358],[11.697,-11.071],[-4.091,-2.787],[0.608,4.912],[-28.947,5.982],[-20.307,-0.725],[-11.876,0.847],[-6.749,6.438],[1.662,6.537],[8.668,2.164]],"o":[[-13.282,1.233],[-15.612,2.118],[-22.37,8.644],[0,0],[4.091,2.787],[-1.433,-11.582],[17.61,-3.639],[14.223,0.507],[6.484,-0.462],[4.704,-4.487],[-2.201,-8.659],[-8.816,-2.2]],"v":[[-897.988,22.601],[-931.069,25.376],[-989.384,38.424],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-959.467,69.379],[-907.367,64.847],[-875.835,66.604],[-849.748,57.981],[-844.101,39.927],[-861.37,22.746]]}],"t":222},{"i":{"x":0.35,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.693,-6.245],[10.36,-4.344],[20.804,-7.776],[11.697,-11.071],[-4.091,-2.787],[-0.95,4.519],[-13.965,3.765],[-17.528,7.256],[-8.346,8.983],[-0.316,7.163],[4.904,2.721],[5.92,-4.334]],"o":[[-7.368,5.294],[-12.852,6.82],[-22.468,8.382],[0,0],[4.091,2.787],[4.004,-6.166],[18.461,-4.977],[15.294,-6.331],[5.875,-6.323],[0.221,-4.992],[-6.496,-3.605],[-7.784,5.699]],"v":[[-914.188,4.9],[-939.217,18.61],[-989.758,39.132],[-1027.718,59.133],[-1028.394,65.506],[-996.339,81.354],[-956.136,65.029],[-907.089,48.103],[-870.699,26.01],[-862.75,6.301],[-873.11,-9.611],[-893.917,-9.866]]}],"t":238},{"i":{"x":0.5,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.73,-8.645],[5.475,-7.296],[19.79,-7.061],[11.697,-11.071],[-4.091,-2.787],[-2.866,4.035],[-26.134,13.811],[-12.754,15.819],[-1.216,11.843],[5.176,7.759],[6.726,-0.508],[3.627,-8.165]],"o":[[-3.14,9.946],[-9.457,12.601],[-22.588,8.059],[0,0],[4.091,2.787],[7.173,-10.101],[13.876,-7.333],[10.529,-13.059],[0.664,-6.467],[-3.608,-5.408],[-8.909,0.673],[-3.689,8.303]],"v":[[-934.108,-16.865],[-947.567,7.143],[-990.219,40.002],[-1027.718,59.133],[-1028.394,65.506],[-1002.022,83.793],[-952.04,59.68],[-907.978,25.406],[-888.376,-18.425],[-892.367,-45.608],[-909.175,-54.287],[-929.079,-40.243]]}],"t":267},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-0.386,-9.057],[3.26,-4.77],[19.79,-7.061],[11.697,-11.071],[-4.091,-2.787],[-3.582,3.416],[-21.918,9.852],[-12.827,22.947],[2.9,11.547],[7.514,5.525],[6.148,-2.774],[0.622,-8.913]],"o":[[0.444,10.42],[-8.889,13.008],[-22.588,8.059],[0,0],[4.091,2.787],[8.91,-8.497],[14.315,-6.434],[8.185,-14.642],[-1.584,-6.305],[-5.237,-3.851],[-8.144,3.674],[-0.633,9.064]],"v":[[-942.641,-15.553],[-947.567,7.143],[-990.219,40.002],[-1027.718,59.133],[-1028.394,65.506],[-1000.689,85.225],[-952.04,59.68],[-909.381,22.995],[-900.983,-32.54],[-913.221,-56.819],[-931.982,-59.238],[-945.896,-39.243]]}],"t":360},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[7.048,-4.411],[6.901,-3.405],[14.9,-7.746],[11.697,-11.071],[-4.091,-2.787],[-1.668,4.099],[-25.129,8.085],[-15.041,7.902],[-7.745,9.655],[1.913,7.233],[4.539,2.003],[5.515,-2.229]],"o":[[-5.687,4.81],[-13.072,7.749],[-13.612,7.077],[0,0],[4.091,2.787],[9.079,-6.046],[15.82,-5.158],[10.64,-5.59],[3.647,-5.035],[-1.293,-5.134],[-6.013,-2.653],[-7.738,3.128]],"v":[[-923.079,2.755],[-942.197,14.671],[-987.324,37.071],[-1027.718,59.133],[-1028.394,65.506],[-996.591,82.55],[-955.478,62.396],[-901.682,40.717],[-874.213,19.461],[-870.76,-3.352],[-880.31,-15.315],[-898.077,-14.915]]}],"t":369},{"i":{"x":0.45,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.003,-1.313],[9.328,-2.495],[15.013,-6.646],[11.697,-11.071],[-4.091,-2.787],[-0.392,4.555],[-27.269,6.906],[-16.611,2.03],[-12.031,4.89],[-2.515,5.746],[1.819,4.461],[6.327,0.832]],"o":[[-9.773,1.069],[-15.861,4.243],[-14.833,6.566],[0,0],[4.091,2.787],[9.192,-4.412],[16.824,-4.307],[13.081,-1.599],[5.811,-2.362],[1.806,-4.126],[-2.41,-5.908],[-13.2,-1.737]],"v":[[-910.037,14.959],[-938.616,19.691],[-985.394,35.116],[-1027.718,59.133],[-1028.394,65.506],[-993.859,80.767],[-957.77,64.207],[-908.581,54.161],[-869.054,53.365],[-856.392,39.808],[-856.337,25.824],[-870.284,13.944]]}],"t":375},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[11.752,-0.504],[14.333,-1.944],[21.628,-8.358],[11.697,-11.071],[-4.091,-2.787],[0.608,4.912],[-28.947,5.982],[-20.307,-0.725],[-11.7,-2.202],[-7.794,5.123],[0.462,6.729],[8.14,3.683]],"o":[[-13.327,0.571],[-15.612,2.118],[-22.37,8.644],[0,0],[4.091,2.787],[-1.433,-11.582],[17.61,-3.639],[14.223,0.507],[7.28,1.37],[5.432,-3.571],[-0.612,-8.913],[-8.278,-3.746]],"v":[[-897.988,22.601],[-931.069,25.376],[-989.384,38.424],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-959.467,69.379],[-907.367,64.847],[-880.001,68.66],[-852.791,64.856],[-843.997,48.108],[-857.904,28.108]]}],"t":389},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.671,-2.069],[12.21,-3.227],[20.676,-8.288],[8.839,-6.681],[-4.091,-2.787],[-1.364,4.072],[-28.273,7.858],[-18.044,0.564],[-9.814,2.664],[-4.366,6.888],[2.791,5.196],[7.812,0.004]],"o":[[-10.85,1.771],[-14.137,4.63],[-18.956,7.598],[0,0],[4.091,2.787],[4.538,-2.167],[16.715,-4.524],[14.364,-0.449],[5.914,-1.35],[3.043,-4.801],[-3.697,-6.882],[-7.945,-0.004]],"v":[[-904.067,12.1],[-935.877,18.915],[-990.747,37.447],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-959.183,66.079],[-905.979,55.951],[-870.091,53.225],[-851.723,41.438],[-853.804,20.286],[-874.924,9.497]]}],"t":411},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.458,-5.877],[9.412,-4.917],[20.607,-7.637],[11.697,-11.071],[-4.091,-2.787],[-3.963,2.965],[-27.384,10.331],[-14.681,10.758],[-5.347,8.541],[1.033,7.826],[5.298,2.126],[5.804,-4.846]],"o":[[-6.665,7.138],[-12.193,7.942],[-22.491,8.319],[0,0],[4.091,2.787],[9.949,-7.444],[15.536,-5.691],[12.148,-7.669],[2.919,-4.663],[-0.72,-5.454],[-7.017,-2.816],[-5.903,4.928]],"v":[[-917.202,-3.893],[-940.235,15.246],[-989.848,39.301],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-955.341,63.99],[-899.576,38.114],[-875.412,14.704],[-869.638,-9.2],[-879.004,-23.238],[-901.65,-20.711]]}],"t":440},{"s":[{"c":true,"i":[[2.73,-8.645],[5.475,-7.296],[19.79,-7.061],[11.697,-11.071],[-4.091,-2.787],[0.608,4.912],[-26.134,13.811],[-12.754,15.819],[-1.216,11.843],[5.176,7.759],[6.726,-0.508],[3.627,-8.165]],"o":[[-3.14,9.946],[-9.457,12.601],[-22.588,8.059],[0,0],[4.091,2.787],[-1.433,-11.582],[13.876,-7.333],[10.529,-13.059],[0.664,-6.467],[-3.608,-5.408],[-8.909,0.673],[-3.689,8.303]],"v":[[-934.108,-16.865],[-947.567,7.143],[-990.219,40.002],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-952.04,59.68],[-907.978,25.406],[-888.376,-18.425],[-892.367,-45.608],[-909.175,-54.287],[-929.079,-40.243]]}],"t":479}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0.08,0.103]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Tail","np":3,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-901.937,29.546]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-936.937,29.546]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Tail","np":2,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":32,"ip":0,"ks":{"a":{"a":1,"ix":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[-884.232,101.187,0],"t":45.906,"ti":[0,0,0],"to":[0,0,0]},{"s":[-884.232,101.187,0],"t":271.453125}]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-923.191,58.706,0]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-87.378],"t":0},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-62.378],"t":59.881},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-79.378],"t":119.76},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-59.378],"t":179.637},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-81.378],"t":239.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-55.378],"t":299.396},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-79.378],"t":359.277},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-52.378],"t":419.156},{"s":[-87.378],"t":479.037109375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Back fin","op":480,"parent":33,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.96,2.502],[0.454,-6.021],[3.656,-7.718],[-6.601,-5.385],[-3.168,-3.428],[-1.845,-2.205],[1.796,6.759],[3.595,3.746]],"o":[[-1.095,-0.319],[-0.681,8.498],[1.627,1.231],[4.546,3.696],[3.071,3.354],[3.171,2.472],[-1.059,-3.719],[-2.226,-2.32]],"v":[[-872.735,98.118],[-879.036,100.623],[-886.904,117.446],[-870.264,125.203],[-861.487,137.822],[-853.611,149.084],[-854.009,124.884],[-861.491,106.076]]}],"t":-19},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.595,1.339],[0.807,-5.851],[3.656,-7.718],[-5.631,-4.288],[-2.57,-1.979],[-5.078,-4.109],[4.042,5.397],[4.791,3.166]],"o":[[-2.191,-0.639],[-1.223,8.392],[1.627,1.231],[4.136,3.15],[5.52,4.25],[5.513,4.461],[-3.42,-4.565],[-3.993,-2.639]],"v":[[-869.833,85.277],[-874.677,90.115],[-879.407,101.286],[-862.238,105.681],[-853.655,112.26],[-835.53,127.19],[-843.868,103.291],[-857.756,90.05]]}],"t":-8},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.906,1.853],[1.064,-5.727],[3.656,-7.718],[-5.026,-3.369],[-3.884,-3.042],[-1.39,-1.074],[8.124,9.252],[4.287,5.057]],"o":[[-2.151,-0.798],[-1.616,8.316],[1.627,1.231],[3.973,2.63],[5.131,4.018],[0.557,1],[-4.113,-4.684],[-2.947,-3.466]],"v":[[-865.495,81.358],[-872.023,83.587],[-878.109,98.551],[-864.094,103.369],[-852.713,112.829],[-837.057,124.541],[-844.696,105.847],[-852.882,90.77]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.139,2.239],[1.257,-5.634],[3.656,-7.718],[-4.572,-2.679],[-3.282,-3.243],[-0.347,-0.269],[3.277,7.105],[4.043,4.4]],"o":[[-2.12,-0.918],[-1.289,8.129],[1.627,1.231],[3.85,2.24],[6.035,5.965],[0.139,0.25],[-2.209,-5.713],[-4.19,-4.511]],"v":[[-869.168,82.315],[-875.062,84.841],[-879.662,100.158],[-866.132,104.583],[-854.844,112.58],[-838.544,126.374],[-845.011,108.446],[-854.067,93.052]]}],"t":11.977},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-3.751,-2.506],[0,0],[1.661,6.389],[3.962,4.181]],"o":[[-2.11,-0.958],[-1.179,8.066],[1.627,1.231],[3.809,2.11],[6.09,4.069],[0,0],[-1.575,-6.056],[-4.604,-4.86]],"v":[[-870.392,82.634],[-876.074,85.259],[-880.179,100.693],[-866.812,104.988],[-855.554,112.497],[-837.29,124.714],[-845.116,109.312],[-854.462,93.812]]}],"t":15.969},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.155,1.287],[0.968,-5.652],[3.027,-7.985],[-4.846,-1.589],[-4.52,-1.258],[0.909,0.167],[3.411,5.088],[4.388,3.113]],"o":[[-2.2,-0.525],[-0.985,8.208],[1.72,1.097],[4.289,1.341],[7.016,2.06],[-2.741,-0.504],[-2.935,-4.65],[-4.843,-3.512]],"v":[[-873.179,84.575],[-878.85,87.591],[-882.671,103.307],[-868.814,105.908],[-855.249,109.998],[-834.016,116.985],[-845.812,104.178],[-857.382,92.154]]}],"t":21.955},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.735,0.576],[1.578,-5.479],[3.656,-7.718],[-5.174,-1.174],[-5.366,-1.191],[2.38,0.638],[5.212,3.603],[4.397,2.242]],"o":[[-2.218,-0.27],[-2.404,8.163],[1.627,1.231],[4.765,0.961],[10.528,2.336],[-7.177,-1.925],[-4.185,-2.893],[-4.449,-2.269]],"v":[[-875.808,96.19],[-882.053,98.622],[-888.723,113.856],[-874.724,116.57],[-858.303,117.823],[-834.804,122.88],[-849.373,109.673],[-861.984,101.076]]}],"t":31.936},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.831,1.159],[1.803,-5.371],[4.959,-6.597],[-5.834,-0.058],[-4.895,0.501],[7.618,5.671],[9.798,2.654],[4.953,2.346]],"o":[[-4.573,-1.384],[-2.749,8.096],[1.627,1.231],[5.602,-0.044],[9.287,-1.29],[-4.779,-3.558],[-5.408,-1.465],[-3.617,-1.713]],"v":[[-877.951,106.972],[-887.544,110.313],[-896.099,124.352],[-876.311,128.393],[-858.677,130.115],[-828.723,129.578],[-849.957,116.265],[-866.471,111.914]]}],"t":45.906},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.211,0.989],[2.267,-5.175],[4.658,-6.96],[-5.057,-1.488],[-5.306,-2.473],[1.24,8.152],[6.016,4.738],[4.594,3.671]],"o":[[-1.919,-0.714],[-3.443,7.858],[1.547,1.331],[5.83,1.881],[6.743,1.883],[-0.702,-5.341],[-4.043,-3.888],[-3.525,-2.817]],"v":[[-880.077,112.026],[-888.261,113.975],[-896.3,128.069],[-879.373,133.415],[-863.58,140.137],[-838.574,144.742],[-854.905,129.952],[-868.008,118.833]]}],"t":53.891},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.241,1.129],[2.71,-4.946],[4.65,-7.163],[-4.312,-2.6],[-5.267,-4.859],[-3.944,9.409],[2.895,6.067],[4.152,4.7]],"o":[[0,0],[-4.134,7.546],[1.449,1.437],[5.774,3.481],[4.504,4.155],[2.636,-6.288],[-2.701,-5.661],[-3.286,-3.72]],"v":[[-880.569,113.611],[-887.633,114.472],[-895.655,128.493],[-881.077,134.949],[-867.279,145.602],[-846.52,154.156],[-858.737,138.325],[-868.386,122.173]]}],"t":59.881},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.581,1.911],[2.028,-5.263],[4.371,-6.996],[-4.74,-4.98],[-3.119,-4.279],[-6.064,3.449],[2.267,8.341],[5.2,6.121]],"o":[[-2.657,-1.109],[-3.094,8.029],[1.627,1.231],[4.009,4.212],[4.74,6.504],[6.112,-3.476],[-2.206,-8.113],[-3.124,-3.677]],"v":[[-877.585,111.21],[-887.06,110.135],[-895.416,125.614],[-878.357,132.162],[-867.94,146.486],[-852.783,165.837],[-853.223,139.886],[-865.477,119.14]]}],"t":75.848},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.636,1.743],[2.233,-5.179],[4.746,-6.94],[-4.06,-4.164],[-3.719,-5.084],[-6.36,-3.172],[2.315,9.663],[5.225,7.089]],"o":[[-2.219,-0.864],[-3.406,7.901],[1.577,1.294],[4.093,4.13],[4.053,5.643],[4.963,1.421],[-1.674,-6.989],[-2.909,-3.946]],"v":[[-877.436,104.101],[-884.997,104.824],[-893.266,119.739],[-878.63,125.452],[-867.691,139.011],[-855.411,155.535],[-856.203,131.916],[-865.163,112.408]]}],"t":83.832},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.753,1.431],[2.175,-5.204],[4.746,-7.084],[-3.737,-3.375],[-4.358,-5.55],[-6.572,-7.885],[2.752,10.554],[5.492,7.621]],"o":[[-1.932,-0.582],[-3.318,7.938],[1.592,1.277],[4.325,3.906],[3.785,4.82],[4.057,4.868],[-1.582,-6.069],[-2.902,-4.027]],"v":[[-877.48,97.907],[-883.617,100.325],[-891.208,115.156],[-878.136,119.602],[-866.241,132.159],[-855.387,146.009],[-857.447,124.158],[-864.753,106.006]]}],"t":89.818},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.872,1.106],[1.854,-5.327],[3.883,-7.581],[-3.936,-3.14],[-4.689,-5.274],[-8.102,-6.823],[6.547,9.84],[5.947,7.271]],"o":[[-2.217,-0.503],[-2.828,8.126],[1.667,1.177],[4.555,3.635],[4.072,4.58],[4.794,4.077],[-3.205,-5.149],[-3.142,-3.842]],"v":[[-871.922,86.243],[-877.808,89.978],[-883.975,105.193],[-869.663,108.98],[-857.829,120.318],[-845.06,131.268],[-847.556,112.028],[-858.128,94.446]]}],"t":103.791},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.028,-5.263],[3.656,-7.718],[-3.83,-3.268],[-4.513,-5.425],[-9.109,-6.387],[9.844,9.566],[5.704,7.463]],"o":[[0,0],[-3.094,8.029],[1.627,1.231],[4.433,3.782],[3.919,4.711],[5.188,3.638],[-4.498,-4.371],[-3.014,-3.944]],"v":[[-867.865,84.454],[-874.752,86.247],[-880.838,101.211],[-866.986,106.765],[-857.051,116.633],[-841.247,125.705],[-842.18,109.22],[-854.651,91.32]]}],"t":119.76},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.776,1.328],[1.674,-5.433],[3.656,-7.718],[-3.953,-3.022],[-4.074,-3.552],[-4.554,-3.193],[5.753,7.978],[5.007,6.654]],"o":[[-1.055,-0.479],[-2.552,8.134],[3.442,0.999],[5.02,3.839],[4.246,3.702],[2.594,1.819],[-3.036,-5.214],[-2.964,-3.947]],"v":[[-869.614,85.537],[-876.369,87.49],[-881.924,102.83],[-869.736,106.41],[-855.721,119.217],[-843.252,130.308],[-845.905,112.313],[-855.909,94.886]]}],"t":127.744},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.224,2.416],[1.731,-5.469],[4.1,-7.491],[-2.985,-3.958],[-2.806,-3.411],[-1.09,-0.863],[2.284,6.932],[4.121,6.3]],"o":[[-1.794,-0.944],[-2.621,8.074],[4.748,1.103],[2.875,3.812],[3.767,4.579],[0.621,0.492],[-1.596,-5.949],[-2.69,-4.113]],"v":[[-870.783,87.645],[-877.548,89.326],[-883.609,104.621],[-871.487,112.015],[-861.162,123.927],[-848.771,138.252],[-850.242,117.175],[-857.386,99.657]]}],"t":133.73},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.157,2.494],[1.457,-5.569],[3.843,-7.626],[-4.36,-2.557],[-2.695,-3.01],[0,0],[1.505,6.428],[4.166,5.948]],"o":[[-2.086,-1.009],[-2.211,8.188],[5.237,0.894],[3.756,2.203],[3.937,4.398],[0,0],[-1.426,-6.093],[-2.816,-4.02]],"v":[[-871.915,88.622],[-878.588,90.573],[-883.279,106.515],[-869.152,113.374],[-859.952,121.858],[-844.285,135.856],[-850.174,118.281],[-857.295,101.149]]}],"t":135.729},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.125,1.61],[1.064,-5.637],[3.258,-7.386],[-4.697,-1.851],[-3.49,-2.122],[0.609,0.091],[2.822,5.416],[4.858,5.064]],"o":[[-2.191,-0.65],[-1.633,8.319],[4.396,0.682],[4.122,1.573],[5.664,3.275],[-1.838,-0.273],[-2.917,-5.252],[-3.3,-3.435]],"v":[[-873.82,89.978],[-879.654,92.845],[-884.732,108.41],[-869.741,111.822],[-858.514,118.322],[-840.459,129.933],[-849.436,113.161],[-859.375,99.242]]}],"t":139.721},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.033,0.853],[0.807,-5.671],[2.859,-7.054],[-4.973,-1.252],[-3.992,-1.87],[1.219,0.181],[3.983,4.443],[5.406,4.284]],"o":[[-2.271,-0.342],[-1.256,8.4],[3.534,0.599],[4.435,1.036],[8.322,3.898],[-3.675,-0.546],[-4.259,-4.447],[-3.686,-2.921]],"v":[[-875.997,91.357],[-881.04,94.977],[-886.171,110.392],[-871.592,113.359],[-858.915,117.602],[-837.692,125.918],[-850.035,110.121],[-861.302,98.053]]}],"t":143.711},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.565,0.666],[1.803,-5.41],[3.972,-7.56],[-5.122,-1.387],[-5.485,-0.358],[2.351,0.736],[5.094,3.561],[5.272,4.138]],"o":[[-2.312,-0.337],[-2.739,8.057],[1.575,1.298],[4.722,1.157],[8.045,0.525],[-7.091,-2.22],[-5.712,-3.993],[-3.629,-2.848]],"v":[[-877.732,99.674],[-884.667,102.091],[-891.366,116.791],[-877.491,120.081],[-861.135,122.011],[-836.998,124.6],[-852.786,115.148],[-864.472,105.057]]}],"t":151.693},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.984,0.38],[2.375,-5.144],[4.446,-7.291],[-5.795,-0.67],[-4.92,-0.016],[6.98,6.44],[8.308,0.844],[4.679,2.853]],"o":[[-2.484,-0.237],[-3.584,7.763],[1.489,1.395],[5.576,0.544],[9.371,-0.308],[-4.379,-4.04],[-5.574,-0.567],[-3.417,-2.083]],"v":[[-880.24,110.098],[-887.263,112.684],[-894.887,126.927],[-880.554,129.777],[-861.962,129.924],[-832.407,123.339],[-854.008,119.081],[-869.039,114.422]]}],"t":165.666},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.397,1.116],[2.535,-5.038],[4.397,-7.321],[-4.4,-2.448],[-5.433,-4.672],[-3.613,9.541],[3.105,5.962],[4.314,4.552]],"o":[[-3.146,-0.651],[-3.868,7.686],[1.498,1.385],[5.892,3.277],[4.646,3.995],[2.414,-6.376],[-2.897,-5.563],[-3.414,-3.603]],"v":[[-878.291,115.102],[-887.793,116.723],[-895.009,130.282],[-878.387,136.824],[-864.225,146.989],[-843.18,154.811],[-855.942,139.418],[-866.15,123.612]]}],"t":179.637},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.617,1.822],[1.76,-4.225],[5.137,-6.081],[-4.048,-3.443],[-3.1,-4.432],[-8.892,2.329],[2.555,7.901],[4.698,6.349]],"o":[[-1.656,-0.653],[-3.309,7.943],[1.509,1.374],[4.04,3.436],[4.246,6.07],[6.802,-1.781],[-2.161,-6.683],[-3.016,-3.909]],"v":[[-881.012,110.281],[-886.815,110.988],[-896.013,125.478],[-882.488,130.514],[-873.063,144.997],[-857.731,162.515],[-856.734,140.021],[-869.037,118.002]]}],"t":195.605},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.785,2.52],[1.429,-4.179],[4.74,-6.769],[-3.703,-3.578],[-3.576,-5.248],[-7.245,-3.795],[2.207,9.523],[4.812,7.304]],"o":[[-0.707,-0.286],[-2.9,8.481],[1.497,1.387],[4.026,3.889],[3.759,5.517],[5.037,2.201],[-1.558,-6.395],[-2.769,-4.099]],"v":[[-879.802,104.761],[-886.308,105.673],[-894.61,120.014],[-881.651,125.188],[-871.188,139.709],[-859.174,155.064],[-858.952,132.889],[-867.563,113.286]]}],"t":203.59},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.703,2.946],[1.141,-4.158],[4.327,-7.362],[-3.525,-3.595],[-4.013,-5.805],[-6.081,-8.27],[2.106,10.702],[5.019,7.94]],"o":[[0,0],[-2.451,8.932],[1.511,1.371],[4.08,4.161],[3.485,5.041],[3.754,5.105],[-1.211,-6.154],[-2.652,-4.196]],"v":[[-877.896,98.756],[-884.915,99.93],[-892.306,114.295],[-879.684,119.357],[-868.203,133.73],[-858.425,147.266],[-859.154,125.33],[-865.317,107.678]]}],"t":209.578},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.809,1.725],[1.112,-4.436],[4.03,-6.827],[-3.838,-3.259],[-5.137,-4.767],[-8.044,-6.979],[6.697,9.973],[5.722,7.449]],"o":[[-1.227,-0.307],[-2.113,8.64],[1.63,1.227],[4.442,3.772],[4.179,3.932],[4.734,4.146],[-3.229,-5.134],[-3.024,-3.936]],"v":[[-872.802,87.265],[-878.361,89.643],[-884.901,104.329],[-871.517,108.096],[-858.57,120.923],[-846.116,131.515],[-847.907,112.561],[-858.196,95.645]]}],"t":225.547},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.705,1.58],[1.782,-4.477],[4.837,-5.676],[-3.568,-3.553],[-5.32,-4.637],[-8.592,-7.067],[9.081,10.294],[5.115,7.879]],"o":[[-2.249,-0.755],[-3.183,7.994],[1.528,1.353],[4.13,4.112],[4.125,3.595],[4.894,4.026],[-4.149,-4.703],[-2.703,-4.163]],"v":[[-869.875,82.415],[-874.489,84.934],[-882.231,101.343],[-868.87,106.075],[-856.773,119.518],[-843.765,129.424],[-843.429,112.916],[-854.57,95.149]]}],"t":239.518},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-3.071,-2.626],[0,0],[1.661,6.389],[4.31,5.844]],"o":[[-2.11,-0.958],[-2.01,8.239],[1.627,1.231],[3.809,2.11],[5.036,4.306],[0,0],[-1.575,-6.056],[-2.913,-3.95]],"v":[[-873.345,88.37],[-879.969,90.483],[-886.055,105.447],[-874.971,109.629],[-863.443,120.007],[-844.56,136.594],[-852.496,115.332],[-860.209,99.45]]}],"t":255.486},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.084,1.698],[2.084,-5.308],[4.363,-7.341],[-5.042,-1.654],[-5.459,-0.645],[2.31,0.858],[4.497,4.416],[5.522,3.798]],"o":[[-2.216,-0.74],[-3.158,7.902],[1.505,1.378],[4.654,1.403],[8.006,0.946],[-6.965,-2.589],[-4.973,-4.883],[-4.62,-3.178]],"v":[[-880.406,100.987],[-888.399,104.503],[-895.859,118.831],[-882.176,122.844],[-865.944,125.63],[-841.743,131.588],[-855.402,116.69],[-868.097,106.548]]}],"t":271.453},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.776,0.32],[1.438,-3.57],[4.362,-7.341],[-4.826,-1.058],[-4.92,0.04],[4.244,8.496],[7.997,5.014],[5.749,2.659]],"o":[[-3.262,-0.181],[-3.195,7.93],[1.505,1.378],[5.966,1.308],[9.367,-0.415],[-2.633,-5.271],[-4.747,-2.976],[-4.323,-2]],"v":[[-887.35,114.168],[-893.294,119.551],[-902.209,133.652],[-888.013,138.459],[-869.836,140.752],[-838.634,138.719],[-857.779,127.39],[-874.162,117.621]]}],"t":285.426},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.538,2.011],[2.889,-4.844],[4.909,-6.988],[-4.214,-2.756],[-5.085,-5.049],[-4.286,9.258],[2.671,6.169],[3.977,4.849]],"o":[[-2.169,-0.961],[-4.408,7.389],[1.395,1.489],[5.642,3.69],[4.349,4.318],[2.864,-6.187],[-2.492,-5.756],[-3.148,-3.838]],"v":[[-884.762,124.356],[-892.198,126.033],[-900.728,139.751],[-887.13,144.959],[-872.978,159.674],[-853.599,170.779],[-864.194,150.929],[-873.246,134.434]]}],"t":299.396},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.436,2.227],[1.673,-3.209],[5.239,-6.744],[-3.52,-3.523],[-3.702,-6.399],[-7.32,5.56],[1.531,8.161],[3.855,6.894]],"o":[[-2.12,-1.064],[-3.977,7.63],[1.322,1.554],[4.419,4.328],[3.042,5.258],[4.805,-3.65],[-1.295,-6.903],[-2.496,-4.261]],"v":[[-886.776,118.064],[-893.911,117.969],[-903.008,132.509],[-889.028,140.174],[-880.222,153.912],[-864.864,172.491],[-865.892,151.919],[-875.302,128.516]]}],"t":315.365},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.568,1.941],[2.141,-5.218],[4.823,-6.261],[-3.281,-3.819],[-3.624,-6.056],[-5.525,-8.651],[1.4,10.817],[4.487,8.252]],"o":[[-2.183,-0.928],[-2.234,5.444],[1.418,1.467],[3.798,4.42],[3.147,5.258],[3.411,5.34],[-0.805,-6.22],[-2.371,-4.361]],"v":[[-882.26,103.749],[-889.868,105.459],[-898.185,119.307],[-885.95,125.162],[-875.654,139.159],[-866.54,154.43],[-865.829,132.493],[-871.14,114.593]]}],"t":329.336},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.486,0.901],[1.787,-5.345],[3.907,-7.193],[-3.743,-3.364],[-4.37,-5.538],[-7.666,-7.248],[5.945,10.1],[5.508,7.604]],"o":[[-1.208,-0.375],[-2.313,6.764],[1.594,1.272],[4.332,3.894],[3.794,4.808],[4.528,4.333],[-2.873,-5.284],[-2.91,-4.018]],"v":[[-878.128,92.455],[-885.282,94.627],[-891.748,109.423],[-877.785,113.909],[-866.614,125.959],[-854.525,137.676],[-855.808,118.307],[-865.459,100.777]]}],"t":343.309},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.235,1.165],[2.738,-4.931],[4.69,-7.136],[-3.34,-3.768],[-4.986,-4.994],[-8.136,-7.588],[8.423,10.838],[4.615,8.182]],"o":[[0,0],[-4.176,7.523],[1.441,1.445],[3.866,4.36],[4.463,4.469],[4.634,4.322],[-3.849,-4.952],[-2.439,-4.323]],"v":[[-873.287,90.33],[-880.355,91.151],[-888.456,105.128],[-875.628,111.27],[-865.01,124.177],[-852.643,134.872],[-851.282,118.417],[-861.152,98.961]]}],"t":359.277},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-2.89,-2.824],[0,0],[1.661,6.389],[4.31,5.844]],"o":[[-2.11,-0.958],[-2.01,8.239],[1.627,1.231],[3.809,2.11],[6.63,6.48],[0,0],[-1.575,-6.056],[-2.913,-3.95]],"v":[[-879.624,91.614],[-886.247,93.727],[-892.333,108.691],[-878.966,112.986],[-869.825,120.733],[-850.148,139.907],[-858.775,118.575],[-866.488,102.693]]}],"t":375.246},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.087,1.688],[2.074,-5.312],[4.348,-7.35],[-5.045,-1.644],[-5.287,-1.504],[2.311,0.854],[6.394,7.64],[5.53,3.787]],"o":[[-2.218,-0.736],[-3.142,7.908],[1.507,1.375],[4.657,1.394],[8.818,2.509],[-6.97,-2.575],[-4.473,-5.345],[-4.627,-3.169]],"v":[[-884.609,102.06],[-892.734,105.935],[-900.166,120.278],[-886.475,124.264],[-871.517,127.158],[-843.682,140.946],[-859.335,121.055],[-872.956,108.08]]}],"t":391.213},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.828,1.167],[1.234,-3.646],[3.939,-7.577],[-4.798,-0.715],[-4.91,0.319],[1.331,9.403],[10.166,1.66],[4.863,2.527]],"o":[[-3.125,-0.953],[-2.74,8.099],[1.58,1.291],[6.508,0.969],[9.328,-0.946],[-0.94,-6.643],[-5.529,-0.903],[-3.551,-1.846]],"v":[[-889.385,112.483],[-894.823,116.419],[-902.924,131.003],[-888.82,134.592],[-869.135,136.036],[-842.719,131.381],[-862.674,120.392],[-877.988,116.767]]}],"t":405.184},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.481,-5.673],[3.656,-7.718],[-7.571,-6.481],[-3.118,-3.162],[-4.545,-2.559],[1.241,5.726],[3.206,1.465]],"o":[[0,0],[-3.877,8.865],[1.627,1.231],[4.956,4.243],[2.555,2.591],[5.227,2.944],[-0.323,-1.491],[-2.1,-0.96]],"v":[[-887.941,117.822],[-894.111,120.487],[-901.964,135.89],[-883.837,142.71],[-871.559,160.47],[-863.841,169.224],[-865.685,147.466],[-877.879,124.509]]}],"t":419.156},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.046,1.808],[0.622,-6.073],[4.047,-7.52],[-4.811,-7.814],[-2.957,-3.476],[-2.761,3.948],[1.22,6.36],[3.289,2.864]],"o":[[-0.588,-0.205],[-0.872,8.512],[1.562,1.313],[1.842,2.992],[2.679,3.149],[4.715,-6.74],[-0.585,-2.74],[-2.079,-1.81]],"v":[[-890.089,112.861],[-896.453,115.116],[-904.32,130.711],[-887.402,138.919],[-878.784,153.753],[-868.981,163.895],[-870.409,141.781],[-878.961,120.621]]}],"t":431.133},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.959,2.502],[0.454,-6.021],[3.656,-7.718],[-6.601,-5.385],[-3.168,-3.428],[-3.502,4.709],[3.765,9.514],[3.595,3.746]],"o":[[-1.095,-0.319],[-3.661,7.628],[1.627,1.231],[4.546,3.696],[3.071,3.354],[5.316,-7.15],[-2.441,-6.168],[-2.226,-2.32]],"v":[[-887.439,103.592],[-891.69,105.733],[-901.608,122.921],[-884.968,130.677],[-874.839,140.755],[-862.625,153.672],[-865.692,128.452],[-876.195,111.55]]}],"t":441.111},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.595,1.339],[0.807,-5.851],[3.656,-7.718],[-5.631,-4.288],[-2.57,-1.979],[-5.771,5.288],[4.042,5.397],[4.791,3.166]],"o":[[-2.191,-0.639],[-1.223,8.392],[1.627,1.231],[4.136,3.15],[5.52,4.25],[6.22,-5.7],[-3.42,-4.565],[-3.993,-2.639]],"v":[[-874.674,84.871],[-879.518,89.709],[-884.248,100.879],[-869.707,106.45],[-860.198,114.556],[-840.371,126.784],[-848.709,102.885],[-862.597,89.643]]}],"t":463.068},{"s":[{"c":true,"i":[[4.906,1.853],[1.064,-5.727],[3.656,-7.718],[-5.026,-3.369],[-3.884,-3.042],[-1.39,-1.074],[8.124,9.252],[4.287,5.057]],"o":[[-2.151,-0.798],[-1.616,8.316],[1.627,1.231],[3.973,2.63],[5.131,4.018],[0.557,1],[-4.113,-4.684],[-2.947,-3.466]],"v":[[-865.495,81.358],[-872.023,83.587],[-878.109,98.551],[-864.094,103.369],[-852.713,112.829],[-837.057,124.541],[-844.696,105.847],[-852.882,90.77]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.68235296011,0.658823549747,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Front fin top","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.158,1.019],[3.431,9.602],[8.969,19.033],[4.472,10.733],[20.656,1.218],[0,0],[2.145,-10.296],[4.05,-4.683],[-5.203,-6.766],[-3.87,-6.281],[-3.693,-10.053],[-2.456,-11.66],[-6.719,-2.886]],"o":[[10.011,-0.805],[-6.46,-18.081],[-5.389,-11.216],[-6.545,-16.129],[-8.921,-0.526],[4.113,7.436],[-0.966,4.637],[5.79,1.866],[7.232,9.406],[6.786,11.129],[3.578,9.739],[1.399,6.639],[6.364,2.733]],"v":[[-794.524,222.695],[-794.83,188.816],[-823.464,138.836],[-837.033,104.682],[-863.242,71.567],[-880.185,76.361],[-879.656,102.432],[-887.494,117.578],[-870.533,125.762],[-854.416,147.446],[-839.332,175.815],[-832.847,202.257],[-814.975,219.017]]}],"t":-19},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.007,-1.863],[-2.601,21.847],[9.255,21.688],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-4.009,-6.213],[1.973,-11.54],[-5.904,-12.722],[-6.408,-6.237]],"o":[[13.75,2.844],[3.026,-25.421],[-5.145,-12.056],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.37,11.422],[-3.468,20.282],[3.21,6.918],[4.74,4.613]],"v":[[-823.342,226.507],[-805.503,189.548],[-817.853,128.155],[-834.021,94.098],[-865.187,62.275],[-880.847,66.829],[-878.149,95.818],[-885.032,111.421],[-867.597,118.537],[-849.625,139.964],[-838.815,169.257],[-853.438,203.188],[-841.768,217.818]]}],"t":-15},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.173,-0.307],[-0.292,20.456],[12.833,18.632],[6.944,9.653],[20.56,-2.336],[0,0],[0.351,-10.511],[3.188,-5.308],[-6.284,-5.775],[-5.113,-5.3],[0.694,-11.687],[-6.003,-10.862],[-6.632,-3.389]],"o":[[13.08,0.502],[0.365,-25.597],[-7.783,-11.107],[-9.824,-13.657],[-8.879,1.009],[5.325,6.622],[-0.158,4.734],[6.024,0.847],[8.736,8.029],[10.089,10.333],[-1.22,20.54],[4.157,7.523],[5.697,2.633]],"v":[[-810.961,203.449],[-790.205,171.167],[-810.462,110.241],[-832.201,79.712],[-866.672,51.503],[-880.017,56.34],[-874.153,84.858],[-879.282,101.122],[-861.171,106.281],[-838.635,124.239],[-822.786,152.996],[-844.395,182.368],[-826.083,199.328]]}],"t":-8},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.341,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-812.7,208.673],[-794.269,182.301],[-811.792,115.203],[-832.435,83.988],[-863.601,52.165],[-875.265,54.124],[-872.567,83.113],[-879.451,98.716],[-862.015,105.832],[-838.78,124.894],[-822.531,161.922],[-844.855,196.789],[-823.956,206.411]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.89,2.029],[8.663,12.792],[15.292,14.622],[6.578,9.906],[20.633,-1.567],[0,0],[0.744,-10.491],[3.385,-5.185],[-6.064,-6.006],[-5.439,-5.009],[-13.943,-17.582],[-9.938,1.212],[-3.61,0.603]],"o":[[7.576,-3.952],[-13.25,-15.548],[-10.238,-9.746],[-9.307,-14.015],[-8.911,0.677],[5.074,6.817],[-0.335,4.725],[5.988,1.071],[8.43,8.35],[11.429,10.525],[13.094,16.511],[7.318,-0.893],[4.328,-0.723]],"v":[[-763.524,181.686],[-765.566,155.136],[-809.99,109.982],[-832.845,80.347],[-866.237,50.87],[-877.728,53.669],[-872.934,82.387],[-878.667,98.448],[-861.269,105.413],[-837.955,124.608],[-802.512,151.864],[-796.425,190.349],[-785.619,188.405]]}],"t":7.984},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.296,4.464],[10.982,5.579],[11.967,14.426],[5.084,10.749],[20.55,-2.419],[0,0],[0.309,-10.513],[3.167,-5.32],[-6.307,-5.75],[-5.642,-4.78],[-10.522,-5.134],[-12.44,-2.874],[-2.337,2.185]],"o":[[4.53,-6.136],[-22.823,-11.595],[-8.812,-10.623],[-7.191,-15.204],[-8.875,1.045],[5.352,6.601],[-0.139,4.734],[6.027,0.823],[8.768,7.993],[11.855,10.043],[10.194,4.974],[6.467,1.494],[5.578,-5.214]],"v":[[-743.782,164.877],[-779.488,148.365],[-820.685,110.863],[-835.426,79.917],[-870.01,51.847],[-881.375,55.12],[-875.397,83.614],[-880.46,99.899],[-863.135,107.002],[-839.919,126.656],[-796.797,154.702],[-757.654,167.969],[-744.989,167.114]]}],"t":13.971},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.402,4.036],[10.008,-1.427],[14.217,10.782],[8.582,9.116],[19.203,-3.47],[0,0],[-0.105,-10.517],[2.955,-5.441],[-6.65,-2.551],[-7.612,-2.689],[-15.628,-2.233],[-10.783,2.975],[-0.778,3.07]],"o":[[1.27,-12.753],[-16.413,2.34],[-9.154,-6.858],[-9.652,-11.231],[-8.755,1.667],[5.608,6.385],[0.047,4.736],[6.055,0.585],[10.619,3.227],[16.169,4.826],[18.942,2.707],[5.72,-0.894],[0.458,-4.626]],"v":[[-737.576,104.15],[-767.578,108.572],[-818.753,96.357],[-839.319,73.254],[-874.29,55.142],[-885.74,59.377],[-878.645,87.614],[-883.063,104.086],[-862.93,107.386],[-837.5,115.892],[-791.62,127.641],[-745.342,122.895],[-737.736,116.316]]}],"t":21.955},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.944,6.464],[13.571,-7.716],[13.942,10.804],[9.775,9.978],[18.347,0.16],[0,0],[2.116,-10.302],[4.036,-4.695],[-6.702,-1.041],[-9.014,-2.789],[-15.84,-2.29],[-10.578,6.241],[-0.138,3.924]],"o":[[-1.103,-9.116],[-16.59,9.433],[-8.154,-5.287],[-9.667,-9.814],[-8.897,0.065],[4.134,7.425],[-0.953,4.64],[5.795,1.849],[12.138,1.405],[19.628,4.321],[25.519,1.46],[5.446,-1.921],[-0.161,-5.662]],"v":[[-735.707,91.387],[-757.985,103.882],[-818.761,102.45],[-840.032,81.631],[-867.701,66.473],[-883.38,72.032],[-882.962,96.358],[-890.756,111.526],[-868.63,116.492],[-841.986,120.49],[-794.891,127.758],[-738.687,118.193],[-733.663,107.201]]}],"t":29.939},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.052,6.512],[14.417,-9.682],[12.293,8.157],[8.629,7.928],[9.682,0.843],[0,0],[3.307,-9.984],[4.558,-4.191],[-7.232,-0.733],[-8.057,-1.635],[-13.506,0.02],[-14.983,11.8],[0.399,3.96]],"o":[[-3.925,-8.95],[-16.771,11.263],[-8.587,-4.208],[-8.746,-7.864],[-5.796,-0.505],[3.237,7.857],[-1.489,4.496],[5.539,2.514],[14.22,0.875],[20.323,1.629],[28.507,-4.155],[5.605,-4.111],[-1.023,-6.439]],"v":[[-744.998,80.924],[-764.37,105.153],[-824.05,110.429],[-844.23,93.454],[-868.543,81.369],[-885.715,84.496],[-887.519,110.357],[-897.034,124.51],[-871.32,130.021],[-842.577,131.541],[-795.615,130.871],[-742.789,113.869],[-738.875,98.019]]}],"t":45.906},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.902,4.872],[8.322,-2.224],[12.785,10.871],[6.171,9.353],[18.608,1.344],[0,0],[2.608,-10.189],[4.257,-4.496],[-6.725,-3.119],[-7.379,-3.404],[-11.374,-2.012],[-19.659,2.886],[-2.976,2.932]],"o":[[1.334,-6.166],[-20.034,5.354],[-8.254,-6.171],[-6.813,-10.965],[-8.89,-0.504],[3.773,7.614],[-1.174,4.589],[5.7,2.125],[12.152,4.625],[13.341,4.439],[17.13,3.03],[4.657,-0.684],[2.915,-4.613]],"v":[[-735.604,127.886],[-758.791,134.377],[-827.949,128.154],[-845.962,103.756],[-873.521,82.237],[-888.804,84.776],[-888.483,113.588],[-896.996,128.365],[-874.568,135.153],[-849.45,145.062],[-815.946,153.906],[-756.441,150.411],[-744.199,143.375]]}],"t":53.891},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.174,3.841],[8.538,1.708],[12.848,13.468],[4.008,10.856],[20.595,2.005],[0,0],[2.537,-10.207],[4.226,-4.526],[-6.357,-5.241],[-6.836,-5.103],[-8.558,-5.687],[-11.847,-3.196],[-5.696,2.228]],"o":[[5.705,-4.338],[-19.613,-3.925],[-7.858,-8.041],[-5.066,-13.724],[-8.894,-0.866],[3.826,7.588],[-1.142,4.597],[5.715,2.085],[10.639,8.102],[8.109,7.547],[9.3,5.596],[6.047,1.631],[6.177,-3.351]],"v":[[-754.735,174.215],[-772.787,165.629],[-829.317,143.001],[-845.077,112.066],[-872.099,83.249],[-887.786,87.351],[-887.958,114.68],[-896.368,129.516],[-876.582,138.468],[-854.086,156.005],[-830.429,174.256],[-794.457,189.376],[-775.142,188.991]]}],"t":59.881},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.556,6.098],[10.589,5.962],[10.657,16.34],[4.11,10.847],[20.608,1.86],[0,0],[2.465,-10.224],[4.194,-4.555],[-5.86,-5.808],[-5.272,-5.727],[-5.988,-7.895],[-7.872,-5.853],[-6.153,-0.413]],"o":[[4.716,-5.176],[-16.142,-9.09],[-6.476,-9.682],[-5.602,-15.007],[-8.9,-0.803],[3.879,7.561],[-1.11,4.605],[5.729,2.045],[8.528,7.848],[7.299,9.412],[6.306,7.688],[5.392,4.009],[6.215,-0.232]],"v":[[-776.005,200.032],[-789.714,183.355],[-831.59,146.816],[-845.828,114.124],[-872.694,81.927],[-888.514,84.679],[-888.525,113.794],[-896.831,128.689],[-878.229,136.895],[-859.531,157.226],[-840.542,180.68],[-819.673,201.429],[-801.346,209.823]]}],"t":67.863},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.177,0.874],[3.236,9.669],[8.584,19.21],[4.255,10.821],[20.628,1.634],[0,0],[2.353,-10.251],[4.144,-4.601],[-5.396,-6.361],[-3.742,-6.358],[-3.49,-10.126],[-2.221,-11.707],[-6.659,-3.021]],"o":[[10.025,-0.603],[-6.094,-18.208],[-5.162,-11.322],[-6.219,-16.258],[-8.908,-0.706],[3.962,7.518],[-1.059,4.616],[5.751,1.982],[6.445,7.598],[6.56,11.263],[3.38,9.809],[1.264,6.666],[6.308,2.861]],"v":[[-805.178,231.838],[-804.8,197.96],[-832.421,147.413],[-845.299,112.992],[-872.196,77.517],[-888.176,80.77],[-887.868,109.883],[-896.009,124.868],[-878.573,132.277],[-863.54,155.397],[-849.031,184.064],[-843.081,210.632],[-825.55,227.749]]}],"t":75.848},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.868,-2.441],[-4.005,21.634],[7.836,22.24],[5.161,10.712],[20.653,1.27],[0,0],[2.172,-10.29],[4.062,-4.673],[-5.185,-6.779],[-3.599,-6.459],[2.714,-11.389],[-5.071,-13.076],[-5.992,-6.637]],"o":[[13.538,3.726],[4.66,-25.172],[-4.356,-12.363],[-7.303,-15.156],[-8.919,-0.549],[4.094,7.447],[-0.978,4.634],[5.785,1.88],[7.208,9.424],[6.617,11.874],[-4.769,20.016],[2.757,7.11],[4.432,4.909]],"v":[[-839.302,239.051],[-819.115,203.32],[-827.478,141.258],[-841.415,106.229],[-870.462,72.461],[-886.383,75.995],[-885.562,105.098],[-893.437,120.224],[-876.498,128.45],[-859.946,150.993],[-851.048,180.922],[-867.831,213.838],[-857.129,229.191]]}],"t":83.832},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.9,-2.32],[-3.712,21.686],[8.137,22.132],[5.306,10.641],[20.668,0.99],[0,0],[2.032,-10.319],[3.998,-4.728],[-5.277,-6.708],[-3.687,-6.41],[2.559,-11.424],[-5.247,-13.007],[-6.081,-6.555]],"o":[[13.587,3.542],[4.319,-25.233],[-4.523,-12.303],[-7.507,-15.056],[-8.926,-0.428],[4.194,7.391],[-0.915,4.647],[5.81,1.802],[7.335,9.326],[6.777,11.783],[-4.498,20.078],[2.853,7.072],[4.498,4.849]],"v":[[-835.394,233.194],[-815.693,197.194],[-824.896,135.251],[-839.305,100.413],[-868.807,67.042],[-884.678,70.791],[-883.463,99.88],[-891.134,115.112],[-874.084,123.108],[-857.228,145.424],[-847.927,175.23],[-864.262,208.37],[-853.353,223.577]]}],"t":89.818},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.121,-1.021],[-1.884,20.371],[11.343,19.575],[6.171,10.164],[20.68,-0.728],[0,0],[1.169,-10.452],[3.592,-5.043],[-5.815,-6.247],[-4.684,-5.682],[1.603,-11.597],[-5.139,-11.297],[-6.348,-3.896]],"o":[[13.001,1.519],[2.357,-25.491],[-6.895,-11.679],[-8.731,-14.381],[-8.93,0.314],[4.793,7.017],[-0.526,4.707],[5.94,1.313],[8.084,8.685],[9.253,11.087],[-2.817,20.383],[3.559,7.824],[5.475,3.069]],"v":[[-824.179,212.678],[-800.972,182.111],[-816.422,119.792],[-835.717,87.662],[-867.887,56.854],[-881.567,60.637],[-877.942,89.525],[-884.322,105.34],[-866.668,111.894],[-845.6,131.553],[-832.038,161.456],[-855.87,189.056],[-838.934,207.391]]}],"t":103.791},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.34,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-815.254,211.782],[-796.823,185.411],[-814.345,118.313],[-834.99,87.098],[-866.155,55.275],[-877.819,57.233],[-875.121,86.222],[-882.005,101.825],[-864.569,108.941],[-841.334,128.004],[-825.085,165.031],[-847.409,199.899],[-826.51,209.52]]}],"t":119.76},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.982,1.842],[8.045,13.19],[14.578,15.334],[6.099,10.208],[20.684,-0.582],[0,0],[1.242,-10.443],[3.628,-5.018],[-5.771,-6.288],[-5.195,-5.263],[-13.09,-18.226],[-9.985,0.738],[-3.634,0.431]],"o":[[7.755,-3.587],[-12.494,-16.161],[-9.762,-10.222],[-8.629,-14.442],[-8.932,0.252],[4.744,7.051],[-0.559,4.703],[5.93,1.355],[8.023,8.741],[10.915,11.058],[12.293,17.116],[7.352,-0.543],[4.357,-0.516]],"v":[[-772.585,190.019],[-773.361,163.402],[-815.584,116.184],[-837.003,85.495],[-868.954,54.462],[-880.565,56.711],[-876.072,84.151],[-882.785,102.965],[-866.588,109.179],[-844.214,129.463],[-810.109,158.375],[-805.861,197.106],[-794.975,195.679]]}],"t":127.744},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.912,3.935],[10.05,7.122],[9.734,16.018],[3.461,11.376],[20.683,0.606],[0,0],[1.839,-10.355],[3.91,-4.801],[-5.401,-6.609],[-4.884,-5.552],[-9.66,-6.615],[-11.887,-4.659],[-2.631,1.82]],"o":[[5.377,-5.41],[-20.887,-14.802],[-7.167,-11.795],[-4.895,-16.091],[-8.932,-0.262],[4.331,7.311],[-0.828,4.663],[5.843,1.693],[7.508,9.187],[10.262,11.666],[9.359,6.408],[6.18,2.422],[6.28,-4.344]],"v":[[-761.76,187.149],[-794.674,165.603],[-829.958,122.491],[-840.025,89.725],[-870.142,56.909],[-881.863,58.487],[-877.765,86.605],[-883.738,104.13],[-871.389,112.476],[-851.29,135.308],[-812.722,169.347],[-775.934,188.184],[-763.281,189.186]]}],"t":133.73},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.819,3.972],[10.102,-0.378],[13.018,12.202],[7.587,9.959],[19.46,-1.454],[0,0],[0.989,-10.47],[3.505,-5.104],[-6.348,-3.228],[-7.291,-3.467],[-15.311,-3.847],[-11.034,1.837],[-1.093,2.972]],"o":[[2.589,-12.552],[-16.568,0.62],[-8.392,-7.772],[-8.432,-12.174],[-8.881,0.747],[4.913,6.934],[-0.445,4.715],[5.961,1.211],[10.225,4.314],[15.58,6.482],[18.558,4.663],[5.781,-0.294],[0.937,-4.553]],"v":[[-741.51,123.882],[-771.809,125.16],[-821.436,107.688],[-839.488,82.572],[-872.385,60.921],[-884.214,63.942],[-880.094,92.764],[-886.202,108.686],[-866.52,114.063],[-842.113,125.168],[-797.703,141.625],[-751.183,141.718],[-742.934,135.966]]}],"t":141.715},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.016,6.453],[13.483,-7.868],[14.062,10.647],[9.886,9.868],[18.347,-0.046],[0,0],[2,-10.325],[3.984,-4.74],[-6.713,-0.966],[-9.044,-2.688],[-15.865,-2.113],[-10.507,6.359],[-0.094,3.925]],"o":[[-1.205,-9.103],[-16.483,9.618],[-8.213,-5.195],[-9.777,-9.705],[-8.895,0.165],[4.217,7.378],[-0.901,4.65],[5.816,1.784],[12.153,1.269],[19.675,4.101],[25.534,1.174],[5.424,-1.982],[-0.225,-5.66]],"v":[[-737.037,93.175],[-759.173,105.919],[-819.962,105.168],[-841.464,84.588],[-873.143,68.389],[-885.532,70.71],[-884.227,99.796],[-891.851,115.051],[-869.67,119.768],[-842.983,123.467],[-795.809,130.207],[-739.716,120.012],[-734.816,108.964]]}],"t":149.699},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.466,6.302],[13.763,-10.592],[12.794,7.348],[9.122,7.355],[15.977,0.347],[0,0],[2.656,-10.176],[4.278,-4.476],[-7.265,-0.266],[-8.145,-1.112],[-13.477,0.891],[-14.191,12.741],[0.653,3.926]],"o":[[-4.494,-8.679],[-16.01,12.321],[-8.84,-3.646],[-9.234,-7.284],[-8.893,0.02],[3.737,7.632],[-1.196,4.583],[5.69,2.152],[14.247,-0.043],[20.386,0.315],[28.179,-5.983],[5.328,-4.463],[-1.436,-6.36]],"v":[[-746.873,73.364],[-764.642,98.791],[-823.859,107.902],[-845.091,92.264],[-873.578,80.592],[-886.643,82.812],[-887.2,111.922],[-895.783,126.658],[-869.767,130.501],[-840.986,130.165],[-794.164,126.469],[-742.544,106.098],[-739.661,90.029]]}],"t":165.666},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.947,4.863],[8.342,-2.148],[12.685,10.987],[6.085,9.409],[18.595,1.514],[0,0],[2.701,-10.164],[4.298,-4.457],[-6.697,-3.181],[-7.347,-3.471],[-11.355,-2.116],[-19.684,2.706],[-3.002,2.905]],"o":[[1.39,-6.154],[-20.082,5.171],[-8.198,-6.246],[-6.712,-11.027],[-8.885,-0.585],[3.703,7.649],[-1.216,4.578],[5.68,2.177],[12.11,4.736],[13.3,4.56],[17.101,3.186],[4.663,-0.641],[2.957,-4.586]],"v":[[-734.405,130.931],[-757.651,137.209],[-826.749,130.355],[-844.538,105.793],[-871.899,84.023],[-886.462,86.13],[-887.147,115.236],[-895.795,129.935],[-873.43,136.928],[-848.403,147.065],[-814.982,156.216],[-755.447,153.264],[-743.141,146.341]]}],"t":173.65},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.006,4.016],[8.603,1.342],[13.412,12.907],[4.468,10.675],[20.662,1.122],[0,0],[2.098,-10.306],[4.028,-4.702],[-6.575,-4.965],[-7.048,-4.806],[-8.793,-5.316],[-11.973,-2.687],[-5.595,2.47]],"o":[[5.515,-4.578],[-19.763,-3.083],[-8.194,-7.697],[-5.649,-13.495],[-8.923,-0.485],[4.147,7.417],[-0.945,4.641],[5.799,1.839],[10.975,7.64],[8.425,7.193],[9.531,5.193],[6.111,1.371],[6.028,-3.612]],"v":[[-752.4,169.727],[-770.803,161.922],[-828.248,141.73],[-845.316,111.498],[-873.546,83.862],[-889.076,86.846],[-888.047,115.942],[-895.814,131.125],[-875.664,139.222],[-852.439,155.781],[-828.023,173.005],[-791.438,186.573],[-772.157,185.362]]}],"t":179.637},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.941,5.724],[10.178,6.639],[9.572,16.999],[3.395,11.092],[20.444,3.197],[0,0],[3.125,-10.042],[4.481,-4.273],[-5.47,-6.177],[-4.888,-6.057],[-5.462,-8.268],[-7.474,-6.353],[-6.113,-0.812]],"o":[[5.043,-4.858],[-15.516,-10.121],[-5.832,-10.083],[-4.613,-15.339],[-8.829,-1.381],[3.379,7.797],[-1.407,4.523],[5.584,2.413],[8,8.386],[6.672,9.867],[5.792,8.082],[5.12,4.351],[6.216,0.173]],"v":[[-781.868,209.196],[-794.463,191.661],[-833.872,152.475],[-845.954,118.926],[-870.667,85.05],[-886.608,84.981],[-888.539,115.819],[-897.796,130.142],[-879.768,139.54],[-862.432,161.045],[-845.009,185.686],[-825.535,207.748],[-807.793,217.317]]}],"t":187.621},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.221,0.349],[2.523,9.88],[7.161,19.785],[3.455,11.102],[20.454,3.133],[0,0],[3.093,-10.052],[4.468,-4.287],[-4.917,-6.737],[-3.269,-6.613],[-2.742,-10.353],[-1.361,-11.838],[-6.421,-3.498]],"o":[[10.042,0.129],[-4.75,-18.604],[-4.323,-11.668],[-5.017,-16.668],[-8.833,-1.353],[3.404,7.786],[-1.393,4.527],[5.592,2.396],[5.874,8.048],[5.722,11.712],[2.656,10.029],[0.775,6.74],[6.082,3.313]],"v":[[-813.778,238.82],[-810.932,205.06],[-834.795,152.634],[-845.13,117.366],[-869.369,80.025],[-885.545,82.104],[-887.359,111.162],[-896.571,125.514],[-879.721,134.174],[-866.413,158.328],[-854.033,187.977],[-850.035,214.908],[-833.798,233.257]]}],"t":195.605},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.725,-2.91],[-5.153,21.389],[6.639,22.627],[4.583,10.972],[20.556,2.37],[0,0],[2.717,-10.16],[4.305,-4.45],[-4.816,-7.046],[-3.25,-6.642],[3.318,-11.228],[-4.366,-13.328],[-5.629,-6.947]],"o":[[13.32,4.443],[5.996,-24.888],[-3.69,-12.578],[-6.484,-15.524],[-8.877,-1.024],[3.691,7.655],[-1.224,4.576],[5.677,2.186],[6.695,9.795],[5.974,12.21],[-5.831,19.733],[2.374,7.247],[4.164,5.139]],"v":[[-847.091,241.594],[-825.026,206.991],[-830.067,144.572],[-842.115,108.848],[-869.319,73.579],[-885.406,76.258],[-886.138,105.363],[-894.81,120.048],[-878.333,129.166],[-863.007,152.56],[-855.719,182.921],[-874.234,214.895],[-864.366,230.797]]}],"t":203.59},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.763,-2.795],[-4.871,21.455],[6.936,22.537],[4.727,10.911],[20.585,2.099],[0,0],[2.583,-10.195],[4.246,-4.506],[-4.909,-6.982],[-3.337,-6.599],[3.169,-11.27],[-4.541,-13.27],[-5.72,-6.873]],"o":[[13.377,4.267],[5.668,-24.965],[-3.856,-12.528],[-6.688,-15.437],[-8.89,-0.907],[3.791,7.605],[-1.164,4.591],[5.705,2.111],[6.824,9.706],[6.135,12.13],[-5.57,19.808],[2.469,7.216],[4.231,5.083]],"v":[[-843.152,235.327],[-821.545,200.437],[-827.407,138.089],[-839.924,102.527],[-867.59,67.619],[-883.64,70.51],[-883.989,99.623],[-892.467,114.42],[-875.872,123.321],[-860.239,146.51],[-852.552,176.773],[-870.644,208.988],[-860.568,224.758]]}],"t":209.578},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.089,-1.277],[-2.457,20.31],[10.787,19.887],[5.882,10.334],[20.692,-0.145],[0,0],[1.463,-10.415],[3.733,-4.94],[-5.637,-6.409],[-4.523,-5.812],[1.929,-11.548],[-4.818,-11.437],[-6.235,-4.073]],"o":[[12.953,1.885],[3.075,-25.414],[-6.563,-11.869],[-8.322,-14.621],[-8.936,0.063],[4.594,7.149],[-0.659,4.69],[5.901,1.48],[7.836,8.909],[8.937,11.343],[-3.39,20.295],[3.337,7.921],[5.386,3.222]],"v":[[-829.051,213.527],[-804.992,183.626],[-818.68,120.897],[-837.062,88.236],[-868.35,56.534],[-882.132,59.929],[-879.323,88.908],[-886.146,104.537],[-868.684,111.586],[-848.177,131.831],[-835.464,162.105],[-860.064,189.022],[-843.652,207.827]]}],"t":223.549},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.117,-1.215],[-3.513,18.363],[11.31,18.607],[5.23,10.679],[20.661,1.138],[0,0],[2.105,-10.304],[4.032,-4.699],[-5.229,-6.746],[-4.739,-5.676],[2.641,-11.406],[-10.18,-9.647],[-5.898,-1.998]],"o":[[11.954,1.593],[4.81,-25.144],[-7.391,-12.159],[-7.4,-15.109],[-8.923,-0.491],[4.142,7.42],[-0.948,4.641],[5.797,1.843],[7.269,9.378],[9.958,11.926],[-4.641,20.046],[9.574,9.073],[5.99,2.029]],"v":[[-822.778,214.701],[-802.845,189.446],[-816.438,121.443],[-835.233,89.08],[-864.496,55.5],[-876.254,56.777],[-875.246,85.874],[-883.025,101.051],[-866.033,109.168],[-843.945,129.549],[-829.875,167.458],[-854.188,200.969],[-833.883,211.789]]}],"t":239.518},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.067,1.645],[7.392,13.567],[13.813,16.027],[5.594,10.493],[20.688,0.427],[0,0],[1.75,-10.37],[3.868,-4.835],[-5.457,-6.562],[-4.932,-5.51],[-12.186,-18.843],[-10.009,0.25],[-3.651,0.253]],"o":[[7.921,-3.204],[-11.691,-16.751],[-9.252,-10.686],[-7.914,-14.846],[-8.934,-0.185],[4.394,7.274],[-0.788,4.67],[5.857,1.643],[7.587,9.122],[10.362,11.577],[11.444,17.695],[7.37,-0.184],[4.377,-0.303]],"v":[[-777.898,196.047],[-777.375,169.423],[-817.244,120.202],[-837.14,88.504],[-867.539,55.949],[-879.246,57.629],[-877.239,86.674],[-884.492,102.109],[-867.845,110.716],[-846.488,132.067],[-813.834,162.609],[-811.481,201.501],[-800.538,200.607]]}],"t":247.502},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.746,4.093],[10.335,6.702],[10.386,15.603],[3.927,11.224],[20.691,-0.247],[0,0],[1.411,-10.422],[3.708,-4.958],[-5.668,-6.381],[-5.109,-5.346],[-9.924,-6.211],[-12.069,-4.165],[-2.554,1.927]],"o":[[5.15,-5.627],[-21.479,-13.928],[-7.648,-11.49],[-5.555,-15.875],[-8.935,0.107],[4.629,7.127],[-0.635,4.694],[5.908,1.451],[7.88,8.87],[10.734,11.233],[9.615,6.017],[6.275,2.165],[6.095,-4.6]],"v":[[-757.221,183.138],[-790.996,162.967],[-828.026,121.346],[-839.436,89.023],[-870.88,57.476],[-882.526,59.536],[-879.573,88.501],[-886.319,104.164],[-869.835,113.048],[-848.812,135.031],[-808.874,167.451],[-771.341,184.756],[-758.657,185.235]]}],"t":253.49},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.137,3.893],[10.099,0.437],[11.992,13.211],[6.76,10.538],[19.514,0.119],[0,0],[1.83,-10.357],[3.905,-4.805],[-6.067,-3.729],[-6.988,-4.043],[-14.951,-5.068],[-11.146,0.942],[-1.329,2.875]],"o":[[3.593,-12.302],[-16.564,-0.717],[-7.738,-8.423],[-7.423,-12.814],[-8.912,0.029],[4.338,7.307],[-0.824,4.664],[5.844,1.688],[9.844,5.124],[15.007,7.716],[18.122,6.143],[5.786,0.173],[1.301,-4.463]],"v":[[-747.695,136.307],[-777.998,135.139],[-826.056,113.724],[-842.025,87.235],[-873.07,63.004],[-885.104,65.061],[-883.32,94.121],[-890.691,109.5],[-871.507,116.445],[-848.075,129.481],[-805.136,149.463],[-758.774,153.305],[-750.088,148.237]]}],"t":261.475},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.652,6.5],[13.904,-7.097],[13.441,11.421],[9.316,10.408],[18.321,0.986],[0,0],[2.578,-10.196],[4.244,-4.508],[-6.648,-1.342],[-8.879,-3.193],[-15.721,-3.002],[-10.848,5.758],[-0.315,3.914]],"o":[[-0.691,-9.157],[-16.998,8.676],[-7.907,-5.649],[-9.215,-10.239],[-8.891,-0.336],[3.795,7.603],[-1.161,4.592],[5.706,2.108],[12.062,1.951],[19.414,5.201],[25.427,2.608],[5.527,-1.674],[0.094,-5.663]],"v":[[-740.547,104.111],[-763.365,115.59],[-824.015,111.42],[-844.326,89.664],[-875.043,71.708],[-887.543,73.329],[-887.876,102.442],[-896.346,117.244],[-874.466,123.201],[-848.029,128.396],[-801.309,137.779],[-744.732,130.755],[-739.218,120.001]]}],"t":269.459},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.754,6.644],[14.841,-9.019],[11.911,8.706],[8.261,8.311],[15.843,2.097],[0,0],[3.756,-9.824],[4.743,-3.98],[-7.192,-1.06],[-7.974,-1.999],[-13.493,-0.592],[-15.503,11.108],[0.219,3.974]],"o":[[-3.515,-9.119],[-17.264,10.491],[-8.387,-4.594],[-8.38,-8.253],[-8.842,-0.955],[2.878,7.996],[-1.691,4.424],[5.42,2.763],[14.166,1.519],[20.228,2.548],[28.666,-2.858],[5.785,-3.852],[-0.73,-6.479]],"v":[[-749.701,96.975],[-770.151,120.3],[-830.009,122.865],[-849.399,104.993],[-873.502,87.857],[-888.432,90.16],[-893.409,119.915],[-903.556,133.622],[-878.118,140.294],[-849.474,143.116],[-802.529,144.575],[-748.987,129.987],[-744.359,114.33]]}],"t":285.426},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1,4.853],[8.364,-2.057],[12.565,11.124],[5.983,9.475],[18.578,1.717],[0,0],[2.812,-10.134],[4.346,-4.41],[-6.662,-3.253],[-7.309,-3.551],[-11.331,-2.239],[-19.713,2.491],[-3.034,2.872]],"o":[[1.457,-6.138],[-20.137,4.952],[-8.129,-6.335],[-4.038,-12.389],[-8.878,-0.682],[3.62,7.688],[-1.266,4.564],[5.656,2.239],[12.057,4.867],[13.249,4.705],[17.066,3.372],[4.669,-0.59],[3.006,-4.553]],"v":[[-741.669,140.889],[-764.981,146.914],[-834.001,139.308],[-850.013,112.835],[-875.692,90.477],[-890.277,92.425],[-894.231,123.532],[-903.038,138.136],[-880.751,145.372],[-855.836,155.781],[-822.516,165.295],[-762.952,162.992],[-750.572,156.203]]}],"t":293.41},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.259,3.747],[8.498,1.898],[12.545,13.751],[3.765,10.943],[20.545,2.463],[0,0],[2.764,-10.147],[4.326,-4.43],[-4.426,-7.152],[-6.72,-5.254],[-10.121,-4.789],[-11.773,-3.459],[-5.744,2.101]],"o":[[5.801,-4.21],[-19.521,-4.361],[-7.677,-8.214],[-4.76,-13.833],[-8.873,-1.064],[3.656,7.671],[-1.245,4.57],[5.667,2.212],[4.793,7.746],[7.939,7.726],[11.757,5.563],[6.009,1.766],[6.25,-3.212]],"v":[[-757.947,186.122],[-775.803,177.136],[-836.407,157.946],[-846.881,121.975],[-873.254,92.563],[-888.946,94.531],[-891.964,122.584],[-902.818,139.753],[-880.007,150.537],[-863.613,169.347],[-834.318,186.269],[-797.997,200.394],[-778.678,200.439]]}],"t":299.396},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-6.138,5.512],[9.939,6.991],[8.971,17.324],[3.005,11.204],[20.319,3.911],[0,0],[3.474,-9.927],[4.628,-4.113],[-5.25,-6.364],[-4.673,-6.225],[-5.169,-8.454],[-7.247,-6.61],[-6.081,-1.026]],"o":[[5.21,-4.679],[-15.153,-10.658],[-5.476,-10.28],[-4.073,-15.491],[-8.775,-1.689],[3.104,7.911],[-1.565,4.471],[5.496,2.607],[7.701,8.661],[6.322,10.095],[5.506,8.28],[4.964,4.528],[6.207,0.39]],"v":[[-789.748,220.85],[-801.721,202.885],[-839.735,162.344],[-850.634,128.393],[-873.317,91.937],[-889.334,93.094],[-893.301,121.635],[-904.975,137.647],[-885.149,147.811],[-868.576,169.909],[-852.027,195.144],[-833.337,217.875],[-815.941,228.058]]}],"t":307.381},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.227,0.188],[2.302,9.933],[6.718,19.939],[3.206,11.176],[20.379,3.588],[0,0],[3.317,-9.98],[4.562,-4.186],[-4.766,-6.845],[-3.121,-6.685],[-2.511,-10.411],[-1.097,-11.865],[-6.342,-3.64]],"o":[[10.037,0.353],[-4.335,-18.705],[-4.062,-11.762],[-4.645,-16.776],[-8.801,-1.55],[3.229,7.86],[-1.494,4.495],[5.537,2.52],[5.693,8.177],[5.459,11.836],[2.432,10.086],[0.625,6.756],[6.007,3.448]],"v":[[-823.623,247.89],[-820.025,214.202],[-842.713,161.257],[-852.26,125.767],[-873.429,85.784],[-889.997,87.434],[-894.34,118.624],[-903.87,132.767],[-887.217,141.8],[-874.451,166.245],[-862.734,196.162],[-859.337,223.175],[-843.514,241.882]]}],"t":315.365},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.497,-3.521],[-6.656,20.97],[5.019,23.04],[3.794,11.269],[20.336,3.821],[0,0],[3.431,-9.942],[4.61,-4.134],[-4.305,-7.37],[-2.771,-6.856],[4.105,-10.964],[-3.41,-13.604],[-5.123,-7.329]],"o":[[12.972,5.375],[7.745,-24.4],[-2.79,-12.808],[-5.367,-15.945],[-8.782,-1.65],[3.139,7.897],[-1.545,4.477],[5.508,2.583],[5.984,10.245],[5.094,12.602],[-7.214,19.27],[1.854,7.397],[3.789,5.421]],"v":[[-863.282,250.728],[-838.821,217.776],[-839.426,155.156],[-848.912,118.669],[-871.291,79.774],[-888.125,81.836],[-892.578,112.074],[-902.268,126.107],[-886.479,136.37],[-872.85,160.79],[-867.731,191.592],[-888.465,222.173],[-879.749,238.734]]}],"t":323.35},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.729,-2.899],[-5.127,21.396],[6.667,22.618],[4.596,10.967],[20.559,2.345],[0,0],[2.705,-10.163],[4.3,-4.455],[-4.825,-7.04],[-3.258,-6.638],[3.303,-11.232],[-4.383,-13.323],[-5.638,-6.94]],"o":[[13.326,4.426],[5.965,-24.895],[-3.706,-12.573],[-6.503,-15.516],[-8.879,-1.013],[3.7,7.65],[-1.218,4.577],[5.68,2.179],[6.708,9.787],[5.99,12.202],[-5.806,19.74],[2.383,7.244],[4.17,5.133]],"v":[[-851.464,241.363],[-829.442,206.733],[-834.561,144.319],[-846.653,108.611],[-873.902,73.376],[-889.985,76.075],[-890.681,105.182],[-899.335,119.877],[-882.846,128.975],[-867.492,152.349],[-860.165,182.701],[-878.64,214.698],[-868.752,230.588]]}],"t":329.336},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.039,-1.597],[-3.171,20.211],[10.08,20.255],[5.515,10.535],[20.684,0.584],[0,0],[1.828,-10.357],[3.904,-4.806],[-5.408,-6.603],[-4.315,-5.968],[2.334,-11.473],[-4.413,-11.599],[-6.088,-4.29]],"o":[[12.879,2.34],[3.968,-25.29],[-6.141,-12.093],[-7.802,-14.905],[-8.933,-0.252],[4.339,7.307],[-0.823,4.664],[5.845,1.687],[7.517,9.179],[8.533,11.651],[-4.102,20.163],[3.056,8.033],[5.269,3.41]],"v":[[-839.874,219.599],[-814.778,190.563],[-826.249,127.391],[-843.471,94.104],[-873.624,61.32],[-887.517,64.228],[-885.729,93.288],[-893.098,108.668],[-875.895,116.327],[-856.114,137.28],[-844.474,167.983],[-870.006,194.018],[-854.266,213.389]]}],"t":343.309},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.047,-1.655],[-4.399,18.171],[10.395,19.133],[4.706,10.92],[20.582,2.138],[0,0],[2.603,-10.19],[4.255,-4.498],[-4.896,-6.991],[-4.459,-5.899],[3.19,-11.264],[-9.701,-10.13],[-5.794,-2.281]],"o":[[11.863,2.17],[6.023,-24.881],[-6.793,-12.503],[-6.659,-15.45],[-8.888,-0.923],[3.777,7.612],[-1.172,4.589],[5.701,2.122],[6.806,9.719],[9.369,12.395],[-5.607,19.798],[9.123,9.526],[5.885,2.317]],"v":[[-835.363,221.847],[-814.229,197.587],[-824.51,129.005],[-841.714,95.77],[-868.504,60.025],[-880.76,58.966],[-881.525,90.628],[-890.03,105.41],[-873.451,114.341],[-852.377,135.768],[-840.162,174.315],[-866.07,206.608],[-846.313,218.4]]}],"t":359.277},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.087,1.596],[7.226,13.655],[13.617,16.194],[5.466,10.56],[20.681,0.679],[0,0],[1.876,-10.348],[3.926,-4.787],[-5.377,-6.628],[-4.864,-5.569],[-11.956,-18.989],[-10.011,0.128],[-3.654,0.209]],"o":[[7.959,-3.108],[-11.486,-16.892],[-9.121,-10.798],[-7.733,-14.941],[-8.931,-0.293],[4.305,7.327],[-0.845,4.661],[5.837,1.714],[7.475,9.214],[10.221,11.702],[11.228,17.833],[7.371,-0.094],[4.38,-0.25]],"v":[[-784.821,200.445],[-783.975,173.83],[-823.243,124.127],[-842.751,92.19],[-872.752,59.268],[-884.479,60.805],[-882.825,89.873],[-891.933,106.61],[-873.725,114.028],[-852.628,135.637],[-820.348,166.573],[-818.468,205.491],[-807.515,204.73]]}],"t":367.262},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.791,4.051],[10.26,6.816],[10.212,15.717],[3.802,11.266],[20.692,-0.018],[0,0],[1.527,-10.406],[3.763,-4.917],[-5.597,-6.443],[-5.049,-5.402],[-9.855,-6.32],[-12.022,-4.298],[-2.575,1.899]],"o":[[5.212,-5.569],[-21.324,-14.165],[-7.52,-11.574],[-5.378,-15.936],[-8.936,0.008],[4.55,7.177],[-0.688,4.686],[5.891,1.516],[7.781,8.957],[10.609,11.351],[9.548,6.123],[6.25,2.235],[6.146,-4.532]],"v":[[-763.411,187.239],[-796.96,166.696],[-833.528,124.667],[-844.578,92.219],[-875.671,60.326],[-887.339,62.258],[-884.707,91.253],[-892.368,108.255],[-875.242,115.906],[-854.464,138.121],[-814.887,170.982],[-777.548,188.701],[-764.87,189.321]]}],"t":373.248},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.163,3.885],[10.096,0.505],[11.903,13.292],[6.688,10.584],[19.513,0.251],[0,0],[1.9,-10.344],[3.937,-4.778],[-6.042,-3.77],[-6.961,-4.09],[-14.917,-5.169],[-11.152,0.866],[-1.349,2.865]],"o":[[3.676,-12.278],[-16.559,-0.829],[-7.681,-8.476],[-7.336,-12.864],[-8.912,-0.031],[4.289,7.336],[-0.856,4.659],[5.833,1.727],[9.809,5.191],[14.954,7.817],[18.08,6.265],[5.785,0.212],[1.331,-4.454]],"v":[[-752.743,139.144],[-783.038,137.771],[-830.95,116.032],[-846.739,89.435],[-877.62,64.994],[-889.667,66.97],[-888.08,96.042],[-895.555,111.37],[-876.418,118.445],[-853.075,131.639],[-810.272,151.911],[-763.937,156.067],[-755.217,151.057]]}],"t":381.232},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.685,6.496],[13.868,-7.169],[13.5,11.351],[9.369,10.36],[18.326,0.892],[0,0],[2.525,-10.209],[4.221,-4.53],[-6.655,-1.308],[-7.369,-4.343],[-16.886,0.678],[-10.818,5.814],[-0.294,3.915]],"o":[[-0.738,-9.153],[-16.953,8.763],[-7.937,-5.608],[-9.268,-10.192],[-8.892,-0.29],[3.835,7.584],[-1.137,4.598],[5.717,2.079],[12.072,1.888],[16.591,9.779],[19.784,-0.795],[5.518,-1.702],[0.065,-5.664]],"v":[[-744.376,104.171],[-767.135,115.768],[-827.806,111.912],[-848.229,90.26],[-876.346,70.744],[-891.53,74.148],[-891.713,103.263],[-900.106,118.108],[-878.195,123.952],[-855.764,135.754],[-807.398,149.181],[-748.424,130.837],[-742.966,120.054]]}],"t":389.217},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.196,6.443],[14.199,-9.999],[12.471,7.884],[8.802,7.735],[15.948,1.024],[0,0],[3.085,-10.055],[4.464,-4.29],[-7.247,-0.573],[-8.091,-1.456],[-13.502,0.319],[-14.718,12.128],[0.486,3.951]],"o":[[-4.122,-8.861],[-16.518,11.631],[-8.678,-4.018],[-8.917,-7.669],[-8.886,-0.357],[3.41,7.784],[-1.389,4.528],[5.594,2.391],[14.236,0.56],[20.354,1.179],[28.408,-4.784],[5.512,-4.234],[-1.165,-6.415]],"v":[[-753.182,84.09],[-772.013,108.741],[-831.562,115.335],[-852.112,98.811],[-879.846,84.173],[-892.993,85.837],[-895.017,116.667],[-904.216,131.027],[-878.386,135.968],[-849.617,136.852],[-802.681,135.143],[-750.244,116.978],[-746.682,101.045]]}],"t":405.184},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.003,4.852],[8.366,-2.052],[12.559,11.132],[5.977,9.478],[18.577,1.727],[0,0],[2.817,-10.133],[4.349,-4.407],[-6.66,-3.257],[-7.307,-3.555],[-11.461,-1.435],[-20.331,4.854],[-3.036,2.87]],"o":[[1.46,-6.137],[-20.14,4.94],[-8.125,-6.339],[-6.586,-11.103],[-8.878,-0.687],[3.616,7.69],[-1.269,4.563],[5.655,2.242],[12.055,4.874],[13.247,4.712],[24.941,3.122],[4.578,-1.093],[3.009,-4.552]],"v":[[-742.792,137.474],[-766.108,143.486],[-835.124,135.841],[-852.63,111.077],[-878.289,87.227],[-892.875,89.166],[-895.344,120.031],[-904.16,134.63],[-881.877,141.878],[-856.968,152.302],[-823.654,161.835],[-764.088,159.565],[-751.704,152.783]]}],"t":413.168},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.027,8.423],[16.173,-5.024],[14.885,11.866],[2.353,10.858],[20.638,1.499],[0,0],[2.286,-10.266],[4.113,-4.628],[-5.11,-6.836],[-4.487,-5.877],[-6.964,-4.569],[-13.924,-1.688],[-10.922,6.918]],"o":[[13.415,-14.076],[-28.095,8.727],[-9.811,-7.822],[-4.099,-18.914],[-8.913,-0.647],[4.011,7.492],[-1.029,4.623],[5.764,1.944],[7.104,9.503],[7.042,9.224],[18.037,11.835],[12.668,1.536],[11.134,-7.053]],"v":[[-755.993,176.283],[-775.073,165.58],[-842.789,156.298],[-855.609,124.91],[-878.494,86.284],[-894.453,89.641],[-893.955,118.751],[-902.97,135.979],[-885.15,142.203],[-870.651,161.844],[-849.751,184.663],[-807.75,203.113],[-783.064,196.889]]}],"t":419.156},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.892,3.84],[7.852,3.556],[8.268,16.842],[2.566,11.11],[20.402,3.451],[0,0],[3.249,-10.003],[4.534,-4.217],[-4.438,-7.29],[-3.436,-6.523],[-9.07,-13.026],[-8.837,-7.242],[-8.834,1.611]],"o":[[7.01,-4.568],[-16.498,-7.472],[-5.259,-10.713],[-3.859,-17.643],[-8.811,-1.49],[3.282,7.838],[-1.463,4.505],[5.554,2.482],[6.17,10.134],[5.755,11.09],[4.836,6.945],[7.034,5.764],[11.251,-2.051]],"v":[[-783.11,217.048],[-801.341,199.79],[-845.689,156.808],[-855.112,122.268],[-877.117,83.497],[-893.323,85.324],[-895.589,114.351],[-906.047,130.571],[-889.049,138.532],[-875.779,160.972],[-857.62,189.944],[-831.087,220.915],[-804.835,224.844]]}],"t":433.129},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.194,0.716],[3.023,9.738],[8.16,19.394],[4.016,10.911],[20.587,2.087],[0,0],[2.577,-10.196],[4.244,-4.509],[-4.913,-6.979],[-3.602,-6.438],[-3.266,-10.2],[-1.963,-11.753],[-6.591,-3.166]],"o":[[10.036,-0.383],[-5.692,-18.337],[-4.911,-11.433],[-5.86,-16.391],[-8.891,-0.901],[3.796,7.603],[-1.161,4.592],[5.706,2.108],[6.83,9.702],[6.311,11.405],[3.164,9.881],[1.118,6.692],[6.243,2.999]],"v":[[-810.709,230.026],[-809.587,196.165],[-836.09,145.023],[-848.208,110.327],[-872.998,76.137],[-889.99,78.746],[-892.145,105.015],[-902.138,123.067],[-879.474,134.096],[-867.377,152.32],[-853.502,181.3],[-848.137,207.992],[-830.987,225.49]]}],"t":441.111},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.746,-2.846],[-4.997,21.426],[6.804,22.577],[4.663,10.939],[20.573,2.22],[0,0],[2.643,-10.18],[4.273,-4.481],[-4.868,-7.011],[-3.298,-6.618],[3.235,-11.252],[-4.463,-13.296],[-5.68,-6.906]],"o":[[13.352,4.345],[5.814,-24.931],[-3.782,-12.551],[-6.597,-15.476],[-8.885,-0.959],[3.747,7.627],[-1.19,4.584],[5.693,2.145],[6.767,9.746],[6.063,12.166],[-5.686,19.775],[2.427,7.23],[4.201,5.108]],"v":[[-849.967,235.477],[-828.156,200.715],[-833.652,138.334],[-845.961,102.699],[-873.423,67.63],[-889.489,70.426],[-890.009,99.537],[-898.573,114.284],[-882.03,123.282],[-866.534,146.562],[-859.024,176.87],[-877.304,208.978],[-867.32,224.807]]}],"t":449.096},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.148,-0.746],[-1.272,20.419],[11.925,19.226],[6.473,9.975],[20.648,-1.348],[0,0],[0.855,-10.482],[3.439,-5.149],[-6,-6.07],[-4.853,-5.539],[1.254,-11.64],[-5.475,-11.137],[-6.462,-3.703]],"o":[[13.041,1.128],[1.591,-25.55],[-7.242,-11.467],[-9.158,-14.112],[-8.917,0.582],[5.002,6.87],[-0.385,4.721],[5.976,1.135],[8.341,8.438],[9.582,10.804],[-2.203,20.458],[3.792,7.713],[5.564,2.903]],"v":[[-822.473,207.644],[-800.194,176.394],[-817.508,114.567],[-837.759,83.031],[-870.839,53.203],[-884.4,57.394],[-879.909,86.16],[-885.812,102.16],[-867.969,108.181],[-846.319,127.199],[-831.867,156.682],[-854.859,184.985],[-837.381,202.803]]}],"t":463.068},{"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.341,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-812.7,208.673],[-794.269,182.301],[-811.792,115.203],[-832.435,83.988],[-863.601,52.165],[-875.265,54.124],[-872.567,83.113],[-879.451,98.716],[-862.015,105.832],[-838.78,124.894],[-822.531,161.922],[-844.855,196.789],[-823.956,206.411]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0.075,0.089]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Front fin bottom","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":33,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1042.089,166.545,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-1070.661,116.187,0]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[18],"t":0},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[61],"t":59.754},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[15],"t":119.76},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[63],"t":179.264},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[15],"t":239.518},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[56],"t":299.396},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[15],"t":359.277},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[55],"t":419.156},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[18],"t":479},{"s":[14],"t":479.037109375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Back leg","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.43,-1.058],[7.906,-10.49],[12.734,-10.672],[14.247,-7.798],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-11.171,11.101],[-5.963,17.173],[2.357,1.507],[8.29,2.032]],"o":[[-3.265,10.739],[-9.743,12.928],[-9.486,7.95],[-17.304,9.471],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[15.06,-14.966],[5.261,-15.152],[-7.068,-4.518],[-8.506,-2.085]],"v":[[-966.566,42.779],[-982.43,74.206],[-1007.796,99.802],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-974.016,158.919],[-938.577,100.937],[-927.397,51.506],[-946.166,42.903]]}],"t":0},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.396,1.189],[11.39,-6.542],[12.781,-8.108],[10.101,-6.863],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-11.171,11.101],[-12.228,13.451],[1.35,2.45],[6.309,5.748]],"o":[[-10.021,5.672],[-14.037,8.062],[-10.368,6.577],[-16.317,11.085],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[15.06,-14.966],[10.789,-11.868],[-4.047,-7.347],[-6.473,-5.898]],"v":[[-934.252,54.878],[-966.86,73.386],[-1008.008,97.993],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-974.016,158.919],[-934.795,118.262],[-904.022,81.271],[-916.393,64.741]]}],"t":59.881},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.513,-0.613],[7.118,-8.877],[12.781,-8.108],[10.836,-6.564],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-10.2,11.999],[-8.231,16.208],[2.196,1.733],[8.047,2.844]],"o":[[-2.346,12.532],[-10.127,12.629],[-10.368,6.577],[-16.872,10.221],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[13.094,-15.404],[7.304,-14.384],[-6.585,-5.197],[-8.257,-2.918]],"v":[[-965.101,41.775],[-978.396,72.344],[-1007.891,99.81],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-974.016,158.919],[-937.004,103.315],[-922.794,55.526],[-940.617,45.103]]}],"t":119.76},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.309,1.476],[9.65,-6.563],[12.781,-8.108],[10.836,-6.564],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-14.568,13.961],[-13.047,13.947],[1.185,2.534],[5.917,6.151]],"o":[[-11.006,8.562],[-13.385,9.104],[-10.368,6.577],[-16.872,10.221],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[14.597,-13.988],[14.539,-15.541],[-3.555,-7.598],[-6.071,-6.311]],"v":[[-935.511,51.875],[-962.904,70.781],[-1007.891,99.81],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-974.016,158.919],[-933.909,118.671],[-903.222,82.665],[-915.12,65.83]]}],"t":179.637},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.541,-0.343],[6.13,-9.058],[13.157,-9.352],[10.836,-6.564],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-13.748,14.77],[-8.655,17.024],[2.089,1.861],[7.863,3.319]],"o":[[-3.187,13.629],[-9.073,13.406],[-10.007,7.113],[-16.872,10.221],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[15.669,-16.833],[9.644,-18.971],[-6.263,-5.58],[-8.068,-3.406]],"v":[[-965.295,40.955],[-977.526,70.708],[-1007.866,101.283],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-974.016,158.919],[-937.67,107.89],[-923.48,56.516],[-941.053,45.738]]}],"t":239.518},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.116,1.95],[10.762,-6.77],[15.507,-8.124],[10.836,-6.564],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-14.952,13.55],[-14.334,12.62],[0.894,2.651],[5.189,6.776]],"o":[[-11.52,8.362],[-13.702,8.62],[-10.876,5.697],[-16.872,10.221],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[18.239,-16.53],[16.621,-14.633],[-2.68,-7.949],[-5.324,-6.953]],"v":[[-931.061,57.799],[-962.382,76.575],[-1007.866,101.283],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-972.928,159.222],[-932.891,123.359],[-901.905,94.244],[-912.366,73.955]]}],"t":299.396},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.554,-0.081],[7.449,-9.873],[13.847,-9.537],[10.836,-6.564],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-13.546,14.955],[-11.326,20.908],[1.978,1.978],[7.659,3.766]],"o":[[-5.37,14.103],[-9.75,12.922],[-10.112,6.964],[-16.872,10.221],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[19.362,-21.375],[10.547,-19.471],[-5.931,-5.931],[-7.859,-3.864]],"v":[[-962.601,45.151],[-977.095,72.533],[-1009.061,102.342],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-972.928,159.222],[-935.373,108.073],[-920.29,64.852],[-938.674,51.32]]}],"t":359.277},{"i":{"x":0.833,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.114,1.954],[10.749,-6.905],[16.015,-9.241],[10.836,-6.564],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-14.519,14.013],[-17.771,15.799],[0.891,2.652],[5.183,6.781]],"o":[[-12.044,7.494],[-13.62,8.749],[-10.635,6.136],[-16.872,10.221],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[19.725,-19.038],[15.72,-13.976],[-2.672,-7.951],[-5.318,-6.958]],"v":[[-936.262,57.204],[-965.99,75.902],[-1009.061,102.342],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1010.154,192.767],[-977.669,162.878],[-933.809,122.068],[-907.139,93.675],[-917.581,73.376]]}],"t":419.156},{"s":[{"c":true,"i":[[4.43,-1.058],[7.906,-10.49],[12.734,-10.672],[14.247,-7.798],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-11.171,11.101],[-5.963,17.173],[2.357,1.507],[8.29,2.032]],"o":[[-3.265,10.739],[-9.743,12.928],[-9.486,7.95],[-17.304,9.471],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[15.06,-14.966],[5.261,-15.152],[-7.068,-4.518],[-8.506,-2.085]],"v":[[-966.566,42.779],[-982.43,74.206],[-1007.796,99.802],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-974.016,158.919],[-938.577,100.937],[-927.397,51.506],[-946.166,42.903]]}],"t":479}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Back leg","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":34,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1317.804,73.33,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1261.998,119.472,0],"t":0,"ti":[0.128,-0.333,0],"to":[-0.427,1.111,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1264.557,126.141,0],"t":59.881,"ti":[-0.085,0.222,0],"to":[-0.128,0.333,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1262.766,121.473,0],"t":119.76,"ti":[-0.341,0.889,0],"to":[0.085,-0.222,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1264.045,124.807,0],"t":179.637,"ti":[-0.231,-0.726,0],"to":[0.341,-0.889,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1260.718,116.138,0],"t":239.518,"ti":[0.564,-0.804,0],"to":[0.231,0.726,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1262.658,129.165,0],"t":299.396,"ti":[0.068,0.154,0],"to":[-0.564,0.804,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1264.099,120.961,0],"t":359.277,"ti":[-0.35,0.248,0],"to":[-0.068,-0.154,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.48,"y":0},"s":[-1263.069,128.242,0],"t":419.156,"ti":[0.172,1.214,0],"to":[0.35,-0.248,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1261.998,119.472,0],"t":479,"ti":[0.35,-0.248,0],"to":[-0.172,-1.214,0]},{"s":[-1264.099,120.961,0],"t":479.037109375}]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-126],"t":0},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-120],"t":59.881},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-125.5],"t":119.76},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-121],"t":179.637},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-127],"t":239.518},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-119.5],"t":299.396},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-125],"t":359.277},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-120.5],"t":419.156},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-126],"t":479},{"s":[-126],"t":479.037109375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Back arm","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[21.814,-4.558],[12.143,-1.898],[17.84,-4.69],[-0.514,-7.034],[-7.04,-1.792],[-11.588,-1.028],[-19.889,1.3],[-18.276,1.474],[-1.349,8.767],[2.43,3.536],[3.497,2.459],[4.261,0.348]],"o":[[-16.184,3.382],[-13.494,2.11],[-12.611,3.316],[0.8,10.961],[11.716,2.982],[11.909,1.057],[17.176,-1.123],[13.818,-1.114],[0.395,-2.565],[-2.421,-3.523],[-3.497,-2.459],[-8.855,-0.723]],"v":[[-1374.915,63.68],[-1416.275,69.233],[-1459.113,76.912],[-1474,94.406],[-1452.362,110.958],[-1421.002,115.305],[-1383.65,115.109],[-1296.239,107.281],[-1284.742,89.252],[-1291.818,73.781],[-1301.603,65.43],[-1328.18,55.741]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Back arm","np":3,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-1385.801,84.442]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1385.801,84.442]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Back arm","np":1,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":35,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-419,819,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.696],"y":[0.637]},"o":{"x":[0.326],"y":[0.279]},"s":[144.166],"t":30},{"i":{"x":[0.814],"y":[0.723]},"o":{"x":[0.429],"y":[0.303]},"s":[352.279],"t":344},{"i":{"x":[0.983],"y":[0.868]},"o":{"x":[0.584],"y":[0.324]},"s":[452],"t":433},{"s":[545],"t":464}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.801],"y":[-0.511]},"o":{"x":[0.418],"y":[0.109]},"s":[418],"t":30},{"i":{"x":[0.781],"y":[0.546]},"o":{"x":[0.504],"y":[0.19]},"s":[429],"t":342},{"i":{"x":[0.983],"y":[0.865]},"o":{"x":[0.456],"y":[0.17]},"s":[493.659],"t":433},{"s":[616],"t":464}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.701],"y":[0.014]},"o":{"x":[0.361],"y":[0.129]},"s":[0],"t":30},{"i":{"x":[0.9],"y":[0.679]},"o":{"x":[0.605],"y":[0.068]},"s":[2.414],"t":342},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.362],"y":[0.223]},"s":[23.192],"t":433},{"s":[60],"t":464}]},"s":{"a":0,"ix":6,"k":[20,20,100]}},"nm":"Angler fish 2","op":480,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-12.901,26.049],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.023,5.928]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-605.035,808.5],[-582.035,808.413],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-604.849,857.5]]}],"t":155},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-7.905,27.974],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.787,2.338]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-608.476,814.087],[-585.882,809.783],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-599.306,862.222]]}],"t":190.912},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-14.325,25.294],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[18.665,6.973]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-602.535,812.235],[-579.565,813.423],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-605.064,861.17]]}],"t":236},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-10.821,26.98],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.429,4.419]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-600.336,817.891],[-577.413,816.002],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-596.311,866.725]]}],"t":271},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-14.31,25.303],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[18.669,6.962]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-598.873,811.928],[-575.903,813.102],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-601.373,860.865]]}],"t":303},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-10.473,27.117],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.484,4.169]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-606.141,817.304],[-583.245,815.12],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-601.488,866.083]]}],"t":333},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-14.177,25.377],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[18.705,6.864]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-603.958,806.032],[-580.982,807.085],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-606.202,854.981]]}],"t":360},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[-9.947,27.314],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.561,3.791]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-614.819,809.549],[-591.969,806.923],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-609.224,858.229]]}],"t":381},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-14.31,25.303],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[18.669,6.962]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-598.873,811.928],[-575.903,813.102],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-601.373,860.865]]}],"t":402},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-7.905,27.974],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.787,2.338]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-608.476,814.087],[-585.882,809.783],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-599.306,862.222]]}],"t":421},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[-12.901,26.049],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.023,5.928]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-605.035,808.5],[-582.035,808.413],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-604.849,857.5]]}],"t":434},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-7.905,27.974],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.787,2.338]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-608.476,814.087],[-585.882,809.783],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-599.306,862.222]]}],"t":443},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[-12.901,26.049],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.023,5.928]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-605.035,808.5],[-582.035,808.413],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-604.849,857.5]]}],"t":451},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-7.905,27.974],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.787,2.338]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-608.476,814.087],[-585.882,809.783],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-599.306,862.222]]}],"t":455},{"s":[{"c":true,"i":[[-12.901,26.049],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.023,5.928]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-605.035,808.5],[-582.035,808.413],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-604.849,857.5]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"body fiill","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[5.817,1.697],[5.621,2.263],[-1.551,5.857],[-1.458,1.732],[-17.965,8.403],[-13.698,2.968],[-13.227,-4.634],[-4.013,-4.383],[4.455,-13.052],[0.782,-0.839],[1.404,-0.449],[18.675,-5.969],[17.926,-1.873]],"o":[[-0.229,-6.055],[-5.817,-1.697],[-5.621,-2.263],[0.58,-2.188],[12.771,-15.174],[12.695,-5.938],[13.698,-2.968],[5.608,1.965],[9.313,10.172],[-0.37,1.085],[-1.005,1.079],[-18.675,5.969],[-17.168,5.487],[0,0]],"v":[[-496.897,718.062],[-508.825,705.95],[-526.531,701.972],[-535.65,688.084],[-532.199,682.301],[-483.369,649.16],[-443.995,634.668],[-402.505,636.099],[-387.475,645.343],[-382.804,684.465],[-384.371,687.498],[-388.25,689.515],[-444.274,707.422],[-496.685,720.302]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-457.885,676.408]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-457.885,676.408]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"top fin","np":1,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[8.283,1.812],[4.205,-2.799],[-1.505,-4.144],[-3.346,-2.87],[-19.01,-3.887],[-17.836,7.641],[-2.733,7.173]],"o":[[-7.675,3.604],[-4.934,-1.079],[-3.67,2.443],[1.505,4.144],[14.728,12.633],[19.01,3.887],[7.056,-3.023],[0,0]],"v":[[-529.005,955.744],[-553.833,958.533],[-568.524,958.312],[-571.525,970.203],[-563.368,980.422],[-511.86,1006.175],[-454.787,1000.84],[-437.864,986.166]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-505.049,982.233]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-505.049,982.233]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"bottom fin","np":1,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.44,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-41.132,7.791],[-13.421,-3.371],[-7.426,-11.677],[0.62,-14.527],[3.327,-16.385]],"o":[[22.394,-35.37],[13.597,-2.575],[13.421,3.371],[7.802,12.27],[-0.823,19.28],[0,0]],"v":[[-356.957,696.004],[-255.956,627.381],[-214.768,627.475],[-181.273,650.286],[-171.177,692.22],[-177.327,739.385]]}],"t":45},{"i":{"x":0.55,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-5.111,-13.612],[-5.403,-15.822]],"o":[[22.394,-35.37],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[6.783,18.066],[0,0]],"v":[[-356.957,696.004],[-278.523,613.736],[-238.417,604.354],[-198.19,616.535],[-166.036,653.069],[-147.104,701.762]]}],"t":77},{"i":{"x":0.46,"y":1},"o":{"x":0.39,"y":0},"s":[{"c":false,"i":[[0,0],[-41.132,7.791],[-13.421,-3.371],[-3.51,-13.386],[2.51,-14.322],[5.436,-15.81]],"o":[[22.394,-35.37],[13.597,-2.575],[13.421,3.371],[5.05,19.26],[-3.331,19.008],[0,0]],"v":[[-356.957,696.004],[-255.956,627.381],[-219.753,632.489],[-193.737,662.822],[-194.969,715.842],[-208.476,759.305]]}],"t":108},{"i":{"x":0.61,"y":1},"o":{"x":0.47,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-2.897,-14.249],[-2.836,-16.477]],"o":[[10.314,-40.232],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[3.845,18.911],[0,0]],"v":[[-356.957,696.004],[-301.032,611.321],[-260.927,601.939],[-220.699,614.119],[-197.013,648.169],[-186.01,699.242]]}],"t":127},{"i":{"x":0.52,"y":1},"o":{"x":0.42,"y":0},"s":[{"c":false,"i":[[0,0],[-41.861,-0.423],[-9.041,-10.477],[-2.324,-8.872],[2.405,-14.34],[5.32,-15.85]],"o":[[22.394,-35.37],[13.838,0.14],[12.115,14.039],[3.685,14.066],[-3.191,19.032],[0,0]],"v":[[-356.957,696.004],[-259.26,641.159],[-216.329,660.562],[-201.823,695.973],[-199.219,738.048],[-211.132,784.096]]}],"t":159},{"i":{"x":0.48,"y":0.48},"o":{"x":0.44,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-12.575,-15.463],[-2.37,-16.893]],"o":[[22.394,-35.37],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[12.175,14.972],[0,0]],"v":[[-356.957,696.004],[-278.523,613.736],[-238.417,604.354],[-199.461,614.045],[-169.868,643.1],[-153.497,684.314]]}],"t":195},{"i":{"x":0.44,"y":1},"o":{"x":0.47,"y":0},"s":[{"c":false,"i":[[0,0],[-41.132,7.791],[-13.421,-3.371],[-7.426,-11.677],[0.62,-14.527],[3.327,-16.385]],"o":[[22.394,-35.37],[13.597,-2.575],[13.421,3.371],[7.802,12.27],[-0.823,19.28],[0,0]],"v":[[-356.957,696.004],[-255.956,627.381],[-214.768,627.475],[-181.273,650.286],[-171.177,692.22],[-177.327,739.385]]}],"t":223},{"i":{"x":0.55,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-5.111,-13.612],[-5.403,-15.822]],"o":[[22.394,-35.37],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[6.783,18.066],[0,0]],"v":[[-356.957,696.004],[-278.523,613.736],[-238.417,604.354],[-198.19,616.535],[-166.036,653.069],[-147.104,701.762]]}],"t":255},{"i":{"x":0.46,"y":1},"o":{"x":0.39,"y":0},"s":[{"c":false,"i":[[0,0],[-41.132,7.791],[-13.421,-3.371],[-3.51,-13.386],[2.51,-14.322],[5.436,-15.81]],"o":[[22.394,-35.37],[13.597,-2.575],[13.421,3.371],[5.05,19.26],[-3.331,19.008],[0,0]],"v":[[-356.957,696.004],[-255.956,627.381],[-219.753,632.489],[-193.737,662.822],[-194.969,715.842],[-208.476,759.305]]}],"t":286},{"i":{"x":0.61,"y":1},"o":{"x":0.47,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-2.897,-14.249],[-2.836,-16.477]],"o":[[10.314,-40.232],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[3.845,18.911],[0,0]],"v":[[-356.957,696.004],[-301.032,611.321],[-260.927,601.939],[-220.699,614.119],[-197.013,648.169],[-186.01,699.242]]}],"t":305},{"i":{"x":0.52,"y":1},"o":{"x":0.42,"y":0},"s":[{"c":false,"i":[[0,0],[-41.861,-0.423],[-9.041,-10.477],[-2.324,-8.872],[2.405,-14.34],[5.32,-15.85]],"o":[[22.394,-35.37],[13.838,0.14],[12.115,14.039],[3.685,14.066],[-3.191,19.032],[0,0]],"v":[[-356.957,696.004],[-259.26,641.159],[-216.329,660.562],[-201.823,695.973],[-199.219,738.048],[-211.132,784.096]]}],"t":337},{"i":{"x":0.35,"y":1},"o":{"x":0.44,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-12.575,-15.463],[-2.37,-16.893]],"o":[[22.394,-35.37],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[12.175,14.972],[0,0]],"v":[[-356.957,696.004],[-278.523,613.736],[-238.417,604.354],[-199.461,614.045],[-169.868,643.1],[-153.497,684.314]]}],"t":382},{"i":{"x":0.44,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":false,"i":[[0,0],[-41.132,7.791],[-13.421,-3.371],[-3.51,-13.386],[-1.355,-14.477],[1.075,-16.684]],"o":[[22.394,-35.37],[13.597,-2.575],[13.421,3.371],[5.05,19.26],[1.799,19.214],[0,0]],"v":[[-356.957,696.004],[-273.583,616.332],[-237.381,621.44],[-211.364,651.772],[-203.966,709.295],[-205.535,754.781]]}],"t":410},{"i":{"x":0.46,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-5.111,-13.612],[-5.403,-15.822]],"o":[[22.394,-35.37],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[6.783,18.066],[0,0]],"v":[[-356.957,696.004],[-278.523,613.736],[-238.417,604.354],[-198.19,616.535],[-166.036,653.069],[-147.104,701.762]]}],"t":438},{"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-2.897,-14.249],[-2.836,-16.477]],"o":[[10.314,-40.232],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[3.845,18.911],[0,0]],"v":[[-356.957,696.004],[-301.032,611.321],[-260.927,601.939],[-220.699,614.119],[-197.013,648.169],[-186.01,699.242]]}],"t":463}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"angler line","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.44,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[7.625,1.085],[5.118,-2.109],[-7.151,-10.802],[-9.574,0.424],[-0.479,5.565],[5.282,5.285]],"o":[[-5.716,-0.813],[-10.031,4.134],[4.193,6.334],[13.164,-0.583],[0.835,-9.696],[-5.282,-5.285]],"v":[[-175.888,736.998],[-192.969,739.866],[-198.193,773.416],[-172.426,782.076],[-148.835,765.946],[-154.348,745.363]]}],"t":45},{"i":{"x":0.55,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[7.129,-2.915],[3.352,-4.405],[-11.628,-5.711],[-8.049,5.201],[2.397,5.045],[7.228,1.894]],"o":[[-5.344,2.185],[-6.57,8.634],[6.818,3.349],[11.068,-7.152],[-4.176,-8.79],[-7.228,-1.894]],"v":[[-147.067,698.976],[-160.36,710.078],[-147.925,741.673],[-121.311,736.133],[-109.098,710.296],[-124.251,695.316]]}],"t":77},{"i":{"x":0.46,"y":1},"o":{"x":0.39,"y":0},"s":[{"c":true,"i":[[7.419,2.071],[5.35,-1.423],[-5.681,-11.642],[-9.548,-0.829],[-1.201,5.455],[4.547,5.929]],"o":[[-5.561,-1.552],[-10.485,2.79],[3.331,6.827],[13.128,1.14],[2.093,-9.504],[-4.547,-5.929]],"v":[[-206.737,757.127],[-224.046,757.743],[-233.602,790.324],[-209.185,802.272],[-183.692,789.356],[-186.473,768.23]]}],"t":108},{"i":{"x":0.61,"y":1},"o":{"x":0.47,"y":0},"s":[{"c":true,"i":[[7.5,-1.752],[4.006,-3.821],[-10.579,-7.476],[-8.77,3.865],[1.57,5.361],[6.838,3.012]],"o":[[-5.622,1.313],[-7.852,7.488],[6.204,4.384],[12.058,-5.314],[-2.735,-9.34],[-6.838,-3.012]],"v":[[-185.533,696.496],[-200.413,705.359],[-193.125,738.521],[-165.97,737.255],[-149.829,713.672],[-162.426,696.486]]}],"t":127},{"i":{"x":0.52,"y":1},"o":{"x":0.42,"y":0},"s":[{"c":true,"i":[[7.434,2.016],[5.339,-1.463],[-5.766,-11.6],[-9.553,-0.759],[-1.161,5.464],[4.591,5.896]],"o":[[-5.572,-1.511],[-10.464,2.867],[3.381,6.803],[13.136,1.043],[2.023,-9.519],[-4.591,-5.896]],"v":[[-209.409,781.905],[-226.713,782.648],[-236.03,815.298],[-211.526,827.066],[-186.128,813.964],[-189.064,792.859]]}],"t":159},{"i":{"x":0.48,"y":0.48},"o":{"x":0.44,"y":0},"s":[{"c":true,"i":[[7.129,-2.915],[3.352,-4.405],[-11.628,-5.711],[-8.049,5.201],[2.397,5.045],[7.228,1.894]],"o":[[-5.344,2.185],[-6.57,8.634],[6.818,3.349],[11.068,-7.152],[-4.176,-8.79],[-7.228,-1.894]],"v":[[-153.459,681.527],[-166.753,692.63],[-154.317,724.224],[-127.704,718.685],[-115.49,692.848],[-130.644,677.868]]}],"t":195},{"i":{"x":0.44,"y":1},"o":{"x":0.47,"y":0},"s":[{"c":true,"i":[[7.625,1.085],[5.118,-2.109],[-7.151,-10.802],[-9.574,0.424],[-0.479,5.565],[5.282,5.285]],"o":[[-5.716,-0.813],[-10.031,4.134],[4.193,6.334],[13.164,-0.583],[0.835,-9.696],[-5.282,-5.285]],"v":[[-175.888,736.998],[-192.969,739.866],[-198.193,773.416],[-172.426,782.076],[-148.835,765.946],[-154.348,745.363]]}],"t":223},{"i":{"x":0.55,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[7.129,-2.915],[3.352,-4.405],[-11.628,-5.711],[-8.049,5.201],[2.397,5.045],[7.228,1.894]],"o":[[-5.344,2.185],[-6.57,8.634],[6.818,3.349],[11.068,-7.152],[-4.176,-8.79],[-7.228,-1.894]],"v":[[-147.067,698.976],[-160.36,710.078],[-147.925,741.673],[-121.311,736.133],[-109.098,710.296],[-124.251,695.316]]}],"t":255},{"i":{"x":0.46,"y":1},"o":{"x":0.39,"y":0},"s":[{"c":true,"i":[[7.419,2.071],[5.35,-1.423],[-5.681,-11.642],[-9.548,-0.829],[-1.201,5.455],[4.547,5.929]],"o":[[-5.561,-1.552],[-10.485,2.79],[3.331,6.827],[13.128,1.14],[2.093,-9.504],[-4.547,-5.929]],"v":[[-206.737,757.127],[-224.046,757.743],[-233.602,790.324],[-209.185,802.272],[-183.692,789.356],[-186.473,768.23]]}],"t":286},{"i":{"x":0.61,"y":1},"o":{"x":0.47,"y":0},"s":[{"c":true,"i":[[7.5,-1.752],[4.006,-3.821],[-10.579,-7.476],[-8.77,3.865],[1.57,5.361],[6.838,3.012]],"o":[[-5.622,1.313],[-7.852,7.488],[6.204,4.384],[12.058,-5.314],[-2.735,-9.34],[-6.838,-3.012]],"v":[[-185.533,696.496],[-200.413,705.359],[-193.125,738.521],[-165.97,737.255],[-149.829,713.672],[-162.426,696.486]]}],"t":305},{"i":{"x":0.52,"y":1},"o":{"x":0.42,"y":0},"s":[{"c":true,"i":[[7.434,2.016],[5.339,-1.463],[-5.766,-11.6],[-9.553,-0.759],[-1.161,5.464],[4.591,5.896]],"o":[[-5.572,-1.511],[-10.464,2.867],[3.381,6.803],[13.136,1.043],[2.023,-9.519],[-4.591,-5.896]],"v":[[-209.409,781.905],[-226.713,782.648],[-236.03,815.298],[-211.526,827.066],[-186.128,813.964],[-189.064,792.859]]}],"t":337},{"i":{"x":0.35,"y":1},"o":{"x":0.44,"y":0},"s":[{"c":true,"i":[[7.129,-2.915],[3.352,-4.405],[-11.628,-5.711],[-8.049,5.201],[2.397,5.045],[7.228,1.894]],"o":[[-5.344,2.185],[-6.57,8.634],[6.818,3.349],[11.068,-7.152],[-4.176,-8.79],[-7.228,-1.894]],"v":[[-153.459,681.527],[-166.753,692.63],[-154.317,724.224],[-127.704,718.685],[-115.49,692.848],[-130.644,677.868]]}],"t":382},{"i":{"x":0.44,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[7.702,0.041],[4.785,-2.784],[-8.55,-9.732],[-9.428,1.718],[0.28,5.579],[5.95,4.52]],"o":[[-5.773,-0.031],[-9.378,5.456],[5.014,5.707],[12.964,-2.362],[-0.487,-9.72],[-5.95,-4.52]],"v":[[-204.432,752.222],[-220.966,757.38],[-221.593,791.328],[-194.889,796.414],[-173.704,777.234],[-181.957,757.589]]}],"t":410},{"i":{"x":0.46,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[7.129,-2.915],[3.352,-4.405],[-11.628,-5.711],[-8.049,5.201],[2.397,5.045],[7.228,1.894]],"o":[[-5.344,2.185],[-6.57,8.634],[6.818,3.349],[11.068,-7.152],[-4.176,-8.79],[-7.228,-1.894]],"v":[[-147.067,698.976],[-160.36,710.078],[-147.925,741.673],[-121.311,736.133],[-109.098,710.296],[-124.251,695.316]]}],"t":438},{"s":[{"c":true,"i":[[7.5,-1.752],[4.006,-3.821],[-10.579,-7.476],[-8.77,3.865],[1.57,5.361],[6.838,3.012]],"o":[[-5.622,1.313],[-7.852,7.488],[6.204,4.384],[12.058,-5.314],[-2.735,-9.34],[-6.838,-3.012]],"v":[[-185.533,696.496],[-200.413,705.359],[-193.125,738.521],[-165.97,737.255],[-149.829,713.672],[-162.426,696.486]]}],"t":463}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"angler ball","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[27.424,5.853],[2.432,13.096],[-20.226,7.225],[-18.034,-8.932]],"o":[[0,0],[-27.424,-5.853],[-2.432,-13.096],[13.649,-4.876],[0,0]],"v":[[-603.856,855.496],[-644.245,862.097],[-665.798,833.586],[-661.228,782.34],[-605.035,808.5]]}],"t":155},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[21.451,-27.928],[4.023,10.431],[-10.246,14.833],[-18.536,2.319]],"o":[[0,0],[-14.338,18.666],[-4.023,-10.431],[10.305,-14.918],[0,0]],"v":[[-598.698,860.07],[-634.892,883.503],[-657.066,863.295],[-661.183,820.306],[-608.476,814.087]]}],"t":190.912},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[31.239,6.303],[-1.827,12.671],[-18.543,9.072],[-18.556,-2.152]],"o":[[0,0],[-26.419,-5.33],[1.827,-12.671],[18.649,-9.124],[0,0]],"v":[[-603.963,859.224],[-651.268,858.322],[-662.089,825.719],[-642.113,780.482],[-602.535,812.235]]}],"t":236},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[21.097,-13.46],[-0.093,9.992],[-13.398,8.949],[-18.677,0.344]],"o":[[0,0],[-17.734,11.314],[0.093,-9.992],[13.475,-9],[0,0]],"v":[[-595.479,864.65],[-624.899,892.777],[-646.229,872.53],[-639.89,831.018],[-600.336,817.891]]}],"t":271},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[26.593,-12.344],[-1.664,11.587],[-15.203,-11.186],[-18.557,-2.141]],"o":[[0,0],[-22.353,10.376],[1.664,-11.587],[18.963,13.953],[0,0]],"v":[[-600.273,858.918],[-636.13,867.924],[-657.745,841.094],[-641.556,785.364],[-598.873,811.928]]}],"t":303},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[16.639,-18.313],[2.502,9.557],[-13.429,8.569],[-18.671,0.585]],"o":[[0,0],[-13.986,15.393],[-2.502,-9.557],[14.062,-8.974],[0,0]],"v":[[-600.683,863.997],[-617.424,889.99],[-649.742,866.838],[-648.692,827.553],[-606.141,817.304]]}],"t":333},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[23.331,-3.752],[1.295,11.201],[-16.547,7.531],[-18.568,-2.043]],"o":[[0,0],[-21.003,3.378],[-1.295,-11.2],[17.328,-7.886],[0,0]],"v":[[-605.111,853.029],[-632.248,870.059],[-657.365,848.727],[-660.307,785.817],[-603.958,806.032]]}],"t":360},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[0,0],[14.107,-17.621],[4.321,7.366],[-9.167,10.277],[-18.656,0.945]],"o":[[0,0],[-11.236,14.035],[-4.321,-7.366],[9.599,-10.762],[0,0]],"v":[[-608.459,856.128],[-621.861,888.122],[-649.5,874.921],[-666.466,827.685],[-614.819,809.549]]}],"t":381},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[26.593,-12.344],[-1.664,11.587],[-15.203,-11.186],[-18.557,-2.141]],"o":[[0,0],[-22.353,10.376],[1.664,-11.587],[18.963,13.953],[0,0]],"v":[[-600.273,858.918],[-636.13,867.924],[-657.745,841.094],[-641.556,785.364],[-598.873,811.928]]}],"t":402},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[21.451,-27.928],[4.023,10.431],[-10.246,14.833],[-18.536,2.319]],"o":[[0,0],[-14.338,18.666],[-4.023,-10.431],[10.305,-14.918],[0,0]],"v":[[-598.698,860.07],[-634.892,883.503],[-657.066,863.295],[-661.183,820.306],[-608.476,814.087]]}],"t":421},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[0,0],[27.424,5.853],[2.432,13.096],[-20.226,7.225],[-18.034,-8.932]],"o":[[0,0],[-27.424,-5.853],[-2.432,-13.096],[13.649,-4.876],[0,0]],"v":[[-603.856,855.496],[-644.245,862.097],[-665.798,833.586],[-661.228,782.34],[-605.035,808.5]]}],"t":434},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[21.451,-27.928],[4.023,10.431],[-10.246,14.833],[-18.536,2.319]],"o":[[0,0],[-14.338,18.666],[-4.023,-10.431],[10.305,-14.918],[0,0]],"v":[[-598.698,860.07],[-634.892,883.503],[-657.066,863.295],[-661.183,820.306],[-608.476,814.087]]}],"t":443},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[0,0],[27.424,5.853],[2.432,13.096],[-20.226,7.225],[-18.034,-8.932]],"o":[[0,0],[-27.424,-5.853],[-2.432,-13.096],[13.649,-4.876],[0,0]],"v":[[-603.856,855.496],[-644.245,862.097],[-665.798,833.586],[-661.228,782.34],[-605.035,808.5]]}],"t":451},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[21.451,-27.928],[4.023,10.431],[-10.246,14.833],[-18.536,2.319]],"o":[[0,0],[-14.338,18.666],[-4.023,-10.431],[10.305,-14.918],[0,0]],"v":[[-598.698,860.07],[-634.892,883.503],[-657.066,863.295],[-661.183,820.306],[-608.476,814.087]]}],"t":455},{"s":[{"c":true,"i":[[0,0],[27.424,5.853],[2.432,13.096],[-20.226,7.225],[-18.034,-8.932]],"o":[[0,0],[-27.424,-5.853],[-2.432,-13.096],[13.649,-4.876],[0,0]],"v":[[-603.856,855.496],[-644.245,862.097],[-665.798,833.586],[-661.228,782.34],[-605.035,808.5]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-633.617,826.699]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-633.617,826.699]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"rear fin","np":1,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":36,"ip":382,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.833],"y":[0.813]},"o":{"x":[0.167],"y":[0.167]},"s":[226.748],"t":382},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.141]},"s":[548.586],"t":535},{"s":[796.748],"t":624}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.778],"y":[0.971]},"o":{"x":[0.167],"y":[0.167]},"s":[343.038],"t":382},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.67],"y":[-0.08]},"s":[324.433],"t":535},{"s":[336.038],"t":624}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-6],"t":382},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-3],"t":535},{"s":[8],"t":624}]},"s":{"a":0,"ix":6,"k":[-14,14,100]}},"nm":"skinny fish 28","op":625,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[13.747,14.156],[48.014,5.637],[8.11,-43.35],[-49,21],[-24.346,-6.76],[-2.343,9.762]],"o":[[-12.769,-0.468],[-50.652,-5.946],[-8.11,43.35],[47.498,-20.356],[4.998,-8.401],[5.544,-20.327]],"v":[[950.912,-927.04],[771.386,-942.903],[653.742,-884.219],[817,-842],[959.831,-849.643],[971.5,-876.5]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[4.085,2.192],[12.552,-5.891],[13.336,-6.589],[-26.641,-0.837],[-0.164,1.112],[1.694,12.859]],"o":[[-7.985,-4.284],[-22.297,10.465],[0,0],[1.033,0.032],[1.297,-8.801],[-0.605,-4.596]],"v":[[861.485,-970.966],[823.948,-966.859],[787.664,-941.411],[862.382,-927.682],[867.203,-930.949],[868.964,-958.995]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-2.637,1.451],[-16.645,13.123],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[18.865,-10.381],[8.017,-6.321],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[853.425,-823.805],[866.711,-823.434],[922.584,-835.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-11.896,-3.394],[-0.703,5.898],[2.616,3.135],[5.418,-0.657],[4.597,-0.557]],"o":[[5.855,10.897],[3.104,0.886],[0.455,-3.817],[-0.461,-0.553],[-4.597,0.557],[0,0]],"v":[[761.339,-841.698],[797.453,-809.184],[813.703,-814.648],[800.737,-836.049],[775.541,-843.101],[761.751,-841.429]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-11,53],[9,-14],[0.702,0.026],[5.544,-20.327],[4.998,-8.401],[-0.674,-0.215],[9.099,33.797],[17,12]],"o":[[11,-53],[0,0],[13.747,14.156],[-2.343,9.762],[0.77,0.214],[22,7],[-5.25,-19.5],[-17,-12]],"v":[[1028,-928],[952,-927],[950.912,-927.04],[971.5,-876.5],[959.831,-849.643],[962,-849],[1032.75,-844.25],[1006,-885]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"body","np":6,"ty":"gr"}],"sr":1,"st":255,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":37,"ip":409,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.811],"y":[0.851]},"o":{"x":[0.167],"y":[0.167]},"s":[239.686],"t":409},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.25],"y":[0.291]},"s":[655.292],"t":548},{"s":[809.686],"t":624}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.704],"y":[1.066]},"o":{"x":[0.167],"y":[0.167]},"s":[323.142],"t":409},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.428],"y":[0.074]},"s":[293.391],"t":548},{"s":[314.142],"t":624}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-4],"t":409},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":548},{"s":[15],"t":624}]},"s":{"a":0,"ix":6,"k":[-29,29,100]}},"nm":"skinny fish 27","op":625,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":382,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":38,"ip":364,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.833],"y":[0.835]},"o":{"x":[0.167],"y":[0.167]},"s":[230.769],"t":364},{"i":{"x":[0.688],"y":[0.712]},"o":{"x":[0.167],"y":[0.168]},"s":[429.769],"t":441},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.379],"y":[0.385]},"s":[650.769],"t":528},{"s":[770.769],"t":580}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.55],"y":[1.033]},"o":{"x":[0.167],"y":[0.167]},"s":[353.463],"t":364},{"i":{"x":[0.652],"y":[-0.359]},"o":{"x":[0.405],"y":[1.216]},"s":[335.463],"t":441},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.506],"y":[-0.021]},"s":[335.963],"t":528},{"s":[307.963],"t":580}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-11.513],"t":364},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":441},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":528},{"s":[-21.513],"t":580}]},"s":{"a":0,"ix":6,"k":[-12,12,100]}},"nm":"skinny fish 26","op":581,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":266,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":39,"ip":94,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.833],"y":[0.843]},"o":{"x":[0.167],"y":[0.167]},"s":[223.748],"t":84},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.176]},"s":[497.259],"t":240.326},{"s":[766.748],"t":413}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.778],"y":[0.971]},"o":{"x":[0.167],"y":[0.167]},"s":[427.038],"t":84},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.67],"y":[-0.075]},"s":[413.433],"t":240.326},{"s":[431.038],"t":413}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-8],"t":84},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-2],"t":240},{"s":[9],"t":413}]},"s":{"a":0,"ix":6,"k":[-14,14,100]}},"nm":"skinny fish 25","op":414,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[13.747,14.156],[48.014,5.637],[8.11,-43.35],[-49,21],[-24.346,-6.76],[-2.343,9.762]],"o":[[-12.769,-0.468],[-50.652,-5.946],[-8.11,43.35],[47.498,-20.356],[4.998,-8.401],[5.544,-20.327]],"v":[[950.912,-927.04],[771.386,-942.903],[653.742,-884.219],[817,-842],[959.831,-849.643],[971.5,-876.5]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[4.085,2.192],[12.552,-5.891],[13.336,-6.589],[-26.641,-0.837],[-0.164,1.112],[1.694,12.859]],"o":[[-7.985,-4.284],[-22.297,10.465],[0,0],[1.033,0.032],[1.297,-8.801],[-0.605,-4.596]],"v":[[861.485,-970.966],[823.948,-966.859],[787.664,-941.411],[862.382,-927.682],[867.203,-930.949],[868.964,-958.995]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-2.637,1.451],[-16.645,13.123],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[18.865,-10.381],[8.017,-6.321],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[853.425,-823.805],[866.711,-823.434],[922.584,-835.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-11.896,-3.394],[-0.703,5.898],[2.616,3.135],[5.418,-0.657],[4.597,-0.557]],"o":[[5.855,10.897],[3.104,0.886],[0.455,-3.817],[-0.461,-0.553],[-4.597,0.557],[0,0]],"v":[[761.339,-841.698],[797.453,-809.184],[813.703,-814.648],[800.737,-836.049],[775.541,-843.101],[761.751,-841.429]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-11,53],[9,-14],[0.702,0.026],[5.544,-20.327],[4.998,-8.401],[-0.674,-0.215],[9.099,33.797],[17,12]],"o":[[11,-53],[0,0],[13.747,14.156],[-2.343,9.762],[0.77,0.214],[22,7],[-5.25,-19.5],[-17,-12]],"v":[[1028,-928],[952,-927],[950.912,-927.04],[971.5,-876.5],[959.831,-849.643],[962,-849],[1032.75,-844.25],[1006,-885]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"body","np":6,"ty":"gr"}],"sr":1,"st":-43,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":40,"ip":121,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.811],"y":[0.795]},"o":{"x":[0.167],"y":[0.167]},"s":[236.686],"t":120.707},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.25],"y":[0.205]},"s":[456.292],"t":258},{"s":[784.686],"t":413}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.704],"y":[1.096]},"o":{"x":[0.167],"y":[0.167]},"s":[407.142],"t":120.707},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.428],"y":[0.215]},"s":[392.391],"t":258},{"s":[403.142],"t":413}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-5],"t":121},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[1],"t":258},{"s":[3],"t":413}]},"s":{"a":0,"ix":6,"k":[-23,23,100]}},"nm":"skinny fish 24","op":414,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":84,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":41,"ip":-98,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.833],"y":[0.813]},"o":{"x":[0.167],"y":[0.167]},"s":[226.748],"t":-98},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.141]},"s":[548.586],"t":55},{"s":[796.748],"t":144}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.778],"y":[0.971]},"o":{"x":[0.167],"y":[0.167]},"s":[343.038],"t":-98},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.67],"y":[-0.08]},"s":[324.433],"t":55},{"s":[336.038],"t":144}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-6],"t":-98},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-3],"t":55},{"s":[8],"t":144}]},"s":{"a":0,"ix":6,"k":[-14,14,100]}},"nm":"skinny fish 18","op":144,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[13.747,14.156],[48.014,5.637],[8.11,-43.35],[-49,21],[-24.346,-6.76],[-2.343,9.762]],"o":[[-12.769,-0.468],[-50.652,-5.946],[-8.11,43.35],[47.498,-20.356],[4.998,-8.401],[5.544,-20.327]],"v":[[950.912,-927.04],[771.386,-942.903],[653.742,-884.219],[817,-842],[959.831,-849.643],[971.5,-876.5]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[4.085,2.192],[12.552,-5.891],[13.336,-6.589],[-26.641,-0.837],[-0.164,1.112],[1.694,12.859]],"o":[[-7.985,-4.284],[-22.297,10.465],[0,0],[1.033,0.032],[1.297,-8.801],[-0.605,-4.596]],"v":[[861.485,-970.966],[823.948,-966.859],[787.664,-941.411],[862.382,-927.682],[867.203,-930.949],[868.964,-958.995]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-2.637,1.451],[-16.645,13.123],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[18.865,-10.381],[8.017,-6.321],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[853.425,-823.805],[866.711,-823.434],[922.584,-835.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-11.896,-3.394],[-0.703,5.898],[2.616,3.135],[5.418,-0.657],[4.597,-0.557]],"o":[[5.855,10.897],[3.104,0.886],[0.455,-3.817],[-0.461,-0.553],[-4.597,0.557],[0,0]],"v":[[761.339,-841.698],[797.453,-809.184],[813.703,-814.648],[800.737,-836.049],[775.541,-843.101],[761.751,-841.429]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-11,53],[9,-14],[0.702,0.026],[5.544,-20.327],[4.998,-8.401],[-0.674,-0.215],[9.099,33.797],[17,12]],"o":[[11,-53],[0,0],[13.747,14.156],[-2.343,9.762],[0.77,0.214],[22,7],[-5.25,-19.5],[-17,-12]],"v":[[1028,-928],[952,-927],[950.912,-927.04],[971.5,-876.5],[959.831,-849.643],[962,-849],[1032.75,-844.25],[1006,-885]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"body","np":6,"ty":"gr"}],"sr":1,"st":-225,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":42,"ip":-71,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.811],"y":[0.851]},"o":{"x":[0.167],"y":[0.167]},"s":[239.686],"t":-71},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.25],"y":[0.291]},"s":[655.292],"t":68},{"s":[809.686],"t":144}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.704],"y":[1.066]},"o":{"x":[0.167],"y":[0.167]},"s":[323.142],"t":-71},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.428],"y":[0.074]},"s":[293.391],"t":68},{"s":[314.142],"t":144}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-4],"t":-71},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":68},{"s":[15],"t":144}]},"s":{"a":0,"ix":6,"k":[-29,29,100]}},"nm":"skinny fish 7","op":144,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":-98,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":43,"ip":-116,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.833],"y":[0.835]},"o":{"x":[0.167],"y":[0.167]},"s":[230.769],"t":-116},{"i":{"x":[0.688],"y":[0.712]},"o":{"x":[0.167],"y":[0.168]},"s":[429.769],"t":-39},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.379],"y":[0.385]},"s":[650.769],"t":48},{"s":[770.769],"t":100}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.55],"y":[1.033]},"o":{"x":[0.167],"y":[0.167]},"s":[353.463],"t":-116},{"i":{"x":[0.652],"y":[-0.359]},"o":{"x":[0.405],"y":[1.216]},"s":[335.463],"t":-39},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.506],"y":[-0.021]},"s":[335.963],"t":48},{"s":[307.963],"t":100}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-11.513],"t":-116},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":-39},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":48},{"s":[-21.513],"t":100}]},"s":{"a":0,"ix":6,"k":[-12,12,100]}},"nm":"skinny fish 8","op":101,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":-214,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":44,"ip":-75,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.81],"y":[0.754]},"o":{"x":[0.167],"y":[0.167]},"s":[241.769],"t":-75},{"i":{"x":[0.736],"y":[0.685]},"o":{"x":[0.32],"y":[0.197]},"s":[383.747],"t":42.219},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.169],"y":[0.259]},"s":[577.032],"t":118},{"s":[752.769],"t":206}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.617],"y":[-0.25]},"o":{"x":[0.167],"y":[0.167]},"s":[186.463],"t":-75},{"i":{"x":[0.564],"y":[0.972]},"o":{"x":[0.443],"y":[0.973]},"s":[160.463],"t":42.219},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.37],"y":[-0.036]},"s":[135.463],"t":118},{"s":[154.463],"t":206}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":-75},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-7.513],"t":-5},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-24.513],"t":42},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-1.513],"t":82},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":118},{"s":[9.487],"t":206}]},"s":{"a":0,"ix":6,"k":[-12,12,100]}},"nm":"skinny fish 14","op":205,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":-173,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":45,"ip":-105,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.815],"y":[0.777]},"o":{"x":[0.167],"y":[0.167]},"s":[261.686],"t":-105},{"i":{"x":[0.736],"y":[0.751]},"o":{"x":[0.257],"y":[0.162]},"s":[366.573],"t":-8},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.293],"y":[0.185]},"s":[601.417],"t":105},{"s":[787.686],"t":165}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.762],"y":[1.172]},"o":{"x":[0.298],"y":[-0.456]},"s":[174.219],"t":-105},{"i":{"x":[0.635],"y":[-1.279]},"o":{"x":[0.181],"y":[3.579]},"s":[150.9],"t":-8},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.598],"y":[0.085]},"s":[151.896],"t":105},{"s":[175.142],"t":165}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[10],"t":-105},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-23],"t":-26},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[3],"t":-8},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-2],"t":21},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2],"t":105},{"s":[13],"t":165}]},"s":{"a":0,"ix":6,"k":[-26,26,100]}},"nm":"skinny fish 12","op":161,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":-105,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":46,"ip":403,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.81],"y":[0.754]},"o":{"x":[0.167],"y":[0.167]},"s":[241.769],"t":403},{"i":{"x":[0.736],"y":[0.685]},"o":{"x":[0.32],"y":[0.197]},"s":[383.747],"t":520.219},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.169],"y":[0.259]},"s":[577.032],"t":596},{"s":[752.769],"t":684}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.617],"y":[-0.25]},"o":{"x":[0.167],"y":[0.167]},"s":[186.463],"t":403},{"i":{"x":[0.564],"y":[0.972]},"o":{"x":[0.443],"y":[0.973]},"s":[160.463],"t":520.219},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.37],"y":[-0.036]},"s":[135.463],"t":596},{"s":[154.463],"t":684}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":403},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-7.513],"t":473},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-24.513],"t":520},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-1.513],"t":560},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":596},{"s":[9.487],"t":684}]},"s":{"a":0,"ix":6,"k":[-12,12,100]}},"nm":"skinny fish 30","op":785,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":305,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":47,"ip":373,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.815],"y":[0.777]},"o":{"x":[0.167],"y":[0.167]},"s":[261.686],"t":373},{"i":{"x":[0.736],"y":[0.751]},"o":{"x":[0.257],"y":[0.162]},"s":[366.573],"t":470},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.293],"y":[0.185]},"s":[601.417],"t":583},{"s":[787.686],"t":643}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.762],"y":[1.172]},"o":{"x":[0.298],"y":[-0.456]},"s":[174.219],"t":373},{"i":{"x":[0.635],"y":[-1.279]},"o":{"x":[0.181],"y":[3.579]},"s":[150.9],"t":470},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.598],"y":[0.085]},"s":[151.896],"t":583},{"s":[175.142],"t":643}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[10],"t":373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-23],"t":452},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[3],"t":470},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-2],"t":499},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2],"t":583},{"s":[13],"t":643}]},"s":{"a":0,"ix":6,"k":[-26,26,100]}},"nm":"skinny fish 29","op":853,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":373,"ty":4},{"ao":0,"bm":0,"ddd":0,"hasMask":true,"ind":48,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[512,384,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[512,384,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"masksProperties":[{"inv":false,"mode":"a","nm":"Mask 1","o":{"a":0,"ix":3,"k":100},"pt":{"a":1,"ix":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[88.137,-12.962],[12.805,-45.665],[-38.866,-42.123],[-83.026,2.692],[-34.698,67.681],[48.329,60.278]],"o":[[-71.021,10.445],[-17.005,60.643],[55.351,59.99],[95.359,-3.092],[34.698,-67.681],[-67.763,-84.518]],"v":[[370.863,114.962],[244.005,217.498],[269.773,440.293],[508.4,522.256],[727.627,418.208],[731.058,183.362]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[85.046,-20.379],[10.42,-46.268],[-30.051,-48.804],[-83.026,2.692],[-34.698,67.681],[48.329,60.278]],"o":[[-69.808,16.728],[-17.005,75.502],[39.227,63.707],[95.359,-3.092],[34.698,-67.681],[-67.764,-84.518]],"v":[[383.863,122.962],[258.005,233.498],[278.773,455.293],[481.4,523.256],[741.627,414.208],[740.058,184.362]]}],"t":73},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[85.046,-20.379],[10.42,-46.268],[-35.044,-45.352],[-83.026,2.692],[-34.698,67.681],[67.942,51.638]],"o":[[-69.808,16.728],[-17.005,75.502],[49.227,63.707],[95.359,-3.092],[34.698,-67.681],[-86.246,-65.55]],"v":[[371.92,120.962],[258.005,233.498],[278.773,455.293],[503.4,529.256],[741.627,414.208],[701.115,163.362]]}],"t":126},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[84.137,-33.962],[14.995,-65.498],[-46.267,-51.524],[-82.802,6.663],[-34.697,67.681],[67.942,51.638]],"o":[[-66.566,26.869],[-17.272,75.441],[48.227,53.707],[102.6,-8.256],[34.698,-67.681],[-86.246,-65.55]],"v":[[356.863,114.962],[252.005,229.498],[278.773,455.293],[529.4,520.256],[741.627,414.208],[717.058,144.362]]}],"t":209},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[84.137,-33.962],[9.995,-61.498],[-51.671,-46.103],[-82.892,5.424],[-34.697,67.681],[74.942,48.638]],"o":[[-66.566,26.869],[-15.042,92.549],[51.227,45.707],[95.6,-6.256],[34.698,-67.681],[-90.869,-58.975]],"v":[[339.863,122.962],[247.005,243.498],[301.773,466.293],[542.4,517.256],[735.627,404.208],[710.058,147.362]]}],"t":307},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[104.137,-40.962],[0.63,-58.048],[-43.773,-49.293],[-82.892,5.424],[-34.697,67.681],[84.65,31.073]],"o":[[-66.802,26.276],[-1.005,92.502],[45.586,51.335],[95.6,-6.256],[34.698,-67.681],[-99.058,-36.362]],"v":[[333.863,133.962],[251.005,274.498],[301.773,466.293],[558.4,522.256],[735.627,411.208],[701.058,133.362]]}],"t":401},{"s":[{"c":true,"i":[[88.137,-12.962],[12.805,-45.665],[-38.866,-42.123],[-83.026,2.692],[-34.698,67.681],[48.329,60.278]],"o":[[-71.021,10.445],[-17.005,60.643],[55.351,59.99],[95.359,-3.092],[34.698,-67.681],[-67.763,-84.518]],"v":[[370.863,114.962],[244.005,217.498],[269.773,440.293],[508.4,522.256],[727.627,418.208],[731.058,183.362]]}],"t":479}]},"x":{"a":0,"ix":4,"k":0}}],"nm":"Royal Blue Solid 2","op":480,"sc":"#295bd6","sh":768,"sr":1,"st":0,"sw":1024,"ty":1},{"ao":0,"bm":0,"ddd":0,"hasMask":true,"ind":49,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[512,384,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[512,384,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"masksProperties":[{"inv":false,"mode":"a","nm":"Mask 1","o":{"a":0,"ix":3,"k":100},"pt":{"a":1,"ix":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[89.051,-16.552],[24.831,-57.178],[-41.731,-39.461],[-106.322,-2.671],[-35.963,66.206],[59.082,45.141]],"o":[[-89.051,16.552],[-24.876,57.282],[65.309,61.757],[102.883,2.585],[35.963,-66.207],[-99.87,-76.304]],"v":[[366.083,103.552],[203.585,205.293],[219.691,460.243],[500.411,539.857],[774.655,428.712],[770.918,163.505]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[89.864,-16.103],[25.058,-55.629],[-32.435,-46.308],[-107.324,0.385],[-36.291,64.412],[59.622,43.917]],"o":[[-89.864,16.103],[-25.104,55.729],[49.797,71.097],[135.123,-0.485],[36.291,-64.412],[-100.782,-74.236]],"v":[[370.69,100.545],[212.076,202.73],[225.346,451.719],[493.877,535.485],[769.393,410.125],[765.378,149.695]]}],"t":47},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[91.89,-16.153],[25.623,-55.802],[-33.166,-46.453],[-109.712,-2.607],[-37.109,64.613],[72.416,64.339]],"o":[[-91.89,16.153],[-25.669,55.903],[50.919,71.319],[106.164,2.523],[37.109,-64.613],[-94.344,-83.821]],"v":[[360.46,101.811],[205.318,206.979],[212.813,458.552],[485.25,551.81],[809.244,445.989],[774.81,168.887]]}],"t":143},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[92.876,-16.153],[25.898,-55.802],[-37.94,-42.92],[-110.889,-2.607],[-37.507,64.613],[73.193,64.339]],"o":[[-92.876,16.153],[-25.945,55.903],[59.508,67.319],[107.303,2.523],[37.507,-64.613],[-95.356,-83.821]],"v":[[387.814,96.295],[215.025,178.915],[213.492,454.681],[510.182,539.777],[798.645,446.957],[790.807,167.661]]}],"t":173},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[88.992,-15.833],[24.815,-54.696],[-44.612,-60.458],[-101.813,-5.663],[-35.939,63.332],[70.132,63.063]],"o":[[-88.992,15.833],[-24.86,54.794],[50.857,68.922],[105.291,5.856],[35.939,-63.332],[-91.368,-82.158]],"v":[[377.077,96.151],[189.86,190.239],[214.481,446.815],[460.575,534.144],[779.335,442.142],[777.868,157.158]]}],"t":269},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[89.624,-16.429],[18.389,-58.95],[-32.317,-58.667],[-102.537,-5.876],[-44.086,61.037],[70.631,65.438]],"o":[[-89.624,16.429],[-27.674,88.714],[42.298,76.786],[106.04,6.077],[46.251,-64.033],[-92.018,-85.253]],"v":[[383.888,98.571],[196.674,202.286],[215.317,457.202],[467.213,545.923],[766.167,463.722],[776.369,158.225]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[85.272,-16.153],[25.844,-61.915],[-45.261,-47.159],[-97.558,-5.777],[-41.946,60.011],[67.201,64.339]],"o":[[-85.272,16.153],[-23.474,56.235],[49.252,51.319],[100.891,5.975],[44.005,-62.957],[-87.55,-83.821]],"v":[[371.716,98.295],[210.156,184.915],[224.748,457.681],[484.558,533.777],[778.995,468.957],[768.799,153.661]]}],"t":413},{"s":[{"c":true,"i":[[89.051,-16.552],[24.831,-57.178],[-41.731,-39.461],[-106.322,-2.671],[-35.963,66.206],[59.082,45.141]],"o":[[-89.051,16.552],[-24.876,57.282],[65.309,61.757],[102.883,2.585],[35.963,-66.207],[-99.87,-76.304]],"v":[[366.083,103.552],[203.585,205.293],[219.691,460.243],[500.411,539.857],[774.655,428.712],[770.918,163.505]]}],"t":479}]},"x":{"a":0,"ix":4,"k":0}}],"nm":"Deep Royal Blue Solid 2","op":480,"sc":"#1041b9","sh":768,"sr":1,"st":0,"sw":1024,"ty":1},{"ao":0,"bm":0,"ddd":0,"ind":50,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[512,384,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[512,384,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Deep Royal Blue Solid 1","op":480,"sc":"#062e90","sh":768,"sr":1,"st":0,"sw":1024,"ty":1}],"markers":[],"nm":"Hunter gone too deep","op":480,"v":"5.5.9","w":1024}
\ No newline at end of file
+{"assets":[],"ddd":0,"fr":60,"h":768,"ip":0,"layers":[{"ao":0,"bm":0,"ddd":0,"ind":11,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[0,0,0]},"o":{"a":0,"ix":11,"k":0},"p":{"a":0,"ix":2,"k":[512,491,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Null 6","op":480,"sr":1,"st":0,"ty":3},{"ao":0,"bm":0,"ddd":0,"ind":12,"ip":85,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.723],"y":[0.323]},"o":{"x":[0.222],"y":[-0.066]},"s":[558],"t":85},{"i":{"x":[0.751],"y":[0.586]},"o":{"x":[0.33],"y":[0.165]},"s":[517.048],"t":128},{"i":{"x":[0.532],"y":[0.691]},"o":{"x":[0.216],"y":[0.684]},"s":[317.348],"t":171},{"i":{"x":[0.606],"y":[0.66]},"o":{"x":[0.353],"y":[0.322]},"s":[176.07],"t":229},{"i":{"x":[0.52],"y":[0.366]},"o":{"x":[0.286],"y":[0.307]},"s":[103.522],"t":270},{"i":{"x":[0.87],"y":[0.968]},"o":{"x":[0.363],"y":[0.471]},"s":[-84.301],"t":402},{"s":[-188.5],"t":474}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.675],"y":[0.829]},"o":{"x":[0.206],"y":[0.013]},"s":[-14],"t":85},{"i":{"x":[0.474],"y":[0.581]},"o":{"x":[0.346],"y":[0.6]},"s":[82],"t":128},{"i":{"x":[0.748],"y":[0.537]},"o":{"x":[0.59],"y":[0.621]},"s":[111.156],"t":171},{"i":{"x":[0.719],"y":[1.207]},"o":{"x":[0.325],"y":[1.507]},"s":[140.939],"t":229},{"i":{"x":[0.658],"y":[-2.304]},"o":{"x":[0.268],"y":[-0.246]},"s":[149.301],"t":270},{"i":{"x":[0.824],"y":[0.972]},"o":{"x":[0.472],"y":[0.216]},"s":[170.943],"t":402},{"s":[419.5],"t":474}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.554],"y":[1.061]},"o":{"x":[0.167],"y":[0.167]},"s":[-75],"t":85},{"i":{"x":[0.431],"y":[0.998]},"o":{"x":[0.543],"y":[0.161]},"s":[-2],"t":171},{"i":{"x":[0.484],"y":[0.75]},"o":{"x":[0.448],"y":[-0.001]},"s":[-21],"t":220},{"i":{"x":[0.649],"y":[0.019]},"o":{"x":[0.357],"y":[-0.261]},"s":[7],"t":270},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.449],"y":[0.406]},"s":[-41.814],"t":402},{"s":[-75],"t":431}]},"s":{"a":0,"ix":6,"k":[20,20,100]}},"nm":"skinny fish 2","op":480,"parent":11,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[9.799,-0.668],[5.305,-4.476],[-6.346,-0.784],[-7.617,-0.431],[3.274,1.837]],"o":[[-9.799,0.668],[-5.305,4.476],[8.226,1.016],[23.752,1.343],[-8.565,-4.806]],"v":[[827.651,-889.492],[799.055,-882.726],[812.274,-869.016],[834.748,-873.343],[855.476,-882.087]]}},"mn":"ADBE Vector Shape - Group","nm":"side fin","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-10.607,1.745]],"o":[[7.65,6.434],[0,0]],"v":[[654.1,-885.684],[682.857,-878.995]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-1.151,-1.189],[-0.266,-8.19],[4.624,-6.46]],"o":[[5.7,5.887],[0.287,8.845],[-3.352,4.683]],"v":[[751.734,-916.389],[758.963,-895.845],[751.876,-872.29]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-1.43,-8.147],[-0.041,-3.616],[1.549,-4.99],[3.123,-4.858]],"o":[[5.598,6.09],[0.625,3.561],[0.059,5.225],[-1.549,4.99],[0,0]],"v":[[765.155,-926.346],[775.992,-904.394],[776.837,-893.592],[775.107,-878.079],[767.127,-863.392]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[1.168,0.712],[2.927,-3.333],[-3.049,-4.257],[-1.942,2.968]],"o":[[-5.661,-3.45],[-2.927,3.333],[2.065,2.884],[3.179,-4.86]],"v":[[719.162,-908.297],[704.881,-905.576],[705.58,-889.884],[720.407,-890.887]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"strokes","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-0.719,2.297],[-4.098,-0.144],[-0.938,-8.857],[0.179,-0.175],[0.343,0.012],[2.106,1.262]],"o":[[-0.084,-2.406],[0.93,-2.972],[7.353,0.258],[0.026,0.249],[-0.245,0.24],[-2.6,-0.091],[0,0]],"v":[[911.595,-858.003],[912.87,-865.075],[925.098,-877.106],[926.688,-856.893],[926.401,-856.213],[925.428,-855.981],[910.496,-857.722]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-1.437,2.995],[-3.621,1.097],[-0.208,-3.066],[2.323,-7.496],[4.276,-0.366]],"o":[[-0.184,-1.607],[1.674,-3.489],[2.831,-0.858],[0.394,5.805],[-4.014,-1.518],[0,0]],"v":[[940.958,-854.479],[946.503,-868.088],[952.169,-876.392],[957.483,-868.859],[953.838,-851.79],[941.193,-853.546]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"stripes","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[4.085,2.192],[12.552,-5.891],[13.336,-6.589],[-26.641,-0.837],[-0.164,1.112],[1.694,12.859]],"o":[[-7.985,-4.284],[-22.297,10.465],[0,0],[1.033,0.032],[1.297,-8.801],[-0.605,-4.596]],"v":[[861.485,-970.966],[823.948,-966.859],[787.664,-941.411],[862.382,-927.682],[867.203,-930.949],[868.964,-958.995]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"top fin","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[13.747,14.156],[48.014,5.637],[8.11,-43.35],[-49,21],[-24.346,-6.76],[-2.343,9.762]],"o":[[-12.769,-0.468],[-50.652,-5.946],[-8.11,43.35],[47.498,-20.356],[4.998,-8.401],[5.544,-20.327]],"v":[[950.912,-927.04],[771.386,-942.903],[653.742,-884.219],[817,-842],[959.831,-849.643],[971.5,-876.5]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"body","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-10.08,-8.253],[-2.161,1.189],[-18.243,10.28],[-0.744,10.463],[33.849,-8.167]],"o":[[10.08,8.253],[1.188,0.973],[15.458,-8.506],[7.85,-4.424],[-34.624,-3.694],[0,0]],"v":[[824.518,-847.929],[854.758,-823.171],[865.644,-822.867],[923,-835.748],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[0.711,0.627],[3.128,3.395]],"o":[[-0.879,0.355],[-3.464,-3.051],[0,0]],"v":[[861.249,-839.244],[858.723,-840.178],[848.826,-849.855]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[2.648,3.494]],"o":[[-2.511,-3.593],[0,0]],"v":[[874.064,-842.548],[866.326,-853.179]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[3.056,3.987]],"o":[[-4.994,-1.88],[0,0]],"v":[[896.994,-845.87],[885.961,-855.024]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"strokes","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-2.637,1.451],[-16.645,13.123],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[18.865,-10.381],[8.017,-6.321],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[853.425,-823.805],[866.711,-823.434],[922.584,-835.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[880.505,-836.038]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[880.505,-836.038]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"bottom fin","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-11.896,-3.394],[-0.703,5.898],[2.616,3.135],[5.418,-0.657],[4.597,-0.557]],"o":[[5.855,10.897],[3.104,0.886],[0.455,-3.817],[-0.461,-0.553],[-4.597,0.557],[0,0]],"v":[[761.339,-841.698],[797.453,-809.184],[813.703,-814.648],[800.737,-836.049],[775.541,-843.101],[761.751,-841.429]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"bottom fin 2","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-11,53],[9,-14],[0.702,0.026],[5.544,-20.327],[4.998,-8.401],[-0.674,-0.215],[9.099,33.797],[17,12]],"o":[[11,-53],[0,0],[13.747,14.156],[-2.343,9.762],[0.77,0.214],[22,7],[-5.25,-19.5],[-17,-12]],"v":[[1028,-928],[952,-927],[950.912,-927.04],[971.5,-876.5],[959.831,-849.643],[962,-849],[1032.75,-844.25],[1006,-885]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"tail","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":13,"ip":60,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.833],"y":[0.831]},"o":{"x":[0.167],"y":[0.167]},"s":[600],"t":60},{"i":{"x":[0.833],"y":[0.847]},"o":{"x":[0.167],"y":[0.164]},"s":[384],"t":120},{"i":{"x":[0.834],"y":[0.897]},"o":{"x":[0.167],"y":[0.195]},"s":[213],"t":166},{"i":{"x":[0.743],"y":[0.725]},"o":{"x":[0.287],"y":[0.507]},"s":[131],"t":194},{"i":{"x":[0.723],"y":[0.577]},"o":{"x":[0.167],"y":[0.124]},"s":[43],"t":280},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.543],"y":[0.373]},"s":[-120],"t":390},{"s":[-239],"t":426}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.84],"y":[1.468]},"o":{"x":[0.167],"y":[0.167]},"s":[91.5],"t":60},{"i":{"x":[0.543],"y":[0.956]},"o":{"x":[0.406],"y":[0.264]},"s":[68.5],"t":120},{"i":{"x":[0.545],"y":[0.672]},"o":{"x":[0.416],"y":[-0.058]},"s":[147.5],"t":166},{"i":{"x":[0.566],"y":[0.281]},"o":{"x":[0.231],"y":[-2.412]},"s":[114.5],"t":194},{"i":{"x":[0.841],"y":[-0.356]},"o":{"x":[0.376],"y":[0.238]},"s":[121.5],"t":280},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.437],"y":[0.132]},"s":[144.978],"t":390},{"s":[361.5],"t":426}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[9],"t":100},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-14],"t":120},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-34],"t":135},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-15],"t":160},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[23],"t":175},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[4],"t":205},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-19],"t":225},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-11],"t":270},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-4],"t":280},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-14],"t":375},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-52],"t":395},{"s":[-68],"t":426}]},"s":{"a":0,"ix":6,"k":[20,20,100]}},"nm":"skinny fish 3","op":540,"parent":11,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[7.628,-0.52],[4.13,-3.484],[-4.941,-0.61],[-5.93,-0.335],[2.549,1.43]],"o":[[-7.628,0.52],[-4.13,3.484],[6.404,0.791],[18.491,1.046],[-6.668,-3.741]],"v":[[840.79,-895.973],[818.529,-890.705],[828.819,-880.032],[846.315,-883.401],[862.451,-890.208]]}},"mn":"ADBE Vector Shape - Group","nm":"side fin","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.703,-2.695]],"o":[[5.964,2.798],[0,0]],"v":[[730.536,-889.298],[749.203,-880.805]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-0.854,-4.863],[-0.024,-2.158],[0.925,-2.979],[1.864,-2.9]],"o":[[3.342,3.635],[0.373,2.126],[0.035,3.119],[-0.925,2.979],[0,0]],"v":[[796.83,-913.571],[803.299,-900.466],[803.803,-894.018],[802.77,-884.758],[798.007,-875.991]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[1.377,0.839],[3.45,-3.928],[-3.594,-5.018],[-2.289,3.499]],"o":[[-6.673,-4.067],[-3.45,3.928],[2.435,3.399],[3.747,-5.729]],"v":[[775.785,-909.909],[758.95,-906.703],[759.775,-888.204],[777.253,-889.387]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"strokes","np":5,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"top fin","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"body","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-6.017,-4.926],[-1.29,0.71],[-10.89,6.137],[-0.444,6.246],[20.206,-4.875]],"o":[[6.017,4.926],[0.709,0.581],[9.227,-5.077],[4.686,-2.641],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.76],[850.318,-851.981],[856.816,-851.799],[891.054,-859.489],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"strokes","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[880.505,-836.038]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[880.505,-836.038]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"bottom fin","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"bottom fin 2","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"tail","np":3,"ty":"gr"}],"sr":1,"st":60,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":14,"ip":110,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.658],"y":[0.223]},"o":{"x":[0.255],"y":[0.072]},"s":[551.022],"t":110},{"i":{"x":[0.525],"y":[0.902]},"o":{"x":[0.433],"y":[0.234]},"s":[507.146],"t":159},{"i":{"x":[0.689],"y":[0.099]},"o":{"x":[0.357],"y":[0.154]},"s":[315.313],"t":210},{"i":{"x":[0.793],"y":[0.396]},"o":{"x":[0.445],"y":[1.113]},"s":[117.343],"t":320},{"i":{"x":[0.765],"y":[0.825]},"o":{"x":[0.378],"y":[0.57]},"s":[-103.549],"t":426},{"s":[-261],"t":465}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.838],"y":[0.733]},"o":{"x":[0.353],"y":[-0.056]},"s":[53.082],"t":110},{"i":{"x":[0.523],"y":[0.849]},"o":{"x":[0.258],"y":[0.398]},"s":[92.636],"t":159},{"i":{"x":[0.617],"y":[1.101]},"o":{"x":[0.236],"y":[0.17]},"s":[136.519],"t":210},{"i":{"x":[0.854],"y":[0.104]},"o":{"x":[0.431],"y":[-0.086]},"s":[178.068],"t":320},{"i":{"x":[0.826],"y":[0.659]},"o":{"x":[0.721],"y":[0.484]},"s":[231],"t":426},{"s":[408.5],"t":465}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.667],"y":[0.801]},"o":{"x":[0.436],"y":[-0.031]},"s":[-47.266],"t":110},{"i":{"x":[0.626],"y":[1.734]},"o":{"x":[0.456],"y":[0.405]},"s":[-16.016],"t":180},{"i":{"x":[0.721],"y":[0.411]},"o":{"x":[0.417],"y":[-3.306]},"s":[-6.996],"t":210},{"i":{"x":[0.609],"y":[0.219]},"o":{"x":[0.171],"y":[-0.097]},"s":[1.932],"t":330},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.577],"y":[0.294]},"s":[-24.672],"t":426},{"s":[-67],"t":465}]},"s":{"a":0,"ix":6,"k":[20,20,100]}},"nm":"skinny fish","op":479,"parent":11,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-5.885,-2.501],[-2.649,0.801],[-7.066,2.137],[1.003,0.797],[9.799,-0.668],[9.34,-3.038]],"o":[[5.648,2.998],[7.539,3.203],[7.066,-2.137],[0.437,-0.132],[-7.691,-6.108],[-9.799,0.668],[0,0]],"v":[[799.829,-882.761],[816.774,-873.766],[834.248,-871.843],[855.446,-878.255],[855.476,-882.087],[827.651,-889.492],[799.055,-882.726]]}},"mn":"ADBE Vector Shape - Group","nm":"side fin","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-13.462,8.788]],"o":[[14.395,7.157],[0,0]],"v":[[656.185,-861.497],[702.192,-864.19]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-1.282,-1.047],[-1.805,-7.993],[1.328,-5.604],[4.964,-2.92]],"o":[[1.647,0.164],[6.347,5.182],[1.269,5.618],[-1.328,5.604],[0,0]],"v":[[741.128,-910.099],[745.514,-907.933],[757.279,-886.867],[757.692,-869.744],[748.111,-855.928]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-2.37,-7.925],[11.09,-8.096]],"o":[[6.27,5.395],[1.036,3.464],[0,0]],"v":[[761.742,-914.83],[775.064,-894.291],[769.785,-854.654]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[1.227,0.716],[2.617,-3.793],[-7.25,-4.54],[-3.304,1.802]],"o":[[-3.98,-2.322],[-2.617,3.793],[3.123,1.956],[8.943,-4.877]],"v":[[716.127,-890.785],[703.94,-887.704],[706.562,-871.596],[717.557,-872.741]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"strokes","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-8.817,3.007],[-0.061,-0.952],[0.247,-5.866],[0.152,-0.17],[0.243,-0.026],[6.947,-0.738]],"o":[[2.096,-9.313],[4.291,-1.463],[0.377,5.859],[-0.01,0.228],[-0.163,0.182],[-6.947,0.738],[0,0]],"v":[[874.796,-856.081],[890.647,-879.099],[895.268,-875.519],[895.463,-857.914],[895.283,-857.268],[894.611,-857.023],[873.77,-854.81]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0.669,-0.239],[1.711,-2.601],[-0.084,-2.406],[-2.453,-0.086],[-2.6,-0.091],[-0.245,0.24],[-0.05,0.245],[0.377,6.21]],"o":[[-2.932,1.048],[-1.711,2.601],[0,0],[2.6,0.091],[0.343,0.012],[0.179,-0.175],[1.236,-6.097],[-0.105,-1.728]],"v":[[923.637,-879.497],[916.598,-873.606],[911.595,-858.003],[918.566,-857.192],[925.428,-855.981],[926.401,-856.213],[926.688,-856.893],[927.984,-875.458]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0.441,-0.193],[1.674,-3.489],[-0.184,-1.607],[-4.014,-1.518],[1.642,6.797]],"o":[[-3.544,1.554],[-1.437,2.995],[0,0],[2.323,-7.496],[-0.424,-1.756]],"v":[[953.669,-876.892],[946.503,-868.088],[940.958,-854.479],[953.838,-851.79],[957.983,-873.609]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"stripes","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-22.326,10.403],[-0.605,-4.596],[4.479,-12.172],[1.033,0.032],[26.641,0.837]],"o":[[15.167,-19.407],[23.239,-10.828],[1.694,12.859],[-0.388,1.055],[-26.641,-0.837],[0,0]],"v":[[782.341,-932.416],[837.948,-980.359],[871.464,-969.245],[867.203,-930.949],[862.382,-927.682],[782.458,-930.192]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"top fin","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[13.747,14.156],[48.343,0],[3,-44],[-49,21],[-24.346,-6.76],[-2.343,9.762]],"o":[[-12.769,-0.468],[-51,0],[-3,44],[47.498,-20.356],[4.998,-8.401],[5.544,-20.327]],"v":[[950.912,-927.04],[766,-932],[656,-860],[817,-842],[959.831,-849.643],[971.5,-876.5]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"body","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-1.831,-0.397],[-2.637,1.451],[-21.399,-2.398],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[2.942,0.637],[18.865,-10.381],[-7.015,-7.798],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[861.425,-816.555],[866.231,-813.748],[874.711,-816.184],[937.084,-828.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[0.868,0.765],[3.818,4.143]],"o":[[-1.073,0.433],[-4.228,-3.724],[0,0]],"v":[[869.347,-836.172],[866.264,-837.311],[854.185,-849.122]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[3.231,4.264]],"o":[[-3.064,-4.385],[0,0]],"v":[[884.987,-840.204],[875.543,-853.179]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[3.056,3.987]],"o":[[-3.056,-3.987],[0,0]],"v":[[901.378,-844.564],[892.211,-856.524]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"strokes","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-1.831,-0.397],[-2.637,1.451],[-21.399,-2.398],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[2.942,0.637],[18.865,-10.381],[-7.015,-7.798],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[861.425,-816.555],[866.231,-813.748],[874.711,-816.184],[937.084,-828.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[880.505,-836.038]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[880.505,-836.038]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"bottom fin","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.035,-2.859],[-0.602,3.172],[2.616,3.135],[0.654,0.302],[0.681,-0.01],[5.304,-1.284],[4.501,-1.089]],"o":[[7.086,10.14],[9.984,2.372],[0.717,-3.776],[-0.461,-0.553],[-0.619,-0.286],[-5.457,0.077],[-4.501,1.089],[0,0]],"v":[[767.821,-830.314],[797.453,-809.184],[813.703,-814.648],[801.487,-834.299],[799.888,-835.724],[797.882,-836.015],[781.763,-833.363],[768.261,-830.095]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"bottom fin 2","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-11,53],[9,-14],[0.702,0.026],[5.544,-20.327],[4.998,-8.401],[-0.674,-0.215],[0,35],[17,12]],"o":[[11,-53],[0,0],[13.747,14.156],[-2.343,9.762],[0.77,0.214],[22,7],[0,-35],[-17,-12]],"v":[[1038.625,-941.188],[952,-927],[950.912,-927.04],[971.5,-876.5],[959.831,-849.643],[962,-849],[1043,-832.75],[1006,-885]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"tail","np":3,"ty":"gr"}],"sr":1,"st":-1,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":15,"ip":137,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.83],"y":[0.874]},"o":{"x":[0.186],"y":[0.266]},"s":[558.5],"t":138},{"i":{"x":[0.832],"y":[0.65]},"o":{"x":[0.258],"y":[0.346]},"s":[421.438],"t":189},{"i":{"x":[0.584],"y":[0.701]},"o":{"x":[0.48],"y":[0.432]},"s":[267.562],"t":293},{"i":{"x":[0.556],"y":[0.587]},"o":{"x":[0.217],"y":[0.322]},"s":[174.972],"t":320},{"i":{"x":[0.816],"y":[0.6]},"o":{"x":[0.486],"y":[0.218]},"s":[70.592],"t":383},{"i":{"x":[0.822],"y":[1.009]},"o":{"x":[0.382],"y":[0.67]},"s":[-118.136],"t":438},{"s":[-190.5],"t":455}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.678],"y":[0.52]},"o":{"x":[0.012],"y":[-0.026]},"s":[114],"t":138},{"i":{"x":[0.881],"y":[1.274]},"o":{"x":[0.283],"y":[0.697]},"s":[97.773],"t":189},{"i":{"x":[0.552],"y":[0.324]},"o":{"x":[0.493],"y":[0.224]},"s":[77.739],"t":293},{"i":{"x":[0.553],"y":[0.763]},"o":{"x":[0.253],"y":[0.485]},"s":[104.163],"t":320},{"i":{"x":[0.845],"y":[0.394]},"o":{"x":[0.479],"y":[0.231]},"s":[152.723],"t":383},{"i":{"x":[0.965],"y":[0.829]},"o":{"x":[0.524],"y":[0.157]},"s":[199.341],"t":438},{"s":[387],"t":455}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.312],"y":[0.708]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":138},{"i":{"x":[0.75],"y":[4.983]},"o":{"x":[0.333],"y":[3.814]},"s":[7],"t":165},{"i":{"x":[0.626],"y":[0.814]},"o":{"x":[0.444],"y":[0.146]},"s":[7],"t":269},{"i":{"x":[0.64],"y":[-0.475]},"o":{"x":[0.336],"y":[-0.66]},"s":[-28.491],"t":345},{"i":{"x":[0.696],"y":[-1.301]},"o":{"x":[0.447],"y":[-1.322]},"s":[-24],"t":383},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.514],"y":[0.226]},"s":[-33],"t":438},{"s":[-81],"t":455}]},"s":{"a":0,"ix":6,"k":[24,24,100]}},"nm":"skinny fish 5","op":490,"parent":11,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[13.747,14.156],[48.014,5.637],[8.11,-43.35],[-49,21],[-24.346,-6.76],[-2.343,9.762]],"o":[[-12.769,-0.468],[-50.652,-5.946],[-8.11,43.35],[47.498,-20.356],[4.998,-8.401],[5.544,-20.327]],"v":[[950.912,-927.04],[771.386,-942.903],[653.742,-884.219],[817,-842],[959.831,-849.643],[971.5,-876.5]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[4.085,2.192],[12.552,-5.891],[13.336,-6.589],[-26.641,-0.837],[-0.164,1.112],[1.694,12.859]],"o":[[-7.985,-4.284],[-22.297,10.465],[0,0],[1.033,0.032],[1.297,-8.801],[-0.605,-4.596]],"v":[[861.485,-970.966],[823.948,-966.859],[787.664,-941.411],[862.382,-927.682],[867.203,-930.949],[868.964,-958.995]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-2.637,1.451],[-16.645,13.123],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[18.865,-10.381],[8.017,-6.321],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[853.425,-823.805],[866.711,-823.434],[922.584,-835.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-11.896,-3.394],[-0.703,5.898],[2.616,3.135],[5.418,-0.657],[4.597,-0.557]],"o":[[5.855,10.897],[3.104,0.886],[0.455,-3.817],[-0.461,-0.553],[-4.597,0.557],[0,0]],"v":[[761.339,-841.698],[797.453,-809.184],[813.703,-814.648],[800.737,-836.049],[775.541,-843.101],[761.751,-841.429]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-11,53],[9,-14],[0.702,0.026],[5.544,-20.327],[4.998,-8.401],[-0.674,-0.215],[9.099,33.797],[17,12]],"o":[[11,-53],[0,0],[13.747,14.156],[-2.343,9.762],[0.77,0.214],[22,7],[-5.25,-19.5],[-17,-12]],"v":[[1028,-928],[952,-927],[950.912,-927.04],[971.5,-876.5],[959.831,-849.643],[962,-849],[1032.75,-844.25],[1006,-885]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.10122525692,0.453768372536,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"body","np":6,"ty":"gr"}],"sr":1,"st":10,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":16,"ip":164,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.636],"y":[0.533]},"o":{"x":[0.437],"y":[-0.028]},"s":[554.5],"t":165},{"i":{"x":[0.702],"y":[0.775]},"o":{"x":[0.218],"y":[0.489]},"s":[489.5],"t":197},{"i":{"x":[0.547],"y":[0.172]},"o":{"x":[0.391],"y":[0.22]},"s":[398.687],"t":275},{"i":{"x":[0.675],"y":[0.686]},"o":{"x":[0.467],"y":[0.377]},"s":[261.522],"t":363},{"i":{"x":[0.91],"y":[0.733]},"o":{"x":[0.602],"y":[0.517]},"s":[14.121],"t":433},{"s":[-105],"t":463}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.528],"y":[0.883]},"o":{"x":[0.019],"y":[0.109]},"s":[93.5],"t":165},{"i":{"x":[0.825],"y":[0.718]},"o":{"x":[0.337],"y":[-0.424]},"s":[131.618],"t":197},{"i":{"x":[0.593],"y":[1.128]},"o":{"x":[0.227],"y":[0.593]},"s":[113.534],"t":274},{"i":{"x":[0.755],"y":[0.2]},"o":{"x":[0.35],"y":[0.014]},"s":[100.612],"t":363},{"i":{"x":[0.965],"y":[0.734]},"o":{"x":[0.435],"y":[0.203]},"s":[179.675],"t":433},{"s":[416.5],"t":463}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.36],"y":[0.75]},"o":{"x":[0.167],"y":[0.167]},"s":[-68.187],"t":165},{"i":{"x":[0.764],"y":[1.019]},"o":{"x":[0.312],"y":[1.086]},"s":[3.142],"t":210},{"i":{"x":[0.834],"y":[0.72]},"o":{"x":[0.167],"y":[0.014]},"s":[14.676],"t":275},{"i":{"x":[0.836],"y":[0.737]},"o":{"x":[0.468],"y":[0.286]},"s":[-0.577],"t":363},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.402],"y":[0.319]},"s":[-20.685],"t":405},{"s":[-64.207],"t":450}]},"s":{"a":0,"ix":6,"k":[19,19,100]}},"nm":"skinny fish 6","op":546,"parent":11,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.10122525692,0.453768372536,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":66,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":17,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.604],"y":[0.387]},"o":{"x":[0.353],"y":[0.242]},"s":[543.5],"t":195},{"i":{"x":[0.607],"y":[0.388]},"o":{"x":[0.318],"y":[0.132]},"s":[520.321],"t":237},{"i":{"x":[0.689],"y":[0.738]},"o":{"x":[0.306],"y":[0.265]},"s":[401.118],"t":295},{"i":{"x":[0.777],"y":[0.799]},"o":{"x":[0.475],"y":[0.515]},"s":[260.778],"t":333},{"i":{"x":[0.806],"y":[0.95]},"o":{"x":[0.564],"y":[0.688]},"s":[39.853],"t":410},{"s":[-95.5],"t":474}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.831],"y":[0.761]},"o":{"x":[0.533],"y":[0.308]},"s":[127.5],"t":195},{"i":{"x":[0.64],"y":[-0.541]},"o":{"x":[0.396],"y":[-1.016]},"s":[141.81],"t":237},{"i":{"x":[0.526],"y":[0.505]},"o":{"x":[0.344],"y":[0.335]},"s":[130.868],"t":295},{"i":{"x":[0.712],"y":[-0.181]},"o":{"x":[0.407],"y":[-0.87]},"s":[99.351],"t":333},{"i":{"x":[0.983],"y":[0.512]},"o":{"x":[0.345],"y":[0.153]},"s":[130.629],"t":410},{"s":[371],"t":474}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.625],"y":[0.799]},"o":{"x":[0.311],"y":[0.365]},"s":[-38.306],"t":195},{"i":{"x":[0.705],"y":[1.614]},"o":{"x":[0.291],"y":[1.098]},"s":[6.433],"t":263},{"i":{"x":[0.667],"y":[0.679]},"o":{"x":[0.642],"y":[0.119]},"s":[15.02],"t":355},{"i":{"x":[0.705],"y":[0.534]},"o":{"x":[0.364],"y":[0.833]},"s":[-21.72],"t":390},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.819],"y":[0.357]},"s":[-45.597],"t":444},{"s":[-87.188],"t":470}]},"s":{"a":0,"ix":6,"k":[15,15,100]}},"nm":"skinny fish 4","op":480,"parent":11,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.10122525692,0.453768372536,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":19,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[11.81,62.175,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[-1349.362,99.226,0],"t":15,"ti":[-1.038,5.415,0],"to":[0.165,-3.508,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[-1348.369,78.178,0],"t":30,"ti":[-0.229,-0.023,0],"to":[1.038,-5.415,0]},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1343.133,66.738,0],"t":125,"ti":[0.644,-1.93,0],"to":[0.229,0.023,0]},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[-1346.994,78.317,0],"t":141,"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[-1346.994,78.317,0],"t":203,"ti":[0.395,-3.485,0],"to":[0.644,-1.93,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[-1343.133,66.738,0],"t":218,"ti":[0.841,-6.841,0],"to":[-0.395,3.485,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[-1349.362,99.226,0],"t":240,"ti":[-1.038,5.415,0],"to":[-0.841,6.841,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1348.178,107.783,0],"t":300,"ti":[-0.197,4.911,0],"to":[1.038,-5.415,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[-1343.133,66.738,0],"t":313,"ti":[1.038,-5.415,0],"to":[0.197,-4.911,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1346.994,78.317,0],"t":435,"ti":[0.395,-3.485,0],"to":[-1.038,5.415,0]},{"s":[-1349.362,99.226,0],"t":457}]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.333],"y":[0]},"s":[-18.5],"t":15},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0],"y":[0]},"s":[-11.5],"t":30},{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"s":[0.5],"t":125},{"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]},"s":[-3.5],"t":141},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.45],"y":[0]},"s":[-3.5],"t":203},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.333],"y":[0]},"s":[0.5],"t":218},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"s":[-18.5],"t":240},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"s":[-21.5],"t":300},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0],"y":[0]},"s":[0.5],"t":313},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"s":[-3.5],"t":435},{"s":[-18.5],"t":457}]},"s":{"a":0,"ix":6,"k":[175,175,100]}},"nm":"Lamp beam","op":480,"parent":21,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-3.37,0.521],[-3.246,6.411],[7.763,7.942],[4.893,3.328]],"o":[[5.183,-0.801],[3.201,-6.323],[-3.352,-3.43],[-1.784,-1.213]],"v":[[-28.876,88],[-12.863,76.489],[-15.825,44.236],[-22.403,39.079]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-3.792,1.23],[0.125,3.25],[2.125,3.375],[2.25,0.98]],"o":[[4.625,-1.5],[-0.125,-3.25],[-2.125,-3.375],[-1.834,-0.799]],"v":[[-49.375,88.895],[-42.875,71.27],[-47.125,48.145],[-53,42.895]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-3.792,1.23],[0.125,3.25],[2.125,3.375],[2.25,0.98]],"o":[[4.625,-1.5],[-0.125,-3.25],[-2.125,-3.375],[-1.834,-0.799]],"v":[[-49.375,88.895],[-42.875,71.27],[-47.125,48.145],[-53,42.895]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-2.852,1.23],[0.094,3.25],[1.598,3.375],[1.692,0.98]],"o":[[3.478,-1.5],[-0.094,-3.25],[-1.598,-3.375],[-1.379,-0.799]],"v":[[-52.057,89.048],[-47.168,71.423],[-50.364,48.298],[-54.783,43.048]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[-1.719,1.23],[0.057,3.25],[0.963,3.375],[1.02,0.98]],"o":[[2.097,-1.5],[-0.057,-3.25],[-0.963,-3.375],[-0.831,-0.799]],"v":[[-54.794,89.048],[-51.848,71.423],[-53.774,48.298],[-56.438,43.048]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-3.792,1.23],[0.125,3.25],[2.125,3.375],[2.25,0.98]],"o":[[4.625,-1.5],[-0.125,-3.25],[-2.125,-3.375],[-1.834,-0.799]],"v":[[-49.375,88.895],[-42.875,71.27],[-47.125,48.145],[-53,42.895]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-3.37,0.521],[-3.246,6.411],[7.763,7.942],[4.893,3.328]],"o":[[5.183,-0.801],[3.201,-6.323],[-3.352,-3.43],[-1.784,-1.213]],"v":[[-28.876,88],[-12.863,76.489],[-15.825,44.236],[-22.403,39.079]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-3.652,0.521],[-3.517,6.411],[8.412,7.942],[5.302,3.328]],"o":[[5.616,-0.801],[3.469,-6.323],[-3.633,-3.43],[-1.933,-1.213]],"v":[[-19.704,87.813],[-4.834,76.764],[-8.043,44.51],[-15.172,39.353]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-3.792,1.23],[0.125,3.25],[2.125,3.375],[2.25,0.98]],"o":[[4.625,-1.5],[-0.125,-3.25],[-2.125,-3.375],[-1.834,-0.799]],"v":[[-49.375,88.895],[-42.875,71.27],[-47.125,48.145],[-53,42.895]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-1.719,1.23],[0.057,3.25],[0.963,3.375],[1.02,0.98]],"o":[[2.097,-1.5],[-0.057,-3.25],[-0.963,-3.375],[-0.831,-0.799]],"v":[[-54.794,89.048],[-51.848,71.423],[-53.774,48.298],[-56.438,43.048]]}],"t":435},{"s":[{"c":false,"i":[[-3.37,0.521],[-3.246,6.411],[7.763,7.942],[4.893,3.328]],"o":[[5.183,-0.801],[3.201,-6.323],[-3.352,-3.43],[-1.784,-1.213]],"v":[[-28.876,88],[-12.863,76.489],[-15.825,44.236],[-22.403,39.079]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.901960790157,0.623529434204,0.117647059262,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":2}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"beam circle line 1","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[4.239,0.723],[0.538,-3.467],[-7.243,-5.712],[-2.157,0]],"o":[[-18.623,-3.177],[-0.795,5.126],[5.44,4.29],[2.157,0]],"v":[[-23.56,38.546],[-48.09,58.521],[-41.046,83.153],[-28.141,88.094]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[3.747,-1.36],[-0.125,-3.25],[-3.375,-4.75],[-2,0]],"o":[[-6.308,2.29],[0.125,3.25],[2.31,3.251],[2,0]],"v":[[-56.178,42.815],[-63.625,61.625],[-59.125,85],[-50.625,89.125]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[3.747,-1.36],[-0.125,-3.25],[-3.375,-4.75],[-2,0]],"o":[[-6.308,2.29],[0.125,3.25],[2.31,3.251],[2,0]],"v":[[-56.178,42.815],[-63.625,61.625],[-59.125,85],[-50.625,89.125]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[2.818,-1.36],[-0.094,-3.25],[-2.538,-4.75],[-1.504,0]],"o":[[-4.744,2.29],[0.094,3.25],[1.737,3.251],[1.504,0]],"v":[[-57.173,42.968],[-62.774,61.777],[-59.39,85.152],[-52.997,89.277]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[1.699,-1.36],[-0.057,-3.25],[-1.53,-4.75],[-0.907,0]],"o":[[-2.86,2.29],[0.057,3.25],[1.047,3.251],[0.907,0]],"v":[[-57.878,42.968],[-61.254,61.777],[-59.214,85.152],[-55.361,89.277]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[3.747,-1.36],[-0.125,-3.25],[-3.375,-4.75],[-2,0]],"o":[[-6.308,2.29],[0.125,3.25],[2.31,3.251],[2,0]],"v":[[-56.178,42.815],[-63.625,61.625],[-59.125,85],[-50.625,89.125]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[4.239,0.723],[0.538,-3.467],[-7.243,-5.712],[-2.157,0]],"o":[[-18.623,-3.177],[-0.795,5.126],[5.44,4.29],[2.157,0]],"v":[[-23.56,38.546],[-48.09,58.521],[-41.046,83.153],[-28.141,88.094]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[4.593,0.723],[0.582,-3.467],[-7.849,-5.712],[-2.338,0]],"o":[[-20.18,-3.177],[-0.861,5.126],[5.895,4.29],[2.338,0]],"v":[[-16.426,38.82],[-43.007,58.795],[-35.373,83.427],[-21.39,88.368]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[3.747,-1.36],[-0.125,-3.25],[-3.375,-4.75],[-2,0]],"o":[[-6.308,2.29],[0.125,3.25],[2.31,3.251],[2,0]],"v":[[-56.178,42.815],[-63.625,61.625],[-59.125,85],[-50.625,89.125]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[1.699,-1.36],[-0.057,-3.25],[-1.53,-4.75],[-0.907,0]],"o":[[-2.86,2.29],[0.057,3.25],[1.047,3.251],[0.907,0]],"v":[[-57.878,42.968],[-61.254,61.777],[-59.214,85.152],[-55.361,89.277]]}],"t":435},{"s":[{"c":false,"i":[[4.239,0.723],[0.538,-3.467],[-7.243,-5.712],[-2.157,0]],"o":[[-18.623,-3.177],[-0.795,5.126],[5.44,4.29],[2.157,0]],"v":[[-23.56,38.546],[-48.09,58.521],[-41.046,83.153],[-28.141,88.094]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[1,1,1,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":2}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"inside highlight line","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[8.83,-3.254],[-0.167,-6.223],[-7.719,-5.279],[-1.393,5.668],[5.886,6.151]],"o":[[-7.142,2.632],[0.293,10.895],[9.236,6.316],[2.192,-8.916],[-1.977,-2.067]],"v":[[-29.938,43.275],[-41.414,63.345],[-31.975,84.648],[-12.044,70.86],[-15.763,46.021]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.895,0.487],[0,-5.772],[-4.25,0.25],[-0.625,5.375],[0.375,2.625]],"o":[[-6,-0.75],[0,8.125],[3.283,-0.193],[0.625,-5.375],[-0.375,-2.625]],"v":[[-49.125,48.375],[-56,66.25],[-47.25,86],[-43.875,75.5],[-45.5,55.25]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.895,0.487],[0,-5.772],[-4.25,0.25],[-0.625,5.375],[0.375,2.625]],"o":[[-6,-0.75],[0,8.125],[3.283,-0.193],[0.625,-5.375],[-0.375,-2.625]],"v":[[-49.125,48.375],[-56,66.25],[-47.25,86],[-43.875,75.5],[-45.5,55.25]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.929,0.487],[0,-5.772],[-3.196,0.25],[-0.47,5.375],[0.282,2.625]],"o":[[-4.513,-0.75],[0,8.125],[2.469,-0.193],[0.47,-5.375],[-0.282,-2.625]],"v":[[-51.869,48.527],[-57.039,66.402],[-50.458,86.152],[-47.92,75.652],[-49.142,55.402]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[1.766,0.487],[0,-5.772],[-1.927,0.25],[-0.283,5.375],[0.17,2.625]],"o":[[-2.72,-0.75],[0,8.125],[1.488,-0.193],[0.283,-5.375],[-0.17,-2.625]],"v":[[-54.681,48.527],[-57.798,66.402],[-53.831,86.152],[-52.301,75.652],[-53.038,55.402]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[3.895,0.487],[0,-5.772],[-4.25,0.25],[-0.625,5.375],[0.375,2.625]],"o":[[-6,-0.75],[0,8.125],[3.283,-0.193],[0.625,-5.375],[-0.375,-2.625]],"v":[[-49.125,48.375],[-56,66.25],[-47.25,86],[-43.875,75.5],[-45.5,55.25]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[8.83,-3.254],[-0.167,-6.223],[-7.719,-5.279],[-1.393,5.668],[5.886,6.151]],"o":[[-7.142,2.632],[0.293,10.895],[9.236,6.316],[2.192,-8.916],[-1.977,-2.067]],"v":[[-29.938,43.275],[-41.414,63.345],[-31.975,84.648],[-12.044,70.86],[-15.763,46.021]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[10.629,-3.254],[-0.201,-6.223],[-9.29,-5.279],[-1.677,5.668],[7.085,6.151]],"o":[[-8.596,2.632],[0.353,10.895],[11.117,6.316],[2.638,-8.916],[-2.38,-2.067]],"v":[[-25.748,43.549],[-39.56,63.619],[-28.2,84.922],[-4.209,71.134],[-8.686,46.296]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.895,0.487],[0,-5.772],[-4.25,0.25],[-0.625,5.375],[0.375,2.625]],"o":[[-6,-0.75],[0,8.125],[3.283,-0.193],[0.625,-5.375],[-0.375,-2.625]],"v":[[-49.125,48.375],[-56,66.25],[-47.25,86],[-43.875,75.5],[-45.5,55.25]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.766,0.487],[0,-5.772],[-1.927,0.25],[-0.283,5.375],[0.17,2.625]],"o":[[-2.72,-0.75],[0,8.125],[1.488,-0.193],[0.283,-5.375],[-0.17,-2.625]],"v":[[-54.681,48.527],[-57.798,66.402],[-53.831,86.152],[-52.301,75.652],[-53.038,55.402]]}],"t":435},{"s":[{"c":true,"i":[[8.83,-3.254],[-0.167,-6.223],[-7.719,-5.279],[-1.393,5.668],[5.886,6.151]],"o":[[-7.142,2.632],[0.293,10.895],[9.236,6.316],[2.192,-8.916],[-1.977,-2.067]],"v":[[-29.938,43.275],[-41.414,63.345],[-31.975,84.648],[-12.044,70.86],[-15.763,46.021]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[1,1,1,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"bulb","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.854,-4.315],[0.17,-6.492],[-6.863,-6.586],[-3.236,1.079],[0.539,11.596],[4.601,4.245]],"o":[[-4.342,3.859],[-0.251,9.576],[3.588,3.443],[3.236,-1.079],[-0.377,-8.099],[-3.909,-3.606]],"v":[[-38.034,41.558],[-47.475,59.359],[-41.151,82.942],[-25.218,87.484],[-9.932,62.123],[-17.666,42.58]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.5,-4],[0.5,-6],[-3,-3.5],[-3,1],[0.5,10.75],[1.98,3.366]],"o":[[-4.025,3.578],[-0.5,6],[3,3.5],[3,-1],[-0.349,-7.509],[-2.5,-4.25]],"v":[[-59,44.5],[-63.5,62.5],[-59.125,85.25],[-49.5,89],[-43.5,67],[-47.5,48]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.5,-4],[0.5,-6],[-3,-3.5],[-3,1],[0.5,10.75],[1.98,3.366]],"o":[[-4.025,3.578],[-0.5,6],[3,3.5],[3,-1],[-0.349,-7.509],[-2.5,-4.25]],"v":[[-59,44.5],[-63.5,62.5],[-59.125,85.25],[-49.5,89],[-43.5,67],[-47.5,48]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.384,-4],[0.376,-6],[-2.256,-3.5],[-2.256,1],[0.376,10.75],[1.489,3.366]],"o":[[-3.027,3.578],[-0.376,6],[2.256,3.5],[2.256,-1],[-0.263,-7.509],[-1.88,-4.25]],"v":[[-59.296,44.652],[-62.68,62.652],[-59.39,85.402],[-52.151,89.152],[-47.638,67.152],[-50.646,48.152]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[2.04,-4],[0.227,-6],[-1.36,-3.5],[-1.36,1],[0.227,10.75],[0.898,3.366]],"o":[[-1.825,3.578],[-0.227,6],[1.36,3.5],[1.36,-1],[-0.158,-7.509],[-1.133,-4.25]],"v":[[-59.158,44.652],[-61.198,62.652],[-59.214,85.402],[-54.851,89.152],[-52.131,67.152],[-53.944,48.152]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.5,-4],[0.5,-6],[-3,-3.5],[-3,1],[0.5,10.75],[1.98,3.366]],"o":[[-4.025,3.578],[-0.5,6],[3,3.5],[3,-1],[-0.349,-7.509],[-2.5,-4.25]],"v":[[-59,44.5],[-63.5,62.5],[-59.125,85.25],[-49.5,89],[-43.5,67],[-47.5,48]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.854,-4.315],[0.17,-6.492],[-6.863,-6.586],[-3.236,1.079],[0.539,11.596],[4.601,4.245]],"o":[[-4.342,3.859],[-0.251,9.576],[3.588,3.443],[3.236,-1.079],[-0.377,-8.099],[-3.909,-3.606]],"v":[[-38.034,41.558],[-47.475,59.359],[-41.151,82.942],[-25.218,87.484],[-9.932,62.123],[-17.666,42.58]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.26,-4.315],[0.184,-6.492],[-7.437,-6.586],[-3.507,1.079],[0.584,11.596],[4.986,4.245]],"o":[[-4.705,3.859],[-0.272,9.576],[3.888,3.443],[3.507,-1.079],[-0.408,-8.099],[-4.236,-3.606]],"v":[[-32.11,41.832],[-42.34,59.633],[-35.488,83.216],[-18.222,87.758],[-1.658,62.397],[-10.039,42.854]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.5,-4],[0.5,-6],[-3,-3.5],[-3,1],[0.5,10.75],[1.98,3.366]],"o":[[-4.025,3.578],[-0.5,6],[3,3.5],[3,-1],[-0.349,-7.509],[-2.5,-4.25]],"v":[[-59,44.5],[-63.5,62.5],[-59.125,85.25],[-49.5,89],[-43.5,67],[-47.5,48]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.04,-4],[0.227,-6],[-1.36,-3.5],[-1.36,1],[0.227,10.75],[0.898,3.366]],"o":[[-1.825,3.578],[-0.227,6],[1.36,3.5],[1.36,-1],[-0.158,-7.509],[-1.133,-4.25]],"v":[[-59.158,44.652],[-61.198,62.652],[-59.214,85.402],[-54.851,89.152],[-52.131,67.152],[-53.944,48.152]]}],"t":435},{"s":[{"c":true,"i":[[4.854,-4.315],[0.17,-6.492],[-6.863,-6.586],[-3.236,1.079],[0.539,11.596],[4.601,4.245]],"o":[[-4.342,3.859],[-0.251,9.576],[3.588,3.443],[3.236,-1.079],[-0.377,-8.099],[-3.909,-3.606]],"v":[[-38.034,41.558],[-47.475,59.359],[-41.151,82.942],[-25.218,87.484],[-9.932,62.123],[-17.666,42.58]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[1,0.96862745285,0.443137258291,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"inside cone","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[11.952,5.519],[32.652,-49.597],[4.82,-51.058],[-38.298,-54.1],[-26.103,12.489],[-37.47,18.992],[-28.409,13.772],[-7.944,3.972],[-0.41,10.177],[2.563,3.844],[21.151,12.055],[29.77,16.866]],"o":[[-7.742,-3.575],[-24.883,37.795],[-3.507,37.145],[16.719,23.618],[31.129,-14.893],[36.074,-18.284],[11.12,-5.39],[3.506,-1.753],[0.349,-8.677],[-5.393,-8.09],[-20.23,-11.53],[-40.969,-23.21]],"v":[[-270.04,-114.08],[-339.378,-83.257],[-380.924,43.3],[-352.332,182.436],[-287.86,217.19],[-182.026,166.112],[-64.608,106.562],[-35.327,91.875],[-10.431,70.718],[-13.093,48.577],[-56.434,18.289],[-118.844,-20.929]]}],"t":15},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.091,2.577],[14.242,-41.561],[1.412,-26.122],[-14.791,-25.908],[-6.795,2.442],[-62.476,17.687],[-28.591,7.926],[-7.509,3.754],[-0.387,9.621],[2.422,3.633],[21.153,6.237],[33.536,9.841]],"o":[[-7.814,-1.667],[-8.416,20.001],[-1.303,36.585],[11.132,22.391],[11.888,-4.272],[31.437,-8.9],[10.431,-2.944],[3.314,-1.657],[0.33,-8.202],[-5.098,-7.647],[-22.227,-6.371],[-60.086,-17.632]],"v":[[-353.897,-50.24],[-389.266,-18.891],[-404.513,59.623],[-388.834,158.539],[-351.74,176.907],[-171.538,125.789],[-70.051,97.162],[-44.838,88.498],[-35.526,68.727],[-38.726,48.707],[-73.046,33.791],[-177.387,2.236]]}],"t":22},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[12.137,1.599],[8.12,-38.889],[0.279,-17.83],[-6.975,-16.533],[0,0],[0,0],[-28.651,5.982],[-7.364,3.682],[-0.38,9.435],[2.376,3.564],[21.154,4.303],[12.5,3]],"o":[[-7.838,-1.032],[-2.941,14.084],[-0.57,36.399],[9.274,21.983],[0,0],[0,0],[10.202,-2.13],[3.25,-1.625],[0.324,-8.044],[-5,-7.5],[-22.891,-4.656],[-12.5,-3]],"v":[[-381.781,-29.012],[-405.854,2.511],[-412.357,65.051],[-400.971,150.594],[-372.98,163.512],[-157.491,113.168],[-71.86,94.036],[-48,87.375],[-43.87,68.065],[-47.25,48.75],[-78.679,36.759],[-193.301,15.24]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[10.2,2.065],[9.992,-45.581],[-0.127,-32.035],[-1.989,-4.834],[0,0],[0,0],[-28.651,5.982],[-7.364,3.682],[-0.38,9.435],[2.376,3.564],[21.172,4.214],[12.5,3]],"o":[[-7.748,-1.569],[-3.081,14.054],[0.083,20.896],[4.771,11.597],[0,0],[0,0],[10.202,-2.13],[3.25,-1.625],[0.324,-8.044],[-5,-7.5],[-23.454,-4.668],[-12.5,-3]],"v":[[-341.879,-17.315],[-372.904,16.394],[-376.678,84.672],[-368.055,136.802],[-350.602,157.052],[-155.405,112.011],[-70.138,93.527],[-48,87.375],[-43.87,68.065],[-47.25,48.75],[-78.375,37.25],[-191.387,15.686]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[8.967,0.213],[2.94,-15.953],[1.385,-12.467],[-1.247,-7.871],[0,0],[0,0],[-29.023,3.791],[-8.771,2.67],[-0.38,9.435],[2.376,3.564],[21.408,2.772],[19.06,2.948]],"o":[[-16.195,-3.341],[-2.902,15.748],[-2.409,21.682],[2.873,18.129],[0,0],[0,0],[10.49,-1.37],[3.476,-1.058],[0.324,-8.044],[-5,-7.5],[-20.829,-2.697],[-12.704,-1.965]],"v":[[-454.854,1.408],[-474.586,19.286],[-479.174,60.372],[-475.091,132.115],[-465.612,152.362],[-260.157,121.111],[-78.337,93.057],[-51.698,88.692],[-47.029,68.491],[-50.133,48.876],[-78.876,39.005],[-254.805,22.258]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[17.069,1.595],[0.421,-11.97],[0.346,-10.565],[-0.235,-7.756],[0,0],[0,0],[-33.812,3.951],[-7.364,3.682],[-0.38,9.435],[0.621,2.534],[21.532,1.417],[18.841,0.186]],"o":[[-4.687,6.037],[-0.301,8.562],[-0.513,15.682],[0.493,16.23],[0,0],[0,0],[9.12,-1.066],[3.25,-1.625],[0.324,-8.044],[-2.145,-8.755],[-20.723,-1.364],[-12.854,-0.127]],"v":[[-523.868,2.923],[-528.886,40.486],[-529.665,72.796],[-528.578,114.073],[-523.436,144.13],[-264.147,114.137],[-74.205,91.03],[-54.61,88.053],[-51.548,67.794],[-54.487,48.598],[-80.31,39.514],[-260.583,24.957]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[8.367,0.783],[8.341,-39.765],[-1.243,-18.908],[-6.75,-17.569],[0,0],[0,0],[-28.651,5.982],[-7.364,3.682],[-0.38,9.435],[2.376,3.564],[21.296,3.532],[12.5,3]],"o":[[-7.871,-0.737],[-2.954,14.081],[0.978,14.88],[9.171,23.869],[0,0],[0,0],[10.202,-2.13],[3.25,-1.625],[0.324,-8.044],[-5,-7.5],[-24.339,-4.037],[-12.5,-3]],"v":[[-377.25,-24.328],[-405.061,8.182],[-410.777,80.401],[-398.229,149.08],[-372.818,164.545],[-211.959,126.243],[-69.728,93.248],[-48,87.375],[-43.87,68.065],[-47.25,48.75],[-78.375,37.25],[-235.34,5.574]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[15.05,10.157],[29.468,-27.773],[5.531,-34.275],[-37.378,-53.991],[0,0],[-37.471,18.992],[-28.41,13.772],[-7.943,3.972],[-0.41,10.177],[2.563,3.844],[21.151,12.055],[30.992,19.487]],"o":[[-21.912,-14.788],[-32.569,30.696],[-3.493,21.646],[36.269,52.388],[0,0],[36.074,-18.284],[11.12,-5.391],[3.506,-1.753],[0.349,-8.677],[-5.393,-8.09],[-20.23,-11.53],[-39.862,-25.063]],"v":[[-260.375,-111.383],[-333.415,-95.852],[-387.241,20.902],[-363.65,179.185],[-288.332,218.776],[-182.854,167.102],[-66.321,107.507],[-28.438,88.398],[-10.24,68.674],[-14.491,47.433],[-56.544,18.382],[-163.317,-48.837]]}],"t":240},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.775,9.663],[59.203,-33.692],[16.607,-128.208],[-29.75,-19.69],[-50.491,37.725],[-29.609,20.711],[-24.828,19.502],[-7.195,5.269],[-0.41,10.178],[3.257,3.276],[17.473,13.381],[28.504,21.354]],"o":[[-25.488,-19.279],[-27.86,15.855],[-16.694,128.88],[63.612,42.1],[34.028,-25.424],[37.072,-25.931],[12.423,-9.758],[3.162,-2.316],[0.349,-8.677],[-6.636,-6.675],[-18.487,-14.157],[-38.802,-29.069]],"v":[[-235.681,-127.601],[-362.257,-151.685],[-493.509,53.749],[-411.075,267.823],[-262.456,258.354],[-173.112,196.968],[-62.42,118.434],[-26.421,92.326],[-2.535,69.552],[-5.883,47.592],[-51.247,14.198],[-118.974,-37.626]]}],"t":300},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[51.934,14.554],[15.764,-23.072],[0.441,-31.885],[-22.667,-27.668],[-18.423,5.452],[-50.925,15.469],[-27.942,8.49],[-7.333,3.976],[-0.385,9.573],[2.539,3.51],[20.538,5.64],[34.191,9.804]],"o":[[-16.201,-4.54],[-17.989,26.329],[-0.494,35.765],[12.176,14.862],[50.487,-14.94],[30.686,-9.321],[10.614,-3.545],[3.234,-1.753],[0.328,-8.162],[-5.303,-7.347],[-21.451,-5.917],[-48.149,-13.807]],"v":[[-320.322,-37.849],[-368.529,-22.884],[-399.516,67.621],[-371.21,171.125],[-313.587,172.509],[-167.701,127.894],[-68.797,98.154],[-43.997,88.293],[-36.202,68.341],[-39.576,48.535],[-73.342,32.974],[-176.528,5.782]]}],"t":306},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[16.106,2.829],[8.204,-31.825],[1.143,-26.169],[-7.019,-8.653],[0,0],[0,0],[-28.651,5.982],[-7.364,3.682],[-0.38,9.435],[2.376,3.564],[21.236,3.877],[12.5,3]],"o":[[-7.786,-1.368],[-4.352,16.885],[-1.312,30.035],[10.691,13.181],[0,0],[0,0],[10.202,-2.13],[3.25,-1.625],[0.324,-8.044],[-5,-7.5],[-22.127,-4.04],[-12.5,-3]],"v":[[-339.6,-17.406],[-369.958,6.451],[-378.109,70.781],[-362.13,149.1],[-325.233,152.957],[-157.198,112.704],[-70.249,93.535],[-48,87.375],[-43.87,68.065],[-47.25,48.75],[-78.375,37.25],[-189.636,15.669]]}],"t":313},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.967,0.213],[2.738,-15.015],[1.385,-12.467],[-1.247,-7.871],[0,0],[0,0],[-28.651,5.982],[-8.771,2.67],[-0.38,9.435],[1.081,4.285],[20.741,2.408],[19.06,2.948]],"o":[[-16.195,-3.341],[-2.873,15.753],[-2.409,21.682],[2.873,18.129],[0,0],[0,0],[10.202,-2.13],[3.476,-1.058],[0.324,-8.044],[-1.786,-7.076],[-20.863,-2.422],[-12.704,-1.965]],"v":[[-455.328,1.259],[-474.592,19.091],[-479.174,60.372],[-475.091,132.115],[-465.009,152.111],[-260.309,121.853],[-70.375,92.25],[-55.624,89.199],[-51.764,69.322],[-54.156,47.733],[-79.076,40.305],[-254.804,22.258]]}],"t":435},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[11.491,4.701],[28.039,-44.264],[4.291,-45.107],[-32.585,-46.971],[-22.078,10.563],[-31.692,16.063],[-28.447,12.571],[-8.071,3.771],[-0.405,10.063],[2.334,3.912],[21.088,10.567],[28.118,14.72]],"o":[[-9.045,-3.539],[-21.488,34.396],[-3.337,34.761],[14.584,22.771],[26.328,-12.597],[30.512,-15.465],[10.978,-4.888],[3.501,-1.646],[0.345,-8.58],[-4.837,-7.934],[-20.328,-10.125],[-36.61,-19.934]],"v":[[-298.612,-96.295],[-360.229,-67.474],[-396.075,45.933],[-371.262,174.676],[-315.178,207.155],[-194.098,159.287],[-65.498,104.355],[-38.457,91.463],[-16.805,70.503],[-19.425,48.447],[-59.925,21.684],[-146.392,-22.308]]}],"t":446},{"s":[{"c":true,"i":[[11.952,5.519],[32.652,-49.597],[4.82,-51.058],[-38.298,-54.1],[-26.103,12.489],[-37.47,18.992],[-28.409,13.772],[-7.944,3.972],[-0.41,10.177],[2.563,3.844],[21.151,12.055],[29.77,16.866]],"o":[[-7.742,-3.575],[-24.883,37.795],[-3.507,37.145],[16.719,23.618],[31.129,-14.893],[36.074,-18.284],[11.12,-5.39],[3.506,-1.753],[0.349,-8.677],[-5.393,-8.09],[-20.23,-11.53],[-40.969,-23.21]],"v":[[-270.04,-114.08],[-339.378,-83.257],[-380.924,43.3],[-352.332,182.436],[-287.86,217.19],[-182.026,166.112],[-64.608,106.562],[-35.327,91.875],[-10.431,70.718],[-13.093,48.577],[-56.434,18.289],[-118.844,-20.929]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"e":{"a":0,"ix":6,"k":[-39.242,69.189]},"g":{"k":{"a":0,"ix":9,"k":[0,1,0.969,0.443,0.5,1,0.969,0.443,1,1,0.969,0.443,0,0,0.5,0.5,1,1]},"p":3},"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","o":{"a":0,"ix":10,"k":100},"r":1,"s":{"a":0,"ix":5,"k":[-305.779,55.712]},"t":1,"ty":"gf"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":10},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"light beam","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":1,"ddd":0,"ind":20,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[512,384,0]},"o":{"a":0,"ix":11,"k":45},"p":{"a":0,"ix":2,"k":[512,384,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Royal Blue Solid 1","op":480,"sc":"#2e5fd8","sh":768,"sr":1,"st":0,"sw":1024,"ty":1},{"ao":0,"bm":0,"ddd":0,"ind":21,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1192.089,97.616,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1233.618,84.445,0],"t":0,"ti":[0.563,0.194,0],"to":[1.126,0.388,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1226.864,86.77,0],"t":125,"ti":[0.675,0.233,0],"to":[-0.563,-0.194,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.48,"y":0},"s":[-1236.995,83.282,0],"t":141,"ti":[-0.113,-0.039,0],"to":[-0.675,-0.233,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[-1230.917,85.375,0],"t":218,"ti":[-0.45,-0.155,0],"to":[0.113,0.039,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.333,"y":0},"s":[-1236.32,83.514,0],"t":240,"ti":[0.113,0.039,0],"to":[0.45,0.155,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1228.215,86.305,0],"t":300,"ti":[0.563,0.194,0],"to":[-0.113,-0.039,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.48,"y":0},"s":[-1236.995,83.282,0],"t":345,"ti":[-0.563,-0.194,0],"to":[-0.563,-0.194,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1231.592,85.142,0],"t":435,"ti":[0.338,0.116,0],"to":[0.563,0.194,0]},{"s":[-1233.618,84.445,0],"t":479}]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-33],"t":0},{"i":{"x":[0.4],"y":[0.92]},"o":{"x":[0.508],"y":[0]},"s":[-20],"t":125},{"i":{"x":[0.822],"y":[-3.493]},"o":{"x":[0.181],"y":[-5.313]},"s":[-69],"t":141},{"i":{"x":[0.886],"y":[0.887]},"o":{"x":[0.463],"y":[0.062]},"s":[-68.132],"t":203},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.141],"y":[0.378]},"s":[-28.5],"t":218},{"i":{"x":[0.737],"y":[1.211]},"o":{"x":[0.333],"y":[0]},"s":[-7],"t":240},{"i":{"x":[0.541],"y":[0.397]},"o":{"x":[0.627],"y":[0.147]},"s":[-15],"t":300},{"i":{"x":[0.565],"y":[1.438]},"o":{"x":[0.216],"y":[1.02]},"s":[-8.607],"t":314},{"i":{"x":[0.587],"y":[0.684]},"o":{"x":[0.49],"y":[0.077]},"s":[-4.683],"t":345},{"i":{"x":[0.755],"y":[1.203]},"o":{"x":[0.335],"y":[1.066]},"s":[-65],"t":419},{"i":{"x":[0.56],"y":[0.527]},"o":{"x":[0.985],"y":[0.137]},"s":[-68.132],"t":435},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.237],"y":[0.684]},"s":[-42.541],"t":457},{"s":[-33],"t":479}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Front arm","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-2.152,-3.921],[-1.174,-0.168],[-0.691,0.698],[0.131,3.718],[1.046,3.495]],"o":[[3.537,3.766],[0.659,1.2],[0.89,0.127],[2.346,-2.369],[-0.131,-3.718],[0,0]],"v":[[-1236.741,90.401],[-1228.246,101.042],[-1225.579,103.683],[-1223.135,102.551],[-1219.979,92.497],[-1225.527,83.709]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-2.634,-3.921],[-1.436,-0.168],[-0.845,0.698],[0.161,3.718],[1.28,3.495]],"o":[[1.572,4.454],[0.806,1.2],[1.089,0.127],[2.87,-2.369],[-0.161,-3.718],[0,0]],"v":[[-1249.157,90.401],[-1242.815,103.031],[-1239.552,105.672],[-1236.56,104.54],[-1232.699,94.486],[-1235.435,83.709]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-2.634,-3.921],[-1.436,-0.168],[-0.845,0.698],[0.161,3.718],[1.28,3.495]],"o":[[1.572,4.454],[0.806,1.2],[1.089,0.127],[2.87,-2.369],[-0.161,-3.718],[0,0]],"v":[[-1249.157,90.401],[-1242.815,103.031],[-1239.552,105.672],[-1236.56,104.54],[-1232.699,94.486],[-1235.435,83.709]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-2.567,-3.921],[-1.4,-0.168],[-0.824,0.698],[0.157,3.718],[1.248,3.495]],"o":[[1.845,4.359],[0.786,1.2],[1.061,0.127],[2.797,-2.369],[-0.157,-3.718],[0,0]],"v":[[-1247.205,90.123],[-1240.563,102.477],[-1237.383,105.118],[-1234.468,103.986],[-1230.705,93.932],[-1233.832,83.432]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-1.88,-4.586],[-1.331,-0.376],[-0.907,0.638],[-0.425,4.032],[0.668,3.942]],"o":[[2.515,4.75],[0.575,1.404],[1.009,0.285],[3.079,-2.166],[0.425,-4.032],[0,0]],"v":[[-1247.032,88.898],[-1240.366,102.273],[-1237.693,105.564],[-1234.692,104.749],[-1229.486,94.431],[-1233.032,83.545]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-1.99,-4.317],[-1.267,-0.291],[-0.819,0.662],[-0.199,3.905],[3.207,4.227]],"o":[[5.902,5.386],[0.609,1.321],[0.96,0.221],[2.781,-2.248],[0.199,-3.905],[0,0]],"v":[[-1249.606,91.113],[-1241.081,105.137],[-1238.41,108.164],[-1235.635,107.221],[-1232.378,95.253],[-1236.735,85.217]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-2.152,-3.921],[-1.174,-0.168],[-0.691,0.698],[1.974,3.38],[3.146,2.774]],"o":[[6.082,3.088],[0.659,1.2],[0.89,0.127],[2.346,-2.369],[-1.876,-3.213],[0,0]],"v":[[-1236.741,90.401],[-1224.211,100.493],[-1221.544,103.134],[-1219.1,102.002],[-1218.525,92.267],[-1225.527,83.709]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-2.152,-3.921],[-1.174,-0.168],[-0.691,0.698],[1.493,4.077],[3.577,2.701]],"o":[[6.148,2.392],[0.659,1.2],[0.89,0.127],[2.346,-2.369],[-1.279,-3.494],[0,0]],"v":[[-1234.024,92.261],[-1222.744,103.635],[-1220.078,106.276],[-1217.633,105.144],[-1217.632,92.977],[-1224.214,84.467]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.99,-4.317],[-1.267,-0.291],[-0.819,0.662],[-0.199,3.905],[3.207,4.227]],"o":[[5.902,5.386],[0.609,1.321],[0.96,0.221],[2.781,-2.248],[0.199,-3.905],[0,0]],"v":[[-1249.606,91.113],[-1241.081,105.137],[-1238.41,108.164],[-1235.635,107.221],[-1232.378,95.253],[-1236.735,85.217]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.88,-4.586],[-1.331,-0.376],[-0.907,0.638],[-0.425,4.032],[0.668,3.942]],"o":[[2.515,4.75],[0.575,1.404],[1.009,0.285],[3.079,-2.166],[0.425,-4.032],[0,0]],"v":[[-1247.032,88.898],[-1240.366,102.273],[-1237.693,105.564],[-1234.692,104.749],[-1229.486,94.431],[-1233.032,83.545]]}],"t":435},{"s":[{"c":false,"i":[[0,0],[-2.152,-3.921],[-1.174,-0.168],[-0.691,0.698],[0.131,3.718],[1.046,3.495]],"o":[[3.537,3.766],[0.659,1.2],[0.89,0.127],[2.346,-2.369],[-0.131,-3.718],[0,0]],"v":[[-1236.741,90.401],[-1228.246,101.042],[-1225.579,103.683],[-1223.135,102.551],[-1219.979,92.497],[-1225.527,83.709]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-1.239,-6.04],[-0.896,-0.015],[-0.539,0.502],[2.384,5.314],[3.274,1.799]],"o":[[6.652,3.744],[0.122,0.594],[1.119,0.019],[3.791,-3.531],[-1.592,-3.549],[0,0]],"v":[[-1258.577,106.077],[-1248.922,116.945],[-1245.797,120.407],[-1242.813,118.866],[-1241.597,104.753],[-1246.413,98.334]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.516,-6.04],[-0.528,-0.31],[-0.66,0.502],[-0.481,5.81],[-0.007,3.016]],"o":[[1.516,6.04],[0.149,0.594],[0.715,0.42],[4.639,-3.531],[0.249,-3.006],[0,0]],"v":[[-1277.611,103.125],[-1273.062,121.246],[-1272.191,122.806],[-1269.911,122.286],[-1263.518,106.574],[-1263.134,97.537]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.003,-6.146],[-0.5,-0.354],[-0.699,0.445],[-0.968,5.749],[-0.26,3.005]],"o":[[1.003,6.146],[0.099,0.605],[0.677,0.479],[4.92,-3.129],[0.5,-2.974],[0,0]],"v":[[-1276.416,99.542],[-1273.406,117.982],[-1272.67,119.61],[-1270.354,119.283],[-1262.663,104.163],[-1261.522,95.191]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.003,-6.146],[-0.5,-0.354],[-0.699,0.445],[0.121,7.484],[1.903,3.199]],"o":[[2.057,5.878],[0.099,0.605],[0.677,0.479],[4.92,-3.129],[-0.049,-3.015],[0,0]],"v":[[-1280.806,99.93],[-1270.736,119.225],[-1270,120.853],[-1267.684,120.525],[-1261.883,104.335],[-1264.76,95.785]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-1.432,-6.676],[-0.467,-0.396],[-0.736,0.381],[1.838,8.814],[1.614,3.354]],"o":[[3.526,4.425],[0.129,0.599],[0.632,0.537],[5.176,-2.683],[-0.616,-2.952],[0,0]],"v":[[-1278.825,100.509],[-1270.234,118.549],[-1269.643,120.235],[-1267.307,120.113],[-1260.826,104.838],[-1264.283,95.467]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-1.003,-6.146],[-0.5,-0.354],[-0.699,0.445],[-0.968,5.749],[-0.26,3.005]],"o":[[1.003,6.146],[0.099,0.605],[0.677,0.479],[4.92,-3.129],[0.5,-2.974],[0,0]],"v":[[-1276.416,99.542],[-1273.406,117.982],[-1272.67,119.61],[-1270.354,119.283],[-1262.663,104.163],[-1261.522,95.191]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-4.708,-4.5],[-0.884,0.145],[-0.44,0.59],[4.127,5.595],[3.274,1.799]],"o":[[8.962,3.994],[0.438,0.419],[1.105,-0.182],[3.097,-4.153],[-2.309,-3.13],[0,0]],"v":[[-1258.577,106.077],[-1241.868,117.161],[-1238.174,120.007],[-1235.514,117.957],[-1238.778,103.168],[-1246.413,98.334]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-2.668,-3.725],[-0.974,0.033],[-0.558,0.575],[4.606,4.175],[3.274,1.799]],"o":[[8.51,2.348],[1.675,2.338],[1.217,-0.041],[3.923,-4.046],[-2.882,-2.612],[0,0]],"v":[[-1255.555,106.315],[-1240.878,114.408],[-1235.055,122.204],[-1230.081,120.248],[-1235.825,102.837],[-1243.308,97.502]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.003,-6.146],[-0.5,-0.354],[-0.699,0.445],[-0.968,5.749],[-0.26,3.005]],"o":[[1.003,6.146],[0.099,0.605],[0.677,0.479],[4.92,-3.129],[0.5,-2.974],[0,0]],"v":[[-1276.416,99.542],[-1273.406,117.982],[-1272.67,119.61],[-1270.354,119.283],[-1262.663,104.163],[-1261.522,95.191]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.432,-6.676],[-0.467,-0.396],[-0.736,0.381],[1.838,8.814],[1.614,3.354]],"o":[[3.526,4.425],[0.129,0.599],[0.632,0.537],[5.176,-2.683],[-0.616,-2.952],[0,0]],"v":[[-1278.825,100.509],[-1270.234,118.549],[-1269.643,120.235],[-1267.307,120.113],[-1260.826,104.838],[-1264.283,95.467]]}],"t":435},{"s":[{"c":false,"i":[[0,0],[-1.239,-6.04],[-0.896,-0.015],[-0.539,0.502],[2.384,5.314],[3.274,1.799]],"o":[[6.652,3.744],[0.122,0.594],[1.119,0.019],[3.791,-3.531],[-1.592,-3.549],[0,0]],"v":[[-1258.577,106.077],[-1248.922,116.945],[-1245.797,120.407],[-1242.813,118.866],[-1241.597,104.753],[-1246.413,98.334]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-1.98,-3.787],[-1.492,-1.079],[-1.437,1.186],[-0.118,2.51],[6.302,5.259]],"o":[[7.373,1.861],[0.934,1.786],[1.492,1.079],[1.703,-1.406],[0.288,-6.155],[0,0]],"v":[[-1285.123,119.327],[-1269.574,130.881],[-1266.072,135.5],[-1261.148,135.659],[-1258.943,128.912],[-1271.189,111.235]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.525,-3.635],[-1.415,-1.206],[-1.696,0.761],[-0.501,2.147],[0.245,5.4]],"o":[[0.411,3.92],[0.719,1.714],[1.415,1.206],[2.011,-0.902],[1.227,-5.265],[0,0]],"v":[[-1308.868,112.916],[-1305.943,124.33],[-1302.933,128.964],[-1297.752,130.004],[-1294.408,124.581],[-1292.925,108.482]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.031,-3.805],[-1.243,-1.382],[-1.782,0.53],[-0.78,2.062],[-0.471,5.385]],"o":[[-0.111,3.94],[0.486,1.794],[1.243,1.382],[2.113,-0.628],[1.913,-5.056],[0,0]],"v":[[-1310.345,103.383],[-1308.956,115.084],[-1306.586,120.075],[-1301.588,121.792],[-1297.556,116.858],[-1293.956,101.098]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.959,-3.42],[-1.553,-1.023],[-1.59,0.964],[-0.233,2.192],[2.298,6.454]],"o":[[0.889,3.84],[0.924,1.613],[1.553,1.023],[1.885,-1.143],[0.572,-5.376],[0,0]],"v":[[-1308.616,110.992],[-1301.8,121.697],[-1298.244,125.926],[-1292.974,126.322],[-1290.322,120.529],[-1293.339,104.634]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-1.573,-3.614],[-1.431,-1.187],[-1.686,0.784],[-0.472,2.153],[1.578,6.666]],"o":[[0.464,3.914],[0.742,1.704],[1.431,1.187],[1.999,-0.929],[1.157,-5.281],[0,0]],"v":[[-1310.303,110.01],[-1304.699,121.397],[-1301.627,125.99],[-1296.432,126.96],[-1293.162,121.492],[-1294.421,105.362]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-1.031,-3.805],[-1.243,-1.382],[-1.782,0.53],[-0.78,2.062],[-0.471,5.385]],"o":[[-0.111,3.94],[0.486,1.794],[1.243,1.382],[2.113,-0.628],[1.913,-5.056],[0,0]],"v":[[-1310.345,103.383],[-1308.956,115.084],[-1306.586,120.075],[-1301.588,121.792],[-1297.556,116.858],[-1293.956,101.098]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-1.98,-3.787],[-1.492,-1.079],[-1.437,1.186],[-0.118,2.51],[6.302,5.259]],"o":[[7.373,1.861],[0.934,1.786],[1.492,1.079],[1.703,-1.406],[0.288,-6.155],[0,0]],"v":[[-1285.123,119.327],[-1269.574,130.881],[-1266.072,135.5],[-1261.148,135.659],[-1258.943,128.912],[-1271.189,111.235]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-2.361,-4.005],[-1.681,-1.09],[-1.495,1.368],[0.011,2.734],[9.514,4.918]],"o":[[8.113,1.614],[1.113,1.889],[1.681,1.09],[1.773,-1.622],[-0.028,-6.704],[0,0]],"v":[[-1277.957,121.391],[-1260.037,130.391],[-1255.976,135.216],[-1250.617,135.115],[-1248.595,127.663],[-1264.395,111.761]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-1.031,-3.805],[-1.243,-1.382],[-1.782,0.53],[-0.78,2.062],[-0.471,5.385]],"o":[[-0.111,3.94],[0.486,1.794],[1.243,1.382],[2.113,-0.628],[1.913,-5.056],[0,0]],"v":[[-1310.345,103.383],[-1308.956,115.084],[-1306.586,120.075],[-1301.588,121.792],[-1297.556,116.858],[-1293.956,101.098]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.573,-3.614],[-1.431,-1.187],[-1.686,0.784],[-0.472,2.153],[1.578,6.666]],"o":[[0.464,3.914],[0.742,1.704],[1.431,1.187],[1.999,-0.929],[1.157,-5.281],[0,0]],"v":[[-1310.303,110.01],[-1304.699,121.397],[-1301.627,125.99],[-1296.432,126.96],[-1293.162,121.492],[-1294.421,105.362]]}],"t":435},{"s":[{"c":false,"i":[[0,0],[-1.98,-3.787],[-1.492,-1.079],[-1.437,1.186],[-0.118,2.51],[6.302,5.259]],"o":[[7.373,1.861],[0.934,1.786],[1.492,1.079],[1.703,-1.406],[0.288,-6.155],[0,0]],"v":[[-1285.123,119.327],[-1269.574,130.881],[-1266.072,135.5],[-1261.148,135.659],[-1258.943,128.912],[-1271.189,111.235]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.964705884457,0.549019634724,0.129411771894,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Front arm stripes","np":5,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[16.826,-10.701],[39.173,-20.691],[-0.677,-9.061],[8.335,3.257],[2.714,-9.635],[-5.443,-8.012],[-13.163,9.37],[-15.21,7.307],[-21.31,10.273],[-14.634,9.513],[1.851,14.378]],"o":[[-34.794,22.128],[-2.064,1.09],[0.686,9.17],[-1.905,-0.744],[-4.58,16.258],[6.779,9.978],[16.56,-11.788],[13.43,-6.452],[22.218,-10.71],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1204.35,69.181],[-1289.768,121.534],[-1303.948,127.925],[-1335.985,136.347],[-1347.558,143.409],[-1340.674,177.869],[-1292.727,182.543],[-1243.477,157.165],[-1202.78,140.815],[-1154.705,116.767],[-1141.428,85.024]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[20.59,-10.701],[44.513,-10.687],[1.734,-6.34],[9.189,5.001],[2.362,-6.398],[-9.482,-3.942],[-20.194,1.752],[-17.192,4.746],[-26.496,7.667],[-14.634,9.513],[1.851,14.378]],"o":[[-42.576,22.128],[-2.345,0.563],[-2.056,7.516],[-1.88,-1.023],[-4.473,12.116],[8.505,3.536],[14.376,-1.362],[17.267,-4.783],[28.451,-8.232],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1209.521,69.181],[-1313.519,113.365],[-1328.186,116.559],[-1352.862,120.495],[-1361.96,127.966],[-1350.994,159.825],[-1313.619,162.147],[-1261.454,153.413],[-1209.68,138.947],[-1154.705,116.767],[-1141.428,85.024]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[20.59,-10.701],[45.535,-4.704],[5.698,-5.261],[8.446,6.173],[3.188,-6.029],[-8.877,-5.162],[-20.248,-0.936],[-17.782,1.373],[-26.496,7.667],[-14.634,9.513],[1.851,14.378]],"o":[[-42.576,22.128],[-2.399,0.248],[-5.725,5.286],[-1.728,-1.263],[-6.037,11.417],[7.963,4.631],[14.43,0.552],[17.938,-1.385],[28.451,-8.232],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1209.521,69.181],[-1315.015,103.213],[-1328.755,103.135],[-1354.955,105.075],[-1364.962,111.276],[-1358.307,144.306],[-1321.568,151.553],[-1262.426,149.958],[-1209.68,138.947],[-1154.705,116.767],[-1141.428,85.024]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[20.59,-10.701],[44.866,-16.525],[1.465,-6.408],[9.391,4.61],[2.091,-6.491],[-7.598,-6.908],[-11.451,2.353],[-17.418,3.833],[-27.514,6.093],[-14.634,9.513],[1.851,14.378]],"o":[[-42.576,22.128],[-2.263,0.834],[-1.737,7.596],[-1.921,-0.943],[-3.959,12.293],[9.304,8.46],[18.395,-3.779],[19.706,-4.336],[28.917,-6.404],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1209.521,69.181],[-1314.728,111.674],[-1329.525,115.258],[-1357.186,119.039],[-1365.961,126.887],[-1360.432,161.506],[-1326.879,168.755],[-1262.426,149.958],[-1209.283,137.89],[-1154.705,116.767],[-1141.428,85.024]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[20.59,-10.701],[44.023,-12.552],[1.465,-6.408],[9.391,4.61],[2.091,-6.491],[-7.598,-6.908],[-11.451,2.353],[-17.418,3.833],[-27.514,6.093],[-14.634,9.513],[1.851,14.378]],"o":[[-42.576,22.128],[-2.32,0.661],[-1.737,7.596],[-1.921,-0.943],[-3.959,12.293],[9.304,8.46],[18.395,-3.779],[19.706,-4.336],[28.917,-6.404],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1209.521,69.181],[-1318.178,110.259],[-1332.698,114.068],[-1357.186,119.039],[-1367.746,126.848],[-1362.217,161.467],[-1330.108,169.399],[-1262.426,149.958],[-1209.283,137.89],[-1154.705,116.767],[-1141.428,85.024]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[20.59,-10.701],[45.535,-4.704],[2.557,-6.055],[8.446,6.173],[3.188,-6.029],[-8.877,-5.162],[-20.248,-0.936],[-17.782,1.373],[-26.496,7.667],[-14.634,9.513],[1.851,14.378]],"o":[[-42.576,22.128],[-2.399,0.248],[-3.032,7.178],[-1.728,-1.263],[-6.037,11.417],[7.963,4.631],[14.43,0.552],[17.938,-1.385],[28.451,-8.232],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1209.521,69.181],[-1315.015,103.213],[-1329.975,104.438],[-1354.955,105.075],[-1364.962,111.276],[-1358.307,144.306],[-1321.568,151.553],[-1262.426,149.958],[-1209.68,138.947],[-1154.705,116.767],[-1141.428,85.024]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[16.826,-10.701],[39.173,-20.691],[0.751,-10.313],[7.479,4.495],[2.714,-9.635],[-5.443,-8.012],[-13.163,9.37],[-15.354,6.999],[-21.959,8.8],[-14.634,9.513],[1.851,14.378]],"o":[[-34.794,22.128],[-2.064,1.09],[-0.479,6.576],[-1.753,-1.054],[-4.58,16.258],[6.779,9.978],[16.56,-11.788],[13.557,-6.18],[24.843,-9.956],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1204.35,69.181],[-1289.768,121.534],[-1303.948,127.925],[-1335.985,136.347],[-1347.558,143.409],[-1340.674,177.869],[-1292.727,182.543],[-1243.477,157.165],[-1202.78,140.815],[-1154.705,116.767],[-1141.428,85.024]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[16.826,-10.701],[41.414,-24.649],[2.648,-9.509],[9.077,1.898],[2.415,-10.618],[-5.027,-5.802],[-13.782,10.909],[-16.527,7.989],[-21.31,10.273],[-14.634,9.513],[1.851,14.378]],"o":[[-34.794,22.128],[-2.182,1.299],[-2.378,8.538],[-2.178,-0.455],[-4.075,17.917],[7.287,8.411],[17.339,-13.724],[10.773,-5.208],[22.218,-10.71],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1204.35,69.181],[-1284.446,123.726],[-1300.718,131.043],[-1333.813,143.852],[-1344.012,156.809],[-1331.292,191.125],[-1285.737,186.126],[-1236.832,156.314],[-1202.78,140.815],[-1154.705,116.767],[-1141.428,85.024]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[20.59,-10.701],[45.535,-4.704],[4.418,-8.261],[8.446,6.173],[3.188,-6.029],[-8.297,-6.051],[-17.379,4.214],[-17.723,1.991],[-26.606,7.275],[-14.634,9.513],[2.179,14.332]],"o":[[-42.576,22.128],[-2.399,0.248],[-2.557,4.782],[-1.728,-1.263],[-6.037,11.417],[13.065,9.529],[23.245,-5.637],[19.709,-2.214],[27.971,-7.649],[8.245,-5.36],[-5.403,-35.53]],"v":[[-1209.521,69.181],[-1315.015,103.213],[-1329.975,104.438],[-1354.955,105.075],[-1366.884,111.335],[-1362.406,149.207],[-1321.796,152.82],[-1262.426,149.958],[-1209.395,139.602],[-1154.705,116.767],[-1141.428,85.024]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[20.59,-10.701],[44.023,-12.552],[1.465,-6.408],[9.391,4.61],[2.091,-6.491],[-7.598,-6.908],[-11.451,2.353],[-17.418,3.833],[-27.514,6.093],[-14.634,9.513],[1.851,14.378]],"o":[[-42.576,22.128],[-2.32,0.661],[-1.737,7.596],[-1.921,-0.943],[-3.959,12.293],[9.304,8.46],[18.395,-3.779],[19.706,-4.336],[28.917,-6.404],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1209.521,69.181],[-1318.178,110.259],[-1332.698,114.068],[-1357.186,119.039],[-1367.746,126.848],[-1362.217,161.467],[-1330.108,169.399],[-1262.426,149.958],[-1209.283,137.89],[-1154.705,116.767],[-1141.428,85.024]]}],"t":435},{"s":[{"c":true,"i":[[16.826,-10.701],[39.173,-20.691],[-4.865,-5.689],[8.335,3.257],[2.714,-9.635],[-5.443,-8.012],[-13.163,9.37],[-15.21,7.307],[-21.31,10.273],[-14.634,9.513],[1.851,14.378]],"o":[[-34.794,22.128],[-2.064,1.09],[5.976,6.989],[-1.905,-0.744],[-4.58,16.258],[6.779,9.978],[16.56,-11.788],[13.43,-6.452],[22.218,-10.71],[8.245,-5.36],[-4.272,-33.187]],"v":[[-1204.35,69.181],[-1289.768,121.534],[-1303.948,127.925],[-1335.985,136.347],[-1347.558,143.409],[-1340.674,177.869],[-1292.727,182.543],[-1243.477,157.165],[-1202.78,140.815],[-1154.705,116.767],[-1141.428,85.024]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Front arm","np":3,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-1261.786,114.847]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1261.786,114.847]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Front arm","np":2,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":22,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[11.81,62.175,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[-1349.362,99.226,0],"t":15,"ti":[-1.038,5.415,0],"to":[0.165,-3.508,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[-1348.369,78.178,0],"t":30,"ti":[-0.229,-0.023,0],"to":[1.038,-5.415,0]},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1343.133,66.738,0],"t":125,"ti":[0.644,-1.93,0],"to":[0.229,0.023,0]},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[-1346.994,78.317,0],"t":141,"ti":[0,0,0],"to":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[-1346.994,78.317,0],"t":203,"ti":[0.395,-3.485,0],"to":[0.644,-1.93,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[-1343.133,66.738,0],"t":218,"ti":[0.841,-6.841,0],"to":[-0.395,3.485,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[-1349.362,99.226,0],"t":240,"ti":[-1.038,5.415,0],"to":[-0.841,6.841,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1348.178,107.783,0],"t":300,"ti":[-0.197,4.911,0],"to":[1.038,-5.415,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[-1343.133,66.738,0],"t":313,"ti":[1.038,-5.415,0],"to":[0.197,-4.911,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[-1346.994,78.317,0],"t":435,"ti":[0.395,-3.485,0],"to":[-1.038,5.415,0]},{"s":[-1349.362,99.226,0],"t":457}]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.333],"y":[0]},"s":[-18.5],"t":15},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0],"y":[0]},"s":[-11.5],"t":30},{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"s":[0.5],"t":125},{"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]},"s":[-3.5],"t":141},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.45],"y":[0]},"s":[-3.5],"t":203},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.333],"y":[0]},"s":[0.5],"t":218},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"s":[-18.5],"t":240},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"s":[-21.5],"t":300},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0],"y":[0]},"s":[0.5],"t":313},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"s":[-3.5],"t":435},{"s":[-18.5],"t":457}]},"s":{"a":0,"ix":6,"k":[175,175,100]}},"nm":"Lamp","op":480,"parent":21,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-4.885,-0.596],[-3.089,3.307],[0.074,12.581],[25.166,-0.154]],"o":[[5.528,0.674],[6.57,-7.033],[-0.054,-9.21],[-5.688,0.035]],"v":[[-27.316,94.32],[-12.684,87.406],[-2.645,60.969],[-31.245,31.035]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-4.529,-0.552],[-2.058,3.655],[0.625,9.125],[9.5,0.875]],"o":[[5.125,0.625],[3.689,-6.551],[-0.581,-8.484],[-5.252,-0.484]],"v":[[-56.05,96.067],[-43.625,90.001],[-38.625,65.875],[-53.75,36.375]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-4.529,-0.552],[-2.058,3.655],[0.625,9.125],[9.5,0.875]],"o":[[5.125,0.625],[3.689,-6.551],[-0.581,-8.484],[-5.252,-0.484]],"v":[[-56.05,96.067],[-43.625,90.001],[-38.625,65.875],[-53.75,36.375]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-3.406,-0.552],[-1.548,3.655],[0.47,9.125],[7.145,0.875]],"o":[[3.855,0.625],[2.774,-6.551],[-0.437,-8.484],[-3.95,-0.484]],"v":[[-57.077,96.22],[-47.732,90.153],[-43.972,66.027],[-55.347,36.527]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[-2.053,-0.552],[-0.933,3.655],[0.283,9.125],[4.307,0.875]],"o":[[2.323,0.625],[1.672,-6.551],[-0.263,-8.484],[-2.381,-0.484]],"v":[[-57.82,96.22],[-52.188,90.153],[-49.921,66.027],[-56.778,36.527]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-4.529,-0.552],[-2.058,3.655],[0.625,9.125],[9.5,0.875]],"o":[[5.125,0.625],[3.689,-6.551],[-0.581,-8.484],[-5.252,-0.484]],"v":[[-56.05,96.067],[-43.625,90.001],[-38.625,65.875],[-53.75,36.375]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-4.885,-0.596],[-3.089,3.307],[0.074,12.581],[25.166,-0.154]],"o":[[5.528,0.674],[6.57,-7.033],[-0.054,-9.21],[-5.688,0.035]],"v":[[-27.316,94.32],[-12.684,87.406],[-2.645,60.969],[-31.245,31.035]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-5.293,-0.596],[-3.348,3.307],[0.08,12.581],[27.27,-0.154]],"o":[[5.99,0.674],[7.12,-7.033],[-0.059,-9.21],[-6.164,0.035]],"v":[[-20.496,94.594],[-4.641,87.681],[6.239,61.243],[-24.753,31.309]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-4.529,-0.552],[-2.058,3.655],[0.625,9.125],[9.5,0.875]],"o":[[5.125,0.625],[3.689,-6.551],[-0.581,-8.484],[-5.252,-0.484]],"v":[[-56.05,96.067],[-43.625,90.001],[-38.625,65.875],[-53.75,36.375]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-2.053,-0.552],[-0.933,3.655],[0.283,9.125],[4.307,0.875]],"o":[[2.323,0.625],[1.672,-6.551],[-0.263,-8.484],[-2.381,-0.484]],"v":[[-57.82,96.22],[-52.188,90.153],[-49.921,66.027],[-56.778,36.527]]}],"t":435},{"s":[{"c":false,"i":[[-4.885,-0.596],[-3.089,3.307],[0.074,12.581],[25.166,-0.154]],"o":[[5.528,0.674],[6.57,-7.033],[-0.054,-9.21],[-5.688,0.035]],"v":[[-27.316,94.32],[-12.684,87.406],[-2.645,60.969],[-31.245,31.035]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[4.05,-0.181]],"o":[[0,0],[-5.182,0.231]],"v":[[45.461,47.915],[25.487,48.661]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.861,49.841],[0.685,49.603]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.861,49.841],[0.685,49.603]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.861,49.841],[-5.242,49.842]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.861,49.841],[-10.005,49.978]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.861,49.841],[0.685,49.603]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[3.891,-0.544]],"o":[[0,0],[-5.137,0.719]],"v":[[45.461,47.915],[25.487,48.661]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[3.725,-0.619]],"o":[[0,0],[-5.117,0.85]],"v":[[45.461,47.915],[24.165,50.216]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.861,49.841],[0.685,49.603]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[7.27,0.388]],"o":[[0,0],[-4.802,-0.256]],"v":[[32.937,49.909],[-10.005,49.978]]}],"t":435},{"s":[{"c":false,"i":[[0,0],[3.959,-0.261]],"o":[[0,0],[-5.176,0.341]],"v":[[45.461,47.915],[25.487,48.661]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[11.846,-0.002],[4.319,-1.638],[2.854,-9.341],[-4.505,-6.626],[-5.358,-1.71],[-5.393,0],[-3.702,2.28],[-1.374,7.972],[5.345,8.238]],"o":[[-9.723,0.001],[-10.375,3.934],[-3.231,10.575],[3.914,5.757],[5.675,1.811],[5.393,0],[7.73,-4.761],[1.288,-7.471],[-2.985,-4.601]],"v":[[-17.068,30.191],[-32.229,30.854],[-51.473,52.735],[-50.392,81.467],[-36.949,93.25],[-21.832,95.641],[-6.231,92.738],[8.291,70.698],[3.687,41]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-4.968,-1.585],[-5,0],[-2.63,3.055],[0,7.5],[2.285,5.585]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.261,1.679],[5,0],[3.875,-4.5],[0,-7.5],[-2.25,-5.5]],"v":[[-36.5,36],[-56,36.5],[-68,57],[-66.5,82.5],[-58.548,95.44],[-37.25,95.5],[-25.75,90.375],[-18.375,69.875],[-20.875,47]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-4.968,-1.585],[-5,0],[-2.63,3.055],[0,7.5],[2.285,5.585]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.261,1.679],[5,0],[3.875,-4.5],[0,-7.5],[-2.25,-5.5]],"v":[[-36.5,36],[-56,36.5],[-68,57],[-66.5,82.5],[-58.548,95.44],[-37.25,95.5],[-25.75,90.375],[-18.375,69.875],[-20.875,47]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[9,-0.5],[3.761,-0.5],[0.752,-9],[-1.88,-7],[-3.736,-1.585],[-5,0],[-2.63,3.055],[0,7.5],[2.285,5.585]],"o":[[-9,0.5],[-3.761,0.5],[-0.752,9],[1.02,3.796],[3.957,1.679],[5,0],[3.875,-4.5],[0,-7.5],[-2.25,-5.5]],"v":[[-36.5,36],[-57.039,36.652],[-66.065,57.152],[-64.936,82.652],[-58.955,95.592],[-40.502,94.999],[-29.002,89.874],[-21.627,69.374],[-24.127,46.499]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[9,-0.5],[2.267,-0.5],[0.453,-9],[-1.133,-7],[-2.252,-1.585],[-5,0],[-1.895,3.055],[0,7.5],[1.646,5.585]],"o":[[-9,0.5],[-2.267,0.5],[-0.453,9],[0.615,3.796],[2.385,1.679],[5,0],[2.792,-4.5],[0,-7.5],[-1.621,-5.5]],"v":[[-36.5,36],[-57.798,36.652],[-63.238,57.152],[-62.558,82.652],[-58.952,95.592],[-40.502,94.999],[-28.991,89.697],[-23.676,69.197],[-25.478,46.322]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-4.968,-1.585],[-5,0],[-2.63,3.055],[0,7.5],[2.285,5.585]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.261,1.679],[5,0],[3.875,-4.5],[0,-7.5],[-2.25,-5.5]],"v":[[-36.5,36],[-56,36.5],[-68,57],[-66.5,82.5],[-58.548,95.44],[-37.25,95.5],[-25.75,90.375],[-18.375,69.875],[-20.875,47]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[11.846,-0.002],[4.319,-1.638],[2.854,-9.341],[-4.505,-6.626],[-5.358,-1.71],[-5.393,0],[-3.702,2.28],[-1.374,7.972],[5.345,8.238]],"o":[[-9.723,0.001],[-10.375,3.934],[-3.231,10.575],[3.914,5.757],[5.675,1.811],[5.393,0],[7.73,-4.761],[1.288,-7.471],[-2.985,-4.601]],"v":[[-17.068,30.191],[-32.229,30.854],[-51.473,52.735],[-50.392,81.467],[-36.949,93.25],[-21.832,95.641],[-6.231,92.738],[8.291,70.698],[3.687,41]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.836,-0.002],[4.809,-1.207],[2.9,-9.453],[-4.388,-6.962],[-5.806,-1.71],[-5.844,0],[-4.827,1.754],[-1.374,7.972],[5.345,8.238]],"o":[[-10.536,0.001],[-12.583,3.158],[-3.267,10.649],[4.535,7.195],[6.15,1.811],[5.844,0],[9.056,-3.291],[1.288,-7.471],[-2.985,-4.601]],"v":[[-13.477,30.42],[-25.82,31.128],[-47.221,51.953],[-46.1,81.5],[-30.934,93.524],[-14.553,95.915],[-2.815,93.923],[12.772,70.972],[8.168,41.274]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-4.968,-1.585],[-5,0],[-2.63,3.055],[0,7.5],[2.285,5.585]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.261,1.679],[5,0],[3.875,-4.5],[0,-7.5],[-2.25,-5.5]],"v":[[-36.5,36],[-56,36.5],[-68,57],[-66.5,82.5],[-58.548,95.44],[-37.25,95.5],[-25.75,90.375],[-18.375,69.875],[-20.875,47]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[9,-0.5],[2.267,-0.5],[0.453,-9],[-1.133,-7],[-2.252,-1.585],[-5,0],[-1.895,3.055],[0,7.5],[1.646,5.585]],"o":[[-9,0.5],[-2.267,0.5],[-0.453,9],[0.615,3.796],[2.385,1.679],[5,0],[2.792,-4.5],[0,-7.5],[-1.621,-5.5]],"v":[[-36.5,36],[-57.798,36.652],[-63.238,57.152],[-62.558,82.652],[-58.952,95.592],[-40.502,94.999],[-28.991,89.697],[-23.676,69.197],[-25.478,46.322]]}],"t":435},{"s":[{"c":true,"i":[[11.846,-0.002],[4.319,-1.638],[2.854,-9.341],[-4.505,-6.626],[-5.358,-1.71],[-5.393,0],[-3.702,2.28],[-1.374,7.972],[5.345,8.238]],"o":[[-9.723,0.001],[-10.375,3.934],[-3.231,10.575],[3.914,5.757],[5.675,1.811],[5.393,0],[7.73,-4.761],[1.288,-7.471],[-2.985,-4.601]],"v":[[-17.068,30.191],[-32.229,30.854],[-51.473,52.735],[-50.392,81.467],[-36.949,93.25],[-21.832,95.641],[-6.231,92.738],[8.291,70.698],[3.687,41]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-4.846,-2.617],[-3.891,-1.518],[-3.333,-0.367],[-3.771,-2.148],[-0.328,-4.014],[-0.404,-2.833],[3.583,-0.665],[3.37,-0.72],[2.352,-0.301],[1.609,-0.948],[2.479,-2.159]],"o":[[5.012,2.706],[5.518,-0.075],[3.542,0.39],[1.799,1.025],[0.335,4.094],[0.404,2.833],[-3.583,0.665],[-3.37,0.72],[-2.352,0.301],[-1.609,0.948],[-1.643,1.431]],"v":[[-3.895,33.546],[8.078,40.249],[35.139,42.953],[45.464,46.988],[48.077,53.568],[47.625,70.284],[43.502,78.313],[26.242,79.989],[11.864,81.937],[6.085,83.155],[-1.939,89.439]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-4.888,-1.475],[-3.863,0.266],[-3.107,-0.101],[-4.051,-1.688],[-0.161,-2.484],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.741,-1.025]],"o":[[4.888,1.475],[3.863,-0.266],[2.311,0.075],[1.864,0.777],[0.209,3.22],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.741,1.025]],"v":[[-24.731,40.199],[-7,44.996],[23.291,45.241],[32.215,48.62],[33.899,55.573],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-27.378,92.003]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-4.888,-1.475],[-3.863,0.266],[-3.098,-0.253],[-3.643,-2.095],[-0.199,-3.761],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.741,-1.025]],"o":[[4.888,1.475],[3.863,-0.266],[3.853,0.315],[1.743,1.003],[0.17,3.222],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.741,1.025]],"v":[[-24.731,40.199],[-7,44.996],[23.291,45.241],[31.593,48.283],[33.899,55.573],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-27.378,92.003]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-4.888,-1.475],[-3.863,0.266],[-3.073,0.47],[-3.069,-2.871],[-0.275,-2.552],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.741,-1.025]],"o":[[4.888,1.475],[3.863,-0.266],[3.073,-0.47],[1.061,0.993],[0.346,3.208],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.741,1.025]],"v":[[-27.143,39.914],[-7,44.996],[25.716,46.127],[32.864,48.981],[33.899,55.573],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-30.63,91.502]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[-3.523,-1.475],[-3.863,0.266],[-3.073,0.47],[-0.546,-2.631],[-0.142,-2.81],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.254,-1.025]],"o":[[3.523,1.475],[3.863,-0.266],[3.073,-0.47],[0.854,4.115],[0.163,3.223],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.254,1.025]],"v":[[-28.256,39.521],[-7.249,45.591],[27.348,46.741],[32.864,48.981],[33.899,55.573],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-30.164,91.325]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-4.888,-1.475],[-3.863,0.266],[-3.108,-0.069],[-3.381,-1.903],[-0.24,-2.923],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.741,-1.025]],"o":[[4.888,1.475],[3.863,-0.266],[3.782,0.083],[3.662,2.061],[0.264,3.216],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.741,1.025]],"v":[[-24.731,40.199],[-7,44.996],[23.291,45.241],[31.073,47.41],[34.103,55.566],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-27.378,92.003]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-5.273,-1.591],[-3.891,-1.518],[-3.333,-0.367],[-3.771,-2.148],[0.04,-4.027],[0.054,-2.932],[3.583,-0.665],[3.37,-0.72],[2.352,-0.301],[1.609,-0.948],[2.479,-2.159]],"o":[[5.273,1.591],[5.518,-0.075],[3.542,0.39],[1.799,1.025],[-0.04,4.032],[-0.053,2.861],[-3.583,0.665],[-3.37,0.72],[-2.352,0.301],[-1.609,0.948],[-1.643,1.431]],"v":[[-4.211,34.08],[8.078,40.249],[35.139,42.953],[45.464,46.988],[47.341,53.319],[47.625,70.284],[43.502,78.313],[26.242,79.989],[11.864,81.937],[6.085,83.155],[-1.939,89.439]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-5.24,-2.778],[-3.891,-1.518],[-3.349,-0.154],[-3.771,-2.148],[0.105,-4.026],[0.058,-3.165],[3.583,-0.665],[3.37,-0.72],[2.352,-0.301],[1.609,-0.948],[2.479,-2.159]],"o":[[5.333,2.827],[5.518,-0.075],[3.559,0.164],[1.799,1.025],[-0.097,3.726],[-0.052,2.861],[-3.583,0.665],[-3.37,0.72],[-2.352,0.301],[-1.609,0.948],[-1.643,1.431]],"v":[[1.607,34.283],[12.559,40.523],[33.784,41.83],[45.464,46.988],[48.077,53.568],[47.625,70.284],[43.502,78.313],[26.242,79.989],[17.006,81.433],[9.016,85.379],[0.584,91.638]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[-4.888,-1.475],[-3.863,0.266],[-3.105,-0.15],[-3.175,-1.433],[-0.361,-3.15],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.741,-1.025]],"o":[[4.888,1.475],[3.863,-0.266],[3.659,0.177],[3.83,1.729],[0.367,3.206],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.741,1.025]],"v":[[-24.731,40.199],[-7,44.996],[23.291,45.241],[31.049,47.668],[34.066,55.946],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-27.378,92.003]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-3.523,-1.475],[-3.863,0.266],[-3.073,0.47],[-0.546,-2.631],[-0.142,-2.81],[-0.375,-2.626],[3.321,-0.617],[3.124,-0.668],[2.18,-0.279],[1.492,-0.879],[1.254,-1.025]],"o":[[3.523,1.475],[3.863,-0.266],[3.073,-0.47],[0.854,4.115],[0.163,3.223],[0.375,2.626],[-3.321,0.617],[-3.124,0.668],[-2.18,0.279],[-1.492,0.879],[-1.254,1.025]],"v":[[-28.256,39.521],[-7.249,45.591],[27.348,46.741],[32.864,48.981],[33.899,55.573],[34.867,70.579],[31.045,78.022],[15.044,79.576],[-1.454,81.422],[-9.684,83.088],[-30.164,91.325]]}],"t":435},{"s":[{"c":false,"i":[[-4.604,-3.023],[-3.891,-1.518],[-3.333,-0.367],[-3.771,-2.148],[-0.766,-3.954],[0.048,-2.697],[3.583,-0.665],[3.37,-0.72],[2.352,-0.301],[1.609,-0.948],[2.479,-2.159]],"o":[[4.693,3.081],[5.518,-0.075],[3.542,0.39],[1.799,1.025],[0.662,3.417],[-0.051,2.861],[-3.583,0.665],[-3.37,0.72],[-2.352,0.301],[-1.609,0.948],[-1.643,1.431]],"v":[[-3.983,33.503],[8.078,40.249],[35.139,42.953],[45.464,46.988],[48.077,53.568],[47.625,70.284],[43.502,78.313],[26.242,79.989],[11.864,81.937],[6.085,83.155],[-1.939,89.439]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.84705889225,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":2}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"outlines","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.115,-0.447],[2.367,-3.649],[0.388,-2.953],[-0.944,-2.899],[-3.236,-2.427],[-3.489,1.131],[3.458,2.084],[0.978,6.537],[-2.745,4.933],[-8.494,-1.955]],"o":[[-4.787,1.011],[-2.639,4.067],[-1.663,12.664],[0.944,2.899],[3.066,2.3],[3.403,-1.103],[-3.455,-2.082],[-1.079,-7.214],[1.892,-3.399],[-1.955,-3.775]],"v":[[-34.402,32.316],[-46.215,42.003],[-52.635,58.015],[-50.991,81.296],[-43.118,90.023],[-25.462,93.338],[-37.357,85.791],[-48.155,72.985],[-45.258,48.946],[-21.117,35.368]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.961,-0.414],[1.125,-2.625],[0.25,-2.75],[-0.875,-2.688],[-3,-2.25],[-2,2.75],[3.688,0.625],[0.906,6.06],[-0.562,3.562],[-7.875,-1.812]],"o":[[-4.438,0.938],[-1.125,2.625],[-0.25,2.75],[0.875,2.688],[2.843,2.132],[2,-2.75],[-3.688,-0.625],[-1,-6.688],[0.562,-3.562],[-1.812,-3.5]],"v":[[-55.688,37.812],[-64.312,46.75],[-67.688,60.562],[-65.375,83.188],[-60.5,90.875],[-47.438,90.375],[-54.125,88.688],[-62.25,75.188],[-63.125,52],[-49.562,41.812]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.961,-0.414],[1.125,-2.625],[0.25,-2.75],[-0.875,-2.688],[-3,-2.25],[-2,2.75],[3.688,0.625],[0.906,6.06],[-0.562,3.562],[-7.875,-1.812]],"o":[[-4.438,0.938],[-1.125,2.625],[-0.25,2.75],[0.875,2.688],[2.843,2.132],[2,-2.75],[-3.688,-0.625],[-1,-6.688],[0.562,-3.562],[-1.812,-3.5]],"v":[[-55.688,37.812],[-64.312,46.75],[-67.688,60.562],[-65.375,83.188],[-60.5,90.875],[-47.438,90.375],[-54.125,88.688],[-62.25,75.188],[-63.125,52],[-49.562,41.812]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.475,-0.414],[0.846,-2.625],[0.188,-2.75],[-0.658,-2.688],[-2.256,-2.25],[-1.504,2.75],[2.773,0.625],[0.682,6.06],[-0.423,3.562],[-5.923,-1.812]],"o":[[-3.337,0.938],[-0.846,2.625],[-0.188,2.75],[0.658,2.688],[2.138,2.132],[1.504,-2.75],[-2.773,-0.625],[-0.752,-6.688],[0.423,-3.562],[-1.363,-3.5]],"v":[[-56.804,37.965],[-63.291,46.902],[-65.83,60.715],[-64.09,83.34],[-60.424,91.027],[-50.599,90.527],[-55.629,88.84],[-61.74,75.34],[-62.398,52.152],[-52.198,41.965]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[0.889,-0.414],[0.51,-2.625],[0.113,-2.75],[-0.397,-2.688],[-1.36,-2.25],[-0.907,2.75],[1.672,0.625],[0.411,6.06],[-0.255,3.562],[-3.57,-1.812]],"o":[[-2.012,0.938],[-0.51,2.625],[-0.113,2.75],[0.397,2.688],[1.289,2.132],[0.907,-2.75],[-1.672,-0.625],[-0.453,-6.688],[0.255,-3.562],[-0.822,-3.5]],"v":[[-57.656,37.965],[-61.566,46.902],[-63.096,60.715],[-62.048,83.34],[-59.838,91.027],[-53.916,90.527],[-56.948,88.84],[-60.631,75.34],[-61.028,52.152],[-54.879,41.965]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[1.961,-0.414],[1.125,-2.625],[0.25,-2.75],[-0.875,-2.688],[-3,-2.25],[-2,2.75],[3.688,0.625],[0.906,6.06],[-0.562,3.562],[-7.875,-1.812]],"o":[[-4.438,0.938],[-1.125,2.625],[-0.25,2.75],[0.875,2.688],[2.843,2.132],[2,-2.75],[-3.688,-0.625],[-1,-6.688],[0.562,-3.562],[-1.812,-3.5]],"v":[[-55.688,37.812],[-64.312,46.75],[-67.688,60.562],[-65.375,83.188],[-60.5,90.875],[-47.438,90.375],[-54.125,88.688],[-62.25,75.188],[-63.125,52],[-49.562,41.812]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.115,-0.447],[2.367,-3.649],[0.388,-2.953],[-0.944,-2.899],[-3.236,-2.427],[-3.489,1.131],[3.458,2.084],[0.978,6.537],[-2.745,4.933],[-8.494,-1.955]],"o":[[-4.787,1.011],[-2.639,4.067],[-1.663,12.664],[0.944,2.899],[3.066,2.3],[3.403,-1.103],[-3.455,-2.082],[-1.079,-7.214],[1.892,-3.399],[-1.955,-3.775]],"v":[[-34.402,32.316],[-46.215,42.003],[-52.635,58.015],[-50.991,81.296],[-43.118,90.023],[-25.462,93.338],[-37.357,85.791],[-48.155,72.985],[-45.258,48.946],[-21.117,35.368]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.292,-0.447],[2.565,-3.649],[0.42,-2.953],[-1.023,-2.899],[-3.507,-2.427],[-2.643,2.931],[3.748,2.084],[1.059,6.537],[-10.413,9.29],[-1.412,2.937]],"o":[[-5.187,1.011],[-2.86,4.067],[-1.802,12.664],[1.023,2.899],[3.322,2.3],[2.995,-3.322],[-3.744,-2.082],[-1.169,-7.214],[2.962,-2.643],[-2.119,-3.775]],"v":[[-28.174,32.59],[-41.752,41.616],[-48.276,57.245],[-46.15,81.57],[-37.619,90.297],[-18.486,93.612],[-31.376,86.065],[-43.077,73.259],[-32.983,42.489],[-13.779,35.642]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.961,-0.414],[1.125,-2.625],[0.25,-2.75],[-0.875,-2.688],[-3,-2.25],[-2,2.75],[3.688,0.625],[0.906,6.06],[-0.562,3.562],[-7.875,-1.812]],"o":[[-4.438,0.938],[-1.125,2.625],[-0.25,2.75],[0.875,2.688],[2.843,2.132],[2,-2.75],[-3.688,-0.625],[-1,-6.688],[0.562,-3.562],[-1.812,-3.5]],"v":[[-55.688,37.812],[-64.312,46.75],[-67.688,60.562],[-65.375,83.188],[-60.5,90.875],[-47.438,90.375],[-54.125,88.688],[-62.25,75.188],[-63.125,52],[-49.562,41.812]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.889,-0.414],[0.51,-2.625],[0.113,-2.75],[-0.397,-2.688],[-1.36,-2.25],[-0.907,2.75],[1.672,0.625],[0.411,6.06],[-0.255,3.562],[-3.57,-1.812]],"o":[[-2.012,0.938],[-0.51,2.625],[-0.113,2.75],[0.397,2.688],[1.289,2.132],[0.907,-2.75],[-1.672,-0.625],[-0.453,-6.688],[0.255,-3.562],[-0.822,-3.5]],"v":[[-57.656,37.965],[-61.566,46.902],[-63.096,60.715],[-62.048,83.34],[-59.838,91.027],[-53.916,90.527],[-56.948,88.84],[-60.631,75.34],[-61.028,52.152],[-54.879,41.965]]}],"t":435},{"s":[{"c":true,"i":[[2.115,-0.447],[2.367,-3.649],[0.388,-2.953],[-0.944,-2.899],[-3.236,-2.427],[-3.489,1.131],[3.458,2.084],[0.978,6.537],[-2.745,4.933],[-8.494,-1.955]],"o":[[-4.787,1.011],[-2.639,4.067],[-1.663,12.664],[0.944,2.899],[3.066,2.3],[3.403,-1.103],[-3.455,-2.082],[-1.079,-7.214],[1.892,-3.399],[-1.955,-3.775]],"v":[[-34.402,32.316],[-46.215,42.003],[-52.635,58.015],[-50.991,81.296],[-43.118,90.023],[-25.462,93.338],[-37.357,85.791],[-48.155,72.985],[-45.258,48.946],[-21.117,35.368]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.427450984716,1,0.811764717102,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"front highlight","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[3.094,-1.409],[0.859,0.04],[6.029,-6.524],[10.144,-5.113],[-1.496,0.289],[-1.775,1.334],[-2.841,6.865],[0.045,2.036]],"o":[[-2.816,1.282],[-0.859,-0.04],[-2.14,2.316],[-1.439,0.725],[3.775,-0.729],[3.26,-2.45],[2.559,-6.185],[-0.06,-2.664]],"v":[[2.934,59.706],[-1.98,61.787],[-8.687,82.136],[-23.157,94.439],[-12.99,94.374],[-3.413,91.073],[5.981,78.08],[8.616,56.62]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.861,-2.232],[0.859,0.04],[0.861,-2.665],[4.778,-6.256],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-3.97,1.823],[-0.859,-0.04],[-0.969,3],[-0.978,1.28],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[-29.287,75.336],[-38.665,78.203],[-40.93,84.843],[-47.07,94.576],[-39.623,95.317],[-30.118,94.176],[-20.725,81.184],[-18.12,67.701]]}],"t":30},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.861,-2.232],[0.859,0.04],[0.861,-2.665],[4.778,-6.256],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-3.97,1.823],[-0.859,-0.04],[-0.969,3],[-0.978,1.28],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[-29.287,75.336],[-38.665,78.203],[-40.93,84.843],[-47.07,94.576],[-39.623,95.317],[-30.118,94.176],[-20.725,81.184],[-18.12,67.701]]}],"t":125},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.682,-3.394],[0.859,0.04],[0.861,-2.665],[4.778,-6.256],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-3.895,1.978],[-0.859,-0.04],[-0.969,3],[-0.978,1.28],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[-33.18,73.844],[-43.749,77.558],[-45.368,84.098],[-50.831,94.452],[-43.384,95.192],[-33.879,94.052],[-24.486,81.059],[-21.881,67.576]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.441,-4.554],[0.859,0.04],[0.861,-2.665],[2.81,-7.701],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.569,3.87]],"o":[[-4.91,2.649],[-0.859,-0.04],[-0.969,3],[-0.552,1.513],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.388,-2.636]],"v":[[-36.928,63.227],[-49.537,66.775],[-50.424,82.509],[-53.591,94.067],[-46.144,94.807],[-33.19,93.32],[-26.288,82.208],[-24.336,56.405]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.861,-2.232],[0.859,0.04],[0.861,-2.665],[4.778,-6.256],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-3.97,1.823],[-0.859,-0.04],[-0.969,3],[-0.978,1.28],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[-29.287,75.336],[-38.665,78.203],[-40.93,84.843],[-47.07,94.576],[-39.623,95.317],[-30.118,94.176],[-20.725,81.184],[-18.12,67.701]]}],"t":218},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.199,-2.666],[2.895,-0.803],[2.381,-3.744],[11.287,-6.94],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-3.688,2.341],[-0.829,0.23],[-1.692,2.661],[-1.372,0.844],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[4.073,64.829],[-2.971,68.741],[-7.826,80.19],[-22.308,94.47],[-14.861,95.21],[-7.541,93.628],[4.037,81.077],[8.957,61.886]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.181,-1.208],[1.272,-0.88],[2.381,-3.744],[13.48,-3.698],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-0.746,0.763],[-0.707,0.489],[-1.692,2.661],[-1.554,0.426],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[10.442,60.317],[6.43,63.752],[3.238,76.829],[-17.485,94.506],[-10.039,95.246],[-2.718,93.664],[10.502,78.425],[13.285,57.244]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.861,-2.232],[0.859,0.04],[0.861,-2.665],[4.778,-6.256],[-1.517,-0.137],[-2.18,0.424],[-2.841,6.865],[0.045,2.036]],"o":[[-3.97,1.823],[-0.859,-0.04],[-0.969,3],[-0.978,1.28],[1.517,0.137],[1.147,-0.223],[2.559,-6.185],[-0.06,-2.664]],"v":[[-29.287,75.336],[-38.665,78.203],[-40.93,84.843],[-47.07,94.576],[-39.623,95.317],[-30.118,94.176],[-20.725,81.184],[-18.12,67.701]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.792,-4.426],[0.926,0.043],[0.263,-3.006],[2.773,-6.311],[-1.635,-0.147],[-3.898,2.138],[-1.624,8.182],[0.049,2.194]],"o":[[-5.785,2.912],[-0.926,-0.043],[-0.411,4.699],[-0.698,1.589],[1.635,0.147],[1.104,-0.605],[1.404,-7.075],[-0.064,-2.871]],"v":[[-38.929,60.022],[-49.611,63.653],[-50.132,78.311],[-53.393,94.168],[-50.177,95.438],[-32.426,92.828],[-24.913,77.462],[-24.612,52.603]]}],"t":435},{"s":[{"c":true,"i":[[3.094,-1.409],[0.859,0.04],[6.029,-6.524],[10.144,-5.113],[-1.496,0.289],[-1.775,1.334],[-2.841,6.865],[0.045,2.036]],"o":[[-2.816,1.282],[-0.859,-0.04],[-2.14,2.316],[-1.439,0.725],[3.775,-0.729],[3.26,-2.45],[2.559,-6.185],[-0.06,-2.664]],"v":[[2.934,59.706],[-1.98,61.787],[-8.687,82.136],[-23.157,94.439],[-12.99,94.374],[-3.413,91.073],[5.981,78.08],[8.616,56.62]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.852,0.058],[2.356,-2.356],[3.842,0.067],[-0.055,-1.574],[0.482,-3.395],[4.928,-5.647],[-3.777,-0.147],[-5.427,0.458],[-0.145,3.111],[0.239,4.634]],"o":[[-2.852,-0.058],[-3.813,3.813],[-3.369,-0.059],[0.075,2.138],[-0.482,3.395],[3.553,-1.255],[3.777,0.147],[5.427,-0.458],[0.218,-4.677],[-0.148,-2.874]],"v":[[32.12,42.47],[22.358,48.175],[11.006,53.551],[9.257,57.052],[9.076,62.499],[2.655,83.919],[16.451,81.281],[43.575,78.771],[47.228,62.227],[47.121,49.643]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.644,0.053],[3.709,-0.451],[2.606,-1.723],[1.983,0.04],[0.447,-3.147],[-3.424,2.328],[-3.502,-0.137],[-5.031,0.424],[-0.134,2.885],[0.221,4.296]],"o":[[-2.644,-0.053],[-3.709,0.451],[-2.606,1.723],[-1.983,-0.04],[-0.447,3.147],[9.065,-6.163],[3.502,0.137],[5.031,-0.424],[0.202,-4.335],[-0.137,-2.664]],"v":[[32.812,50.181],[7.618,50.526],[-3.664,57.333],[-16.828,61.933],[-17.664,68.688],[-24.151,91.008],[-2.193,81.668],[31.113,78.447],[34.499,63.11],[34.324,54.255]]}],"t":30},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.644,0.053],[3.709,-0.451],[2.606,-1.723],[1.983,0.04],[0.447,-3.147],[-3.424,2.328],[-3.502,-0.137],[-5.031,0.424],[-0.134,2.885],[0.221,4.296]],"o":[[-2.644,-0.053],[-3.709,0.451],[-2.606,1.723],[-1.983,-0.04],[-0.447,3.147],[9.065,-6.163],[3.502,0.137],[5.031,-0.424],[0.202,-4.335],[-0.137,-2.664]],"v":[[32.812,50.181],[7.618,50.526],[-3.664,57.333],[-16.828,61.933],[-17.664,68.688],[-24.151,91.008],[-2.193,81.668],[31.113,78.447],[34.499,63.11],[34.324,54.255]]}],"t":125},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.644,0.053],[3.709,-0.451],[5.22,-2.696],[1.983,0.04],[0.447,-3.147],[-3.855,1.51],[-3.502,-0.137],[-5.031,0.424],[-0.134,2.885],[0.221,4.296]],"o":[[-2.644,-0.053],[-3.709,0.451],[-2.776,1.434],[-1.983,-0.04],[-0.447,3.147],[11.214,-4.393],[3.502,0.137],[5.031,-0.424],[0.202,-4.335],[-0.137,-2.664]],"v":[[31,50.043],[7.618,50.526],[-5.263,57.114],[-20.796,62.034],[-21.337,68.921],[-27.016,89.905],[-2.193,81.668],[31.113,78.447],[34.499,63.11],[33.541,54.505]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.644,0.053],[3.709,-0.451],[4.912,-0.17],[2.598,-0.547],[0.447,-3.147],[2.934,-3.18],[-3.502,-0.137],[-5.031,0.424],[-0.134,2.885],[0.221,4.296]],"o":[[-2.644,-0.053],[-3.709,0.451],[-3.121,0.108],[-1.94,0.409],[-0.447,3.147],[12.306,-4.815],[3.502,0.137],[5.031,-0.424],[0.202,-4.335],[-0.137,-2.664]],"v":[[32.679,50.171],[7.618,50.526],[-12.052,50.648],[-23.441,51.543],[-23.577,68.604],[-29.785,90.885],[-2.193,81.668],[31.113,78.447],[34.499,63.11],[34.267,54.273]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.644,0.053],[3.709,-0.451],[2.606,-1.723],[1.983,0.04],[0.447,-3.147],[-3.424,2.328],[-3.502,-0.137],[-5.031,0.424],[-0.134,2.885],[0.221,4.296]],"o":[[-2.644,-0.053],[-3.709,0.451],[-2.606,1.723],[-1.983,-0.04],[-0.447,3.147],[9.065,-6.163],[3.502,0.137],[5.031,-0.424],[0.202,-4.335],[-0.137,-2.664]],"v":[[32.812,50.181],[7.618,50.526],[-3.664,57.333],[-16.828,61.933],[-17.664,68.688],[-24.151,91.008],[-2.193,81.668],[31.113,78.447],[34.499,63.11],[34.324,54.255]]}],"t":218},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.916,0.629],[2.994,-1.991],[4.583,-2.398],[1.512,0.04],[0.341,-3.147],[4.318,-6.469],[-2.671,-0.137],[-3.837,0.424],[-0.102,2.885],[-0.135,4.297]],"o":[[-4.38,-1.437],[-2.79,1.856],[-2.33,1.219],[-0.022,0.706],[-0.341,3.147],[7.867,-4.292],[2.671,0.137],[3.837,-0.424],[0.154,-4.335],[0.239,-7.603]],"v":[[39.352,43.894],[26.343,48.971],[17.821,54.236],[9.048,58.02],[8.174,68.274],[2.521,85.531],[19.974,81.253],[45.375,78.032],[47.959,62.695],[47.825,53.84]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.916,0.629],[3.007,-2.581],[4.671,-2.699],[1.763,-0.801],[0.341,-3.147],[6.499,-8.079],[-2.671,-0.137],[-3.837,0.424],[-0.102,2.885],[-0.135,4.297]],"o":[[-4.38,-1.437],[-2.543,2.182],[-1.754,1.014],[-0.022,0.706],[-0.341,3.147],[7.867,-4.292],[2.671,0.137],[3.837,-0.424],[0.154,-4.335],[0.239,-7.603]],"v":[[34.76,41.83],[24.559,46.149],[18.068,50.721],[12.742,52.638],[13.224,63.612],[6.207,86.978],[19.974,81.253],[45.375,78.032],[47.959,62.695],[47.825,53.84]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.644,0.053],[3.709,-0.451],[2.606,-1.723],[1.983,0.04],[0.447,-3.147],[-3.424,2.328],[-3.502,-0.137],[-5.031,0.424],[-0.134,2.885],[0.221,4.296]],"o":[[-2.644,-0.053],[-3.709,0.451],[-2.606,1.723],[-1.983,-0.04],[-0.447,3.147],[9.065,-6.163],[3.502,0.137],[5.031,-0.424],[0.202,-4.335],[-0.137,-2.664]],"v":[[32.812,50.181],[7.618,50.526],[-3.664,57.333],[-16.828,61.933],[-17.664,68.688],[-24.151,91.008],[-2.193,81.668],[31.113,78.447],[34.499,63.11],[34.324,54.255]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.849,0.058],[4.465,0.468],[4.736,-0.186],[2.137,0.043],[-1.173,-5.898],[7.484,-11.108],[-4.003,0.771],[-5.422,0.457],[-0.145,3.108],[0.239,4.629]],"o":[[-2.849,-0.058],[-4.005,-0.42],[-3.364,0.132],[-2.137,-0.043],[1.19,5.983],[13.127,-6.091],[3.708,-0.714],[5.422,-0.457],[0.218,-4.672],[-0.148,-2.871]],"v":[[32.196,50.086],[5.453,50],[-7.071,50.002],[-15.464,50.641],[-24.998,51.095],[-30.622,91.854],[-5.289,81.908],[31.161,78.114],[34.014,64.019],[33.826,54.476]]}],"t":435},{"s":[{"c":true,"i":[[2.852,0.058],[2.356,-2.356],[3.842,0.067],[-0.055,-1.574],[0.482,-3.395],[4.928,-5.647],[-3.777,-0.147],[-5.427,0.458],[-0.145,3.111],[0.239,4.634]],"o":[[-2.852,-0.058],[-3.813,3.813],[-3.369,-0.059],[0.075,2.138],[-0.482,3.395],[3.553,-1.255],[3.777,0.147],[5.427,-0.458],[0.218,-4.677],[-0.148,-2.874]],"v":[[32.12,42.47],[22.358,48.175],[11.006,53.551],[9.257,57.052],[9.076,62.499],[2.655,83.919],[16.451,81.281],[43.575,78.771],[47.228,62.227],[47.121,49.643]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.001,-0.486],[3.789,-0.337],[0.911,-4.371],[-3.057,-2.224],[-5.076,4.217],[-0.359,5.683],[-0.665,4.555]],"o":[[-4.001,0.486],[-2.131,0.19],[-1.132,5.428],[4.63,3.368],[4.189,-3.481],[0.295,-4.672],[0.416,-2.847]],"v":[[23.414,80.937],[13.376,81.559],[12.137,96.684],[12.749,118.214],[26.826,118.513],[30.148,95.759],[31.955,81.245]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.845,-4.053],[-3.35,-1.398],[-5.173,1.609],[1.96,4.302],[-0.617,4.223]],"o":[[-3.709,0.451],[-1.827,0.771],[-1.049,5.032],[3.35,1.398],[5.173,-1.609],[-1.799,-3.95],[0.386,-2.64]],"v":[[12.421,80.455],[5.893,81.196],[5.043,95.232],[3.599,114.838],[16.988,115.55],[21.872,93.512],[20.252,80.706]]}],"t":30},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.845,-4.053],[-3.502,-0.137],[-5.031,0.424],[1.96,4.302],[-0.617,4.223]],"o":[[-3.709,0.451],[-1.827,0.771],[-1.049,5.032],[3.502,0.137],[5.031,-0.424],[-1.799,-3.95],[0.386,-2.64]],"v":[[12.421,80.455],[5.893,81.196],[5.043,95.232],[3.616,114.318],[17.005,115.03],[21.872,93.512],[20.252,80.706]]}],"t":125},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.845,-4.053],[-2.26,-2.678],[-4.806,1.547],[0.656,4.681],[0.19,4.523]],"o":[[-3.709,0.451],[-1.827,0.771],[-1.049,5.032],[3.317,3.93],[4.815,-1.55],[-0.609,-4.346],[-0.112,-2.665]],"v":[[12.421,80.455],[5.893,81.196],[5.043,95.232],[4.5,114.712],[19.443,116.296],[22.624,92.541],[20.252,80.706]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.71,-0.451],[2.43,-1.025],[0.553,-5.172],[-5.604,-4.913],[-2.85,3.045],[1.864,4.329],[-0.558,4.245]],"o":[[-3.709,0.451],[-1.827,0.771],[-0.547,5.111],[4.06,3.559],[3.118,-3.332],[-1.712,-3.979],[0.349,-2.641]],"v":[[12.421,80.455],[5.893,81.196],[4.62,95.402],[8.554,117.312],[22.81,116.165],[23.266,94.085],[20.252,80.706]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.845,-4.053],[-3.502,-0.137],[-5.031,0.424],[1.96,4.302],[-0.617,4.223]],"o":[[-3.709,0.451],[-1.827,0.771],[-1.049,5.032],[3.502,0.137],[5.031,-0.424],[-1.799,-3.95],[0.386,-2.64]],"v":[[12.421,80.455],[5.893,81.196],[5.043,95.232],[3.616,114.318],[17.005,115.03],[21.872,93.512],[20.252,80.706]]}],"t":218},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.408,-3.881],[-1.689,-3.214],[-5.173,1.609],[-0.145,4.725],[-0.617,4.223]],"o":[[-3.709,0.451],[-1.827,0.771],[-0.538,5.112],[2.787,5.305],[5.173,-1.609],[0.15,-4.898],[0.386,-2.64]],"v":[[19.944,81.092],[13.416,81.832],[11.963,96.019],[11.319,116.687],[25.901,119.557],[29.395,94.149],[31.107,80.773]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.408,-3.881],[-1.689,-3.214],[-5.173,1.609],[-0.145,4.725],[-0.617,4.223]],"o":[[-3.709,0.451],[-1.827,0.771],[-0.538,5.112],[2.787,5.305],[5.173,-1.609],[0.15,-4.898],[0.386,-2.64]],"v":[[19.944,81.092],[13.416,81.832],[11.963,96.019],[11.319,116.687],[25.901,119.557],[31.204,91.787],[32.494,80.315]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.709,-0.451],[2.43,-1.025],[0.845,-4.053],[-3.502,-0.137],[-5.031,0.424],[1.96,4.302],[-0.617,4.223]],"o":[[-3.709,0.451],[-1.827,0.771],[-1.049,5.032],[3.502,0.137],[5.031,-0.424],[-1.799,-3.95],[0.386,-2.64]],"v":[[12.421,80.455],[5.893,81.196],[5.043,95.232],[3.616,114.318],[17.005,115.03],[21.872,93.512],[20.252,80.706]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.997,-0.486],[1.782,-0.859],[0.094,-4.46],[-3.086,-2.177],[-4.548,2.518],[2.112,4.636],[-0.665,4.551]],"o":[[-3.997,0.486],[-0.701,0.355],[-0.191,9.032],[3.169,2.236],[4.76,-2.636],[-1.939,-4.256],[0.415,-2.845]],"v":[[15.459,79.584],[5.204,80.933],[6.932,96.771],[6.301,115.55],[20.356,118.581],[25.068,94.917],[23.322,81.117]]}],"t":435},{"s":[{"c":true,"i":[[4.001,-0.486],[3.789,-0.337],[0.911,-4.371],[-3.057,-2.224],[-5.076,4.217],[-0.359,5.683],[-0.665,4.555]],"o":[[-4.001,0.486],[-2.131,0.19],[-1.132,5.428],[4.63,3.368],[4.189,-3.481],[0.295,-4.672],[0.416,-2.847]],"v":[[23.414,80.937],[13.376,81.559],[12.137,96.684],[12.749,118.214],[26.826,118.513],[30.148,95.759],[31.955,81.245]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.68235296011,0.658823549747,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"shadows","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.854,-0.27],[4.488,2.906],[0.27,-4.045],[9.012,-9.367],[-2.977,0.735],[-2.682,0.36],[0.623,-6.118],[-1.299,9.644],[-0.768,4.591],[-2.697,1.348],[-4.002,0.232],[0.008,4.97],[1.935,2.935],[3.775,0.27]],"o":[[-5.126,-1.182],[8.961,6.763],[-0.27,4.045],[3.065,-2.016],[0.629,-0.195],[1.348,3.506],[-0.86,8.448],[0.793,-5.889],[0.93,-5.56],[2.697,-1.348],[5.377,-0.311],[-0.007,-4.52],[-1.532,-2.323],[-3.775,-0.27]],"v":[[11.094,40.608],[-3.2,34.29],[8.789,60.047],[-0.473,87],[8.113,82.258],[12.221,81.766],[10.375,113.204],[28.879,114.534],[29.311,91.623],[32.329,79.336],[41.87,78.277],[47.652,70.143],[46.416,47.6],[34.738,42.41]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.25,-3.75],[-3.077,1.046],[-9.057,3.305],[-3.353,0.132],[1.5,-5.5],[-2.704,6.31],[0.75,4.25],[-2.5,1.25],[-3.71,0.215],[0.007,4.608],[1.397,2.289],[2.763,-0.011]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.25,3.75],[13.824,-4.698],[4.473,-0.554],[1.25,3.25],[-1.118,4.1],[2.25,-5.25],[-0.75,-4.25],[2.5,-1.25],[4.985,-0.289],[-0.007,-4.191],[-1.397,-2.289],[-2.952,0.012]],"v":[[-7.328,45.163],[-30.329,38.733],[-31.25,65.25],[-31.479,92.984],[-5.764,82.123],[4.94,81.03],[2.5,111.75],[20.75,112],[20.75,91.5],[20.283,79.692],[29.526,77.981],[34.886,70.44],[33.15,49.821],[22.552,45.378]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.25,-3.75],[-3.077,1.046],[-9.057,3.305],[-3.353,0.132],[1.5,-5.5],[-2.704,6.31],[0.75,4.25],[-2.5,1.25],[-3.71,0.215],[0.393,4.591],[0.25,3.25],[3.5,0.25]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.25,3.75],[13.824,-4.698],[4.473,-0.554],[1.25,3.25],[-1.118,4.1],[2.25,-5.25],[-0.75,-4.25],[2.5,-1.25],[4.985,-0.289],[-0.463,-5.4],[-0.25,-3.25],[-3.5,-0.25]],"v":[[-7.328,45.163],[-30.329,38.733],[-31.25,65.25],[-31.479,92.984],[-5.764,82.123],[4.94,81.03],[2.5,111.75],[20.75,112],[20.75,91.5],[20.283,79.692],[29.526,77.981],[34.886,70.44],[32.967,50.41],[22.914,44.729]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.188,-3.75],[-3.077,1.046],[-9.057,3.305],[-3.353,0.132],[1.287,-8.382],[-4.909,4.798],[0.802,4.686],[-1.405,0.319],[-3.71,0.215],[0.007,4.608],[0.25,3.25],[3.5,0.25]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.188,3.75],[13.824,-4.698],[4.473,-0.554],[1.25,3.25],[-0.645,4.201],[4.155,-4.061],[-0.862,-5.035],[1.405,-0.319],[4.985,-0.289],[-0.007,-4.191],[-0.25,-3.25],[-3.5,-0.25]],"v":[[-7.328,45.163],[-33.581,38.232],[-38.447,65.402],[-34.731,92.483],[-5.764,82.123],[4.94,81.03],[3.266,112.098],[20.917,114.741],[22.198,91.191],[20.264,79.26],[29.526,77.981],[34.886,70.44],[33.026,51.377],[25.338,45.615]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.113,-3.75],[-2.217,1.046],[-9.057,3.305],[-3.353,0.132],[-2.301,-8.441],[-4.69,8.763],[2.368,6.629],[-0.905,0.331],[-3.71,0.215],[0.007,4.608],[0.25,3.25],[3.5,0.25]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.113,3.75],[9.961,-4.698],[4.473,-0.554],[1.25,3.25],[1.624,5.958],[3.534,-6.604],[-1.452,-4.064],[2.578,-1.08],[4.985,-0.289],[-0.007,-4.191],[-0.25,-3.25],[-3.5,-0.25]],"v":[[-7.577,45.758],[-33.581,38.232],[-46.627,65.402],[-33.144,92.306],[-5.764,82.123],[4.94,81.03],[4.791,112.226],[23.357,114.452],[22.216,91.623],[20.283,79.692],[29.526,77.981],[34.886,70.44],[33.74,49.54],[26.97,46.229]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.25,-3.75],[-3.077,1.046],[-9.057,3.305],[-3.353,0.132],[1.5,-5.5],[-2.704,6.31],[0.75,4.25],[-2.5,1.25],[-3.71,0.215],[0.007,4.608],[0.25,3.25],[3.5,0.25]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.25,3.75],[13.824,-4.698],[4.473,-0.554],[1.25,3.25],[-1.118,4.1],[2.25,-5.25],[-0.75,-4.25],[2.5,-1.25],[4.985,-0.289],[-0.007,-4.191],[-0.25,-3.25],[-3.5,-0.25]],"v":[[-7.328,45.163],[-30.329,38.733],[-31.25,65.25],[-31.479,92.984],[-5.764,82.123],[4.94,81.03],[2.5,111.75],[20.75,112],[20.75,91.5],[20.283,79.692],[29.526,77.981],[34.886,70.44],[33.74,49.54],[22.914,44.729]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.854,-0.27],[4.488,2.906],[0.27,-4.045],[9.012,-9.367],[-2.97,0.761],[-3.617,0.143],[0.623,-6.118],[-1.299,9.644],[-0.768,4.591],[-2.697,1.348],[-4.002,0.232],[0.008,4.97],[1.935,2.935],[3.775,0.27]],"o":[[-5.126,-1.182],[8.961,6.763],[-0.27,4.045],[3.065,-2.016],[2.107,-0.54],[1.348,3.506],[-0.86,8.448],[0.793,-5.889],[0.93,-5.56],[2.697,-1.348],[5.377,-0.311],[-0.007,-4.52],[-1.532,-2.323],[-3.775,-0.27]],"v":[[11.094,40.608],[-3.2,34.29],[8.789,60.047],[-0.473,87],[12.352,81.275],[12.258,80.33],[10.375,113.204],[28.879,114.534],[29.311,91.623],[32.329,79.336],[41.87,78.277],[47.652,70.143],[46.416,47.6],[34.738,42.41]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.854,-0.27],[4.863,2.906],[0.27,-4.045],[9.012,-9.367],[-2.554,1.696],[-2.988,1.348],[0.623,-6.118],[-1.299,9.644],[-0.346,4.642],[-0.209,-0.023],[-4.002,0.232],[0.008,4.97],[1.935,2.935],[3.785,0.029]],"o":[[-5.126,-1.182],[9.711,6.763],[-0.27,4.045],[3.065,-2.016],[2.568,-1.705],[-0.082,3.979],[-0.86,8.448],[0.793,-5.889],[0.403,-5.412],[2.685,-1.372],[5.377,-0.311],[-0.007,-4.52],[-1.532,-2.323],[-3.785,-0.029]],"v":[[15.576,40.882],[2.552,34.988],[13.27,60.321],[4.304,89.132],[10.511,84.638],[12.742,83.078],[10.375,113.204],[28.879,114.534],[30.966,91.315],[32.329,79.336],[41.87,78.277],[47.652,70.143],[46.416,47.6],[33.357,41.308]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.25,-3.75],[-3.077,1.046],[-9.057,3.305],[-3.353,0.132],[1.5,-5.5],[-2.704,6.31],[0.75,4.25],[-2.5,1.25],[-3.71,0.215],[0.007,4.608],[0.25,3.25],[3.5,0.25]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.25,3.75],[13.824,-4.698],[4.473,-0.554],[1.25,3.25],[-1.118,4.1],[2.25,-5.25],[-0.75,-4.25],[2.5,-1.25],[4.985,-0.289],[-0.007,-4.191],[-0.25,-3.25],[-3.5,-0.25]],"v":[[-7.328,45.163],[-30.329,38.733],[-31.25,65.25],[-31.479,92.984],[-5.764,82.123],[4.94,81.03],[2.5,111.75],[20.75,112],[20.75,91.5],[20.283,79.692],[29.526,77.981],[34.886,70.44],[33.74,49.54],[22.914,44.729]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.5,-0.25],[6.108,1.815],[0.113,-3.75],[-2.217,1.046],[-9.057,3.305],[-3.353,0.132],[2.966,-6.559],[-4.586,10.307],[2.368,6.629],[-1.353,0.05],[-3.71,0.215],[0.007,4.608],[0.25,3.25],[3.5,0.25]],"o":[[-4.752,-1.096],[-6.488,-1.928],[-0.113,3.75],[9.961,-4.698],[4.473,-0.554],[1.25,3.25],[-2.544,5.627],[3.045,-6.843],[-1.452,-4.064],[2.259,-0.083],[4.985,-0.289],[-0.007,-4.191],[-0.25,-3.25],[-3.5,-0.25]],"v":[[-7.577,45.758],[-33.581,38.232],[-46.627,65.402],[-33.144,92.306],[-5.764,82.123],[4.94,81.03],[5.062,110.692],[23.357,114.452],[24.564,93.437],[23.461,78.421],[29.526,77.981],[34.886,70.44],[32.884,49.735],[26.97,46.229]]}],"t":435},{"s":[{"c":true,"i":[[4.854,-0.27],[4.488,2.906],[0.27,-4.045],[9.012,-9.367],[-2.97,0.761],[-3.617,0.143],[0.623,-6.118],[-1.299,9.644],[-0.768,4.591],[-2.697,1.348],[-4.002,0.232],[0.008,4.97],[1.935,2.935],[3.775,0.27]],"o":[[-5.126,-1.182],[8.961,6.763],[-0.27,4.045],[3.065,-2.016],[2.107,-0.54],[1.348,3.506],[-0.86,8.448],[0.793,-5.889],[0.93,-5.56],[2.697,-1.348],[5.377,-0.311],[-0.007,-4.52],[-1.532,-2.323],[-3.775,-0.27]],"v":[[11.094,40.608],[-3.2,34.29],[8.789,60.047],[-0.307,87.516],[7.048,82.37],[12.396,81.782],[10.375,113.204],[28.879,114.534],[29.311,91.623],[32.329,79.336],[41.87,78.277],[47.652,70.143],[46.416,47.6],[34.738,42.41]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[12.54,1.014],[5.764,-2.861],[3.074,-9.856],[-3.298,-7.308],[-6.772,-3.28],[-5.393,0],[-3.489,2.594],[-1.162,8.006],[1.649,4.533]],"o":[[-8.945,-0.723],[-4.855,2.41],[-2.908,9.325],[2.295,5.086],[5.361,2.597],[5.393,0],[6.67,-4.959],[1.214,-8.36],[-2.157,-5.933]],"v":[[-15.612,30.083],[-37.984,32.486],[-52.473,53.526],[-50.96,80.551],[-38.113,92.826],[-21.279,94.782],[-2.125,89.307],[7.623,66.015],[6.859,47.587]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-5.5,-0.5],[-5,0],[-2,3.5],[-1.077,7.422],[1.528,4.203]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.5,0.5],[5,0],[2,-3.5],[1.125,-7.75],[-2,-5.5]],"v":[[-36.84,35.886],[-56.09,36.386],[-68.09,56.886],[-66.59,82.386],[-59.09,95.386],[-37.34,95.386],[-25.84,90.261],[-18.715,69.386],[-21.59,48.386]]}],"t":30},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-5.5,-0.5],[-5,0],[-2,3.5],[-1.077,7.422],[1.528,4.203]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.5,0.5],[5,0],[2,-3.5],[1.125,-7.75],[-2,-5.5]],"v":[[-36.84,35.886],[-56.09,36.386],[-68.09,56.886],[-66.59,82.386],[-59.09,95.386],[-37.34,95.386],[-25.84,90.261],[-18.715,69.386],[-21.59,48.386]]}],"t":125},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[9,-0.5],[3.761,-0.5],[0.752,-9],[-1.88,-7],[-4.137,-0.5],[-5,0],[-2,3.5],[-1.077,7.422],[1.528,4.203]],"o":[[-9,0.5],[-3.761,0.5],[-0.752,9],[1.02,3.796],[4.137,0.5],[5,0],[2,-3.5],[1.125,-7.75],[-2,-5.5]],"v":[[-36.84,35.886],[-57.129,36.539],[-66.155,57.039],[-65.026,82.539],[-59.386,95.539],[-40.592,94.885],[-29.092,89.76],[-21.967,68.885],[-24.842,47.885]]}],"t":141},{"i":{"x":0.667,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[9,-0.5],[2.267,-0.5],[0.453,-9],[-1.133,-7],[-2.493,-0.5],[-5,0],[-1.441,3.5],[-0.776,7.422],[1.101,4.203]],"o":[[-9,0.5],[-2.267,0.5],[-0.453,9],[0.615,3.796],[2.493,0.5],[5,0],[1.441,-3.5],[0.811,-7.75],[-1.441,-5.5]],"v":[[-36.84,35.886],[-57.888,36.539],[-63.327,57.039],[-62.648,82.539],[-59.248,95.539],[-40.592,94.885],[-29.081,89.583],[-23.946,68.708],[-26.018,47.708]]}],"t":203},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-5.5,-0.5],[-5,0],[-2,3.5],[-1.077,7.422],[1.528,4.203]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.5,0.5],[5,0],[2,-3.5],[1.125,-7.75],[-2,-5.5]],"v":[[-36.84,35.886],[-56.09,36.386],[-68.09,56.886],[-66.59,82.386],[-59.09,95.386],[-37.34,95.386],[-25.84,90.261],[-18.715,69.386],[-21.59,48.386]]}],"t":218},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[12.54,1.014],[5.764,-2.861],[3.074,-9.856],[-3.298,-7.308],[-6.772,-3.28],[-5.393,0],[-3.13,3.019],[-1.162,8.006],[1.649,4.533]],"o":[[-8.945,-0.723],[-4.855,2.41],[-2.908,9.325],[2.295,5.086],[5.361,2.597],[5.393,0],[4.74,-4.572],[1.214,-8.36],[-2.157,-5.933]],"v":[[-15.612,30.083],[-37.984,32.486],[-52.473,53.526],[-50.96,80.551],[-38.113,92.826],[-21.279,94.782],[-3.457,90.809],[8.335,65.959],[6.859,47.587]]}],"t":240},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[13.588,1.014],[6.246,-2.861],[3.331,-9.856],[-3.573,-7.308],[-7.338,-3.28],[-5.844,0],[-4.244,0.947],[0.792,8.47],[1.649,4.533]],"o":[[-9.693,-0.723],[-5.261,2.41],[-3.152,9.325],[2.487,5.086],[5.81,2.597],[5.844,0],[6.027,-1.345],[-0.787,-8.411],[-2.157,-5.933]],"v":[[-11.892,30.311],[-32.048,32.76],[-47.748,53.8],[-46.109,80.825],[-32.188,93.1],[-13.946,95.056],[-0.633,92.434],[12.703,66.53],[11.34,47.862]]}],"t":300},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[9,-0.5],[5,-0.5],[1,-9],[-2.5,-7],[-5.5,-0.5],[-5,0],[-2,3.5],[-1.077,7.422],[1.528,4.203]],"o":[[-9,0.5],[-5,0.5],[-1,9],[1.356,3.796],[5.5,0.5],[5,0],[2,-3.5],[1.125,-7.75],[-2,-5.5]],"v":[[-36.84,35.886],[-56.09,36.386],[-68.09,56.886],[-66.59,82.386],[-59.09,95.386],[-37.34,95.386],[-25.84,90.261],[-18.715,69.386],[-21.59,48.386]]}],"t":313},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[9,-0.5],[2.267,-0.5],[0.453,-9],[-1.133,-7],[-2.493,-0.5],[-5,0],[-1.441,3.5],[-0.776,7.422],[1.101,4.203]],"o":[[-9,0.5],[-2.267,0.5],[-0.453,9],[0.615,3.796],[2.493,0.5],[5,0],[1.441,-3.5],[0.811,-7.75],[-1.441,-5.5]],"v":[[-36.84,35.886],[-57.888,36.539],[-63.327,57.039],[-62.648,82.539],[-59.248,95.539],[-40.592,94.885],[-29.081,89.583],[-23.946,68.708],[-26.018,47.708]]}],"t":435},{"s":[{"c":true,"i":[[12.54,1.014],[5.764,-2.861],[3.074,-9.856],[-3.298,-7.308],[-6.772,-3.28],[-5.393,0],[-3.611,2.422],[-0.609,8.067],[1.649,4.533]],"o":[[-8.945,-0.723],[-4.855,2.41],[-2.908,9.325],[2.295,5.086],[5.361,2.597],[5.393,0],[7.832,-5.252],[0.651,-8.622],[-2.157,-5.933]],"v":[[-15.612,30.083],[-37.984,32.486],[-52.473,53.526],[-50.96,80.551],[-38.113,92.826],[-21.279,94.782],[-4.444,91.146],[8.427,66.261],[6.859,47.587]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0.09,0.114]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"fill","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":23,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1186.375,89.045,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-1160.358,116.389,0]},"r":{"a":0,"ix":10,"k":75},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Front arm strap","op":480,"parent":21,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[12.857,2.5],[2.764,25.439],[-26.459,-0.537],[-6.407,-2.007],[-3.831,-6.997],[18.082,-18.824]],"o":[[-12.857,-2.5],[-2.821,-25.97],[6.713,0.136],[7.502,2.35],[5.398,9.859],[0,0]],"v":[[-1216.656,124.95],[-1259.419,93.797],[-1216.64,44.711],[-1193.813,47.808],[-1171.316,69.561],[-1181.867,126.018]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.278431385756,0.745098054409,0.666666686535,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Front strap","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":24,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1295.661,56.187,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-1295.661,56.187,0]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0],"y":[0.926]},"o":{"x":[0.226],"y":[-0.013]},"s":[-24],"t":0},{"i":{"x":[0.687],"y":[0.869]},"o":{"x":[0.585],"y":[-0.198]},"s":[-36.742],"t":33},{"i":{"x":[0.955],"y":[0.565]},"o":{"x":[0.587],"y":[-0.088]},"s":[-31.84],"t":91},{"i":{"x":[0.226],"y":[1.052]},"o":{"x":[0.02],"y":[0.024]},"s":[-40.546],"t":128},{"i":{"x":[0.658],"y":[1.501]},"o":{"x":[0.597],"y":[-0.816]},"s":[-69.071],"t":143},{"i":{"x":[0.625],"y":[0.881]},"o":{"x":[0.299],"y":[0.036]},"s":[-74.765],"t":204},{"i":{"x":[0.574],"y":[1.769]},"o":{"x":[0.267],"y":[0.827]},"s":[-43.204],"t":232},{"i":{"x":[0.597],"y":[0.901]},"o":{"x":[0.266],"y":[-0.089]},"s":[-35.123],"t":302},{"i":{"x":[0.615],"y":[1.3]},"o":{"x":[0.407],"y":[-0.131]},"s":[-18.224],"t":329},{"i":{"x":[0.935],"y":[0.735]},"o":{"x":[0.482],"y":[0.199]},"s":[-50.369],"t":396},{"i":{"x":[0.654],"y":[0.876]},"o":{"x":[0.044],"y":[0.536]},"s":[-38.603],"t":409},{"i":{"x":[0.833],"y":[0.951]},"o":{"x":[0.353],"y":[0.48]},"s":[-26.41],"t":449},{"s":[-24],"t":479}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Head","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[5.89,6.29],[6.173,10.555],[-31.869,41.718],[-36.964,8.089],[-22.543,-6.035],[-28.001,-21.569],[-7.57,-23.772],[10.449,-25.082],[11.602,-15.659],[38.213,-10.108]],"o":[[-20.212,-6.536],[-8.358,-8.925],[-25.392,-43.416],[31.869,-41.718],[26.695,-5.842],[17.838,4.776],[14.275,10.996],[8.245,25.89],[-7.441,17.862],[-7.5,10.122],[0,0]],"v":[[-1364.594,64.448],[-1407.25,36.836],[-1426.34,14.633],[-1419.443,-140.192],[-1320.859,-204.684],[-1242.125,-201.011],[-1170.206,-163.671],[-1131.645,-104.785],[-1134.655,-19.767],[-1159.368,23.794],[-1225.449,64.952]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Helmet","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[6.215,-6.562],[-1.842,-2.745],[-0.868,5.473],[-2.758,7.671]],"o":[[-6.749,7.126],[3.458,5.153],[0.312,-1.97],[2.018,-5.614]],"v":[[-1419.524,-106.473],[-1428.594,-78.459],[-1417.324,-79.167],[-1409.596,-101.248]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[11.173,3.061],[26.271,-9.478],[20.055,-21.006],[-6.194,1.313],[-7.789,8.079],[-12.587,6.129],[-20.168,0.294]],"o":[[-25.199,-6.905],[-27.942,10.081],[-19.713,20.647],[6.859,-1.454],[8.751,-9.077],[27.19,-13.24],[13.305,-0.194]],"v":[[-1256.206,-188.055],[-1332.986,-183.559],[-1396.688,-139.562],[-1400.137,-113.137],[-1375.442,-136.589],[-1337.667,-164.576],[-1258.15,-175.655]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[1,1,1,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Helmet highlights","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.512,7.595],[-0.635,0.143],[-0.427,-0.359],[-0.672,-1.633],[-1.303,-6.385]],"o":[[1.509,-8.231],[0.273,-0.591],[0.544,-0.122],[1.352,1.136],[2.48,6.026],[0,0]],"v":[[-1365.8,-105.074],[-1358.227,-128.939],[-1356.959,-130.329],[-1355.442,-129.783],[-1352.661,-125.338],[-1346.97,-106.666]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.3,7.69],[-0.631,0.16],[-0.437,-0.347],[-0.425,-1.714],[-1.48,-6.346]],"o":[[1.281,-8.27],[0.257,-0.598],[0.54,-0.137],[1.383,1.098],[1.902,7.674],[0,0]],"v":[[-1364.701,-104.599],[-1356.78,-128.316],[-1355.551,-129.74],[-1354.02,-129.236],[-1351.116,-124.871],[-1348.879,-99.233]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.512,7.595],[-0.635,0.143],[-0.427,-0.359],[-0.377,-1.725],[-1.303,-6.385]],"o":[[1.51,-8.231],[0.273,-0.591],[0.544,-0.122],[1.352,1.136],[1.688,7.724],[0,0]],"v":[[-1371.9,-108.131],[-1363.324,-131.619],[-1362.056,-133.009],[-1360.539,-132.463],[-1357.758,-128.018],[-1356.233,-102.328]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-2.577,7.595],[-0.466,0.143],[-0.313,-0.359],[-0.277,-1.725],[-0.956,-6.385]],"o":[[1.108,-8.231],[0.201,-0.591],[0.399,-0.122],[0.992,1.136],[1.239,7.724],[0,0]],"v":[[-1363.96,-108.131],[-1357.667,-131.619],[-1356.737,-133.009],[-1356.344,-132.991],[-1355.119,-128.038],[-1354.97,-102.837]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-2.577,7.595],[-0.466,0.143],[-0.313,-0.359],[-0.277,-1.725],[-0.956,-6.385]],"o":[[1.108,-8.231],[0.201,-0.591],[0.399,-0.122],[0.992,1.136],[1.239,7.724],[0,0]],"v":[[-1363.96,-108.131],[-1357.667,-131.619],[-1356.737,-133.009],[-1356.344,-132.991],[-1355.119,-128.038],[-1354.97,-102.837]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.079,7.781],[-0.626,0.178],[-0.446,-0.334],[-0.474,-1.701],[-1.66,-6.301]],"o":[[1.044,-8.303],[0.24,-0.605],[0.536,-0.153],[1.413,1.058],[2.12,7.617],[0,0]],"v":[[-1364.337,-102.569],[-1357.096,-126.502],[-1355.908,-127.961],[-1354.363,-127.501],[-1351.336,-123.22],[-1348.368,-97.656]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-3.066,7.786],[-0.626,0.179],[-0.447,-0.333],[-0.476,-1.7],[-1.671,-6.298]],"o":[[1.03,-8.304],[0.239,-0.606],[0.536,-0.154],[1.415,1.056],[2.133,7.613],[0,0]],"v":[[-1365.605,-104.545],[-1358.404,-128.49],[-1357.218,-129.951],[-1355.673,-129.494],[-1352.638,-125.218],[-1349.628,-99.659]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-2.577,7.595],[-0.466,0.143],[-0.313,-0.359],[-0.277,-1.725],[-0.956,-6.385]],"o":[[1.108,-8.231],[0.201,-0.591],[0.399,-0.122],[0.992,1.136],[1.239,7.724],[0,0]],"v":[[-1358.841,-107.556],[-1352.549,-131.044],[-1351.618,-132.434],[-1351.226,-132.416],[-1350.001,-127.463],[-1349.852,-102.262]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-2.577,7.595],[-0.466,0.143],[-0.313,-0.359],[-0.277,-1.725],[-0.956,-6.385]],"o":[[1.108,-8.231],[0.201,-0.591],[0.399,-0.122],[0.992,1.136],[1.239,7.724],[0,0]],"v":[[-1358.841,-107.556],[-1352.549,-131.044],[-1351.618,-132.434],[-1351.226,-132.416],[-1350.001,-127.463],[-1349.852,-102.262]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.3,7.69],[-0.631,0.16],[-0.437,-0.347],[-0.425,-1.714],[-0.446,-7.909]],"o":[[1.281,-8.27],[0.257,-0.598],[0.54,-0.137],[1.383,1.098],[1.902,7.674],[0,0]],"v":[[-1364.701,-104.599],[-1356.78,-128.316],[-1355.551,-129.74],[-1353.308,-131.969],[-1351.116,-124.871],[-1347.846,-99.839]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[-3.512,7.595],[-0.635,0.143],[-0.427,-0.359],[-0.672,-1.633],[-1.303,-6.385]],"o":[[1.509,-8.231],[0.273,-0.591],[0.544,-0.122],[1.352,1.136],[2.48,6.026],[0,0]],"v":[[-1365.8,-105.074],[-1358.227,-128.939],[-1356.959,-130.329],[-1355.442,-129.783],[-1352.661,-125.338],[-1346.97,-106.666]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.07,5.251],[-0.108,-0.675],[3.571,-8.522]],"o":[[4.995,-7.253],[0.557,0.396],[1.463,9.123],[0,0]],"v":[[-1225.614,-100.355],[-1206.01,-123.816],[-1205.181,-122.003],[-1209.769,-90.298]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-6.937,5.362],[-0.194,-1.684],[2.484,-8.594]],"o":[[4.792,-7.389],[1.199,-0.927],[1.022,8.858],[0,0]],"v":[[-1242.087,-106.267],[-1220.747,-130.683],[-1218.565,-123.91],[-1222.645,-97.95]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.083,5.167],[-0.148,-1.689],[2.722,-8.522]],"o":[[4.995,-7.253],[1.225,-0.893],[0.776,8.883],[0,0]],"v":[[-1249.287,-106.397],[-1227.278,-130.212],[-1225.284,-123.382],[-1230.083,-97.545]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-5.785,5.167],[0.287,-1.669],[2.223,-8.522]],"o":[[4.08,-7.253],[1,-0.893],[-1.641,9.531],[0,0]],"v":[[-1251.409,-107.732],[-1228.961,-134.023],[-1230.232,-124.448],[-1235.725,-98.879]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-5.785,5.167],[0.287,-1.669],[2.223,-8.522]],"o":[[4.08,-7.253],[1,-0.893],[-1.641,9.531],[0,0]],"v":[[-1251.409,-107.732],[-1228.961,-134.023],[-1230.232,-124.448],[-1235.725,-98.879]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-6.781,5.557],[-0.242,-1.678],[2.238,-8.662]],"o":[[4.58,-7.523],[1.172,-0.961],[1.274,8.825],[0,0]],"v":[[-1241.821,-107.734],[-1221.186,-132.749],[-1218.811,-126.042],[-1222.149,-99.976]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-6.772,5.568],[-0.245,-1.678],[2.224,-8.665]],"o":[[4.567,-7.53],[1.171,-0.963],[1.289,8.823],[0,0]],"v":[[-1243.098,-109.916],[-1222.505,-134.965],[-1220.119,-128.262],[-1223.412,-102.19]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-5.785,5.167],[0.287,-1.669],[2.223,-8.522]],"o":[[4.08,-7.253],[1,-0.893],[-1.641,9.531],[0,0]],"v":[[-1244.767,-102.713],[-1221.914,-132.847],[-1223.177,-122.872],[-1230.606,-98.305]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-5.785,5.167],[0.287,-1.669],[2.223,-8.522]],"o":[[4.08,-7.253],[1,-0.893],[-1.641,9.531],[0,0]],"v":[[-1244.767,-102.713],[-1221.914,-132.847],[-1223.177,-122.872],[-1230.606,-98.305]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-6.093,5.849],[-0.194,-1.684],[2.484,-8.594]],"o":[[4.792,-7.389],[1.094,-1.05],[1.022,8.858],[0,0]],"v":[[-1238.151,-104.132],[-1217.559,-129.035],[-1215.376,-122.263],[-1219.456,-96.302]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[-7.07,5.251],[-0.108,-0.675],[3.571,-8.522]],"o":[[4.995,-7.253],[0.557,0.396],[1.463,9.123],[0,0]],"v":[[-1225.614,-100.355],[-1206.01,-123.816],[-1205.181,-122.003],[-1209.769,-90.298]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Ear lines","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-25.907,60.866],[-5.612,13.435],[-2.809,-1.873],[-3.178,-8.896],[0.936,-15.607],[-15.607,0.312],[-9.988,-2.497],[-0.936,-0.312],[-4.603,5.992],[-3.746,-1.249],[2.185,-33.086],[0.48,-4.519],[0.708,-2.374],[3.746,-11.861],[38.08,-4.682],[29.029,23.098]],"o":[[0,0],[5.695,-13.633],[2.809,1.873],[3.337,9.34],[0,0],[15.607,-0.312],[9.988,2.497],[0.936,0.312],[7.745,-10.082],[3.746,1.249],[-2.185,33.086],[-0.558,5.25],[-0.736,2.466],[-3.746,11.861],[-38.08,4.682],[-29.029,-23.098]],"v":[[-1374.467,-97.702],[-1360.421,-143.274],[-1348.56,-158.569],[-1339.508,-138.28],[-1333.89,-107.066],[-1302.364,-104.569],[-1237.128,-100.511],[-1233.694,-99.575],[-1216.839,-122.049],[-1194.365,-145.147],[-1186.25,-112.685],[-1187.498,-65.552],[-1188.123,-51.818],[-1198.735,23.094],[-1243.37,54.308],[-1380.398,42.134]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-26.057,60.924],[-7.142,12.688],[-2.86,-1.794],[-1.508,-9.326],[0.503,-15.627],[-13.17,0.678],[-8.504,-2.262],[-0.799,-0.29],[-7.645,7.817],[-5.72,3.409],[0.747,-33.12],[0.24,-4.528],[0.474,-2.388],[2.524,-11.936],[37.936,-5.736],[33.586,15.752]],"o":[[0,0],[7.142,-12.688],[2.86,1.794],[1.508,9.326],[0,0],[13.17,-0.678],[8.504,2.262],[0.799,0.29],[6.582,-6.73],[2.724,-1.624],[-0.747,33.12],[-0.279,5.26],[-0.492,2.481],[-2.524,11.936],[-37.936,5.736],[-27.879,-13.075]],"v":[[-1366.978,-94.103],[-1354.201,-140.046],[-1342.769,-155.664],[-1338.391,-137.439],[-1335.827,-104.344],[-1311.092,-102.931],[-1255.894,-100.403],[-1252.969,-99.548],[-1227.771,-129.242],[-1207.068,-149.273],[-1193.274,-113.911],[-1192.918,-66.77],[-1193.012,-53.028],[-1199.02,22.08],[-1231.716,54.213],[-1374.57,46.578]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-27.737,60.178],[-7.491,12.485],[-2.809,-1.873],[-1.249,-9.364],[0.936,-15.607],[-13.183,0.312],[-8.437,-2.497],[-0.791,-0.312],[-7.859,7.602],[-5.813,3.249],[1.665,-33.086],[0.366,-4.519],[0.54,-2.374],[2.854,-11.861],[38.08,-4.682],[36.619,19.677]],"o":[[0,0],[7.491,-12.485],[2.809,1.873],[1.249,9.364],[0,0],[13.183,-0.312],[8.437,2.497],[0.791,0.312],[6.766,-6.545],[2.768,-1.547],[-1.665,33.086],[-0.425,5.25],[-0.561,2.467],[-2.854,11.861],[-38.08,4.682],[-27.125,-14.576]],"v":[[-1374.467,-97.702],[-1360.421,-143.274],[-1348.56,-158.569],[-1344.69,-140.229],[-1343.044,-107.075],[-1318.357,-104.977],[-1263.251,-100.919],[-1260.351,-99.983],[-1234.339,-128.967],[-1213.089,-148.416],[-1200.281,-112.685],[-1201.232,-65.552],[-1201.708,-51.818],[-1209.796,23.094],[-1243.37,54.308],[-1385.958,42.714]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-20.352,60.178],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-7.859,7.602],[-5.813,3.249],[1.665,-33.086],[0.366,-4.519],[0.54,-2.374],[2.854,-11.861],[38.08,-4.682],[33.137,16.677]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.766,-6.545],[2.768,-1.547],[-1.665,33.086],[-0.425,5.25],[-0.561,2.466],[-2.854,11.861],[-38.08,4.682],[-27.506,-13.843]],"v":[[-1365.844,-97.702],[-1355.537,-143.274],[-1346.834,-158.569],[-1337.848,-140.879],[-1330.687,-106.336],[-1312.745,-104.977],[-1262.506,-100.919],[-1260.351,-99.983],[-1234.339,-128.967],[-1213.089,-148.416],[-1200.281,-112.685],[-1201.232,-65.552],[-1201.708,-51.818],[-1209.796,23.094],[-1243.37,54.308],[-1369.772,46.612]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-20.352,60.178],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-7.859,7.602],[-5.813,3.249],[1.665,-33.086],[0.366,-4.519],[0.54,-2.374],[2.854,-11.861],[38.08,-4.682],[33.137,16.677]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.766,-6.545],[2.768,-1.547],[-1.665,33.086],[-0.425,5.25],[-0.561,2.466],[-2.854,11.861],[-38.08,4.682],[-27.506,-13.843]],"v":[[-1365.844,-97.702],[-1355.537,-143.274],[-1346.834,-158.569],[-1337.848,-140.879],[-1330.687,-106.336],[-1312.745,-104.977],[-1262.506,-100.919],[-1260.351,-99.983],[-1234.339,-128.967],[-1213.089,-148.416],[-1200.281,-112.685],[-1201.232,-65.552],[-1201.708,-51.818],[-1209.796,23.094],[-1243.37,54.308],[-1369.772,46.612]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-24.308,61.643],[-6.777,12.887],[-2.91,-1.712],[-1.773,-9.279],[0.057,-15.635],[-13.145,1.053],[-8.565,-2.019],[-0.807,-0.267],[-7.419,8.032],[-5.621,3.571],[-0.198,-33.128],[0.111,-4.533],[0.406,-2.4],[2.183,-12.003],[37.757,-6.816],[34.022,14.787]],"o":[[0,0],[6.777,-12.887],[2.91,1.712],[1.773,9.279],[0,0],[13.145,-1.053],[8.565,2.019],[0.807,0.267],[6.387,-6.915],[2.677,-1.701],[0.198,33.128],[-0.129,5.266],[-0.422,2.494],[-2.183,12.003],[-37.757,6.816],[-28.241,-12.275]],"v":[[-1366.314,-92.012],[-1354.853,-138.302],[-1343.871,-154.239],[-1338.975,-136.146],[-1335.468,-103.138],[-1310.702,-102.431],[-1255.455,-101.479],[-1252.506,-100.707],[-1228.165,-131.108],[-1208.043,-151.722],[-1193.246,-116.768],[-1191.545,-69.656],[-1191.247,-55.917],[-1195.109,19.331],[-1226.875,52.384],[-1369.889,48.828]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-24.205,61.684],[-6.755,12.898],[-2.913,-1.707],[-1.789,-9.276],[0.031,-15.635],[-13.143,1.075],[-8.568,-2.004],[-0.808,-0.266],[-7.406,8.045],[-5.615,3.58],[-0.254,-33.127],[0.104,-4.533],[0.401,-2.401],[2.163,-12.007],[37.745,-6.88],[35.931,18.029]],"o":[[0,0],[6.755,-12.898],[2.913,1.707],[1.789,9.276],[0,0],[13.143,-1.075],[8.568,2.004],[0.808,0.266],[6.375,-6.926],[2.674,-1.705],[0.254,33.127],[-0.12,5.266],[-0.417,2.495],[-2.163,12.007],[-37.745,6.88],[-27.522,-13.81]],"v":[[-1367.564,-93.985],[-1356.181,-140.294],[-1345.226,-156.25],[-1337.467,-137.057],[-1332.635,-104.335],[-1311.97,-104.497],[-1256.721,-103.638],[-1253.771,-102.871],[-1229.481,-133.313],[-1209.394,-153.96],[-1194.538,-119.031],[-1192.758,-71.922],[-1192.437,-58.184],[-1196.172,17.071],[-1227.883,50.177],[-1370.903,46.861]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[-20.352,60.178],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-7.859,7.602],[-5.813,3.249],[1.479,-38.3],[0.366,-4.519],[0.54,-2.374],[2.854,-11.861],[38.08,-4.682],[33.136,16.677]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.766,-6.545],[2.768,-1.547],[-1.278,33.104],[-0.425,5.25],[-0.561,2.466],[-2.854,11.861],[-38.081,4.682],[-27.506,-13.843]],"v":[[-1360.725,-97.127],[-1350.419,-142.699],[-1341.716,-157.994],[-1332.73,-140.304],[-1325.568,-105.762],[-1307.626,-104.402],[-1251.518,-98.38],[-1249.363,-97.444],[-1229.22,-128.392],[-1207.97,-147.841],[-1195.162,-112.11],[-1196.114,-64.978],[-1196.589,-51.244],[-1204.677,23.669],[-1238.252,54.882],[-1364.653,47.186]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[-20.352,60.178],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-7.859,7.602],[-5.813,3.249],[1.479,-38.3],[0.366,-4.519],[0.54,-2.374],[2.854,-11.861],[38.08,-4.682],[33.136,16.677]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.766,-6.545],[2.768,-1.547],[-1.278,33.104],[-0.425,5.25],[-0.561,2.466],[-2.854,11.861],[-38.081,4.682],[-27.506,-13.843]],"v":[[-1360.725,-97.127],[-1350.419,-142.699],[-1341.716,-157.994],[-1332.73,-140.304],[-1325.568,-105.762],[-1307.626,-104.402],[-1251.518,-98.38],[-1249.363,-97.444],[-1229.22,-128.392],[-1207.97,-147.841],[-1195.162,-112.11],[-1196.114,-64.978],[-1196.589,-51.244],[-1204.677,23.669],[-1238.252,54.882],[-1364.653,47.186]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-26.057,60.924],[-5.899,13.117],[-2.86,-1.794],[-2.173,-9.194],[0.503,-15.627],[-13.17,0.678],[-8.504,-2.262],[-0.799,-0.29],[-5.615,9.383],[-5.72,3.409],[0.747,-33.12],[0.24,-4.528],[0.474,-2.388],[2.524,-11.936],[37.936,-5.736],[33.586,15.752]],"o":[[0,0],[5.972,-13.279],[2.86,1.794],[2.173,9.194],[0,0],[13.17,-0.678],[8.504,2.262],[0.799,0.29],[5.335,-8.916],[2.724,-1.624],[-0.747,33.12],[-0.279,5.26],[-0.492,2.481],[-2.524,11.936],[-37.936,5.736],[-27.879,-13.075]],"v":[[-1366.978,-94.103],[-1354.201,-140.046],[-1342.769,-155.664],[-1334.667,-136.525],[-1328.926,-102.838],[-1311.092,-102.931],[-1251.081,-99.616],[-1248.155,-98.76],[-1225.929,-128.47],[-1207.068,-149.273],[-1193.274,-113.911],[-1192.918,-66.77],[-1193.012,-53.028],[-1199.02,22.08],[-1231.716,54.213],[-1374.57,46.578]]}],"t":420},{"s":[{"c":true,"i":[[-25.907,60.866],[-7.139,16.883],[-2.809,-1.873],[-2.959,-8.971],[-2.355,-14.174],[-15.607,0.312],[-9.988,-2.497],[-0.936,-0.312],[-4.426,6.124],[-3.746,-1.249],[2.185,-33.086],[0.48,-4.519],[0.708,-2.374],[3.746,-11.861],[38.08,-4.682],[29.029,23.098]],"o":[[0,0],[5.671,-13.411],[2.809,1.873],[2.746,8.326],[0,0],[15.607,-0.312],[9.988,2.497],[0.936,0.312],[7.256,-10.039],[3.746,1.249],[-2.185,33.086],[-0.558,5.25],[-0.736,2.466],[-3.746,11.861],[-38.08,4.682],[-29.029,-23.098]],"v":[[-1374.467,-97.702],[-1361.132,-143.843],[-1348.56,-158.569],[-1339.508,-138.28],[-1331.577,-106.874],[-1302.364,-104.569],[-1237.128,-100.511],[-1233.694,-99.575],[-1216.839,-122.049],[-1194.365,-145.147],[-1186.25,-112.685],[-1187.498,-65.552],[-1188.123,-51.818],[-1198.735,23.094],[-1243.37,54.308],[-1380.398,42.134]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Head stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.702,-6.793],[-0.692,-0.545],[-1.433,0.197],[-2.218,3.534],[-1.528,5.368]],"o":[[1.788,7.527],[0.422,0.774],[1.136,0.896],[4.133,-0.57],[2.967,-4.728],[0,0]],"v":[[-1271.674,-103.325],[-1267.398,-80.658],[-1265.79,-78.583],[-1261.669,-77.664],[-1252.295,-85.328],[-1245.506,-100.574]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.314,-6.704],[-0.599,-0.529],[-1.205,0.231],[-1.775,3.585],[-5.223,1.186]],"o":[[-7.028,6.578],[0.378,0.763],[0.984,0.869],[3.474,-0.666],[2.374,-4.795],[0,0]],"v":[[-1285.143,-102.406],[-1292.063,-81.996],[-1290.648,-79.96],[-1287.142,-79.137],[-1279.439,-87.018],[-1262.971,-100.269]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.127,-6.793],[-0.584,-0.545],[-1.21,0.197],[-1.873,3.534],[-5.254,1.041]],"o":[[-7.208,6.38],[0.356,0.774],[0.96,0.896],[3.492,-0.57],[2.506,-4.728],[0,0]],"v":[[-1292.433,-103.733],[-1299.917,-83.523],[-1298.559,-81.448],[-1295.077,-80.528],[-1287.158,-88.193],[-1270.329,-100.982]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-2.851,-6.793],[-0.533,-0.545],[-1.104,0.197],[-1.708,3.534],[-8.131,-0.591]],"o":[[-10.107,3.648],[0.325,0.774],[0.875,0.896],[3.183,-0.57],[2.285,-4.728],[0,0]],"v":[[-1294.295,-104.212],[-1308.058,-85.107],[-1306.82,-83.032],[-1303.646,-82.112],[-1296.427,-89.777],[-1274.143,-101.462]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-2.851,-6.793],[-0.533,-0.545],[-1.104,0.197],[-1.708,3.534],[-8.131,-0.591]],"o":[[-10.107,3.648],[0.325,0.774],[0.875,0.896],[3.183,-0.57],[2.285,-4.728],[0,0]],"v":[[-1294.295,-104.212],[-1308.058,-85.107],[-1306.82,-83.032],[-1303.646,-82.112],[-1296.427,-89.777],[-1274.143,-101.462]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.504,-6.606],[-0.614,-0.512],[-1.198,0.265],[-1.672,3.634],[-5.187,1.335]],"o":[[-6.837,6.775],[0.399,0.752],[1.008,0.84],[3.454,-0.765],[2.236,-4.861],[0,0]],"v":[[-1284.749,-102.647],[-1291.084,-82.048],[-1289.611,-80.053],[-1286.083,-79.33],[-1278.608,-87.428],[-1262.525,-101.143]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-3.515,-6.6],[-0.615,-0.511],[-1.197,0.267],[-1.666,3.637],[-5.184,1.344]],"o":[[-6.826,6.787],[0.4,0.752],[1.01,0.839],[3.453,-0.771],[2.228,-4.865],[0,0]],"v":[[-1286.017,-104.756],[-1292.317,-84.147],[-1290.841,-82.154],[-1287.312,-81.438],[-1279.851,-89.548],[-1263.79,-103.29]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-2.851,-6.793],[-0.533,-0.545],[-1.104,0.197],[-1.708,3.534],[-8.131,-0.591]],"o":[[-10.107,3.648],[0.325,0.774],[0.875,0.896],[3.183,-0.57],[2.285,-4.728],[0,0]],"v":[[-1289.176,-103.638],[-1302.939,-84.532],[-1301.701,-82.457],[-1298.527,-81.537],[-1291.308,-89.202],[-1269.024,-100.887]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-2.851,-6.793],[-0.533,-0.545],[-1.104,0.197],[-1.708,3.534],[-8.131,-0.591]],"o":[[-10.107,3.648],[0.325,0.774],[0.875,0.896],[3.183,-0.57],[2.285,-4.728],[0,0]],"v":[[-1289.176,-103.638],[-1302.939,-84.532],[-1301.701,-82.457],[-1298.527,-81.537],[-1291.308,-89.202],[-1269.024,-100.887]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.314,-6.704],[-0.599,-0.529],[-1.205,0.231],[-1.775,3.585],[-5.223,1.186]],"o":[[-7.028,6.578],[0.378,0.763],[0.984,0.869],[3.474,-0.666],[2.374,-4.795],[0,0]],"v":[[-1285.143,-102.406],[-1292.063,-81.996],[-1290.648,-79.96],[-1287.142,-79.137],[-1279.439,-87.018],[-1262.971,-100.269]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[-3.702,-6.793],[-0.692,-0.545],[-1.433,0.197],[-2.218,3.534],[-1.528,5.368]],"o":[[1.788,7.527],[0.422,0.774],[1.136,0.896],[4.133,-0.57],[2.967,-4.728],[0,0]],"v":[[-1271.674,-103.325],[-1267.398,-80.658],[-1265.79,-78.583],[-1261.669,-77.664],[-1252.295,-85.328],[-1245.506,-100.574]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.418,-6.418],[-1.79,-1.189],[-1.503,0.676],[-1.644,3.403],[-1.947,4.029],[0.573,0.931]],"o":[[0.418,6.418],[0.14,2.144],[1.373,0.912],[3.446,-1.551],[1.947,-4.029],[0.476,-0.984],[0,0]],"v":[[-1303.011,-103.964],[-1301.758,-84.71],[-1299.518,-78.921],[-1294.784,-78.857],[-1287.793,-87.472],[-1281.952,-99.559],[-1281.58,-102.672]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.743,-6.385],[-1.288,-1.428],[-1.366,0.451],[-1.947,3.117],[-5.434,5.833],[0.51,0.917]],"o":[[-4.323,6.408],[-0.248,2.133],[0.988,1.096],[3.133,-1.034],[2.306,-3.691],[0.724,-0.778],[0,0]],"v":[[-1311.622,-102.311],[-1319.015,-86.57],[-1318.134,-80.545],[-1314.204,-79.801],[-1306.92,-87.287],[-1296.586,-99.391],[-1292.01,-102.523]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.919,-6.362],[-1.248,-1.464],[-1.378,0.413],[-2.033,3.062],[-5.594,5.68],[0.485,0.931]],"o":[[-4.5,6.285],[-0.307,2.125],[0.957,1.123],[3.16,-0.947],[2.407,-3.626],[0.746,-0.757],[0,0]],"v":[[-1318.904,-104.372],[-1326.731,-88.842],[-1326.018,-82.795],[-1322.11,-81.942],[-1314.622,-89.224],[-1303.956,-101.036],[-1299.295,-104.04]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.838,-6.362],[-1.137,-1.464],[-1.256,0.413],[-1.853,3.062],[-6.073,3.736],[0.442,0.931]],"o":[[-6.365,4.614],[-0.28,2.125],[0.872,1.123],[2.881,-0.947],[2.194,-3.626],[0.867,-0.533],[0,0]],"v":[[-1314.175,-104.612],[-1324.43,-90.263],[-1323.78,-84.215],[-1320.217,-83.363],[-1313.39,-90.645],[-1300.374,-101.813],[-1294.723,-104.011]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[0.838,-6.362],[-1.137,-1.464],[-1.256,0.413],[-1.853,3.062],[-6.073,3.736],[0.442,0.931]],"o":[[-6.365,4.614],[-0.28,2.125],[0.872,1.123],[2.881,-0.947],[2.194,-3.626],[0.867,-0.533],[0,0]],"v":[[-1314.175,-104.612],[-1324.43,-90.263],[-1323.78,-84.215],[-1320.217,-83.363],[-1313.39,-90.645],[-1300.374,-101.813],[-1294.723,-104.011]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.56,-6.403],[-1.328,-1.391],[-1.352,0.49],[-1.857,3.172],[-5.266,5.985],[0.536,0.902]],"o":[[-4.139,6.528],[-0.187,2.139],[1.019,1.067],[3.102,-1.123],[2.199,-3.755],[0.702,-0.798],[0,0]],"v":[[-1311.214,-101.796],[-1318.155,-85.851],[-1317.102,-79.853],[-1313.153,-79.222],[-1306.086,-86.913],[-1296.102,-99.306],[-1291.617,-102.568]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[0.55,-6.404],[-1.33,-1.389],[-1.351,0.492],[-1.852,3.175],[-5.256,5.994],[0.538,0.901]],"o":[[-4.128,6.535],[-0.184,2.139],[1.02,1.065],[3.1,-1.128],[2.193,-3.759],[0.701,-0.799],[0,0]],"v":[[-1312.481,-103.861],[-1319.395,-87.905],[-1318.332,-81.908],[-1314.382,-81.284],[-1307.328,-88.987],[-1297.364,-101.397],[-1292.885,-104.666]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[0.838,-6.362],[-1.137,-1.464],[-1.256,0.413],[-1.853,3.062],[-6.073,3.736],[0.442,0.931]],"o":[[-6.365,4.614],[-0.28,2.125],[0.873,1.123],[2.881,-0.947],[2.195,-3.626],[0.867,-0.533],[0,0]],"v":[[-1309.056,-104.037],[-1319.312,-89.688],[-1318.661,-83.641],[-1315.099,-82.788],[-1308.272,-90.07],[-1295.255,-101.239],[-1289.604,-103.436]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[0.838,-6.362],[-1.137,-1.464],[-1.256,0.413],[-1.853,3.062],[-6.073,3.736],[0.442,0.931]],"o":[[-6.365,4.614],[-0.28,2.125],[0.873,1.123],[2.881,-0.947],[2.195,-3.626],[0.867,-0.533],[0,0]],"v":[[-1309.056,-104.037],[-1319.312,-89.688],[-1318.661,-83.641],[-1315.099,-82.788],[-1308.272,-90.07],[-1295.255,-101.239],[-1289.604,-103.436]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.743,-6.385],[-1.288,-1.428],[-1.366,0.451],[-1.947,3.117],[-5.434,5.833],[0.51,0.917]],"o":[[-4.323,6.408],[-0.248,2.133],[0.988,1.096],[3.133,-1.034],[2.305,-3.691],[0.725,-0.778],[0,0]],"v":[[-1309.293,-102.288],[-1316.687,-86.547],[-1315.805,-80.522],[-1311.876,-79.778],[-1304.592,-87.264],[-1294.258,-99.368],[-1289.682,-102.5]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[-0.418,-6.418],[-1.79,-1.189],[-1.503,0.676],[-1.644,3.403],[-1.947,4.029],[0.573,0.931]],"o":[[0.418,6.418],[0.14,2.144],[1.373,0.912],[3.446,-1.551],[1.947,-4.029],[0.476,-0.984],[0,0]],"v":[[-1303.011,-103.964],[-1301.758,-84.71],[-1299.518,-78.921],[-1294.784,-78.857],[-1287.793,-87.472],[-1281.952,-99.559],[-1281.58,-102.672]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.712,-6.854],[-0.489,-0.806],[-0.898,-0.188],[-2.445,1.689],[-2.394,7.522]],"o":[[-3.059,6.174],[-0.097,0.938],[0.476,0.784],[2.908,0.608],[6.495,-4.486],[0,0]],"v":[[-1330.445,-105.569],[-1336.162,-85.818],[-1335.829,-83.061],[-1333.548,-81.666],[-1325.256,-84.177],[-1311.419,-102.87]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.411,-6.868],[-0.435,-0.794],[-0.764,-0.167],[-2.017,1.745],[-9.281,4.937]],"o":[[-8.148,5.793],[-0.056,0.94],[0.423,0.773],[2.473,0.539],[5.36,-4.637],[0,0]],"v":[[-1334.831,-103.273],[-1344.292,-84.803],[-1343.934,-82.056],[-1341.969,-80.714],[-1335.037,-83.419],[-1318.056,-102.313]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.602,-6.854],[-0.413,-0.806],[-0.759,-0.188],[-2.065,1.688],[-9.415,4.677]],"o":[[-8.306,5.564],[-0.082,0.938],[0.402,0.784],[2.457,0.608],[5.487,-4.486],[0,0]],"v":[[-1342.078,-105.977],[-1352.047,-87.777],[-1351.766,-85.021],[-1349.839,-83.625],[-1342.835,-86.137],[-1325.336,-104.552]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[1.204,-6.441],[-0.377,-0.806],[-0.692,-0.188],[-1.883,1.688],[-8.583,4.677]],"o":[[-5.984,3.407],[-0.173,0.923],[0.366,0.784],[2.24,0.608],[5.002,-4.486],[0,0]],"v":[[-1330.117,-105.737],[-1342.47,-91.262],[-1343.222,-86.807],[-1341.465,-85.411],[-1335.08,-87.922],[-1314.854,-104.312]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[1.204,-6.441],[-0.377,-0.806],[-0.692,-0.188],[-1.883,1.688],[-8.583,4.677]],"o":[[-5.984,3.407],[-0.173,0.923],[0.366,0.784],[2.24,0.608],[5.002,-4.486],[0,0]],"v":[[-1330.117,-105.737],[-1342.47,-91.262],[-1343.222,-86.807],[-1341.465,-85.411],[-1335.08,-87.922],[-1314.854,-104.312]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.215,-6.877],[-0.458,-0.782],[-0.768,-0.145],[-1.967,1.802],[-9.136,5.2]],"o":[[-7.979,6.023],[-0.029,0.941],[0.445,0.76],[2.487,0.468],[5.226,-4.788],[0,0]],"v":[[-1334.441,-102.095],[-1343.371,-83.364],[-1342.935,-80.628],[-1340.933,-79.342],[-1334.081,-82.244],[-1317.646,-101.614]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[0.204,-6.877],[-0.459,-0.781],[-0.768,-0.143],[-1.964,1.805],[-9.128,5.215]],"o":[[-7.969,6.036],[-0.028,0.941],[0.447,0.76],[2.488,0.464],[5.218,-4.797],[0,0]],"v":[[-1332.516,-104.224],[-1341.414,-85.478],[-1340.974,-82.742],[-1338.969,-81.461],[-1332.122,-84.373],[-1315.72,-103.771]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[1.204,-6.441],[-0.377,-0.806],[-0.692,-0.188],[-1.883,1.688],[-8.583,4.677]],"o":[[-5.984,3.407],[-0.173,0.923],[0.366,0.784],[2.24,0.608],[5.002,-4.486],[0,0]],"v":[[-1324.999,-105.162],[-1337.352,-90.687],[-1338.104,-86.232],[-1336.347,-84.836],[-1329.961,-87.347],[-1309.736,-103.737]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[1.204,-6.441],[-0.377,-0.806],[-0.692,-0.188],[-1.883,1.688],[-8.583,4.677]],"o":[[-5.984,3.407],[-0.173,0.923],[0.366,0.784],[2.24,0.608],[5.002,-4.486],[0,0]],"v":[[-1324.999,-105.162],[-1337.352,-90.687],[-1338.104,-86.232],[-1336.347,-84.836],[-1329.961,-87.347],[-1309.736,-103.737]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.412,-6.868],[-0.435,-0.794],[-0.764,-0.167],[-2.017,1.745],[-9.281,4.937]],"o":[[-8.148,5.793],[-0.056,0.94],[0.423,0.773],[2.473,0.539],[5.36,-4.637],[0,0]],"v":[[-1329.972,-102.882],[-1339.433,-84.413],[-1339.076,-81.666],[-1337.111,-80.324],[-1330.179,-83.028],[-1313.198,-101.922]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[0.712,-6.854],[-0.489,-0.806],[-0.898,-0.188],[-2.445,1.689],[-2.394,7.522]],"o":[[-3.059,6.174],[-0.097,0.938],[0.476,0.784],[2.908,0.608],[6.495,-4.486],[0,0]],"v":[[-1330.445,-105.569],[-1336.162,-85.818],[-1335.829,-83.061],[-1333.548,-81.666],[-1325.256,-84.177],[-1311.419,-102.87]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.964705884457,0.549019634724,0.129411771894,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Head stripes","np":5,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[5.846,-2.085]],"o":[[-6.025,1.49],[0,0]],"v":[[-1395.712,19.525],[-1413.534,24.893]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[5.786,-2.247]],"o":[[-5.982,1.656],[0,0]],"v":[[-1388.584,24.31],[-1402.629,29.529]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[5.846,-2.085]],"o":[[-6.025,1.49],[0,0]],"v":[[-1399.349,20.065],[-1413.534,24.893]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[4.289,-2.085]],"o":[[-4.421,1.49],[0,0]],"v":[[-1385.704,20.439],[-1394.509,24.893]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[4.289,-2.085]],"o":[[-4.421,1.49],[0,0]],"v":[[-1385.704,20.439],[-1394.509,24.893]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[5.719,-2.411]],"o":[[-5.932,1.826],[0,0]],"v":[[-1384.533,26.968],[-1398.423,32.586]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[5.715,-2.421]],"o":[[-5.929,1.836],[0,0]],"v":[[-1385.583,25.026],[-1399.465,30.667]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[4.29,-2.085]],"o":[[-4.421,1.49],[0,0]],"v":[[-1380.585,21.014],[-1389.39,25.468]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[4.29,-2.085]],"o":[[-4.421,1.49],[0,0]],"v":[[-1380.585,21.014],[-1389.39,25.468]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[5.786,-2.247]],"o":[[-5.982,1.656],[0,0]],"v":[[-1388.584,24.31],[-1402.629,29.529]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[5.846,-2.085]],"o":[[-6.025,1.49],[0,0]],"v":[[-1395.712,19.525],[-1413.534,24.893]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[4.212,1.4]],"o":[[-4.212,-1.4],[0,0]],"v":[[-1398.483,3.866],[-1411.12,-0.335]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[3.891,1.293]],"o":[[-3.891,-1.293],[0,0]],"v":[[-1391.212,5.777],[-1401.905,2.09]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[3.854,1.4]],"o":[[-3.854,-1.4],[0,0]],"v":[[-1401.462,1.467],[-1412.049,-2.516]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[3.091,1.4]],"o":[[-3.091,-1.4],[0,0]],"v":[[-1386.509,3.184],[-1392.738,-0.335]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[3.091,1.4]],"o":[[-3.091,-1.4],[0,0]],"v":[[-1386.509,3.184],[-1392.738,-0.335]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[3.926,1.181]],"o":[[-3.926,-1.181],[0,0]],"v":[[-1387.689,8.519],[-1398.483,5.138]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[3.928,1.175]],"o":[[-3.928,-1.175],[0,0]],"v":[[-1388.77,6.582],[-1399.57,3.219]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[3.091,1.4]],"o":[[-3.091,-1.4],[0,0]],"v":[[-1381.39,3.759],[-1387.619,0.24]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[3.091,1.4]],"o":[[-3.091,-1.4],[0,0]],"v":[[-1381.39,3.759],[-1387.619,0.24]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[3.891,1.293]],"o":[[-3.891,-1.293],[0,0]],"v":[[-1391.212,5.777],[-1401.905,2.09]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[4.212,1.4]],"o":[[-4.212,-1.4],[0,0]],"v":[[-1398.483,3.866],[-1411.12,-0.335]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-13.475,-3.726]],"o":[[13.978,0.278],[0,0]],"v":[[-1228.81,33.984],[-1187.414,40.022]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-10.369,-3.44]],"o":[[10.656,-0.017],[0,0]],"v":[[-1242.375,30.226],[-1183.72,39.391]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-10.269,-3.726]],"o":[[10.653,0.278],[0,0]],"v":[[-1253.361,30.034],[-1194.982,40.823]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-10.269,-3.726]],"o":[[10.653,0.278],[0,0]],"v":[[-1259.581,29.459],[-1202.912,40.765]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-10.269,-3.726]],"o":[[10.653,0.278],[0,0]],"v":[[-1259.581,29.459],[-1202.912,40.765]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-10.463,-3.143]],"o":[[10.651,-0.321],[0,0]],"v":[[-1238.215,28.711],[-1179.322,36.199]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-10.468,-3.125]],"o":[[10.651,-0.339],[0,0]],"v":[[-1239.263,26.523],[-1180.357,33.912]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-10.27,-3.726]],"o":[[10.653,0.278],[0,0]],"v":[[-1254.463,30.033],[-1197.793,41.34]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-10.27,-3.726]],"o":[[10.653,0.278],[0,0]],"v":[[-1254.463,30.033],[-1197.793,41.34]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-10.369,-3.44]],"o":[[10.656,-0.017],[0,0]],"v":[[-1242.375,30.226],[-1183.72,39.391]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[-13.475,-3.726]],"o":[[13.978,0.278],[0,0]],"v":[[-1228.81,33.984],[-1187.414,40.022]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-13.841,4.238]],"o":[[13.095,-6.169],[0,0]],"v":[[-1226.817,23.281],[-1186.343,7.644]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-13.211,1.379]],"o":[[9.805,-6.443],[0,0]],"v":[[-1241.154,19.485],[-1184.571,4.848]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-13.244,1.012]],"o":[[9.98,-6.169],[0,0]],"v":[[-1251.842,19.331],[-1194.875,6.27]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-13.244,1.012]],"o":[[9.98,-6.169],[0,0]],"v":[[-1258.063,18.755],[-1202.804,6.212]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-13.244,1.012]],"o":[[9.98,-6.169],[0,0]],"v":[[-1258.063,18.755],[-1202.804,6.212]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-13.166,1.755]],"o":[[9.617,-6.72],[0,0]],"v":[[-1237.301,17.939],[-1181.158,1.695]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-13.164,1.777]],"o":[[9.606,-6.736],[0,0]],"v":[[-1238.366,15.75],[-1182.251,-0.589]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-13.244,1.012]],"o":[[9.98,-6.169],[0,0]],"v":[[-1252.944,19.33],[-1197.686,6.787]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-13.244,1.012]],"o":[[9.98,-6.169],[0,0]],"v":[[-1252.944,19.33],[-1197.686,6.787]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-13.211,1.379]],"o":[[9.805,-6.443],[0,0]],"v":[[-1241.154,19.485],[-1184.571,4.848]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[-13.841,4.238]],"o":[[13.095,-6.169],[0,0]],"v":[[-1226.817,23.281],[-1186.343,7.644]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Whiskers","np":5,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.191,-6.555]],"o":[[-0.191,6.555],[0,0]],"v":[[-1317.113,14.782],[-1317.64,34.805]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.308,-7.153]],"o":[[-2.949,5.557],[0,0]],"v":[[-1355.016,8.906],[-1358.548,29.292]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.109,-7.159]],"o":[[-3.102,5.473],[0,0]],"v":[[-1365.367,5.599],[-1369.463,25.879]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.668,-7.129]],"o":[[-4.044,4.834],[0,0]],"v":[[-1367.168,2.167],[-1373.923,27.665]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.668,-7.129]],"o":[[-4.044,4.834],[0,0]],"v":[[-1367.168,2.167],[-1373.923,27.665]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.512,-7.141]],"o":[[-2.789,5.639],[0,0]],"v":[[-1351.418,10.614],[-1354.367,31.092]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.524,-7.141]],"o":[[-2.779,5.644],[0,0]],"v":[[-1352.496,8.616],[-1355.411,29.099]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-0.668,-7.129]],"o":[[-4.044,4.834],[0,0]],"v":[[-1362.05,2.742],[-1368.805,28.24]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-0.668,-7.129]],"o":[[-4.044,4.834],[0,0]],"v":[[-1362.05,2.742],[-1368.805,28.24]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.308,-7.153]],"o":[[-2.949,5.557],[0,0]],"v":[[-1355.016,8.906],[-1358.548,29.292]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[0.191,-6.555]],"o":[[-0.191,6.555],[0,0]],"v":[[-1317.113,14.782],[-1317.64,34.805]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Line","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[1.697,3.601],[-0.052,0.286],[-0.587,0.063],[-4.056,-1.044],[-0.413,-0.714],[0.686,-0.936],[3.421,-1.344]],"o":[[-3.617,-1.661],[-0.124,-0.263],[0.105,-0.581],[4.164,-0.448],[0.799,0.206],[0.581,1.005],[-2.173,2.964],[0,0]],"v":[[-1316.287,14.381],[-1323.567,5.244],[-1323.767,4.41],[-1322.354,3.568],[-1309.89,4.471],[-1307.809,5.683],[-1308.529,8.885],[-1317.149,15.523]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[1.567,3.558],[-0.037,0.287],[-0.506,0.077],[-3.703,-1.528],[-0.377,-0.704],[2.238,-1.428],[2.699,-2.496]],"o":[[-3.174,-1.573],[-0.114,-0.26],[0.075,-0.583],[3.589,-0.548],[0.667,0.275],[0.53,0.99],[-3.686,2.353],[0,0]],"v":[[-1354.313,8.485],[-1360.726,-0.049],[-1360.435,-1.465],[-1358.471,-2.644],[-1346.413,-0.474],[-1344.58,0.687],[-1347.28,3.064],[-1355.027,9.648]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[1.468,3.601],[-0.045,0.286],[-0.508,0.063],[-3.659,-1.63],[-0.357,-0.714],[2.276,-1.366],[2.767,-2.421]],"o":[[-3.129,-1.661],[-0.107,-0.263],[0.091,-0.581],[3.602,-0.448],[0.659,0.294],[0.502,1.005],[-3.75,2.25],[0,0]],"v":[[-1364.652,5.198],[-1370.826,-3.511],[-1370.496,-4.919],[-1368.5,-6.043],[-1356.507,-3.539],[-1354.707,-2.328],[-1357.472,-0.027],[-1365.398,6.34]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.015,3.977],[-0.033,0.286],[-0.373,0.063],[-2.574,-1.044],[-0.262,-0.715],[0.435,-0.936],[2.171,-1.344]],"o":[[-2.296,-1.661],[-0.001,-0.274],[0.067,-0.581],[2.643,-0.448],[0.507,0.206],[0.369,1.005],[-1.379,2.964],[0,0]],"v":[[-1366.855,2.054],[-1370.781,-6.946],[-1370.907,-7.78],[-1368.811,-8.296],[-1359.443,-6.074],[-1358.123,-4.862],[-1359.024,-2.079],[-1367.402,3.196]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[0.015,3.977],[-0.033,0.286],[-0.373,0.063],[-2.574,-1.044],[-0.262,-0.715],[0.435,-0.936],[2.171,-1.344]],"o":[[-2.296,-1.661],[-0.001,-0.274],[0.067,-0.581],[2.643,-0.448],[0.507,0.206],[0.369,1.005],[-1.379,2.964],[0,0]],"v":[[-1366.855,2.054],[-1370.781,-6.946],[-1370.907,-7.78],[-1368.811,-8.296],[-1359.443,-6.074],[-1358.123,-4.862],[-1359.024,-2.079],[-1367.402,3.196]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[1.668,3.512],[-0.029,0.288],[-0.503,0.092],[-3.745,-1.422],[-0.397,-0.693],[2.196,-1.492],[2.627,-2.572]],"o":[[-3.218,-1.482],[-0.122,-0.256],[0.058,-0.585],[3.571,-0.65],[0.675,0.256],[0.558,0.975],[-3.618,2.457],[0,0]],"v":[[-1350.727,10.173],[-1357.381,1.825],[-1357.13,0.401],[-1355.201,-0.833],[-1343.086,0.992],[-1341.221,2.1],[-1343.852,4.553],[-1351.407,11.355]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[1.674,3.509],[-0.028,0.288],[-0.503,0.092],[-3.747,-1.416],[-0.398,-0.693],[2.193,-1.495],[2.622,-2.577]],"o":[[-3.22,-1.477],[-0.122,-0.256],[0.057,-0.585],[3.57,-0.656],[0.675,0.255],[0.56,0.974],[-3.614,2.463],[0,0]],"v":[[-1351.806,8.174],[-1358.473,-0.163],[-1358.225,-1.588],[-1356.298,-2.825],[-1344.18,-1.02],[-1342.313,0.085],[-1344.94,2.543],[-1352.484,9.358]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[0.015,3.977],[-0.033,0.286],[-0.373,0.063],[-2.574,-1.044],[-0.262,-0.715],[0.435,-0.936],[2.171,-1.344]],"o":[[-2.296,-1.661],[-0.001,-0.274],[0.067,-0.581],[2.643,-0.448],[0.507,0.206],[0.369,1.005],[-1.379,2.964],[0,0]],"v":[[-1361.736,2.628],[-1365.663,-6.371],[-1365.789,-7.205],[-1363.692,-7.721],[-1354.325,-5.499],[-1353.004,-4.287],[-1353.906,-1.504],[-1362.283,3.771]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[0.015,3.977],[-0.033,0.286],[-0.373,0.063],[-2.574,-1.044],[-0.262,-0.715],[0.435,-0.936],[2.171,-1.344]],"o":[[-2.296,-1.661],[-0.001,-0.274],[0.067,-0.581],[2.643,-0.448],[0.507,0.206],[0.369,1.005],[-1.379,2.964],[0,0]],"v":[[-1361.736,2.628],[-1365.663,-6.371],[-1365.789,-7.205],[-1363.692,-7.721],[-1354.325,-5.499],[-1353.004,-4.287],[-1353.906,-1.504],[-1362.283,3.771]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[1.567,3.558],[-0.037,0.287],[-0.506,0.077],[-3.703,-1.528],[-0.377,-0.704],[2.238,-1.428],[2.699,-2.496]],"o":[[-3.174,-1.573],[-0.114,-0.26],[0.075,-0.583],[3.589,-0.548],[0.667,0.275],[0.53,0.99],[-3.686,2.353],[0,0]],"v":[[-1354.313,8.485],[-1360.726,-0.049],[-1360.435,-1.465],[-1358.471,-2.644],[-1346.413,-0.474],[-1344.58,0.687],[-1347.28,3.064],[-1355.027,9.648]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[1.697,3.601],[-0.052,0.286],[-0.587,0.063],[-4.056,-1.044],[-0.413,-0.714],[0.686,-0.936],[3.421,-1.344]],"o":[[-3.617,-1.661],[-0.124,-0.263],[0.105,-0.581],[4.164,-0.448],[0.799,0.206],[0.581,1.005],[-2.173,2.964],[0,0]],"v":[[-1316.287,14.381],[-1323.567,5.244],[-1323.767,4.41],[-1322.354,3.568],[-1309.89,4.471],[-1307.809,5.683],[-1308.529,8.885],[-1317.149,15.523]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.101960793138,0.254901975393,0.780392229557,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Nose","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.52,-0.118],[0.609,-1.647],[-0.496,-1.37],[-2.43,0.033],[-2.43,-0.083],[-0.858,0.089],[1.893,0.501]],"o":[[-3.014,0.064],[-0.505,1.367],[0.473,1.306],[2.353,-0.032],[2.633,0.09],[2.086,-0.216],[-1.926,-0.51]],"v":[[-1317,36.911],[-1326.038,38.789],[-1325.242,40.285],[-1318.575,39.775],[-1313.078,39.871],[-1308.515,40.702],[-1307.831,38.231]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.737,0.616],[1.764,-1.793],[-1.079,-0.948],[-2.466,0.193],[-2.088,-0.376],[-0.768,0.34],[0.799,1.007]],"o":[[-2.587,-0.336],[-1.006,1.023],[0.818,0.719],[2.814,-0.221],[2.484,0.447],[2.156,-0.954],[-1.227,-1.545]],"v":[[-1359.165,31.313],[-1366.208,32.681],[-1365.974,37.123],[-1361.092,38.178],[-1355.147,37.095],[-1350.499,38.629],[-1348.246,34.885]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.986,0.239],[1.551,-1.42],[-1.358,-0.466],[-3.367,-0.122],[-2.041,-0.578],[-0.768,0.34],[1.159,0.557]],"o":[[-2.6,-0.208],[-2.691,2.464],[4.01,1.375],[3.027,0.11],[2.912,0.824],[2.156,-0.954],[-2.782,-1.337]],"v":[[-1368.759,26.382],[-1374.669,27.423],[-1375.678,33.183],[-1369.224,33.185],[-1363.958,33.72],[-1359.011,33.926],[-1359.808,28.531]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[3.039,0.77],[1.032,0.071],[-0.047,-1.434],[-1.055,-1.23],[-1.43,-0.252],[-1.997,1.785],[0.431,1.926]],"o":[[-1.781,-0.451],[-1.302,-0.089],[0.045,1.367],[0.775,0.903],[1.485,0.262],[0.725,-0.517],[-0.343,-1.533]],"v":[[-1373.259,27.627],[-1376.026,27.517],[-1378.557,30.194],[-1377.647,33.392],[-1374.514,34.871],[-1369.844,33.457],[-1369.411,30.609]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[1.23,0.959],[1.596,0.156],[1.011,-0.856],[-0.734,0.044],[-1.4,-0.385],[-0.536,-0.217],[-0.543,1.897]],"o":[[-1.449,-1.13],[-1.299,-0.127],[-1.044,0.884],[1.685,-0.045],[1.339,0.368],[2.356,0.953],[0.543,-1.897]],"v":[[-1367.968,29.078],[-1374.19,27.193],[-1378.757,28.139],[-1377.968,30.481],[-1374.306,30.668],[-1370.042,33.245],[-1366.329,32.12]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[4.753,0.481],[1.29,-0.176],[-0.502,-0.744],[-2.096,-0.292],[-2.12,0.065],[-1.091,0.797],[1.334,0.529]],"o":[[-2.595,-0.263],[-1.422,0.194],[0.708,1.171],[1.83,0.255],[1.448,-0.044],[1.021,-0.746],[-1.835,-0.727]],"v":[[-1354.926,33.129],[-1359.094,33.02],[-1359.932,35.681],[-1355.191,37.159],[-1351.54,37.43],[-1347.355,36.921],[-1348.166,34.005]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[4.754,0.473],[0.726,-1.569],[-1.409,-0.277],[-1.982,-0.742],[-2.106,-0.25],[-2.402,-0.196],[1.695,0.581]],"o":[[-2.596,-0.258],[-0.603,1.302],[1.636,0.321],[1.984,0.743],[1.576,0.187],[1.933,0.158],[-1.867,-0.64]],"v":[[-1355.966,31.137],[-1361.863,31.407],[-1360.169,33.115],[-1356.963,33.948],[-1353.673,34.64],[-1349.198,35.567],[-1347.975,33.739]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[2.244,1.028],[1.466,-0.08],[1.112,-0.907],[-1.595,-1.381],[-1.748,0.395],[-0.575,-0.054],[-0.487,1.912]],"o":[[-1.671,-0.765],[-1.303,0.071],[-1.86,1.516],[1.219,1.055],[1.355,-0.306],[1.667,0.157],[0.487,-1.912]],"v":[[-1363.559,29.133],[-1369.36,27.851],[-1373.816,29.097],[-1373.399,33.896],[-1369.324,33.562],[-1365.078,33.31],[-1360.964,33.037]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[2.244,1.028],[1.466,-0.08],[1.112,-0.907],[-1.595,-1.381],[-1.748,0.395],[-0.575,-0.054],[-0.487,1.912]],"o":[[-1.671,-0.765],[-1.303,0.071],[-1.86,1.516],[1.219,1.055],[1.355,-0.306],[1.667,0.157],[0.487,-1.912]],"v":[[-1363.559,29.133],[-1369.36,27.851],[-1373.816,29.097],[-1373.399,33.896],[-1369.324,33.562],[-1365.078,33.31],[-1360.964,33.037]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.086,0.358],[0.773,-1.546],[-1.422,-0.201],[-1.996,-0.264],[-2.119,-0.103],[-0.818,-0.189],[1.292,0.579]],"o":[[-2.571,-0.442],[-0.642,1.284],[1.688,0.238],[2.1,0.278],[1.811,0.088],[2.247,0.519],[-1.801,-0.807]],"v":[[-1359.165,31.313],[-1367.47,32.847],[-1365.479,35.675],[-1361.38,34.959],[-1356.591,35.325],[-1353.547,36.067],[-1352.678,33.273]]}],"t":420},{"s":[{"c":true,"i":[[5.52,-0.118],[0.609,-1.647],[-0.496,-1.37],[-2.43,0.033],[-2.43,-0.083],[-0.858,0.089],[1.893,0.501]],"o":[[-3.014,0.064],[-0.505,1.367],[0.473,1.306],[2.353,-0.032],[2.633,0.09],[2.086,-0.216],[-1.926,-0.51]],"v":[[-1317,36.911],[-1326.038,38.789],[-1325.242,40.285],[-1318.575,39.775],[-1313.078,39.871],[-1308.515,40.702],[-1307.831,38.231]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.101960793138,0.254901975393,0.780392229557,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Mouth","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[1.251,3.984],[-0.876,4.083],[-6.114,8.507],[-7.356,1.577],[-5.068,-3.687],[-2.913,-5.549],[0.386,-12.057],[4.059,-2.456],[3.007,0.111],[15.477,2.937]],"o":[[-4.148,-0.479],[-1.251,-3.984],[2.198,-10.243],[4.391,-6.11],[6.128,-1.314],[5.068,3.687],[5.607,10.682],[-0.152,4.742],[-2.574,1.558],[-15.742,-0.579],[0,0]],"v":[[-1342.869,54.095],[-1351.574,46.065],[-1351.489,33.68],[-1338.442,5.333],[-1321.075,-8.251],[-1303.352,-3.894],[-1291.624,10.587],[-1283.615,45.471],[-1288.861,58.052],[-1297.639,59.479],[-1344.556,54.195]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[2.898,2.893],[-0.535,9.729],[-4.386,8.632],[-5.518,1.731],[-3.934,-3.579],[-2.356,-5.486],[-0.043,-12.061],[3.001,-2.54],[2.277,0.048],[11.783,2.611]],"o":[[-3.15,-0.392],[-3.818,-3.812],[0.756,-13.749],[3.15,-6.199],[4.597,-1.442],[3.934,3.579],[4.535,10.56],[0.017,4.743],[-1.903,1.611],[-11.918,-0.249],[0,0]],"v":[[-1366.278,49.812],[-1374.585,45.228],[-1379.114,28.737],[-1369.802,-0.549],[-1353.556,-13.665],[-1338.009,-8.984],[-1328.741,5.246],[-1321.718,39.949],[-1325.335,52.634],[-1331.932,54.245],[-1367.551,49.947]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[2.816,2.972],[-0.805,9.71],[-4.624,8.507],[-5.564,1.577],[-3.833,-3.687],[-2.203,-5.549],[0.292,-12.057],[3.07,-2.456],[2.274,0.111],[11.706,2.937]],"o":[[-3.137,-0.479],[-3.711,-3.916],[1.137,-13.723],[3.321,-6.11],[4.635,-1.314],[3.833,3.687],[4.24,10.682],[-0.115,4.742],[-1.947,1.558],[-11.906,-0.579],[0,0]],"v":[[-1377.759,46.176],[-1385.935,41.364],[-1390.005,24.753],[-1379.885,-4.263],[-1363.281,-16.923],[-1347.87,-11.812],[-1339,2.669],[-1332.943,37.553],[-1336.91,50.133],[-1343.55,51.56],[-1379.036,46.277]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[2.067,2.972],[-0.59,9.71],[-5.018,8.052],[-5.057,0.831],[-4.613,-2.647],[-2.203,-5.549],[2.679,-13.921],[4.069,-2.151],[2.274,0.111],[11.706,2.937]],"o":[[-3.137,-0.479],[-2.723,-3.916],[0.834,-13.723],[3.479,-5.582],[3.598,-0.591],[4.503,2.584],[4.24,10.682],[-0.896,4.658],[-2.205,1.165],[-11.906,-0.579],[0,0]],"v":[[-1363.579,49.488],[-1376.265,40.778],[-1383.859,22.449],[-1376.428,-6.12],[-1359.642,-17.509],[-1349.243,-13.262],[-1339.778,0.106],[-1334.949,36.967],[-1342.977,50.556],[-1349.487,52.41],[-1364.856,49.588]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[2.067,2.972],[-0.59,9.71],[-5.018,8.052],[-5.057,0.831],[-4.613,-2.647],[-2.203,-5.549],[2.679,-13.921],[4.069,-2.151],[2.274,0.111],[11.706,2.937]],"o":[[-3.137,-0.479],[-2.723,-3.916],[0.834,-13.723],[3.479,-5.582],[3.598,-0.591],[4.503,2.584],[4.24,10.682],[-0.896,4.658],[-2.205,1.165],[-11.906,-0.579],[0,0]],"v":[[-1363.579,49.488],[-1376.265,40.778],[-1383.859,22.449],[-1376.428,-6.12],[-1359.642,-17.509],[-1349.243,-13.262],[-1339.778,0.106],[-1334.949,36.967],[-1342.977,50.556],[-1349.487,52.41],[-1364.856,49.588]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[2.979,2.809],[-0.257,9.74],[-4.138,8.754],[-5.466,1.888],[-4.034,-3.465],[-2.511,-5.416],[-0.388,-12.055],[2.927,-2.625],[2.277,-0.017],[11.853,2.273]],"o":[[-3.159,-0.302],[-3.926,-3.701],[0.364,-13.765],[2.972,-6.287],[4.553,-1.572],[4.034,3.465],[4.834,10.426],[0.152,4.741],[-1.857,1.665],[-11.92,0.091],[0,0]],"v":[[-1361.509,51.824],[-1369.942,47.479],[-1374.94,31.123],[-1366.468,1.585],[-1350.602,-11.99],[-1334.928,-7.754],[-1325.258,6.205],[-1317.248,40.693],[-1320.501,53.477],[-1327.05,55.275],[-1362.777,51.996]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[2.984,2.804],[-0.241,9.74],[-4.124,8.761],[-5.463,1.897],[-4.04,-3.458],[-2.521,-5.412],[-0.408,-12.054],[2.923,-2.63],[2.277,-0.021],[11.856,2.254]],"o":[[-3.16,-0.297],[-3.932,-3.695],[0.341,-13.765],[2.961,-6.292],[4.551,-1.58],[4.04,3.458],[4.852,10.418],[0.16,4.741],[-1.854,1.668],[-11.92,0.111],[0,0]],"v":[[-1362.517,49.843],[-1370.958,45.512],[-1375.983,29.165],[-1367.561,-0.388],[-1351.718,-13.989],[-1336.037,-9.78],[-1326.343,4.164],[-1318.275,38.638],[-1321.508,51.427],[-1328.053,53.236],[-1363.786,50.017]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[2.067,2.972],[-0.59,9.71],[-5.018,8.052],[-5.057,0.831],[-4.613,-2.647],[-2.203,-5.549],[2.679,-13.921],[4.069,-2.151],[2.274,0.111],[11.706,2.937]],"o":[[-3.137,-0.479],[-2.723,-3.916],[0.834,-13.723],[3.479,-5.582],[3.598,-0.591],[4.503,2.584],[4.24,10.682],[-0.896,4.658],[-2.205,1.165],[-11.906,-0.579],[0,0]],"v":[[-1358.461,50.063],[-1371.146,41.353],[-1378.74,23.024],[-1371.31,-5.545],[-1354.524,-16.934],[-1344.125,-12.687],[-1334.659,0.68],[-1329.83,37.542],[-1337.858,51.13],[-1344.369,52.985],[-1359.737,50.163]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[2.067,2.972],[-0.59,9.71],[-5.018,8.052],[-5.057,0.831],[-4.613,-2.647],[-2.203,-5.549],[2.679,-13.921],[4.069,-2.151],[2.274,0.111],[11.706,2.937]],"o":[[-3.137,-0.479],[-2.723,-3.916],[0.834,-13.723],[3.479,-5.582],[3.598,-0.591],[4.503,2.584],[4.24,10.682],[-0.896,4.658],[-2.205,1.165],[-11.906,-0.579],[0,0]],"v":[[-1358.461,50.063],[-1371.146,41.353],[-1378.74,23.024],[-1371.31,-5.545],[-1354.524,-16.934],[-1344.125,-12.687],[-1334.659,0.68],[-1329.83,37.542],[-1337.858,51.13],[-1344.369,52.985],[-1359.737,50.163]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[2.898,2.893],[-0.535,9.729],[-4.386,8.632],[-5.518,1.731],[-3.934,-3.579],[-2.356,-5.486],[-0.043,-12.061],[3.001,-2.54],[2.277,0.048],[11.783,2.611]],"o":[[-3.15,-0.392],[-3.818,-3.812],[0.756,-13.749],[3.15,-6.199],[4.597,-1.442],[3.934,3.579],[4.535,10.56],[0.017,4.743],[-1.903,1.611],[-11.918,-0.249],[0,0]],"v":[[-1366.278,49.812],[-1374.585,45.228],[-1379.114,28.737],[-1369.802,-0.549],[-1353.556,-13.665],[-1338.009,-8.984],[-1328.741,5.246],[-1321.718,39.949],[-1325.335,52.634],[-1331.932,54.245],[-1367.551,49.947]]}],"t":420},{"s":[{"c":false,"i":[[0,0],[1.251,3.984],[-0.876,4.083],[-6.114,8.507],[-7.356,1.577],[-5.068,-3.687],[-2.913,-5.549],[0.386,-12.057],[4.059,-2.456],[3.007,0.111],[15.477,2.937]],"o":[[-4.148,-0.479],[-1.251,-3.984],[2.198,-10.243],[4.391,-6.11],[6.128,-1.314],[5.068,3.687],[5.607,10.682],[-0.152,4.742],[-2.574,1.558],[-15.742,-0.579],[0,0]],"v":[[-1342.869,54.095],[-1351.574,46.065],[-1351.489,33.68],[-1338.442,5.333],[-1321.075,-8.251],[-1303.352,-3.894],[-1291.624,10.587],[-1283.615,45.471],[-1288.861,58.052],[-1297.639,59.479],[-1344.556,54.195]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.933333337307,0.933333337307,0.933333337307,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Snout","np":3,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-1328.447,25.019]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1328.447,25.019]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Snout","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.767},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.725,3.062],[-2.94,1.12],[-1.102,-0.247],[-0.956,-1.446],[0.4,-2.948],[2.899,-0.67],[0.293,2.961]],"o":[[-2.126,-2.32],[0.725,-3.062],[1.055,-0.402],[1.692,0.378],[1.64,2.482],[-0.4,2.948],[-2.899,0.67],[0,0]],"v":[[-1265.202,-2.882],[-1267.487,-11.66],[-1261.509,-18.481],[-1258.191,-18.852],[-1254.268,-15.64],[-1251.975,-7.214],[-1257.364,-0.783],[-1265.218,-4.347]]}],"t":9},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.233},"s":[{"c":false,"i":[[0,0],[-0.53,3.076],[-2.448,1.184],[-0.935,-0.222],[-0.844,-1.425],[0.26,-2.956],[2.426,-0.733],[0.325,2.953]],"o":[[-1.853,-2.272],[0.53,-3.076],[0.879,-0.425],[1.436,0.341],[1.448,2.445],[-0.26,2.956],[-2.425,0.733],[0,0]],"v":[[-1315.748,2.079],[-1317.904,-6.645],[-1313.046,-13.595],[-1310.259,-14.038],[-1306.869,-10.913],[-1304.714,-2.54],[-1309.087,4.006],[-1315.801,0.616]]}],"t":19},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.53,3.076],[-2.448,1.184],[-0.935,-0.222],[-0.844,-1.425],[0.26,-2.956],[2.426,-0.733],[0.325,2.953]],"o":[[-1.853,-2.272],[0.53,-3.076],[0.879,-0.425],[1.436,0.341],[1.448,2.445],[-0.26,2.956],[-2.425,0.733],[0,0]],"v":[[-1323.984,0.356],[-1326.141,-8.368],[-1321.282,-15.318],[-1318.496,-15.762],[-1315.105,-12.637],[-1312.951,-4.264],[-1317.324,2.283],[-1324.037,-1.108]]}],"t":73},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.519,3.077],[-2.421,1.188],[-0.925,-0.221],[-0.837,-1.423],[0.252,-2.956],[2.399,-0.736],[0.327,2.953]],"o":[[-1.837,-2.27],[0.519,-3.077],[0.869,-0.426],[1.421,0.339],[1.437,2.443],[-0.252,2.956],[-2.399,0.736],[0,0]],"v":[[-1328.084,-12.224],[-1330.233,-20.945],[-1325.437,-27.902],[-1322.68,-28.35],[-1319.32,-25.23],[-1317.173,-16.86],[-1321.489,-10.307],[-1328.138,-13.688]]}],"t":77},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.561,3.07],[-2.436,1.155],[-0.922,-0.234],[-0.817,-1.435],[0.292,-2.952],[2.408,-0.703],[0.286,2.957]],"o":[[-1.806,-2.294],[0.561,-3.07],[0.874,-0.414],[1.416,0.359],[1.403,2.462],[-0.292,2.952],[-2.408,0.703],[0,0]],"v":[[-1339.133,-9.096],[-1341.162,-17.845],[-1336.273,-24.735],[-1333.51,-25.145],[-1330.193,-21.98],[-1328.161,-13.582],[-1332.566,-7.089],[-1339.167,-10.56]]}],"t":113},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1329.609,18.859],[-1331.515,10.081],[-1326.529,3.26],[-1323.761,2.889],[-1320.488,6.101],[-1318.574,14.527],[-1323.07,20.958],[-1329.623,17.394]]}],"t":120},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1329.609,18.859],[-1331.515,10.081],[-1326.529,3.26],[-1323.761,2.889],[-1320.488,6.101],[-1318.574,14.527],[-1323.07,20.958],[-1329.623,17.394]]}],"t":128},{"i":{"x":0,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1337.565,8.259],[-1339.471,-0.518],[-1334.485,-7.339],[-1331.717,-7.71],[-1328.444,-4.498],[-1326.531,3.928],[-1331.026,10.359],[-1337.579,6.795]]}],"t":143},{"i":{"x":0.833,"y":0.727},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1339.393,-1.863],[-1341.299,-10.64],[-1336.313,-17.462],[-1333.545,-17.833],[-1330.272,-14.621],[-1328.358,-6.194],[-1332.854,0.237],[-1339.407,-3.328]]}],"t":160},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.273},"s":[{"c":false,"i":[[0,0],[-0.604,0.376],[-2.453,0.138],[-0.919,-0.03],[-0.797,-0.178],[0.334,-0.362],[2.418,-0.082],[0.245,0.364]],"o":[[-1.773,-0.285],[0.604,-0.376],[0.88,-0.049],[1.411,0.047],[1.368,0.305],[-0.334,0.362],[-2.418,0.082],[0,0]],"v":[[-1338.469,-17.7],[-1340.375,-18.779],[-1335.388,-19.617],[-1332.62,-19.663],[-1329.348,-19.268],[-1327.434,-18.232],[-1331.93,-17.442],[-1338.483,-17.88]]}],"t":163.111},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1339.393,-1.863],[-1341.299,-10.64],[-1336.313,-17.462],[-1333.545,-17.833],[-1330.272,-14.621],[-1328.358,-6.194],[-1332.854,0.237],[-1339.407,-3.328]]}],"t":171},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1339.393,-1.863],[-1341.299,-10.64],[-1336.313,-17.462],[-1333.545,-17.833],[-1330.272,-14.621],[-1328.358,-6.194],[-1332.854,0.237],[-1339.407,-3.328]]}],"t":187},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1336.846,11.722],[-1338.752,2.945],[-1333.766,-3.876],[-1330.997,-4.247],[-1327.725,-1.035],[-1325.811,7.391],[-1330.307,13.822],[-1336.86,10.258]]}],"t":193},{"i":{"x":0,"y":0},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1336.846,11.722],[-1338.752,2.945],[-1333.766,-3.876],[-1330.997,-4.247],[-1327.725,-1.035],[-1325.811,7.391],[-1330.307,13.822],[-1336.86,10.258]]}],"t":203},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.444,3.089],[-2.391,1.247],[-0.93,-0.198],[-0.872,-1.402],[0.179,-2.961],[2.38,-0.795],[0.399,2.943]],"o":[[-1.892,-2.224],[0.443,-3.089],[0.858,-0.447],[1.429,0.304],[1.496,2.407],[-0.179,2.961],[-2.379,0.795],[0,0]],"v":[[-1320.019,-18.701],[-1322.38,-27.366],[-1317.758,-34.438],[-1315.013,-34.953],[-1311.578,-31.917],[-1309.226,-23.603],[-1313.38,-16.947],[-1320.109,-20.163]]}],"t":214},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.444,3.089],[-2.391,1.247],[-0.93,-0.198],[-0.872,-1.402],[0.179,-2.961],[2.38,-0.795],[0.399,2.943]],"o":[[-1.892,-2.224],[0.443,-3.089],[0.858,-0.447],[1.429,0.304],[1.496,2.407],[-0.179,2.961],[-2.379,0.795],[0,0]],"v":[[-1297.984,-21.208],[-1300.345,-29.873],[-1295.723,-36.945],[-1292.978,-37.46],[-1289.542,-34.424],[-1287.191,-26.11],[-1291.344,-19.454],[-1298.074,-22.67]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.444,3.089],[-2.391,1.247],[-0.93,-0.198],[-0.872,-1.402],[0.179,-2.961],[2.38,-0.795],[0.399,2.943]],"o":[[-1.892,-2.224],[0.443,-3.089],[0.858,-0.447],[1.429,0.304],[1.496,2.407],[-0.179,2.961],[-2.379,0.795],[0,0]],"v":[[-1302.516,-23.194],[-1304.878,-31.859],[-1300.255,-38.931],[-1297.51,-39.446],[-1294.075,-36.41],[-1291.724,-28.096],[-1295.877,-21.44],[-1302.606,-24.656]]}],"t":296},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1344.909,-22.774],[-1346.815,-31.551],[-1341.829,-38.373],[-1339.061,-38.744],[-1335.788,-35.532],[-1333.874,-27.106],[-1338.37,-20.675],[-1344.923,-24.239]]}],"t":312},{"i":{"x":0.25,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1344.909,-22.774],[-1346.815,-31.551],[-1341.829,-38.373],[-1339.061,-38.744],[-1335.788,-35.532],[-1333.874,-27.106],[-1338.37,-20.675],[-1344.923,-24.239]]}],"t":366},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.431,3.091],[-2.386,1.257],[-0.931,-0.194],[-0.877,-1.399],[0.167,-2.962],[2.377,-0.805],[0.411,2.942]],"o":[[-1.901,-2.216],[0.431,-3.091],[0.856,-0.451],[1.43,0.299],[1.506,2.401],[-0.167,2.962],[-2.376,0.805],[0,0]],"v":[[-1334.779,4.666],[-1337.176,-3.99],[-1332.581,-11.081],[-1329.838,-11.607],[-1326.39,-8.584],[-1324.005,-0.279],[-1328.132,6.394],[-1334.875,3.205]]}],"t":371},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1333.045,3.371],[-1334.952,-5.407],[-1329.965,-12.228],[-1327.197,-12.599],[-1323.924,-9.387],[-1322.011,-0.961],[-1326.506,5.47],[-1333.059,1.906]]}],"t":384},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1333.651,8.8],[-1335.557,0.023],[-1330.571,-6.799],[-1327.803,-7.169],[-1324.53,-3.958],[-1322.616,4.469],[-1327.112,10.9],[-1333.665,7.336]]}],"t":403},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.333},"s":[{"c":false,"i":[[0,0],[-0.55,0.581],[-2.422,0.431],[-0.919,0.048],[-0.818,-0.169],[0.283,-0.535],[2.396,-0.35],[0.293,0.481]],"o":[[-1.804,-0.222],[0.55,-0.581],[0.869,-0.154],[1.411,-0.073],[1.403,0.29],[-0.283,0.535],[-2.396,0.35],[0,0]],"v":[[-1317.214,-13.937],[-1319.258,-15.248],[-1314.41,-16.898],[-1311.661,-17.231],[-1308.35,-17.003],[-1306.305,-15.753],[-1310.672,-14.217],[-1317.253,-14.185]]}],"t":404},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.333},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1317.286,-1.55],[-1319.192,-10.327],[-1314.205,-17.149],[-1311.437,-17.52],[-1308.165,-14.308],[-1306.251,-5.881],[-1310.747,0.549],[-1317.3,-3.015]]}],"t":405},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.333},"s":[{"c":false,"i":[[0,0],[-0.605,3.062],[-2.453,1.12],[-0.919,-0.247],[-0.797,-1.446],[0.334,-2.948],[2.418,-0.67],[0.245,2.961]],"o":[[-1.773,-2.32],[0.604,-3.062],[0.88,-0.402],[1.411,0.378],[1.368,2.482],[-0.334,2.948],[-2.418,0.67],[0,0]],"v":[[-1317.286,-1.55],[-1319.192,-10.327],[-1314.205,-17.149],[-1311.437,-17.52],[-1308.165,-14.308],[-1306.251,-5.881],[-1310.747,0.549],[-1317.3,-3.015]]}],"t":410},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.519,3.077],[-2.421,1.188],[-0.926,-0.221],[-0.837,-1.423],[0.252,-2.956],[2.399,-0.736],[0.327,2.953]],"o":[[-1.837,-2.27],[0.519,-3.077],[0.869,-0.426],[1.421,0.339],[1.437,2.443],[-0.252,2.956],[-2.399,0.736],[0,0]],"v":[[-1303.67,7.409],[-1305.819,-1.313],[-1301.024,-8.27],[-1298.267,-8.717],[-1294.907,-5.597],[-1292.76,2.773],[-1297.076,9.326],[-1303.725,5.945]]}],"t":420},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.725,3.062],[-2.94,1.12],[-1.102,-0.247],[-0.956,-1.446],[0.4,-2.948],[2.899,-0.67],[0.293,2.961]],"o":[[-2.126,-2.32],[0.725,-3.062],[1.055,-0.402],[1.692,0.378],[1.64,2.482],[-0.4,2.948],[-2.899,0.67],[0,0]],"v":[[-1276.29,1.547],[-1278.575,-7.231],[-1272.598,-14.052],[-1269.28,-14.423],[-1265.357,-11.211],[-1263.063,-2.785],[-1268.452,3.646],[-1276.307,0.082]]}],"t":461},{"s":[{"c":false,"i":[[0,0],[-0.725,3.062],[-2.94,1.12],[-1.102,-0.247],[-0.956,-1.446],[0.4,-2.948],[2.899,-0.67],[0.293,2.961]],"o":[[-2.126,-2.32],[0.725,-3.062],[1.055,-0.402],[1.692,0.378],[1.64,2.482],[-0.4,2.948],[-2.899,0.67],[0,0]],"v":[[-1295.904,-3.752],[-1298.189,-12.529],[-1292.211,-19.351],[-1288.893,-19.722],[-1284.97,-16.51],[-1282.677,-8.083],[-1288.065,-1.653],[-1295.92,-5.217]]}],"t":475}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Front pupil","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[7.881,0.157],[5.323,-5.016],[-0.849,-14.064],[-2.164,-2.424],[-2.847,-1.093],[-8.994,4.376],[-2.066,7.956],[1.855,5.121],[4.646,3.454]],"o":[[-3.447,-0.069],[-7.037,6.63],[0.256,4.236],[2.164,2.424],[9.256,3.553],[6.565,-3.194],[1.382,-5.322],[-3.489,-9.633],[-4.858,-3.612]],"v":[[-1277.036,-47.926],[-1295.86,-41.682],[-1306.029,-14.062],[-1300.775,1.838],[-1292.963,6.858],[-1264.371,5.568],[-1249.609,-11.302],[-1249.935,-27.778],[-1260.336,-42.78]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[7.001,-0.037],[4.997,-4.394],[-1.145,-14.038],[-1.988,-2.37],[-2.558,-1.022],[-7.863,4.596],[-1.614,8.004],[1.56,5.037],[4.22,3.338]],"o":[[-3.062,0.016],[-6.843,6.017],[0.345,4.228],[1.988,2.37],[8.316,3.324],[5.74,-3.355],[1.079,-5.354],[-2.545,-8.216],[-4.413,-3.49]],"v":[[-1298.132,-45.679],[-1313.908,-39.137],[-1326.075,-10.357],[-1321.127,4.22],[-1312.708,10.076],[-1281.708,7.575],[-1269.304,-8.977],[-1270.787,-25.418],[-1281.422,-41.001]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[7,0.157],[4.728,-5.016],[-0.754,-14.064],[-1.922,-2.424],[-2.529,-1.093],[-7.988,4.376],[-1.835,7.956],[1.255,5.121],[4.126,3.454]],"o":[[-3.061,-0.069],[-6.25,6.63],[0.227,4.236],[1.921,2.424],[8.22,3.553],[5.831,-3.194],[1.227,-5.322],[-2.361,-9.633],[-4.315,-3.612]],"v":[[-1306.224,-47.53],[-1322.942,-41.286],[-1335.903,-12.855],[-1331.361,1.854],[-1323.107,7.941],[-1292.05,6.302],[-1279.192,-9.9],[-1280.219,-26.376],[-1291.393,-42.384]]}],"t":128},{"i":{"x":0.833,"y":0.727},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[5.278,0.157],[4.628,-4.625],[-0.624,-14.064],[-1.589,-2.424],[-2.091,-1.093],[-6.607,4.376],[-1.518,7.956],[1.038,5.121],[3.413,3.454]],"o":[[-2.308,-0.069],[-5.754,5.75],[0.188,4.236],[1.589,2.424],[6.799,3.553],[4.823,-3.194],[1.015,-5.322],[-1.953,-9.633],[-3.569,-3.612]],"v":[[-1315.11,-48.015],[-1329.324,-41.842],[-1340.163,-14.151],[-1336.303,1.749],[-1330.565,6.77],[-1307.142,5.817],[-1296.507,-10.385],[-1297.356,-26.861],[-1304.673,-43.229]]}],"t":143},{"i":{"x":0.833,"y":0.727},"o":{"x":0.167,"y":0.273},"s":[{"c":true,"i":[[5.278,0.157],[4.628,-4.625],[-0.624,-14.064],[-1.589,-2.424],[-2.091,-1.093],[-6.607,4.376],[-1.518,7.956],[1.038,5.121],[3.413,3.454]],"o":[[-2.308,-0.069],[-5.754,5.75],[0.188,4.236],[1.589,2.424],[6.799,3.553],[4.823,-3.194],[1.015,-5.322],[-1.953,-9.633],[-3.569,-3.612]],"v":[[-1315.11,-48.015],[-1329.324,-41.842],[-1340.163,-14.151],[-1336.303,1.749],[-1330.565,6.77],[-1307.142,5.817],[-1296.507,-10.385],[-1297.356,-26.861],[-1304.673,-43.229]]}],"t":157},{"i":{"x":0.833,"y":0.727},"o":{"x":0.167,"y":0.273},"s":[{"c":true,"i":[[5.278,0.006],[4.628,-0.168],[-0.624,-0.51],[-1.589,-0.088],[-2.091,-0.04],[-6.607,0.159],[-1.518,0.289],[1.038,0.186],[3.413,0.125]],"o":[[-2.308,-0.003],[-5.754,0.209],[0.188,0.154],[1.589,0.088],[6.799,0.129],[4.823,-0.116],[1.015,-0.193],[-1.953,-0.349],[-3.569,-0.131]],"v":[[-1315.11,-19.937],[-1329.324,-19.713],[-1340.163,-18.709],[-1336.303,-18.132],[-1330.565,-17.95],[-1307.142,-17.985],[-1296.507,-18.572],[-1297.356,-19.17],[-1304.673,-19.764]]}],"t":163.111},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.273},"s":[{"c":true,"i":[[5.278,0.157],[4.628,-4.625],[-0.624,-14.064],[-1.589,-2.424],[-2.091,-1.093],[-6.607,4.376],[-1.518,7.956],[1.038,5.121],[3.413,3.454]],"o":[[-2.308,-0.069],[-5.754,5.75],[0.188,4.236],[1.589,2.424],[6.799,3.553],[4.823,-3.194],[1.015,-5.322],[-1.953,-9.633],[-3.569,-3.612]],"v":[[-1315.11,-48.015],[-1329.324,-41.842],[-1340.163,-14.151],[-1336.303,1.749],[-1330.565,6.77],[-1307.142,5.817],[-1296.507,-10.385],[-1297.356,-26.861],[-1304.673,-43.229]]}],"t":168},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[5.278,0.157],[4.628,-4.625],[-0.624,-14.064],[-1.589,-2.424],[-2.091,-1.093],[-6.607,4.376],[-1.518,7.956],[1.038,5.121],[3.413,3.454]],"o":[[-2.308,-0.069],[-5.754,5.75],[0.188,4.236],[1.589,2.424],[6.799,3.553],[4.823,-3.194],[1.015,-5.322],[-1.953,-9.633],[-3.569,-3.612]],"v":[[-1315.11,-48.015],[-1329.324,-41.842],[-1340.163,-14.151],[-1336.303,1.749],[-1330.565,6.77],[-1307.142,5.817],[-1296.507,-10.385],[-1297.356,-26.861],[-1304.673,-43.229]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[6.997,-0.237],[4.438,-5.274],[-1.545,-13.999],[-2.055,-2.312],[-2.586,-0.949],[-7.729,4.819],[-1.384,8.047],[1.541,5.043],[4.314,3.216]],"o":[[-3.06,0.104],[-5.867,6.971],[0.465,4.217],[2.055,2.312],[8.407,3.085],[5.642,-3.517],[0.926,-5.382],[-2.9,-9.485],[-4.511,-3.363]],"v":[[-1295.357,-45.757],[-1311.697,-38.583],[-1323.039,-9.468],[-1317.676,4.962],[-1309.093,10.576],[-1278.178,7.192],[-1266.251,-9.707],[-1268.203,-26.1],[-1280.26,-41.454]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[6.997,-0.248],[4.43,-5.281],[-1.568,-13.997],[-2.059,-2.309],[-2.588,-0.945],[-7.721,4.831],[-1.371,8.049],[1.55,5.04],[4.319,3.209]],"o":[[-3.06,0.109],[-5.855,6.981],[0.472,4.216],[2.059,2.309],[8.412,3.071],[5.636,-3.527],[0.917,-5.384],[-2.915,-9.48],[-4.517,-3.356]],"v":[[-1296.53,-47.849],[-1312.858,-40.647],[-1324.15,-11.513],[-1318.764,2.908],[-1310.171,8.507],[-1279.262,5.071],[-1267.363,-11.848],[-1269.342,-28.237],[-1281.425,-43.571]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[5.278,0.157],[4.628,-4.625],[-0.624,-14.064],[-1.589,-2.424],[-2.091,-1.093],[-6.607,4.376],[-1.518,7.956],[1.038,5.121],[3.413,3.454]],"o":[[-2.308,-0.069],[-5.754,5.75],[0.188,4.236],[1.589,2.424],[6.799,3.553],[4.823,-3.194],[1.015,-5.322],[-1.953,-9.633],[-3.569,-3.612]],"v":[[-1309.992,-47.44],[-1324.206,-41.268],[-1335.044,-13.576],[-1331.185,2.324],[-1325.446,7.344],[-1302.024,6.392],[-1291.389,-9.81],[-1292.238,-26.286],[-1299.555,-42.654]]}],"t":312},{"i":{"x":0.833,"y":0.667},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[5.278,0.157],[4.628,-4.625],[-0.624,-14.064],[-1.589,-2.424],[-2.091,-1.093],[-6.607,4.376],[-1.518,7.956],[1.038,5.121],[3.413,3.454]],"o":[[-2.308,-0.069],[-5.754,5.75],[0.188,4.236],[1.589,2.424],[6.799,3.553],[4.823,-3.194],[1.015,-5.322],[-1.953,-9.633],[-3.569,-3.612]],"v":[[-1309.992,-47.44],[-1324.206,-41.268],[-1335.044,-13.576],[-1331.185,2.324],[-1325.446,7.344],[-1302.024,6.392],[-1291.389,-9.81],[-1292.238,-26.286],[-1299.555,-42.654]]}],"t":400},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.333},"s":[{"c":true,"i":[[6.965,-0.228],[4.584,-0.191],[-1.138,-0.076],[-1.979,0.046],[-2.548,0.075],[-7.834,0.293],[-1.609,0.117],[1.391,-0.005],[4.203,-0.111]],"o":[[-3.046,0.1],[-6.053,0.252],[0.343,0.023],[1.979,-0.046],[8.283,-0.244],[5.718,-0.214],[1.076,-0.078],[-2.616,0.009],[-4.396,0.116]],"v":[[-1297.623,-16.528],[-1314.106,-15.936],[-1326.234,-15.308],[-1321.305,-15.352],[-1312.94,-15.578],[-1282.103,-16.606],[-1269.744,-17.143],[-1271.219,-17.227],[-1282.748,-16.977]]}],"t":404},{"i":{"x":0.6,"y":1},"o":{"x":0.5,"y":1},"s":[{"c":true,"i":[[6.891,-0.025],[4.59,-5.112],[-1.111,-14.039],[-1.962,-2.373],[-2.528,-1.027],[-7.783,4.582],[-1.607,8.001],[1.374,5.087],[4.169,3.345]],"o":[[-3.014,0.011],[-6.044,6.734],[0.335,4.229],[1.962,2.373],[8.219,3.338],[5.681,-3.345],[1.075,-5.351],[-2.585,-9.569],[-4.359,-3.498]],"v":[[-1298.177,-45.945],[-1314.566,-39.273],[-1326.649,-10.563],[-1321.77,4.098],[-1313.522,9.901],[-1283.007,7.5],[-1270.716,-9.03],[-1272.159,-25.474],[-1283.498,-41.208]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[7.001,-0.037],[4.587,-5.145],[-1.145,-14.038],[-1.988,-2.37],[-2.558,-1.022],[-7.863,4.596],[-1.614,8.004],[1.397,5.085],[4.22,3.338]],"o":[[-3.062,0.016],[-6.064,6.801],[0.345,4.228],[1.988,2.37],[8.316,3.324],[5.74,-3.355],[1.079,-5.354],[-2.628,-9.564],[-4.413,-3.49]],"v":[[-1297.37,-45.843],[-1313.908,-39.137],[-1326.075,-10.357],[-1321.127,4.22],[-1312.708,10.076],[-1281.708,7.575],[-1269.304,-8.977],[-1270.787,-25.418],[-1282.401,-41.11]]}],"t":420},{"s":[{"c":true,"i":[[7.881,0.157],[5.323,-5.016],[-0.849,-14.064],[-2.164,-2.424],[-2.847,-1.093],[-8.994,4.376],[-2.066,7.956],[1.855,5.121],[4.646,3.454]],"o":[[-3.447,-0.069],[-7.037,6.63],[0.256,4.236],[2.164,2.424],[9.256,3.553],[6.565,-3.194],[1.382,-5.322],[-3.489,-9.633],[-4.858,-3.612]],"v":[[-1277.036,-47.926],[-1295.86,-41.682],[-1306.029,-14.062],[-1300.775,1.838],[-1292.963,6.858],[-1264.371,5.568],[-1249.609,-11.302],[-1249.935,-27.778],[-1260.336,-42.78]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[1,1,1,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-1298.635,-16.776]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1298.635,-16.776]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[145,145]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":9,"mn":"ADBE Vector Group","nm":"Front eye","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.767},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.062,3.491],[-3.285,1.185],[-1.146,-0.25],[-0.845,-2.422],[0.566,-2.246],[2.21,-0.691],[0.858,1.588]],"o":[[-3.434,-0.634],[0.062,-3.491],[1.104,-0.398],[2.506,0.546],[0.763,2.187],[-0.566,2.246],[-1.723,0.539],[0,0]],"v":[[-1342.852,-8.695],[-1348.82,-16.258],[-1342.95,-24.17],[-1339.493,-24.508],[-1334.526,-19.079],[-1333.972,-12.253],[-1338.356,-7.255],[-1343.104,-8.804]]}],"t":9},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.233},"s":[{"c":false,"i":[[0,0],[0.042,3.491],[-2.622,1.253],[-0.933,-0.226],[-0.746,-2.404],[0.398,-2.257],[1.767,-0.737],[0.734,1.569]],"o":[[-2.79,-0.561],[-0.042,-3.491],[0.881,-0.421],[2.039,0.493],[0.673,2.17],[-0.398,2.257],[-1.377,0.574],[0,0]],"v":[[-1381.126,-3.297],[-1386.145,-10.732],[-1381.612,-18.764],[-1378.828,-19.175],[-1374.673,-13.852],[-1374.046,-7.04],[-1377.457,-1.952],[-1381.332,-3.401]]}],"t":19},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.042,3.491],[-2.622,1.253],[-0.933,-0.226],[-0.746,-2.404],[0.398,-2.257],[1.767,-0.737],[0.734,1.569]],"o":[[-2.79,-0.561],[-0.042,-3.491],[0.881,-0.421],[2.039,0.493],[0.673,2.17],[-0.398,2.257],[-1.377,0.574],[0,0]],"v":[[-1383.363,-6.829],[-1388.382,-14.264],[-1383.849,-22.296],[-1381.065,-22.706],[-1376.91,-17.383],[-1376.283,-10.571],[-1379.694,-5.484],[-1383.569,-6.932]]}],"t":73},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.047,3.491],[-2.585,1.257],[-0.921,-0.224],[-0.74,-2.403],[0.389,-2.257],[1.742,-0.74],[0.728,1.568]],"o":[[-2.754,-0.557],[-0.047,-3.491],[0.869,-0.422],[2.012,0.49],[0.668,2.169],[-0.389,2.257],[-1.358,0.576],[0,0]],"v":[[-1383.718,-18.309],[-1388.683,-25.737],[-1384.225,-33.776],[-1381.479,-34.191],[-1377.37,-28.874],[-1376.739,-22.063],[-1380.095,-16.97],[-1383.921,-18.413]]}],"t":77},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0,3.491],[-2.601,1.222],[-0.917,-0.237],[-0.707,-2.412],[0.419,-2.251],[1.752,-0.716],[0.706,1.578]],"o":[[-2.746,-0.595],[0,-3.491],[0.874,-0.41],[2.005,0.518],[0.638,2.178],[-0.419,2.251],[-1.365,0.558],[0,0]],"v":[[-1390.361,-16.711],[-1395.224,-24.205],[-1390.657,-32.181],[-1387.906,-32.558],[-1383.871,-27.186],[-1383.332,-20.368],[-1386.757,-15.322],[-1390.563,-16.817]]}],"t":113},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.05,3.491],[-2.619,1.185],[-0.914,-0.25],[-0.673,-2.422],[0.451,-2.246],[1.762,-0.691],[0.684,1.588]],"o":[[-2.738,-0.634],[0.05,-3.491],[0.88,-0.398],[1.998,0.546],[0.608,2.187],[-0.451,2.246],[-1.373,0.539],[0,0]],"v":[[-1391.939,4.219],[-1396.697,-3.344],[-1392.017,-11.256],[-1389.261,-11.594],[-1385.301,-6.165],[-1384.859,0.661],[-1388.355,5.659],[-1392.14,4.11]]}],"t":120},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.05,3.491],[-2.619,1.185],[-0.914,-0.25],[-0.673,-2.422],[0.451,-2.246],[1.762,-0.691],[0.684,1.588]],"o":[[-2.738,-0.634],[0.05,-3.491],[0.88,-0.398],[1.998,0.546],[0.608,2.187],[-0.451,2.246],[-1.373,0.539],[0,0]],"v":[[-1391.939,4.219],[-1396.697,-3.344],[-1392.017,-11.256],[-1389.261,-11.594],[-1385.301,-6.165],[-1384.859,0.661],[-1388.355,5.659],[-1392.14,4.11]]}],"t":128},{"i":{"x":0,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.05,3.491],[-2.619,1.185],[-0.914,-0.25],[-0.673,-2.422],[0.451,-2.246],[1.762,-0.691],[0.684,1.588]],"o":[[-2.738,-0.634],[0.05,-3.491],[0.88,-0.398],[1.998,0.546],[0.608,2.187],[-0.451,2.246],[-1.373,0.539],[0,0]],"v":[[-1381.497,-5.244],[-1386.254,-12.807],[-1381.575,-20.719],[-1378.819,-21.057],[-1374.859,-15.628],[-1374.417,-8.802],[-1377.912,-3.804],[-1381.697,-5.353]]}],"t":143},{"i":{"x":0.833,"y":0.727},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1379.336,-10.049],[-1382.827,-17.612],[-1379.394,-25.524],[-1377.371,-25.862],[-1374.466,-20.434],[-1374.141,-13.607],[-1376.706,-8.61],[-1379.484,-10.158]]}],"t":160},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.273},"s":[{"c":false,"i":[[0,0],[-0.074,0.199],[-1.903,-0.278],[-0.656,-0.136],[-0.459,-0.232],[0.35,-0.072],[1.279,0.193],[0.476,0.185]],"o":[[-1.969,-0.401],[0.074,-0.199],[0.639,0.093],[1.436,0.298],[0.415,0.21],[-0.35,0.072],[-0.997,-0.151],[0,0]],"v":[[-1379.207,-26.935],[-1382.558,-28.013],[-1379.095,-27.858],[-1377.103,-27.512],[-1374.304,-26.665],[-1374.06,-26.204],[-1376.636,-26.374],[-1379.351,-26.968]]}],"t":163.111},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1379.336,-10.049],[-1382.827,-17.612],[-1379.394,-25.524],[-1377.371,-25.862],[-1374.466,-20.434],[-1374.141,-13.607],[-1376.706,-8.61],[-1379.484,-10.158]]}],"t":171},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1379.336,-10.049],[-1382.827,-17.612],[-1379.394,-25.524],[-1377.371,-25.862],[-1374.466,-20.434],[-1374.141,-13.607],[-1376.706,-8.61],[-1379.484,-10.158]]}],"t":187},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.922,1.185],[-0.671,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1383.109,0.293],[-1386.6,-7.269],[-1383.166,-15.182],[-1381.144,-15.52],[-1378.238,-10.091],[-1377.914,-3.265],[-1380.479,1.733],[-1383.256,0.185]]}],"t":193},{"i":{"x":0,"y":0},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[0.147,3.489],[-2.548,1.33],[-0.927,-0.198],[-0.808,-2.38],[0.324,-2.267],[1.72,-0.789],[0.772,1.547]],"o":[[-2.769,-0.479],[-0.147,-3.489],[0.856,-0.447],[2.026,0.433],[0.73,2.149],[-0.324,2.267],[-1.341,0.615],[0,0]],"v":[[-1382.23,0.698],[-1387.406,-6.585],[-1383.178,-14.748],[-1380.446,-15.241],[-1376.187,-10.043],[-1375.361,-3.253],[-1378.571,1.934],[-1382.436,0.6]]}],"t":203},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.134,3.489],[-2.503,1.32],[-0.909,-0.202],[-0.786,-2.383],[0.324,-2.266],[1.69,-0.782],[0.752,1.55]],"o":[[-2.715,-0.49],[-0.134,-3.489],[0.841,-0.444],[1.986,0.441],[0.709,2.152],[-0.325,2.266],[-1.317,0.61],[0,0]],"v":[[-1369.085,-26.199],[-1374.141,-33.502],[-1369.971,-41.647],[-1367.288,-42.129],[-1363.125,-36.915],[-1362.335,-30.122],[-1365.499,-24.949],[-1369.287,-26.298]]}],"t":214},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.134,3.489],[-2.503,1.32],[-0.909,-0.202],[-0.786,-2.383],[0.324,-2.266],[1.69,-0.782],[0.752,1.55]],"o":[[-2.715,-0.49],[-0.134,-3.489],[0.841,-0.444],[1.986,0.441],[0.709,2.152],[-0.325,2.266],[-1.317,0.61],[0,0]],"v":[[-1359.342,-22.665],[-1364.397,-29.968],[-1360.227,-38.113],[-1357.544,-38.595],[-1353.381,-33.381],[-1352.592,-26.588],[-1355.755,-21.415],[-1359.543,-22.763]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[0.134,3.489],[-2.503,1.32],[-0.909,-0.202],[-0.786,-2.383],[0.324,-2.266],[1.69,-0.782],[0.752,1.55]],"o":[[-2.715,-0.49],[-0.134,-3.489],[0.841,-0.444],[1.986,0.441],[0.709,2.152],[-0.325,2.266],[-1.317,0.61],[0,0]],"v":[[-1361.147,-27.071],[-1366.203,-34.374],[-1362.032,-42.519],[-1359.35,-43.001],[-1355.187,-37.787],[-1354.397,-30.994],[-1357.561,-25.821],[-1361.349,-27.169]]}],"t":296},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1373.525,-28.795],[-1377.016,-36.358],[-1373.582,-44.27],[-1371.56,-44.608],[-1368.654,-39.179],[-1368.33,-32.353],[-1370.895,-27.355],[-1373.672,-28.904]]}],"t":312},{"i":{"x":0.25,"y":1},"o":{"x":1,"y":0},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1373.525,-28.795],[-1377.016,-36.358],[-1373.582,-44.27],[-1371.56,-44.608],[-1368.654,-39.179],[-1368.33,-32.353],[-1370.895,-27.355],[-1373.672,-28.904]]}],"t":366},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.147,3.489],[-2.548,1.33],[-0.927,-0.198],[-0.808,-2.38],[0.324,-2.267],[1.72,-0.789],[0.772,1.547]],"o":[[-2.769,-0.479],[-0.147,-3.489],[0.856,-0.447],[2.026,0.433],[0.73,2.149],[-0.324,2.267],[-1.341,0.615],[0,0]],"v":[[-1374.434,-4.377],[-1379.609,-11.66],[-1375.382,-19.823],[-1372.649,-20.315],[-1368.39,-15.118],[-1367.565,-8.327],[-1370.774,-3.141],[-1374.64,-4.474]]}],"t":371},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1376.408,-5.237],[-1379.899,-12.8],[-1376.465,-20.712],[-1374.443,-21.05],[-1371.537,-15.621],[-1371.213,-8.795],[-1373.778,-3.797],[-1376.555,-5.346]]}],"t":384},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1377.477,-0.705],[-1380.968,-8.268],[-1377.535,-16.18],[-1375.512,-16.518],[-1372.607,-11.089],[-1372.282,-4.263],[-1374.847,0.735],[-1377.625,-0.814]]}],"t":403},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.333},"s":[{"c":false,"i":[[0,0],[-0.135,0.312],[-1.869,-0.461],[-0.633,-0.222],[-0.402,-0.371],[0.381,-0.109],[1.255,0.32],[0.433,0.296]],"o":[[-1.9,-0.655],[0.135,-0.312],[0.628,0.155],[1.384,0.486],[0.363,0.335],[-0.381,0.109],[-0.978,-0.249],[0,0]],"v":[[-1372.669,-22.399],[-1375.785,-24.135],[-1372.279,-23.847],[-1370.338,-23.278],[-1367.72,-21.913],[-1367.606,-21.186],[-1370.199,-21.485],[-1372.807,-22.453]]}],"t":404},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.333},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1373.517,-8.855],[-1377.321,-14.471],[-1373.887,-22.383],[-1371.865,-22.721],[-1368.959,-17.292],[-1368.635,-10.466],[-1371.012,-8.369],[-1372.843,-8.57]]}],"t":405},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.333},"s":[{"c":false,"i":[[0,0],[-0.036,3.491],[-1.921,1.185],[-0.67,-0.25],[-0.494,-2.422],[0.331,-2.246],[1.293,-0.691],[0.502,1.588]],"o":[[-2.009,-0.634],[0.036,-3.491],[0.646,-0.398],[1.466,0.546],[0.446,2.187],[-0.331,2.246],[-1.008,0.539],[0,0]],"v":[[-1373.83,-6.908],[-1377.321,-14.471],[-1373.887,-22.383],[-1371.865,-22.721],[-1368.959,-17.292],[-1368.635,-10.466],[-1371.2,-5.468],[-1373.977,-7.017]]}],"t":410},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[0.047,3.491],[-2.585,1.257],[-0.921,-0.224],[-0.74,-2.403],[0.389,-2.257],[1.742,-0.74],[0,0]],"o":[[-2.152,-1.252],[-0.047,-3.491],[0.869,-0.422],[2.012,0.49],[0.668,2.169],[-0.389,2.257],[-1.358,0.576],[0,0]],"v":[[-1367.706,-2.994],[-1372.2,-11.18],[-1367.742,-19.219],[-1364.996,-19.634],[-1360.887,-14.317],[-1360.256,-7.506],[-1363.612,-2.413],[-1367.91,-3.098]]}],"t":420},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.062,3.491],[-3.285,1.185],[-1.146,-0.25],[-0.845,-2.422],[0.566,-2.246],[2.21,-0.691],[1.008,0.696]],"o":[[-2.01,-1.357],[0.062,-3.491],[1.104,-0.398],[2.506,0.546],[0.763,2.187],[-0.566,2.246],[-1.723,0.539],[0,0]],"v":[[-1345.63,-8.706],[-1350.333,-16.858],[-1344.463,-24.77],[-1341.007,-25.108],[-1336.04,-19.679],[-1335.485,-12.853],[-1339.87,-7.855],[-1345.882,-8.815]]}],"t":461},{"s":[{"c":false,"i":[[0,0],[-0.062,3.491],[-3.285,1.185],[-1.146,-0.25],[-0.845,-2.422],[0.566,-2.246],[2.21,-0.691],[1.008,0.696]],"o":[[-2.01,-1.357],[0.062,-3.491],[1.104,-0.398],[2.506,0.546],[0.763,2.187],[-0.566,2.246],[-1.723,0.539],[0,0]],"v":[[-1356.267,-6.6],[-1360.998,-15.173],[-1355.129,-23.086],[-1351.672,-23.424],[-1346.705,-17.995],[-1346.15,-11.169],[-1350.535,-6.171],[-1356.519,-6.709]]}],"t":475}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":10,"mn":"ADBE Vector Group","nm":"Back pupil","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.836,2.426],[6.311,-2.495],[3.518,-5.242],[1.616,-6.512],[-0.654,-3.285],[-1.52,-2.202],[-6.479,-1.448],[-5.388,3.355],[-2.497,5.611],[0.894,7.369]],"o":[[-5.48,-3.466],[-6.092,2.409],[-3.799,5.661],[-0.807,3.255],[0.513,2.577],[3.614,5.238],[6.479,1.448],[5.007,-3.118],[2.9,-6.516],[-0.522,-4.306]],"v":[[-1344.228,-47.153],[-1365.365,-48.626],[-1378.915,-38.905],[-1384.241,-25.266],[-1383.285,-14.435],[-1380.09,-7.214],[-1364.044,1.094],[-1344.736,-2.607],[-1334.377,-13.355],[-1333.264,-32.062]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.573,2.356],[4.098,-2.539],[1.659,-5.751],[1.063,-6.261],[0.257,-3.303],[-1.054,-2.174],[-4.273,-1.33],[-3.427,3.452],[-1.476,5.654],[0.788,7.35]],"o":[[-3.676,-3.365],[-2.408,1.492],[-1.714,5.94],[-0.552,3.251],[-0.24,3.084],[2.506,5.17],[4.273,1.33],[3.184,-3.207],[1.714,-6.566],[-0.461,-4.295]],"v":[[-1362.236,-45.393],[-1376.084,-46.482],[-1380.722,-35.214],[-1383.849,-21.239],[-1385.236,-10.81],[-1384.554,-4.819],[-1373.842,3.195],[-1361.332,-0.855],[-1354.864,-11.786],[-1354.655,-30.506]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.932,2.426],[3.178,-2.495],[1.771,-5.242],[1.215,-6.45],[1.145,-4.822],[-1.315,-1.925],[-4.115,0.266],[-2.713,3.355],[-1.258,5.611],[0.45,7.369]],"o":[[-2.76,-3.466],[-3.068,2.409],[-1.913,5.661],[-0.993,5.271],[-0.598,2.52],[3.583,5.246],[3.562,-0.23],[2.521,-3.118],[1.46,-6.516],[-0.263,-4.306]],"v":[[-1369.166,-48.879],[-1379.81,-50.352],[-1386.633,-40.631],[-1389.315,-26.993],[-1390.771,-16.522],[-1389.461,-6.351],[-1379.145,-0.632],[-1369.422,-4.334],[-1364.206,-15.081],[-1363.645,-33.788]]}],"t":128},{"i":{"x":0.833,"y":0.727},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.258,2.043],[3.295,-1.414],[0.793,-5.669],[0.775,-6.512],[-0.313,-3.285],[-0.318,-2.332],[-3.107,-1.448],[-2.584,3.355],[-1.197,5.611],[0.584,7.369]],"o":[[-2.12,-1.918],[-4.276,1.835],[-1.168,8.344],[-0.387,3.255],[0.246,2.577],[0.746,5.466],[3.107,1.448],[2.401,-3.118],[1.391,-6.516],[-0.341,-4.306]],"v":[[-1363.648,-46.499],[-1372.775,-49.661],[-1378.006,-38.174],[-1379.998,-23.979],[-1381.038,-13.915],[-1382.943,-8.701],[-1372.858,-0.632],[-1366.517,-4.871],[-1361.939,-15.316],[-1359.949,-33.639]]}],"t":143},{"i":{"x":0.833,"y":0.727},"o":{"x":0.167,"y":0.273},"s":[{"c":true,"i":[[2.258,2.043],[3.295,-1.414],[1.15,-5.607],[0.775,-6.512],[-0.313,-3.285],[-0.119,-2.317],[-4.478,0.548],[-2.584,3.355],[-1.197,5.611],[0.584,7.369]],"o":[[-2.12,-1.918],[-4.276,1.835],[-1.472,7.183],[-0.387,3.255],[0.246,2.577],[0.316,6.146],[3.402,-0.417],[2.401,-3.118],[1.391,-6.516],[-0.341,-4.306]],"v":[[-1364.816,-48.399],[-1372.775,-49.661],[-1378.034,-39.369],[-1379.692,-25.121],[-1381.079,-16.342],[-1381.963,-9.447],[-1372.858,-0.632],[-1363.6,-4.334],[-1359.659,-13.99],[-1358.952,-33.157]]}],"t":157},{"i":{"x":0.833,"y":0.727},"o":{"x":0.167,"y":0.273},"s":[{"c":true,"i":[[2.17,0.678],[3.208,0.706],[2.246,0.209],[0.812,-0.232],[-0.273,-0.287],[-0.669,-0.321],[-3.036,-0.789],[-2.536,-0.409],[-1.214,0.071],[0.497,0.615]],"o":[[-2.037,-0.636],[-4.163,-0.916],[-2.432,-0.194],[-0.406,0.116],[0.214,0.225],[1.591,0.781],[3.006,0.793],[2.357,0.38],[1.409,-0.083],[-0.29,-0.36]],"v":[[-1364.787,-25.127],[-1372.491,-27.134],[-1377.035,-27.528],[-1379.609,-27.272],[-1380.159,-26.737],[-1378.809,-25.911],[-1373.032,-23.999],[-1364.022,-21.998],[-1359.135,-21.458],[-1359.941,-22.897]]}],"t":163},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.273},"s":[{"c":true,"i":[[2.258,2.043],[3.295,-1.414],[0.925,-5.649],[0.775,-6.512],[0.605,-3.244],[-0.729,-2.202],[-3.107,-1.448],[-2.584,3.355],[-1.197,5.611],[0.584,7.369]],"o":[[-2.12,-1.918],[-4.276,1.835],[-1.003,6.128],[-0.387,3.255],[-0.681,3.649],[1.733,5.238],[3.107,1.448],[2.401,-3.118],[1.391,-6.516],[-0.341,-4.306]],"v":[[-1364.816,-48.399],[-1372.775,-49.661],[-1377.666,-38.857],[-1379.801,-25.638],[-1381.024,-14.82],[-1381.635,-7.373],[-1372.858,-0.632],[-1363.6,-4.334],[-1358.633,-15.081],[-1358.88,-34.902]]}],"t":168},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.258,2.043],[3.295,-1.414],[1.629,-7.57],[0.775,-6.512],[0.452,-3.269],[0.514,-2.242],[-3.107,-1.448],[-2.584,3.355],[-1.197,5.611],[0.584,7.369]],"o":[[-2.12,-1.918],[-4.276,1.835],[-1.124,5.226],[-0.387,3.255],[-0.461,3.333],[1.733,5.238],[3.107,1.448],[2.401,-3.118],[1.391,-6.516],[-0.341,-4.306]],"v":[[-1364.816,-48.399],[-1372.775,-49.661],[-1377.364,-39.12],[-1380.083,-25.454],[-1381.216,-15.319],[-1382.222,-8.168],[-1372.858,-0.632],[-1363.6,-4.334],[-1358.633,-15.081],[-1359.689,-32.905]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.639,2.281],[3.977,-2.723],[2,-5.363],[0.688,-6.561],[0.254,-2.745],[-1.115,-2.143],[-4.309,-1.208],[-3.327,3.548],[-1.314,5.694],[0.998,7.325]],"o":[[-3.77,-3.259],[-3.84,2.629],[-2.16,5.792],[-0.344,3.28],[-0.335,3.623],[2.653,5.096],[4.309,1.208],[3.091,-3.297],[1.526,-6.613],[-0.583,-4.28]],"v":[[-1360.184,-43.457],[-1374.057,-44.151],[-1379.34,-33.034],[-1382.085,-18.351],[-1383.373,-9.771],[-1381.336,-2.264],[-1370.4,5.442],[-1358.01,1.037],[-1351.856,-10.075],[-1352.181,-28.793]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.643,2.277],[3.973,-2.73],[1.349,-5.563],[0.677,-6.563],[0.449,-3.282],[-1.119,-2.141],[-4.311,-1.201],[-3.321,3.553],[-1.304,5.696],[1.01,7.323]],"o":[[-3.776,-3.252],[-3.835,2.635],[-1.477,6.091],[-0.338,3.28],[-0.408,2.98],[2.661,5.092],[4.311,1.201],[3.086,-3.302],[1.515,-6.615],[-0.59,-4.279]],"v":[[-1361.353,-45.44],[-1375.227,-46.111],[-1380.155,-35.585],[-1382.421,-21.253],[-1383.622,-11.132],[-1382.435,-4.211],[-1371.486,3.476],[-1359.104,-0.95],[-1352.969,-12.072],[-1353.326,-30.789]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[2.258,2.043],[3.295,-1.414],[0.924,-5.649],[0.775,-6.512],[0.039,-3.3],[-0.729,-2.202],[-3.107,-1.448],[-2.583,3.355],[-1.198,5.611],[-0.154,7.391]],"o":[[-2.12,-1.918],[-4.276,1.835],[-1.062,6.496],[-0.387,3.255],[-0.045,3.824],[1.733,5.238],[3.107,1.448],[2.401,-3.118],[1.39,-6.516],[0.11,-5.266]],"v":[[-1359.698,-47.825],[-1367.657,-49.086],[-1373.832,-39.24],[-1376.535,-25.403],[-1377.995,-15.001],[-1377.824,-8.126],[-1367.74,-0.057],[-1358.482,-3.759],[-1353.515,-14.507],[-1354.57,-32.33]]}],"t":312},{"i":{"x":0.833,"y":0.667},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[2.258,2.043],[3.295,-1.414],[0.924,-5.649],[0.775,-6.512],[0.039,-3.3],[-0.729,-2.202],[-3.107,-1.448],[-2.583,3.355],[-1.198,5.611],[-0.154,7.391]],"o":[[-2.12,-1.918],[-4.276,1.835],[-1.062,6.496],[-0.387,3.255],[-0.045,3.824],[1.733,5.238],[3.107,1.448],[2.401,-3.118],[1.39,-6.516],[0.11,-5.266]],"v":[[-1359.698,-47.825],[-1367.657,-49.086],[-1373.832,-39.24],[-1376.535,-25.403],[-1377.995,-15.001],[-1377.824,-8.126],[-1367.74,-0.057],[-1358.482,-3.759],[-1353.515,-14.507],[-1354.57,-32.33]]}],"t":400},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.333},"s":[{"c":true,"i":[[2.443,0.793],[3.91,1.017],[2.112,0.459],[0.892,0.062],[-0.466,-0.238],[-0.987,-0.358],[-4.066,-1.24],[-3.3,-0.867],[-1.458,-0.255],[0.691,0.43]],"o":[[-3.469,-1.126],[-2.393,-0.623],[-2.281,-0.496],[-0.446,-0.031],[0.365,0.187],[2.346,0.851],[4.066,1.24],[3.066,0.805],[1.693,0.297],[-0.404,-0.251]],"v":[[-1362.337,-20.608],[-1371.733,-23.365],[-1373.515,-23.726],[-1376.329,-24.011],[-1375.914,-23.548],[-1373.794,-22.702],[-1373.81,-22.493],[-1361.836,-19.088],[-1355.568,-17.577],[-1355.235,-18.055]]}],"t":404},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.513,1.773],[2.825,-0.513],[0.676,-2.891],[0.355,-2.866],[-0.111,-2.19],[-0.537,-1.65],[-4.15,-1.302],[-3.346,1.873],[-1.458,3.497],[0.745,4.827]],"o":[[-3.537,-2.49],[-1.389,1.872],[-0.657,2.812],[-0.254,2.051],[0.071,2.277],[1.261,3.778],[4.15,1.302],[3.109,-1.74],[1.693,-4.061],[-0.435,-2.821]],"v":[[-1362.17,-36.453],[-1372.886,-38.918],[-1375.518,-30.41],[-1376.874,-21.854],[-1377.343,-15.671],[-1376.758,-10.717],[-1373.583,-6.305],[-1361.4,-7.622],[-1355.066,-14.008],[-1354.863,-26.039]]}],"t":406},{"i":{"x":0.833,"y":0.833},"o":{"x":0.5,"y":1},"s":[{"c":true,"i":[[2.553,2.336],[2.203,-1.391],[1.24,-5.878],[0.704,-5.457],[0.093,-3.31],[-0.279,-2.392],[-4.198,-1.338],[-3.373,3.446],[-1.458,5.651],[0.775,7.351]],"o":[[-3.576,-3.272],[-0.813,3.304],[-1.276,6.049],[-0.422,3.269],[-0.098,3.476],[0.638,5.458],[4.198,1.338],[3.134,-3.201],[1.693,-6.563],[-0.453,-4.296]],"v":[[-1362.074,-45.548],[-1371.572,-47.779],[-1374.78,-33.802],[-1377.187,-20.616],[-1378.164,-11.149],[-1378.459,-3.837],[-1373.452,2.987],[-1361.15,-1.041],[-1354.777,-11.96],[-1354.65,-30.623]]}],"t":407},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.572,2.354],[2.371,-1.506],[1.304,-5.593],[1.36,-6.64],[0.408,-3.842],[-0.013,-2.407],[-4.268,-1.331],[-3.423,3.451],[-1.475,5.654],[0.788,7.35]],"o":[[-3.669,-3.359],[-0.992,0.867],[-1.138,4.889],[-0.658,3.23],[-0.364,3.428],[0.03,5.597],[4.268,1.331],[3.181,-3.207],[1.713,-6.566],[-0.46,-4.295]],"v":[[-1362.225,-45.403],[-1373.148,-47.26],[-1375.906,-35.918],[-1378.459,-22.122],[-1379.733,-11.334],[-1379.98,-4.36],[-1373.817,3.182],[-1361.32,-0.867],[-1354.858,-11.798],[-1354.655,-30.514]]}],"t":415},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.573,2.356],[4.051,-2.612],[1.309,-5.573],[1.406,-6.724],[0.648,-3.851],[-1.054,-2.174],[-4.273,-1.33],[-3.427,3.452],[-1.476,5.654],[0.788,7.35]],"o":[[-3.676,-3.365],[-2.628,1.694],[-1.129,4.807],[-0.675,3.228],[-0.431,2.563],[2.506,5.17],[4.273,1.33],[3.184,-3.207],[1.714,-6.566],[-0.461,-4.295]],"v":[[-1362.236,-45.393],[-1376.084,-46.482],[-1380.847,-36.517],[-1383.848,-22.044],[-1385.258,-11.434],[-1384.554,-4.819],[-1373.842,3.195],[-1361.332,-0.855],[-1354.864,-11.786],[-1354.655,-30.506]]}],"t":420},{"s":[{"c":true,"i":[[3.836,2.426],[6.311,-2.495],[3.518,-5.242],[1.616,-6.512],[-0.654,-3.285],[-1.52,-2.202],[-6.479,-1.448],[-5.388,3.355],[-2.497,5.611],[0.894,7.369]],"o":[[-5.48,-3.466],[-6.092,2.409],[-3.799,5.661],[-0.807,3.255],[0.513,2.577],[3.614,5.238],[6.479,1.448],[5.007,-3.118],[2.9,-6.516],[-0.522,-4.306]],"v":[[-1344.228,-47.153],[-1365.365,-48.626],[-1378.915,-38.905],[-1384.241,-25.266],[-1383.285,-14.435],[-1380.09,-7.214],[-1364.044,1.094],[-1344.736,-2.607],[-1334.377,-13.355],[-1333.264,-32.062]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[1,1,1,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-1371.872,-21.895]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1371.872,-21.895]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[145,145]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":11,"mn":"ADBE Vector Group","nm":"Back eye ","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.504,2.82],[1.357,-5.179],[5.023,-22.061],[12.439,-18.899],[21.977,-5.377],[8.311,-0.28],[21.013,2.818],[-18.796,-3.705],[-36.855,6.146],[-8.057,9.03],[-1.601,11.361],[0.016,46.36]],"o":[[-3.6,3.963],[-5.734,21.887],[-5.023,22.061],[-12.439,18.899],[-8.077,1.976],[-21.189,0.715],[0,0],[36.658,7.227],[11.937,-1.991],[7.638,-8.561],[6.469,-45.906],[-0.001,-3.771]],"v":[[-1189.616,-140.561],[-1196.176,-126.077],[-1210.157,-59.666],[-1232.685,10.82],[-1287.483,43.235],[-1312.224,46.052],[-1375.675,42.889],[-1352.25,54.133],[-1240.566,55.083],[-1208.001,40.731],[-1196.651,8.792],[-1186.956,-129.835]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.986,2.766],[0.89,-5.206],[3.215,-22.159],[8.952,-19.155],[21.82,-5.984],[8.3,-0.511],[21.083,2.234],[-18.891,-3.183],[-33.08,4.316],[-5.887,9.196],[-0.905,11.39],[1.298,46.342]],"o":[[-2.632,4.038],[-3.761,22],[-3.215,22.159],[-8.952,19.155],[-8.02,2.199],[-21.161,1.302],[0,0],[36.844,6.207],[12,-1.566],[5.582,-8.719],[3.655,-46.025],[-0.106,-3.769]],"v":[[-1196.612,-141.705],[-1201.208,-127.088],[-1210.016,-60.407],[-1225.223,10.528],[-1276.118,44.368],[-1300.771,47.87],[-1364.286,46.468],[-1339.808,55.996],[-1228.894,53.767],[-1203.554,40.766],[-1197.829,7.739],[-1194.288,-131.039]]}],"t":26},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.908,2.82],[1.034,-5.179],[3.828,-22.061],[9.48,-18.899],[21.977,-5.377],[8.311,-0.28],[21.013,2.818],[-18.796,-3.705],[-33.187,3.397],[-6.14,9.03],[-1.22,11.361],[0.012,46.36]],"o":[[-2.743,3.963],[-4.37,21.887],[-3.828,22.061],[-9.48,18.899],[-8.077,1.976],[-21.189,0.715],[0,0],[36.658,7.227],[12.039,-1.232],[5.821,-8.561],[4.93,-45.906],[-0.001,-3.771]],"v":[[-1202.846,-140.561],[-1207.845,-126.077],[-1218.5,-59.666],[-1235.669,10.82],[-1287.483,43.235],[-1312.224,46.052],[-1375.675,42.889],[-1350.856,53.741],[-1240.538,53.94],[-1214.373,42.313],[-1208.208,8.792],[-1200.819,-129.835]]}],"t":128},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[1.908,2.82],[1.034,-5.179],[3.828,-22.061],[9.48,-18.899],[21.977,-5.377],[8.311,-0.28],[21.013,2.818],[-18.796,-3.705],[-36.855,6.146],[-6.14,9.03],[-1.22,11.361],[0.012,46.36]],"o":[[-2.743,3.963],[-4.37,21.887],[-3.828,22.061],[-9.48,18.899],[-8.077,1.976],[-21.189,0.715],[0,0],[36.658,7.227],[11.937,-1.991],[5.821,-8.561],[4.93,-45.906],[-0.001,-3.771]],"v":[[-1202.846,-140.561],[-1207.845,-126.077],[-1218.5,-59.666],[-1235.669,10.82],[-1287.483,43.235],[-1312.224,46.052],[-1375.675,42.889],[-1352.25,54.133],[-1239.642,53.98],[-1214.301,41.661],[-1208.208,8.792],[-1200.819,-129.835]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.064,2.708],[0.741,-5.229],[2.581,-22.241],[8.402,-19.403],[21.64,-6.605],[8.282,-0.747],[21.139,1.632],[-19.066,-1.872],[-36.451,8.209],[-5.623,9.361],[-0.579,11.411],[2.62,46.286]],"o":[[-2.516,4.111],[-3.131,22.098],[-2.581,22.241],[-8.402,19.403],[-7.953,2.427],[-21.115,1.905],[0,0],[37.782,3.709],[11.806,-2.659],[5.331,-8.875],[2.341,-46.111],[-0.213,-3.765]],"v":[[-1197.375,-144.455],[-1201.552,-129.713],[-1208.455,-62.808],[-1221.631,8.532],[-1271.54,43.81],[-1296.084,48.014],[-1359.612,48.424],[-1335.031,57.202],[-1222.662,50.692],[-1199.077,38.574],[-1194.328,4.962],[-1194.748,-133.86]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[2.068,2.705],[0.732,-5.231],[2.544,-22.246],[8.369,-19.417],[21.629,-6.641],[8.281,-0.761],[21.141,1.597],[-19.072,-1.81],[-36.89,5.106],[-5.607,9.37],[-0.56,11.412],[2.698,46.281]],"o":[[-2.509,4.116],[-3.095,22.103],[-2.544,22.246],[-8.369,19.417],[-7.949,2.441],[-21.112,1.941],[0,0],[38.917,3.693],[11.987,-1.659],[5.316,-8.884],[2.263,-46.115],[-0.219,-3.765]],"v":[[-1198.713,-146.711],[-1202.865,-131.962],[-1209.656,-65.046],[-1222.713,6.316],[-1272.562,41.678],[-1297.099,45.923],[-1360.627,46.44],[-1336.701,55.354],[-1225.149,49.833],[-1200.054,36.476],[-1195.416,2.701],[-1196.068,-136.121]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[1.908,2.82],[1.034,-5.179],[3.828,-22.061],[9.48,-18.899],[21.978,-5.377],[8.311,-0.28],[21.013,2.818],[-18.796,-3.705],[-36.855,6.146],[-6.14,9.03],[-1.22,11.361],[0.012,46.36]],"o":[[-2.743,3.963],[-4.369,21.887],[-3.828,22.061],[-9.48,18.899],[-8.077,1.976],[-21.189,0.715],[0,0],[36.658,7.227],[11.937,-1.991],[5.821,-8.561],[4.93,-45.906],[-0.001,-3.771]],"v":[[-1197.728,-139.986],[-1202.727,-125.502],[-1213.382,-59.091],[-1230.55,11.395],[-1282.364,43.81],[-1307.105,46.627],[-1370.556,43.463],[-1347.132,54.708],[-1235.448,55.658],[-1209.728,42.608],[-1203.089,9.366],[-1195.7,-129.26]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[1.908,2.82],[1.034,-5.179],[3.828,-22.061],[9.48,-18.899],[21.978,-5.377],[8.311,-0.28],[21.013,2.818],[-18.796,-3.705],[-36.855,6.146],[-6.14,9.03],[-1.22,11.361],[0.012,46.36]],"o":[[-2.743,3.963],[-4.369,21.887],[-3.828,22.061],[-9.48,18.899],[-8.077,1.976],[-21.189,0.715],[0,0],[36.658,7.227],[11.937,-1.991],[5.821,-8.561],[4.93,-45.906],[-0.001,-3.771]],"v":[[-1197.728,-139.986],[-1202.727,-125.502],[-1213.382,-59.091],[-1230.55,11.395],[-1282.364,43.81],[-1307.105,46.627],[-1370.556,43.463],[-1347.132,54.708],[-1235.448,55.658],[-1209.728,42.608],[-1203.089,9.366],[-1195.7,-129.26]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[1.986,2.766],[0.89,-5.206],[3.215,-22.159],[8.952,-19.155],[21.82,-5.984],[8.3,-0.511],[21.083,2.234],[-18.891,-3.183],[-33.08,4.316],[-5.887,9.196],[-0.905,11.39],[1.298,46.342]],"o":[[-2.632,4.038],[-3.761,22],[-3.215,22.159],[-8.952,19.155],[-8.02,2.199],[-21.161,1.302],[0,0],[36.844,6.207],[12,-1.566],[5.582,-8.719],[3.655,-46.025],[-0.106,-3.769]],"v":[[-1196.612,-141.705],[-1201.208,-127.088],[-1210.016,-60.407],[-1225.223,10.528],[-1276.118,44.368],[-1300.771,47.87],[-1364.286,46.468],[-1339.808,55.996],[-1228.894,53.767],[-1203.24,40.525],[-1197.829,7.739],[-1194.288,-131.039]]}],"t":420},{"s":[{"c":true,"i":[[2.504,2.82],[1.357,-5.179],[5.023,-22.061],[12.439,-18.899],[21.977,-5.377],[8.311,-0.28],[21.013,2.818],[-18.796,-3.705],[-36.855,6.146],[-8.057,9.03],[-1.601,11.361],[0.016,46.36]],"o":[[-3.6,3.963],[-5.734,21.887],[-5.023,22.061],[-12.439,18.899],[-8.077,1.976],[-21.189,0.715],[0,0],[36.658,7.227],[11.937,-1.991],[7.638,-8.561],[6.469,-45.906],[-0.001,-3.771]],"v":[[-1189.616,-140.561],[-1196.176,-126.077],[-1210.157,-59.666],[-1232.685,10.82],[-1287.483,43.235],[-1312.224,46.052],[-1375.675,42.889],[-1352.25,54.133],[-1240.566,55.083],[-1208.001,40.731],[-1196.651,8.792],[-1186.956,-129.835]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.964705884457,0.549019634724,0.129411771894,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":12,"mn":"ADBE Vector Group","nm":"Head shadow","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-25.907,60.866],[-7.491,12.485],[-2.809,-1.873],[-2.243,-9.177],[0.936,-15.607],[-15.607,0.312],[-9.988,-2.497],[-0.936,-0.312],[-5.931,4.682],[-3.746,-1.249],[2.185,-33.086],[1.249,-4.37],[-0.624,-2.497],[3.746,-11.861],[38.08,-4.682],[29.029,23.098]],"o":[[0,0],[7.491,-12.485],[2.809,1.873],[2.297,9.397],[0,0],[15.607,-0.312],[9.988,2.497],[0.936,0.312],[5.931,-4.682],[3.746,1.249],[-2.185,33.086],[-1.249,4.37],[0.624,2.497],[-3.746,11.861],[-38.08,4.682],[-29.029,-23.098]],"v":[[-1374.467,-97.702],[-1360.421,-143.274],[-1348.56,-158.569],[-1339.508,-138.28],[-1333.89,-107.066],[-1302.364,-104.569],[-1237.128,-100.511],[-1233.694,-99.575],[-1216.839,-122.049],[-1194.365,-145.147],[-1186.25,-112.685],[-1187.498,-65.552],[-1188.123,-51.818],[-1198.735,23.094],[-1243.37,54.308],[-1380.398,42.134]]}],"t":15},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-24.209,61.562],[-7.142,12.688],[-2.86,-1.794],[-1.508,-9.326],[0.503,-15.627],[-13.17,0.678],[-8.504,-2.262],[-0.799,-0.29],[-5.114,5.562],[-2.888,-1.169],[0.747,-33.12],[0.83,-4.395],[-0.545,-2.483],[2.524,-11.936],[37.936,-5.736],[30.711,18.46]],"o":[[0,0],[7.142,-12.688],[2.86,1.794],[1.508,9.326],[0,0],[13.17,-0.678],[8.504,2.262],[0.799,0.29],[6.153,-6.692],[2.888,1.169],[-0.747,33.12],[-0.83,4.395],[0.545,2.483],[-2.524,11.936],[-37.936,5.736],[-31.795,-19.111]],"v":[[-1366.978,-94.103],[-1354.201,-140.046],[-1342.769,-155.664],[-1337.925,-138.789],[-1335.931,-105.136],[-1311.092,-102.931],[-1255.894,-100.403],[-1252.969,-99.548],[-1228.276,-128.297],[-1204.829,-150.127],[-1193.274,-113.911],[-1192.918,-66.77],[-1193.012,-53.028],[-1199.02,22.08],[-1231.716,54.213],[-1375.234,45.216]]}],"t":26},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-25.907,60.866],[-7.491,12.485],[-2.809,-1.873],[-1.249,-9.364],[0.936,-15.607],[-13.183,0.312],[-8.437,-2.497],[-0.791,-0.312],[-5.266,5.418],[-2.855,-1.249],[1.665,-33.086],[0.951,-4.37],[-0.476,-2.497],[2.854,-11.861],[38.08,-4.682],[30.187,19.304]],"o":[[0,0],[7.491,-12.485],[2.809,1.873],[1.249,9.364],[0,0],[13.183,-0.312],[8.437,2.497],[0.791,0.312],[6.336,-6.519],[2.855,1.249],[-1.665,33.086],[-0.951,4.37],[0.476,2.497],[-2.854,11.861],[-38.08,4.682],[-31.253,-19.986]],"v":[[-1374.467,-97.702],[-1360.421,-143.274],[-1348.56,-158.569],[-1344.186,-141.566],[-1343.126,-107.87],[-1318.357,-104.977],[-1263.251,-100.919],[-1260.351,-99.983],[-1234.87,-128.037],[-1210.826,-149.207],[-1200.281,-112.685],[-1201.232,-65.552],[-1201.708,-51.818],[-1209.796,23.094],[-1243.37,54.308],[-1386.584,41.334]]}],"t":128},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-19.009,60.866],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-5.266,5.418],[-2.855,-1.249],[1.665,-33.086],[0.951,-4.37],[-0.476,-2.497],[2.854,-11.861],[38.08,-4.682],[22.15,19.304]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.336,-6.519],[2.855,1.249],[-1.665,33.086],[-0.951,4.37],[0.476,2.497],[-2.854,11.861],[-38.08,4.682],[-22.932,-19.986]],"v":[[-1365.844,-97.702],[-1355.537,-143.274],[-1346.834,-158.569],[-1337.713,-142.26],[-1330.742,-107.131],[-1312.745,-104.977],[-1262.506,-100.919],[-1260.351,-99.983],[-1234.87,-128.037],[-1210.826,-149.207],[-1200.281,-112.685],[-1201.232,-65.552],[-1201.708,-51.818],[-1209.796,23.094],[-1243.37,54.308],[-1374.734,41.334]]}],"t":143},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-19.009,60.866],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-5.266,5.418],[-2.855,-1.249],[1.665,-33.086],[0.951,-4.37],[-0.476,-2.497],[2.854,-11.861],[38.08,-4.682],[22.15,19.304]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.336,-6.519],[2.855,1.249],[-1.665,33.086],[-0.951,4.37],[0.476,2.497],[-2.854,11.861],[-38.08,4.682],[-22.932,-19.986]],"v":[[-1365.844,-97.702],[-1355.537,-143.274],[-1346.834,-158.569],[-1337.713,-142.26],[-1330.742,-107.131],[-1312.745,-104.977],[-1262.506,-100.919],[-1260.351,-99.983],[-1234.87,-128.037],[-1210.826,-149.207],[-1200.281,-112.685],[-1201.232,-65.552],[-1201.708,-51.818],[-1209.796,23.094],[-1243.37,54.308],[-1374.734,41.334]]}],"t":210},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-22.443,62.227],[-6.777,12.887],[-2.91,-1.712],[-1.773,-9.279],[0.057,-15.635],[-13.145,1.053],[-8.565,-2.019],[-0.807,-0.267],[-4.953,5.706],[-2.92,-1.086],[-0.198,-33.128],[0.704,-4.416],[-0.615,-2.466],[2.183,-12.003],[37.757,-6.816],[31.225,17.576]],"o":[[0,0],[6.777,-12.887],[2.91,1.712],[1.773,9.279],[0,0],[13.145,-1.053],[8.565,2.019],[0.807,0.267],[5.96,-6.865],[2.92,1.086],[0.198,33.128],[-0.704,4.416],[0.615,2.466],[-2.183,12.003],[-37.757,6.816],[-32.327,-18.197]],"v":[[-1366.314,-92.012],[-1354.853,-138.302],[-1343.871,-154.239],[-1338.548,-137.509],[-1335.594,-103.926],[-1310.702,-102.431],[-1255.455,-101.479],[-1252.506,-100.707],[-1228.643,-130.15],[-1205.829,-152.639],[-1193.246,-116.768],[-1191.545,-69.656],[-1191.247,-55.917],[-1195.109,19.331],[-1226.875,52.384],[-1370.591,47.486]]}],"t":246},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-22.338,62.265],[-6.755,12.898],[-2.913,-1.707],[-1.789,-9.276],[0.031,-15.635],[-13.143,1.075],[-8.568,-2.004],[-0.808,-0.266],[-4.944,5.714],[-2.922,-1.081],[-0.254,-33.127],[0.697,-4.418],[-0.62,-2.465],[2.163,-12.007],[37.745,-6.88],[31.254,17.523]],"o":[[0,0],[6.755,-12.898],[2.913,1.707],[1.789,9.276],[0,0],[13.143,-1.075],[8.568,2.004],[0.808,0.266],[5.948,-6.875],[2.922,1.081],[0.254,33.127],[-0.697,4.418],[0.62,2.465],[-2.163,12.007],[-37.745,6.88],[-32.358,-18.142]],"v":[[-1367.564,-93.985],[-1356.181,-140.294],[-1345.226,-156.25],[-1337.683,-138.48],[-1332.763,-105.124],[-1311.97,-104.497],[-1256.721,-103.638],[-1253.771,-102.871],[-1229.958,-132.354],[-1207.181,-154.881],[-1194.538,-119.031],[-1192.758,-71.922],[-1192.437,-58.184],[-1196.172,17.071],[-1227.883,50.177],[-1371.607,45.52]]}],"t":291},{"i":{"x":0.15,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[-19.009,60.866],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-5.267,5.418],[-2.855,-1.249],[1.665,-33.086],[0.951,-4.37],[-0.476,-2.497],[2.854,-11.861],[38.08,-4.682],[22.15,19.304]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.336,-6.519],[2.854,1.249],[-1.665,33.086],[-0.951,4.37],[0.476,2.497],[-2.854,11.861],[-38.081,4.682],[-22.932,-19.986]],"v":[[-1360.725,-97.127],[-1350.419,-142.699],[-1341.716,-157.994],[-1332.594,-141.685],[-1325.624,-106.556],[-1307.626,-104.402],[-1251.518,-98.38],[-1249.363,-97.444],[-1229.751,-127.462],[-1205.708,-148.632],[-1195.162,-112.11],[-1196.114,-64.978],[-1196.589,-51.244],[-1204.677,23.669],[-1238.252,54.882],[-1369.615,41.909]]}],"t":312},{"i":{"x":0.6,"y":1},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[-19.009,60.866],[-5.497,12.485],[-2.061,-1.873],[-2.501,-9.07],[0.626,-15.607],[-12.019,0.312],[-7.692,-2.497],[-0.791,-0.312],[-5.267,5.418],[-2.855,-1.249],[1.665,-33.086],[0.951,-4.37],[-0.476,-2.497],[2.854,-11.861],[38.08,-4.682],[22.15,19.304]],"o":[[0,0],[5.497,-12.485],[2.061,1.873],[2.501,9.07],[0,0],[12.019,-0.312],[7.692,2.497],[0.791,0.312],[6.336,-6.519],[2.854,1.249],[-1.665,33.086],[-0.951,4.37],[0.476,2.497],[-2.854,11.861],[-38.081,4.682],[-22.932,-19.986]],"v":[[-1360.725,-97.127],[-1350.419,-142.699],[-1341.716,-157.994],[-1332.594,-141.685],[-1325.624,-106.556],[-1307.626,-104.402],[-1251.518,-98.38],[-1249.363,-97.444],[-1229.751,-127.462],[-1205.708,-148.632],[-1195.162,-112.11],[-1196.114,-64.978],[-1196.589,-51.244],[-1204.677,23.669],[-1238.252,54.882],[-1369.615,41.909]]}],"t":407},{"i":{"x":0.2,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-24.209,61.562],[-7.142,12.688],[-2.86,-1.794],[-2.173,-9.194],[0.503,-15.627],[-13.17,0.678],[-8.504,-2.262],[-0.799,-0.29],[-6.127,9.197],[-3.807,-2.701],[0.747,-33.12],[0.83,-4.395],[-0.545,-2.483],[2.524,-11.936],[37.936,-5.736],[30.711,18.46]],"o":[[0,0],[7.142,-12.688],[2.86,1.794],[2.173,9.194],[0,0],[13.17,-0.678],[8.504,2.262],[0.799,0.29],[5.041,-7.566],[2.541,1.803],[-0.747,33.12],[-0.83,4.395],[0.545,2.483],[-2.524,11.936],[-37.936,5.736],[-31.795,-19.111]],"v":[[-1366.978,-94.103],[-1354.201,-140.046],[-1342.769,-155.664],[-1334.299,-137.905],[-1329.03,-103.629],[-1311.092,-102.931],[-1251.081,-99.616],[-1248.155,-98.76],[-1227.228,-127.616],[-1204.829,-150.127],[-1193.274,-113.911],[-1192.918,-66.77],[-1193.012,-53.028],[-1199.02,22.08],[-1231.716,54.213],[-1375.234,45.216]]}],"t":420},{"s":[{"c":true,"i":[[-25.907,60.866],[-7.491,12.485],[-2.809,-1.873],[-2.955,-8.973],[-1.346,-14.959],[-15.607,0.312],[-9.988,-2.497],[-0.936,-0.312],[-5.931,4.682],[-3.746,-1.249],[2.185,-33.086],[1.249,-4.37],[-0.624,-2.497],[3.746,-11.861],[38.08,-4.682],[29.029,23.098]],"o":[[0,0],[7.491,-12.485],[2.809,1.873],[2.861,8.687],[0,0],[15.607,-0.312],[9.988,2.497],[0.936,0.312],[5.931,-4.682],[3.746,1.249],[-2.185,33.086],[-1.249,4.37],[0.624,2.497],[-3.746,11.861],[-38.08,4.682],[-29.029,-23.098]],"v":[[-1374.467,-97.702],[-1360.421,-143.274],[-1348.56,-158.569],[-1339.508,-138.28],[-1331.415,-106.992],[-1302.364,-104.569],[-1237.128,-100.511],[-1233.694,-99.575],[-1216.839,-122.049],[-1194.365,-145.147],[-1186.25,-112.685],[-1187.498,-65.552],[-1188.123,-51.818],[-1198.735,23.094],[-1243.37,54.308],[-1380.398,42.134]]}],"t":442}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":13,"mn":"ADBE Vector Group","nm":"Head fill","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-0.227,-2.778],[-1.353,-0.367],[-6.471,-0.544],[-9.867,-0.295],[-27.649,6.141],[-0.11,0.604],[0.126,4.4],[23.479,-1.053],[22.589,6.489]],"o":[[-0.46,2.749],[0.276,3.372],[6.944,1.884],[9.96,0.837],[28.31,0.848],[0.53,-0.118],[0.79,-4.331],[-23.364,2.552],[-23.479,1.053],[0,0]],"v":[[-1363.494,52.882],[-1363.618,60.993],[-1360.808,65.864],[-1340.115,69.258],[-1311.792,71.49],[-1227.493,66.408],[-1225.32,64.112],[-1224.321,50.967],[-1294.474,57.901],[-1364.349,51.193]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372618675,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":14,"mn":"ADBE Vector Group","nm":"Helmet collar","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[23.023,-3.817],[33.186,-39.093],[-12.733,-48.658],[-9.231,-8.019],[0,0],[-44.404,6.65],[-17.923,25.701],[-7.441,17.862],[7.154,26.212],[82.928,18.735]],"o":[[-49.619,8.226],[-26.764,31.528],[8.177,31.247],[23.191,20.147],[44.717,4.039],[13.81,-2.068],[11.068,-15.872],[10.449,-25.081],[-4.744,-17.383],[-22.763,-5.143]],"v":[[-1304.764,-207.839],[-1414.922,-146.333],[-1438.469,-15.523],[-1407.347,36.657],[-1363.455,64.003],[-1228.244,63.996],[-1159.167,21.376],[-1131.354,-31.799],[-1131.22,-103.357],[-1246.445,-202.29]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.243137255311,0.65098041296,1,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":15,"mn":"ADBE Vector Group","nm":"Helmet fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-1280.449,-66.313]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1280.449,-66.313]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Head and Helmet","np":15,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":25,"ip":45,"ks":{"a":{"a":0,"ix":1,"k":[-365,-428,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.77],"y":[0.604]},"o":{"x":[0.291],"y":[0.2]},"s":[179],"t":45},{"i":{"x":[0.674],"y":[0.494]},"o":{"x":[0.436],"y":[0.467]},"s":[372],"t":190.139},{"i":{"x":[0.754],"y":[0.922]},"o":{"x":[0.106],"y":[0.184]},"s":[663],"t":326},{"s":[925],"t":462}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.677],"y":[0.967]},"o":{"x":[0.304],"y":[0.004]},"s":[193],"t":45},{"i":{"x":[0.307],"y":[0.87]},"o":{"x":[0.59],"y":[-0.043]},"s":[219],"t":190.139},{"i":{"x":[0.579],"y":[1.231]},"o":{"x":[0.211],"y":[-1.351]},"s":[185],"t":326},{"s":[186],"t":462}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.247],"y":[1.161]},"o":{"x":[0.167],"y":[0.167]},"s":[-9],"t":45},{"i":{"x":[0.712],"y":[0.509]},"o":{"x":[0.488],"y":[0.067]},"s":[2],"t":133},{"i":{"x":[0.459],"y":[1.036]},"o":{"x":[0.207],"y":[0.301]},"s":[-14.225],"t":216},{"i":{"x":[0.384],"y":[0.716]},"o":{"x":[0.499],"y":[0.027]},"s":[-23.61],"t":257},{"i":{"x":[0.713],"y":[0.925]},"o":{"x":[0.305],"y":[0.876]},"s":[-12],"t":298},{"s":[-9],"t":364}]},"s":{"a":0,"ix":6,"k":[-21,21,100]}},"nm":"striped fish 3","op":480,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.644,1.367],[-1.367,-2.644],[2.644,-1.367],[1.367,2.644]],"o":[[2.644,-1.367],[1.367,2.644],[-2.644,1.367],[-1.367,-2.644]],"v":[[-278.01,-464.082],[-270.748,-461.771],[-273.06,-454.508],[-280.322,-456.82]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 18","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":186.213},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":197.193},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":208.18},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":219.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":230.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":241.125},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":252.107},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":303.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":316.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":329.578},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":376.518},{"s":[0],"t":385.373046875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"dots 18","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.397,1.24],[-1.24,-2.397],[2.397,-1.24],[1.24,2.397]],"o":[[2.397,-1.24],[1.24,2.397],[-2.397,1.24],[-1.24,-2.397]],"v":[[-271.779,-452.636],[-265.195,-450.54],[-267.29,-443.955],[-273.875,-446.051]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 12","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":199.391},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":212.207},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.016},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":237.832},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":250.646},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":263.455},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":276.27},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":303.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":316.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":329.578},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":376.518},{"s":[0],"t":385.373046875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"dots 12","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.637,1.363],[-1.363,-2.637],[2.637,-1.363],[1.363,2.637]],"o":[[2.637,-1.363],[1.363,2.637],[-2.637,1.363],[-1.363,-2.637]],"v":[[-269.885,-474.475],[-262.643,-472.169],[-264.948,-464.927],[-272.19,-467.232]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 17","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":186.213},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":197.928},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":209.643},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":221.357},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":233.072},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":244.783},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":256.5},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":314.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":327.008},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":339.861},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":374.746},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":383.602},{"s":[0],"t":392.458984375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"dots 17","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.41,1.246],[-1.246,-2.41],[2.41,-1.246],[1.246,2.41]],"o":[[2.41,-1.246],[1.246,2.41],[-2.41,1.246],[-1.246,-2.41]],"v":[[-258.674,-446.065],[-252.052,-443.958],[-254.16,-437.336],[-260.781,-439.444]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 11","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.193},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208.18},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":233.438},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":247.715},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":261.992},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":276.27},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":314.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":327.008},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":339.861},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":374.746},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":383.602},{"s":[0],"t":392.458984375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"dots 11","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.805,1.451],[-1.451,-2.805],[2.805,-1.451],[1.451,2.805]],"o":[[2.805,-1.451],[1.451,2.805],[-2.805,1.451],[-1.451,-2.805]],"v":[[-262.366,-484.789],[-254.66,-482.337],[-257.113,-474.63],[-264.819,-477.083]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 16","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190.605},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":204.336},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":218.062},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":231.791},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":245.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":256.5},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":267.484},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":319.299},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.152},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":345},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":378.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":387.143},{"s":[0],"t":396}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"dots 16","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.784,1.44],[-1.44,-2.784],[2.784,-1.44],[1.44,2.784]],"o":[[2.784,-1.44],[1.44,2.784],[-2.784,1.44],[-1.44,-2.784]],"v":[[-242.346,-444.75],[-234.699,-442.316],[-237.133,-434.67],[-244.78,-437.103]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 10","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":203.785},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":211.838},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.895},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":227.945},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":244.783},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":261.627},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":278.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":319.299},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.152},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":345},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":378.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":387.143},{"s":[0],"t":396}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"dots 10","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.607,1.348],[-1.348,-2.607],[2.607,-1.348],[1.348,2.607]],"o":[[2.607,-1.348],[1.348,2.607],[-2.607,1.348],[-1.348,-2.607]],"v":[[-331.273,-454.413],[-324.112,-452.133],[-326.391,-444.972],[-333.552,-447.252]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 15","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":192.803},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":203.785},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.768},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":225.748},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":255.922},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":272.689},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":300},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":303.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":316.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":329.578},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":376.518},{"s":[0],"t":385.373046875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"dots 15","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.896,1.497],[-1.497,-2.896],[2.896,-1.497],[1.497,2.896]],"o":[[2.896,-1.497],[1.497,2.896],[-2.896,1.497],[-1.497,-2.896]],"v":[[-329.246,-442.538],[-321.292,-440.007],[-323.824,-432.052],[-331.778,-434.584]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 9","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":188.41},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":202.322},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":223.555},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":233.375},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":241.125},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":252.107},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":271.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":303.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":316.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":329.578},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":376.518},{"s":[0],"t":385.373046875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"dots 9","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.823,1.46],[-1.46,-2.823],[2.823,-1.46],[1.46,2.823]],"o":[[2.823,-1.46],[1.46,2.823],[-2.823,1.46],[-1.46,-2.823]],"v":[[-322.06,-463.812],[-314.305,-461.344],[-316.773,-453.589],[-324.528,-456.057]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 14","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":208.18},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":217.691},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":227.217},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":236.734},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":246.246},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":255.771},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":265.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":311.586},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":324.439},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":337.291},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":372.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":381.83},{"s":[0],"t":390.6875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":9,"mn":"ADBE Vector Group","nm":"dots 14","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.459,1.271],[-1.271,-2.459],[2.459,-1.271],[1.271,2.459]],"o":[[2.459,-1.271],[1.271,2.459],[-2.459,1.271],[-1.271,-2.459]],"v":[[-317.719,-435.153],[-310.965,-433.003],[-313.114,-426.249],[-319.868,-428.399]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 8","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.193},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":204.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":211.838},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":219.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":230.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":241.125},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":252.107},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":311.586},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":324.439},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":337.291},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":372.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":381.83},{"s":[0],"t":390.6875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":10,"mn":"ADBE Vector Group","nm":"dots 8","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.93,1.515],[-1.515,-2.93],[2.93,-1.515],[1.515,2.93]],"o":[[2.93,-1.515],[1.515,2.93],[-2.93,1.515],[-1.515,-2.93]],"v":[[-312.483,-475.015],[-304.435,-472.453],[-306.996,-464.405],[-315.045,-466.966]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 13","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":192.803},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":207.08},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":221.357},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":235.635},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":249.912},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":264.189},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":278.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":319.299},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.152},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":345},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":378.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":387.143},{"s":[0],"t":396}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":11,"mn":"ADBE Vector Group","nm":"dots 13","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.807,1.452],[-1.452,-2.807],[2.807,-1.452],[1.452,2.807]],"o":[[2.807,-1.452],[1.452,2.807],[-2.807,1.452],[-1.452,-2.807]],"v":[[-306.368,-430.793],[-298.656,-428.339],[-301.111,-420.626],[-308.823,-423.081]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 7","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.193},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":207.809},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":218.432},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":229.043},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":242.59},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":256.135},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":269.682},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":319.299},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.152},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":345},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":378.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":387.143},{"s":[0],"t":396}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":12,"mn":"ADBE Vector Group","nm":"dots 7","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.748,1.421],[-1.421,-2.748],[2.748,-1.421],[1.421,2.748]],"o":[[2.748,-1.421],[1.421,2.748],[-2.748,1.421],[-1.421,-2.748]],"v":[[-383.108,-444.271],[-375.559,-441.868],[-377.962,-434.319],[-385.511,-436.722]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190.605},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":204.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":218.426},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":232.34},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":246.252},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":260.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":274.072},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":303.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":316.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":329.578},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":376.518},{"s":[0],"t":385.373046875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":13,"mn":"ADBE Vector Group","nm":"dots 5","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.766,1.43],[-1.43,-2.766],[2.766,-1.43],[1.43,2.766]],"o":[[2.766,-1.43],[1.43,2.766],[-2.766,1.43],[-1.43,-2.766]],"v":[[-384.125,-430.303],[-376.527,-427.885],[-378.945,-420.287],[-386.543,-422.705]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 6","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":199.391},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208.912},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":218.426},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":227.945},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":253.57},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":269.682},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":303.877},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":316.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":329.578},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":376.518},{"s":[0],"t":385.373046875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":14,"mn":"ADBE Vector Group","nm":"dots 6","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.6,1.345],[-1.345,-2.6],[2.6,-1.345],[1.345,2.6]],"o":[[2.6,-1.345],[1.345,2.6],[-2.6,1.345],[-1.345,-2.6]],"v":[[-373.851,-454.409],[-366.708,-452.136],[-368.982,-444.992],[-376.125,-447.266]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":192.803},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":203.785},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":212.57},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":221.357},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":230.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":238.93},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":247.715},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":311.586},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":324.439},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":337.291},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":372.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":381.83},{"s":[0],"t":390.6875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":15,"mn":"ADBE Vector Group","nm":"dots 3","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.597,1.343],[-1.343,-2.597],[2.597,-1.343],[1.343,2.597]],"o":[[2.597,-1.343],[1.343,2.597],[-2.597,1.343],[-1.343,-2.597]],"v":[[-370.848,-424.403],[-363.714,-422.133],[-365.985,-414.998],[-373.119,-417.269]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":185.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":195},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":212.57},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":230.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":241.125},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":252.107},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":276.27},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":311.586},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":324.439},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":337.291},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":372.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":381.83},{"s":[0],"t":390.6875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":16,"mn":"ADBE Vector Group","nm":"dots 4","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.944,1.522],[-1.522,-2.944],[2.944,-1.522],[1.522,2.944]],"o":[[2.944,-1.522],[1.522,2.944],[-2.944,1.522],[-1.522,-2.944]],"v":[[-364.496,-466.04],[-356.41,-463.466],[-358.983,-455.38],[-367.07,-457.953]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":192.803},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":203.785},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.768},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":243.322},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":252.932},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":262.543},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":278.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":319.299},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.152},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":345},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":378.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":387.143},{"s":[0],"t":396}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":17,"mn":"ADBE Vector Group","nm":"dots","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.68,1.386],[-1.386,-2.68],[2.68,-1.386],[1.386,2.68]],"o":[[2.68,-1.386],[1.386,2.68],[-2.68,1.386],[-1.386,-2.68]],"v":[[-358.249,-418.562],[-350.888,-416.219],[-353.231,-408.858],[-360.591,-411.201]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":199.391},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":210.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":221.357},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":232.34},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243.322},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":254.305},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":265.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":319.299},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.152},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":345},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":378.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":387.143},{"s":[0],"t":396}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":18,"mn":"ADBE Vector Group","nm":"dots 2","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-0.787,4.783],[-3.53,3.322],[-0.752,0.191],[-1.009,-1.757],[-0.469,-5.598],[0.123,-0.319],[0.443,-0.254],[5.377,-2.171]],"o":[[-0.264,-4.84],[0.787,-4.783],[0.565,-0.532],[1.964,-0.499],[2.797,4.872],[0.029,0.341],[-0.184,0.476],[-5.031,2.884],[0,0]],"v":[[-268.562,-391.745],[-268.301,-406.254],[-262.051,-419.097],[-260.105,-420.326],[-255.349,-417.283],[-251.552,-401.011],[-251.62,-399.996],[-252.718,-398.975],[-268.356,-391.382]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-3.975,8.311],[-2.071,0.172],[-1.196,-1.654],[0.251,-6.78],[0.168,-0.307],[0.439,-0.211],[5.253,-2.343],[0.466,0.522]],"o":[[-0.343,-9.206],[0.896,-1.875],[2.034,-0.169],[3.976,5.497],[-0.013,0.35],[-0.234,0.427],[-5.186,2.487],[-0.639,0.285],[0,0]],"v":[[-303.201,-377.675],[-299.375,-404.766],[-295.016,-408.806],[-290.098,-405.644],[-284.296,-386.523],[-284.5,-385.503],[-285.64,-384.628],[-301.299,-377.383],[-303.254,-377.374]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-4.199,9.826],[-1.482,0.717],[-1.691,-1.506],[-0.941,-4.257],[0.521,-4.392],[0.3,-0.433],[0.422,-0.251],[6.634,-0.542]],"o":[[-0.985,-10.584],[0.632,-1.478],[2.058,-0.995],[3.317,2.954],[0.956,4.324],[-0.061,0.517],[-0.275,0.397],[-5.664,3.373],[0,0]],"v":[[-348.784,-363.5],[-343.867,-394.716],[-340.962,-398.475],[-334.688,-396.895],[-328.963,-385.294],[-327.977,-372.124],[-328.422,-370.639],[-329.548,-369.721],[-348.342,-363.739]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-2.124,7.058],[-4.732,1.899],[-1.513,-0.992],[-0.554,-1.002],[0.458,-8.291],[0.277,-0.457],[0.394,-0.233],[2.439,-0.322],[5.037,-0.665]],"o":[[0.451,-7.357],[1.469,-4.883],[1.679,-0.674],[0.957,0.628],[4.019,7.266],[-0.029,0.534],[-0.237,0.391],[-2.119,1.25],[-5.037,0.665],[0,0]],"v":[[-390.46,-353.652],[-385.747,-375.201],[-377.547,-387.47],[-372.333,-387.239],[-370.162,-384.622],[-366.949,-360.269],[-367.292,-358.72],[-368.311,-357.822],[-375.384,-355.902],[-390.495,-353.906]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":157},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":167.199},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":177.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":187.6},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":440.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":450.801},{"s":[0],"t":462}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":19,"mn":"ADBE Vector Group","nm":"stripes","np":5,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[4.818,-7.964],[-0.071,-0.543],[-0.388,-0.372],[-12.193,-0.364]],"o":[[-5.794,7.284],[-0.283,0.468],[0.07,0.533],[8.803,8.444],[0,0]],"v":[[-260.836,-478.945],[-276.775,-456.042],[-277.279,-454.514],[-276.418,-453.19],[-243.427,-439.348]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[6.274,-9.991],[-9.235,-4.045]],"o":[[-8.82,7.836],[7.735,6.466],[0,0]],"v":[[-309.475,-468.673],[-332.269,-441.751],[-306.642,-425.877]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[8.256,-11.093],[-10.904,-5.377]],"o":[[-9.424,10.119],[10.904,5.377],[0,0]],"v":[[-361.705,-460.818],[-388.252,-428.968],[-355.539,-412.837]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.344,0.488]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-190.818,-472.842]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-20.97,12.957]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-200.277,-485.07]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-24.621,1.19]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-187.841,-459.3]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-21.837,11.436]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-194.923,-485.111]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-21.837,11.436]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-194.923,-485.111]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-21.837,11.436]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-194.923,-485.111]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-24.409,3.438]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-188.459,-464.901]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.823,9.314]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-193.995,-478.552]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-24.645,0.499]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.94,-455.493]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-21.837,11.436]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-194.923,-485.111]]}],"t":384},{"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-24.409,3.438]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-188.459,-464.901]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[1.097,-1.636],[0.372,-2.467],[-1.219,-1.825],[-1.689,0.394],[-1.224,1.71],[-0.272,1.637],[1.022,1.762],[1.499,0.806]],"o":[[-1.559,-0.417],[-1.222,1.822],[-0.372,2.467],[1.182,1.769],[1.689,-0.394],[0.842,-1.176],[0.37,-2.226],[-1.022,-1.762],[0,0]],"v":[[-448.595,-443.882],[-452.744,-441.185],[-455.36,-434.713],[-454.154,-427.647],[-449.429,-425.61],[-444.988,-429.06],[-443.138,-433.282],[-444.347,-439.673],[-448.306,-443.422]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":157},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":167.199},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":177.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":187.6},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":256},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":440.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":450.801},{"s":[0],"t":462}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":20,"mn":"ADBE Vector Group","nm":"strokes","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106,-10],[25,-14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106,10],[-25,14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-209,-491],[-209,-421],[-432,-353],[-521.357,-405.581]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-104.511,20.332],[20.031,-20.488],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.511,-20.332],[-20.031,20.488],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-222.846,-497.356],[-203.083,-430.203],[-432,-353],[-521.357,-405.581]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-101.298,-32.784],[27.444,-8.236],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[101.298,32.784],[-27.444,8.236],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-201.646,-480.973],[-216.849,-412.644],[-432,-353],[-521.357,-405.581]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.974,23.231],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.089,-22.395],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.974,23.231],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.089,-22.395],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.974,23.231],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.089,-22.395],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-109.504,-14.378],[26.575,-10.713],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.564,13.861],[-26.575,10.713],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-204.189,-485.22],[-213.075,-415.786],[-432,-353],[-515.729,-412.062]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-109.69,12.889],[23.14,-16.898],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.743,-12.425],[-23.14,16.898],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-214.224,-494.398],[-205.828,-424.903],[-432,-353],[-515.729,-412.062]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.285,11.221],[12,6],[-35,13],[-107.003,-27.354],[27.664,-7.462],[78,9],[6.18,21.925]],"o":[[0,0],[-12,-6],[35,-13],[103.153,26.37],[-27.664,7.462],[-78,-9],[0,0]],"v":[[-483,-409],[-511.576,-420.114],[-470,-460],[-203.131,-477.545],[-220.247,-409.67],[-432,-353],[-516.727,-396.945]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.974,23.231],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.089,-22.395],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":384},{"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-109.504,-14.378],[26.575,-10.713],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.564,13.861],[-26.575,10.713],[-78,-9],[0,0]],"v":[[-483,-409],[-510.727,-414.825],[-470,-460],[-204.189,-485.22],[-213.075,-415.786],[-432,-353],[-515.729,-412.062]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":157},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":167.199},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":177.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":187.6},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":256},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":440.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":450.801},{"s":[0],"t":462}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":21,"mn":"ADBE Vector Group","nm":"body stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106,-10],[25,-14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106,10],[-25,14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-209,-491],[-209,-421],[-432,-353],[-521.357,-405.581]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-104.511,20.332],[20.031,-20.488],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.511,-20.332],[-20.031,20.488],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-222.846,-497.356],[-203.083,-430.203],[-432,-353],[-521.357,-405.581]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-101.298,-32.784],[27.444,-8.236],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[101.298,32.784],[-27.444,8.236],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-201.646,-480.973],[-216.849,-412.644],[-432,-353],[-521.357,-405.581]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.872,21.351],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.444,-20.673],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.872,21.351],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.444,-20.673],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.872,21.351],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.444,-20.673],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-108.777,-16.115],[26.575,-10.713],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.321,15.603],[-26.575,10.713],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-204.189,-485.22],[-213.075,-415.786],[-432,-353],[-515.729,-412.062]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-109.41,11.028],[23.14,-16.898],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.934,-10.677],[-23.14,16.898],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-214.224,-494.398],[-205.828,-424.903],[-432,-353],[-515.729,-412.062]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.603,11.715],[12,6],[-35,13],[-106.074,-28.991],[27.664,-7.462],[78,9],[6.18,21.925]],"o":[[0,0],[-12,-6],[35,-13],[102.704,28.07],[-27.664,7.462],[-78,-9],[0,0]],"v":[[-483,-409],[-511.89,-421.262],[-470,-460],[-203.131,-477.545],[-220.247,-409.67],[-432,-353],[-516.727,-396.945]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-107.872,21.351],[21.434,-19.015],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.444,-20.673],[-21.434,19.015],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-216.563,-498.968],[-201.616,-430.582],[-432,-353],[-515.729,-412.062]]}],"t":384},{"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-108.777,-16.115],[26.575,-10.713],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.321,15.603],[-26.575,10.713],[-78,-9],[0,0]],"v":[[-483,-409],[-511.042,-415.973],[-470,-460],[-204.189,-485.22],[-213.075,-415.786],[-432,-353],[-515.729,-412.062]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":22,"mn":"ADBE Vector Group","nm":"body","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-18.348,-0.263]],"o":[[18.348,0.263],[0,0]],"v":[[-166.761,-456.561],[-111.717,-455.773]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.82,10.821]],"o":[[17.676,-4.928],[0,0]],"v":[[-172.602,-476.242],[-119.976,-506.493]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-16.357,-9.638]],"o":[[17.853,4.241],[0,0]],"v":[[-167.895,-438.182],[-112.758,-422.061]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-13.779,12.238]],"o":[[17.981,-3.661],[0,0]],"v":[[-167.944,-474.342],[-113.382,-509.203]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-17.693,5.159]],"o":[[17.981,-3.661],[0,0]],"v":[[-167.944,-474.342],[-110.794,-485.904]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.762,11.033]],"o":[[17.981,-3.661],[0,0]],"v":[[-167.944,-474.342],[-111.038,-505.592]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-11.866,-10.865]],"o":[[18.166,2.59],[0,0]],"v":[[-166.664,-445.697],[-114.7,-424.739]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.953,9.951]],"o":[[18.247,-1.94],[0,0]],"v":[[-168.159,-465.274],[-106.558,-489.544]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-19.153,-7.987]],"o":[[17.727,4.741],[0,0]],"v":[[-170.595,-433.824],[-117.731,-420.503]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-13.779,12.238]],"o":[[17.981,-3.661],[0,0]],"v":[[-167.944,-474.342],[-113.382,-509.203]]}],"t":384},{"s":[{"c":false,"i":[[0,0],[-11.866,-10.865]],"o":[[18.166,2.59],[0,0]],"v":[[-166.664,-445.697],[-114.7,-424.739]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.713,1.78],[-8.214,-1.295]],"o":[[7.881,0.74],[8.102,-1.87],[0,0]],"v":[[-163.585,-469.139],[-139.992,-470.712],[-115.533,-474.547]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-6.896,3.885],[-3.972,8.323]],"o":[[7.769,-1.515],[7.245,-4.081],[0,0]],"v":[[-173.106,-489.205],[-152.479,-503.119],[-135.428,-522.797]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.662,-1.989],[-8.356,-3.398]],"o":[[7.532,2.434],[8.049,2.089],[0,0]],"v":[[-162.063,-449.77],[-137.816,-448.22],[-112.569,-444.524]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-6.308,4.782],[-4.819,9.708]],"o":[[7.857,-0.96],[7.288,-5.525],[0,0]],"v":[[-167.527,-487.308],[-147.414,-500.863],[-130.23,-524.02]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.748,1.62],[-8.512,6.709]],"o":[[7.857,-0.96],[8.952,-1.871],[0,0]],"v":[[-167.527,-487.308],[-145.119,-492.942],[-119.673,-506.509]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-5.666,5.813],[-5.62,9.267]],"o":[[7.857,-0.96],[6.384,-6.549],[0,0]],"v":[[-167.527,-487.308],[-145.867,-499.111],[-126.576,-521.777]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.842,-1.076],[-10.547,-5.09]],"o":[[7.723,1.735],[9.061,1.244],[0,0]],"v":[[-161.916,-457.77],[-138.917,-455.551],[-111.479,-446.943]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.541,5.06],[-8.728,9.689]],"o":[[7.416,-1.818],[7.594,-5.096],[0,0]],"v":[[-166.514,-478.142],[-143.098,-488.388],[-120.318,-507.266]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-12.352,-0.281],[-13.01,-0.883]],"o":[[7.574,0.966],[9.143,0.208],[0,0]],"v":[[-164.439,-445.243],[-138.905,-446.398],[-112.288,-442.269]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-6.308,4.782],[-4.819,9.708]],"o":[[7.857,-0.96],[7.288,-5.525],[0,0]],"v":[[-167.527,-487.308],[-147.414,-500.863],[-130.23,-524.02]]}],"t":384},{"s":[{"c":false,"i":[[0,0],[-7.842,-1.076],[-10.547,-5.09]],"o":[[7.723,1.735],[9.061,1.244],[0,0]],"v":[[-161.916,-457.77],[-138.917,-455.551],[-111.479,-446.943]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-19.901,2.69]],"o":[[19.516,-4.733],[0,0]],"v":[[-170.618,-481.143],[-113.533,-499.985]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-6.566,17.502]],"o":[[17.386,-10.051],[0,0]],"v":[[-183.242,-498.735],[-148.006,-540.732]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-22.937,-1.122]],"o":[[20.079,-0.381],[0,0]],"v":[[-166.321,-463.015],[-109.18,-466.166]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-6.098,15.635]],"o":[[18.056,-8.791],[0,0]],"v":[[-176.961,-497.534],[-145.53,-537.216]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-12.206,11.517]],"o":[[18.056,-8.791],[0,0]],"v":[[-176.961,-497.534],[-127.848,-524.986]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.395,15.065]],"o":[[18.056,-8.791],[0,0]],"v":[[-176.961,-497.534],[-139.448,-534.819]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-16.3,-4.326]],"o":[[19.959,-2.217],[0,0]],"v":[[-167.369,-470.57],[-108.772,-466.966]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-9.083,14.579]],"o":[[18.808,-7.04],[0,0]],"v":[[-174.937,-489.216],[-132.865,-523.103]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-18.533,-0.856]],"o":[[20.081,0.182],[0,0]],"v":[[-168.324,-458.603],[-107.576,-461.917]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-6.098,15.635]],"o":[[18.056,-8.791],[0,0]],"v":[[-176.961,-497.534],[-145.53,-537.216]]}],"t":384},{"s":[{"c":false,"i":[[0,0],[-16.3,-4.326]],"o":[[19.959,-2.217],[0,0]],"v":[[-167.369,-470.57],[-108.772,-466.966]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[-141.167,-477.879]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":157},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":167.199},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":177.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":187.6},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":440.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":450.801},{"s":[0],"t":462}]},"p":{"a":0,"ix":2,"k":[-141.167,-477.879]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"stripes","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.988,8.335],[-17.113,-1.114],[-5.373,-3.45],[-0.325,-6.378],[1.556,-8.315],[-4.554,-9.947],[0.793,-3.386],[6.326,-0.918],[31.449,6.016],[4.565,16.367]],"o":[[13.134,-11.027],[14.988,-8.335],[6.372,0.415],[5.373,3.45],[0.431,8.448],[-2.012,10.753],[1.448,3.162],[-1.458,6.224],[-31.688,4.597],[-2.685,-16.778],[0,0]],"v":[[-189.538,-489.9],[-148.179,-520.36],[-99.054,-533.075],[-80.845,-527.823],[-71.001,-512.225],[-78.119,-488.054],[-70.044,-456.83],[-67.995,-446.802],[-83.34,-437.409],[-178.93,-439.558],[-189.817,-489.328]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.816,15.265],[-5.727,10.201],[-4.344,0.323],[-2.793,-3.343],[-2.528,-8.072],[-8.69,-6.646],[-0.889,-3.362],[5.155,-3.779],[31.868,-3.107],[9,14.412]],"o":[[9.487,-14.286],[7.816,-15.265],[2.132,-3.799],[4.344,-0.323],[3.7,4.429],[3.27,10.44],[2.763,2.113],[1.634,6.18],[-25.823,18.932],[-7.313,-15.337],[0,0]],"v":[[-203.864,-501.795],[-169.553,-539.871],[-144.145,-573.62],[-132.998,-578.96],[-121.235,-574.495],[-105.978,-540.861],[-78.351,-510.697],[-71.835,-502.803],[-80.976,-487.307],[-179.476,-456.496],[-203.971,-501.168]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-16.811,3.393],[-11.49,-2.199],[-3.352,-2.783],[0.309,-4.345],[3.782,-7.567],[-1.644,-10.815],[1.693,-3.038],[3.809,5.134],[29.392,12.703],[0.901,16.968]],"o":[[15.216,-7.911],[16.811,-3.393],[4.279,0.819],[3.352,2.783],[-0.41,5.756],[-4.891,9.786],[0.523,3.438],[-3.112,5.583],[-19.078,-25.715],[1.023,-16.961],[0,0]],"v":[[-182.887,-475.672],[-127.277,-489.888],[-86.258,-489.963],[-71.844,-483.274],[-66.473,-471.896],[-78.83,-437.092],[-79.871,-396.201],[-80.658,-385.996],[-106.43,-384.271],[-183.466,-424.228],[-183.283,-475.175]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-9.19,14.479],[-8.733,7.784],[-4.247,0.969],[-3.262,-2.888],[-3.707,-7.604],[-9.586,-5.272],[-1.382,-3.192],[5.305,-3.566],[32.008,-0.838],[7.955,15.014]],"o":[[12.797,-7.774],[9.19,-14.479],[3.252,-2.898],[4.247,-0.969],[4.32,3.825],[4.794,9.833],[3.047,1.676],[2.54,5.866],[-26.573,17.864],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-159.228,-539.772],[-143.982,-571.308],[-136.407,-577.26],[-124.109,-574.603],[-103.994,-543.629],[-72.166,-517.937],[-64.544,-511.106],[-81.387,-491.633],[-176.202,-455.133],[-197.465,-501.431]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.505,9.149],[-11.225,3.294],[-4.253,-0.943],[-1.711,-4.006],[-0.094,-8.459],[-6.405,-8.869],[0.118,-3.476],[6.367,0.561],[32.008,-0.838],[7.955,15.014]],"o":[[12.797,-7.774],[14.505,-9.149],[4.18,-1.227],[4.253,0.943],[2.266,5.307],[0.121,10.939],[2.036,2.82],[-0.217,6.388],[-31.896,-2.812],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-145.812,-538.037],[-111.849,-555.13],[-102.456,-557.265],[-92.48,-549.598],[-87.567,-512.994],[-69.808,-476.146],[-65.845,-466.709],[-86.005,-460.587],[-176.202,-455.133],[-197.465,-501.431]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-10.379,13.652],[-9.359,7.02],[-4.314,0.607],[-3.006,-3.153],[-3.053,-7.889],[-9.107,-6.061],[-1.108,-3.297],[5.218,-3.692],[32.008,-0.838],[7.955,15.014]],"o":[[12.797,-7.774],[10.379,-13.652],[3.485,-2.614],[4.314,-0.607],[3.982,4.176],[3.948,10.203],[2.895,1.927],[2.036,6.059],[-26.136,18.496],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-156.212,-537.575],[-136.291,-570.056],[-128.242,-575.348],[-116.211,-571.664],[-98.78,-539.104],[-69.232,-510.818],[-62.213,-503.369],[-79.134,-486.2],[-176.202,-455.133],[-197.465,-501.431]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-17.148,0.202],[-11.289,-3.069],[-3.13,-3.03],[0.64,-4.309],[4.348,-7.256],[-0.815,-10.909],[1.92,-2.9],[5.131,3.811],[30.431,9.96],[2.45,16.814]],"o":[[14.664,-3.025],[17.148,-0.202],[4.204,1.143],[3.13,3.03],[-0.847,5.708],[-5.623,9.384],[0.259,3.468],[-3.529,5.33],[-25.704,-19.092],[-0.533,-16.983],[0,0]],"v":[[-185.024,-481.658],[-117.247,-487.489],[-79.361,-484.275],[-70.24,-481.177],[-65.754,-469.422],[-80.729,-435.662],[-84.886,-394.97],[-86.449,-384.855],[-106.831,-390.191],[-180.893,-430.377],[-185.373,-481.126]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-11.749,12.493],[-10.041,6.003],[-4.354,0.153],[-2.66,-3.45],[-2.211,-8.165],[-8.424,-6.98],[-0.757,-3.395],[6.07,-2.002],[31.944,2.201],[6.495,15.701]],"o":[[13.476,-6.526],[11.749,-12.493],[3.739,-2.235],[4.354,-0.153],[3.524,4.57],[2.86,10.559],[2.678,2.219],[1.391,6.239],[-30.408,10.03],[-4.678,-16.335],[0,0]],"v":[[-194.77,-495.64],[-153.526,-531.234],[-124.933,-556.296],[-116.375,-560.717],[-104.795,-555.795],[-90.863,-521.591],[-64.435,-490.372],[-58.232,-482.23],[-77.151,-465.805],[-178.201,-446.934],[-194.979,-495.039]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-17.081,-1.528],[-10.922,-4.192],[-2.808,-3.33],[1.071,-4.223],[5.057,-6.781],[0.29,-10.936],[2.203,-2.691],[5.323,3.539],[29.023,13.523],[0.425,16.986]],"o":[[14.921,-1.252],[17.081,1.528],[4.067,1.561],[2.808,3.33],[-1.419,5.593],[-6.54,8.769],[-0.092,3.477],[-4.049,4.947],[-26.665,-17.727],[1.499,-16.925],[0,0]],"v":[[-184.528,-471.72],[-113.938,-483.19],[-76.57,-476.172],[-67.807,-472.17],[-64.529,-460.023],[-82.832,-427.945],[-91.071,-387.879],[-93.647,-377.973],[-118.248,-382.713],[-186.551,-420.312],[-184.939,-471.234]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-9.19,14.479],[-8.733,7.784],[-4.247,0.969],[-3.262,-2.888],[-3.707,-7.604],[-9.586,-5.272],[-1.382,-3.192],[5.305,-3.566],[32.008,-0.838],[7.955,15.014]],"o":[[12.797,-7.774],[9.19,-14.479],[3.252,-2.898],[4.247,-0.969],[4.32,3.825],[4.794,9.833],[3.047,1.676],[2.54,5.866],[-26.573,17.864],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-159.228,-539.772],[-143.982,-571.308],[-136.407,-577.26],[-124.109,-574.603],[-103.994,-543.629],[-72.166,-517.937],[-64.544,-511.106],[-81.387,-491.633],[-176.202,-455.133],[-197.465,-501.431]]}],"t":384},{"s":[{"c":false,"i":[[0,0],[-17.148,0.202],[-11.289,-3.069],[-3.13,-3.03],[0.64,-4.309],[4.348,-7.256],[-0.815,-10.909],[1.92,-2.9],[5.131,3.811],[30.431,9.96],[2.45,16.814]],"o":[[14.664,-3.025],[17.148,-0.202],[4.204,1.143],[3.13,3.03],[-0.847,5.708],[-5.623,9.384],[0.259,3.468],[-3.529,5.33],[-25.704,-19.092],[-0.533,-16.983],[0,0]],"v":[[-185.024,-481.658],[-117.247,-487.489],[-79.361,-484.275],[-70.24,-481.177],[-65.754,-469.422],[-80.729,-435.662],[-84.886,-394.97],[-86.449,-384.855],[-106.831,-390.191],[-180.893,-430.377],[-185.373,-481.126]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":157},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":167.199},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":177.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":187.6},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":197.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":208},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":440.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":450.801},{"s":[0],"t":462}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.988,8.335],[-17.113,-1.114],[-5.373,-3.45],[-0.325,-6.378],[1.556,-8.315],[-4.554,-9.947],[0.793,-3.386],[6.326,-0.918],[31.449,6.016],[4.565,16.367]],"o":[[13.134,-11.027],[14.988,-8.335],[6.372,0.415],[5.373,3.45],[0.431,8.448],[-2.012,10.753],[1.448,3.162],[-1.458,6.224],[-31.688,4.597],[-2.685,-16.778],[0,0]],"v":[[-189.538,-489.9],[-148.179,-520.36],[-99.054,-533.075],[-80.845,-527.823],[-71.001,-512.225],[-78.119,-488.054],[-70.044,-456.83],[-67.995,-446.802],[-83.34,-437.409],[-178.93,-439.558],[-189.817,-489.328]]}],"t":106},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-7.816,15.265],[-5.727,10.201],[-4.344,0.323],[-2.793,-3.343],[-2.528,-8.072],[-8.69,-6.646],[-0.889,-3.362],[5.155,-3.779],[31.868,-3.107],[9,14.412]],"o":[[9.487,-14.286],[7.816,-15.265],[2.132,-3.799],[4.344,-0.323],[3.7,4.429],[3.27,10.44],[2.763,2.113],[1.634,6.18],[-25.823,18.932],[-7.313,-15.337],[0,0]],"v":[[-203.864,-501.795],[-169.553,-539.871],[-144.145,-573.62],[-132.998,-578.96],[-121.235,-574.495],[-105.978,-540.861],[-78.351,-510.697],[-71.835,-502.803],[-80.976,-487.307],[-179.476,-456.496],[-203.971,-501.168]]}],"t":149},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-16.811,3.393],[-11.49,-2.199],[-3.352,-2.783],[0.309,-4.345],[3.782,-7.567],[-1.644,-10.815],[1.693,-3.038],[3.809,5.134],[29.392,12.703],[0.901,16.968]],"o":[[15.216,-7.911],[16.811,-3.393],[4.279,0.819],[3.352,2.783],[-0.41,5.756],[-4.891,9.786],[0.523,3.438],[-3.112,5.583],[-19.078,-25.715],[1.023,-16.961],[0,0]],"v":[[-182.887,-475.672],[-127.277,-489.888],[-86.258,-489.963],[-71.844,-483.274],[-66.473,-471.896],[-78.83,-437.092],[-79.871,-396.201],[-80.658,-385.996],[-106.43,-384.271],[-183.466,-424.228],[-183.283,-475.175]]}],"t":186},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-9.19,14.479],[-8.733,7.784],[-4.247,0.969],[-3.262,-2.888],[-3.707,-7.604],[-9.586,-5.272],[-1.382,-3.192],[5.305,-3.566],[32.008,-0.838],[7.955,15.014]],"o":[[13.056,-9.08],[9.19,-14.479],[3.252,-2.898],[4.247,-0.969],[4.32,3.825],[4.794,9.833],[3.047,1.676],[2.54,5.866],[-26.573,17.864],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-159.228,-539.772],[-143.982,-571.308],[-136.407,-577.26],[-124.109,-574.603],[-103.994,-543.629],[-72.166,-517.937],[-64.544,-511.106],[-81.387,-491.633],[-176.202,-455.133],[-197.465,-501.431]]}],"t":208},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-14.505,9.149],[-11.225,3.294],[-4.253,-0.943],[-1.711,-4.006],[-0.094,-8.459],[-6.405,-8.869],[0.118,-3.476],[6.367,0.561],[32.008,-0.838],[7.955,15.014]],"o":[[13.056,-9.08],[14.505,-9.149],[4.18,-1.227],[4.253,0.943],[2.266,5.307],[0.121,10.939],[2.036,2.82],[-0.217,6.388],[-31.896,-2.812],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-145.812,-538.037],[-111.849,-555.13],[-102.456,-557.265],[-92.48,-549.598],[-87.567,-512.994],[-69.808,-476.146],[-65.845,-466.709],[-86.005,-460.587],[-176.202,-455.133],[-197.465,-501.431]]}],"t":230},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-10.379,13.652],[-9.359,7.02],[-4.314,0.607],[-3.006,-3.153],[-3.053,-7.889],[-9.107,-6.061],[-1.108,-3.297],[5.218,-3.692],[32.008,-0.838],[7.955,15.014]],"o":[[13.056,-9.08],[10.379,-13.652],[3.485,-2.614],[4.314,-0.607],[3.982,4.176],[3.948,10.203],[2.895,1.927],[2.036,6.059],[-26.136,18.496],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-156.212,-537.575],[-136.291,-570.056],[-128.242,-575.348],[-116.211,-571.664],[-98.78,-539.104],[-69.232,-510.818],[-62.213,-503.369],[-79.134,-486.2],[-176.202,-455.133],[-197.465,-501.431]]}],"t":256},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-17.148,0.202],[-11.289,-3.069],[-3.13,-3.03],[0.64,-4.309],[4.348,-7.256],[-0.815,-10.909],[1.92,-2.9],[5.131,3.811],[30.431,9.96],[2.45,16.814]],"o":[[15.347,-4.168],[17.148,-0.202],[4.204,1.143],[3.13,3.03],[-0.847,5.708],[-5.623,9.384],[0.259,3.468],[-3.529,5.33],[-25.704,-19.092],[-0.533,-16.983],[0,0]],"v":[[-185.024,-481.658],[-117.247,-487.489],[-79.361,-484.275],[-70.24,-481.177],[-65.754,-469.422],[-80.729,-435.662],[-84.886,-394.97],[-86.449,-384.855],[-106.831,-390.191],[-180.893,-430.377],[-185.373,-481.126]]}],"t":281},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-11.749,12.493],[-10.041,6.003],[-4.354,0.153],[-2.66,-3.45],[-2.211,-8.165],[-8.424,-6.98],[-0.757,-3.395],[6.07,-2.002],[31.944,2.201],[6.495,15.701]],"o":[[13.858,-7.801],[11.749,-12.493],[3.739,-2.235],[4.354,-0.153],[3.524,4.57],[2.86,10.559],[2.678,2.219],[1.391,6.239],[-30.408,10.03],[-4.678,-16.335],[0,0]],"v":[[-194.77,-495.64],[-153.526,-531.234],[-124.933,-556.296],[-116.375,-560.717],[-104.795,-555.795],[-90.863,-521.591],[-64.435,-490.372],[-58.232,-482.23],[-77.151,-465.805],[-178.201,-446.934],[-194.979,-495.039]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-17.081,-1.528],[-10.922,-4.192],[-2.808,-3.33],[1.071,-4.223],[5.057,-6.781],[0.29,-10.936],[2.203,-2.691],[5.323,3.539],[29.023,13.523],[0.425,16.986]],"o":[[15.735,-2.305],[17.081,1.528],[4.067,1.561],[2.808,3.33],[-1.419,5.593],[-6.54,8.769],[-0.092,3.477],[-4.049,4.947],[-26.665,-17.727],[1.499,-16.925],[0,0]],"v":[[-184.528,-471.72],[-113.938,-483.19],[-76.57,-476.172],[-67.807,-472.17],[-64.529,-460.023],[-82.832,-427.945],[-91.071,-387.879],[-93.647,-377.973],[-118.248,-382.713],[-186.551,-420.312],[-184.939,-471.234]]}],"t":354},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-9.19,14.479],[-8.733,7.784],[-4.247,0.969],[-3.262,-2.888],[-3.707,-7.604],[-9.586,-5.272],[-1.382,-3.192],[5.305,-3.566],[32.008,-0.838],[7.955,15.014]],"o":[[13.056,-9.08],[9.19,-14.479],[3.252,-2.898],[4.247,-0.969],[4.32,3.825],[4.794,9.833],[3.047,1.676],[2.54,5.866],[-26.573,17.864],[-6.206,-15.818],[0,0]],"v":[[-197.315,-502.049],[-159.228,-539.772],[-143.982,-571.308],[-136.407,-577.26],[-124.109,-574.603],[-103.994,-543.629],[-72.166,-517.937],[-64.544,-511.106],[-81.387,-491.633],[-176.202,-455.133],[-197.465,-501.431]]}],"t":384},{"s":[{"c":false,"i":[[0,0],[-17.148,0.202],[-11.289,-3.069],[-3.13,-3.03],[0.64,-4.309],[4.348,-7.256],[-0.815,-10.909],[1.92,-2.9],[5.131,3.811],[30.431,9.96],[2.45,16.814]],"o":[[15.347,-4.168],[17.148,-0.202],[4.204,1.143],[3.13,3.03],[-0.847,5.708],[-5.623,9.384],[0.259,3.468],[-3.529,5.33],[-25.704,-19.092],[-0.533,-16.983],[0,0]],"v":[[-185.024,-481.658],[-117.247,-487.489],[-79.361,-484.275],[-70.24,-481.177],[-65.754,-469.422],[-80.729,-435.662],[-84.886,-394.97],[-86.449,-384.855],[-106.831,-390.191],[-180.893,-430.377],[-185.373,-481.126]]}],"t":437}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":23,"mn":"ADBE Vector Group","nm":"tail","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":26,"ip":83,"ks":{"a":{"a":0,"ix":1,"k":[-365,-428,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.731],"y":[0.806]},"o":{"x":[0.252],"y":[0.129]},"s":[183],"t":84},{"i":{"x":[0.601],"y":[0.479]},"o":{"x":[0.294],"y":[0.23]},"s":[355.01],"t":186},{"i":{"x":[0.843],"y":[0.836]},"o":{"x":[0.198],"y":[0.187]},"s":[532.832],"t":300},{"s":[856],"t":450}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.699],"y":[1.154]},"o":{"x":[0.149],"y":[0.089]},"s":[148],"t":84},{"i":{"x":[0.427],"y":[0.668]},"o":{"x":[0.603],"y":[0.082]},"s":[150.802],"t":186},{"i":{"x":[0.463],"y":[0.923]},"o":{"x":[0.228],"y":[0.663]},"s":[139.072],"t":300},{"s":[136],"t":450}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.836],"y":[0.523]},"o":{"x":[0.247],"y":[0.019]},"s":[-6],"t":84},{"i":{"x":[0.356],"y":[1.056]},"o":{"x":[0.293],"y":[0.668]},"s":[-9.642],"t":186},{"i":{"x":[0.554],"y":[0.972]},"o":{"x":[0.221],"y":[0.033]},"s":[-12.279],"t":244},{"s":[-10],"t":330}]},"s":{"a":0,"ix":6,"k":[-35,35,100]}},"nm":"striped fish","op":502,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.644,1.367],[-1.367,-2.644],[2.644,-1.367],[1.367,2.644]],"o":[[2.644,-1.367],[1.367,2.644],[-2.644,1.367],[-1.367,-2.644]],"v":[[-278.01,-464.082],[-270.748,-461.771],[-273.06,-454.508],[-280.322,-456.82]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 18","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":110.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":119.52},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":128.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":161.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":170.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":179.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":223.516},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":232.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":309.701},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":320.02},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":330.34},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":340.658},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":350.979},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":361.297},{"s":[0],"t":371.615234375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"dots 18","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.397,1.24],[-1.24,-2.397],[2.397,-1.24],[1.24,2.397]],"o":[[2.397,-1.24],[1.24,2.397],[-2.397,1.24],[-1.24,-2.397]],"v":[[-271.779,-452.636],[-265.195,-450.54],[-267.29,-443.955],[-273.875,-446.051]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 12","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":110.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":119.52},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":128.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":161.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":170.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":179.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":223.516},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":232.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":322.084},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":334.125},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":346.16},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":358.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":370.242},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":382.277},{"s":[0],"t":394.318359375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"dots 12","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.637,1.363],[-1.363,-2.637],[2.637,-1.363],[1.363,2.637]],"o":[[2.637,-1.363],[1.363,2.637],[-2.637,1.363],[-1.363,-2.637]],"v":[[-269.885,-474.475],[-262.643,-472.169],[-264.948,-464.927],[-272.19,-467.232]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 17","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":117.748},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":126.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":135.459},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":168.746},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":177.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":186.459},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":228.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":309.701},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":320.709},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":331.715},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":342.723},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":353.73},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":364.734},{"s":[0],"t":375.744140625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"dots 17","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.41,1.246],[-1.246,-2.41],[2.41,-1.246],[1.246,2.41]],"o":[[2.41,-1.246],[1.246,2.41],[-2.41,1.246],[-1.246,-2.41]],"v":[[-258.674,-446.065],[-252.052,-443.958],[-254.16,-437.336],[-260.781,-439.444]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 11","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":117.748},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":126.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":135.459},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":168.746},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":177.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":186.459},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":228.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":320.02},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":330.34},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":340.658},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":354.074},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":367.488},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":380.902},{"s":[0],"t":394.318359375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"dots 11","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.805,1.451],[-1.451,-2.805],[2.805,-1.451],[1.451,2.805]],"o":[[2.805,-1.451],[1.451,2.805],[-2.805,1.451],[-1.451,-2.805]],"v":[[-262.366,-484.789],[-254.66,-482.337],[-257.113,-474.63],[-264.819,-477.083]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 16","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":121.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":130.146},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":139},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":172.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":181.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":234.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":313.828},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":326.729},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":339.627},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":352.525},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":365.424},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":375.744},{"s":[0],"t":386.0625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"dots 16","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.784,1.44],[-1.44,-2.784],[2.784,-1.44],[1.44,2.784]],"o":[[2.784,-1.44],[1.44,2.784],[-2.784,1.44],[-1.44,-2.784]],"v":[[-242.346,-444.75],[-234.699,-442.316],[-237.133,-434.67],[-244.78,-437.103]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 10","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":121.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":130.146},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":139},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":172.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":181.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":234.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":326.211},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":333.777},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":341.348},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":348.914},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":364.734},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":380.561},{"s":[0],"t":396.3828125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"dots 10","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.607,1.348],[-1.348,-2.607],[2.607,-1.348],[1.348,2.607]],"o":[[2.607,-1.348],[1.348,2.607],[-2.607,1.348],[-1.348,-2.607]],"v":[[-331.273,-454.413],[-324.112,-452.133],[-326.391,-444.972],[-333.552,-447.252]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 15","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":110.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":119.52},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":128.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":161.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":170.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":179.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":223.516},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":232.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":315.893},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":326.211},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":336.531},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":346.85},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":375.199},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":390.953},{"s":[0],"t":400}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"dots 15","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.896,1.497],[-1.497,-2.896],[2.896,-1.497],[1.497,2.896]],"o":[[2.896,-1.497],[1.497,2.896],[-2.896,1.497],[-1.497,-2.896]],"v":[[-329.246,-442.538],[-321.292,-440.007],[-323.824,-432.052],[-331.778,-434.584]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 9","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":110.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":119.52},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":128.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":161.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":170.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":179.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":223.516},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":232.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":311.766},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":324.838},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":344.787},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":354.014},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":361.297},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":371.615},{"s":[0],"t":390.19140625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"dots 9","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.823,1.46],[-1.46,-2.823],[2.823,-1.46],[1.46,2.823]],"o":[[2.823,-1.46],[1.46,2.823],[-2.823,1.46],[-1.46,-2.823]],"v":[[-322.06,-463.812],[-314.305,-461.344],[-316.773,-453.589],[-324.528,-456.057]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 14","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":115.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":124.832},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":133.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":166.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":175.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":184.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":228.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":330.34},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":339.279},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":348.229},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":357.17},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":366.109},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":375.059},{"s":[0],"t":384}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":9,"mn":"ADBE Vector Group","nm":"dots 14","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.459,1.271],[-1.271,-2.459],[2.459,-1.271],[1.271,2.459]],"o":[[2.459,-1.271],[1.271,2.459],[-2.459,1.271],[-1.271,-2.459]],"v":[[-317.719,-435.153],[-310.965,-433.003],[-313.114,-426.249],[-319.868,-428.399]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 8","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":115.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":124.832},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":133.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":166.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":175.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":184.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":228.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":320.02},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":326.9},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":333.777},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":340.658},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":350.979},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":361.297},{"s":[0],"t":371.615234375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":10,"mn":"ADBE Vector Group","nm":"dots 8","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.93,1.515],[-1.515,-2.93],[2.93,-1.515],[1.515,2.93]],"o":[[2.93,-1.515],[1.515,2.93],[-2.93,1.515],[-1.515,-2.93]],"v":[[-312.483,-475.015],[-304.435,-472.453],[-306.996,-464.405],[-315.045,-466.966]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 13","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":121.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":130.146},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":139},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":172.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":181.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":234.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":315.893},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":329.307},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":342.723},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":356.137},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":369.553},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":382.967},{"s":[0],"t":396.3828125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":11,"mn":"ADBE Vector Group","nm":"dots 13","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.807,1.452],[-1.452,-2.807],[2.807,-1.452],[1.452,2.807]],"o":[[2.807,-1.452],[1.452,2.807],[-2.807,1.452],[-1.452,-2.807]],"v":[[-306.368,-430.793],[-298.656,-428.339],[-301.111,-420.626],[-308.823,-423.081]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 7","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":121.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":130.146},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":139},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":172.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":181.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":234.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":320.02},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":329.992},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":339.973},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":349.945},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":362.672},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":375.4},{"s":[0],"t":388.126953125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":12,"mn":"ADBE Vector Group","nm":"dots 7","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.748,1.421],[-1.421,-2.748],[2.748,-1.421],[1.421,2.748]],"o":[[2.748,-1.421],[1.421,2.748],[-2.748,1.421],[-1.421,-2.748]],"v":[[-383.108,-444.271],[-375.559,-441.868],[-377.962,-434.319],[-385.511,-436.722]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":110.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":119.52},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":128.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":161.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":170.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":179.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":223.516},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":232.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":313.828},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":326.9},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":339.969},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":353.041},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":366.113},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":379.182},{"s":[0],"t":392.25390625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":13,"mn":"ADBE Vector Group","nm":"dots 5","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.766,1.43],[-1.43,-2.766],[2.766,-1.43],[1.43,2.766]],"o":[[2.766,-1.43],[1.43,2.766],[-2.766,1.43],[-1.43,-2.766]],"v":[[-384.125,-430.303],[-376.527,-427.885],[-378.945,-420.287],[-386.543,-422.705]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 6","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":110.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":119.52},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":128.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":161.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":170.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":179.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":214.662},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":223.516},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":232.373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":322.084},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":331.029},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":339.969},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":348.914},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":357.859},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":372.99},{"s":[0],"t":388.126953125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":14,"mn":"ADBE Vector Group","nm":"dots 6","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.6,1.345],[-1.345,-2.6],[2.6,-1.345],[1.345,2.6]],"o":[[2.6,-1.345],[1.345,2.6],[-2.6,1.345],[-1.345,-2.6]],"v":[[-373.851,-454.409],[-366.708,-452.136],[-368.982,-444.992],[-376.125,-447.266]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":115.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":124.832},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":133.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":166.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":175.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":184.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":228.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":315.893},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":326.211},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":334.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":342.723},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":350.979},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":359.232},{"s":[0],"t":367.48828125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":15,"mn":"ADBE Vector Group","nm":"dots 3","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.597,1.343],[-1.343,-2.597],[2.597,-1.343],[1.343,2.597]],"o":[[2.597,-1.343],[1.343,2.597],[-2.597,1.343],[-1.343,-2.597]],"v":[[-370.848,-424.403],[-363.714,-422.133],[-365.985,-414.998],[-373.119,-417.269]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":115.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":124.832},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":133.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":166.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":175.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":184.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":219.975},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":228.83},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":237.688},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":309},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":317.957},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":334.467},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":350.979},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":361.297},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":371.615},{"s":[0],"t":394.318359375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":16,"mn":"ADBE Vector Group","nm":"dots 4","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.944,1.522],[-1.522,-2.944],[2.944,-1.522],[1.522,2.944]],"o":[[2.944,-1.522],[1.522,2.944],[-2.944,1.522],[-1.522,-2.944]],"v":[[-364.496,-466.04],[-356.41,-463.466],[-358.983,-455.38],[-367.07,-457.953]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":121.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":130.146},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":139},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":172.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":181.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":234.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":315.893},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":326.211},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":336.531},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":363.361},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":372.391},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":381.42},{"s":[0],"t":396.3828125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":17,"mn":"ADBE Vector Group","nm":"dots","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-2.68,1.386],[-1.386,-2.68],[2.68,-1.386],[1.386,2.68]],"o":[[2.68,-1.386],[1.386,2.68],[-2.68,1.386],[-1.386,-2.68]],"v":[[-358.249,-418.562],[-350.888,-416.219],[-353.231,-408.858],[-360.591,-411.201]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":121.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":130.146},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":139},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":172.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":181.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":190},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":225.289},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":234.143},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":243},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":322.084},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":332.402},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":342.723},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":353.041},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":363.361},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":373.68},{"s":[0],"t":384}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":18,"mn":"ADBE Vector Group","nm":"dots 2","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-0.787,4.783],[-3.53,3.322],[-0.752,0.191],[-1.009,-1.757],[-0.469,-5.598],[0.123,-0.319],[0.443,-0.254],[5.377,-2.171]],"o":[[-0.264,-4.84],[0.787,-4.783],[0.565,-0.532],[1.964,-0.499],[2.797,4.872],[0.029,0.341],[-0.184,0.476],[-5.031,2.884],[0,0]],"v":[[-268.562,-391.745],[-268.301,-406.254],[-262.051,-419.097],[-260.105,-420.326],[-255.349,-417.283],[-251.552,-401.011],[-251.62,-399.996],[-252.718,-398.975],[-268.356,-391.382]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-3.975,8.311],[-2.071,0.172],[-1.196,-1.654],[0.251,-6.78],[0.168,-0.307],[0.439,-0.211],[5.253,-2.343],[0.466,0.522]],"o":[[-0.343,-9.206],[0.896,-1.875],[2.034,-0.169],[3.976,5.497],[-0.013,0.35],[-0.234,0.427],[-5.186,2.487],[-0.639,0.285],[0,0]],"v":[[-303.201,-377.675],[-299.375,-404.766],[-295.016,-408.806],[-290.098,-405.644],[-284.296,-386.523],[-284.5,-385.503],[-285.64,-384.628],[-301.299,-377.383],[-303.254,-377.374]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-4.199,9.826],[-1.482,0.717],[-1.691,-1.506],[-0.941,-4.257],[0.521,-4.392],[0.3,-0.433],[0.422,-0.251],[6.634,-0.542]],"o":[[-0.985,-10.584],[0.632,-1.478],[2.058,-0.995],[3.317,2.954],[0.956,4.324],[-0.061,0.517],[-0.275,0.397],[-5.664,3.373],[0,0]],"v":[[-348.784,-363.5],[-343.867,-394.716],[-340.962,-398.475],[-334.688,-396.895],[-328.963,-385.294],[-327.977,-372.124],[-328.422,-370.639],[-329.548,-369.721],[-348.342,-363.739]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-2.124,7.058],[-4.732,1.899],[-1.513,-0.992],[-0.554,-1.002],[0.458,-8.291],[0.277,-0.457],[0.394,-0.233],[2.439,-0.322],[5.037,-0.665]],"o":[[0.451,-7.357],[1.469,-4.883],[1.679,-0.674],[0.957,0.628],[4.019,7.266],[-0.029,0.534],[-0.237,0.391],[-2.119,1.25],[-5.037,0.665],[0,0]],"v":[[-390.46,-353.652],[-385.747,-375.201],[-377.547,-387.47],[-372.333,-387.239],[-370.162,-384.622],[-366.949,-360.269],[-367.292,-358.72],[-368.311,-357.822],[-375.384,-355.902],[-390.495,-353.906]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":83.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":94},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":104.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":114.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":124.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":134.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":390},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":400.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.801},{"s":[0],"t":442}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":19,"mn":"ADBE Vector Group","nm":"stripes","np":5,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[4.818,-7.964],[-0.071,-0.543],[-0.388,-0.372],[-12.193,-0.364]],"o":[[-5.794,7.284],[-0.283,0.468],[0.07,0.533],[8.803,8.444],[0,0]],"v":[[-260.836,-478.945],[-276.775,-456.042],[-277.279,-454.514],[-276.418,-453.19],[-243.427,-439.348]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[6.274,-9.991],[-9.235,-4.045]],"o":[[-8.82,7.836],[7.735,6.466],[0,0]],"v":[[-309.475,-468.673],[-332.269,-441.751],[-306.642,-425.877]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[8.256,-11.093],[-10.904,-5.377]],"o":[[-9.424,10.119],[10.904,5.377],[0,0]],"v":[[-361.705,-460.818],[-388.252,-428.968],[-355.539,-412.837]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-21.53,4.849]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-190.718,-466.198]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.258,-2.013]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.933,-465.562]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.249,2.117]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-193.662,-476.038]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.347,-0.273]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.73,-470.067]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-23.035,8.671]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-193.194,-477.839]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-24.385,3.343]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.131,-460.877]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-21.53,4.849]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-190.718,-466.198]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.258,-2.013]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.933,-465.562]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.249,2.117]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-193.662,-476.038]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-22.347,-0.273]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.73,-470.067]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-23.035,8.671]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-193.194,-477.839]]}],"t":449},{"s":[{"c":false,"i":[[0,0],[-41.042,8.339],[-9.479,2.517],[-24.385,3.343]],"o":[[41.042,-8.339],[9.611,-1.953],[21.601,-5.735],[0,0]],"v":[[-407.807,-426.471],[-284.68,-451.489],[-255.971,-457.914],[-189.131,-460.877]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[1.097,-1.636],[0.372,-2.467],[-1.219,-1.825],[-1.689,0.394],[-1.224,1.71],[-0.272,1.637],[1.022,1.762],[1.499,0.806]],"o":[[-1.559,-0.417],[-1.222,1.822],[-0.372,2.467],[1.182,1.769],[1.689,-0.394],[0.842,-1.176],[0.37,-2.226],[-1.022,-1.762],[0,0]],"v":[[-448.595,-443.882],[-452.744,-441.185],[-455.36,-434.713],[-454.154,-427.647],[-449.429,-425.61],[-444.988,-429.06],[-443.138,-433.282],[-444.347,-439.673],[-448.306,-443.422]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":83.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":94},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":104.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":114.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":124.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":134.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":390},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":400.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.801},{"s":[0],"t":442}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":20,"mn":"ADBE Vector Group","nm":"strokes","np":6,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106,-10],[25,-14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106,10],[-25,14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-209,-491],[-209,-421],[-432,-353],[-521.357,-405.581]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-104.217,-21.79],[26.409,-11.117],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.217,21.79],[-26.409,11.117],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-205.97,-485.639],[-213.798,-416.078],[-432,-353],[-521.357,-405.581]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106.447,-2.24],[23.912,-15.786],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106.447,2.24],[-23.912,15.786],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-213.121,-492.821],[-208.014,-423.007],[-432,-353],[-521.357,-405.581]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-105.598,-13.606],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.598,13.606],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-207.283,-488.834],[-209.668,-418.874],[-432,-353],[-521.357,-405.581]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[5.662,2.507],[-35,13],[-106.44,-2.573],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12.267,-5.432],[35,-13],[106.44,2.573],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-212.6,-494.682],[-211.064,-418.57],[-432,-353],[-515.836,-410.438]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[5.662,2.507],[-35,13],[-103.215,-26.128],[27.732,-7.206],[78,9],[-0.532,22.773]],"o":[[0,0],[-12.267,-5.432],[35,-13],[103.215,26.127],[-31.343,8.144],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-204.316,-481.606],[-218.019,-413.46],[-432,-353],[-515.836,-410.438]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106,-10],[25,-14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106,10],[-25,14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-209,-491],[-209,-421],[-432,-353],[-521.357,-405.581]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-104.217,-21.79],[26.409,-11.117],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.217,21.79],[-26.409,11.117],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-205.97,-485.639],[-213.798,-416.078],[-432,-353],[-521.357,-405.581]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106.447,-2.24],[23.912,-15.786],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106.447,2.24],[-23.912,15.786],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-213.121,-492.821],[-208.014,-423.007],[-432,-353],[-521.357,-405.581]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-105.598,-13.606],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.598,13.606],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-207.283,-488.834],[-209.668,-418.874],[-432,-353],[-521.357,-405.581]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[5.662,2.507],[-35,13],[-106.44,-2.573],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12.267,-5.432],[35,-13],[106.44,2.573],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-212.6,-494.682],[-211.064,-418.57],[-432,-353],[-515.836,-410.438]]}],"t":449},{"s":[{"c":true,"i":[[-14.908,5.03],[5.662,2.507],[-35,13],[-103.215,-26.128],[27.732,-7.206],[78,9],[-0.532,22.773]],"o":[[0,0],[-12.267,-5.432],[35,-13],[103.215,26.127],[-31.343,8.144],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-204.316,-481.606],[-218.019,-413.46],[-432,-353],[-515.836,-410.438]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":83.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":94},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":104.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":114.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":124.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":134.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":390},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":400.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.801},{"s":[0],"t":442}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":21,"mn":"ADBE Vector Group","nm":"body stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106,-10],[25,-14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106,10],[-25,14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-209,-491],[-209,-421],[-432,-353],[-521.357,-405.581]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-104.217,-21.79],[26.409,-11.117],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.217,21.79],[-26.409,11.117],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-205.97,-485.639],[-213.798,-416.078],[-432,-353],[-521.357,-405.581]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106.447,-2.24],[23.912,-15.786],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106.447,2.24],[-23.912,15.786],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-213.121,-492.821],[-208.014,-423.007],[-432,-353],[-521.357,-405.581]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-105.598,-13.606],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.598,13.606],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-207.283,-488.834],[-209.668,-418.874],[-432,-353],[-521.357,-405.581]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106.44,-2.573],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106.44,2.573],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-212.6,-494.682],[-209.668,-418.874],[-432,-353],[-515.836,-410.438]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-103.215,-26.128],[27.743,-7.162],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[103.215,26.127],[-27.743,7.162],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-204.316,-481.606],[-219.86,-411.085],[-432,-353],[-515.836,-410.438]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106,-10],[25,-14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106,10],[-25,14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-209,-491],[-209,-421],[-432,-353],[-521.357,-405.581]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-104.217,-21.79],[26.409,-11.117],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[104.217,21.79],[-26.409,11.117],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-205.97,-485.639],[-213.798,-416.078],[-432,-353],[-521.357,-405.581]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106.447,-2.24],[23.912,-15.786],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106.447,2.24],[-23.912,15.786],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-213.121,-492.821],[-208.014,-423.007],[-432,-353],[-521.357,-405.581]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-105.598,-13.606],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[105.598,13.606],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-507.135,-421.982],[-470,-460],[-207.283,-488.834],[-209.668,-418.874],[-432,-353],[-521.357,-405.581]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-106.44,-2.573],[25.462,-13.14],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[106.44,2.573],[-25.462,13.14],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-212.6,-494.682],[-209.668,-418.874],[-432,-353],[-515.836,-410.438]]}],"t":449},{"s":[{"c":true,"i":[[-14.908,5.03],[12,6],[-35,13],[-103.215,-26.128],[27.743,-7.162],[78,9],[-0.532,22.773]],"o":[[0,0],[-12,-6],[35,-13],[103.215,26.127],[-27.743,7.162],[-78,-9],[0,0]],"v":[[-483,-409],[-510.501,-413.939],[-470,-460],[-204.316,-481.606],[-219.86,-411.085],[-432,-353],[-515.836,-410.438]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":22,"mn":"ADBE Vector Group","nm":"body","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-18.348,-0.263]],"o":[[18.348,0.263],[0,0]],"v":[[-166.761,-456.561],[-111.717,-455.773]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-20.99,-10.632]],"o":[[19.349,-0.768],[0,0]],"v":[[-167.847,-446.693],[-113.237,-439.755]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-19.429,3.808]],"o":[[18.877,-4.315],[0,0]],"v":[[-168.481,-461.555],[-113.527,-464.785]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.161,-6.546]],"o":[[19.23,-2.273],[0,0]],"v":[[-166.242,-452.975],[-116.603,-447.66]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.252,8.444]],"o":[[18.89,-4.256],[0,0]],"v":[[-168.058,-463.277],[-114.861,-480.077]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.401,-7.305]],"o":[[19.364,0.042],[0,0]],"v":[[-167.854,-441.1],[-123.549,-431.15]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-18.348,-0.263]],"o":[[18.348,0.263],[0,0]],"v":[[-166.761,-456.561],[-111.717,-455.773]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-20.99,-10.632]],"o":[[19.349,-0.768],[0,0]],"v":[[-167.847,-446.693],[-113.237,-439.755]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-19.429,3.808]],"o":[[18.877,-4.315],[0,0]],"v":[[-168.481,-461.555],[-113.527,-464.785]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.161,-6.546]],"o":[[19.23,-2.273],[0,0]],"v":[[-166.242,-452.975],[-116.603,-447.66]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.252,8.444]],"o":[[18.89,-4.256],[0,0]],"v":[[-168.058,-463.277],[-114.861,-480.077]]}],"t":449},{"s":[{"c":false,"i":[[0,0],[-14.401,-7.305]],"o":[[19.364,0.042],[0,0]],"v":[[-167.854,-441.1],[-123.549,-431.15]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.713,1.78],[-8.214,-1.295]],"o":[[7.881,0.74],[8.102,-1.87],[0,0]],"v":[[-163.585,-469.139],[-139.992,-470.712],[-115.533,-474.547]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.863,0.907],[-8.017,-2.205]],"o":[[7.749,1.617],[8.26,-0.952],[0,0]],"v":[[-163.284,-458.837],[-140.399,-462.045],[-114.929,-458.839]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.562,2.338],[-9.414,5.006]],"o":[[7.914,0.163],[7.944,-2.456],[0,0]],"v":[[-166.231,-474.331],[-142.231,-476.936],[-119.091,-486.061]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.769,1.516],[-10.394,-2.79]],"o":[[7.851,1.008],[8.161,-1.593],[0,0]],"v":[[-162.639,-465.438],[-139.422,-468.259],[-115.254,-465.481]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-6.528,4.476],[-6.59,4.181]],"o":[[7.913,0.188],[8.713,-5.974],[0,0]],"v":[[-165.768,-476.046],[-144.542,-483.752],[-124.93,-499.087]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.259,-1.345],[-7.729,-1.079]],"o":[[7.674,1.939],[10.388,1.924],[0,0]],"v":[[-162.788,-453.043],[-140.381,-455.846],[-118.919,-452.158]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.713,1.78],[-8.214,-1.295]],"o":[[7.881,0.74],[8.102,-1.87],[0,0]],"v":[[-163.585,-469.139],[-139.992,-470.712],[-115.533,-474.547]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.863,0.907],[-8.017,-2.205]],"o":[[7.749,1.617],[8.26,-0.952],[0,0]],"v":[[-163.284,-458.837],[-140.399,-462.045],[-114.929,-458.839]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.562,2.338],[-9.414,5.006]],"o":[[7.914,0.163],[7.944,-2.456],[0,0]],"v":[[-166.231,-474.331],[-142.231,-476.936],[-119.091,-486.061]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-7.769,1.516],[-10.394,-2.79]],"o":[[7.851,1.008],[8.161,-1.593],[0,0]],"v":[[-162.639,-465.438],[-139.422,-468.259],[-115.254,-465.481]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-6.528,4.476],[-6.59,4.181]],"o":[[7.913,0.188],[8.713,-5.974],[0,0]],"v":[[-165.768,-476.046],[-144.542,-483.752],[-124.93,-499.087]]}],"t":449},{"s":[{"c":false,"i":[[0,0],[-7.259,-1.345],[-7.729,-1.079]],"o":[[7.674,1.939],[10.388,1.924],[0,0]],"v":[[-162.788,-453.043],[-140.381,-455.846],[-118.919,-452.158]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-19.901,2.69]],"o":[[19.516,-4.733],[0,0]],"v":[[-170.618,-481.143],[-113.533,-499.985]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-20.077,0.448]],"o":[[20.262,-10.908],[0,0]],"v":[[-168.931,-471.552],[-110.098,-483.893]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-17.23,11.389]],"o":[[22.344,-7.208],[0,0]],"v":[[-174.121,-485.79],[-118.563,-508.747]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-22.777,-1.154]],"o":[[22.987,-4.778],[0,0]],"v":[[-169.259,-477.675],[-117.996,-487.479]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-8.642,11.641]],"o":[[22.367,-7.138],[0,0]],"v":[[-173.623,-487.53],[-137.079,-515.404]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-10.441,-2.265]],"o":[[19.115,-8.372],[0,0]],"v":[[-167.898,-465.983],[-117.618,-472.46]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-19.901,2.69]],"o":[[19.516,-4.733],[0,0]],"v":[[-170.618,-481.143],[-113.533,-499.985]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-20.077,0.448]],"o":[[20.262,-10.908],[0,0]],"v":[[-168.931,-471.552],[-110.098,-483.893]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-17.23,11.389]],"o":[[22.344,-7.208],[0,0]],"v":[[-174.121,-485.79],[-118.563,-508.747]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-22.777,-1.154]],"o":[[22.987,-4.778],[0,0]],"v":[[-169.259,-477.675],[-117.996,-487.479]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-8.642,11.641]],"o":[[22.367,-7.138],[0,0]],"v":[[-173.623,-487.53],[-137.079,-515.404]]}],"t":449},{"s":[{"c":false,"i":[[0,0],[-10.441,-2.265]],"o":[[19.115,-8.372],[0,0]],"v":[[-167.898,-465.983],[-117.618,-472.46]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[-141.167,-477.879]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":83.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":94},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":104.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":114.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":124.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":134.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":390},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":400.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.801},{"s":[0],"t":442}]},"p":{"a":0,"ix":2,"k":[-141.167,-477.879]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"stripes","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.988,8.335],[-17.113,-1.114],[-5.373,-3.45],[-0.325,-6.378],[1.556,-8.315],[-4.554,-9.947],[0.793,-3.386],[6.326,-0.918],[31.449,6.016],[4.565,16.367]],"o":[[13.134,-11.027],[14.988,-8.335],[6.372,0.415],[5.373,3.45],[0.431,8.448],[-2.012,10.753],[1.448,3.162],[-1.458,6.224],[-31.688,4.597],[-2.685,-16.778],[0,0]],"v":[[-189.538,-489.9],[-148.179,-520.36],[-99.054,-533.075],[-80.845,-527.823],[-71.001,-512.225],[-78.119,-488.054],[-70.044,-456.83],[-67.995,-446.802],[-83.34,-437.409],[-178.93,-439.558],[-189.817,-489.328]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.826,6.607],[-16.882,-3.02],[-4.954,-4.03],[0.39,-6.374],[2.476,-8.089],[-3.413,-10.394],[1.167,-3.276],[5.276,3.609],[29.749,7.044],[2.706,16.775]],"o":[[14.285,-9.489],[15.826,-6.607],[6.286,1.125],[4.954,4.03],[-0.516,8.443],[-3.202,10.461],[1.085,3.304],[-2.145,6.022],[-36.044,-24.654],[-0.792,-16.973],[0,0]],"v":[[-186.753,-482.37],[-142.223,-503.014],[-85.532,-505.188],[-68.024,-497.932],[-67.854,-483.436],[-77.63,-460.213],[-73.097,-428.282],[-72.183,-418.087],[-88.481,-410.469],[-181.841,-431.158],[-187.094,-481.833]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.34,9.406],[-16.175,9.378],[-6.085,-1.937],[-1.97,-6.074],[-0.656,-8.434],[-6.98,-8.424],[-0.113,-3.476],[5.737,-2.819],[30.537,1.449],[5.747,15.99]],"o":[[12.295,-11.956],[14.34,-9.406],[5.524,-3.203],[6.085,1.937],[2.609,8.047],[0.848,10.907],[2.219,2.678],[0.208,6.389],[-28.688,14.097],[-3.902,-16.537],[0,0]],"v":[[-193.63,-493.143],[-149.953,-515.65],[-107.597,-545.16],[-88.648,-544.814],[-83.185,-531.386],[-83.785,-506.196],[-67.881,-478.138],[-63.3,-468.986],[-75.68,-455.932],[-179.378,-443.71],[-193.866,-492.553]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.595,5.152],[-20.896,-2.154],[-5.457,-3.317],[-0.483,-6.368],[1.35,-8.351],[-4.798,-9.831],[0.709,-3.405],[5.971,2.281],[30.207,4.705],[4.005,16.513]],"o":[[13.503,-10.573],[16.171,-5.709],[6.352,0.655],[5.457,3.317],[0.64,8.435],[-1.746,10.799],[1.525,3.126],[-1.304,6.258],[-31.041,-11.86],[-2.112,-16.86],[0,0]],"v":[[-187.87,-487.071],[-147.448,-510.108],[-92.687,-515.72],[-74.354,-510.919],[-72.209,-496.581],[-78.729,-472.242],[-69.884,-441.227],[-67.589,-431.253],[-89.001,-419.582],[-178.983,-436.397],[-188.168,-486.51]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-12.722,8.816],[-13.537,16.063],[-6.386,0.068],[-3.775,-5.151],[-3.267,-7.803],[-9.269,-5.811],[-1.197,-3.265],[5.677,-2.938],[30.532,1.544],[5.697,16.008]],"o":[[12.332,-11.917],[14.096,-9.768],[4.115,-4.883],[6.386,-0.068],[5,6.823],[4.224,10.091],[2.947,1.847],[2.2,6.001],[-29.511,15.273],[-3.85,-16.549],[0,0]],"v":[[-193.108,-494.944],[-155.404,-521.745],[-129.028,-550.681],[-112.423,-556.108],[-103.025,-545.07],[-95.698,-520.961],[-71.8,-499.305],[-64.58,-492.049],[-77.866,-474.575],[-179.01,-445.466],[-193.346,-494.354]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.033,3.687],[-20.916,-1.945],[-4.911,-4.081],[0.456,-6.369],[2.561,-8.062],[-3.304,-10.429],[1.201,-3.264],[5.549,3.172],[29.428,8.281],[2.003,16.873]],"o":[[14.669,-8.884],[16.656,-4.085],[6.358,0.591],[4.911,4.081],[-0.605,8.438],[-3.312,10.426],[1.05,3.315],[-2.207,5.999],[-28.849,-16.49],[-0.082,-16.991],[0,0]],"v":[[-185.252,-477.536],[-141.89,-491.688],[-89.168,-495.827],[-72.477,-487.527],[-72.458,-473.03],[-82.478,-449.911],[-82.103,-422.24],[-81.296,-412.036],[-104.249,-403.555],[-182.485,-426.164],[-185.615,-477.014]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.988,8.335],[-16.703,3.889],[-5.373,-3.45],[-0.325,-6.378],[1.556,-8.315],[-4.554,-9.947],[0.793,-3.386],[6.326,-0.918],[31.449,6.016],[4.565,16.367]],"o":[[13.134,-11.027],[14.988,-8.335],[6.22,-1.448],[5.373,3.45],[0.431,8.448],[-2.012,10.753],[1.448,3.162],[-1.458,6.224],[-31.688,4.597],[-2.685,-16.778],[0,0]],"v":[[-189.538,-489.9],[-151.674,-511.728],[-105.303,-528.435],[-80.845,-527.823],[-71.001,-512.225],[-78.119,-488.054],[-70.044,-456.83],[-67.995,-446.802],[-83.34,-437.409],[-178.93,-439.558],[-189.817,-489.328]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.826,6.607],[-16.882,-3.02],[-4.954,-4.03],[0.39,-6.374],[2.476,-8.089],[-3.413,-10.394],[1.167,-3.276],[5.276,3.609],[29.749,7.044],[2.706,16.775]],"o":[[14.285,-9.489],[15.826,-6.607],[6.286,1.125],[4.954,4.03],[-0.516,8.443],[-3.202,10.461],[1.085,3.304],[-2.145,6.022],[-36.044,-24.654],[-0.792,-16.973],[0,0]],"v":[[-186.753,-482.37],[-142.223,-503.014],[-85.532,-505.188],[-68.024,-497.932],[-67.854,-483.436],[-77.63,-460.213],[-73.097,-428.282],[-72.183,-418.087],[-88.481,-410.469],[-181.841,-431.158],[-187.094,-481.833]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.34,9.406],[-16.175,9.378],[-6.085,-1.937],[-1.97,-6.074],[-0.656,-8.434],[-6.98,-8.424],[-0.113,-3.476],[5.737,-2.819],[30.537,1.449],[5.747,15.99]],"o":[[12.295,-11.956],[14.34,-9.406],[5.524,-3.203],[6.085,1.937],[2.609,8.047],[0.848,10.907],[2.219,2.678],[0.208,6.389],[-28.688,14.097],[-3.902,-16.537],[0,0]],"v":[[-193.63,-493.143],[-149.953,-515.65],[-107.597,-545.16],[-88.648,-544.814],[-83.185,-531.386],[-83.785,-506.196],[-67.881,-478.138],[-63.3,-468.986],[-75.68,-455.932],[-179.378,-443.71],[-193.866,-492.553]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.595,5.152],[-20.896,-2.154],[-5.457,-3.317],[-0.483,-6.368],[1.35,-8.351],[-4.798,-9.831],[0.709,-3.405],[5.971,2.281],[30.207,4.705],[4.005,16.513]],"o":[[13.503,-10.573],[16.171,-5.709],[6.352,0.655],[5.457,3.317],[0.64,8.435],[-1.746,10.799],[1.525,3.126],[-1.304,6.258],[-31.041,-11.86],[-2.112,-16.86],[0,0]],"v":[[-187.87,-487.071],[-147.448,-510.108],[-92.687,-515.72],[-74.354,-510.919],[-72.209,-496.581],[-78.729,-472.242],[-69.884,-441.227],[-67.589,-431.253],[-89.001,-419.582],[-178.983,-436.397],[-188.168,-486.51]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-12.722,8.816],[-13.537,16.063],[-6.386,0.068],[-3.775,-5.151],[-3.267,-7.803],[-9.269,-5.811],[-1.197,-3.265],[5.677,-2.938],[30.532,1.544],[5.697,16.008]],"o":[[12.332,-11.917],[14.096,-9.768],[4.115,-4.883],[6.386,-0.068],[5,6.823],[4.224,10.091],[2.947,1.847],[2.2,6.001],[-29.511,15.273],[-3.85,-16.549],[0,0]],"v":[[-193.108,-494.944],[-155.404,-521.745],[-129.028,-550.681],[-112.423,-556.108],[-103.025,-545.07],[-95.698,-520.961],[-71.8,-499.305],[-64.58,-492.049],[-77.866,-474.575],[-179.01,-445.466],[-193.346,-494.354]]}],"t":449},{"s":[{"c":false,"i":[[0,0],[-15.033,3.687],[-20.916,-1.945],[-4.911,-4.081],[0.456,-6.369],[2.561,-8.062],[-3.304,-10.429],[1.201,-3.264],[5.549,3.172],[29.428,8.281],[2.003,16.873]],"o":[[14.669,-8.884],[16.656,-4.085],[6.358,0.591],[4.911,4.081],[-0.605,8.438],[-3.312,10.426],[1.05,3.315],[-2.207,5.999],[-28.849,-16.49],[-0.082,-16.991],[0,0]],"v":[[-185.252,-477.536],[-141.89,-491.688],[-89.168,-495.827],[-72.477,-487.527],[-72.458,-473.03],[-82.478,-449.911],[-82.103,-422.24],[-81.296,-412.036],[-104.249,-403.555],[-182.485,-426.164],[-185.615,-477.014]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.152941182256,0.466666698456,0.929411828518,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":5}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":83.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":94},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":104.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":114.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":124.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":134.801},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":390},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":400.201},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":410.4},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":420.602},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":430.801},{"s":[0],"t":442}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.988,8.335],[-17.113,-1.114],[-5.373,-3.45],[-0.325,-6.378],[1.556,-8.315],[-4.554,-9.947],[0.793,-3.386],[6.326,-0.918],[31.449,6.016],[4.565,16.367]],"o":[[13.134,-11.027],[14.988,-8.335],[6.372,0.415],[5.373,3.45],[0.431,8.448],[-2.012,10.753],[1.448,3.162],[-1.458,6.224],[-31.688,4.597],[-2.685,-16.778],[0,0]],"v":[[-189.538,-489.9],[-148.179,-520.36],[-99.054,-533.075],[-80.845,-527.823],[-71.001,-512.225],[-78.119,-488.054],[-70.044,-456.83],[-67.995,-446.802],[-83.34,-437.409],[-178.93,-439.558],[-189.817,-489.328]]}],"t":85},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.826,6.607],[-16.882,-3.02],[-4.954,-4.03],[0.39,-6.374],[2.476,-8.089],[-3.413,-10.394],[1.167,-3.276],[5.411,3.402],[30.55,3.439],[2.706,16.775]],"o":[[14.285,-9.489],[15.826,-6.607],[6.286,1.125],[4.954,4.03],[-0.516,8.443],[-3.202,10.461],[1.085,3.304],[-2.145,6.022],[-32.795,-20.619],[-0.792,-16.973],[0,0]],"v":[[-186.753,-482.37],[-142.223,-503.014],[-85.532,-505.188],[-68.024,-497.932],[-67.854,-483.436],[-77.63,-460.213],[-73.097,-428.282],[-72.183,-418.087],[-88.481,-410.469],[-181.841,-431.158],[-187.094,-481.833]]}],"t":122},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.34,9.406],[-15.98,10.794],[-6.085,-1.937],[-1.97,-6.074],[-0.656,-8.434],[-6.98,-8.424],[-0.113,-3.476],[5.824,-2.635],[30.661,-2.241],[5.747,15.99]],"o":[[12.295,-11.956],[14.34,-9.406],[5.292,-3.574],[6.085,1.937],[2.609,8.047],[0.848,10.907],[2.219,2.678],[0.208,6.389],[-32.226,14.584],[-3.902,-16.537],[0,0]],"v":[[-193.63,-493.143],[-149.953,-515.65],[-107.597,-545.16],[-88.648,-544.814],[-83.185,-531.386],[-83.785,-506.196],[-67.881,-478.138],[-63.3,-468.986],[-75.68,-455.932],[-179.378,-443.71],[-193.866,-492.553]]}],"t":155},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.263,7.82],[-18.6,-0.177],[-5.457,-3.317],[-0.483,-6.368],[1.35,-8.351],[-4.798,-9.831],[0.709,-3.405],[5.948,2.341],[30.725,1.049],[4.005,16.513]],"o":[[13.503,-10.573],[15.263,-7.82],[6.386,0.061],[5.457,3.317],[0.64,8.435],[-1.746,10.799],[1.525,3.126],[-1.304,6.258],[-31.806,-12.519],[-2.112,-16.86],[0,0]],"v":[[-187.87,-487.071],[-145.97,-509.502],[-92.687,-515.72],[-74.354,-510.919],[-72.209,-496.581],[-78.729,-472.242],[-69.884,-441.227],[-67.589,-431.253],[-89.001,-419.582],[-178.983,-436.397],[-188.168,-486.51]]}],"t":193},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-12.663,11.565],[-10.61,15.277],[-6.386,0.068],[-3.775,-5.151],[-3.267,-7.803],[-9.269,-5.811],[-1.197,-3.265],[5.706,-2.881],[30.668,-2.145],[5.697,16.008]],"o":[[12.332,-11.917],[12.663,-11.565],[3.643,-5.245],[6.386,-0.068],[5,6.823],[4.224,10.091],[2.947,1.847],[2.2,6.001],[-30.512,15.406],[-3.85,-16.549],[0,0]],"v":[[-193.108,-494.944],[-153.819,-521.55],[-129.028,-550.681],[-112.423,-556.108],[-103.025,-545.07],[-95.698,-520.961],[-71.8,-499.305],[-64.58,-492.049],[-77.866,-474.575],[-179.01,-445.466],[-193.346,-494.354]]}],"t":233},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.96,6.276],[-18.6,0.01],[-4.911,-4.081],[0.456,-6.369],[2.561,-8.062],[-3.304,-10.429],[1.201,-3.264],[5.517,3.228],[30.379,4.713],[2.003,16.873]],"o":[[14.669,-8.884],[15.96,-6.276],[6.386,-0.003],[4.911,4.081],[-0.605,8.438],[-3.312,10.426],[1.05,3.315],[-2.207,5.999],[-29.504,-17.259],[-0.082,-16.991],[0,0]],"v":[[-185.252,-477.536],[-140.48,-490.939],[-89.168,-495.827],[-72.477,-487.527],[-72.458,-473.03],[-82.478,-449.911],[-82.103,-422.24],[-81.296,-412.036],[-104.249,-403.555],[-182.485,-426.164],[-185.615,-477.014]]}],"t":270},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.988,8.335],[-16.703,3.889],[-5.373,-3.45],[-0.325,-6.378],[1.556,-8.315],[-4.554,-9.947],[0.793,-3.386],[6.326,-0.918],[31.449,6.016],[4.565,16.367]],"o":[[13.134,-11.027],[14.988,-8.335],[6.22,-1.448],[5.373,3.45],[0.431,8.448],[-2.012,10.753],[1.448,3.162],[-1.458,6.224],[-31.688,4.597],[-2.685,-16.778],[0,0]],"v":[[-189.538,-489.9],[-151.674,-511.728],[-105.303,-528.435],[-80.845,-527.823],[-71.001,-512.225],[-78.119,-488.054],[-70.044,-456.83],[-67.995,-446.802],[-83.34,-437.409],[-178.93,-439.558],[-189.817,-489.328]]}],"t":301},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.826,6.607],[-16.882,-3.02],[-4.954,-4.03],[0.39,-6.374],[2.476,-8.089],[-3.413,-10.394],[1.167,-3.276],[5.411,3.402],[30.55,3.439],[2.706,16.775]],"o":[[14.285,-9.489],[15.826,-6.607],[6.286,1.125],[4.954,4.03],[-0.516,8.443],[-3.202,10.461],[1.085,3.304],[-2.145,6.022],[-32.795,-20.619],[-0.792,-16.973],[0,0]],"v":[[-186.753,-482.37],[-142.223,-503.014],[-85.532,-505.188],[-68.024,-497.932],[-67.854,-483.436],[-77.63,-460.213],[-73.097,-428.282],[-72.183,-418.087],[-88.481,-410.469],[-181.841,-431.158],[-187.094,-481.833]]}],"t":338},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-14.34,9.406],[-15.98,10.794],[-6.085,-1.937],[-1.97,-6.074],[-0.656,-8.434],[-6.98,-8.424],[-0.113,-3.476],[5.824,-2.635],[30.661,-2.241],[5.747,15.99]],"o":[[12.295,-11.956],[14.34,-9.406],[5.292,-3.574],[6.085,1.937],[2.609,8.047],[0.848,10.907],[2.219,2.678],[0.208,6.389],[-32.226,14.584],[-3.902,-16.537],[0,0]],"v":[[-193.63,-493.143],[-149.953,-515.65],[-107.597,-545.16],[-88.648,-544.814],[-83.185,-531.386],[-83.785,-506.196],[-67.881,-478.138],[-63.3,-468.986],[-75.68,-455.932],[-179.378,-443.71],[-193.866,-492.553]]}],"t":371},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-15.263,7.82],[-18.6,-0.177],[-5.457,-3.317],[-0.483,-6.368],[1.35,-8.351],[-4.798,-9.831],[0.709,-3.405],[5.948,2.341],[30.725,1.049],[4.005,16.513]],"o":[[13.503,-10.573],[15.263,-7.82],[6.386,0.061],[5.457,3.317],[0.64,8.435],[-1.746,10.799],[1.525,3.126],[-1.304,6.258],[-31.806,-12.519],[-2.112,-16.86],[0,0]],"v":[[-187.87,-487.071],[-145.97,-509.502],[-92.687,-515.72],[-74.354,-510.919],[-72.209,-496.581],[-78.729,-472.242],[-69.884,-441.227],[-67.589,-431.253],[-89.001,-419.582],[-178.983,-436.397],[-188.168,-486.51]]}],"t":409},{"i":{"x":0.55,"y":1},"o":{"x":0.45,"y":0},"s":[{"c":false,"i":[[0,0],[-12.663,11.565],[-10.61,15.277],[-6.386,0.068],[-3.775,-5.151],[-3.267,-7.803],[-9.269,-5.811],[-1.197,-3.265],[5.706,-2.881],[30.668,-2.145],[5.697,16.008]],"o":[[12.332,-11.917],[12.663,-11.565],[3.643,-5.245],[6.386,-0.068],[5,6.823],[4.224,10.091],[2.947,1.847],[2.2,6.001],[-30.512,15.406],[-3.85,-16.549],[0,0]],"v":[[-193.108,-494.944],[-153.819,-521.55],[-129.028,-550.681],[-112.423,-556.108],[-103.025,-545.07],[-95.698,-520.961],[-71.8,-499.305],[-64.58,-492.049],[-77.866,-474.575],[-179.01,-445.466],[-193.346,-494.354]]}],"t":449},{"s":[{"c":false,"i":[[0,0],[-15.96,6.276],[-18.6,0.01],[-4.911,-4.081],[0.456,-6.369],[2.561,-8.062],[-3.304,-10.429],[1.201,-3.264],[5.517,3.228],[30.379,4.713],[2.003,16.873]],"o":[[14.669,-8.884],[15.96,-6.276],[6.386,-0.003],[4.911,4.081],[-0.605,8.438],[-3.312,10.426],[1.05,3.315],[-2.207,5.999],[-29.504,-17.259],[-0.082,-16.991],[0,0]],"v":[[-185.252,-477.536],[-140.48,-490.939],[-89.168,-495.827],[-72.477,-487.527],[-72.458,-473.03],[-82.478,-449.911],[-82.103,-422.24],[-81.296,-412.036],[-104.249,-403.555],[-182.485,-426.164],[-185.615,-477.014]]}],"t":477}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":23,"mn":"ADBE Vector Group","nm":"tail","np":3,"ty":"gr"}],"sr":1,"st":22,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":27,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1173.598,40.967,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":1,"ix":2,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1189.947,1.902,0],"t":0,"ti":[0.238,-0.119,0],"to":[0,-1.19,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1189.947,-5.241,0],"t":59.881,"ti":[-0.119,0.119,0],"to":[-0.238,0.119,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1191.375,2.616,0],"t":119.76,"ti":[-0.238,0.595,0],"to":[0.119,-0.119,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1189.232,-5.955,0],"t":179.637,"ti":[0.238,-0.238,0],"to":[0.238,-0.595,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1189.947,-0.955,0],"t":239.518,"ti":[0.119,0.119,0],"to":[-0.238,0.238,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1190.661,-4.527,0],"t":299.396,"ti":[-0.119,0.119,0],"to":[-0.119,-0.119,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1190.661,-1.67,0],"t":359.277,"ti":[-0.119,-0.595,0],"to":[0.119,-0.119,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"s":[-1189.947,-5.241,0],"t":419.156,"ti":[0.238,-0.357,0],"to":[0.119,0.595,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[-1189.947,1.902,0],"t":479,"ti":[0.238,0.833,0],"to":[-0.238,0.357,0]},{"s":[-1191.375,-3.098,0],"t":479.037109375}]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[14],"t":0},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[12.5],"t":59.881},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[13],"t":119.76},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[13],"t":179.637},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[15],"t":239.518},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[13],"t":299.396},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[15],"t":359.277},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[13],"t":419.156},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[14],"t":479},{"s":[16],"t":479.037109375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Tank","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.226,"y":0.156},"s":[{"c":true,"i":[[16.189,-0.55],[17.288,-2.157],[-1.01,-0.127],[-12.162,3.423],[-2.606,-10.311],[10.601,-3.992],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-3.685,1.943],[4.904,23.433]],"o":[[-25.696,0.872],[-1.01,0.126],[12.863,1.614],[11.264,-3.17],[2.337,9.249],[-17.784,6.696],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[22.237,-11.724],[-3.586,-17.133]],"v":[[-1086.781,-55.194],[-1130.649,-28.594],[-1121.427,-17.909],[-1089.709,-37.184],[-1070.818,-26.143],[-1095.856,-3.676],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1094.474,16.935],[-1053.633,-29.618]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.35},"s":[{"c":true,"i":[[16.196,-0.298],[17.288,-2.157],[-1.01,-0.127],[-6.726,2.164],[-0.47,-7.794],[6.798,-7.556],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-4.513,6.428],[3.905,22.436]],"o":[[-21.185,0.398],[-1.01,0.126],[12.863,1.614],[11.287,-3.679],[0.515,10.232],[-7.707,8.03],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[10.979,-14.26],[-2.125,-12.101]],"v":[[-1103.779,-47.018],[-1150.046,-23.44],[-1140.824,-12.755],[-1111.02,-27.655],[-1093.199,-18.138],[-1107.977,2.771],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1097.138,16.259],[-1076.369,-24.419]]}],"t":17},{"i":{"x":0.7,"y":1},"o":{"x":1,"y":1},"s":[{"c":true,"i":[[16.196,-0.298],[17.288,-2.157],[-1.01,-0.127],[-6.726,2.164],[-0.47,-7.794],[6.798,-7.556],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-4.513,6.428],[3.905,22.436]],"o":[[-21.185,0.398],[-1.01,0.126],[12.863,1.614],[11.287,-3.679],[0.515,10.232],[-7.707,8.03],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[10.979,-14.26],[-2.125,-12.101]],"v":[[-1103.779,-47.018],[-1150.046,-23.44],[-1140.824,-12.755],[-1111.02,-27.655],[-1093.199,-18.138],[-1107.977,2.771],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1097.138,16.259],[-1076.369,-24.419]]}],"t":62},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"s":[{"c":true,"i":[[16.159,1.124],[17.409,-0.665],[-0.995,-0.213],[-6.234,1.485],[0.427,-7.487],[6.349,-7.978],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-4.611,6.958],[1.856,22.561]],"o":[[-20.605,-1.433],[-1.017,0.039],[12.676,2.713],[11.57,-2.756],[-0.59,10.336],[-6.516,8.188],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[9.649,-14.56],[-0.957,-11.631]],"v":[[-1093.373,-51.23],[-1141.746,-32.091],[-1133.475,-20.654],[-1102.772,-32.445],[-1085.944,-21.623],[-1109.41,3.533],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1097.453,16.179],[-1068.65,-26.77]]}],"t":90},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[14.773,-3.009],[15.491,-4.373],[-0.903,0.092],[-5.633,2.521],[-3.699,-5.792],[3.19,-8.191],[2.303,-13.237],[-3.222,0.337],[-0.635,3.176],[-2.254,7.153],[6.899,16.744]],"o":[[-18.713,3.716],[-0.914,0.266],[11.306,-0.966],[10.226,-4.434],[2.543,7.521],[-3.3,8.342],[-0.387,2.788],[3.222,-0.337],[1.271,-6.352],[9.491,-13.88],[-5.38,-9.122]],"v":[[-1110.694,-46.701],[-1150.381,-22.628],[-1139.864,-12.239],[-1111.677,-29.121],[-1095.789,-20.914],[-1114.487,6.298],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1100.516,14.095],[-1079.818,-31.3]]}],"t":125},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0.8},"s":[{"c":true,"i":[[11.893,-11.59],[11.506,-12.071],[-0.713,0.725],[-4.386,4.67],[-12.267,-2.272],[-3.369,-8.635],[-0.592,-8.821],[-3.222,0.337],[-0.635,3.176],[2.641,7.559],[17.369,4.666]],"o":[[-14.784,14.408],[-0.702,0.736],[8.46,-8.605],[7.435,-7.917],[9.048,1.676],[3.379,8.66],[0.19,2.836],[3.222,-0.337],[1.271,-6.352],[-5.157,-14.761],[-14.565,-3.912]],"v":[[-1180.132,-13.732],[-1203.483,12.613],[-1188.302,20.827],[-1169.568,1.139],[-1141.384,-7.459],[-1125.029,12.041],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1106.877,9.767],[-1138.181,-25.116]]}],"t":142},{"i":{"x":0.62,"y":0.62},"o":{"x":0.45,"y":0.45},"s":[{"c":true,"i":[[11.893,-11.59],[11.506,-12.071],[-0.713,0.725],[-4.386,4.67],[-11.16,0.456],[-3.369,-8.635],[-0.592,-8.821],[-3.222,0.337],[-0.635,3.176],[2.641,7.559],[15.075,1.637]],"o":[[-14.784,14.408],[-0.702,0.736],[8.46,-8.605],[7.435,-7.917],[9.194,-0.375],[3.379,8.66],[0.19,2.836],[3.222,-0.337],[1.271,-6.352],[-5.157,-14.761],[-14.993,-1.628]],"v":[[-1190.761,-2.477],[-1212.088,20.714],[-1196.907,28.928],[-1180.197,12.395],[-1149.015,0.35],[-1125.029,12.041],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1106.877,9.767],[-1145.812,-17.307]]}],"t":204},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[14.773,-3.009],[15.491,-4.373],[-0.903,0.092],[-5.633,2.521],[-3.699,-5.792],[3.19,-8.191],[2.303,-13.237],[-3.222,0.337],[-0.635,3.176],[-2.254,7.153],[6.899,16.744]],"o":[[-18.713,3.716],[-0.914,0.266],[11.306,-0.966],[10.226,-4.434],[2.543,7.521],[-3.3,8.342],[-0.387,2.788],[3.222,-0.337],[1.271,-6.352],[4.836,-14.625],[-5.38,-9.122]],"v":[[-1121.575,-39.041],[-1161.814,-17.56],[-1151.297,-7.171],[-1124.484,-21.528],[-1107.222,-15.846],[-1114.487,6.298],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1100.516,14.095],[-1091.251,-26.232]]}],"t":235},{"i":{"x":0.833,"y":0.833},"o":{"x":0.35,"y":0.35},"s":[{"c":true,"i":[[16.196,-0.298],[17.288,-2.157],[-1.01,-0.127],[-6.726,2.164],[0.424,-7.797],[6.798,-7.556],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-4.513,6.428],[1.348,22.734]],"o":[[-21.185,0.398],[-1.01,0.126],[12.863,1.614],[11.287,-3.679],[-0.658,10.224],[-7.707,8.03],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[10.979,-14.26],[-0.727,-12.264]],"v":[[-1096.637,-50.072],[-1142.905,-26.494],[-1133.683,-15.81],[-1103.879,-30.71],[-1088.032,-23.044],[-1107.977,2.771],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1097.138,16.259],[-1070.594,-27.36]]}],"t":274},{"i":{"x":0.833,"y":1},"o":{"x":0.35,"y":0.35},"s":[{"c":true,"i":[[16.196,-0.298],[17.288,-2.157],[-1.01,-0.127],[-6.726,2.164],[0.424,-7.797],[6.798,-7.556],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-4.513,6.428],[1.348,22.734]],"o":[[-21.185,0.398],[-1.01,0.126],[12.863,1.614],[11.287,-3.679],[-0.658,10.224],[-7.707,8.03],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[10.979,-14.26],[-0.727,-12.264]],"v":[[-1096.637,-50.072],[-1142.905,-26.494],[-1133.683,-15.81],[-1103.879,-30.71],[-1088.032,-23.044],[-1107.977,2.771],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1097.138,16.259],[-1070.594,-27.36]]}],"t":305},{"i":{"x":0.731,"y":1},"o":{"x":0.226,"y":0.156},"s":[{"c":true,"i":[[16.189,-0.55],[17.288,-2.157],[-1.01,-0.127],[-12.162,3.423],[-2.606,-10.311],[10.601,-3.992],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-3.685,1.943],[4.904,23.433]],"o":[[-25.696,0.872],[-1.01,0.126],[12.863,1.614],[11.264,-3.17],[2.337,9.249],[-17.784,6.696],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[22.237,-11.724],[-3.586,-17.133]],"v":[[-1086.781,-55.194],[-1130.649,-28.594],[-1121.427,-17.909],[-1089.709,-37.184],[-1070.818,-26.143],[-1095.856,-3.676],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1094.474,16.935],[-1053.633,-29.618]]}],"t":335},{"i":{"x":0.55,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[16.093,-1.845],[11.125,-8.191],[-0.914,0.447],[-6.687,1.433],[-5.573,-5.245],[-0.129,-7.479],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-1.152,8.267],[5.449,11.749]],"o":[[-20.539,2.355],[-0.819,0.603],[14.003,-6.85],[11.055,-2.368],[5.006,4.712],[0.18,10.463],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[1.969,-14.129],[-4.595,-9.908]],"v":[[-1138.584,-33.109],[-1178.883,-14.629],[-1168.792,-1.954],[-1143.238,-13.056],[-1122.45,-9.265],[-1117.496,6.947],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1099.381,16.15],[-1103.426,-14.879]]}],"t":387},{"s":[{"c":true,"i":[[16.189,-0.55],[17.288,-2.157],[-1.01,-0.127],[-12.162,3.423],[-2.606,-10.311],[10.601,-3.992],[3.697,-15.364],[-3.222,0.337],[-0.635,3.176],[-3.685,1.943],[4.904,23.433]],"o":[[-25.696,0.872],[-1.01,0.126],[12.863,1.614],[11.264,-3.17],[2.337,9.249],[-17.784,6.696],[-0.665,2.765],[3.222,-0.337],[1.271,-6.352],[22.237,-11.724],[-3.586,-17.133]],"v":[[-1086.781,-55.194],[-1130.649,-28.594],[-1121.427,-17.909],[-1089.709,-37.184],[-1070.818,-26.143],[-1095.856,-3.676],[-1121.458,33.031],[-1111.425,37.042],[-1103.062,34.232],[-1094.474,16.935],[-1053.633,-29.618]]}],"t":450}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.866666674614,0.866666674614,0.86274510622,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-78.686,-16.815]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Tank hose","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.068,0.243],[4.75,-0.388],[2.069,-7.9],[-2.31,-4.314],[2.841,-15.555],[6.064,-5.896],[-2.385,-5.098],[-7.227,0.444],[-3.119,1.172],[-2.111,6.054],[-0.222,9.997],[2.833,11.369],[2.563,1.932]],"o":[[-4.285,-0.503],[-4.594,0.376],[-0.504,1.924],[6.477,12.098],[-1.871,10.244],[-1.5,1.458],[2.385,5.098],[4.954,-0.304],[6.001,-2.256],[3.656,-10.484],[0.231,-10.374],[-0.776,-3.114],[-1.662,-1.253]],"v":[[-1041.765,-2.261],[-1045.242,-2.633],[-1061.311,3.45],[-1055.682,6.471],[-1050.376,49.613],[-1060.842,79.482],[-1065.555,85.631],[-1051.61,88.648],[-1042.27,87.81],[-1030.49,70.791],[-1026.302,41.208],[-1028.238,9.117],[-1034.43,0.412]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[1,0.752941191196,0.054901961237,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-116.188,-0.01]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Tank strap 2","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.068,0.243],[4.75,-0.388],[2.069,-7.9],[-2.31,-4.314],[2.841,-15.555],[6.064,-5.896],[-2.385,-5.098],[-7.227,0.444],[-3.119,1.172],[-2.111,6.054],[-0.222,9.997],[2.833,11.369],[2.563,1.932]],"o":[[-4.285,-0.503],[-4.594,0.376],[-0.504,1.924],[6.477,12.098],[-1.871,10.244],[-1.5,1.458],[2.385,5.098],[4.954,-0.304],[6.001,-2.256],[3.656,-10.484],[0.231,-10.374],[-0.776,-3.114],[-1.662,-1.253]],"v":[[-1041.765,-2.261],[-1055.155,-2.161],[-1071.224,3.922],[-1065.596,6.943],[-1060.289,50.085],[-1070.756,79.953],[-1075.469,86.103],[-1051.61,88.648],[-1042.27,87.81],[-1030.49,70.791],[-1026.302,41.208],[-1028.238,9.117],[-1034.43,0.412]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[1,0.752941191196,0.054901961237,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Tank strap","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[2.674,-5.377],[-0.984,-2.083],[-1.516,-0.803],[-4.456,0.202],[-3.039,1.633],[0.48,3.389],[3.946,1.506],[3.27,-1.329]],"o":[[-5.67,-2.103],[-1.026,2.063],[0.728,1.542],[3.933,2.083],[3.454,-0.156],[3.039,-1.633],[-0.587,-4.145],[-3.298,-1.259],[0,0]],"v":[[-1109.03,26.342],[-1127.512,33.158],[-1127.955,39.812],[-1124.309,43.299],[-1111.24,45.231],[-1101.18,43.131],[-1096.235,34.819],[-1105.074,26.68],[-1117.548,26.491]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[1,0.752941191196,0.054901961237,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-78.686,-16.815]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Tank valve","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[18.439,-0.647],[43.24,-5.798],[3.119,-4.413],[0.438,-2.965],[-1.431,-10.009],[-1.016,-1.664],[-1.774,-0.81],[-14.615,-0.979],[-35.21,-2.358],[-20.032,4.919],[-2.24,3.361],[-0.225,3.035],[-0.422,5.692],[9.605,7.903],[5.137,1.114]],"o":[[-43.6,1.531],[-5.356,0.718],[-1.73,2.448],[-1.572,10.629],[0,0],[1.016,1.664],[13.325,6.084],[35.21,2.358],[20.581,1.378],[3.922,-0.963],[1.688,-2.533],[0.422,-5.692],[0.919,-12.405],[-4.059,-3.34],[-18.032,-3.91]],"v":[[-1079.871,6.375],[-1211.109,8.812],[-1225.538,15.081],[-1228.247,23.565],[-1228.082,61.031],[-1226.697,71.34],[-1222.083,74.789],[-1183.443,80.779],[-1077.099,83.568],[-1015.516,81.375],[-1005.177,75.629],[-1002.401,60.065],[-1001.726,49.798],[-1010.32,15.022],[-1024.734,9.009]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Tank stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-0.422,5.692],[9.605,7.903],[5.137,1.114],[18.44,-0.647],[43.24,-5.798],[3.119,-4.413],[0.438,-2.965],[0.061,-0.432],[-36.056,-2.367],[1.375,15.964],[-0.06,0.808]],"o":[[0.919,-12.405],[-4.059,-3.34],[-18.032,-3.91],[-43.6,1.531],[-5.356,0.718],[-1.73,2.448],[-0.064,0.431],[4.14,35.561],[42.24,2.459],[0.093,-0.815],[0.422,-5.692]],"v":[[-1001.547,49.738],[-1010.142,14.963],[-1024.555,8.949],[-1079.693,6.315],[-1210.93,8.753],[-1225.359,15.022],[-1228.068,23.505],[-1228.249,24.801],[-1127.788,73.266],[-1002.751,61.975],[-1002.222,60.005]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.039215687662,0.184313729405,0.674509823322,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Tank fill","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[42.24,2.459],[5.083,37.712],[-1.808,-13.275],[-0.882,-1.446],[-1.774,-0.81],[-14.615,-0.979],[-35.21,-2.358],[-20.032,4.919],[-2.24,3.361],[-0.255,2.244]],"o":[[-36.056,-2.367],[-1.362,9.576],[0.212,1.56],[1.016,1.664],[13.325,6.084],[35.21,2.358],[20.581,1.378],[3.922,-0.963],[1.238,-1.858],[-4.41,14.363]],"v":[[-1126.914,71.709],[-1227.937,22.501],[-1227.69,61.028],[-1226.518,71.28],[-1221.905,74.73],[-1183.264,80.719],[-1076.92,83.508],[-1015.337,81.315],[-1004.998,75.569],[-1002.256,60.365]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.015686275437,0.129411771894,0.525490224361,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Tank shadow","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-1116.402,24.689]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1116.402,24.689]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Tank","np":7,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-4.289,-8.926],[-18.405,-1.77],[-34.442,-2.169],[-29.248,16.919],[3.431,4.239],[0,0]],"o":[[4.585,9.542],[43.588,4.192],[34.297,2.16],[7.211,-4.171],[-65.933,-10.005],[0,0]],"v":[[-1232.34,76.162],[-1198.149,90.561],[-1103.431,91.164],[-1000.586,83.998],[-999.104,70.33],[-1205.137,64.677]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.964705884457,0.549019634724,0.129411771894,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Body tank shadow","np":2,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":28,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-884.232,101.187,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-884.232,101.187,0]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":0},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-36],"t":59.881},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[15],"t":119.76},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-27],"t":179.637},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[14],"t":239.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-26],"t":299.396},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[14],"t":359.277},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-24],"t":419.156},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":479},{"s":[-1],"t":479.037109375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Front fin","op":480,"parent":29,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[0.1,-6.191],[3.656,-7.718],[-7.571,-6.481],[-3.118,-3.162],[-4.545,-2.559],[1.241,5.726],[3.206,1.465]],"o":[[0,0],[-0.139,8.603],[1.627,1.231],[4.956,4.243],[2.555,2.591],[5.227,2.944],[-0.323,-1.491],[-2.1,-0.96]],"v":[[-873.706,108.59],[-879.875,111.255],[-885.961,126.219],[-867.834,133.039],[-854.568,148.966],[-846.883,157.007],[-849.682,137.796],[-861.876,114.839]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.046,1.808],[0.622,-6.073],[4.047,-7.52],[-6.739,-6.228],[-2.957,-3.476],[-2.947,-2.52],[1.22,6.36],[3.289,2.864]],"o":[[-0.588,-0.205],[-0.872,8.512],[1.562,1.313],[4.524,4.182],[2.679,3.149],[3.963,2.893],[-0.585,-2.74],[-2.079,-1.81]],"v":[[-873.78,106.277],[-880.145,108.532],[-888.012,124.128],[-871.094,132.336],[-861.013,146.994],[-853.736,157.178],[-854.1,135.197],[-862.652,114.038]]}],"t":11.977},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.96,2.502],[0.454,-6.021],[3.656,-7.718],[-6.601,-5.385],[-3.168,-3.428],[-1.845,-2.205],[1.796,6.759],[3.595,3.746]],"o":[[-1.095,-0.319],[-0.681,8.498],[1.627,1.231],[4.546,3.696],[3.071,3.354],[3.171,2.472],[-1.059,-3.719],[-2.226,-2.32]],"v":[[-872.735,98.118],[-879.036,100.623],[-886.904,117.446],[-870.264,125.203],[-861.487,137.822],[-853.611,149.084],[-854.009,124.884],[-861.491,106.076]]}],"t":21.955},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.595,1.339],[0.807,-5.851],[3.656,-7.718],[-5.631,-4.288],[-2.57,-1.979],[-5.078,-4.109],[4.042,5.397],[4.791,3.166]],"o":[[-2.191,-0.639],[-1.223,8.392],[1.627,1.231],[4.136,3.15],[5.52,4.25],[5.513,4.461],[-3.42,-4.565],[-3.993,-2.639]],"v":[[-869.833,85.277],[-874.677,90.115],[-879.407,101.286],[-862.238,105.681],[-853.655,112.26],[-835.53,127.19],[-843.868,103.291],[-857.756,90.05]]}],"t":43.912},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.906,1.853],[1.064,-5.727],[3.656,-7.718],[-5.026,-3.369],[-3.884,-3.042],[-1.39,-1.074],[8.124,9.252],[4.287,5.057]],"o":[[-2.151,-0.798],[-1.616,8.316],[1.627,1.231],[3.973,2.63],[5.131,4.018],[0.557,1],[-4.113,-4.684],[-2.947,-3.466]],"v":[[-865.495,81.358],[-872.023,83.587],[-878.109,98.551],[-864.094,103.369],[-852.713,112.829],[-837.057,124.541],[-844.696,105.847],[-852.882,90.77]]}],"t":59.881},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.139,2.239],[1.257,-5.634],[3.656,-7.718],[-4.572,-2.679],[-3.282,-3.243],[-0.347,-0.269],[3.277,7.105],[4.043,4.4]],"o":[[-2.12,-0.918],[-1.289,8.129],[1.627,1.231],[3.85,2.24],[6.035,5.965],[0.139,0.25],[-2.209,-5.713],[-4.19,-4.511]],"v":[[-869.168,82.315],[-875.062,84.841],[-879.662,100.158],[-866.132,104.583],[-854.844,112.58],[-838.544,126.374],[-845.011,108.446],[-854.067,93.052]]}],"t":71.855},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-3.751,-2.506],[0,0],[1.661,6.389],[3.962,4.181]],"o":[[-2.11,-0.958],[-1.179,8.066],[1.627,1.231],[3.809,2.11],[6.09,4.069],[0,0],[-1.575,-6.056],[-4.604,-4.86]],"v":[[-870.392,82.634],[-876.074,85.259],[-880.179,100.693],[-866.812,104.988],[-855.554,112.497],[-837.29,124.714],[-845.116,109.312],[-854.462,93.812]]}],"t":75.848},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.155,1.287],[0.968,-5.652],[3.027,-7.985],[-4.846,-1.589],[-4.52,-1.258],[0.909,0.167],[3.411,5.088],[4.388,3.113]],"o":[[-2.2,-0.525],[-0.985,8.208],[1.72,1.097],[4.289,1.341],[7.016,2.06],[-2.741,-0.504],[-2.935,-4.65],[-4.843,-3.512]],"v":[[-873.179,84.575],[-878.85,87.591],[-882.671,103.307],[-868.814,105.908],[-855.249,109.998],[-834.016,116.985],[-845.812,104.178],[-857.382,92.154]]}],"t":81.834},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.735,0.576],[1.578,-5.479],[3.656,-7.718],[-5.174,-1.174],[-5.495,-0.131],[2.38,0.638],[5.212,3.603],[4.397,2.242]],"o":[[-2.218,-0.27],[-2.404,8.163],[1.627,1.231],[4.765,0.961],[8.059,0.192],[-7.177,-1.925],[-4.185,-2.893],[-4.449,-2.269]],"v":[[-875.808,96.19],[-882.053,98.622],[-888.723,113.856],[-874.724,116.57],[-858.303,117.823],[-833.794,120.565],[-849.373,109.673],[-861.984,101.076]]}],"t":91.816},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.831,1.159],[1.803,-5.371],[4.96,-6.597],[-5.834,-0.058],[-4.895,0.501],[7.618,5.671],[9.798,2.654],[4.953,2.346]],"o":[[-4.573,-1.384],[-2.749,8.096],[1.627,1.231],[5.602,-0.044],[9.287,-1.29],[-4.779,-3.558],[-5.408,-1.465],[-3.617,-1.713]],"v":[[-873.049,106.128],[-882.642,109.469],[-891.196,123.508],[-871.409,127.549],[-853.145,127.94],[-823.963,125.792],[-845.054,115.421],[-861.569,111.07]]}],"t":105.787},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.028,-5.263],[3.656,-7.718],[-4.62,-2.003],[-5.866,-4.115],[-2.657,9.85],[3.676,5.628],[4.741,4.106]],"o":[[0,0],[-3.093,8.029],[1.627,1.231],[6.186,2.682],[5.017,3.519],[1.776,-6.583],[-3.43,-5.251],[-3.752,-3.25]],"v":[[-872.989,109.462],[-879.875,111.255],[-885.961,126.219],[-870.654,130.678],[-855.561,139.401],[-833.849,145.118],[-848.063,131.053],[-859.775,116.327]]}],"t":119.76},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.581,1.911],[2.028,-5.263],[4.372,-6.996],[-4.74,-4.98],[-3.119,-4.279],[-6.064,3.449],[2.267,8.341],[5.2,6.121]],"o":[[-2.657,-1.109],[-3.093,8.029],[1.627,1.231],[4.009,4.212],[4.74,6.504],[6.112,-3.476],[-2.206,-8.113],[-3.124,-3.677]],"v":[[-871.882,108.396],[-881.358,107.322],[-889.714,122.801],[-872.654,129.349],[-862.237,143.673],[-847.08,163.024],[-847.521,137.073],[-859.775,116.327]]}],"t":135.729},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.636,1.743],[2.233,-5.179],[4.746,-6.94],[-4.06,-4.164],[-3.719,-5.084],[-6.36,-3.172],[2.315,9.663],[5.225,7.089]],"o":[[-2.219,-0.864],[-3.406,7.901],[1.577,1.294],[4.093,4.13],[4.053,5.643],[4.963,1.421],[-1.674,-6.989],[-2.909,-3.946]],"v":[[-875.257,100.755],[-882.818,101.478],[-891.087,116.393],[-876.451,122.106],[-865.512,135.665],[-853.232,152.189],[-854.024,128.57],[-862.984,109.062]]}],"t":143.711},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.791,1.297],[2.028,-5.263],[4.545,-7.215],[-3.83,-3.268],[-4.513,-5.425],[-6.792,-7.697],[3.048,10.473],[5.704,7.463]],"o":[[-1.947,-0.527],[-3.093,8.029],[1.627,1.231],[4.433,3.782],[3.919,4.711],[4.193,4.752],[-1.753,-6.022],[-3.014,-3.944]],"v":[[-876.958,92.934],[-883.025,95.523],[-890.194,110.562],[-877.003,114.639],[-864.758,126.855],[-853.518,140.394],[-856.193,118.609],[-864.008,100.671]]}],"t":149.699},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.872,1.106],[1.854,-5.327],[3.883,-7.581],[-3.936,-3.14],[-4.689,-5.274],[-8.102,-6.823],[6.547,9.84],[5.947,7.271]],"o":[[-2.217,-0.503],[-2.828,8.126],[1.667,1.177],[4.555,3.635],[4.072,4.58],[4.794,4.077],[-3.205,-5.149],[-3.142,-3.842]],"v":[[-874.602,78.917],[-880.488,82.653],[-886.655,97.868],[-872.343,101.654],[-860.509,112.993],[-847.74,123.943],[-850.236,104.703],[-860.808,87.121]]}],"t":163.67},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.028,-5.263],[3.656,-7.718],[-3.83,-3.268],[-4.513,-5.425],[-9.109,-6.387],[9.844,9.566],[5.704,7.463]],"o":[[0,0],[-3.094,8.029],[1.627,1.231],[4.433,3.782],[3.919,4.711],[5.188,3.638],[-4.498,-4.371],[-3.014,-3.944]],"v":[[-869.357,78.04],[-876.244,79.833],[-882.33,94.797],[-867.022,99.256],[-856.469,110.413],[-842.739,119.291],[-843.672,102.806],[-856.143,84.905]]}],"t":179.637},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.776,1.328],[1.674,-5.433],[3.656,-7.718],[-3.953,-3.022],[-4.074,-3.552],[-4.554,-3.194],[5.753,7.978],[5.007,6.654]],"o":[[-1.055,-0.479],[-2.552,8.134],[3.442,0.999],[5.02,3.839],[4.246,3.702],[2.594,1.819],[-3.036,-5.214],[-2.964,-3.947]],"v":[[-871.38,79.555],[-878.135,81.508],[-883.69,96.848],[-871.502,100.428],[-857.487,113.235],[-845.018,124.326],[-847.67,106.33],[-857.674,88.904]]}],"t":187.621},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.356,2.107],[1.409,-5.561],[3.656,-7.718],[-3.21,-3.777],[-2.986,-3.254],[-1.139,-0.798],[2.684,6.787],[4.484,6.047]],"o":[[-1.846,-0.838],[-2.146,8.213],[4.804,0.824],[3.092,3.638],[4.028,4.352],[0.649,0.455],[-1.94,-5.846],[-2.926,-3.949]],"v":[[-872.897,80.692],[-879.553,82.764],[-884.711,98.386],[-872.179,105.061],[-861.177,116.351],[-847.972,129.929],[-850.669,108.974],[-858.823,91.902]]}],"t":193.611},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-2.768,-2.944],[0,0],[1.661,6.389],[4.31,5.844]],"o":[[-2.11,-0.958],[-2.01,8.239],[5.258,0.766],[3.809,2.11],[4.043,4.3],[0,0],[-1.575,-6.056],[-2.913,-3.95]],"v":[[-873.402,81.07],[-880.026,83.183],[-885.051,98.899],[-870.761,105.412],[-861.357,113.669],[-845.354,127.282],[-851.669,109.855],[-859.206,92.902]]}],"t":195.605},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.125,1.61],[1.064,-5.637],[3.258,-7.386],[-4.697,-1.851],[-3.49,-2.122],[0.609,0.091],[2.822,5.416],[4.858,5.064]],"o":[[-2.191,-0.65],[-1.633,8.319],[4.396,0.682],[4.122,1.573],[5.664,3.275],[-1.838,-0.273],[-2.917,-5.252],[-3.3,-3.435]],"v":[[-875.295,83.091],[-881.129,85.957],[-886.207,101.522],[-871.216,104.934],[-859.221,111.214],[-840.817,120.565],[-850.911,106.273],[-860.85,92.354]]}],"t":199.598},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.033,0.853],[0.807,-5.671],[2.859,-7.054],[-4.973,-1.252],[-4.212,-1.301],[1.219,0.181],[3.983,4.443],[5.406,4.284]],"o":[[-2.271,-0.342],[-1.256,8.4],[3.534,0.599],[4.435,1.036],[7.285,2.25],[-3.675,-0.546],[-4.259,-4.447],[-3.686,-2.921]],"v":[[-877.188,85.111],[-882.231,88.731],[-887.362,104.145],[-872.783,107.112],[-859.133,110.782],[-839.057,117.153],[-851.226,103.875],[-862.493,91.807]]}],"t":203.59},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.589,0.477],[1.578,-5.479],[3.656,-7.718],[-5.174,-1.174],[-5.495,-0.131],[2.38,0.638],[5.237,3.348],[5.439,3.916]],"o":[[-2.324,-0.242],[-2.404,8.163],[1.627,1.231],[4.765,0.961],[8.059,0.192],[-7.177,-1.925],[-5.872,-3.754],[-3.744,-2.696]],"v":[[-877.724,94.557],[-884.553,97.259],[-890.639,112.223],[-876.64,114.937],[-860.218,116.19],[-835.995,117.78],[-852.16,108.988],[-864.253,99.388]]}],"t":211.574},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.991,0.303],[2.275,-5.189],[4.304,-7.376],[-5.807,-0.558],[-4.92,0.079],[7.104,6.303],[8.323,0.683],[4.734,2.762]],"o":[[-2.488,-0.189],[-3.432,7.831],[1.516,1.366],[5.585,0.436],[9.363,-0.49],[-4.457,-3.955],[-5.584,-0.458],[-3.457,-2.017]],"v":[[-874.642,106.378],[-881.614,109.1],[-888.96,123.487],[-874.575,126.059],[-855.983,125.846],[-826.561,118.69],[-848.241,114.851],[-863.359,110.484]]}],"t":225.547},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.028,-5.263],[3.656,-7.718],[-4.62,-2.003],[-5.866,-4.115],[-2.657,9.85],[3.676,5.628],[4.741,4.106]],"o":[[0,0],[-3.093,8.029],[1.627,1.231],[6.186,2.682],[5.017,3.519],[1.776,-6.583],[-3.43,-5.251],[-3.752,-3.25]],"v":[[-872.989,109.462],[-879.875,111.255],[-885.961,126.219],[-870.654,130.678],[-855.561,139.401],[-833.849,145.118],[-848.063,131.053],[-859.775,116.327]]}],"t":239.518},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.763,1.395],[1.37,-4.367],[4.564,-6.521],[-4.344,-3.062],[-3.489,-4.133],[-8.645,3.125],[3.261,7.637],[5.255,5.897]],"o":[[-1.708,-0.5],[-2.575,8.21],[1.627,1.231],[4.335,3.056],[4.779,5.66],[6.613,-2.391],[-2.758,-6.459],[-3.358,-3.62]],"v":[[-876.348,105.687],[-882.063,106.918],[-889.909,122.181],[-875.984,125.97],[-865.284,139.539],[-848.427,155.594],[-849.473,133.102],[-863.723,112.29]]}],"t":255.486},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.785,2.52],[1.429,-4.179],[4.74,-6.769],[-3.703,-3.578],[-3.576,-5.248],[-7.245,-3.795],[2.207,9.523],[4.812,7.304]],"o":[[-0.707,-0.286],[-2.9,8.481],[1.497,1.387],[4.026,3.889],[3.759,5.517],[5.037,2.201],[-1.558,-6.395],[-2.769,-4.099]],"v":[[-878.127,102.339],[-884.634,103.25],[-892.936,117.591],[-879.976,122.765],[-869.514,137.286],[-857.5,152.641],[-857.278,130.466],[-865.888,110.863]]}],"t":263.469},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.938,2.339],[0.767,-4.243],[3.656,-7.718],[-3.83,-3.268],[-4.513,-5.425],[-6.792,-7.697],[3.048,10.473],[5.704,7.463]],"o":[[0,0],[-1.648,9.114],[1.627,1.231],[4.433,3.782],[3.919,4.711],[4.193,4.752],[-1.753,-6.022],[-3.014,-3.944]],"v":[[-877.892,94.388],[-884.779,96.181],[-890.865,111.145],[-877.844,115.066],[-865.131,128.363],[-854.189,140.976],[-856.864,119.191],[-864.571,102.157]]}],"t":269.459},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.89,1.422],[0.88,-4.488],[3.67,-7.027],[-4.002,-3.056],[-5.377,-4.495],[-8.395,-6.553],[7.205,9.613],[6.101,7.143]],"o":[[-1.241,-0.243],[-1.662,8.738],[1.691,1.141],[4.632,3.536],[4.377,3.71],[4.942,3.895],[-3.491,-4.959],[-3.224,-3.774]],"v":[[-874.72,80.19],[-880.148,82.854],[-885.918,97.859],[-872.357,100.927],[-858.762,113.066],[-845.776,122.997],[-848.547,104.161],[-859.699,87.801]]}],"t":285.426},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.813,1.215],[1.433,-4.601],[4.387,-6.031],[-3.83,-3.268],[-5.66,-4.215],[-9.109,-6.387],[9.844,9.566],[5.704,7.463]],"o":[[-2.3,-0.58],[-2.56,8.215],[1.627,1.231],[4.433,3.782],[4.389,3.268],[5.188,3.638],[-4.498,-4.371],[-3.014,-3.944]],"v":[[-871.468,77.46],[-875.874,80.326],[-882.879,94.739],[-869.194,98.431],[-856.1,110.906],[-842.37,119.784],[-843.303,103.299],[-855.775,86.44]]}],"t":299.396},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-3.071,-2.626],[0,0],[1.661,6.389],[4.31,5.844]],"o":[[-2.11,-0.958],[-2.01,8.239],[1.627,1.231],[3.809,2.11],[5.036,4.306],[0,0],[-1.575,-6.056],[-2.913,-3.95]],"v":[[-873.875,82.145],[-880.498,84.258],[-886.584,99.222],[-873.217,103.517],[-862.573,111.45],[-844.783,125.302],[-853.026,109.107],[-860.739,93.225]]}],"t":315.365},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.221,1.215],[1.578,-5.479],[3.656,-7.718],[-5.174,-1.174],[-5.495,-0.131],[2.38,0.638],[4.891,3.976],[5.854,3.264]],"o":[[-2.276,-0.529],[-2.404,8.163],[1.627,1.231],[4.765,0.961],[8.059,0.192],[-7.177,-1.925],[-5.408,-4.396],[-4.898,-2.731]],"v":[[-876.932,93.515],[-883.798,96.931],[-889.884,111.895],[-875.885,114.609],[-859.463,115.862],[-835.063,117.46],[-851.003,107.786],[-863.649,98.515]]}],"t":331.334},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.869,1.025],[1.098,-3.689],[3.656,-7.718],[-5.834,-0.058],[-4.895,0.501],[5.706,7.592],[10.221,1.283],[4.953,2.346]],"o":[[-3.158,-0.836],[-2.439,8.195],[1.627,1.231],[5.602,-0.044],[9.287,-1.29],[-3.562,-4.739],[-5.559,-0.698],[-3.617,-1.713]],"v":[[-877.455,104.384],[-882.744,108.518],[-890.3,123.392],[-875.617,125.424],[-857.28,125.648],[-830.887,118.242],[-850.471,111.299],[-865.908,108.243]]}],"t":345.305},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.028,-5.263],[3.656,-7.718],[-4.62,-2.003],[-5.866,-4.115],[-2.657,9.85],[3.676,5.628],[4.741,4.106]],"o":[[0,0],[-3.093,8.029],[1.627,1.231],[6.186,2.682],[5.017,3.519],[1.776,-6.583],[-3.43,-5.251],[-3.752,-3.25]],"v":[[-872.989,109.462],[-879.875,111.255],[-885.961,126.219],[-870.654,130.678],[-855.561,139.401],[-833.849,145.118],[-848.063,131.053],[-859.775,116.327]]}],"t":359.277},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.631,1.786],[1.353,-3.356],[4.559,-7.221],[-3.845,-3.164],[-4.306,-6.01],[-6.745,6.245],[2.317,7.974],[4.506,6.487]],"o":[[-2.213,-0.853],[-3.218,7.98],[1.467,1.418],[4.819,3.878],[3.538,4.938],[4.428,-4.099],[-1.959,-6.745],[-2.898,-3.998]],"v":[[-874.583,105.651],[-881.693,106.249],[-889.335,121.604],[-874.677,127.875],[-864.579,140.693],[-847.489,157.693],[-850.51,137.318],[-862.148,114.94]]}],"t":375.246},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.731,1.502],[1.64,-5.396],[4.211,-6.688],[-3.627,-3.492],[-4.179,-5.687],[-6.317,-8.091],[2.414,10.637],[5.246,7.792]],"o":[[-2.261,-0.718],[-1.711,5.63],[1.55,1.327],[4.198,4.042],[3.629,4.938],[3.9,4.995],[-1.388,-6.116],[-2.772,-4.118]],"v":[[-877.856,94.473],[-885.269,96.893],[-892.243,111.464],[-879.51,116.139],[-867.94,129.103],[-857.426,143.446],[-858.787,121.54],[-865.763,104.22]]}],"t":389.217},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.557,0.17],[1.067,-5.534],[2.924,-7.645],[-4.154,-2.841],[-5.062,-4.913],[-8.554,-6.174],[7.224,9.228],[6.462,6.812]],"o":[[-1.247,-0.213],[-1.401,7.01],[1.748,1.051],[4.808,3.289],[4.395,4.266],[5.06,3.699],[-3.544,-4.859],[-3.415,-3.599]],"v":[[-875.661,80.253],[-882.466,83.35],[-886.926,98.869],[-872.493,101.475],[-859.831,111.947],[-846.303,121.968],[-850.128,102.938],[-862.006,86.833]]}],"t":403.189},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.028,-5.263],[3.656,-7.718],[-3.83,-3.268],[-5.63,-4.255],[-9.109,-6.387],[9.844,9.566],[5.704,7.463]],"o":[[0,0],[-3.093,8.029],[1.627,1.231],[4.433,3.782],[5.039,3.808],[5.188,3.638],[-4.498,-4.371],[-3.014,-3.944]],"v":[[-871.406,77.876],[-878.293,79.669],[-884.378,94.633],[-870.823,98.938],[-858.518,110.249],[-844.788,119.127],[-845.721,102.642],[-858.192,84.742]]}],"t":419.156},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-3.071,-2.626],[0,0],[1.661,6.389],[4.31,5.844]],"o":[[-2.11,-0.958],[-2.01,8.239],[1.627,1.231],[3.809,2.11],[5.036,4.306],[0,0],[-1.575,-6.056],[-2.913,-3.95]],"v":[[-873.875,82.145],[-880.498,84.258],[-886.584,99.222],[-873.217,103.517],[-862.573,111.45],[-844.783,125.302],[-853.026,109.107],[-860.739,93.225]]}],"t":435.125},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.221,1.215],[1.578,-5.479],[3.656,-7.718],[-5.174,-1.174],[-5.495,-0.131],[2.38,0.638],[4.891,3.976],[5.854,3.264]],"o":[[-2.276,-0.529],[-2.404,8.163],[1.627,1.231],[4.765,0.961],[8.059,0.192],[-7.177,-1.925],[-5.408,-4.396],[-4.898,-2.731]],"v":[[-876.932,93.515],[-883.798,96.931],[-889.884,111.895],[-875.885,114.609],[-859.463,115.862],[-835.063,117.46],[-851.003,107.786],[-863.649,98.515]]}],"t":451.094},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.869,1.025],[1.098,-3.689],[3.656,-7.718],[-5.834,-0.058],[-4.895,0.501],[5.706,7.592],[10.221,1.283],[4.953,2.346]],"o":[[-3.158,-0.836],[-2.439,8.195],[1.627,1.231],[5.602,-0.044],[9.287,-1.29],[-3.562,-4.739],[-5.559,-0.698],[-3.617,-1.713]],"v":[[-877.455,104.384],[-882.744,108.518],[-890.3,123.392],[-875.617,125.424],[-857.28,125.648],[-830.887,118.242],[-850.471,111.299],[-865.908,108.243]]}],"t":465.064},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[0.1,-6.191],[3.656,-7.718],[-7.571,-6.481],[-3.118,-3.162],[-4.545,-2.559],[1.241,5.726],[3.206,1.465]],"o":[[0,0],[-0.139,8.603],[1.627,1.231],[4.956,4.243],[2.555,2.591],[5.227,2.944],[-0.323,-1.491],[-2.1,-0.96]],"v":[[-873.706,108.59],[-879.875,111.255],[-885.961,126.219],[-867.834,133.039],[-854.568,148.966],[-846.883,157.007],[-849.682,137.796],[-861.876,114.839]]}],"t":479},{"s":[{"c":true,"i":[[6.336,0.289],[0.1,-6.191],[3.656,-7.718],[-7.571,-6.481],[-3.118,-3.162],[-4.545,-2.559],[1.241,5.726],[3.206,1.465]],"o":[[0,0],[-0.139,8.603],[1.627,1.231],[4.956,4.243],[2.555,2.591],[5.227,2.944],[-0.323,-1.491],[-2.1,-0.96]],"v":[[-873.706,108.59],[-879.875,111.255],[-885.961,126.219],[-867.834,133.039],[-854.568,148.966],[-846.883,157.007],[-849.682,137.796],[-861.876,114.839]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.68235296011,0.658823549747,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Front fin top","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.367,9.005],[15.747,-6.232],[15.739,10.707],[3.167,10.649],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.925],[-5.612,-6.43],[-4.918,-5.521],[-7.289,-4.03],[-14.011,-0.63],[-10.368,7.724]],"o":[[12.313,-15.05],[-27.355,10.826],[-10.374,-7.058],[-5.517,-18.55],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.719,8.665],[18.88,10.438],[12.748,0.574],[10.569,-7.874]],"v":[[-737.04,157.551],[-756.875,148.321],[-825.1,144.184],[-840.255,113.855],[-865.994,77.069],[-881.654,81.623],[-878.956,110.612],[-885.84,126.215],[-868.405,133.331],[-852.462,151.82],[-829.897,172.994],[-786.622,188.216],[-762.477,180.144]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.588,4.27],[8.096,2.958],[9.506,16.175],[3.39,10.887],[20.604,1.913],[0,0],[2.491,-10.218],[4.206,-4.544],[-4.971,-6.937],[-3.915,-6.247],[-10.02,-12.31],[-9.354,-6.56],[-8.688,2.267]],"o":[[6.649,-5.08],[-17.011,-6.216],[-6.047,-10.289],[-5.169,-17.305],[-8.898,-0.826],[3.86,7.571],[-1.122,4.602],[5.724,2.06],[6.911,9.644],[6.569,10.628],[5.342,6.564],[7.446,5.222],[11.066,-2.888]],"v":[[-760.612,203.089],[-780.083,187.245],[-827.524,147.704],[-839.507,113.966],[-864.354,76.951],[-880.377,79.987],[-880.463,109.101],[-888.807,123.975],[-872.132,132.725],[-857.218,154.109],[-836.941,181.64],[-808.165,210.538],[-781.692,212.491]]}],"t":13.971},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.158,1.019],[3.431,9.602],[8.969,19.033],[4.472,10.733],[20.656,1.218],[0,0],[2.145,-10.296],[4.05,-4.683],[-5.203,-6.766],[-3.87,-6.281],[-3.693,-10.053],[-2.456,-11.66],[-6.719,-2.886]],"o":[[10.011,-0.805],[-6.46,-18.081],[-5.389,-11.216],[-6.545,-16.129],[-8.921,-0.526],[4.113,7.436],[-0.966,4.637],[5.79,1.866],[7.232,9.406],[6.786,11.129],[3.578,9.739],[1.399,6.639],[6.364,2.733]],"v":[[-794.524,222.695],[-794.83,188.816],[-823.464,138.836],[-837.033,104.682],[-863.242,71.567],[-880.185,76.361],[-879.656,102.432],[-887.494,117.578],[-870.533,125.762],[-854.416,147.446],[-839.332,175.815],[-832.847,202.257],[-814.975,219.017]]}],"t":21.955},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.007,-1.863],[-2.601,21.847],[9.255,21.688],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-4.009,-6.213],[1.973,-11.54],[-5.904,-12.722],[-6.408,-6.237]],"o":[[13.75,2.844],[3.026,-25.421],[-5.145,-12.056],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.37,11.422],[-3.468,20.282],[3.21,6.918],[4.74,4.613]],"v":[[-823.342,226.507],[-805.503,189.548],[-817.853,128.155],[-834.021,94.098],[-865.187,62.275],[-880.847,66.829],[-878.149,95.818],[-885.032,111.421],[-867.597,118.537],[-849.625,139.964],[-838.815,169.257],[-853.438,203.188],[-841.768,217.818]]}],"t":29.939},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.173,-0.307],[-0.292,20.456],[12.833,18.632],[6.944,9.653],[20.56,-2.336],[0,0],[0.351,-10.511],[3.188,-5.308],[-6.284,-5.775],[-5.113,-5.3],[0.694,-11.687],[-6.003,-10.862],[-6.632,-3.389]],"o":[[13.08,0.502],[0.365,-25.597],[-7.783,-11.107],[-9.824,-13.657],[-8.879,1.009],[5.325,6.622],[-0.158,4.734],[6.024,0.847],[8.736,8.029],[10.089,10.333],[-1.22,20.54],[4.157,7.523],[5.697,2.633]],"v":[[-810.961,203.449],[-790.205,171.167],[-810.462,110.241],[-832.201,79.712],[-866.672,51.503],[-880.017,56.34],[-874.153,84.858],[-879.282,101.122],[-861.171,106.281],[-838.635,124.239],[-822.786,152.996],[-844.395,182.368],[-826.083,199.328]]}],"t":43.912},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.341,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-811.237,208.504],[-792.806,182.132],[-810.329,115.034],[-830.973,83.819],[-862.138,51.997],[-873.802,53.955],[-871.104,82.944],[-877.988,98.547],[-860.552,105.663],[-837.318,124.725],[-821.068,161.753],[-843.392,196.62],[-822.493,206.242]]}],"t":59.881},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.89,2.029],[8.663,12.792],[15.292,14.622],[6.578,9.906],[20.633,-1.567],[0,0],[0.744,-10.491],[3.385,-5.185],[-6.064,-6.006],[-5.439,-5.009],[-13.943,-17.582],[-9.938,1.212],[-3.61,0.603]],"o":[[7.576,-3.952],[-13.25,-15.548],[-10.238,-9.746],[-9.307,-14.015],[-8.911,0.677],[5.074,6.817],[-0.335,4.725],[5.988,1.071],[8.43,8.35],[11.429,10.525],[13.094,16.511],[7.318,-0.893],[4.328,-0.723]],"v":[[-763.524,181.686],[-765.566,155.136],[-809.99,109.982],[-832.845,80.347],[-866.237,50.87],[-877.728,53.669],[-872.934,82.387],[-878.667,98.448],[-861.269,105.413],[-837.955,124.608],[-802.512,151.864],[-796.425,190.349],[-785.619,188.405]]}],"t":67.863},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.296,4.464],[10.982,5.579],[11.967,14.426],[5.084,10.749],[20.55,-2.419],[0,0],[0.309,-10.513],[3.167,-5.32],[-6.307,-5.75],[-5.642,-4.78],[-10.522,-5.134],[-12.44,-2.874],[-2.337,2.185]],"o":[[4.53,-6.136],[-22.823,-11.595],[-8.812,-10.623],[-7.191,-15.204],[-8.875,1.045],[5.352,6.601],[-0.139,4.734],[6.027,0.823],[8.768,7.993],[11.855,10.043],[10.194,4.974],[6.467,1.494],[5.578,-5.214]],"v":[[-743.782,164.877],[-779.488,148.365],[-820.685,110.863],[-835.426,79.917],[-870.01,51.847],[-881.375,55.12],[-875.397,83.614],[-880.46,99.899],[-863.135,107.002],[-839.919,126.656],[-796.797,154.702],[-757.654,167.969],[-744.989,167.114]]}],"t":73.852},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.402,4.036],[10.008,-1.427],[14.217,10.782],[8.582,9.116],[19.203,-3.47],[0,0],[-0.105,-10.517],[2.955,-5.441],[-6.65,-2.551],[-7.612,-2.689],[-15.628,-2.233],[-10.783,2.975],[-0.778,3.07]],"o":[[1.27,-12.753],[-16.413,2.34],[-9.154,-6.858],[-9.652,-11.231],[-8.755,1.667],[5.608,6.385],[0.047,4.736],[6.055,0.585],[10.619,3.227],[16.169,4.826],[18.942,2.707],[5.72,-0.894],[0.458,-4.626]],"v":[[-737.576,104.15],[-767.578,108.572],[-818.753,96.357],[-839.319,73.254],[-874.29,55.142],[-885.74,59.377],[-878.645,87.614],[-883.063,104.086],[-862.93,107.386],[-837.5,115.892],[-791.62,127.641],[-745.342,122.895],[-737.736,116.316]]}],"t":81.834},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.325,6.397],[13.09,-8.505],[14.557,9.96],[10.348,9.382],[18.324,-0.925],[0,0],[1.503,-10.409],[3.752,-4.926],[-6.751,-0.643],[-9.163,-2.251],[-15.948,-1.35],[-10.19,6.855],[0.094,3.925]],"o":[[-1.64,-9.035],[-16.003,10.398],[-8.452,-4.795],[-10.231,-9.225],[-8.877,0.591],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[12.2,0.685],[19.849,3.153],[25.561,-0.052],[5.323,-2.24],[-0.496,-5.642]],"v":[[-735.289,83.203],[-756.789,96.994],[-817.543,99.158],[-840.008,79.634],[-872.427,64.972],[-884.69,67.884],[-881.993,96.874],[-888.876,112.477],[-866.495,116.125],[-839.661,118.54],[-792.218,123.011],[-736.679,110.139],[-732.314,98.868]]}],"t":89.818},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.323,6.378],[13.998,-10.278],[12.624,7.635],[8.954,7.559],[15.965,0.707],[0,0],[2.885,-10.114],[4.378,-4.378],[-7.257,-0.429],[-8.118,-1.296],[-13.493,0.587],[-14.475,12.418],[0.565,3.94]],"o":[[-4.297,-8.778],[-16.284,11.957],[-8.756,-3.845],[-9.068,-7.491],[-8.892,-0.181],[3.564,7.715],[-1.299,4.555],[5.64,2.28],[14.244,0.278],[20.373,0.775],[28.307,-5.346],[5.427,-4.342],[-1.292,-6.391]],"v":[[-741.365,73.39],[-759.704,98.41],[-819.111,106.184],[-839.985,90.07],[-868.201,77.759],[-881.313,79.684],[-882.526,108.773],[-891.44,123.312],[-865.517,127.741],[-836.735,128.054],[-789.843,125.415],[-737.776,106.214],[-734.531,90.214]]}],"t":105.787},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.714,4.903],[8.23,-2.543],[13.194,10.37],[6.527,9.109],[18.646,0.627],[0,0],[2.214,-10.281],[4.081,-4.656],[-6.841,-2.858],[-7.504,-3.117],[-11.443,-1.572],[-19.533,3.64],[-2.86,3.044]],"o":[[1.096,-6.213],[-19.813,6.122],[-8.486,-5.848],[-7.23,-10.695],[-8.903,-0.161],[4.063,7.463],[-0.997,4.63],[5.778,1.904],[12.322,4.153],[13.502,3.922],[17.234,2.368],[4.627,-0.862],[2.735,-4.722]],"v":[[-726.647,118.69],[-749.567,126.069],[-818.914,122.514],[-837.853,98.827],[-866.219,78.385],[-880.665,81.183],[-879.963,110.289],[-887.901,125.383],[-865.229,131.302],[-839.747,140.236],[-805.928,147.784],[-746.601,142],[-734.639,134.498]]}],"t":113.771},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.769,4.239],[8.666,0.846],[14.131,12.116],[5.074,10.401],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.925],[-6.85,-4.579],[-7.312,-4.394],[-9.084,-4.803],[-12.107,-1.995],[-5.444,2.787]],"o":[[5.243,-4.887],[-19.907,-1.943],[-8.623,-7.214],[-6.414,-13.148],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[11.396,6.997],[8.824,6.698],[9.814,4.638],[6.18,1.018],[5.811,-3.952]],"v":[[-740.446,156.523],[-759.267,149.787],[-817.776,132.926],[-836.551,103.722],[-866.321,77.753],[-881.654,81.623],[-878.956,110.612],[-885.84,126.215],[-865.258,133.143],[-841.12,148.342],[-815.757,164.135],[-778.453,175.582],[-759.273,173.266]]}],"t":119.76},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.371,6.262],[10.762,5.642],[11.143,16.013],[4.433,10.719],[20.655,1.241],[0,0],[2.157,-10.293],[4.055,-4.679],[-6.031,-5.63],[-5.441,-5.566],[-6.222,-7.712],[-8.044,-5.614],[-6.163,-0.228]],"o":[[4.559,-5.315],[-16.407,-8.602],[-6.763,-9.483],[-6.049,-14.832],[-8.92,-0.536],[4.104,7.441],[-0.971,4.636],[5.788,1.872],[8.76,7.588],[7.578,9.189],[6.534,7.495],[5.51,3.846],[6.205,-0.418]],"v":[[-765.689,192.95],[-779.892,176.691],[-822.845,141.424],[-838.057,109.174],[-865.876,77.797],[-881.607,81.022],[-880.745,110.124],[-888.6,125.262],[-869.761,132.906],[-850.461,152.667],[-830.778,175.542],[-809.296,195.656],[-790.726,203.496]]}],"t":127.744},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.177,0.874],[3.236,9.669],[8.584,19.21],[4.255,10.821],[20.628,1.634],[0,0],[2.353,-10.251],[4.144,-4.601],[-5.396,-6.361],[-3.742,-6.358],[-3.49,-10.126],[-2.221,-11.707],[-6.659,-3.021]],"o":[[10.025,-0.603],[-6.094,-18.208],[-5.162,-11.322],[-6.219,-16.258],[-8.908,-0.706],[3.962,7.518],[-1.059,4.616],[5.751,1.982],[6.445,7.598],[6.56,11.263],[3.38,9.809],[1.264,6.666],[6.308,2.861]],"v":[[-798.85,229.521],[-798.472,195.644],[-826.093,145.096],[-838.971,110.675],[-865.868,75.201],[-881.848,78.453],[-881.54,107.566],[-889.681,122.552],[-872.245,129.96],[-857.212,153.08],[-842.703,181.748],[-836.753,208.315],[-819.222,225.432]]}],"t":135.729},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.868,-2.441],[-4.005,21.634],[7.836,22.24],[5.161,10.712],[20.653,1.27],[0,0],[2.172,-10.29],[4.062,-4.673],[-5.185,-6.779],[-3.6,-6.459],[2.714,-11.389],[-5.071,-13.076],[-5.992,-6.637]],"o":[[13.538,3.726],[4.66,-25.172],[-4.356,-12.363],[-7.303,-15.156],[-8.919,-0.549],[4.094,7.447],[-0.978,4.634],[5.785,1.88],[7.208,9.424],[6.617,11.874],[-4.769,20.016],[2.757,7.11],[4.432,4.909]],"v":[[-837.314,235.237],[-817.127,199.507],[-825.49,137.445],[-839.427,102.415],[-868.474,68.647],[-884.395,72.181],[-883.573,101.284],[-891.449,116.41],[-874.51,124.637],[-857.958,147.179],[-849.06,177.108],[-865.843,210.025],[-855.141,225.377]]}],"t":143.711},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.007,-1.863],[-2.601,21.847],[9.255,21.688],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-4.009,-6.213],[1.973,-11.54],[-5.904,-12.722],[-6.408,-6.237]],"o":[[13.75,2.844],[3.026,-25.421],[-5.145,-12.056],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.37,11.422],[-3.468,20.282],[3.21,6.918],[4.74,4.613]],"v":[[-828.755,225.788],[-810.916,188.829],[-823.267,127.436],[-839.434,93.379],[-870.6,61.556],[-886.26,66.11],[-883.562,95.099],[-890.446,110.702],[-873.01,117.818],[-855.038,139.246],[-844.228,168.538],[-858.851,202.469],[-847.181,217.099]]}],"t":149.699},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.148,-0.75],[-1.279,20.418],[11.919,19.23],[6.47,9.977],[20.649,-1.341],[0,0],[0.858,-10.482],[3.441,-5.148],[-5.998,-6.072],[-4.851,-5.541],[1.258,-11.64],[-5.471,-11.139],[-6.46,-3.706]],"o":[[13.04,1.133],[1.6,-25.55],[-7.238,-11.47],[-9.153,-14.116],[-8.917,0.579],[4.999,6.872],[-0.387,4.721],[5.976,1.137],[8.338,8.441],[9.578,10.808],[-2.211,20.457],[3.789,7.715],[5.563,2.905]],"v":[[-823.9,203.883],[-801.61,172.641],[-818.901,110.807],[-839.142,79.265],[-872.211,49.424],[-885.773,53.611],[-881.293,82.379],[-887.201,98.377],[-869.36,104.404],[-847.718,123.429],[-833.275,152.917],[-856.278,181.212],[-838.805,199.037]]}],"t":163.67},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.34,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-815.458,204.75],[-797.027,178.379],[-814.549,111.281],[-835.193,80.066],[-866.359,48.243],[-878.022,50.201],[-875.325,79.19],[-882.208,94.793],[-864.773,101.909],[-841.538,120.972],[-825.289,157.999],[-847.612,192.867],[-826.713,202.488]]}],"t":179.637},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.982,1.842],[8.045,13.19],[14.578,15.334],[6.099,10.208],[20.684,-0.582],[0,0],[1.242,-10.443],[3.628,-5.018],[-5.771,-6.288],[-5.195,-5.263],[-13.09,-18.226],[-9.985,0.738],[-3.634,0.431]],"o":[[7.755,-3.587],[-12.494,-16.161],[-9.762,-10.222],[-8.629,-14.442],[-8.932,0.252],[4.744,7.051],[-0.559,4.703],[5.93,1.355],[8.023,8.741],[10.915,11.058],[12.293,17.116],[7.352,-0.543],[4.357,-0.516]],"v":[[-774.528,183.727],[-775.304,157.11],[-817.527,109.892],[-838.945,79.203],[-870.897,48.169],[-882.508,50.418],[-878.015,77.859],[-884.728,96.672],[-868.531,102.887],[-846.157,123.17],[-812.052,152.082],[-807.804,190.814],[-796.918,189.387]]}],"t":187.621},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.702,4.133],[10.407,6.59],[10.554,15.49],[4.048,11.181],[20.687,-0.471],[0,0],[1.298,-10.437],[3.654,-4.998],[-5.737,-6.319],[-5.166,-5.29],[-9.991,-6.103],[-12.113,-4.034],[-2.533,1.955]],"o":[[5.088,-5.682],[-21.629,-13.695],[-7.771,-11.406],[-5.726,-15.814],[-8.934,0.203],[4.706,7.076],[-0.585,4.7],[5.923,1.387],[7.976,8.784],[10.855,11.116],[9.68,5.913],[6.298,2.097],[6.045,-4.665]],"v":[[-758.855,174.26],[-792.846,154.456],[-830.324,113.237],[-842.083,81.04],[-873.867,49.835],[-885.49,52.021],[-879.934,79.887],[-884.987,97.7],[-872.221,105.392],[-850.961,127.147],[-810.674,159.133],[-772.956,176.031],[-760.268,176.373]]}],"t":193.611},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.587,4.013],[10.063,-0.965],[13.706,11.424],[8.153,9.501],[19.343,-2.584],[0,0],[0.378,-10.51],[3.202,-5.299],[-6.525,-2.854],[-7.481,-3.037],[-15.509,-2.949],[-10.909,2.476],[-0.918,3.031]],"o":[[1.855,-12.681],[-16.504,1.583],[-8.83,-7.271],[-9.126,-11.663],[-8.822,1.263],[5.308,6.636],[-0.17,4.733],[6.022,0.863],[10.459,3.712],[15.931,5.564],[18.797,3.575],[5.755,-0.63],[0.671,-4.6]],"v":[[-741.291,109.373],[-771.464,112.412],[-822.025,97.857],[-841.506,73.834],[-875.607,54.134],[-887.241,57.837],[-881.451,86.37],[-886.622,102.622],[-866.661,106.844],[-841.649,116.51],[-796.357,130.355],[-749.91,127.742],[-742.01,121.519]]}],"t":201.594},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.325,6.397],[13.09,-8.505],[14.557,9.96],[10.348,9.382],[18.324,-0.925],[0,0],[1.503,-10.409],[3.752,-4.926],[-6.751,-0.643],[-9.163,-2.251],[-15.948,-1.35],[-10.19,6.855],[0.094,3.925]],"o":[[-1.64,-9.035],[-16.003,10.398],[-8.452,-4.795],[-10.231,-9.225],[-8.877,0.591],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[12.2,0.685],[19.849,3.153],[25.561,-0.052],[5.323,-2.24],[-0.496,-5.642]],"v":[[-738.061,81.376],[-759.561,95.167],[-820.315,97.331],[-842.78,77.807],[-875.199,63.145],[-887.462,66.057],[-884.764,95.047],[-891.648,110.65],[-869.267,114.298],[-842.433,116.713],[-794.99,121.184],[-739.45,108.312],[-735.086,97.041]]}],"t":209.578},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.739,6.144],[13.286,-11.184],[13.103,6.781],[9.435,6.949],[15.977,-0.353],[0,0],[2.208,-10.283],[4.078,-4.659],[-7.269,0.053],[-8.186,-0.755],[-13.425,1.48],[-13.62,13.35],[0.825,3.894]],"o":[[-4.869,-8.474],[-15.455,13.01],[-8.991,-3.256],[-9.544,-6.873],[-8.884,0.409],[4.067,7.461],[-0.994,4.631],[5.779,1.901],[14.231,-0.667],[20.38,-0.577],[27.891,-7.211],[5.128,-4.692],[-1.713,-6.291]],"v":[[-743.436,63.989],[-760.076,90.169],[-818.837,101.864],[-840.733,87.17],[-869.704,76.756],[-882.659,79.546],[-881.941,108.652],[-889.871,123.75],[-863.712,126.45],[-834.973,124.855],[-788.358,119.113],[-737.679,96.502],[-735.502,80.322]]}],"t":225.547},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.582,4.92],[8.159,-2.763],[13.468,10.012],[6.769,8.93],[18.656,0.125],[0,0],[1.937,-10.337],[3.954,-4.764],[-6.915,-2.673],[-7.585,-2.914],[-11.481,-1.264],[-19.428,4.164],[-2.778,3.12]],"o":[[0.928,-6.24],[-19.641,6.652],[-8.64,-5.618],[-7.515,-10.497],[-8.904,0.078],[4.263,7.352],[-0.872,4.656],[5.827,1.748],[12.429,3.821],[13.603,3.557],[17.291,1.904],[4.602,-0.986],[2.607,-4.793]],"v":[[-726.69,114.847],[-749.404,122.839],[-818.821,121.149],[-838.39,97.98],[-867.296,78.308],[-881.661,81.493],[-880.177,110.57],[-887.706,125.872],[-864.883,131.18],[-839.171,139.425],[-805.161,146.062],[-746.011,138.685],[-734.255,130.864]]}],"t":233.531},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.769,4.239],[8.666,0.846],[14.131,12.116],[5.074,10.401],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.925],[-6.85,-4.579],[-7.312,-4.394],[-9.084,-4.803],[-12.107,-1.995],[-5.444,2.787]],"o":[[5.243,-4.887],[-19.907,-1.943],[-8.623,-7.214],[-6.414,-13.148],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[11.396,6.997],[8.824,6.698],[9.814,4.638],[6.18,1.018],[5.811,-3.952]],"v":[[-740.446,156.523],[-759.267,149.787],[-817.776,132.926],[-836.551,103.722],[-866.321,77.753],[-881.654,81.623],[-878.956,110.612],[-885.84,126.215],[-865.258,133.143],[-841.12,148.342],[-815.757,164.135],[-778.453,175.582],[-759.273,173.266]]}],"t":239.518},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.329,6.298],[10.8,5.57],[11.25,15.938],[4.505,10.689],[20.663,1.103],[0,0],[2.088,-10.308],[4.024,-4.706],[-6.069,-5.589],[-5.478,-5.529],[-6.274,-7.67],[-8.081,-5.56],[-6.164,-0.187]],"o":[[4.523,-5.346],[-16.465,-8.491],[-6.827,-9.438],[-6.148,-14.791],[-8.923,-0.476],[4.154,7.413],[-0.94,4.642],[5.801,1.833],[8.811,7.53],[7.64,9.138],[6.584,7.451],[5.536,3.809],[6.202,-0.46]],"v":[[-764.652,192.121],[-778.964,175.957],[-822.152,140.979],[-837.58,108.832],[-865.609,77.643],[-881.318,80.973],[-880.261,110.068],[-888.014,125.258],[-869.124,132.776],[-849.692,152.407],[-829.856,175.15],[-808.24,195.119],[-789.618,202.834]]}],"t":247.502},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.165,0.968],[3.362,9.626],[8.834,19.096],[4.396,10.764],[20.647,1.364],[0,0],[2.218,-10.281],[4.083,-4.655],[-5.478,-6.29],[-3.825,-6.308],[-3.622,-10.079],[-2.374,-11.677],[-6.698,-2.933]],"o":[[10.016,-0.734],[-6.332,-18.126],[-5.309,-11.254],[-6.431,-16.175],[-8.917,-0.589],[4.06,7.465],[-0.999,4.63],[5.777,1.907],[6.544,7.513],[6.707,11.177],[3.508,9.764],[1.351,6.649],[6.345,2.778]],"v":[[-797.937,227.887],[-798.002,194.007],[-826.282,143.826],[-839.609,109.576],[-866.968,74.457],[-882.904,77.918],[-882.215,107.025],[-890.16,122.115],[-872.628,129.295],[-857.294,152.216],[-842.411,180.691],[-836.114,207.179],[-818.361,224.065]]}],"t":255.486},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.725,-2.91],[-5.153,21.389],[6.639,22.627],[4.583,10.972],[20.556,2.37],[0,0],[2.717,-10.16],[4.305,-4.45],[-4.816,-7.046],[-3.25,-6.642],[3.318,-11.228],[-4.366,-13.328],[-5.629,-6.947]],"o":[[13.32,4.443],[5.996,-24.888],[-3.69,-12.578],[-6.484,-15.524],[-8.877,-1.024],[3.691,7.655],[-1.224,4.576],[5.677,2.186],[6.695,9.795],[5.974,12.21],[-5.831,19.733],[2.374,7.247],[4.164,5.139]],"v":[[-846.085,238.919],[-824.021,204.317],[-829.061,141.897],[-841.109,106.174],[-868.313,70.905],[-884.4,73.584],[-885.132,102.689],[-893.804,117.374],[-877.327,126.492],[-862.002,149.885],[-854.714,180.247],[-873.228,212.221],[-863.36,228.123]]}],"t":263.469},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.007,-1.863],[-2.601,21.847],[9.255,21.688],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-4.009,-6.213],[1.973,-11.54],[-5.904,-12.722],[-6.408,-6.237]],"o":[[13.75,2.844],[3.026,-25.421],[-5.145,-12.056],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.37,11.422],[-3.468,20.282],[3.21,6.918],[4.74,4.613]],"v":[[-829.793,226.527],[-811.954,189.568],[-824.305,128.175],[-840.473,94.118],[-871.638,62.295],[-887.298,66.848],[-884.6,95.838],[-891.484,111.441],[-874.048,118.557],[-856.076,139.984],[-845.266,169.277],[-859.89,203.208],[-848.219,217.838]]}],"t":269.459},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.162,-0.553],[-0.839,20.441],[12.33,18.969],[6.683,9.835],[20.615,-1.785],[0,0],[0.633,-10.498],[3.329,-5.22],[-6.127,-5.942],[-4.969,-5.435],[1.007,-11.664],[-5.71,-11.019],[-6.539,-3.566]],"o":[[13.062,0.852],[1.05,-25.578],[-7.483,-11.311],[-9.455,-13.916],[-8.903,0.771],[5.146,6.763],[-0.285,4.728],[5.999,1.008],[8.518,8.26],[9.808,10.599],[-1.77,20.5],[3.955,7.632],[5.625,2.785]],"v":[[-821.378,203.101],[-799.765,171.387],[-818.383,109.94],[-839.297,78.84],[-873,49.717],[-886.469,54.195],[-881.371,82.86],[-886.934,98.981],[-868.967,104.623],[-846.921,123.178],[-831.848,152.349],[-854.236,181.132],[-836.384,198.577]]}],"t":283.43},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.34,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-816.313,204.508],[-797.882,178.136],[-815.404,111.038],[-836.048,79.823],[-867.214,48],[-878.878,49.958],[-876.18,78.948],[-883.063,94.551],[-865.628,101.667],[-842.393,120.729],[-826.144,157.757],[-848.468,192.624],[-827.568,202.246]]}],"t":299.396},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.968,1.873],[8.147,13.127],[14.697,15.22],[6.178,10.16],[20.679,-0.743],[0,0],[1.161,-10.453],[3.589,-5.046],[-5.82,-6.243],[-5.235,-5.222],[-13.231,-18.124],[-9.979,0.815],[-3.631,0.459]],"o":[[7.727,-3.647],[-12.619,-16.064],[-9.841,-10.146],[-8.741,-14.375],[-8.93,0.321],[4.798,7.014],[-0.523,4.708],[5.941,1.309],[8.09,8.679],[11,10.973],[12.426,17.02],[7.347,-0.6],[4.353,-0.55]],"v":[[-773.386,183.437],[-774.369,156.827],[-816.957,109.938],[-838.612,79.415],[-870.803,48.63],[-882.396,50.969],[-878.751,79.855],[-885.12,95.675],[-868.013,103.328],[-845.483,123.437],[-811.154,152.084],[-806.607,190.782],[-795.732,189.27]]}],"t":307.381},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.462,4.336],[10.763,5.991],[11.413,14.869],[4.674,10.934],[20.627,-1.64],[0,0],[0.706,-10.493],[3.366,-5.197],[-6.085,-5.984],[-5.457,-4.99],[-10.32,-5.528],[-12.322,-3.343],[-2.418,2.095]],"o":[[4.759,-5.961],[-22.369,-12.45],[-8.404,-10.948],[-6.611,-15.465],[-8.908,0.708],[5.098,6.799],[-0.318,4.726],[5.992,1.05],[8.459,8.319],[11.466,10.484],[9.999,5.356],[6.406,1.738],[5.771,-5]],"v":[[-751.701,167.622],[-786.757,149.772],[-826.507,110.739],[-840.067,79.258],[-873.565,49.9],[-885.045,52.74],[-880.149,81.44],[-885.824,97.522],[-868.779,105.275],[-846.324,125.793],[-804.293,155.45],[-765.68,170.188],[-752.992,169.811]]}],"t":313.371},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.859,3.964],[10.105,-0.279],[12.897,12.33],[7.488,10.033],[19.474,-1.262],[0,0],[1.092,-10.46],[3.555,-5.069],[-6.316,-3.291],[-7.257,-3.538],[-15.272,-3.997],[-11.052,1.728],[-1.122,2.961]],"o":[[2.713,-12.526],[-16.573,0.457],[-8.315,-7.855],[-8.311,-12.257],[-8.887,0.66],[4.844,6.982],[-0.492,4.711],[5.949,1.27],[10.182,4.415],[15.515,6.635],[18.511,4.845],[5.784,-0.237],[0.982,-4.544]],"v":[[-745.505,120.492],[-775.815,121.471],[-825.268,103.511],[-843.071,78.218],[-875.754,56.245],[-887.612,59.149],[-883.776,88.009],[-890.04,103.871],[-870.413,109.442],[-846.116,120.786],[-801.871,137.68],[-755.354,138.231],[-747.048,132.561]]}],"t":321.352},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.325,6.397],[13.09,-8.505],[14.557,9.96],[10.348,9.382],[18.324,-0.925],[0,0],[1.503,-10.409],[3.752,-4.926],[-6.751,-0.643],[-9.163,-2.251],[-15.948,-1.35],[-10.19,6.855],[0.094,3.925]],"o":[[-1.64,-9.035],[-16.003,10.398],[-8.452,-4.795],[-10.231,-9.225],[-8.877,0.591],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[12.2,0.685],[19.849,3.153],[25.561,-0.052],[5.323,-2.24],[-0.496,-5.642]],"v":[[-736.962,81.114],[-758.462,94.905],[-819.217,97.069],[-841.682,77.544],[-874.101,62.882],[-886.364,65.795],[-883.666,94.784],[-890.549,110.387],[-868.168,114.035],[-841.334,116.451],[-793.892,120.922],[-738.352,108.049],[-733.987,96.779]]}],"t":329.336},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.748,6.138],[13.269,-11.205],[13.114,6.76],[9.446,6.934],[15.977,-0.378],[0,0],[2.192,-10.286],[4.071,-4.665],[-7.269,0.064],[-8.187,-0.742],[-13.423,1.501],[-13.599,13.371],[0.831,3.893]],"o":[[-4.883,-8.466],[-15.435,13.034],[-8.996,-3.242],[-9.555,-6.858],[-8.884,0.423],[4.079,7.455],[-0.987,4.632],[5.782,1.892],[14.23,-0.689],[20.379,-0.609],[27.879,-7.255],[5.12,-4.7],[-1.723,-6.288]],"v":[[-744.346,63.286],[-760.944,89.492],[-819.686,101.279],[-841.606,86.62],[-870.592,76.252],[-883.544,79.062],[-882.78,108.167],[-890.686,123.278],[-864.523,125.936],[-835.786,124.296],[-789.181,118.481],[-738.537,95.79],[-736.385,79.606]]}],"t":345.305},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.606,4.918],[8.172,-2.723],[13.42,10.077],[6.726,8.963],[18.655,0.216],[0,0],[1.987,-10.328],[3.977,-4.745],[-6.902,-2.707],[-7.571,-2.951],[-11.475,-1.32],[-19.448,4.07],[-2.793,3.107]],"o":[[0.958,-6.236],[-19.674,6.557],[-8.612,-5.66],[-7.464,-10.533],[-8.904,0.035],[4.227,7.372],[-0.895,4.651],[5.818,1.776],[12.41,3.881],[13.585,3.623],[17.282,1.988],[4.607,-0.964],[2.63,-4.781]],"v":[[-726.403,115.111],[-749.155,122.993],[-818.563,120.967],[-838.019,97.703],[-866.829,77.891],[-881.21,81.006],[-879.867,110.09],[-887.47,125.355],[-864.673,130.774],[-839.001,139.144],[-805.024,145.945],[-745.838,138.855],[-734.045,131.092]]}],"t":353.289},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.769,4.239],[8.666,0.846],[14.131,12.116],[5.074,10.401],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.925],[-6.85,-4.579],[-7.312,-4.394],[-9.084,-4.803],[-12.107,-1.995],[-5.444,2.787]],"o":[[5.243,-4.887],[-19.907,-1.943],[-8.623,-7.214],[-6.414,-13.148],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[11.396,6.997],[8.824,6.698],[9.814,4.638],[6.18,1.018],[5.811,-3.952]],"v":[[-740.446,156.523],[-759.267,149.787],[-817.776,132.926],[-836.551,103.722],[-866.321,77.753],[-881.654,81.623],[-878.956,110.612],[-885.84,126.215],[-865.258,133.143],[-841.12,148.342],[-815.757,164.135],[-778.453,175.582],[-759.273,173.266]]}],"t":359.277},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.297,6.325],[10.828,5.515],[11.331,15.881],[4.56,10.666],[20.668,0.997],[0,0],[2.035,-10.318],[4,-4.726],[-6.097,-5.558],[-5.506,-5.501],[-6.313,-7.638],[-8.11,-5.519],[-6.165,-0.155]],"o":[[4.496,-5.369],[-16.508,-8.407],[-6.875,-9.403],[-6.224,-14.759],[-8.926,-0.431],[4.192,7.392],[-0.917,4.647],[5.81,1.804],[8.849,7.484],[7.686,9.099],[6.622,7.418],[5.555,3.78],[6.199,-0.492]],"v":[[-764.608,191.087],[-779.002,174.997],[-822.369,140.24],[-837.961,108.172],[-866.149,77.127],[-881.841,80.537],[-880.635,109.627],[-888.31,124.856],[-869.382,132.277],[-849.85,151.809],[-829.898,174.449],[-808.18,194.308],[-789.519,201.928]]}],"t":367.262},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.175,0.89],[3.257,9.662],[8.625,19.192],[4.278,10.811],[20.631,1.59],[0,0],[2.331,-10.256],[4.134,-4.61],[-5.409,-6.349],[-3.756,-6.35],[-3.511,-10.118],[-2.246,-11.702],[-6.666,-3.006]],"o":[[10.024,-0.624],[-6.133,-18.195],[-5.186,-11.311],[-6.254,-16.245],[-8.91,-0.687],[3.978,7.509],[-1.05,4.619],[5.756,1.97],[6.461,7.584],[6.584,11.249],[3.401,9.802],[1.279,6.663],[6.314,2.847]],"v":[[-799.067,228.689],[-798.762,194.81],[-826.49,144.322],[-839.442,109.928],[-866.414,74.512],[-882.388,77.798],[-882.017,106.911],[-890.127,121.913],[-872.675,129.284],[-857.592,152.372],[-843.023,181.009],[-837.015,207.563],[-819.448,224.643]]}],"t":375.246},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.778,-2.744],[-4.748,21.483],[7.066,22.497],[4.789,10.884],[20.597,1.981],[0,0],[2.525,-10.21],[4.22,-4.53],[-4.949,-6.954],[-3.375,-6.579],[3.104,-11.288],[-4.617,-13.243],[-5.76,-6.84]],"o":[[13.402,4.19],[5.524,-24.997],[-3.928,-12.506],[-6.776,-15.399],[-8.895,-0.855],[3.835,7.583],[-1.137,4.598],[5.717,2.078],[6.88,9.667],[6.204,12.095],[-5.456,19.84],[2.511,7.201],[4.26,5.059]],"v":[[-842.783,237.577],[-821.377,202.564],[-827.597,140.251],[-840.319,104.761],[-868.186,70.013],[-884.219,72.996],[-884.4,102.111],[-892.793,116.957],[-876.146,125.761],[-860.381,148.861],[-852.52,179.079],[-870.426,211.397],[-860.259,227.11]]}],"t":383.229},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.909,-2.287],[-3.63,21.7],[8.22,22.101],[5.346,10.621],[20.672,0.912],[0,0],[1.993,-10.326],[3.98,-4.743],[-5.302,-6.688],[-3.711,-6.396],[2.516,-11.434],[-5.297,-12.987],[-6.106,-6.532]],"o":[[13.601,3.491],[4.224,-25.249],[-4.57,-12.286],[-7.564,-15.027],[-8.927,-0.394],[4.222,7.375],[-0.898,4.651],[5.817,1.78],[7.371,9.298],[6.822,11.757],[-4.422,20.095],[2.88,7.062],[4.516,4.832]],"v":[[-836.408,229.436],[-816.843,193.361],[-826.28,131.453],[-840.821,96.67],[-870.448,63.411],[-886.305,67.219],[-884.98,96.304],[-892.593,111.564],[-875.513,119.496],[-858.574,141.749],[-849.159,171.519],[-865.369,204.721],[-854.403,219.886]]}],"t":389.217},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.355],[-0.398,20.455],[12.736,18.699],[6.893,9.689],[20.572,-2.229],[0,0],[0.406,-10.509],[3.216,-5.291],[-6.254,-5.808],[-5.085,-5.327],[0.755,-11.683],[-5.946,-10.893],[-6.614,-3.424]],"o":[[13.077,0.57],[0.498,-25.595],[-7.726,-11.147],[-9.753,-13.708],[-8.884,0.963],[5.291,6.65],[-0.183,4.733],[6.02,0.878],[8.694,8.074],[10.035,10.385],[-1.327,20.533],[4.118,7.544],[5.683,2.663]],"v":[[-819.687,201.346],[-798.764,169.172],[-818.703,108.141],[-840.284,77.5],[-874.607,49.112],[-887.977,53.879],[-882.261,82.427],[-887.475,98.665],[-869.391,103.918],[-846.949,121.993],[-831.25,150.831],[-853.012,180.091],[-834.788,197.146]]}],"t":403.189},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.34,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-818.391,204.709],[-799.96,178.337],[-817.482,111.239],[-838.126,80.024],[-869.292,48.201],[-880.956,50.159],[-878.258,79.149],[-885.142,94.752],[-867.706,101.868],[-844.471,120.93],[-828.222,157.958],[-850.546,192.825],[-829.646,202.446]]}],"t":419.156},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.968,1.873],[8.147,13.127],[14.697,15.22],[6.178,10.16],[20.679,-0.743],[0,0],[1.161,-10.453],[3.589,-5.046],[-5.82,-6.243],[-5.235,-5.222],[-13.231,-18.124],[-9.979,0.815],[-3.631,0.459]],"o":[[7.727,-3.647],[-12.619,-16.064],[-9.841,-10.146],[-8.741,-14.375],[-8.93,0.321],[4.798,7.014],[-0.523,4.708],[5.941,1.309],[8.09,8.679],[11,10.973],[12.426,17.02],[7.347,-0.6],[4.353,-0.55]],"v":[[-773.386,183.437],[-774.369,156.827],[-816.957,109.938],[-838.612,79.415],[-870.803,48.63],[-882.396,50.969],[-878.751,79.855],[-885.12,95.675],[-868.013,103.328],[-845.483,123.437],[-811.154,152.084],[-806.607,190.782],[-795.732,189.27]]}],"t":427.141},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.462,4.336],[10.763,5.991],[11.413,14.869],[4.674,10.934],[20.627,-1.64],[0,0],[0.706,-10.493],[3.366,-5.197],[-6.085,-5.984],[-5.457,-4.99],[-10.32,-5.528],[-12.322,-3.343],[-2.418,2.095]],"o":[[4.759,-5.961],[-22.369,-12.45],[-8.404,-10.948],[-6.611,-15.465],[-8.908,0.708],[5.098,6.799],[-0.318,4.726],[5.992,1.05],[8.459,8.319],[11.466,10.484],[9.999,5.356],[6.406,1.738],[5.771,-5]],"v":[[-751.701,167.622],[-786.757,149.772],[-826.507,110.739],[-840.067,79.258],[-873.565,49.9],[-885.045,52.74],[-880.149,81.44],[-885.824,97.522],[-868.779,105.275],[-846.324,125.793],[-804.293,155.45],[-765.68,170.188],[-752.992,169.811]]}],"t":433.129},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.859,3.964],[10.105,-0.279],[12.897,12.33],[7.488,10.033],[19.474,-1.262],[0,0],[1.092,-10.46],[3.555,-5.069],[-6.316,-3.291],[-7.257,-3.538],[-15.272,-3.997],[-11.052,1.728],[-1.122,2.961]],"o":[[2.713,-12.526],[-16.573,0.457],[-8.315,-7.855],[-8.311,-12.257],[-8.887,0.66],[4.844,6.982],[-0.492,4.711],[5.949,1.27],[10.182,4.415],[15.515,6.635],[18.511,4.845],[5.784,-0.237],[0.982,-4.544]],"v":[[-745.505,120.492],[-775.815,121.471],[-825.268,103.511],[-843.071,78.218],[-875.754,56.245],[-887.612,59.149],[-883.776,88.009],[-890.04,103.871],[-870.413,109.442],[-846.116,120.786],[-801.871,137.68],[-755.354,138.231],[-747.048,132.561]]}],"t":441.111},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.325,6.397],[13.09,-8.505],[14.557,9.96],[10.348,9.382],[18.324,-0.925],[0,0],[1.503,-10.409],[3.752,-4.926],[-6.751,-0.643],[-9.163,-2.251],[-15.948,-1.35],[-10.19,6.855],[0.094,3.925]],"o":[[-1.64,-9.035],[-16.003,10.398],[-8.452,-4.795],[-10.231,-9.225],[-8.877,0.591],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[12.2,0.685],[19.849,3.153],[25.561,-0.052],[5.323,-2.24],[-0.496,-5.642]],"v":[[-736.962,81.114],[-758.462,94.905],[-819.217,97.069],[-841.682,77.544],[-874.101,62.882],[-886.364,65.795],[-883.666,94.784],[-890.549,110.387],[-868.168,114.035],[-841.334,116.451],[-793.892,120.922],[-738.352,108.049],[-733.987,96.779]]}],"t":449.096},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.748,6.138],[13.269,-11.205],[13.114,6.76],[9.446,6.934],[15.977,-0.378],[0,0],[2.192,-10.286],[4.071,-4.665],[-7.269,0.064],[-8.187,-0.742],[-13.423,1.501],[-13.599,13.371],[0.831,3.893]],"o":[[-4.883,-8.466],[-15.435,13.034],[-8.996,-3.242],[-9.555,-6.858],[-8.884,0.423],[4.079,7.455],[-0.987,4.632],[5.782,1.892],[14.23,-0.689],[20.379,-0.609],[27.879,-7.255],[5.12,-4.7],[-1.723,-6.288]],"v":[[-744.346,63.286],[-760.944,89.492],[-819.686,101.279],[-841.606,86.62],[-870.592,76.252],[-883.544,79.062],[-882.78,108.167],[-890.686,123.278],[-864.523,125.936],[-835.786,124.296],[-789.181,118.481],[-738.537,95.79],[-736.385,79.606]]}],"t":465.064},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.606,4.918],[8.172,-2.723],[13.42,10.077],[6.726,8.963],[18.655,0.216],[0,0],[1.987,-10.328],[3.977,-4.745],[-6.902,-2.707],[-7.571,-2.951],[-11.475,-1.32],[-19.448,4.07],[-2.793,3.107]],"o":[[0.958,-6.236],[-19.674,6.557],[-8.612,-5.66],[-7.464,-10.533],[-8.904,0.035],[4.227,7.372],[-0.895,4.651],[5.818,1.776],[12.41,3.881],[13.585,3.623],[17.282,1.988],[4.607,-0.964],[2.63,-4.781]],"v":[[-726.403,115.111],[-749.155,122.993],[-818.563,120.967],[-838.019,97.703],[-866.829,77.891],[-881.21,81.006],[-879.867,110.09],[-887.47,125.355],[-864.673,130.774],[-839.001,139.144],[-805.024,145.945],[-745.838,138.855],[-734.045,131.092]]}],"t":473.049},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.367,9.005],[15.747,-6.232],[15.739,10.707],[3.167,10.649],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.925],[-5.612,-6.43],[-4.918,-5.521],[-7.289,-4.03],[-14.011,-0.63],[-10.368,7.724]],"o":[[12.313,-15.05],[-27.355,10.826],[-10.374,-7.058],[-5.517,-18.55],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.719,8.665],[18.88,10.438],[12.748,0.574],[10.569,-7.874]],"v":[[-737.04,157.551],[-756.875,148.321],[-825.1,144.184],[-840.255,113.855],[-865.994,77.069],[-881.654,81.623],[-878.956,110.612],[-885.84,126.215],[-868.405,133.331],[-852.462,151.82],[-829.897,172.994],[-786.622,188.216],[-762.477,180.144]]}],"t":479},{"s":[{"c":true,"i":[[-7.367,9.005],[15.747,-6.232],[15.739,10.707],[3.167,10.649],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.925],[-5.612,-6.43],[-4.918,-5.521],[-7.289,-4.03],[-14.011,-0.63],[-10.368,7.724]],"o":[[12.313,-15.05],[-27.355,10.826],[-10.374,-7.058],[-5.517,-18.55],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.719,8.665],[18.88,10.438],[12.748,0.574],[10.569,-7.874]],"v":[[-737.04,157.551],[-756.875,148.321],[-825.1,144.184],[-840.255,113.855],[-865.994,77.069],[-881.654,81.623],[-878.956,110.612],[-885.84,126.215],[-868.405,133.331],[-852.462,151.82],[-829.897,172.994],[-786.622,188.216],[-762.477,180.144]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0.075,0.089]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Front fin bottom","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":29,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1073.875,105.473,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-1073.875,105.473,0]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[7],"t":0},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-8],"t":59.881},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[6],"t":119.76},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-5],"t":179.637},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[8],"t":239.518},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-5],"t":299.396},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[7],"t":359.277},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-5],"t":419.156},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[7],"t":479},{"s":[10],"t":479.037109375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Front leg","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-40.292,16.342],[-33.029,8.646],[-8.312,1.622],[-2.372,0.66],[-2.569,11.479],[1.417,0.164],[18.897,2.431],[22.655,3.122],[22.373,3.338]],"o":[[35.009,-14.199],[23.972,-6.275],[4.018,-0.784],[1.409,-0.177],[2.097,-9.368],[-17.855,-2.069],[-15.177,-1.952],[-18.658,-2.572],[0,0]],"v":[[-1033.04,168.725],[-946.09,138.338],[-895.138,127.431],[-886.426,125.986],[-878.306,103.938],[-879.872,83.09],[-927.192,75.117],[-977.525,66.828],[-1040.1,58.04]]}],"t":0},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-42.046,11.075],[-36.938,18.988],[-7.388,4.141],[-2.046,1.369],[4.713,10.778],[1.331,-0.516],[18.938,-4.523],[23.72,0.894],[23.05,5.482]],"o":[[44.458,-11.71],[19.89,-10.225],[3.571,-2.002],[1.283,-0.609],[-3.846,-8.796],[-15.787,6.119],[-14.884,3.555],[-18.821,-0.71],[0,0]],"v":[[-1045.039,171.198],[-943.389,129.475],[-889.562,101.231],[-881.344,96.203],[-882.23,77.848],[-902.574,55.765],[-932.553,65.992],[-979.945,68.652],[-1040.1,58.04]]}],"t":59.881},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-41.409,13.26],[-39.393,12.294],[-8.312,1.622],[-2.372,0.66],[-2.569,11.479],[1.417,0.164],[18.897,2.431],[22.655,3.122],[22.373,3.338]],"o":[[39.301,-12.585],[16.596,-5.18],[4.018,-0.784],[1.409,-0.177],[2.097,-9.368],[-17.855,-2.069],[-15.177,-1.952],[-18.658,-2.572],[0,0]],"v":[[-1036.044,165.594],[-944.981,137.162],[-902.073,126.364],[-893.362,124.92],[-878.306,103.938],[-876.6,83.465],[-927.249,77.996],[-979.002,69.856],[-1040.1,58.04]]}],"t":119.76},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-41.859,11.761],[-36.077,20.355],[-7.712,7.738],[-1.335,2.069],[5.7,10.29],[1.038,-0.979],[17.948,-2.309],[21.737,2.632],[22.373,3.338]],"o":[[39.728,-11.163],[24.674,-13.921],[2.89,-2.9],[0.936,-1.068],[-4.651,-8.398],[-14.122,13.315],[-11.181,1.438],[-18.698,-2.264],[0,0]],"v":[[-1039.425,170.524],[-935.513,131.047],[-892.197,101.675],[-886.254,94.486],[-888.925,68.801],[-901.242,52.358],[-939.742,72.322],[-979.545,71.96],[-1040.1,58.04]]}],"t":179.637},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-41.983,15.695],[-52.345,16.392],[-8.312,1.622],[-2.372,0.66],[-2.569,11.479],[1.417,0.164],[18.897,2.431],[22.655,3.122],[22.373,3.338]],"o":[[32.234,-12.05],[8.125,-2.544],[4.018,-0.784],[1.409,-0.177],[2.097,-9.368],[-17.855,-2.069],[-15.177,-1.952],[-18.658,-2.572],[0,0]],"v":[[-1034.133,166.675],[-944.664,135.903],[-902.073,126.364],[-893.362,124.92],[-878.306,103.938],[-876.6,83.465],[-927.249,77.996],[-979.002,69.856],[-1040.1,58.04]]}],"t":239.518},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-41.988,11.291],[-37.164,18.296],[-7.712,7.738],[-1.335,2.069],[5.7,10.29],[1.038,-0.979],[17.948,-2.309],[21.737,2.632],[22.373,3.338]],"o":[[40.737,-10.955],[7.639,-3.761],[2.89,-2.9],[0.936,-1.068],[-4.651,-8.398],[-14.122,13.315],[-11.181,1.438],[-18.698,-2.264],[0,0]],"v":[[-1051.355,171.85],[-935.771,128.803],[-892.197,101.675],[-886.254,94.486],[-888.925,68.801],[-901.242,52.358],[-939.742,72.322],[-979.545,71.96],[-1040.1,58.04]]}],"t":299.396},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-41.38,13.349],[-37.52,11.878],[-8.312,1.622],[-2.372,0.66],[-2.569,11.479],[1.417,0.164],[18.897,2.431],[22.655,3.122],[22.373,3.338]],"o":[[40.052,-12.921],[8.117,-2.57],[4.018,-0.784],[1.409,-0.177],[2.097,-9.368],[-17.855,-2.069],[-15.177,-1.952],[-18.658,-2.572],[0,0]],"v":[[-1033.118,167.508],[-945.771,138.473],[-902.073,126.364],[-893.362,124.92],[-878.306,103.938],[-876.6,83.465],[-927.249,77.996],[-979.002,69.856],[-1040.1,58.04]]}],"t":359.277},{"i":{"x":0.833,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-41.728,12.219],[-31.928,16.808],[-7.712,7.738],[-1.335,2.069],[5.7,10.29],[1.038,-0.979],[17.948,-2.309],[21.737,2.632],[22.373,3.338]],"o":[[39.604,-11.597],[25.699,-13.529],[2.89,-2.9],[0.936,-1.068],[-4.651,-8.398],[-14.122,13.315],[-11.181,1.438],[-18.698,-2.264],[0,0]],"v":[[-1043.212,172.33],[-939.397,132.858],[-892.197,101.675],[-886.254,94.486],[-888.925,68.801],[-901.242,52.358],[-939.742,72.322],[-979.545,71.96],[-1040.1,58.04]]}],"t":419.156},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[-40.292,16.342],[-33.029,8.646],[-8.312,1.622],[-2.372,0.66],[-2.569,11.479],[1.417,0.164],[18.897,2.431],[22.655,3.122],[22.373,3.338]],"o":[[35.009,-14.199],[23.972,-6.275],[4.018,-0.784],[1.409,-0.177],[2.097,-9.368],[-17.855,-2.069],[-15.177,-1.952],[-18.658,-2.572],[0,0]],"v":[[-1033.04,168.725],[-946.09,138.338],[-895.138,127.431],[-886.426,125.986],[-878.306,103.938],[-879.872,83.09],[-927.192,75.117],[-977.525,66.828],[-1040.1,58.04]]}],"t":479},{"s":[{"c":false,"i":[[-40.173,16.633],[-41.972,11.417],[-8.312,1.622],[-2.372,0.66],[-2.569,11.479],[1.417,0.164],[18.897,2.431],[22.655,3.122],[22.373,3.338]],"o":[[34.811,-14.413],[26.053,-7.087],[4.018,-0.784],[1.409,-0.177],[2.097,-9.368],[-17.855,-2.069],[-15.177,-1.952],[-18.658,-2.572],[0,0]],"v":[[-1031.966,168.567],[-944.088,137.742],[-895.138,127.431],[-886.426,125.986],[-878.306,103.938],[-879.872,83.09],[-927.192,75.117],[-977.525,66.828],[-1040.1,58.04]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Body stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.299,-2.545],[0.194,3.732]],"o":[[0,0],[6.299,2.545],[0,0]],"v":[[-929.042,74.788],[-926.073,95.111],[-915.709,76.822]]}],"t":0},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.786,0.328],[1.74,3.307]],"o":[[0,0],[6.786,-0.328],[0,0]],"v":[[-935.283,67.157],[-924.073,84.367],[-922.325,63.419]]}],"t":59.881},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.299,-2.545],[0.194,3.732]],"o":[[0,0],[6.299,2.545],[0,0]],"v":[[-929.099,77.667],[-926.13,97.99],[-915.766,79.701]]}],"t":119.76},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.793,0.13],[1.643,3.357]],"o":[[0,0],[6.793,-0.13],[0,0]],"v":[[-941.728,74.524],[-931.026,92.053],[-928.667,71.165]]}],"t":179.637},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.299,-2.545],[0.194,3.732]],"o":[[0,0],[6.299,2.545],[0,0]],"v":[[-929.099,77.667],[-926.13,97.99],[-915.766,79.701]]}],"t":239.518},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.793,0.13],[1.643,3.357]],"o":[[0,0],[6.793,-0.13],[0,0]],"v":[[-941.728,74.524],[-931.026,92.053],[-928.667,71.165]]}],"t":299.396},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.299,-2.545],[0.194,3.732]],"o":[[0,0],[6.299,2.545],[0,0]],"v":[[-929.099,77.667],[-926.13,97.99],[-915.766,79.701]]}],"t":359.277},{"i":{"x":0.833,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.793,0.13],[1.643,3.357]],"o":[[0,0],[6.793,-0.13],[0,0]],"v":[[-941.728,74.524],[-931.026,92.053],[-928.667,71.165]]}],"t":419.156},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-6.299,-2.545],[0.194,3.732]],"o":[[0,0],[6.299,2.545],[0,0]],"v":[[-929.042,74.788],[-926.073,95.111],[-915.709,76.822]]}],"t":479},{"s":[{"c":false,"i":[[0,0],[-6.299,-2.545],[0.194,3.732]],"o":[[0,0],[6.299,2.545],[0,0]],"v":[[-929.042,74.788],[-926.073,95.111],[-915.709,76.822]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[0.003,-4.207],[-8.026,11.778],[0,0]],"o":[[0,0],[-0.003,4.207],[8.026,-11.778],[0,0]],"v":[[-966.188,71.086],[-967.557,93.113],[-954.721,93.113],[-947.099,73.455]]}],"t":0},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-0.336,-4.193],[-7.048,12.388],[0,0]],"o":[[0,0],[0.336,4.193],[7.048,-12.388],[0,0]],"v":[[-967.396,70.28],[-966.982,92.347],[-954.188,91.31],[-948.178,71.101]]}],"t":59.881},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[0.003,-4.207],[-8.026,11.778],[0,0]],"o":[[0,0],[-0.003,4.207],[8.026,-11.778],[0,0]],"v":[[-966.711,72.936],[-968.081,94.964],[-955.245,94.964],[-947.623,75.306]]}],"t":119.76},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-0.502,-4.176],[-6.552,12.658],[0,0]],"o":[[0,0],[0.502,4.176],[6.552,-12.657],[0,0]],"v":[[-968.677,74.147],[-967.389,96.18],[-954.647,94.638],[-952.185,73.573]]}],"t":179.637},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[0.003,-4.207],[-8.026,11.778],[0,0]],"o":[[0,0],[-0.003,4.207],[8.026,-11.778],[0,0]],"v":[[-966.711,72.936],[-968.081,94.964],[-955.245,94.964],[-947.623,75.306]]}],"t":239.518},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-0.502,-4.176],[-6.552,12.658],[0,0]],"o":[[0,0],[0.502,4.176],[6.552,-12.657],[0,0]],"v":[[-968.677,74.147],[-967.389,96.18],[-954.647,94.638],[-952.185,73.573]]}],"t":299.396},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[0.003,-4.207],[-8.026,11.778],[0,0]],"o":[[0,0],[-0.003,4.207],[8.026,-11.778],[0,0]],"v":[[-966.711,72.936],[-968.081,94.964],[-955.245,94.964],[-947.623,75.306]]}],"t":359.277},{"i":{"x":0.833,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-0.502,-4.176],[-6.552,12.658],[0,0]],"o":[[0,0],[0.502,4.176],[6.552,-12.657],[0,0]],"v":[[-968.677,74.147],[-967.389,96.18],[-954.647,94.638],[-952.185,73.573]]}],"t":419.156},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[0.003,-4.207],[-8.026,11.778],[0,0]],"o":[[0,0],[-0.003,4.207],[8.026,-11.778],[0,0]],"v":[[-966.188,71.086],[-967.557,93.113],[-954.721,93.113],[-947.099,73.455]]}],"t":479},{"s":[{"c":false,"i":[[0,0],[0.003,-4.207],[-8.026,11.778],[0,0]],"o":[[0,0],[-0.003,4.207],[8.026,-11.778],[0,0]],"v":[[-966.188,71.086],[-967.557,93.113],[-954.721,93.113],[-947.099,73.455]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.964705884457,0.549019634724,0.129411771894,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Front leg stripes","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.399,0.439],[18.781,3.915],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-1.814,-7.068],[-3.865,-14.502],[-5.415,2.069],[-39.37,12.366],[-8.264,1.851],[-2.908,0.377],[-2.559,11.263]],"o":[[-17.12,-5.368],[-21.396,-4.46],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[1.842,7.174],[2.792,10.475],[38.55,-14.727],[8.123,-2.552],[3.572,-0.8],[1.377,-0.173],[2.195,-9.657]],"v":[[-880.05,83.285],[-927.907,73.168],[-993.058,64.6],[-1042.754,57.733],[-1043.953,75.951],[-1040.275,107.689],[-1035.983,136.56],[-1021.07,163.518],[-946.203,138.095],[-895.942,127.358],[-886.337,126.091],[-879.105,103.294]]}],"t":0},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.333,-0.61],[17.812,-3.607],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.648,1.307],[-37.863,16.776],[-7.27,4.344],[-2.649,1.258],[4.593,10.597]],"o":[[-14.717,6.735],[-21.422,4.338],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[1.842,7.174],[0.62,9.748],[42.676,-9.879],[7.785,-3.449],[3.142,-1.877],[1.254,-0.596],[-3.939,-9.087]],"v":[[-902.683,56.005],[-936.626,66.148],[-993.809,67.38],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1037.089,168.24],[-943.484,129.224],[-889.953,100.482],[-881.226,96.275],[-883.255,77.8]]}],"t":59.881},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.453,0.196],[21.572,2.678],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.521,1.768],[-39.72,11.191],[-8.264,1.851],[-2.908,0.377],[-2.559,11.263]],"o":[[-20.041,-2.707],[-21.69,-2.693],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[1.842,7.174],[0.62,9.748],[39.301,-12.585],[8.195,-2.309],[3.572,-0.8],[1.377,-0.173],[2.195,-9.657]],"v":[[-876.779,83.659],[-929.197,77.973],[-994.573,67.273],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1036.16,164.725],[-944.746,137.992],[-902.877,126.291],[-893.272,125.025],[-879.105,103.294]]}],"t":119.76},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.217,-0.818],[23.139,-2.196],[21.402,4.457],[18.263,4.572],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.581,1.568],[-37.407,17.425],[-4.951,6.871],[-1.932,2.205],[5.564,10.122]],"o":[[-16.784,11.281],[-21.758,2.065],[-4.694,-0.978],[-4.864,-1.218],[0.511,20.071],[1.842,7.174],[0.62,9.748],[39.728,-11.163],[13.214,-6.155],[2.14,-2.97],[0.915,-1.044],[-4.77,-8.679]],"v":[[-901.247,52.622],[-942.873,71.873],[-995.053,68.665],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1039.51,169.651],[-934.896,130.872],[-892.46,101.829],[-886.117,94.506],[-889.95,68.849]]}],"t":179.637},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.453,0.196],[21.572,2.678],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-0.341,-7.289],[-3.264,-16.174],[-5.481,1.889],[-35.943,9.646],[-8.264,1.851],[-2.908,0.377],[-2.559,11.263]],"o":[[-20.041,-2.707],[-21.69,-2.693],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[0.386,8.254],[1.932,9.574],[38.292,-13.201],[8.223,-2.207],[3.572,-0.8],[1.377,-0.173],[2.195,-9.657]],"v":[[-876.779,83.659],[-929.197,77.973],[-994.573,67.273],[-1042.754,57.733],[-1043.953,75.951],[-1043.333,103.193],[-1040.703,133.856],[-1026.683,163.151],[-944.754,135.651],[-902.877,126.291],[-893.272,125.025],[-879.105,103.294]]}],"t":239.518},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.217,-0.818],[23.139,-2.196],[21.402,4.457],[18.263,4.572],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.583,1.564],[-37.407,17.425],[-4.951,6.871],[-1.932,2.205],[5.564,10.122]],"o":[[-16.784,11.281],[-21.758,2.065],[-4.694,-0.978],[-4.864,-1.218],[0.511,20.071],[1.842,7.174],[0.62,9.748],[39.531,-11.072],[13.214,-6.155],[2.14,-2.97],[0.915,-1.044],[-4.77,-8.679]],"v":[[-901.247,52.622],[-942.873,71.873],[-995.053,68.665],[-1042.754,57.733],[-1043.953,75.951],[-1041.706,106.106],[-1040.703,133.856],[-1041.259,168.215],[-935.952,128.606],[-892.46,101.829],[-886.117,94.506],[-889.95,68.849]]}],"t":299.396},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.453,0.196],[21.572,2.678],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.535,1.723],[-39.481,14.128],[-8.264,1.851],[-2.908,0.377],[-2.559,11.263]],"o":[[-20.041,-2.707],[-21.69,-2.693],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[1.842,7.174],[0.62,9.748],[39.401,-12.267],[8.017,-2.869],[3.572,-0.8],[1.377,-0.173],[2.195,-9.657]],"v":[[-876.779,83.659],[-929.197,77.973],[-994.573,67.273],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1033.157,166.137],[-945.876,138.227],[-902.877,126.291],[-893.272,125.025],[-879.105,103.294]]}],"t":359.277},{"i":{"x":0.833,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.217,-0.818],[23.139,-2.196],[21.402,4.457],[18.263,4.572],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.564,1.629],[-37.407,17.425],[-4.951,6.871],[-1.932,2.205],[5.564,10.122]],"o":[[-16.784,11.281],[-21.758,2.065],[-4.694,-0.978],[-4.864,-1.218],[0.511,20.071],[1.842,7.174],[0.62,9.748],[39.604,-11.597],[13.214,-6.155],[2.14,-2.97],[0.915,-1.044],[-4.77,-8.679]],"v":[[-901.247,52.622],[-942.873,71.873],[-995.053,68.665],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1043.307,171.458],[-939.578,132.661],[-892.46,101.829],[-886.117,94.506],[-889.95,68.849]]}],"t":419.156},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[1.399,0.439],[18.781,3.915],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-0.02,-7.297],[-3.003,-14.567],[-5.415,2.069],[-39.37,12.366],[-8.264,1.851],[-2.908,0.377],[-2.559,11.263]],"o":[[-17.12,-5.368],[-21.396,-4.46],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[0.022,8.144],[1.972,9.566],[38.55,-14.727],[8.123,-2.552],[3.572,-0.8],[1.377,-0.173],[2.195,-9.657]],"v":[[-880.05,83.285],[-927.907,73.168],[-993.058,64.6],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1022.487,163.203],[-946.203,138.095],[-895.942,127.358],[-886.337,126.091],[-879.105,103.294]]}],"t":479},{"s":[{"c":true,"i":[[1.399,0.439],[18.781,3.915],[21.402,4.457],[16.586,2.133],[-0.306,-12.008],[-1.814,-7.068],[-0.953,-14.978],[-5.433,2.023],[-28.721,6.105],[-8.264,1.851],[-2.908,0.377],[-2.559,11.263]],"o":[[-17.12,-5.368],[-21.396,-4.46],[-4.694,-0.978],[-4.973,-0.64],[0.511,20.071],[1.842,7.174],[0.62,9.748],[38.674,-14.397],[8.328,-1.77],[3.572,-0.8],[1.377,-0.173],[2.195,-9.657]],"v":[[-880.05,83.285],[-927.907,73.168],[-993.058,64.6],[-1042.754,57.733],[-1043.953,75.951],[-1043.412,110.054],[-1040.703,133.856],[-1020.11,163.685],[-944.189,137.494],[-895.942,127.358],[-886.337,126.091],[-879.105,103.294]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Body fill","np":2,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":30,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1107.804,-2.384,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[699.196,282.616,0]},"r":{"a":0,"ix":10,"k":30},"s":{"a":0,"ix":6,"k":[55,55,100]}},"nm":"Body","op":480,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-9.643,2.5],[-10.714,-5]],"o":[[9.643,-2.5],[10.714,5]],"v":[[-1255.941,20.307],[-1217.727,21.736]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392156863,0.372549019608,0.847058823529,1]},"hd":false,"lc":1,"lj":1,"ml":4,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Back stroke","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[2.744,6.946],[0.714,1.964]],"o":[[0,0],[-2.797,-7.082],[-0.714,-1.964]],"v":[[-1314.101,113.308],[-1324.413,90.448],[-1330.214,68.56]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392156863,0.372549019608,0.847058823529,1]},"hd":false,"lc":1,"lj":1,"ml":4,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Neck stroke","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[10.373,3.468],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-1.613,5.208],[-4.97,-4.077],[-15.274,-6.539],[-28.536,-3.208],[-42.389,9.68]],"o":[[-13.173,-4.404],[-7.855,2.563],[8.522,16.414],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[42.6,4.79],[39.337,-8.983]],"v":[[-1246.03,82.507],[-1295.763,79.593],[-1313.439,98.917],[-1295.559,120.796],[-1298.078,105.635],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1037.76,149.779]]}],"t":0},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[9.772,2.502],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[0.352,3.422],[-10.506,-8.72],[-15.274,-6.539],[-28.536,-3.208],[-49.164,18.593]],"o":[[-13.653,-3.496],[-7.855,2.563],[8.522,13.557],[-1.453,-5.936],[3.387,9.315],[19.123,10.673],[20.539,8.793],[42.6,4.79],[38.599,-14.598]],"v":[[-1235.049,76.656],[-1295.763,74.593],[-1315.892,96.215],[-1301.631,111.689],[-1303.079,102.421],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1034.906,144.76]]}],"t":59.881},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-13.75,-1.964],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-1.613,5.208],[-4.97,-4.077],[-15.274,-6.539],[-28.655,-1.864],[-47.436,11.182]],"o":[[13.75,1.964],[-7.855,2.563],[8.522,16.414],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[44.048,2.866],[40.166,-9.468]],"v":[[-1251.563,84.365],[-1291.477,84.593],[-1311.249,101.929],[-1295.559,120.796],[-1298.078,105.635],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1037.489,145.274]]}],"t":120},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-17.008,-2.329],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-0.006,2.529],[-4.97,-4.077],[-15.274,-6.539],[-28.536,-3.208],[-45.238,15.188]],"o":[[13.761,1.885],[-7.855,2.563],[5.843,7.842],[-0.024,-5.489],[2.439,11.595],[19.123,10.673],[20.539,8.793],[42.6,4.79],[39.121,-13.134]],"v":[[-1244.34,80.045],[-1293.62,79.236],[-1315.535,97.286],[-1302.346,110.796],[-1302.007,104.028],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1034.371,145.567]]}],"t":180},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-13.75,-1.964],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-1.613,5.208],[-4.97,-4.077],[-15.274,-6.539],[-28.652,-1.911],[-40.849,8.456]],"o":[[13.75,1.964],[-7.855,2.563],[8.522,16.414],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[47.329,3.157],[40.602,-8.404]],"v":[[-1249.659,83.597],[-1292.548,82.45],[-1311.606,100.858],[-1295.559,120.796],[-1298.078,105.635],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1042.009,149.269]]}],"t":239},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[16.869,2.178],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-0.184,2.529],[-4.97,-4.077],[-15.274,-6.539],[-28.536,-3.208],[-41.33,13.504]],"o":[[-13.776,-1.779],[-7.855,2.563],[6.558,11.235],[-1.096,-5.311],[2.137,7.886],[19.123,10.673],[20.539,8.793],[42.6,4.79],[40.953,-13.381]],"v":[[-1235.955,75.836],[-1294.691,77.807],[-1315.892,96.215],[-1300.381,115.261],[-1301.471,107.243],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1038.714,145.237]]}],"t":299},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[10.064,2.561],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-1.613,5.208],[-4.97,-4.077],[-15.274,-6.539],[-28.536,-3.208],[-42.611,9.208]],"o":[[-13.461,-3.425],[-7.855,2.563],[8.522,16.414],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[42.6,4.79],[40.336,-8.716]],"v":[[-1248.731,83.85],[-1294.334,81.379],[-1313.392,100.144],[-1295.559,120.796],[-1298.078,105.635],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1037.368,148.506]]}],"t":360},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[-13.75,-1.964],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-0.006,0.743],[-4.97,-4.077],[-15.274,-6.539],[-28.536,-3.208],[-41.864,11.743]],"o":[[13.75,1.964],[-7.855,2.563],[9.593,13.378],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[42.6,4.79],[38.884,-10.908]],"v":[[-1244.114,81.007],[-1293.62,79.236],[-1315.535,97.286],[-1299.845,115.261],[-1300.936,106.35],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1039.498,147.782]]}],"t":420},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[10.373,3.468],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-1.613,5.208],[-4.97,-4.077],[-15.274,-6.539],[-28.536,-3.208],[-42.389,9.68]],"o":[[-13.173,-4.404],[-7.855,2.563],[8.522,16.414],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[42.6,4.79],[39.337,-8.983]],"v":[[-1246.03,82.507],[-1295.763,79.593],[-1313.439,98.917],[-1295.559,120.796],[-1298.078,105.635],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1037.76,149.779]]}],"t":479},{"s":[{"c":false,"i":[[-13.75,-1.964],[16.964,-5.536],[3.7,-12.158],[-3.239,-3.525],[-1.613,5.208],[-4.97,-4.077],[-15.274,-6.539],[-28.7,-0.957],[-43.474,7.821]],"o":[[13.75,1.964],[-7.855,2.563],[8.522,16.414],[-1.453,-5.936],[2.439,11.595],[19.123,10.673],[20.539,8.793],[46.257,1.543],[40.099,-7.214]],"v":[[-1256.298,85.307],[-1291.477,84.593],[-1311.249,101.929],[-1295.559,120.796],[-1298.078,105.635],[-1277.042,130.456],[-1245.675,144.789],[-1170.019,161.656],[-1037.403,150.317]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.667,-3.608],[-9,-3.291],[-11.523,-2.936],[-2.802,-6.168]],"o":[[14.26,4.062],[16.499,6.033],[13.932,3.55],[4.737,10.425]],"v":[[-1207.46,94.306],[-1148.093,115.555],[-1088.67,132.069],[-1039.595,149.676]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.667,-3.608],[-9,-3.291],[-6.184,-2.263],[-3.682,-5.009]],"o":[[14.26,4.062],[16.499,6.033],[13.502,4.941],[6.783,9.226]],"v":[[-1199.004,84.682],[-1146.968,101.722],[-1084.936,125.891],[-1042.976,147.07]]}],"t":60},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.667,-3.608],[-9.292,-2.345],[-19.314,-2.623],[-3.682,-5.009]],"o":[[14.26,4.062],[15.848,4],[14.246,1.935],[6.783,9.226]],"v":[[-1207.615,98.59],[-1151.915,115.616],[-1077.756,129.589],[-1042.976,147.07]]}],"t":120},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.905,-2.632],[-9.292,-2.345],[-20.733,-9.898],[-3.682,-5.009]],"o":[[14.399,2.936],[15.848,4],[12.974,6.194],[6.783,9.226]],"v":[[-1208.438,86.679],[-1150.633,101.736],[-1077.515,127.186],[-1040.833,147.135]]}],"t":180},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.905,-2.632],[-9.292,-2.345],[-26.039,-5.637],[-3.682,-5.009]],"o":[[14.399,2.936],[15.848,4],[14.052,3.042],[6.783,9.226]],"v":[[-1219.753,95.327],[-1156.239,113.451],[-1070.957,130.739],[-1040.833,147.135]]}],"t":239},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.905,-2.632],[-9.1,-3.005],[-24.479,-10.515],[-4.427,-4.191]],"o":[[14.399,2.936],[16.56,5.468],[13.966,5.999],[8.316,7.872]],"v":[[-1208.326,80.918],[-1152.769,97.332],[-1072.806,127.56],[-1039.35,145.021]]}],"t":299},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.905,-2.632],[-9.1,-3.005],[-27.009,-7.888],[-5.836,-3.941]],"o":[[14.399,2.936],[16.56,5.468],[14.59,4.261],[9.49,6.408]],"v":[[-1219.77,92.141],[-1161.783,109.844],[-1076.748,133.875],[-1041.021,148.827]]}],"t":360},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-12.905,-2.632],[-9.1,-3.005],[-27.555,-9.896],[-7.911,-7.462]],"o":[[14.399,2.936],[16.56,5.468],[14.735,5.292],[8.33,7.857]],"v":[[-1212.875,84.343],[-1157.957,97.426],[-1082.188,122.914],[-1039.932,146.911]]}],"t":420},{"s":[{"c":false,"i":[[-12.667,-3.608],[-9,-3.291],[-11.523,-2.936],[-2.802,-6.168]],"o":[[14.26,4.062],[16.499,6.033],[13.932,3.55],[4.737,10.425]],"v":[[-1207.46,94.306],[-1148.093,115.555],[-1088.67,132.069],[-1039.595,149.676]]}],"t":479}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,115]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Body stroke","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[33.991,-19.305],[3.088,-9.11],[-9.125,-5.056],[-1.366,4.59],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-35.397,6.169],[19.41,5.144]],"o":[[-5.188,2.946],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-17.238,-11.627],[-57.952,-15.357]],"v":[[-1302.432,82.648],[-1313.672,98.703],[-1294.488,120.634],[-1298.078,104.758],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1038.964,149.872],[-1114.01,126.202]]}],"t":0},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[33.991,-19.305],[3.088,-9.11],[-6.81,-5.862],[-0.184,3.585],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-39.347,13.459],[30.835,13.035]],"o":[[-5.188,2.946],[3.623,5.711],[-2.826,-7.055],[3.03,8.406],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-16.44,-11.668],[-57.818,-24.441]],"v":[[-1302.432,77.648],[-1315.458,97.275],[-1301.453,112.062],[-1303.079,102.437],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1042.571,146.304],[-1108.254,116.857]]}],"t":59.881},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[27.919,-13.055],[3.088,-9.11],[-9.125,-5.056],[-1.366,4.59],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-35.397,6.169],[29.773,4.603]],"o":[[-5.404,2.527],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-10.076,-14.505],[-63.874,-9.875]],"v":[[-1293.503,86.22],[-1310.862,100.691],[-1294.488,120.634],[-1298.078,104.758],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1043.499,146.77],[-1108.656,124.948]]}],"t":119.76},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[27.919,-13.055],[3.088,-9.11],[-9.125,-5.056],[-0.542,3.763],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-36.219,10.095],[24.563,7.936]],"o":[[-5.404,2.527],[3.445,7.676],[-0.738,-4.076],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-15.921,-10.931],[-59.501,-19.223]],"v":[[-1295.646,80.863],[-1315.458,96.203],[-1301.274,110.634],[-1302.007,103.151],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1038.977,147.369],[-1113.146,113.217]]}],"t":180},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[29.37,-9.346],[3.088,-9.11],[-9.125,-5.056],[-1.366,4.59],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-34.568,7.149],[28.261,3.569]],"o":[[-11.724,3.731],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-7.01,-14.133],[-71.026,-8.969]],"v":[[-1293.503,82.648],[-1311.172,102.275],[-1294.488,120.634],[-1298.078,104.758],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1040.968,148.872],[-1111.548,122.455]]}],"t":239},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[46,-16.206],[3.088,-9.11],[-9.125,-5.056],[-0.006,3.049],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-33.958,10.395],[22.32,8.333]],"o":[[-11.604,4.088],[3.445,7.676],[-2.826,-7.055],[3.208,9.478],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-15.921,-10.931],[-57.141,-21.332]],"v":[[-1295.646,78.005],[-1315.458,97.632],[-1299.31,115.098],[-1301.471,106.365],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1038.99,144.865],[-1111.112,112.554]]}],"t":299},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[29.37,-9.346],[3.088,-9.11],[-9.125,-5.056],[-1.366,4.59],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-35.397,6.169],[21.736,5.604]],"o":[[-11.724,3.731],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-15.921,-10.931],[-63.187,-16.29]],"v":[[-1294.218,81.577],[-1313.315,99.418],[-1294.488,120.634],[-1298.078,104.758],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1040.38,148.757],[-1108.965,125.103]]}],"t":360},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[27.919,-13.055],[3.088,-9.11],[-1.989,-1.398],[0.173,2.871],[-2.841,-2.082],[-13.885,-5.039],[-32.131,-4.558],[-37.522,9.906],[19.491,7.317]],"o":[[-5.404,2.527],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.237,5.424],[-9.801,-12.85],[-61.091,-22.934]],"v":[[-1295.646,80.863],[-1315.458,96.203],[-1298.774,115.098],[-1300.936,105.473],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1039.774,147.41],[-1107.828,113.774]]}],"t":420},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[33.991,-19.305],[3.088,-9.11],[-9.125,-5.056],[-1.366,4.59],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-35.397,6.169],[19.41,5.144]],"o":[[-5.188,2.946],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-17.238,-11.627],[-57.952,-15.357]],"v":[[-1302.432,82.648],[-1313.672,98.703],[-1294.488,120.634],[-1298.078,104.758],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1038.964,149.872],[-1114.01,126.202]]}],"t":479},{"s":[{"c":true,"i":[[27.919,-13.055],[3.088,-9.11],[-9.125,-5.056],[-1.366,4.59],[-2.841,-2.082],[-13.885,-5.039],[-32.21,-3.955],[-35.397,6.169],[23.396,4.936]],"o":[[-5.404,2.527],[3.445,7.676],[-2.826,-7.055],[2.439,11.595],[8.543,6.26],[11.386,4.132],[38.624,4.743],[-15.921,-10.931],[-63.25,-13.343]],"v":[[-1293.503,86.22],[-1311.172,100.846],[-1294.488,120.634],[-1298.078,104.758],[-1275.526,130.476],[-1244.425,145.34],[-1169.705,161.133],[-1040.119,149.376],[-1104.989,131.714]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.933333337307,0.933333337307,0.933333337307,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,115]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Stomach fill","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[23.666,8.925],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-21.669,4.519],[-6.396,1.771],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-30.661,-11.563],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.962,-1.661],[21.498,-5.953],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1185.517,17.404],[-1276.026,9.248],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1053.062,152.536],[-1031.275,147.86],[-1032.083,110.145]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[23.666,8.925],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-21.669,4.519],[-5.731,1.105],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-30.661,-11.563],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.962,-1.661],[21.904,-4.222],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1185.517,17.404],[-1276.026,9.248],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1052.663,147.999],[-1033.775,144.094],[-1032.083,110.145]]}],"t":120},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[23.666,8.925],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-19.079,5.489],[-5.484,2],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-30.661,-11.563],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.816,-2.249],[19.524,-7.121],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1185.517,17.404],[-1276.026,9.248],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1050.057,150.342],[-1033.487,145.319],[-1032.083,110.145]]}],"t":180},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[21.942,5.281],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-19.079,5.489],[-5.484,2],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-31.859,-7.668],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.816,-2.249],[19.524,-7.121],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1191.582,26.904],[-1268.596,24.165],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1050.057,150.342],[-1032.66,146.876],[-1032.083,110.145]]}],"t":239},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[21.942,5.281],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-19.079,5.489],[-5.484,2],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-31.859,-7.668],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.816,-2.249],[19.524,-7.121],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1191.582,26.904],[-1268.596,24.165],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1050.088,148.744],[-1033.916,143.741],[-1032.083,110.145]]}],"t":299},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[21.942,5.281],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-19.079,5.489],[-5.484,2],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-31.859,-7.668],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.816,-2.249],[19.524,-7.121],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1191.582,26.904],[-1268.596,24.165],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1050.287,150.531],[-1030.193,144.69],[-1032.083,110.145]]}],"t":420},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[23.666,8.925],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-21.669,4.519],[-5.731,1.105],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-30.661,-11.563],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.962,-1.661],[21.904,-4.222],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1185.517,17.404],[-1276.026,9.248],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1051.851,152.384],[-1031.472,147.959],[-1032.083,110.145]]}],"t":479},{"s":[{"c":true,"i":[[-0.374,5.242],[16.503,2.703],[26.969,3.83],[21.942,5.281],[31.226,-8.5],[-0.023,-0.353],[-1.814,-7.068],[-5.528,-9.335],[-68.456,-10.716],[-19.079,5.489],[-5.484,2],[3.895,9.734]],"o":[[1.045,-14.65],[-24.616,-4.033],[-22.345,-3.173],[-31.859,-7.668],[-18.173,4.947],[0.598,4.445],[1.842,7.174],[67.53,10.28],[22.162,3.469],[7.816,-2.249],[19.524,-7.121],[-3.679,-9.195]],"v":[[-1034.844,85.315],[-1042.754,57.733],[-1123.567,45.599],[-1191.582,26.904],[-1268.596,24.165],[-1329.932,58.898],[-1326.27,71.482],[-1310.77,102.321],[-1102.032,146.725],[-1050.384,151.403],[-1025.3,148.022],[-1032.083,110.145]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,115]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Body fill","np":2,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":31,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1021.732,79.759,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-1022.249,79.437,0]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.786],"y":[0.766]},"o":{"x":[0.449],"y":[0]},"s":[-9.418],"t":0},{"i":{"x":[0.612],"y":[1.279]},"o":{"x":[0.2],"y":[0.598]},"s":[1.248],"t":100},{"i":{"x":[0.873],"y":[0.898]},"o":{"x":[0.499],"y":[0.047]},"s":[4.179],"t":175},{"i":{"x":[0.903],"y":[1.418]},"o":{"x":[0.184],"y":[0.649]},"s":[-23.418],"t":267},{"i":{"x":[0],"y":[0.925]},"o":{"x":[0.289],"y":[0.097]},"s":[-29.778],"t":360},{"i":{"x":[0.55],"y":[1]},"o":{"x":[0.283],"y":[-0.336]},"s":[-4.418],"t":389},{"s":[-9.418],"t":479}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Tail","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-2.465,-1.022],[-1.704,1.687],[0.179,2.36],[4.732,4.643]],"o":[[2.069,1.82],[2.465,1.022],[1.535,-1.519],[-0.479,-6.29],[0,0]],"v":[[-943.805,6.761],[-935.356,11.463],[-928.274,10.815],[-925.517,3.416],[-933.513,-11.861]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.896,-1.878],[-2.215,0.918],[-0.725,2.253],[2.628,6.086]],"o":[[1.228,2.466],[1.896,1.878],[1.995,-0.827],[1.933,-6.005],[0,0]],"v":[[-931.841,14.251],[-925.794,21.795],[-918.992,23.87],[-913.644,18.061],[-915.278,0.896]]}],"t":100},{"i":{"x":0.35,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.935,-2.382],[-2.299,-0.054],[-1.51,1.695],[-0.056,6.357]],"o":[[0.12,2.639],[0.935,2.382],[2.071,0.048],[4.024,-4.517],[0,0]],"v":[[-922.293,20.266],[-919.915,29.228],[-914.754,33.685],[-907.812,30.664],[-902.587,14.977]]}],"t":125},{"i":{"x":0.667,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.467,-2.627],[-2.34,-0.526],[-1.891,1.423],[-1.36,6.488]],"o":[[-0.418,2.723],[0.467,2.627],[2.107,0.474],[5.04,-3.793],[0,0]],"v":[[-922.389,26.388],[-921.795,36.039],[-917.433,41.654],[-909.942,41.899],[-901.384,26.93]]}],"t":175},{"i":{"x":0.35,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-0.467,-2.627],[-2.34,-0.526],[-1.891,1.423],[-1.36,6.488]],"o":[[-0.418,2.723],[0.467,2.627],[2.107,0.474],[5.04,-3.793],[0,0]],"v":[[-922.389,26.388],[-921.795,36.039],[-917.433,41.654],[-909.715,39.989],[-901.156,25.02]]}],"t":222},{"i":{"x":0.5,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-2.465,-1.022],[-1.704,1.687],[0.179,2.36],[4.732,4.643]],"o":[[2.069,1.82],[2.465,1.022],[1.535,-1.519],[-0.479,-6.29],[0,0]],"v":[[-943.805,6.761],[-935.356,11.463],[-928.274,10.815],[-925.517,3.416],[-933.513,-11.861]]}],"t":267},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-2.465,-1.022],[-1.704,1.687],[0.974,2.157],[6.033,2.748]],"o":[[2.069,1.82],[2.465,1.022],[1.535,-1.519],[-2.597,-5.749],[0,0]],"v":[[-943.805,6.761],[-935.356,11.463],[-928.274,10.815],[-927.673,0.611],[-940.404,-11.018]]}],"t":360},{"i":{"x":0.45,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-0.944,-2.244],[-2.188,0.002],[-1.207,1.598],[0.405,5.595]],"o":[[0.175,2.508],[0.944,2.244],[1.971,-0.002],[3.217,-4.26],[0,0]],"v":[[-927.521,20.989],[-925.051,29.458],[-920.04,33.578],[-914.021,29.875],[-910.545,15.703]]}],"t":375},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-0.467,-2.627],[-2.34,-0.526],[-1.891,1.423],[-1.36,6.488]],"o":[[-0.418,2.723],[0.467,2.627],[2.107,0.474],[5.04,-3.793],[0,0]],"v":[[-922.389,26.388],[-921.795,36.039],[-917.433,41.654],[-909.715,39.989],[-901.156,25.02]]}],"t":389},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-1.577,-1.736],[-2.339,-0.147],[-0.445,2.032],[2.811,5.103]],"o":[[0.963,2.221],[1.577,1.736],[1.894,0.119],[1.186,-5.415],[0,0]],"v":[[-930.528,11.668],[-926.153,14.886],[-919.03,20.502],[-914.84,14.971],[-917.712,0.093]]}],"t":440},{"s":[{"c":false,"i":[[0,0],[-2.465,-1.022],[-1.704,1.687],[0.179,2.36],[4.732,4.643]],"o":[[2.069,1.82],[2.465,1.022],[1.535,-1.519],[-0.479,-6.29],[0,0]],"v":[[-943.805,6.761],[-935.356,11.463],[-928.274,10.815],[-925.517,3.416],[-933.513,-11.861]]}],"t":479}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-4.079,0.025],[-0.464,0.962],[0.016,0.594],[2.986,4.979]],"o":[[2.476,3.543],[1.089,-0.007],[0.248,-0.513],[-0.149,-5.606],[0,0]],"v":[[-967.217,29.482],[-953.059,38.81],[-950.328,37.503],[-950.09,35.782],[-954.555,18.784]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.991,-0.844],[-0.659,0.841],[-0.111,0.583],[1.858,5.501]],"o":[[1.665,3.989],[1.065,0.225],[0.352,-0.449],[1.048,-5.51],[0,0]],"v":[[-963.088,31.387],[-951.239,43.515],[-948.293,42.82],[-947.694,41.188],[-948.438,23.629]]}],"t":100},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.859,-1.281],[-0.746,0.76],[-0.175,0.566],[1.227,5.656]],"o":[[1.205,4.137],[1.03,0.342],[0.398,-0.405],[1.652,-5.342],[0,0]],"v":[[-960.669,28.82],[-949.82,43.542],[-946.823,43.182],[-946.048,41.632],[-944.829,24.154]]}],"t":125},{"i":{"x":0.35,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-3.796,-1.494],[-0.789,0.72],[-0.206,0.557],[0.921,5.732]],"o":[[0.981,4.209],[1.013,0.399],[0.421,-0.384],[1.946,-5.26],[0,0]],"v":[[-960.671,32.171],[-950.307,48.155],[-947.286,47.957],[-946.426,46.447],[-944.251,29.008]]}],"t":222},{"i":{"x":0.5,"y":1},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-4.079,0.025],[-0.464,0.962],[0.016,0.594],[2.986,4.979]],"o":[[2.476,3.543],[1.089,-0.007],[0.248,-0.513],[-0.149,-5.606],[0,0]],"v":[[-967.217,29.482],[-953.059,38.81],[-950.328,37.503],[-950.09,35.782],[-954.555,18.784]]}],"t":267},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-4.079,0.025],[-0.464,0.962],[0.016,0.594],[2.986,4.979]],"o":[[2.476,3.543],[1.089,-0.007],[0.248,-0.513],[-0.149,-5.606],[0,0]],"v":[[-967.217,29.482],[-953.059,38.81],[-950.328,37.503],[-950.09,35.782],[-954.555,18.784]]}],"t":360},{"i":{"x":0.45,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.863,-1.131],[-0.711,0.778],[-0.153,0.566],[1.414,5.552]],"o":[[1.338,4.05],[1.031,0.302],[0.38,-0.415],[1.446,-5.343],[0,0]],"v":[[-963.005,29.406],[-951.735,43.801],[-948.784,43.339],[-948.071,41.778],[-947.482,24.444]]}],"t":375},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":false,"i":[[0,0],[-3.796,-1.494],[-0.789,0.72],[-0.206,0.557],[0.921,5.732]],"o":[[0.981,4.209],[1.013,0.399],[0.421,-0.384],[1.946,-5.26],[0,0]],"v":[[-960.671,32.171],[-950.307,48.155],[-947.286,47.957],[-946.426,46.447],[-944.251,29.008]]}],"t":389},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[0,0],[-3.865,-1.122],[-0.71,0.779],[-0.152,0.566],[1.425,5.548]],"o":[[1.347,4.047],[1.031,0.3],[0.379,-0.416],[1.434,-5.345],[0,0]],"v":[[-962.389,29.732],[-951.098,44.088],[-948.148,43.62],[-947.439,42.058],[-946.887,24.727]]}],"t":411},{"s":[{"c":false,"i":[[0,0],[-4.079,0.025],[-0.464,0.962],[0.016,0.594],[2.986,4.979]],"o":[[2.476,3.543],[1.089,-0.007],[0.248,-0.513],[-0.149,-5.606],[0,0]],"v":[[-967.217,29.482],[-953.059,38.81],[-950.328,37.503],[-950.09,35.782],[-954.555,18.784]]}],"t":479}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.964705884457,0.549019634724,0.129411771894,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Tail stripes","np":4,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.73,-8.645],[5.475,-7.296],[19.79,-7.061],[11.697,-11.071],[-4.091,-2.787],[0.608,4.912],[-26.134,13.811],[-12.754,15.819],[-1.216,11.843],[5.176,7.759],[6.726,-0.508],[3.627,-8.165]],"o":[[-3.14,9.946],[-9.457,12.601],[-22.588,8.059],[0,0],[4.091,2.787],[-1.433,-11.582],[13.876,-7.333],[10.529,-13.059],[0.664,-6.467],[-3.608,-5.408],[-8.909,0.673],[-3.689,8.303]],"v":[[-934.108,-16.865],[-947.567,7.143],[-990.219,40.002],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-952.04,59.68],[-907.978,25.406],[-888.376,-18.425],[-892.367,-45.608],[-909.175,-54.287],[-929.079,-40.243]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.793,-6.973],[7.825,-4.687],[19.79,-7.061],[11.697,-11.071],[-4.091,-2.787],[0.608,4.912],[-28.475,7.931],[-17.784,9.83],[-5.599,10.507],[1.862,9.139],[6.419,2.07],[6.443,-6.19]],"o":[[-6.665,8.023],[-13.516,8.095],[-22.588,8.059],[0,0],[4.091,2.787],[-1.433,-11.582],[15.119,-4.211],[14.681,-8.115],[3.057,-5.737],[-1.298,-6.37],[-8.503,-2.742],[-6.552,6.295]],"v":[[-913.983,-3.94],[-935.884,15.433],[-990.219,40.002],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-954.71,64.138],[-905.756,45.069],[-871.05,11.89],[-864.477,-14.787],[-876.762,-29.172],[-900.496,-23.687]]}],"t":100},{"i":{"x":0.35,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[10.806,-1.498],[12.204,-2.842],[20.226,-9.798],[14.416,-11.45],[-4.091,-2.787],[-3.41,3.588],[-28.793,6.62],[-16.146,1.303],[-10.409,2.045],[-5.265,6.43],[2.183,5.599],[7.902,0.967]],"o":[[-9.833,1.363],[-14.927,4.074],[-24.436,11.837],[0,0],[4.091,2.787],[7.645,-8.045],[16.795,-3.826],[15.433,-1.246],[5.684,-1.117],[3.67,-4.482],[-2.892,-7.417],[-8.036,-0.983]],"v":[[-902.522,13.767],[-932.399,19.878],[-989.261,37.393],[-1035.189,65.133],[-1035.866,71.507],[-991.717,79.369],[-955.175,63.419],[-906.595,56.131],[-868.545,54.335],[-852.86,43.273],[-851.321,23.863],[-870.597,11.312]]}],"t":125},{"i":{"x":0.667,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[19.97,5.88],[15.44,-0.965],[15.928,-6.282],[11.697,-11.071],[-4.091,-2.787],[0.608,4.912],[-26.873,12.312],[-16.823,-3.387],[-8.747,-3.952],[-8.563,3.696],[-0.71,6.708],[7.379,5.037]],"o":[[-10.447,-3.076],[-15.725,0.983],[-22.31,8.8],[0,0],[4.091,2.787],[-1.433,-11.582],[19.149,-8.773],[12.837,2.584],[5.924,2.677],[5.969,-2.576],[0.94,-8.885],[-7.504,-5.123]],"v":[[-893.909,28.164],[-931.069,25.376],[-986.464,36.902],[-1035.258,64.111],[-1035.934,70.485],[-991.717,79.369],[-959.467,69.379],[-910.841,64.299],[-885.68,78.513],[-859.232,81.227],[-847.831,67.037],[-859.563,43.484]]}],"t":175},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[8.466,-0.786],[14.333,-1.944],[21.628,-8.358],[11.697,-11.071],[-4.091,-2.787],[0.608,4.912],[-28.947,5.982],[-20.307,-0.725],[-11.876,0.847],[-6.749,6.438],[1.662,6.537],[8.668,2.164]],"o":[[-13.282,1.233],[-15.612,2.118],[-22.37,8.644],[0,0],[4.091,2.787],[-1.433,-11.582],[17.61,-3.639],[14.223,0.507],[6.484,-0.462],[4.704,-4.487],[-2.201,-8.659],[-8.816,-2.2]],"v":[[-897.988,22.601],[-931.069,25.376],[-989.384,38.424],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-959.467,69.379],[-907.367,64.847],[-875.835,66.604],[-849.748,57.981],[-844.101,39.927],[-861.37,22.746]]}],"t":222},{"i":{"x":0.35,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.693,-6.245],[10.36,-4.344],[20.804,-7.776],[11.697,-11.071],[-4.091,-2.787],[-0.95,4.519],[-13.965,3.765],[-17.528,7.256],[-8.346,8.983],[-0.316,7.163],[4.904,2.721],[5.92,-4.334]],"o":[[-7.368,5.294],[-12.852,6.82],[-22.468,8.382],[0,0],[4.091,2.787],[4.004,-6.166],[18.461,-4.977],[15.294,-6.331],[5.875,-6.323],[0.221,-4.992],[-6.496,-3.605],[-7.784,5.699]],"v":[[-914.188,4.9],[-939.217,18.61],[-989.758,39.132],[-1027.718,59.133],[-1028.394,65.506],[-996.339,81.354],[-956.136,65.029],[-907.089,48.103],[-870.699,26.01],[-862.75,6.301],[-873.11,-9.611],[-893.917,-9.866]]}],"t":238},{"i":{"x":0.5,"y":1},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[2.73,-8.645],[5.475,-7.296],[19.79,-7.061],[11.697,-11.071],[-4.091,-2.787],[-2.866,4.035],[-26.134,13.811],[-12.754,15.819],[-1.216,11.843],[5.176,7.759],[6.726,-0.508],[3.627,-8.165]],"o":[[-3.14,9.946],[-9.457,12.601],[-22.588,8.059],[0,0],[4.091,2.787],[7.173,-10.101],[13.876,-7.333],[10.529,-13.059],[0.664,-6.467],[-3.608,-5.408],[-8.909,0.673],[-3.689,8.303]],"v":[[-934.108,-16.865],[-947.567,7.143],[-990.219,40.002],[-1027.718,59.133],[-1028.394,65.506],[-1002.022,83.793],[-952.04,59.68],[-907.978,25.406],[-888.376,-18.425],[-892.367,-45.608],[-909.175,-54.287],[-929.079,-40.243]]}],"t":267},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[-0.386,-9.057],[3.26,-4.77],[19.79,-7.061],[11.697,-11.071],[-4.091,-2.787],[-3.582,3.416],[-21.918,9.852],[-12.827,22.947],[2.9,11.547],[7.514,5.525],[6.148,-2.774],[0.622,-8.913]],"o":[[0.444,10.42],[-8.889,13.008],[-22.588,8.059],[0,0],[4.091,2.787],[8.91,-8.497],[14.315,-6.434],[8.185,-14.642],[-1.584,-6.305],[-5.237,-3.851],[-8.144,3.674],[-0.633,9.064]],"v":[[-942.641,-15.553],[-947.567,7.143],[-990.219,40.002],[-1027.718,59.133],[-1028.394,65.506],[-1000.689,85.225],[-952.04,59.68],[-909.381,22.995],[-900.983,-32.54],[-913.221,-56.819],[-931.982,-59.238],[-945.896,-39.243]]}],"t":360},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[7.048,-4.411],[6.901,-3.405],[14.9,-7.746],[11.697,-11.071],[-4.091,-2.787],[-1.668,4.099],[-25.129,8.085],[-15.041,7.902],[-7.745,9.655],[1.913,7.233],[4.539,2.003],[5.515,-2.229]],"o":[[-5.687,4.81],[-13.072,7.749],[-13.612,7.077],[0,0],[4.091,2.787],[9.079,-6.046],[15.82,-5.158],[10.64,-5.59],[3.647,-5.035],[-1.293,-5.134],[-6.013,-2.653],[-7.738,3.128]],"v":[[-923.079,2.755],[-942.197,14.671],[-987.324,37.071],[-1027.718,59.133],[-1028.394,65.506],[-996.591,82.55],[-955.478,62.396],[-901.682,40.717],[-874.213,19.461],[-870.76,-3.352],[-880.31,-15.315],[-898.077,-14.915]]}],"t":369},{"i":{"x":0.45,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.003,-1.313],[9.328,-2.495],[15.013,-6.646],[11.697,-11.071],[-4.091,-2.787],[-0.392,4.555],[-27.269,6.906],[-16.611,2.03],[-12.031,4.89],[-2.515,5.746],[1.819,4.461],[6.327,0.832]],"o":[[-9.773,1.069],[-15.861,4.243],[-14.833,6.566],[0,0],[4.091,2.787],[9.192,-4.412],[16.824,-4.307],[13.081,-1.599],[5.811,-2.362],[1.806,-4.126],[-2.41,-5.908],[-13.2,-1.737]],"v":[[-910.037,14.959],[-938.616,19.691],[-985.394,35.116],[-1027.718,59.133],[-1028.394,65.506],[-993.859,80.767],[-957.77,64.207],[-908.581,54.161],[-869.054,53.365],[-856.392,39.808],[-856.337,25.824],[-870.284,13.944]]}],"t":375},{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"s":[{"c":true,"i":[[11.752,-0.504],[14.333,-1.944],[21.628,-8.358],[11.697,-11.071],[-4.091,-2.787],[0.608,4.912],[-28.947,5.982],[-20.307,-0.725],[-11.7,-2.202],[-7.794,5.123],[0.462,6.729],[8.14,3.683]],"o":[[-13.327,0.571],[-15.612,2.118],[-22.37,8.644],[0,0],[4.091,2.787],[-1.433,-11.582],[17.61,-3.639],[14.223,0.507],[7.28,1.37],[5.432,-3.571],[-0.612,-8.913],[-8.278,-3.746]],"v":[[-897.988,22.601],[-931.069,25.376],[-989.384,38.424],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-959.467,69.379],[-907.367,64.847],[-880.001,68.66],[-852.791,64.856],[-843.997,48.108],[-857.904,28.108]]}],"t":389},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.671,-2.069],[12.21,-3.227],[20.676,-8.288],[8.839,-6.681],[-4.091,-2.787],[-1.364,4.072],[-28.273,7.858],[-18.044,0.564],[-9.814,2.664],[-4.366,6.888],[2.791,5.196],[7.812,0.004]],"o":[[-10.85,1.771],[-14.137,4.63],[-18.956,7.598],[0,0],[4.091,2.787],[4.538,-2.167],[16.715,-4.524],[14.364,-0.449],[5.914,-1.35],[3.043,-4.801],[-3.697,-6.882],[-7.945,-0.004]],"v":[[-904.067,12.1],[-935.877,18.915],[-990.747,37.447],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-959.183,66.079],[-905.979,55.951],[-870.091,53.225],[-851.723,41.438],[-853.804,20.286],[-874.924,9.497]]}],"t":411},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.458,-5.877],[9.412,-4.917],[20.607,-7.637],[11.697,-11.071],[-4.091,-2.787],[-3.963,2.965],[-27.384,10.331],[-14.681,10.758],[-5.347,8.541],[1.033,7.826],[5.298,2.126],[5.804,-4.846]],"o":[[-6.665,7.138],[-12.193,7.942],[-22.491,8.319],[0,0],[4.091,2.787],[9.949,-7.444],[15.536,-5.691],[12.148,-7.669],[2.919,-4.663],[-0.72,-5.454],[-7.017,-2.816],[-5.903,4.928]],"v":[[-917.202,-3.893],[-940.235,15.246],[-989.848,39.301],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-955.341,63.99],[-899.576,38.114],[-875.412,14.704],[-869.638,-9.2],[-879.004,-23.238],[-901.65,-20.711]]}],"t":440},{"s":[{"c":true,"i":[[2.73,-8.645],[5.475,-7.296],[19.79,-7.061],[11.697,-11.071],[-4.091,-2.787],[0.608,4.912],[-26.134,13.811],[-12.754,15.819],[-1.216,11.843],[5.176,7.759],[6.726,-0.508],[3.627,-8.165]],"o":[[-3.14,9.946],[-9.457,12.601],[-22.588,8.059],[0,0],[4.091,2.787],[-1.433,-11.582],[13.876,-7.333],[10.529,-13.059],[0.664,-6.467],[-3.608,-5.408],[-8.909,0.673],[-3.689,8.303]],"v":[[-934.108,-16.865],[-947.567,7.143],[-990.219,40.002],[-1027.718,59.133],[-1028.394,65.506],[-991.717,79.369],[-952.04,59.68],[-907.978,25.406],[-888.376,-18.425],[-892.367,-45.608],[-909.175,-54.287],[-929.079,-40.243]]}],"t":479}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0.08,0.103]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Tail","np":3,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-901.937,29.546]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-936.937,29.546]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Tail","np":2,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":32,"ip":0,"ks":{"a":{"a":1,"ix":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[-884.232,101.187,0],"t":45.906,"ti":[0,0,0],"to":[0,0,0]},{"s":[-884.232,101.187,0],"t":271.453125}]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-923.191,58.706,0]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-87.378],"t":0},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-62.378],"t":59.881},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-79.378],"t":119.76},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-59.378],"t":179.637},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-81.378],"t":239.518},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-55.378],"t":299.396},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-79.378],"t":359.277},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-52.378],"t":419.156},{"s":[-87.378],"t":479.037109375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Back fin","op":480,"parent":33,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.96,2.502],[0.454,-6.021],[3.656,-7.718],[-6.601,-5.385],[-3.168,-3.428],[-1.845,-2.205],[1.796,6.759],[3.595,3.746]],"o":[[-1.095,-0.319],[-0.681,8.498],[1.627,1.231],[4.546,3.696],[3.071,3.354],[3.171,2.472],[-1.059,-3.719],[-2.226,-2.32]],"v":[[-872.735,98.118],[-879.036,100.623],[-886.904,117.446],[-870.264,125.203],[-861.487,137.822],[-853.611,149.084],[-854.009,124.884],[-861.491,106.076]]}],"t":-19},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.595,1.339],[0.807,-5.851],[3.656,-7.718],[-5.631,-4.288],[-2.57,-1.979],[-5.078,-4.109],[4.042,5.397],[4.791,3.166]],"o":[[-2.191,-0.639],[-1.223,8.392],[1.627,1.231],[4.136,3.15],[5.52,4.25],[5.513,4.461],[-3.42,-4.565],[-3.993,-2.639]],"v":[[-869.833,85.277],[-874.677,90.115],[-879.407,101.286],[-862.238,105.681],[-853.655,112.26],[-835.53,127.19],[-843.868,103.291],[-857.756,90.05]]}],"t":-8},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.906,1.853],[1.064,-5.727],[3.656,-7.718],[-5.026,-3.369],[-3.884,-3.042],[-1.39,-1.074],[8.124,9.252],[4.287,5.057]],"o":[[-2.151,-0.798],[-1.616,8.316],[1.627,1.231],[3.973,2.63],[5.131,4.018],[0.557,1],[-4.113,-4.684],[-2.947,-3.466]],"v":[[-865.495,81.358],[-872.023,83.587],[-878.109,98.551],[-864.094,103.369],[-852.713,112.829],[-837.057,124.541],[-844.696,105.847],[-852.882,90.77]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.139,2.239],[1.257,-5.634],[3.656,-7.718],[-4.572,-2.679],[-3.282,-3.243],[-0.347,-0.269],[3.277,7.105],[4.043,4.4]],"o":[[-2.12,-0.918],[-1.289,8.129],[1.627,1.231],[3.85,2.24],[6.035,5.965],[0.139,0.25],[-2.209,-5.713],[-4.19,-4.511]],"v":[[-869.168,82.315],[-875.062,84.841],[-879.662,100.158],[-866.132,104.583],[-854.844,112.58],[-838.544,126.374],[-845.011,108.446],[-854.067,93.052]]}],"t":11.977},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-3.751,-2.506],[0,0],[1.661,6.389],[3.962,4.181]],"o":[[-2.11,-0.958],[-1.179,8.066],[1.627,1.231],[3.809,2.11],[6.09,4.069],[0,0],[-1.575,-6.056],[-4.604,-4.86]],"v":[[-870.392,82.634],[-876.074,85.259],[-880.179,100.693],[-866.812,104.988],[-855.554,112.497],[-837.29,124.714],[-845.116,109.312],[-854.462,93.812]]}],"t":15.969},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.155,1.287],[0.968,-5.652],[3.027,-7.985],[-4.846,-1.589],[-4.52,-1.258],[0.909,0.167],[3.411,5.088],[4.388,3.113]],"o":[[-2.2,-0.525],[-0.985,8.208],[1.72,1.097],[4.289,1.341],[7.016,2.06],[-2.741,-0.504],[-2.935,-4.65],[-4.843,-3.512]],"v":[[-873.179,84.575],[-878.85,87.591],[-882.671,103.307],[-868.814,105.908],[-855.249,109.998],[-834.016,116.985],[-845.812,104.178],[-857.382,92.154]]}],"t":21.955},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.735,0.576],[1.578,-5.479],[3.656,-7.718],[-5.174,-1.174],[-5.366,-1.191],[2.38,0.638],[5.212,3.603],[4.397,2.242]],"o":[[-2.218,-0.27],[-2.404,8.163],[1.627,1.231],[4.765,0.961],[10.528,2.336],[-7.177,-1.925],[-4.185,-2.893],[-4.449,-2.269]],"v":[[-875.808,96.19],[-882.053,98.622],[-888.723,113.856],[-874.724,116.57],[-858.303,117.823],[-834.804,122.88],[-849.373,109.673],[-861.984,101.076]]}],"t":31.936},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.831,1.159],[1.803,-5.371],[4.959,-6.597],[-5.834,-0.058],[-4.895,0.501],[7.618,5.671],[9.798,2.654],[4.953,2.346]],"o":[[-4.573,-1.384],[-2.749,8.096],[1.627,1.231],[5.602,-0.044],[9.287,-1.29],[-4.779,-3.558],[-5.408,-1.465],[-3.617,-1.713]],"v":[[-877.951,106.972],[-887.544,110.313],[-896.099,124.352],[-876.311,128.393],[-858.677,130.115],[-828.723,129.578],[-849.957,116.265],[-866.471,111.914]]}],"t":45.906},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.211,0.989],[2.267,-5.175],[4.658,-6.96],[-5.057,-1.488],[-5.306,-2.473],[1.24,8.152],[6.016,4.738],[4.594,3.671]],"o":[[-1.919,-0.714],[-3.443,7.858],[1.547,1.331],[5.83,1.881],[6.743,1.883],[-0.702,-5.341],[-4.043,-3.888],[-3.525,-2.817]],"v":[[-880.077,112.026],[-888.261,113.975],[-896.3,128.069],[-879.373,133.415],[-863.58,140.137],[-838.574,144.742],[-854.905,129.952],[-868.008,118.833]]}],"t":53.891},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.241,1.129],[2.71,-4.946],[4.65,-7.163],[-4.312,-2.6],[-5.267,-4.859],[-3.944,9.409],[2.895,6.067],[4.152,4.7]],"o":[[0,0],[-4.134,7.546],[1.449,1.437],[5.774,3.481],[4.504,4.155],[2.636,-6.288],[-2.701,-5.661],[-3.286,-3.72]],"v":[[-880.569,113.611],[-887.633,114.472],[-895.655,128.493],[-881.077,134.949],[-867.279,145.602],[-846.52,154.156],[-858.737,138.325],[-868.386,122.173]]}],"t":59.881},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.581,1.911],[2.028,-5.263],[4.371,-6.996],[-4.74,-4.98],[-3.119,-4.279],[-6.064,3.449],[2.267,8.341],[5.2,6.121]],"o":[[-2.657,-1.109],[-3.094,8.029],[1.627,1.231],[4.009,4.212],[4.74,6.504],[6.112,-3.476],[-2.206,-8.113],[-3.124,-3.677]],"v":[[-877.585,111.21],[-887.06,110.135],[-895.416,125.614],[-878.357,132.162],[-867.94,146.486],[-852.783,165.837],[-853.223,139.886],[-865.477,119.14]]}],"t":75.848},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.636,1.743],[2.233,-5.179],[4.746,-6.94],[-4.06,-4.164],[-3.719,-5.084],[-6.36,-3.172],[2.315,9.663],[5.225,7.089]],"o":[[-2.219,-0.864],[-3.406,7.901],[1.577,1.294],[4.093,4.13],[4.053,5.643],[4.963,1.421],[-1.674,-6.989],[-2.909,-3.946]],"v":[[-877.436,104.101],[-884.997,104.824],[-893.266,119.739],[-878.63,125.452],[-867.691,139.011],[-855.411,155.535],[-856.203,131.916],[-865.163,112.408]]}],"t":83.832},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.753,1.431],[2.175,-5.204],[4.746,-7.084],[-3.737,-3.375],[-4.358,-5.55],[-6.572,-7.885],[2.752,10.554],[5.492,7.621]],"o":[[-1.932,-0.582],[-3.318,7.938],[1.592,1.277],[4.325,3.906],[3.785,4.82],[4.057,4.868],[-1.582,-6.069],[-2.902,-4.027]],"v":[[-877.48,97.907],[-883.617,100.325],[-891.208,115.156],[-878.136,119.602],[-866.241,132.159],[-855.387,146.009],[-857.447,124.158],[-864.753,106.006]]}],"t":89.818},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.872,1.106],[1.854,-5.327],[3.883,-7.581],[-3.936,-3.14],[-4.689,-5.274],[-8.102,-6.823],[6.547,9.84],[5.947,7.271]],"o":[[-2.217,-0.503],[-2.828,8.126],[1.667,1.177],[4.555,3.635],[4.072,4.58],[4.794,4.077],[-3.205,-5.149],[-3.142,-3.842]],"v":[[-871.922,86.243],[-877.808,89.978],[-883.975,105.193],[-869.663,108.98],[-857.829,120.318],[-845.06,131.268],[-847.556,112.028],[-858.128,94.446]]}],"t":103.791},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.028,-5.263],[3.656,-7.718],[-3.83,-3.268],[-4.513,-5.425],[-9.109,-6.387],[9.844,9.566],[5.704,7.463]],"o":[[0,0],[-3.094,8.029],[1.627,1.231],[4.433,3.782],[3.919,4.711],[5.188,3.638],[-4.498,-4.371],[-3.014,-3.944]],"v":[[-867.865,84.454],[-874.752,86.247],[-880.838,101.211],[-866.986,106.765],[-857.051,116.633],[-841.247,125.705],[-842.18,109.22],[-854.651,91.32]]}],"t":119.76},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.776,1.328],[1.674,-5.433],[3.656,-7.718],[-3.953,-3.022],[-4.074,-3.552],[-4.554,-3.193],[5.753,7.978],[5.007,6.654]],"o":[[-1.055,-0.479],[-2.552,8.134],[3.442,0.999],[5.02,3.839],[4.246,3.702],[2.594,1.819],[-3.036,-5.214],[-2.964,-3.947]],"v":[[-869.614,85.537],[-876.369,87.49],[-881.924,102.83],[-869.736,106.41],[-855.721,119.217],[-843.252,130.308],[-845.905,112.313],[-855.909,94.886]]}],"t":127.744},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.224,2.416],[1.731,-5.469],[4.1,-7.491],[-2.985,-3.958],[-2.806,-3.411],[-1.09,-0.863],[2.284,6.932],[4.121,6.3]],"o":[[-1.794,-0.944],[-2.621,8.074],[4.748,1.103],[2.875,3.812],[3.767,4.579],[0.621,0.492],[-1.596,-5.949],[-2.69,-4.113]],"v":[[-870.783,87.645],[-877.548,89.326],[-883.609,104.621],[-871.487,112.015],[-861.162,123.927],[-848.771,138.252],[-850.242,117.175],[-857.386,99.657]]}],"t":133.73},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.157,2.494],[1.457,-5.569],[3.843,-7.626],[-4.36,-2.557],[-2.695,-3.01],[0,0],[1.505,6.428],[4.166,5.948]],"o":[[-2.086,-1.009],[-2.211,8.188],[5.237,0.894],[3.756,2.203],[3.937,4.398],[0,0],[-1.426,-6.093],[-2.816,-4.02]],"v":[[-871.915,88.622],[-878.588,90.573],[-883.279,106.515],[-869.152,113.374],[-859.952,121.858],[-844.285,135.856],[-850.174,118.281],[-857.295,101.149]]}],"t":135.729},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.125,1.61],[1.064,-5.637],[3.258,-7.386],[-4.697,-1.851],[-3.49,-2.122],[0.609,0.091],[2.822,5.416],[4.858,5.064]],"o":[[-2.191,-0.65],[-1.633,8.319],[4.396,0.682],[4.122,1.573],[5.664,3.275],[-1.838,-0.273],[-2.917,-5.252],[-3.3,-3.435]],"v":[[-873.82,89.978],[-879.654,92.845],[-884.732,108.41],[-869.741,111.822],[-858.514,118.322],[-840.459,129.933],[-849.436,113.161],[-859.375,99.242]]}],"t":139.721},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.033,0.853],[0.807,-5.671],[2.859,-7.054],[-4.973,-1.252],[-3.992,-1.87],[1.219,0.181],[3.983,4.443],[5.406,4.284]],"o":[[-2.271,-0.342],[-1.256,8.4],[3.534,0.599],[4.435,1.036],[8.322,3.898],[-3.675,-0.546],[-4.259,-4.447],[-3.686,-2.921]],"v":[[-875.997,91.357],[-881.04,94.977],[-886.171,110.392],[-871.592,113.359],[-858.915,117.602],[-837.692,125.918],[-850.035,110.121],[-861.302,98.053]]}],"t":143.711},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.565,0.666],[1.803,-5.41],[3.972,-7.56],[-5.122,-1.387],[-5.485,-0.358],[2.351,0.736],[5.094,3.561],[5.272,4.138]],"o":[[-2.312,-0.337],[-2.739,8.057],[1.575,1.298],[4.722,1.157],[8.045,0.525],[-7.091,-2.22],[-5.712,-3.993],[-3.629,-2.848]],"v":[[-877.732,99.674],[-884.667,102.091],[-891.366,116.791],[-877.491,120.081],[-861.135,122.011],[-836.998,124.6],[-852.786,115.148],[-864.472,105.057]]}],"t":151.693},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.984,0.38],[2.375,-5.144],[4.446,-7.291],[-5.795,-0.67],[-4.92,-0.016],[6.98,6.44],[8.308,0.844],[4.679,2.853]],"o":[[-2.484,-0.237],[-3.584,7.763],[1.489,1.395],[5.576,0.544],[9.371,-0.308],[-4.379,-4.04],[-5.574,-0.567],[-3.417,-2.083]],"v":[[-880.24,110.098],[-887.263,112.684],[-894.887,126.927],[-880.554,129.777],[-861.962,129.924],[-832.407,123.339],[-854.008,119.081],[-869.039,114.422]]}],"t":165.666},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.397,1.116],[2.535,-5.038],[4.397,-7.321],[-4.4,-2.448],[-5.433,-4.672],[-3.613,9.541],[3.105,5.962],[4.314,4.552]],"o":[[-3.146,-0.651],[-3.868,7.686],[1.498,1.385],[5.892,3.277],[4.646,3.995],[2.414,-6.376],[-2.897,-5.563],[-3.414,-3.603]],"v":[[-878.291,115.102],[-887.793,116.723],[-895.009,130.282],[-878.387,136.824],[-864.225,146.989],[-843.18,154.811],[-855.942,139.418],[-866.15,123.612]]}],"t":179.637},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.617,1.822],[1.76,-4.225],[5.137,-6.081],[-4.048,-3.443],[-3.1,-4.432],[-8.892,2.329],[2.555,7.901],[4.698,6.349]],"o":[[-1.656,-0.653],[-3.309,7.943],[1.509,1.374],[4.04,3.436],[4.246,6.07],[6.802,-1.781],[-2.161,-6.683],[-3.016,-3.909]],"v":[[-881.012,110.281],[-886.815,110.988],[-896.013,125.478],[-882.488,130.514],[-873.063,144.997],[-857.731,162.515],[-856.734,140.021],[-869.037,118.002]]}],"t":195.605},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.785,2.52],[1.429,-4.179],[4.74,-6.769],[-3.703,-3.578],[-3.576,-5.248],[-7.245,-3.795],[2.207,9.523],[4.812,7.304]],"o":[[-0.707,-0.286],[-2.9,8.481],[1.497,1.387],[4.026,3.889],[3.759,5.517],[5.037,2.201],[-1.558,-6.395],[-2.769,-4.099]],"v":[[-879.802,104.761],[-886.308,105.673],[-894.61,120.014],[-881.651,125.188],[-871.188,139.709],[-859.174,155.064],[-858.952,132.889],[-867.563,113.286]]}],"t":203.59},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.703,2.946],[1.141,-4.158],[4.327,-7.362],[-3.525,-3.595],[-4.013,-5.805],[-6.081,-8.27],[2.106,10.702],[5.019,7.94]],"o":[[0,0],[-2.451,8.932],[1.511,1.371],[4.08,4.161],[3.485,5.041],[3.754,5.105],[-1.211,-6.154],[-2.652,-4.196]],"v":[[-877.896,98.756],[-884.915,99.93],[-892.306,114.295],[-879.684,119.357],[-868.203,133.73],[-858.425,147.266],[-859.154,125.33],[-865.317,107.678]]}],"t":209.578},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.809,1.725],[1.112,-4.436],[4.03,-6.827],[-3.838,-3.259],[-5.137,-4.767],[-8.044,-6.979],[6.697,9.973],[5.722,7.449]],"o":[[-1.227,-0.307],[-2.113,8.64],[1.63,1.227],[4.442,3.772],[4.179,3.932],[4.734,4.146],[-3.229,-5.134],[-3.024,-3.936]],"v":[[-872.802,87.265],[-878.361,89.643],[-884.901,104.329],[-871.517,108.096],[-858.57,120.923],[-846.116,131.515],[-847.907,112.561],[-858.196,95.645]]}],"t":225.547},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.705,1.58],[1.782,-4.477],[4.837,-5.676],[-3.568,-3.553],[-5.32,-4.637],[-8.592,-7.067],[9.081,10.294],[5.115,7.879]],"o":[[-2.249,-0.755],[-3.183,7.994],[1.528,1.353],[4.13,4.112],[4.125,3.595],[4.894,4.026],[-4.149,-4.703],[-2.703,-4.163]],"v":[[-869.875,82.415],[-874.489,84.934],[-882.231,101.343],[-868.87,106.075],[-856.773,119.518],[-843.765,129.424],[-843.429,112.916],[-854.57,95.149]]}],"t":239.518},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-3.071,-2.626],[0,0],[1.661,6.389],[4.31,5.844]],"o":[[-2.11,-0.958],[-2.01,8.239],[1.627,1.231],[3.809,2.11],[5.036,4.306],[0,0],[-1.575,-6.056],[-2.913,-3.95]],"v":[[-873.345,88.37],[-879.969,90.483],[-886.055,105.447],[-874.971,109.629],[-863.443,120.007],[-844.56,136.594],[-852.496,115.332],[-860.209,99.45]]}],"t":255.486},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.084,1.698],[2.084,-5.308],[4.363,-7.341],[-5.042,-1.654],[-5.459,-0.645],[2.31,0.858],[4.497,4.416],[5.522,3.798]],"o":[[-2.216,-0.74],[-3.158,7.902],[1.505,1.378],[4.654,1.403],[8.006,0.946],[-6.965,-2.589],[-4.973,-4.883],[-4.62,-3.178]],"v":[[-880.406,100.987],[-888.399,104.503],[-895.859,118.831],[-882.176,122.844],[-865.944,125.63],[-841.743,131.588],[-855.402,116.69],[-868.097,106.548]]}],"t":271.453},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.776,0.32],[1.438,-3.57],[4.362,-7.341],[-4.826,-1.058],[-4.92,0.04],[4.244,8.496],[7.997,5.014],[5.749,2.659]],"o":[[-3.262,-0.181],[-3.195,7.93],[1.505,1.378],[5.966,1.308],[9.367,-0.415],[-2.633,-5.271],[-4.747,-2.976],[-4.323,-2]],"v":[[-887.35,114.168],[-893.294,119.551],[-902.209,133.652],[-888.013,138.459],[-869.836,140.752],[-838.634,138.719],[-857.779,127.39],[-874.162,117.621]]}],"t":285.426},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.538,2.011],[2.889,-4.844],[4.909,-6.988],[-4.214,-2.756],[-5.085,-5.049],[-4.286,9.258],[2.671,6.169],[3.977,4.849]],"o":[[-2.169,-0.961],[-4.408,7.389],[1.395,1.489],[5.642,3.69],[4.349,4.318],[2.864,-6.187],[-2.492,-5.756],[-3.148,-3.838]],"v":[[-884.762,124.356],[-892.198,126.033],[-900.728,139.751],[-887.13,144.959],[-872.978,159.674],[-853.599,170.779],[-864.194,150.929],[-873.246,134.434]]}],"t":299.396},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.436,2.227],[1.673,-3.209],[5.239,-6.744],[-3.52,-3.523],[-3.702,-6.399],[-7.32,5.56],[1.531,8.161],[3.855,6.894]],"o":[[-2.12,-1.064],[-3.977,7.63],[1.322,1.554],[4.419,4.328],[3.042,5.258],[4.805,-3.65],[-1.295,-6.903],[-2.496,-4.261]],"v":[[-886.776,118.064],[-893.911,117.969],[-903.008,132.509],[-889.028,140.174],[-880.222,153.912],[-864.864,172.491],[-865.892,151.919],[-875.302,128.516]]}],"t":315.365},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.568,1.941],[2.141,-5.218],[4.823,-6.261],[-3.281,-3.819],[-3.624,-6.056],[-5.525,-8.651],[1.4,10.817],[4.487,8.252]],"o":[[-2.183,-0.928],[-2.234,5.444],[1.418,1.467],[3.798,4.42],[3.147,5.258],[3.411,5.34],[-0.805,-6.22],[-2.371,-4.361]],"v":[[-882.26,103.749],[-889.868,105.459],[-898.185,119.307],[-885.95,125.162],[-875.654,139.159],[-866.54,154.43],[-865.829,132.493],[-871.14,114.593]]}],"t":329.336},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.486,0.901],[1.787,-5.345],[3.907,-7.193],[-3.743,-3.364],[-4.37,-5.538],[-7.666,-7.248],[5.945,10.1],[5.508,7.604]],"o":[[-1.208,-0.375],[-2.313,6.764],[1.594,1.272],[4.332,3.894],[3.794,4.808],[4.528,4.333],[-2.873,-5.284],[-2.91,-4.018]],"v":[[-878.128,92.455],[-885.282,94.627],[-891.748,109.423],[-877.785,113.909],[-866.614,125.959],[-854.525,137.676],[-855.808,118.307],[-865.459,100.777]]}],"t":343.309},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.235,1.165],[2.738,-4.931],[4.69,-7.136],[-3.34,-3.768],[-4.986,-4.994],[-8.136,-7.588],[8.423,10.838],[4.615,8.182]],"o":[[0,0],[-4.176,7.523],[1.441,1.445],[3.866,4.36],[4.463,4.469],[4.634,4.322],[-3.849,-4.952],[-2.439,-4.323]],"v":[[-873.287,90.33],[-880.355,91.151],[-888.456,105.128],[-875.628,111.27],[-865.01,124.177],[-852.643,134.872],[-851.282,118.417],[-861.152,98.961]]}],"t":359.277},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.216,2.367],[1.321,-5.603],[3.656,-7.718],[-4.421,-2.45],[-2.89,-2.824],[0,0],[1.661,6.389],[4.31,5.844]],"o":[[-2.11,-0.958],[-2.01,8.239],[1.627,1.231],[3.809,2.11],[6.63,6.48],[0,0],[-1.575,-6.056],[-2.913,-3.95]],"v":[[-879.624,91.614],[-886.247,93.727],[-892.333,108.691],[-878.966,112.986],[-869.825,120.733],[-850.148,139.907],[-858.775,118.575],[-866.488,102.693]]}],"t":375.246},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.087,1.688],[2.074,-5.312],[4.348,-7.35],[-5.045,-1.644],[-5.287,-1.504],[2.311,0.854],[6.394,7.64],[5.53,3.787]],"o":[[-2.218,-0.736],[-3.142,7.908],[1.507,1.375],[4.657,1.394],[8.818,2.509],[-6.97,-2.575],[-4.473,-5.345],[-4.627,-3.169]],"v":[[-884.609,102.06],[-892.734,105.935],[-900.166,120.278],[-886.475,124.264],[-871.517,127.158],[-843.682,140.946],[-859.335,121.055],[-872.956,108.08]]}],"t":391.213},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.828,1.167],[1.234,-3.646],[3.939,-7.577],[-4.798,-0.715],[-4.91,0.319],[1.331,9.403],[10.166,1.66],[4.863,2.527]],"o":[[-3.125,-0.953],[-2.74,8.099],[1.58,1.291],[6.508,0.969],[9.328,-0.946],[-0.94,-6.643],[-5.529,-0.903],[-3.551,-1.846]],"v":[[-889.385,112.483],[-894.823,116.419],[-902.924,131.003],[-888.82,134.592],[-869.135,136.036],[-842.719,131.381],[-862.674,120.392],[-877.988,116.767]]}],"t":405.184},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.336,0.289],[2.481,-5.673],[3.656,-7.718],[-7.571,-6.481],[-3.118,-3.162],[-4.545,-2.559],[1.241,5.726],[3.206,1.465]],"o":[[0,0],[-3.877,8.865],[1.627,1.231],[4.956,4.243],[2.555,2.591],[5.227,2.944],[-0.323,-1.491],[-2.1,-0.96]],"v":[[-887.941,117.822],[-894.111,120.487],[-901.964,135.89],[-883.837,142.71],[-871.559,160.47],[-863.841,169.224],[-865.685,147.466],[-877.879,124.509]]}],"t":419.156},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.046,1.808],[0.622,-6.073],[4.047,-7.52],[-4.811,-7.814],[-2.957,-3.476],[-2.761,3.948],[1.22,6.36],[3.289,2.864]],"o":[[-0.588,-0.205],[-0.872,8.512],[1.562,1.313],[1.842,2.992],[2.679,3.149],[4.715,-6.74],[-0.585,-2.74],[-2.079,-1.81]],"v":[[-890.089,112.861],[-896.453,115.116],[-904.32,130.711],[-887.402,138.919],[-878.784,153.753],[-868.981,163.895],[-870.409,141.781],[-878.961,120.621]]}],"t":431.133},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.959,2.502],[0.454,-6.021],[3.656,-7.718],[-6.601,-5.385],[-3.168,-3.428],[-3.502,4.709],[3.765,9.514],[3.595,3.746]],"o":[[-1.095,-0.319],[-3.661,7.628],[1.627,1.231],[4.546,3.696],[3.071,3.354],[5.316,-7.15],[-2.441,-6.168],[-2.226,-2.32]],"v":[[-887.439,103.592],[-891.69,105.733],[-901.608,122.921],[-884.968,130.677],[-874.839,140.755],[-862.625,153.672],[-865.692,128.452],[-876.195,111.55]]}],"t":441.111},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.595,1.339],[0.807,-5.851],[3.656,-7.718],[-5.631,-4.288],[-2.57,-1.979],[-5.771,5.288],[4.042,5.397],[4.791,3.166]],"o":[[-2.191,-0.639],[-1.223,8.392],[1.627,1.231],[4.136,3.15],[5.52,4.25],[6.22,-5.7],[-3.42,-4.565],[-3.993,-2.639]],"v":[[-874.674,84.871],[-879.518,89.709],[-884.248,100.879],[-869.707,106.45],[-860.198,114.556],[-840.371,126.784],[-848.709,102.885],[-862.597,89.643]]}],"t":463.068},{"s":[{"c":true,"i":[[4.906,1.853],[1.064,-5.727],[3.656,-7.718],[-5.026,-3.369],[-3.884,-3.042],[-1.39,-1.074],[8.124,9.252],[4.287,5.057]],"o":[[-2.151,-0.798],[-1.616,8.316],[1.627,1.231],[3.973,2.63],[5.131,4.018],[0.557,1],[-4.113,-4.684],[-2.947,-3.466]],"v":[[-865.495,81.358],[-872.023,83.587],[-878.109,98.551],[-864.094,103.369],[-852.713,112.829],[-837.057,124.541],[-844.696,105.847],[-852.882,90.77]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":3}},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.68235296011,0.658823549747,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Front fin top","np":3,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.158,1.019],[3.431,9.602],[8.969,19.033],[4.472,10.733],[20.656,1.218],[0,0],[2.145,-10.296],[4.05,-4.683],[-5.203,-6.766],[-3.87,-6.281],[-3.693,-10.053],[-2.456,-11.66],[-6.719,-2.886]],"o":[[10.011,-0.805],[-6.46,-18.081],[-5.389,-11.216],[-6.545,-16.129],[-8.921,-0.526],[4.113,7.436],[-0.966,4.637],[5.79,1.866],[7.232,9.406],[6.786,11.129],[3.578,9.739],[1.399,6.639],[6.364,2.733]],"v":[[-794.524,222.695],[-794.83,188.816],[-823.464,138.836],[-837.033,104.682],[-863.242,71.567],[-880.185,76.361],[-879.656,102.432],[-887.494,117.578],[-870.533,125.762],[-854.416,147.446],[-839.332,175.815],[-832.847,202.257],[-814.975,219.017]]}],"t":-19},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.007,-1.863],[-2.601,21.847],[9.255,21.688],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-4.009,-6.213],[1.973,-11.54],[-5.904,-12.722],[-6.408,-6.237]],"o":[[13.75,2.844],[3.026,-25.421],[-5.145,-12.056],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[7.37,11.422],[-3.468,20.282],[3.21,6.918],[4.74,4.613]],"v":[[-823.342,226.507],[-805.503,189.548],[-817.853,128.155],[-834.021,94.098],[-865.187,62.275],[-880.847,66.829],[-878.149,95.818],[-885.032,111.421],[-867.597,118.537],[-849.625,139.964],[-838.815,169.257],[-853.438,203.188],[-841.768,217.818]]}],"t":-15},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.173,-0.307],[-0.292,20.456],[12.833,18.632],[6.944,9.653],[20.56,-2.336],[0,0],[0.351,-10.511],[3.188,-5.308],[-6.284,-5.775],[-5.113,-5.3],[0.694,-11.687],[-6.003,-10.862],[-6.632,-3.389]],"o":[[13.08,0.502],[0.365,-25.597],[-7.783,-11.107],[-9.824,-13.657],[-8.879,1.009],[5.325,6.622],[-0.158,4.734],[6.024,0.847],[8.736,8.029],[10.089,10.333],[-1.22,20.54],[4.157,7.523],[5.697,2.633]],"v":[[-810.961,203.449],[-790.205,171.167],[-810.462,110.241],[-832.201,79.712],[-866.672,51.503],[-880.017,56.34],[-874.153,84.858],[-879.282,101.122],[-861.171,106.281],[-838.635,124.239],[-822.786,152.996],[-844.395,182.368],[-826.083,199.328]]}],"t":-8},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.341,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-812.7,208.673],[-794.269,182.301],[-811.792,115.203],[-832.435,83.988],[-863.601,52.165],[-875.265,54.124],[-872.567,83.113],[-879.451,98.716],[-862.015,105.832],[-838.78,124.894],[-822.531,161.922],[-844.855,196.789],[-823.956,206.411]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.89,2.029],[8.663,12.792],[15.292,14.622],[6.578,9.906],[20.633,-1.567],[0,0],[0.744,-10.491],[3.385,-5.185],[-6.064,-6.006],[-5.439,-5.009],[-13.943,-17.582],[-9.938,1.212],[-3.61,0.603]],"o":[[7.576,-3.952],[-13.25,-15.548],[-10.238,-9.746],[-9.307,-14.015],[-8.911,0.677],[5.074,6.817],[-0.335,4.725],[5.988,1.071],[8.43,8.35],[11.429,10.525],[13.094,16.511],[7.318,-0.893],[4.328,-0.723]],"v":[[-763.524,181.686],[-765.566,155.136],[-809.99,109.982],[-832.845,80.347],[-866.237,50.87],[-877.728,53.669],[-872.934,82.387],[-878.667,98.448],[-861.269,105.413],[-837.955,124.608],[-802.512,151.864],[-796.425,190.349],[-785.619,188.405]]}],"t":7.984},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.296,4.464],[10.982,5.579],[11.967,14.426],[5.084,10.749],[20.55,-2.419],[0,0],[0.309,-10.513],[3.167,-5.32],[-6.307,-5.75],[-5.642,-4.78],[-10.522,-5.134],[-12.44,-2.874],[-2.337,2.185]],"o":[[4.53,-6.136],[-22.823,-11.595],[-8.812,-10.623],[-7.191,-15.204],[-8.875,1.045],[5.352,6.601],[-0.139,4.734],[6.027,0.823],[8.768,7.993],[11.855,10.043],[10.194,4.974],[6.467,1.494],[5.578,-5.214]],"v":[[-743.782,164.877],[-779.488,148.365],[-820.685,110.863],[-835.426,79.917],[-870.01,51.847],[-881.375,55.12],[-875.397,83.614],[-880.46,99.899],[-863.135,107.002],[-839.919,126.656],[-796.797,154.702],[-757.654,167.969],[-744.989,167.114]]}],"t":13.971},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.402,4.036],[10.008,-1.427],[14.217,10.782],[8.582,9.116],[19.203,-3.47],[0,0],[-0.105,-10.517],[2.955,-5.441],[-6.65,-2.551],[-7.612,-2.689],[-15.628,-2.233],[-10.783,2.975],[-0.778,3.07]],"o":[[1.27,-12.753],[-16.413,2.34],[-9.154,-6.858],[-9.652,-11.231],[-8.755,1.667],[5.608,6.385],[0.047,4.736],[6.055,0.585],[10.619,3.227],[16.169,4.826],[18.942,2.707],[5.72,-0.894],[0.458,-4.626]],"v":[[-737.576,104.15],[-767.578,108.572],[-818.753,96.357],[-839.319,73.254],[-874.29,55.142],[-885.74,59.377],[-878.645,87.614],[-883.063,104.086],[-862.93,107.386],[-837.5,115.892],[-791.62,127.641],[-745.342,122.895],[-737.736,116.316]]}],"t":21.955},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.944,6.464],[13.571,-7.716],[13.942,10.804],[9.775,9.978],[18.347,0.16],[0,0],[2.116,-10.302],[4.036,-4.695],[-6.702,-1.041],[-9.014,-2.789],[-15.84,-2.29],[-10.578,6.241],[-0.138,3.924]],"o":[[-1.103,-9.116],[-16.59,9.433],[-8.154,-5.287],[-9.667,-9.814],[-8.897,0.065],[4.134,7.425],[-0.953,4.64],[5.795,1.849],[12.138,1.405],[19.628,4.321],[25.519,1.46],[5.446,-1.921],[-0.161,-5.662]],"v":[[-735.707,91.387],[-757.985,103.882],[-818.761,102.45],[-840.032,81.631],[-867.701,66.473],[-883.38,72.032],[-882.962,96.358],[-890.756,111.526],[-868.63,116.492],[-841.986,120.49],[-794.891,127.758],[-738.687,118.193],[-733.663,107.201]]}],"t":29.939},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.052,6.512],[14.417,-9.682],[12.293,8.157],[8.629,7.928],[9.682,0.843],[0,0],[3.307,-9.984],[4.558,-4.191],[-7.232,-0.733],[-8.057,-1.635],[-13.506,0.02],[-14.983,11.8],[0.399,3.96]],"o":[[-3.925,-8.95],[-16.771,11.263],[-8.587,-4.208],[-8.746,-7.864],[-5.796,-0.505],[3.237,7.857],[-1.489,4.496],[5.539,2.514],[14.22,0.875],[20.323,1.629],[28.507,-4.155],[5.605,-4.111],[-1.023,-6.439]],"v":[[-744.998,80.924],[-764.37,105.153],[-824.05,110.429],[-844.23,93.454],[-868.543,81.369],[-885.715,84.496],[-887.519,110.357],[-897.034,124.51],[-871.32,130.021],[-842.577,131.541],[-795.615,130.871],[-742.789,113.869],[-738.875,98.019]]}],"t":45.906},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.902,4.872],[8.322,-2.224],[12.785,10.871],[6.171,9.353],[18.608,1.344],[0,0],[2.608,-10.189],[4.257,-4.496],[-6.725,-3.119],[-7.379,-3.404],[-11.374,-2.012],[-19.659,2.886],[-2.976,2.932]],"o":[[1.334,-6.166],[-20.034,5.354],[-8.254,-6.171],[-6.813,-10.965],[-8.89,-0.504],[3.773,7.614],[-1.174,4.589],[5.7,2.125],[12.152,4.625],[13.341,4.439],[17.13,3.03],[4.657,-0.684],[2.915,-4.613]],"v":[[-735.604,127.886],[-758.791,134.377],[-827.949,128.154],[-845.962,103.756],[-873.521,82.237],[-888.804,84.776],[-888.483,113.588],[-896.996,128.365],[-874.568,135.153],[-849.45,145.062],[-815.946,153.906],[-756.441,150.411],[-744.199,143.375]]}],"t":53.891},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.174,3.841],[8.538,1.708],[12.848,13.468],[4.008,10.856],[20.595,2.005],[0,0],[2.537,-10.207],[4.226,-4.526],[-6.357,-5.241],[-6.836,-5.103],[-8.558,-5.687],[-11.847,-3.196],[-5.696,2.228]],"o":[[5.705,-4.338],[-19.613,-3.925],[-7.858,-8.041],[-5.066,-13.724],[-8.894,-0.866],[3.826,7.588],[-1.142,4.597],[5.715,2.085],[10.639,8.102],[8.109,7.547],[9.3,5.596],[6.047,1.631],[6.177,-3.351]],"v":[[-754.735,174.215],[-772.787,165.629],[-829.317,143.001],[-845.077,112.066],[-872.099,83.249],[-887.786,87.351],[-887.958,114.68],[-896.368,129.516],[-876.582,138.468],[-854.086,156.005],[-830.429,174.256],[-794.457,189.376],[-775.142,188.991]]}],"t":59.881},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.556,6.098],[10.589,5.962],[10.657,16.34],[4.11,10.847],[20.608,1.86],[0,0],[2.465,-10.224],[4.194,-4.555],[-5.86,-5.808],[-5.272,-5.727],[-5.988,-7.895],[-7.872,-5.853],[-6.153,-0.413]],"o":[[4.716,-5.176],[-16.142,-9.09],[-6.476,-9.682],[-5.602,-15.007],[-8.9,-0.803],[3.879,7.561],[-1.11,4.605],[5.729,2.045],[8.528,7.848],[7.299,9.412],[6.306,7.688],[5.392,4.009],[6.215,-0.232]],"v":[[-776.005,200.032],[-789.714,183.355],[-831.59,146.816],[-845.828,114.124],[-872.694,81.927],[-888.514,84.679],[-888.525,113.794],[-896.831,128.689],[-878.229,136.895],[-859.531,157.226],[-840.542,180.68],[-819.673,201.429],[-801.346,209.823]]}],"t":67.863},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.177,0.874],[3.236,9.669],[8.584,19.21],[4.255,10.821],[20.628,1.634],[0,0],[2.353,-10.251],[4.144,-4.601],[-5.396,-6.361],[-3.742,-6.358],[-3.49,-10.126],[-2.221,-11.707],[-6.659,-3.021]],"o":[[10.025,-0.603],[-6.094,-18.208],[-5.162,-11.322],[-6.219,-16.258],[-8.908,-0.706],[3.962,7.518],[-1.059,4.616],[5.751,1.982],[6.445,7.598],[6.56,11.263],[3.38,9.809],[1.264,6.666],[6.308,2.861]],"v":[[-805.178,231.838],[-804.8,197.96],[-832.421,147.413],[-845.299,112.992],[-872.196,77.517],[-888.176,80.77],[-887.868,109.883],[-896.009,124.868],[-878.573,132.277],[-863.54,155.397],[-849.031,184.064],[-843.081,210.632],[-825.55,227.749]]}],"t":75.848},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.868,-2.441],[-4.005,21.634],[7.836,22.24],[5.161,10.712],[20.653,1.27],[0,0],[2.172,-10.29],[4.062,-4.673],[-5.185,-6.779],[-3.599,-6.459],[2.714,-11.389],[-5.071,-13.076],[-5.992,-6.637]],"o":[[13.538,3.726],[4.66,-25.172],[-4.356,-12.363],[-7.303,-15.156],[-8.919,-0.549],[4.094,7.447],[-0.978,4.634],[5.785,1.88],[7.208,9.424],[6.617,11.874],[-4.769,20.016],[2.757,7.11],[4.432,4.909]],"v":[[-839.302,239.051],[-819.115,203.32],[-827.478,141.258],[-841.415,106.229],[-870.462,72.461],[-886.383,75.995],[-885.562,105.098],[-893.437,120.224],[-876.498,128.45],[-859.946,150.993],[-851.048,180.922],[-867.831,213.838],[-857.129,229.191]]}],"t":83.832},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.9,-2.32],[-3.712,21.686],[8.137,22.132],[5.306,10.641],[20.668,0.99],[0,0],[2.032,-10.319],[3.998,-4.728],[-5.277,-6.708],[-3.687,-6.41],[2.559,-11.424],[-5.247,-13.007],[-6.081,-6.555]],"o":[[13.587,3.542],[4.319,-25.233],[-4.523,-12.303],[-7.507,-15.056],[-8.926,-0.428],[4.194,7.391],[-0.915,4.647],[5.81,1.802],[7.335,9.326],[6.777,11.783],[-4.498,20.078],[2.853,7.072],[4.498,4.849]],"v":[[-835.394,233.194],[-815.693,197.194],[-824.896,135.251],[-839.305,100.413],[-868.807,67.042],[-884.678,70.791],[-883.463,99.88],[-891.134,115.112],[-874.084,123.108],[-857.228,145.424],[-847.927,175.23],[-864.262,208.37],[-853.353,223.577]]}],"t":89.818},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.121,-1.021],[-1.884,20.371],[11.343,19.575],[6.171,10.164],[20.68,-0.728],[0,0],[1.169,-10.452],[3.592,-5.043],[-5.815,-6.247],[-4.684,-5.682],[1.603,-11.597],[-5.139,-11.297],[-6.348,-3.896]],"o":[[13.001,1.519],[2.357,-25.491],[-6.895,-11.679],[-8.731,-14.381],[-8.93,0.314],[4.793,7.017],[-0.526,4.707],[5.94,1.313],[8.084,8.685],[9.253,11.087],[-2.817,20.383],[3.559,7.824],[5.475,3.069]],"v":[[-824.179,212.678],[-800.972,182.111],[-816.422,119.792],[-835.717,87.662],[-867.887,56.854],[-881.567,60.637],[-877.942,89.525],[-884.322,105.34],[-866.668,111.894],[-845.6,131.553],[-832.038,161.456],[-855.87,189.056],[-838.934,207.391]]}],"t":103.791},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.34,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-815.254,211.782],[-796.823,185.411],[-814.345,118.313],[-834.99,87.098],[-866.155,55.275],[-877.819,57.233],[-875.121,86.222],[-882.005,101.825],[-864.569,108.941],[-841.334,128.004],[-825.085,165.031],[-847.409,199.899],[-826.51,209.52]]}],"t":119.76},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.982,1.842],[8.045,13.19],[14.578,15.334],[6.099,10.208],[20.684,-0.582],[0,0],[1.242,-10.443],[3.628,-5.018],[-5.771,-6.288],[-5.195,-5.263],[-13.09,-18.226],[-9.985,0.738],[-3.634,0.431]],"o":[[7.755,-3.587],[-12.494,-16.161],[-9.762,-10.222],[-8.629,-14.442],[-8.932,0.252],[4.744,7.051],[-0.559,4.703],[5.93,1.355],[8.023,8.741],[10.915,11.058],[12.293,17.116],[7.352,-0.543],[4.357,-0.516]],"v":[[-772.585,190.019],[-773.361,163.402],[-815.584,116.184],[-837.003,85.495],[-868.954,54.462],[-880.565,56.711],[-876.072,84.151],[-882.785,102.965],[-866.588,109.179],[-844.214,129.463],[-810.109,158.375],[-805.861,197.106],[-794.975,195.679]]}],"t":127.744},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.912,3.935],[10.05,7.122],[9.734,16.018],[3.461,11.376],[20.683,0.606],[0,0],[1.839,-10.355],[3.91,-4.801],[-5.401,-6.609],[-4.884,-5.552],[-9.66,-6.615],[-11.887,-4.659],[-2.631,1.82]],"o":[[5.377,-5.41],[-20.887,-14.802],[-7.167,-11.795],[-4.895,-16.091],[-8.932,-0.262],[4.331,7.311],[-0.828,4.663],[5.843,1.693],[7.508,9.187],[10.262,11.666],[9.359,6.408],[6.18,2.422],[6.28,-4.344]],"v":[[-761.76,187.149],[-794.674,165.603],[-829.958,122.491],[-840.025,89.725],[-870.142,56.909],[-881.863,58.487],[-877.765,86.605],[-883.738,104.13],[-871.389,112.476],[-851.29,135.308],[-812.722,169.347],[-775.934,188.184],[-763.281,189.186]]}],"t":133.73},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.819,3.972],[10.102,-0.378],[13.018,12.202],[7.587,9.959],[19.46,-1.454],[0,0],[0.989,-10.47],[3.505,-5.104],[-6.348,-3.228],[-7.291,-3.467],[-15.311,-3.847],[-11.034,1.837],[-1.093,2.972]],"o":[[2.589,-12.552],[-16.568,0.62],[-8.392,-7.772],[-8.432,-12.174],[-8.881,0.747],[4.913,6.934],[-0.445,4.715],[5.961,1.211],[10.225,4.314],[15.58,6.482],[18.558,4.663],[5.781,-0.294],[0.937,-4.553]],"v":[[-741.51,123.882],[-771.809,125.16],[-821.436,107.688],[-839.488,82.572],[-872.385,60.921],[-884.214,63.942],[-880.094,92.764],[-886.202,108.686],[-866.52,114.063],[-842.113,125.168],[-797.703,141.625],[-751.183,141.718],[-742.934,135.966]]}],"t":141.715},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.016,6.453],[13.483,-7.868],[14.062,10.647],[9.886,9.868],[18.347,-0.046],[0,0],[2,-10.325],[3.984,-4.74],[-6.713,-0.966],[-9.044,-2.688],[-15.865,-2.113],[-10.507,6.359],[-0.094,3.925]],"o":[[-1.205,-9.103],[-16.483,9.618],[-8.213,-5.195],[-9.777,-9.705],[-8.895,0.165],[4.217,7.378],[-0.901,4.65],[5.816,1.784],[12.153,1.269],[19.675,4.101],[25.534,1.174],[5.424,-1.982],[-0.225,-5.66]],"v":[[-737.037,93.175],[-759.173,105.919],[-819.962,105.168],[-841.464,84.588],[-873.143,68.389],[-885.532,70.71],[-884.227,99.796],[-891.851,115.051],[-869.67,119.768],[-842.983,123.467],[-795.809,130.207],[-739.716,120.012],[-734.816,108.964]]}],"t":149.699},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.466,6.302],[13.763,-10.592],[12.794,7.348],[9.122,7.355],[15.977,0.347],[0,0],[2.656,-10.176],[4.278,-4.476],[-7.265,-0.266],[-8.145,-1.112],[-13.477,0.891],[-14.191,12.741],[0.653,3.926]],"o":[[-4.494,-8.679],[-16.01,12.321],[-8.84,-3.646],[-9.234,-7.284],[-8.893,0.02],[3.737,7.632],[-1.196,4.583],[5.69,2.152],[14.247,-0.043],[20.386,0.315],[28.179,-5.983],[5.328,-4.463],[-1.436,-6.36]],"v":[[-746.873,73.364],[-764.642,98.791],[-823.859,107.902],[-845.091,92.264],[-873.578,80.592],[-886.643,82.812],[-887.2,111.922],[-895.783,126.658],[-869.767,130.501],[-840.986,130.165],[-794.164,126.469],[-742.544,106.098],[-739.661,90.029]]}],"t":165.666},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.947,4.863],[8.342,-2.148],[12.685,10.987],[6.085,9.409],[18.595,1.514],[0,0],[2.701,-10.164],[4.298,-4.457],[-6.697,-3.181],[-7.347,-3.471],[-11.355,-2.116],[-19.684,2.706],[-3.002,2.905]],"o":[[1.39,-6.154],[-20.082,5.171],[-8.198,-6.246],[-6.712,-11.027],[-8.885,-0.585],[3.703,7.649],[-1.216,4.578],[5.68,2.177],[12.11,4.736],[13.3,4.56],[17.101,3.186],[4.663,-0.641],[2.957,-4.586]],"v":[[-734.405,130.931],[-757.651,137.209],[-826.749,130.355],[-844.538,105.793],[-871.899,84.023],[-886.462,86.13],[-887.147,115.236],[-895.795,129.935],[-873.43,136.928],[-848.403,147.065],[-814.982,156.216],[-755.447,153.264],[-743.141,146.341]]}],"t":173.65},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.006,4.016],[8.603,1.342],[13.412,12.907],[4.468,10.675],[20.662,1.122],[0,0],[2.098,-10.306],[4.028,-4.702],[-6.575,-4.965],[-7.048,-4.806],[-8.793,-5.316],[-11.973,-2.687],[-5.595,2.47]],"o":[[5.515,-4.578],[-19.763,-3.083],[-8.194,-7.697],[-5.649,-13.495],[-8.923,-0.485],[4.147,7.417],[-0.945,4.641],[5.799,1.839],[10.975,7.64],[8.425,7.193],[9.531,5.193],[6.111,1.371],[6.028,-3.612]],"v":[[-752.4,169.727],[-770.803,161.922],[-828.248,141.73],[-845.316,111.498],[-873.546,83.862],[-889.076,86.846],[-888.047,115.942],[-895.814,131.125],[-875.664,139.222],[-852.439,155.781],[-828.023,173.005],[-791.438,186.573],[-772.157,185.362]]}],"t":179.637},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.941,5.724],[10.178,6.639],[9.572,16.999],[3.395,11.092],[20.444,3.197],[0,0],[3.125,-10.042],[4.481,-4.273],[-5.47,-6.177],[-4.888,-6.057],[-5.462,-8.268],[-7.474,-6.353],[-6.113,-0.812]],"o":[[5.043,-4.858],[-15.516,-10.121],[-5.832,-10.083],[-4.613,-15.339],[-8.829,-1.381],[3.379,7.797],[-1.407,4.523],[5.584,2.413],[8,8.386],[6.672,9.867],[5.792,8.082],[5.12,4.351],[6.216,0.173]],"v":[[-781.868,209.196],[-794.463,191.661],[-833.872,152.475],[-845.954,118.926],[-870.667,85.05],[-886.608,84.981],[-888.539,115.819],[-897.796,130.142],[-879.768,139.54],[-862.432,161.045],[-845.009,185.686],[-825.535,207.748],[-807.793,217.317]]}],"t":187.621},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.221,0.349],[2.523,9.88],[7.161,19.785],[3.455,11.102],[20.454,3.133],[0,0],[3.093,-10.052],[4.468,-4.287],[-4.917,-6.737],[-3.269,-6.613],[-2.742,-10.353],[-1.361,-11.838],[-6.421,-3.498]],"o":[[10.042,0.129],[-4.75,-18.604],[-4.323,-11.668],[-5.017,-16.668],[-8.833,-1.353],[3.404,7.786],[-1.393,4.527],[5.592,2.396],[5.874,8.048],[5.722,11.712],[2.656,10.029],[0.775,6.74],[6.082,3.313]],"v":[[-813.778,238.82],[-810.932,205.06],[-834.795,152.634],[-845.13,117.366],[-869.369,80.025],[-885.545,82.104],[-887.359,111.162],[-896.571,125.514],[-879.721,134.174],[-866.413,158.328],[-854.033,187.977],[-850.035,214.908],[-833.798,233.257]]}],"t":195.605},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.725,-2.91],[-5.153,21.389],[6.639,22.627],[4.583,10.972],[20.556,2.37],[0,0],[2.717,-10.16],[4.305,-4.45],[-4.816,-7.046],[-3.25,-6.642],[3.318,-11.228],[-4.366,-13.328],[-5.629,-6.947]],"o":[[13.32,4.443],[5.996,-24.888],[-3.69,-12.578],[-6.484,-15.524],[-8.877,-1.024],[3.691,7.655],[-1.224,4.576],[5.677,2.186],[6.695,9.795],[5.974,12.21],[-5.831,19.733],[2.374,7.247],[4.164,5.139]],"v":[[-847.091,241.594],[-825.026,206.991],[-830.067,144.572],[-842.115,108.848],[-869.319,73.579],[-885.406,76.258],[-886.138,105.363],[-894.81,120.048],[-878.333,129.166],[-863.007,152.56],[-855.719,182.921],[-874.234,214.895],[-864.366,230.797]]}],"t":203.59},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.763,-2.795],[-4.871,21.455],[6.936,22.537],[4.727,10.911],[20.585,2.099],[0,0],[2.583,-10.195],[4.246,-4.506],[-4.909,-6.982],[-3.337,-6.599],[3.169,-11.27],[-4.541,-13.27],[-5.72,-6.873]],"o":[[13.377,4.267],[5.668,-24.965],[-3.856,-12.528],[-6.688,-15.437],[-8.89,-0.907],[3.791,7.605],[-1.164,4.591],[5.705,2.111],[6.824,9.706],[6.135,12.13],[-5.57,19.808],[2.469,7.216],[4.231,5.083]],"v":[[-843.152,235.327],[-821.545,200.437],[-827.407,138.089],[-839.924,102.527],[-867.59,67.619],[-883.64,70.51],[-883.989,99.623],[-892.467,114.42],[-875.872,123.321],[-860.239,146.51],[-852.552,176.773],[-870.644,208.988],[-860.568,224.758]]}],"t":209.578},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.089,-1.277],[-2.457,20.31],[10.787,19.887],[5.882,10.334],[20.692,-0.145],[0,0],[1.463,-10.415],[3.733,-4.94],[-5.637,-6.409],[-4.523,-5.812],[1.929,-11.548],[-4.818,-11.437],[-6.235,-4.073]],"o":[[12.953,1.885],[3.075,-25.414],[-6.563,-11.869],[-8.322,-14.621],[-8.936,0.063],[4.594,7.149],[-0.659,4.69],[5.901,1.48],[7.836,8.909],[8.937,11.343],[-3.39,20.295],[3.337,7.921],[5.386,3.222]],"v":[[-829.051,213.527],[-804.992,183.626],[-818.68,120.897],[-837.062,88.236],[-868.35,56.534],[-882.132,59.929],[-879.323,88.908],[-886.146,104.537],[-868.684,111.586],[-848.177,131.831],[-835.464,162.105],[-860.064,189.022],[-843.652,207.827]]}],"t":223.549},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.117,-1.215],[-3.513,18.363],[11.31,18.607],[5.23,10.679],[20.661,1.138],[0,0],[2.105,-10.304],[4.032,-4.699],[-5.229,-6.746],[-4.739,-5.676],[2.641,-11.406],[-10.18,-9.647],[-5.898,-1.998]],"o":[[11.954,1.593],[4.81,-25.144],[-7.391,-12.159],[-7.4,-15.109],[-8.923,-0.491],[4.142,7.42],[-0.948,4.641],[5.797,1.843],[7.269,9.378],[9.958,11.926],[-4.641,20.046],[9.574,9.073],[5.99,2.029]],"v":[[-822.778,214.701],[-802.845,189.446],[-816.438,121.443],[-835.233,89.08],[-864.496,55.5],[-876.254,56.777],[-875.246,85.874],[-883.025,101.051],[-866.033,109.168],[-843.945,129.549],[-829.875,167.458],[-854.188,200.969],[-833.883,211.789]]}],"t":239.518},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.067,1.645],[7.392,13.567],[13.813,16.027],[5.594,10.493],[20.688,0.427],[0,0],[1.75,-10.37],[3.868,-4.835],[-5.457,-6.562],[-4.932,-5.51],[-12.186,-18.843],[-10.009,0.25],[-3.651,0.253]],"o":[[7.921,-3.204],[-11.691,-16.751],[-9.252,-10.686],[-7.914,-14.846],[-8.934,-0.185],[4.394,7.274],[-0.788,4.67],[5.857,1.643],[7.587,9.122],[10.362,11.577],[11.444,17.695],[7.37,-0.184],[4.377,-0.303]],"v":[[-777.898,196.047],[-777.375,169.423],[-817.244,120.202],[-837.14,88.504],[-867.539,55.949],[-879.246,57.629],[-877.239,86.674],[-884.492,102.109],[-867.845,110.716],[-846.488,132.067],[-813.834,162.609],[-811.481,201.501],[-800.538,200.607]]}],"t":247.502},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.746,4.093],[10.335,6.702],[10.386,15.603],[3.927,11.224],[20.691,-0.247],[0,0],[1.411,-10.422],[3.708,-4.958],[-5.668,-6.381],[-5.109,-5.346],[-9.924,-6.211],[-12.069,-4.165],[-2.554,1.927]],"o":[[5.15,-5.627],[-21.479,-13.928],[-7.648,-11.49],[-5.555,-15.875],[-8.935,0.107],[4.629,7.127],[-0.635,4.694],[5.908,1.451],[7.88,8.87],[10.734,11.233],[9.615,6.017],[6.275,2.165],[6.095,-4.6]],"v":[[-757.221,183.138],[-790.996,162.967],[-828.026,121.346],[-839.436,89.023],[-870.88,57.476],[-882.526,59.536],[-879.573,88.501],[-886.319,104.164],[-869.835,113.048],[-848.812,135.031],[-808.874,167.451],[-771.341,184.756],[-758.657,185.235]]}],"t":253.49},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.137,3.893],[10.099,0.437],[11.992,13.211],[6.76,10.538],[19.514,0.119],[0,0],[1.83,-10.357],[3.905,-4.805],[-6.067,-3.729],[-6.988,-4.043],[-14.951,-5.068],[-11.146,0.942],[-1.329,2.875]],"o":[[3.593,-12.302],[-16.564,-0.717],[-7.738,-8.423],[-7.423,-12.814],[-8.912,0.029],[4.338,7.307],[-0.824,4.664],[5.844,1.688],[9.844,5.124],[15.007,7.716],[18.122,6.143],[5.786,0.173],[1.301,-4.463]],"v":[[-747.695,136.307],[-777.998,135.139],[-826.056,113.724],[-842.025,87.235],[-873.07,63.004],[-885.104,65.061],[-883.32,94.121],[-890.691,109.5],[-871.507,116.445],[-848.075,129.481],[-805.136,149.463],[-758.774,153.305],[-750.088,148.237]]}],"t":261.475},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.652,6.5],[13.904,-7.097],[13.441,11.421],[9.316,10.408],[18.321,0.986],[0,0],[2.578,-10.196],[4.244,-4.508],[-6.648,-1.342],[-8.879,-3.193],[-15.721,-3.002],[-10.848,5.758],[-0.315,3.914]],"o":[[-0.691,-9.157],[-16.998,8.676],[-7.907,-5.649],[-9.215,-10.239],[-8.891,-0.336],[3.795,7.603],[-1.161,4.592],[5.706,2.108],[12.062,1.951],[19.414,5.201],[25.427,2.608],[5.527,-1.674],[0.094,-5.663]],"v":[[-740.547,104.111],[-763.365,115.59],[-824.015,111.42],[-844.326,89.664],[-875.043,71.708],[-887.543,73.329],[-887.876,102.442],[-896.346,117.244],[-874.466,123.201],[-848.029,128.396],[-801.309,137.779],[-744.732,130.755],[-739.218,120.001]]}],"t":269.459},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.754,6.644],[14.841,-9.019],[11.911,8.706],[8.261,8.311],[15.843,2.097],[0,0],[3.756,-9.824],[4.743,-3.98],[-7.192,-1.06],[-7.974,-1.999],[-13.493,-0.592],[-15.503,11.108],[0.219,3.974]],"o":[[-3.515,-9.119],[-17.264,10.491],[-8.387,-4.594],[-8.38,-8.253],[-8.842,-0.955],[2.878,7.996],[-1.691,4.424],[5.42,2.763],[14.166,1.519],[20.228,2.548],[28.666,-2.858],[5.785,-3.852],[-0.73,-6.479]],"v":[[-749.701,96.975],[-770.151,120.3],[-830.009,122.865],[-849.399,104.993],[-873.502,87.857],[-888.432,90.16],[-893.409,119.915],[-903.556,133.622],[-878.118,140.294],[-849.474,143.116],[-802.529,144.575],[-748.987,129.987],[-744.359,114.33]]}],"t":285.426},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1,4.853],[8.364,-2.057],[12.565,11.124],[5.983,9.475],[18.578,1.717],[0,0],[2.812,-10.134],[4.346,-4.41],[-6.662,-3.253],[-7.309,-3.551],[-11.331,-2.239],[-19.713,2.491],[-3.034,2.872]],"o":[[1.457,-6.138],[-20.137,4.952],[-8.129,-6.335],[-4.038,-12.389],[-8.878,-0.682],[3.62,7.688],[-1.266,4.564],[5.656,2.239],[12.057,4.867],[13.249,4.705],[17.066,3.372],[4.669,-0.59],[3.006,-4.553]],"v":[[-741.669,140.889],[-764.981,146.914],[-834.001,139.308],[-850.013,112.835],[-875.692,90.477],[-890.277,92.425],[-894.231,123.532],[-903.038,138.136],[-880.751,145.372],[-855.836,155.781],[-822.516,165.295],[-762.952,162.992],[-750.572,156.203]]}],"t":293.41},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.259,3.747],[8.498,1.898],[12.545,13.751],[3.765,10.943],[20.545,2.463],[0,0],[2.764,-10.147],[4.326,-4.43],[-4.426,-7.152],[-6.72,-5.254],[-10.121,-4.789],[-11.773,-3.459],[-5.744,2.101]],"o":[[5.801,-4.21],[-19.521,-4.361],[-7.677,-8.214],[-4.76,-13.833],[-8.873,-1.064],[3.656,7.671],[-1.245,4.57],[5.667,2.212],[4.793,7.746],[7.939,7.726],[11.757,5.563],[6.009,1.766],[6.25,-3.212]],"v":[[-757.947,186.122],[-775.803,177.136],[-836.407,157.946],[-846.881,121.975],[-873.254,92.563],[-888.946,94.531],[-891.964,122.584],[-902.818,139.753],[-880.007,150.537],[-863.613,169.347],[-834.318,186.269],[-797.997,200.394],[-778.678,200.439]]}],"t":299.396},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-6.138,5.512],[9.939,6.991],[8.971,17.324],[3.005,11.204],[20.319,3.911],[0,0],[3.474,-9.927],[4.628,-4.113],[-5.25,-6.364],[-4.673,-6.225],[-5.169,-8.454],[-7.247,-6.61],[-6.081,-1.026]],"o":[[5.21,-4.679],[-15.153,-10.658],[-5.476,-10.28],[-4.073,-15.491],[-8.775,-1.689],[3.104,7.911],[-1.565,4.471],[5.496,2.607],[7.701,8.661],[6.322,10.095],[5.506,8.28],[4.964,4.528],[6.207,0.39]],"v":[[-789.748,220.85],[-801.721,202.885],[-839.735,162.344],[-850.634,128.393],[-873.317,91.937],[-889.334,93.094],[-893.301,121.635],[-904.975,137.647],[-885.149,147.811],[-868.576,169.909],[-852.027,195.144],[-833.337,217.875],[-815.941,228.058]]}],"t":307.381},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.227,0.188],[2.302,9.933],[6.718,19.939],[3.206,11.176],[20.379,3.588],[0,0],[3.317,-9.98],[4.562,-4.186],[-4.766,-6.845],[-3.121,-6.685],[-2.511,-10.411],[-1.097,-11.865],[-6.342,-3.64]],"o":[[10.037,0.353],[-4.335,-18.705],[-4.062,-11.762],[-4.645,-16.776],[-8.801,-1.55],[3.229,7.86],[-1.494,4.495],[5.537,2.52],[5.693,8.177],[5.459,11.836],[2.432,10.086],[0.625,6.756],[6.007,3.448]],"v":[[-823.623,247.89],[-820.025,214.202],[-842.713,161.257],[-852.26,125.767],[-873.429,85.784],[-889.997,87.434],[-894.34,118.624],[-903.87,132.767],[-887.217,141.8],[-874.451,166.245],[-862.734,196.162],[-859.337,223.175],[-843.514,241.882]]}],"t":315.365},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.497,-3.521],[-6.656,20.97],[5.019,23.04],[3.794,11.269],[20.336,3.821],[0,0],[3.431,-9.942],[4.61,-4.134],[-4.305,-7.37],[-2.771,-6.856],[4.105,-10.964],[-3.41,-13.604],[-5.123,-7.329]],"o":[[12.972,5.375],[7.745,-24.4],[-2.79,-12.808],[-5.367,-15.945],[-8.782,-1.65],[3.139,7.897],[-1.545,4.477],[5.508,2.583],[5.984,10.245],[5.094,12.602],[-7.214,19.27],[1.854,7.397],[3.789,5.421]],"v":[[-863.282,250.728],[-838.821,217.776],[-839.426,155.156],[-848.912,118.669],[-871.291,79.774],[-888.125,81.836],[-892.578,112.074],[-902.268,126.107],[-886.479,136.37],[-872.85,160.79],[-867.731,191.592],[-888.465,222.173],[-879.749,238.734]]}],"t":323.35},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.729,-2.899],[-5.127,21.396],[6.667,22.618],[4.596,10.967],[20.559,2.345],[0,0],[2.705,-10.163],[4.3,-4.455],[-4.825,-7.04],[-3.258,-6.638],[3.303,-11.232],[-4.383,-13.323],[-5.638,-6.94]],"o":[[13.326,4.426],[5.965,-24.895],[-3.706,-12.573],[-6.503,-15.516],[-8.879,-1.013],[3.7,7.65],[-1.218,4.577],[5.68,2.179],[6.708,9.787],[5.99,12.202],[-5.806,19.74],[2.383,7.244],[4.17,5.133]],"v":[[-851.464,241.363],[-829.442,206.733],[-834.561,144.319],[-846.653,108.611],[-873.902,73.376],[-889.985,76.075],[-890.681,105.182],[-899.335,119.877],[-882.846,128.975],[-867.492,152.349],[-860.165,182.701],[-878.64,214.698],[-868.752,230.588]]}],"t":329.336},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.039,-1.597],[-3.171,20.211],[10.08,20.255],[5.515,10.535],[20.684,0.584],[0,0],[1.828,-10.357],[3.904,-4.806],[-5.408,-6.603],[-4.315,-5.968],[2.334,-11.473],[-4.413,-11.599],[-6.088,-4.29]],"o":[[12.879,2.34],[3.968,-25.29],[-6.141,-12.093],[-7.802,-14.905],[-8.933,-0.252],[4.339,7.307],[-0.823,4.664],[5.845,1.687],[7.517,9.179],[8.533,11.651],[-4.102,20.163],[3.056,8.033],[5.269,3.41]],"v":[[-839.874,219.599],[-814.778,190.563],[-826.249,127.391],[-843.471,94.104],[-873.624,61.32],[-887.517,64.228],[-885.729,93.288],[-893.098,108.668],[-875.895,116.327],[-856.114,137.28],[-844.474,167.983],[-870.006,194.018],[-854.266,213.389]]}],"t":343.309},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.047,-1.655],[-4.399,18.171],[10.395,19.133],[4.706,10.92],[20.582,2.138],[0,0],[2.603,-10.19],[4.255,-4.498],[-4.896,-6.991],[-4.459,-5.899],[3.19,-11.264],[-9.701,-10.13],[-5.794,-2.281]],"o":[[11.863,2.17],[6.023,-24.881],[-6.793,-12.503],[-6.659,-15.45],[-8.888,-0.923],[3.777,7.612],[-1.172,4.589],[5.701,2.122],[6.806,9.719],[9.369,12.395],[-5.607,19.798],[9.123,9.526],[5.885,2.317]],"v":[[-835.363,221.847],[-814.229,197.587],[-824.51,129.005],[-841.714,95.77],[-868.504,60.025],[-880.76,58.966],[-881.525,90.628],[-890.03,105.41],[-873.451,114.341],[-852.377,135.768],[-840.162,174.315],[-866.07,206.608],[-846.313,218.4]]}],"t":359.277},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.087,1.596],[7.226,13.655],[13.617,16.194],[5.466,10.56],[20.681,0.679],[0,0],[1.876,-10.348],[3.926,-4.787],[-5.377,-6.628],[-4.864,-5.569],[-11.956,-18.989],[-10.011,0.128],[-3.654,0.209]],"o":[[7.959,-3.108],[-11.486,-16.892],[-9.121,-10.798],[-7.733,-14.941],[-8.931,-0.293],[4.305,7.327],[-0.845,4.661],[5.837,1.714],[7.475,9.214],[10.221,11.702],[11.228,17.833],[7.371,-0.094],[4.38,-0.25]],"v":[[-784.821,200.445],[-783.975,173.83],[-823.243,124.127],[-842.751,92.19],[-872.752,59.268],[-884.479,60.805],[-882.825,89.873],[-891.933,106.61],[-873.725,114.028],[-852.628,135.637],[-820.348,166.573],[-818.468,205.491],[-807.515,204.73]]}],"t":367.262},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.791,4.051],[10.26,6.816],[10.212,15.717],[3.802,11.266],[20.692,-0.018],[0,0],[1.527,-10.406],[3.763,-4.917],[-5.597,-6.443],[-5.049,-5.402],[-9.855,-6.32],[-12.022,-4.298],[-2.575,1.899]],"o":[[5.212,-5.569],[-21.324,-14.165],[-7.52,-11.574],[-5.378,-15.936],[-8.936,0.008],[4.55,7.177],[-0.688,4.686],[5.891,1.516],[7.781,8.957],[10.609,11.351],[9.548,6.123],[6.25,2.235],[6.146,-4.532]],"v":[[-763.411,187.239],[-796.96,166.696],[-833.528,124.667],[-844.578,92.219],[-875.671,60.326],[-887.339,62.258],[-884.707,91.253],[-892.368,108.255],[-875.242,115.906],[-854.464,138.121],[-814.887,170.982],[-777.548,188.701],[-764.87,189.321]]}],"t":373.248},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.163,3.885],[10.096,0.505],[11.903,13.292],[6.688,10.584],[19.513,0.251],[0,0],[1.9,-10.344],[3.937,-4.778],[-6.042,-3.77],[-6.961,-4.09],[-14.917,-5.169],[-11.152,0.866],[-1.349,2.865]],"o":[[3.676,-12.278],[-16.559,-0.829],[-7.681,-8.476],[-7.336,-12.864],[-8.912,-0.031],[4.289,7.336],[-0.856,4.659],[5.833,1.727],[9.809,5.191],[14.954,7.817],[18.08,6.265],[5.785,0.212],[1.331,-4.454]],"v":[[-752.743,139.144],[-783.038,137.771],[-830.95,116.032],[-846.739,89.435],[-877.62,64.994],[-889.667,66.97],[-888.08,96.042],[-895.555,111.37],[-876.418,118.445],[-853.075,131.639],[-810.272,151.911],[-763.937,156.067],[-755.217,151.057]]}],"t":381.232},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.685,6.496],[13.868,-7.169],[13.5,11.351],[9.369,10.36],[18.326,0.892],[0,0],[2.525,-10.209],[4.221,-4.53],[-6.655,-1.308],[-7.369,-4.343],[-16.886,0.678],[-10.818,5.814],[-0.294,3.915]],"o":[[-0.738,-9.153],[-16.953,8.763],[-7.937,-5.608],[-9.268,-10.192],[-8.892,-0.29],[3.835,7.584],[-1.137,4.598],[5.717,2.079],[12.072,1.888],[16.591,9.779],[19.784,-0.795],[5.518,-1.702],[0.065,-5.664]],"v":[[-744.376,104.171],[-767.135,115.768],[-827.806,111.912],[-848.229,90.26],[-876.346,70.744],[-891.53,74.148],[-891.713,103.263],[-900.106,118.108],[-878.195,123.952],[-855.764,135.754],[-807.398,149.181],[-748.424,130.837],[-742.966,120.054]]}],"t":389.217},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.196,6.443],[14.199,-9.999],[12.471,7.884],[8.802,7.735],[15.948,1.024],[0,0],[3.085,-10.055],[4.464,-4.29],[-7.247,-0.573],[-8.091,-1.456],[-13.502,0.319],[-14.718,12.128],[0.486,3.951]],"o":[[-4.122,-8.861],[-16.518,11.631],[-8.678,-4.018],[-8.917,-7.669],[-8.886,-0.357],[3.41,7.784],[-1.389,4.528],[5.594,2.391],[14.236,0.56],[20.354,1.179],[28.408,-4.784],[5.512,-4.234],[-1.165,-6.415]],"v":[[-753.182,84.09],[-772.013,108.741],[-831.562,115.335],[-852.112,98.811],[-879.846,84.173],[-892.993,85.837],[-895.017,116.667],[-904.216,131.027],[-878.386,135.968],[-849.617,136.852],[-802.681,135.143],[-750.244,116.978],[-746.682,101.045]]}],"t":405.184},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.003,4.852],[8.366,-2.052],[12.559,11.132],[5.977,9.478],[18.577,1.727],[0,0],[2.817,-10.133],[4.349,-4.407],[-6.66,-3.257],[-7.307,-3.555],[-11.461,-1.435],[-20.331,4.854],[-3.036,2.87]],"o":[[1.46,-6.137],[-20.14,4.94],[-8.125,-6.339],[-6.586,-11.103],[-8.878,-0.687],[3.616,7.69],[-1.269,4.563],[5.655,2.242],[12.055,4.874],[13.247,4.712],[24.941,3.122],[4.578,-1.093],[3.009,-4.552]],"v":[[-742.792,137.474],[-766.108,143.486],[-835.124,135.841],[-852.63,111.077],[-878.289,87.227],[-892.875,89.166],[-895.344,120.031],[-904.16,134.63],[-881.877,141.878],[-856.968,152.302],[-823.654,161.835],[-764.088,159.565],[-751.704,152.783]]}],"t":413.168},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.027,8.423],[16.173,-5.024],[14.885,11.866],[2.353,10.858],[20.638,1.499],[0,0],[2.286,-10.266],[4.113,-4.628],[-5.11,-6.836],[-4.487,-5.877],[-6.964,-4.569],[-13.924,-1.688],[-10.922,6.918]],"o":[[13.415,-14.076],[-28.095,8.727],[-9.811,-7.822],[-4.099,-18.914],[-8.913,-0.647],[4.011,7.492],[-1.029,4.623],[5.764,1.944],[7.104,9.503],[7.042,9.224],[18.037,11.835],[12.668,1.536],[11.134,-7.053]],"v":[[-755.993,176.283],[-775.073,165.58],[-842.789,156.298],[-855.609,124.91],[-878.494,86.284],[-894.453,89.641],[-893.955,118.751],[-902.97,135.979],[-885.15,142.203],[-870.651,161.844],[-849.751,184.663],[-807.75,203.113],[-783.064,196.889]]}],"t":419.156},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.892,3.84],[7.852,3.556],[8.268,16.842],[2.566,11.11],[20.402,3.451],[0,0],[3.249,-10.003],[4.534,-4.217],[-4.438,-7.29],[-3.436,-6.523],[-9.07,-13.026],[-8.837,-7.242],[-8.834,1.611]],"o":[[7.01,-4.568],[-16.498,-7.472],[-5.259,-10.713],[-3.859,-17.643],[-8.811,-1.49],[3.282,7.838],[-1.463,4.505],[5.554,2.482],[6.17,10.134],[5.755,11.09],[4.836,6.945],[7.034,5.764],[11.251,-2.051]],"v":[[-783.11,217.048],[-801.341,199.79],[-845.689,156.808],[-855.112,122.268],[-877.117,83.497],[-893.323,85.324],[-895.589,114.351],[-906.047,130.571],[-889.049,138.532],[-875.779,160.972],[-857.62,189.944],[-831.087,220.915],[-804.835,224.844]]}],"t":433.129},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.194,0.716],[3.023,9.738],[8.16,19.394],[4.016,10.911],[20.587,2.087],[0,0],[2.577,-10.196],[4.244,-4.509],[-4.913,-6.979],[-3.602,-6.438],[-3.266,-10.2],[-1.963,-11.753],[-6.591,-3.166]],"o":[[10.036,-0.383],[-5.692,-18.337],[-4.911,-11.433],[-5.86,-16.391],[-8.891,-0.901],[3.796,7.603],[-1.161,4.592],[5.706,2.108],[6.83,9.702],[6.311,11.405],[3.164,9.881],[1.118,6.692],[6.243,2.999]],"v":[[-810.709,230.026],[-809.587,196.165],[-836.09,145.023],[-848.208,110.327],[-872.998,76.137],[-889.99,78.746],[-892.145,105.015],[-902.138,123.067],[-879.474,134.096],[-867.377,152.32],[-853.502,181.3],[-848.137,207.992],[-830.987,225.49]]}],"t":441.111},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.746,-2.846],[-4.997,21.426],[6.804,22.577],[4.663,10.939],[20.573,2.22],[0,0],[2.643,-10.18],[4.273,-4.481],[-4.868,-7.011],[-3.298,-6.618],[3.235,-11.252],[-4.463,-13.296],[-5.68,-6.906]],"o":[[13.352,4.345],[5.814,-24.931],[-3.782,-12.551],[-6.597,-15.476],[-8.885,-0.959],[3.747,7.627],[-1.19,4.584],[5.693,2.145],[6.767,9.746],[6.063,12.166],[-5.686,19.775],[2.427,7.23],[4.201,5.108]],"v":[[-849.967,235.477],[-828.156,200.715],[-833.652,138.334],[-845.961,102.699],[-873.423,67.63],[-889.489,70.426],[-890.009,99.537],[-898.573,114.284],[-882.03,123.282],[-866.534,146.562],[-859.024,176.87],[-877.304,208.978],[-867.32,224.807]]}],"t":449.096},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.148,-0.746],[-1.272,20.419],[11.925,19.226],[6.473,9.975],[20.648,-1.348],[0,0],[0.855,-10.482],[3.439,-5.149],[-6,-6.07],[-4.853,-5.539],[1.254,-11.64],[-5.475,-11.137],[-6.462,-3.703]],"o":[[13.041,1.128],[1.591,-25.55],[-7.242,-11.467],[-9.158,-14.112],[-8.917,0.582],[5.002,6.87],[-0.385,4.721],[5.976,1.135],[8.341,8.438],[9.582,10.804],[-2.203,20.458],[3.792,7.713],[5.564,2.903]],"v":[[-822.473,207.644],[-800.194,176.394],[-817.508,114.567],[-837.759,83.031],[-870.839,53.203],[-884.4,57.394],[-879.909,86.16],[-885.812,102.16],[-867.969,108.181],[-846.319,127.199],[-831.867,156.682],[-854.859,184.985],[-837.381,202.803]]}],"t":463.068},{"s":[{"c":true,"i":[[-9.172,-0.683],[-2.44,18.536],[12.373,17.918],[5.842,10.357],[20.692,-0.065],[0,0],[1.503,-10.409],[3.752,-4.926],[-5.612,-6.43],[-5.061,-5.391],[1.973,-11.54],[-10.724,-9.039],[-6.004,-1.652]],"o":[[12.026,0.895],[3.341,-25.381],[-8.085,-11.709],[-8.266,-14.653],[-8.936,0.028],[4.566,7.167],[-0.677,4.688],[5.895,1.503],[7.802,8.939],[10.635,11.327],[-3.468,20.282],[10.085,8.501],[6.098,1.678]],"v":[[-812.7,208.673],[-794.269,182.301],[-811.792,115.203],[-832.435,83.988],[-863.601,52.165],[-875.265,54.124],[-872.567,83.113],[-879.451,98.716],[-862.015,105.832],[-838.78,124.894],[-822.531,161.922],[-844.855,196.789],[-823.956,206.411]]}],"t":479.037109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0,0.831372559071,0.709803938866,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0.075,0.089]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Front fin bottom","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":33,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1042.089,166.545,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[-1070.661,116.187,0]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[18],"t":0},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[61],"t":59.754},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[15],"t":119.76},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[63],"t":179.264},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[15],"t":239.518},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[56],"t":299.396},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[15],"t":359.277},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[55],"t":419.156},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[18],"t":479},{"s":[14],"t":479.037109375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Back leg","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.43,-1.058],[7.906,-10.49],[12.734,-10.672],[14.247,-7.798],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-11.171,11.101],[-5.963,17.173],[2.357,1.507],[8.29,2.032]],"o":[[-3.265,10.739],[-9.743,12.928],[-9.486,7.95],[-17.304,9.471],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[15.06,-14.966],[5.261,-15.152],[-7.068,-4.518],[-8.506,-2.085]],"v":[[-966.566,42.779],[-982.43,74.206],[-1007.796,99.802],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-974.016,158.919],[-938.577,100.937],[-927.397,51.506],[-946.166,42.903]]}],"t":0},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.396,1.189],[11.39,-6.542],[12.781,-8.108],[10.101,-6.863],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-11.171,11.101],[-12.228,13.451],[1.35,2.45],[6.309,5.748]],"o":[[-10.021,5.672],[-14.037,8.062],[-10.368,6.577],[-16.317,11.085],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[15.06,-14.966],[10.789,-11.868],[-4.047,-7.347],[-6.473,-5.898]],"v":[[-934.252,54.878],[-966.86,73.386],[-1008.008,97.993],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-974.016,158.919],[-934.795,118.262],[-904.022,81.271],[-916.393,64.741]]}],"t":59.881},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.513,-0.613],[7.118,-8.877],[12.781,-8.108],[10.836,-6.564],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-10.2,11.999],[-8.231,16.208],[2.196,1.733],[8.047,2.844]],"o":[[-2.346,12.532],[-10.127,12.629],[-10.368,6.577],[-16.872,10.221],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[13.094,-15.404],[7.304,-14.384],[-6.585,-5.197],[-8.257,-2.918]],"v":[[-965.101,41.775],[-978.396,72.344],[-1007.891,99.81],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-974.016,158.919],[-937.004,103.315],[-922.794,55.526],[-940.617,45.103]]}],"t":119.76},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.309,1.476],[9.65,-6.563],[12.781,-8.108],[10.836,-6.564],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-14.568,13.961],[-13.047,13.947],[1.185,2.534],[5.917,6.151]],"o":[[-11.006,8.562],[-13.385,9.104],[-10.368,6.577],[-16.872,10.221],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[14.597,-13.988],[14.539,-15.541],[-3.555,-7.598],[-6.071,-6.311]],"v":[[-935.511,51.875],[-962.904,70.781],[-1007.891,99.81],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-974.016,158.919],[-933.909,118.671],[-903.222,82.665],[-915.12,65.83]]}],"t":179.637},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.541,-0.343],[6.13,-9.058],[13.157,-9.352],[10.836,-6.564],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-13.748,14.77],[-8.655,17.024],[2.089,1.861],[7.863,3.319]],"o":[[-3.187,13.629],[-9.073,13.406],[-10.007,7.113],[-16.872,10.221],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[15.669,-16.833],[9.644,-18.971],[-6.263,-5.58],[-8.068,-3.406]],"v":[[-965.295,40.955],[-977.526,70.708],[-1007.866,101.283],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-974.016,158.919],[-937.67,107.89],[-923.48,56.516],[-941.053,45.738]]}],"t":239.518},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.116,1.95],[10.762,-6.77],[15.507,-8.124],[10.836,-6.564],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-14.952,13.55],[-14.334,12.62],[0.894,2.651],[5.189,6.776]],"o":[[-11.52,8.362],[-13.702,8.62],[-10.876,5.697],[-16.872,10.221],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[18.239,-16.53],[16.621,-14.633],[-2.68,-7.949],[-5.324,-6.953]],"v":[[-931.061,57.799],[-962.382,76.575],[-1007.866,101.283],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-972.928,159.222],[-932.891,123.359],[-901.905,94.244],[-912.366,73.955]]}],"t":299.396},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.554,-0.081],[7.449,-9.873],[13.847,-9.537],[10.836,-6.564],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-13.546,14.955],[-11.326,20.908],[1.978,1.978],[7.659,3.766]],"o":[[-5.37,14.103],[-9.75,12.922],[-10.112,6.964],[-16.872,10.221],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[19.362,-21.375],[10.547,-19.471],[-5.931,-5.931],[-7.859,-3.864]],"v":[[-962.601,45.151],[-977.095,72.533],[-1009.061,102.342],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-972.928,159.222],[-935.373,108.073],[-920.29,64.852],[-938.674,51.32]]}],"t":359.277},{"i":{"x":0.833,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[4.114,1.954],[10.749,-6.905],[16.015,-9.241],[10.836,-6.564],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-14.519,14.013],[-17.771,15.799],[0.891,2.652],[5.183,6.781]],"o":[[-12.044,7.494],[-13.62,8.749],[-10.635,6.136],[-16.872,10.221],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[19.725,-19.038],[15.72,-13.976],[-2.672,-7.951],[-5.318,-6.958]],"v":[[-936.262,57.204],[-965.99,75.902],[-1009.061,102.342],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1010.154,192.767],[-977.669,162.878],[-933.809,122.068],[-907.139,93.675],[-917.581,73.376]]}],"t":419.156},{"s":[{"c":true,"i":[[4.43,-1.058],[7.906,-10.49],[12.734,-10.672],[14.247,-7.798],[-0.583,-3.38],[-3.396,-7.33],[-11.429,9.554],[-11.171,11.101],[-5.963,17.173],[2.357,1.507],[8.29,2.032]],"o":[[-3.265,10.739],[-9.743,12.928],[-9.486,7.95],[-17.304,9.471],[2.363,13.687],[5.477,11.822],[6.578,-5.499],[15.06,-14.966],[5.261,-15.152],[-7.068,-4.518],[-8.506,-2.085]],"v":[[-966.566,42.779],[-982.43,74.206],[-1007.796,99.802],[-1044.397,121.846],[-1045.575,142.755],[-1036.241,166.163],[-1009.071,193.089],[-974.016,158.919],[-938.577,100.937],[-927.397,51.506],[-946.166,42.903]]}],"t":479}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Back leg","np":3,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":34,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-1317.804,73.33,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":1,"ix":2,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1261.998,119.472,0],"t":0,"ti":[0.128,-0.333,0],"to":[-0.427,1.111,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1264.557,126.141,0],"t":59.881,"ti":[-0.085,0.222,0],"to":[-0.128,0.333,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1262.766,121.473,0],"t":119.76,"ti":[-0.341,0.889,0],"to":[0.085,-0.222,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1264.045,124.807,0],"t":179.637,"ti":[-0.231,-0.726,0],"to":[0.341,-0.889,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1260.718,116.138,0],"t":239.518,"ti":[0.564,-0.804,0],"to":[0.231,0.726,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1262.658,129.165,0],"t":299.396,"ti":[0.068,0.154,0],"to":[-0.564,0.804,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1264.099,120.961,0],"t":359.277,"ti":[-0.35,0.248,0],"to":[-0.068,-0.154,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.48,"y":0},"s":[-1263.069,128.242,0],"t":419.156,"ti":[0.172,1.214,0],"to":[0.35,-0.248,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"s":[-1261.998,119.472,0],"t":479,"ti":[0.35,-0.248,0],"to":[-0.172,-1.214,0]},{"s":[-1264.099,120.961,0],"t":479.037109375}]},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-126],"t":0},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-120],"t":59.881},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-125.5],"t":119.76},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-121],"t":179.637},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-127],"t":239.518},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-119.5],"t":299.396},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-125],"t":359.277},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-120.5],"t":419.156},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"s":[-126],"t":479},{"s":[-126],"t":479.037109375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Back arm","op":480,"parent":30,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[21.814,-4.558],[12.143,-1.898],[17.84,-4.69],[-0.514,-7.034],[-7.04,-1.792],[-11.588,-1.028],[-19.889,1.3],[-18.276,1.474],[-1.349,8.767],[2.43,3.536],[3.497,2.459],[4.261,0.348]],"o":[[-16.184,3.382],[-13.494,2.11],[-12.611,3.316],[0.8,10.961],[11.716,2.982],[11.909,1.057],[17.176,-1.123],[13.818,-1.114],[0.395,-2.565],[-2.421,-3.523],[-3.497,-2.459],[-8.855,-0.723]],"v":[[-1374.915,63.68],[-1416.275,69.233],[-1459.113,76.912],[-1474,94.406],[-1452.362,110.958],[-1421.002,115.305],[-1383.65,115.109],[-1296.239,107.281],[-1284.742,89.252],[-1291.818,73.781],[-1301.603,65.43],[-1328.18,55.741]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.180392161012,0.372549027205,0.847058832645,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"bm":0,"c":{"a":0,"ix":4,"k":[0.980392158031,0.674509823322,0.282352954149,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Back arm","np":3,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-1385.801,84.442]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-1385.801,84.442]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Back arm","np":1,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":35,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-419,819,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.696],"y":[0.637]},"o":{"x":[0.326],"y":[0.279]},"s":[144.166],"t":30},{"i":{"x":[0.814],"y":[0.723]},"o":{"x":[0.429],"y":[0.303]},"s":[352.279],"t":344},{"i":{"x":[0.983],"y":[0.868]},"o":{"x":[0.584],"y":[0.324]},"s":[452],"t":433},{"s":[545],"t":464}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.801],"y":[-0.511]},"o":{"x":[0.418],"y":[0.109]},"s":[418],"t":30},{"i":{"x":[0.781],"y":[0.546]},"o":{"x":[0.504],"y":[0.19]},"s":[429],"t":342},{"i":{"x":[0.983],"y":[0.865]},"o":{"x":[0.456],"y":[0.17]},"s":[493.659],"t":433},{"s":[616],"t":464}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.701],"y":[0.014]},"o":{"x":[0.361],"y":[0.129]},"s":[0],"t":30},{"i":{"x":[0.9],"y":[0.679]},"o":{"x":[0.605],"y":[0.068]},"s":[2.414],"t":342},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.362],"y":[0.223]},"s":[23.192],"t":433},{"s":[60],"t":464}]},"s":{"a":0,"ix":6,"k":[20,20,100]}},"nm":"Angler fish 2","op":480,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-12.901,26.049],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.023,5.928]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-605.035,808.5],[-582.035,808.413],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-604.849,857.5]]}],"t":155},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-7.905,27.974],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.787,2.338]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-608.476,814.087],[-585.882,809.783],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-599.306,862.222]]}],"t":190.912},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-14.325,25.294],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[18.665,6.973]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-602.535,812.235],[-579.565,813.423],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-605.064,861.17]]}],"t":236},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-10.821,26.98],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.429,4.419]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-600.336,817.891],[-577.413,816.002],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-596.311,866.725]]}],"t":271},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-14.31,25.303],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[18.669,6.962]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-598.873,811.928],[-575.903,813.102],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-601.373,860.865]]}],"t":303},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-10.473,27.117],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.484,4.169]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-606.141,817.304],[-583.245,815.12],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-601.488,866.083]]}],"t":333},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-14.177,25.377],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[18.705,6.864]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-603.958,806.032],[-580.982,807.085],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-606.202,854.981]]}],"t":360},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[-9.947,27.314],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.561,3.791]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-614.819,809.549],[-591.969,806.923],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-609.224,858.229]]}],"t":381},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-14.31,25.303],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[18.669,6.962]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-598.873,811.928],[-575.903,813.102],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-601.373,860.865]]}],"t":402},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-7.905,27.974],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.787,2.338]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-608.476,814.087],[-585.882,809.783],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-599.306,862.222]]}],"t":421},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[-12.901,26.049],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.023,5.928]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-605.035,808.5],[-582.035,808.413],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-604.849,857.5]]}],"t":434},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-7.905,27.974],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.787,2.338]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-608.476,814.087],[-585.882,809.783],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-599.306,862.222]]}],"t":443},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[-12.901,26.049],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.023,5.928]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-605.035,808.5],[-582.035,808.413],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-604.849,857.5]]}],"t":451},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[-7.905,27.974],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.787,2.338]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-608.476,814.087],[-585.882,809.783],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-599.306,862.222]]}],"t":455},{"s":[{"c":true,"i":[[-12.901,26.049],[0,0],[-61.901,26.235],[-1.611,-160.995],[179.048,12.32],[34.243,63.87],[19.023,5.928]],"o":[[0,0],[0,0],[61.901,-26.235],[0,0],[0,0],[-34.243,-63.87],[0,0]],"v":[[-605.035,808.5],[-582.035,808.413],[-466.45,698.973],[-277.919,838.258],[-437.36,985.865],[-554.594,924.309],[-604.849,857.5]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"body fiill","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[5.817,1.697],[5.621,2.263],[-1.551,5.857],[-1.458,1.732],[-17.965,8.403],[-13.698,2.968],[-13.227,-4.634],[-4.013,-4.383],[4.455,-13.052],[0.782,-0.839],[1.404,-0.449],[18.675,-5.969],[17.926,-1.873]],"o":[[-0.229,-6.055],[-5.817,-1.697],[-5.621,-2.263],[0.58,-2.188],[12.771,-15.174],[12.695,-5.938],[13.698,-2.968],[5.608,1.965],[9.313,10.172],[-0.37,1.085],[-1.005,1.079],[-18.675,5.969],[-17.168,5.487],[0,0]],"v":[[-496.897,718.062],[-508.825,705.95],[-526.531,701.972],[-535.65,688.084],[-532.199,682.301],[-483.369,649.16],[-443.995,634.668],[-402.505,636.099],[-387.475,645.343],[-382.804,684.465],[-384.371,687.498],[-388.25,689.515],[-444.274,707.422],[-496.685,720.302]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-457.885,676.408]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-457.885,676.408]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"top fin","np":1,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[8.283,1.812],[4.205,-2.799],[-1.505,-4.144],[-3.346,-2.87],[-19.01,-3.887],[-17.836,7.641],[-2.733,7.173]],"o":[[-7.675,3.604],[-4.934,-1.079],[-3.67,2.443],[1.505,4.144],[14.728,12.633],[19.01,3.887],[7.056,-3.023],[0,0]],"v":[[-529.005,955.744],[-553.833,958.533],[-568.524,958.312],[-571.525,970.203],[-563.368,980.422],[-511.86,1006.175],[-454.787,1000.84],[-437.864,986.166]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-505.049,982.233]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-505.049,982.233]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"bottom fin","np":1,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.44,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":false,"i":[[0,0],[-41.132,7.791],[-13.421,-3.371],[-7.426,-11.677],[0.62,-14.527],[3.327,-16.385]],"o":[[22.394,-35.37],[13.597,-2.575],[13.421,3.371],[7.802,12.27],[-0.823,19.28],[0,0]],"v":[[-356.957,696.004],[-255.956,627.381],[-214.768,627.475],[-181.273,650.286],[-171.177,692.22],[-177.327,739.385]]}],"t":45},{"i":{"x":0.55,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-5.111,-13.612],[-5.403,-15.822]],"o":[[22.394,-35.37],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[6.783,18.066],[0,0]],"v":[[-356.957,696.004],[-278.523,613.736],[-238.417,604.354],[-198.19,616.535],[-166.036,653.069],[-147.104,701.762]]}],"t":77},{"i":{"x":0.46,"y":1},"o":{"x":0.39,"y":0},"s":[{"c":false,"i":[[0,0],[-41.132,7.791],[-13.421,-3.371],[-3.51,-13.386],[2.51,-14.322],[5.436,-15.81]],"o":[[22.394,-35.37],[13.597,-2.575],[13.421,3.371],[5.05,19.26],[-3.331,19.008],[0,0]],"v":[[-356.957,696.004],[-255.956,627.381],[-219.753,632.489],[-193.737,662.822],[-194.969,715.842],[-208.476,759.305]]}],"t":108},{"i":{"x":0.61,"y":1},"o":{"x":0.47,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-2.897,-14.249],[-2.836,-16.477]],"o":[[10.314,-40.232],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[3.845,18.911],[0,0]],"v":[[-356.957,696.004],[-301.032,611.321],[-260.927,601.939],[-220.699,614.119],[-197.013,648.169],[-186.01,699.242]]}],"t":127},{"i":{"x":0.52,"y":1},"o":{"x":0.42,"y":0},"s":[{"c":false,"i":[[0,0],[-41.861,-0.423],[-9.041,-10.477],[-2.324,-8.872],[2.405,-14.34],[5.32,-15.85]],"o":[[22.394,-35.37],[13.838,0.14],[12.115,14.039],[3.685,14.066],[-3.191,19.032],[0,0]],"v":[[-356.957,696.004],[-259.26,641.159],[-216.329,660.562],[-201.823,695.973],[-199.219,738.048],[-211.132,784.096]]}],"t":159},{"i":{"x":0.48,"y":0.48},"o":{"x":0.44,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-12.575,-15.463],[-2.37,-16.893]],"o":[[22.394,-35.37],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[12.175,14.972],[0,0]],"v":[[-356.957,696.004],[-278.523,613.736],[-238.417,604.354],[-199.461,614.045],[-169.868,643.1],[-153.497,684.314]]}],"t":195},{"i":{"x":0.44,"y":1},"o":{"x":0.47,"y":0},"s":[{"c":false,"i":[[0,0],[-41.132,7.791],[-13.421,-3.371],[-7.426,-11.677],[0.62,-14.527],[3.327,-16.385]],"o":[[22.394,-35.37],[13.597,-2.575],[13.421,3.371],[7.802,12.27],[-0.823,19.28],[0,0]],"v":[[-356.957,696.004],[-255.956,627.381],[-214.768,627.475],[-181.273,650.286],[-171.177,692.22],[-177.327,739.385]]}],"t":223},{"i":{"x":0.55,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-5.111,-13.612],[-5.403,-15.822]],"o":[[22.394,-35.37],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[6.783,18.066],[0,0]],"v":[[-356.957,696.004],[-278.523,613.736],[-238.417,604.354],[-198.19,616.535],[-166.036,653.069],[-147.104,701.762]]}],"t":255},{"i":{"x":0.46,"y":1},"o":{"x":0.39,"y":0},"s":[{"c":false,"i":[[0,0],[-41.132,7.791],[-13.421,-3.371],[-3.51,-13.386],[2.51,-14.322],[5.436,-15.81]],"o":[[22.394,-35.37],[13.597,-2.575],[13.421,3.371],[5.05,19.26],[-3.331,19.008],[0,0]],"v":[[-356.957,696.004],[-255.956,627.381],[-219.753,632.489],[-193.737,662.822],[-194.969,715.842],[-208.476,759.305]]}],"t":286},{"i":{"x":0.61,"y":1},"o":{"x":0.47,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-2.897,-14.249],[-2.836,-16.477]],"o":[[10.314,-40.232],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[3.845,18.911],[0,0]],"v":[[-356.957,696.004],[-301.032,611.321],[-260.927,601.939],[-220.699,614.119],[-197.013,648.169],[-186.01,699.242]]}],"t":305},{"i":{"x":0.52,"y":1},"o":{"x":0.42,"y":0},"s":[{"c":false,"i":[[0,0],[-41.861,-0.423],[-9.041,-10.477],[-2.324,-8.872],[2.405,-14.34],[5.32,-15.85]],"o":[[22.394,-35.37],[13.838,0.14],[12.115,14.039],[3.685,14.066],[-3.191,19.032],[0,0]],"v":[[-356.957,696.004],[-259.26,641.159],[-216.329,660.562],[-201.823,695.973],[-199.219,738.048],[-211.132,784.096]]}],"t":337},{"i":{"x":0.35,"y":1},"o":{"x":0.44,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-12.575,-15.463],[-2.37,-16.893]],"o":[[22.394,-35.37],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[12.175,14.972],[0,0]],"v":[[-356.957,696.004],[-278.523,613.736],[-238.417,604.354],[-199.461,614.045],[-169.868,643.1],[-153.497,684.314]]}],"t":382},{"i":{"x":0.44,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":false,"i":[[0,0],[-41.132,7.791],[-13.421,-3.371],[-3.51,-13.386],[-1.355,-14.477],[1.075,-16.684]],"o":[[22.394,-35.37],[13.597,-2.575],[13.421,3.371],[5.05,19.26],[1.799,19.214],[0,0]],"v":[[-356.957,696.004],[-273.583,616.332],[-237.381,621.44],[-211.364,651.772],[-203.966,709.295],[-205.535,754.781]]}],"t":410},{"i":{"x":0.46,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-5.111,-13.612],[-5.403,-15.822]],"o":[[22.394,-35.37],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[6.783,18.066],[0,0]],"v":[[-356.957,696.004],[-278.523,613.736],[-238.417,604.354],[-198.19,616.535],[-166.036,653.069],[-147.104,701.762]]}],"t":438},{"s":[{"c":false,"i":[[0,0],[-38.237,17.043],[-13.837,-0.194],[-11.402,-7.843],[-2.897,-14.249],[-2.836,-16.477]],"o":[[10.314,-40.232],[12.64,-5.634],[13.837,0.194],[11.98,8.24],[3.845,18.911],[0,0]],"v":[[-356.957,696.004],[-301.032,611.321],[-260.927,601.939],[-220.699,614.119],[-197.013,648.169],[-186.01,699.242]]}],"t":463}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":3,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"lc":1,"lj":1,"ml":10,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"angler line","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.44,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[7.625,1.085],[5.118,-2.109],[-7.151,-10.802],[-9.574,0.424],[-0.479,5.565],[5.282,5.285]],"o":[[-5.716,-0.813],[-10.031,4.134],[4.193,6.334],[13.164,-0.583],[0.835,-9.696],[-5.282,-5.285]],"v":[[-175.888,736.998],[-192.969,739.866],[-198.193,773.416],[-172.426,782.076],[-148.835,765.946],[-154.348,745.363]]}],"t":45},{"i":{"x":0.55,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[7.129,-2.915],[3.352,-4.405],[-11.628,-5.711],[-8.049,5.201],[2.397,5.045],[7.228,1.894]],"o":[[-5.344,2.185],[-6.57,8.634],[6.818,3.349],[11.068,-7.152],[-4.176,-8.79],[-7.228,-1.894]],"v":[[-147.067,698.976],[-160.36,710.078],[-147.925,741.673],[-121.311,736.133],[-109.098,710.296],[-124.251,695.316]]}],"t":77},{"i":{"x":0.46,"y":1},"o":{"x":0.39,"y":0},"s":[{"c":true,"i":[[7.419,2.071],[5.35,-1.423],[-5.681,-11.642],[-9.548,-0.829],[-1.201,5.455],[4.547,5.929]],"o":[[-5.561,-1.552],[-10.485,2.79],[3.331,6.827],[13.128,1.14],[2.093,-9.504],[-4.547,-5.929]],"v":[[-206.737,757.127],[-224.046,757.743],[-233.602,790.324],[-209.185,802.272],[-183.692,789.356],[-186.473,768.23]]}],"t":108},{"i":{"x":0.61,"y":1},"o":{"x":0.47,"y":0},"s":[{"c":true,"i":[[7.5,-1.752],[4.006,-3.821],[-10.579,-7.476],[-8.77,3.865],[1.57,5.361],[6.838,3.012]],"o":[[-5.622,1.313],[-7.852,7.488],[6.204,4.384],[12.058,-5.314],[-2.735,-9.34],[-6.838,-3.012]],"v":[[-185.533,696.496],[-200.413,705.359],[-193.125,738.521],[-165.97,737.255],[-149.829,713.672],[-162.426,696.486]]}],"t":127},{"i":{"x":0.52,"y":1},"o":{"x":0.42,"y":0},"s":[{"c":true,"i":[[7.434,2.016],[5.339,-1.463],[-5.766,-11.6],[-9.553,-0.759],[-1.161,5.464],[4.591,5.896]],"o":[[-5.572,-1.511],[-10.464,2.867],[3.381,6.803],[13.136,1.043],[2.023,-9.519],[-4.591,-5.896]],"v":[[-209.409,781.905],[-226.713,782.648],[-236.03,815.298],[-211.526,827.066],[-186.128,813.964],[-189.064,792.859]]}],"t":159},{"i":{"x":0.48,"y":0.48},"o":{"x":0.44,"y":0},"s":[{"c":true,"i":[[7.129,-2.915],[3.352,-4.405],[-11.628,-5.711],[-8.049,5.201],[2.397,5.045],[7.228,1.894]],"o":[[-5.344,2.185],[-6.57,8.634],[6.818,3.349],[11.068,-7.152],[-4.176,-8.79],[-7.228,-1.894]],"v":[[-153.459,681.527],[-166.753,692.63],[-154.317,724.224],[-127.704,718.685],[-115.49,692.848],[-130.644,677.868]]}],"t":195},{"i":{"x":0.44,"y":1},"o":{"x":0.47,"y":0},"s":[{"c":true,"i":[[7.625,1.085],[5.118,-2.109],[-7.151,-10.802],[-9.574,0.424],[-0.479,5.565],[5.282,5.285]],"o":[[-5.716,-0.813],[-10.031,4.134],[4.193,6.334],[13.164,-0.583],[0.835,-9.696],[-5.282,-5.285]],"v":[[-175.888,736.998],[-192.969,739.866],[-198.193,773.416],[-172.426,782.076],[-148.835,765.946],[-154.348,745.363]]}],"t":223},{"i":{"x":0.55,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[7.129,-2.915],[3.352,-4.405],[-11.628,-5.711],[-8.049,5.201],[2.397,5.045],[7.228,1.894]],"o":[[-5.344,2.185],[-6.57,8.634],[6.818,3.349],[11.068,-7.152],[-4.176,-8.79],[-7.228,-1.894]],"v":[[-147.067,698.976],[-160.36,710.078],[-147.925,741.673],[-121.311,736.133],[-109.098,710.296],[-124.251,695.316]]}],"t":255},{"i":{"x":0.46,"y":1},"o":{"x":0.39,"y":0},"s":[{"c":true,"i":[[7.419,2.071],[5.35,-1.423],[-5.681,-11.642],[-9.548,-0.829],[-1.201,5.455],[4.547,5.929]],"o":[[-5.561,-1.552],[-10.485,2.79],[3.331,6.827],[13.128,1.14],[2.093,-9.504],[-4.547,-5.929]],"v":[[-206.737,757.127],[-224.046,757.743],[-233.602,790.324],[-209.185,802.272],[-183.692,789.356],[-186.473,768.23]]}],"t":286},{"i":{"x":0.61,"y":1},"o":{"x":0.47,"y":0},"s":[{"c":true,"i":[[7.5,-1.752],[4.006,-3.821],[-10.579,-7.476],[-8.77,3.865],[1.57,5.361],[6.838,3.012]],"o":[[-5.622,1.313],[-7.852,7.488],[6.204,4.384],[12.058,-5.314],[-2.735,-9.34],[-6.838,-3.012]],"v":[[-185.533,696.496],[-200.413,705.359],[-193.125,738.521],[-165.97,737.255],[-149.829,713.672],[-162.426,696.486]]}],"t":305},{"i":{"x":0.52,"y":1},"o":{"x":0.42,"y":0},"s":[{"c":true,"i":[[7.434,2.016],[5.339,-1.463],[-5.766,-11.6],[-9.553,-0.759],[-1.161,5.464],[4.591,5.896]],"o":[[-5.572,-1.511],[-10.464,2.867],[3.381,6.803],[13.136,1.043],[2.023,-9.519],[-4.591,-5.896]],"v":[[-209.409,781.905],[-226.713,782.648],[-236.03,815.298],[-211.526,827.066],[-186.128,813.964],[-189.064,792.859]]}],"t":337},{"i":{"x":0.35,"y":1},"o":{"x":0.44,"y":0},"s":[{"c":true,"i":[[7.129,-2.915],[3.352,-4.405],[-11.628,-5.711],[-8.049,5.201],[2.397,5.045],[7.228,1.894]],"o":[[-5.344,2.185],[-6.57,8.634],[6.818,3.349],[11.068,-7.152],[-4.176,-8.79],[-7.228,-1.894]],"v":[[-153.459,681.527],[-166.753,692.63],[-154.317,724.224],[-127.704,718.685],[-115.49,692.848],[-130.644,677.868]]}],"t":382},{"i":{"x":0.44,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[7.702,0.041],[4.785,-2.784],[-8.55,-9.732],[-9.428,1.718],[0.28,5.579],[5.95,4.52]],"o":[[-5.773,-0.031],[-9.378,5.456],[5.014,5.707],[12.964,-2.362],[-0.487,-9.72],[-5.95,-4.52]],"v":[[-204.432,752.222],[-220.966,757.38],[-221.593,791.328],[-194.889,796.414],[-173.704,777.234],[-181.957,757.589]]}],"t":410},{"i":{"x":0.46,"y":1},"o":{"x":0.48,"y":0},"s":[{"c":true,"i":[[7.129,-2.915],[3.352,-4.405],[-11.628,-5.711],[-8.049,5.201],[2.397,5.045],[7.228,1.894]],"o":[[-5.344,2.185],[-6.57,8.634],[6.818,3.349],[11.068,-7.152],[-4.176,-8.79],[-7.228,-1.894]],"v":[[-147.067,698.976],[-160.36,710.078],[-147.925,741.673],[-121.311,736.133],[-109.098,710.296],[-124.251,695.316]]}],"t":438},{"s":[{"c":true,"i":[[7.5,-1.752],[4.006,-3.821],[-10.579,-7.476],[-8.77,3.865],[1.57,5.361],[6.838,3.012]],"o":[[-5.622,1.313],[-7.852,7.488],[6.204,4.384],[12.058,-5.314],[-2.735,-9.34],[-6.838,-3.012]],"v":[[-185.533,696.496],[-200.413,705.359],[-193.125,738.521],[-165.97,737.255],[-149.829,713.672],[-162.426,696.486]]}],"t":463}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"angler ball","np":2,"ty":"gr"},{"bm":0,"cix":2,"hd":false,"it":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[27.424,5.853],[2.432,13.096],[-20.226,7.225],[-18.034,-8.932]],"o":[[0,0],[-27.424,-5.853],[-2.432,-13.096],[13.649,-4.876],[0,0]],"v":[[-603.856,855.496],[-644.245,862.097],[-665.798,833.586],[-661.228,782.34],[-605.035,808.5]]}],"t":155},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[21.451,-27.928],[4.023,10.431],[-10.246,14.833],[-18.536,2.319]],"o":[[0,0],[-14.338,18.666],[-4.023,-10.431],[10.305,-14.918],[0,0]],"v":[[-598.698,860.07],[-634.892,883.503],[-657.066,863.295],[-661.183,820.306],[-608.476,814.087]]}],"t":190.912},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[31.239,6.303],[-1.827,12.671],[-18.543,9.072],[-18.556,-2.152]],"o":[[0,0],[-26.419,-5.33],[1.827,-12.671],[18.649,-9.124],[0,0]],"v":[[-603.963,859.224],[-651.268,858.322],[-662.089,825.719],[-642.113,780.482],[-602.535,812.235]]}],"t":236},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[21.097,-13.46],[-0.093,9.992],[-13.398,8.949],[-18.677,0.344]],"o":[[0,0],[-17.734,11.314],[0.093,-9.992],[13.475,-9],[0,0]],"v":[[-595.479,864.65],[-624.899,892.777],[-646.229,872.53],[-639.89,831.018],[-600.336,817.891]]}],"t":271},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[26.593,-12.344],[-1.664,11.587],[-15.203,-11.186],[-18.557,-2.141]],"o":[[0,0],[-22.353,10.376],[1.664,-11.587],[18.963,13.953],[0,0]],"v":[[-600.273,858.918],[-636.13,867.924],[-657.745,841.094],[-641.556,785.364],[-598.873,811.928]]}],"t":303},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[16.639,-18.313],[2.502,9.557],[-13.429,8.569],[-18.671,0.585]],"o":[[0,0],[-13.986,15.393],[-2.502,-9.557],[14.062,-8.974],[0,0]],"v":[[-600.683,863.997],[-617.424,889.99],[-649.742,866.838],[-648.692,827.553],[-606.141,817.304]]}],"t":333},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[23.331,-3.752],[1.295,11.201],[-16.547,7.531],[-18.568,-2.043]],"o":[[0,0],[-21.003,3.378],[-1.295,-11.2],[17.328,-7.886],[0,0]],"v":[[-605.111,853.029],[-632.248,870.059],[-657.365,848.727],[-660.307,785.817],[-603.958,806.032]]}],"t":360},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[0,0],[14.107,-17.621],[4.321,7.366],[-9.167,10.277],[-18.656,0.945]],"o":[[0,0],[-11.236,14.035],[-4.321,-7.366],[9.599,-10.762],[0,0]],"v":[[-608.459,856.128],[-621.861,888.122],[-649.5,874.921],[-666.466,827.685],[-614.819,809.549]]}],"t":381},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[26.593,-12.344],[-1.664,11.587],[-15.203,-11.186],[-18.557,-2.141]],"o":[[0,0],[-22.353,10.376],[1.664,-11.587],[18.963,13.953],[0,0]],"v":[[-600.273,858.918],[-636.13,867.924],[-657.745,841.094],[-641.556,785.364],[-598.873,811.928]]}],"t":402},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[21.451,-27.928],[4.023,10.431],[-10.246,14.833],[-18.536,2.319]],"o":[[0,0],[-14.338,18.666],[-4.023,-10.431],[10.305,-14.918],[0,0]],"v":[[-598.698,860.07],[-634.892,883.503],[-657.066,863.295],[-661.183,820.306],[-608.476,814.087]]}],"t":421},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[0,0],[27.424,5.853],[2.432,13.096],[-20.226,7.225],[-18.034,-8.932]],"o":[[0,0],[-27.424,-5.853],[-2.432,-13.096],[13.649,-4.876],[0,0]],"v":[[-603.856,855.496],[-644.245,862.097],[-665.798,833.586],[-661.228,782.34],[-605.035,808.5]]}],"t":434},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[21.451,-27.928],[4.023,10.431],[-10.246,14.833],[-18.536,2.319]],"o":[[0,0],[-14.338,18.666],[-4.023,-10.431],[10.305,-14.918],[0,0]],"v":[[-598.698,860.07],[-634.892,883.503],[-657.066,863.295],[-661.183,820.306],[-608.476,814.087]]}],"t":443},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"s":[{"c":true,"i":[[0,0],[27.424,5.853],[2.432,13.096],[-20.226,7.225],[-18.034,-8.932]],"o":[[0,0],[-27.424,-5.853],[-2.432,-13.096],[13.649,-4.876],[0,0]],"v":[[-603.856,855.496],[-644.245,862.097],[-665.798,833.586],[-661.228,782.34],[-605.035,808.5]]}],"t":451},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"s":[{"c":true,"i":[[0,0],[21.451,-27.928],[4.023,10.431],[-10.246,14.833],[-18.536,2.319]],"o":[[0,0],[-14.338,18.666],[-4.023,-10.431],[10.305,-14.918],[0,0]],"v":[[-598.698,860.07],[-634.892,883.503],[-657.066,863.295],[-661.183,820.306],[-608.476,814.087]]}],"t":455},{"s":[{"c":true,"i":[[0,0],[27.424,5.853],[2.432,13.096],[-20.226,7.225],[-18.034,-8.932]],"o":[[0,0],[-27.424,-5.853],[-2.432,-13.096],[13.649,-4.876],[0,0]],"v":[[-603.856,855.496],[-644.245,862.097],[-665.798,833.586],[-661.228,782.34],[-605.035,808.5]]}],"t":457}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.023529414088,0.180392161012,0.564705908298,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fill","np":2,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-633.617,826.699]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-633.617,826.699]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"rear fin","np":1,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":36,"ip":382,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.833],"y":[0.813]},"o":{"x":[0.167],"y":[0.167]},"s":[226.748],"t":382},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.141]},"s":[548.586],"t":535},{"s":[796.748],"t":624}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.778],"y":[0.971]},"o":{"x":[0.167],"y":[0.167]},"s":[343.038],"t":382},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.67],"y":[-0.08]},"s":[324.433],"t":535},{"s":[336.038],"t":624}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-6],"t":382},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-3],"t":535},{"s":[8],"t":624}]},"s":{"a":0,"ix":6,"k":[-14,14,100]}},"nm":"skinny fish 28","op":625,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[13.747,14.156],[48.014,5.637],[8.11,-43.35],[-49,21],[-24.346,-6.76],[-2.343,9.762]],"o":[[-12.769,-0.468],[-50.652,-5.946],[-8.11,43.35],[47.498,-20.356],[4.998,-8.401],[5.544,-20.327]],"v":[[950.912,-927.04],[771.386,-942.903],[653.742,-884.219],[817,-842],[959.831,-849.643],[971.5,-876.5]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[4.085,2.192],[12.552,-5.891],[13.336,-6.589],[-26.641,-0.837],[-0.164,1.112],[1.694,12.859]],"o":[[-7.985,-4.284],[-22.297,10.465],[0,0],[1.033,0.032],[1.297,-8.801],[-0.605,-4.596]],"v":[[861.485,-970.966],[823.948,-966.859],[787.664,-941.411],[862.382,-927.682],[867.203,-930.949],[868.964,-958.995]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-2.637,1.451],[-16.645,13.123],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[18.865,-10.381],[8.017,-6.321],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[853.425,-823.805],[866.711,-823.434],[922.584,-835.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-11.896,-3.394],[-0.703,5.898],[2.616,3.135],[5.418,-0.657],[4.597,-0.557]],"o":[[5.855,10.897],[3.104,0.886],[0.455,-3.817],[-0.461,-0.553],[-4.597,0.557],[0,0]],"v":[[761.339,-841.698],[797.453,-809.184],[813.703,-814.648],[800.737,-836.049],[775.541,-843.101],[761.751,-841.429]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-11,53],[9,-14],[0.702,0.026],[5.544,-20.327],[4.998,-8.401],[-0.674,-0.215],[9.099,33.797],[17,12]],"o":[[11,-53],[0,0],[13.747,14.156],[-2.343,9.762],[0.77,0.214],[22,7],[-5.25,-19.5],[-17,-12]],"v":[[1028,-928],[952,-927],[950.912,-927.04],[971.5,-876.5],[959.831,-849.643],[962,-849],[1032.75,-844.25],[1006,-885]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"body","np":6,"ty":"gr"}],"sr":1,"st":255,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":37,"ip":409,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.811],"y":[0.851]},"o":{"x":[0.167],"y":[0.167]},"s":[239.686],"t":409},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.25],"y":[0.291]},"s":[655.292],"t":548},{"s":[809.686],"t":624}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.704],"y":[1.066]},"o":{"x":[0.167],"y":[0.167]},"s":[323.142],"t":409},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.428],"y":[0.074]},"s":[293.391],"t":548},{"s":[314.142],"t":624}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-4],"t":409},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":548},{"s":[15],"t":624}]},"s":{"a":0,"ix":6,"k":[-29,29,100]}},"nm":"skinny fish 27","op":625,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":382,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":38,"ip":364,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.833],"y":[0.835]},"o":{"x":[0.167],"y":[0.167]},"s":[230.769],"t":364},{"i":{"x":[0.688],"y":[0.712]},"o":{"x":[0.167],"y":[0.168]},"s":[429.769],"t":441},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.379],"y":[0.385]},"s":[650.769],"t":528},{"s":[770.769],"t":580}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.55],"y":[1.033]},"o":{"x":[0.167],"y":[0.167]},"s":[353.463],"t":364},{"i":{"x":[0.652],"y":[-0.359]},"o":{"x":[0.405],"y":[1.216]},"s":[335.463],"t":441},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.506],"y":[-0.021]},"s":[335.963],"t":528},{"s":[307.963],"t":580}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-11.513],"t":364},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":441},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":528},{"s":[-21.513],"t":580}]},"s":{"a":0,"ix":6,"k":[-12,12,100]}},"nm":"skinny fish 26","op":581,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":266,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":39,"ip":94,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.833],"y":[0.843]},"o":{"x":[0.167],"y":[0.167]},"s":[223.748],"t":84},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.176]},"s":[497.259],"t":240.326},{"s":[766.748],"t":413}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.778],"y":[0.971]},"o":{"x":[0.167],"y":[0.167]},"s":[427.038],"t":84},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.67],"y":[-0.075]},"s":[413.433],"t":240.326},{"s":[431.038],"t":413}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-8],"t":84},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-2],"t":240},{"s":[9],"t":413}]},"s":{"a":0,"ix":6,"k":[-14,14,100]}},"nm":"skinny fish 25","op":414,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[13.747,14.156],[48.014,5.637],[8.11,-43.35],[-49,21],[-24.346,-6.76],[-2.343,9.762]],"o":[[-12.769,-0.468],[-50.652,-5.946],[-8.11,43.35],[47.498,-20.356],[4.998,-8.401],[5.544,-20.327]],"v":[[950.912,-927.04],[771.386,-942.903],[653.742,-884.219],[817,-842],[959.831,-849.643],[971.5,-876.5]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[4.085,2.192],[12.552,-5.891],[13.336,-6.589],[-26.641,-0.837],[-0.164,1.112],[1.694,12.859]],"o":[[-7.985,-4.284],[-22.297,10.465],[0,0],[1.033,0.032],[1.297,-8.801],[-0.605,-4.596]],"v":[[861.485,-970.966],[823.948,-966.859],[787.664,-941.411],[862.382,-927.682],[867.203,-930.949],[868.964,-958.995]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-2.637,1.451],[-16.645,13.123],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[18.865,-10.381],[8.017,-6.321],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[853.425,-823.805],[866.711,-823.434],[922.584,-835.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-11.896,-3.394],[-0.703,5.898],[2.616,3.135],[5.418,-0.657],[4.597,-0.557]],"o":[[5.855,10.897],[3.104,0.886],[0.455,-3.817],[-0.461,-0.553],[-4.597,0.557],[0,0]],"v":[[761.339,-841.698],[797.453,-809.184],[813.703,-814.648],[800.737,-836.049],[775.541,-843.101],[761.751,-841.429]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-11,53],[9,-14],[0.702,0.026],[5.544,-20.327],[4.998,-8.401],[-0.674,-0.215],[9.099,33.797],[17,12]],"o":[[11,-53],[0,0],[13.747,14.156],[-2.343,9.762],[0.77,0.214],[22,7],[-5.25,-19.5],[-17,-12]],"v":[[1028,-928],[952,-927],[950.912,-927.04],[971.5,-876.5],[959.831,-849.643],[962,-849],[1032.75,-844.25],[1006,-885]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"body","np":6,"ty":"gr"}],"sr":1,"st":-43,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":40,"ip":121,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.811],"y":[0.795]},"o":{"x":[0.167],"y":[0.167]},"s":[236.686],"t":120.707},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.25],"y":[0.205]},"s":[456.292],"t":258},{"s":[784.686],"t":413}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.704],"y":[1.096]},"o":{"x":[0.167],"y":[0.167]},"s":[407.142],"t":120.707},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.428],"y":[0.215]},"s":[392.391],"t":258},{"s":[403.142],"t":413}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-5],"t":121},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[1],"t":258},{"s":[3],"t":413}]},"s":{"a":0,"ix":6,"k":[-23,23,100]}},"nm":"skinny fish 24","op":414,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":84,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":41,"ip":-98,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.833],"y":[0.813]},"o":{"x":[0.167],"y":[0.167]},"s":[226.748],"t":-98},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.141]},"s":[548.586],"t":55},{"s":[796.748],"t":144}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.778],"y":[0.971]},"o":{"x":[0.167],"y":[0.167]},"s":[343.038],"t":-98},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.67],"y":[-0.08]},"s":[324.433],"t":55},{"s":[336.038],"t":144}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-6],"t":-98},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-3],"t":55},{"s":[8],"t":144}]},"s":{"a":0,"ix":6,"k":[-14,14,100]}},"nm":"skinny fish 18","op":144,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[13.747,14.156],[48.014,5.637],[8.11,-43.35],[-49,21],[-24.346,-6.76],[-2.343,9.762]],"o":[[-12.769,-0.468],[-50.652,-5.946],[-8.11,43.35],[47.498,-20.356],[4.998,-8.401],[5.544,-20.327]],"v":[[950.912,-927.04],[771.386,-942.903],[653.742,-884.219],[817,-842],[959.831,-849.643],[971.5,-876.5]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[4.085,2.192],[12.552,-5.891],[13.336,-6.589],[-26.641,-0.837],[-0.164,1.112],[1.694,12.859]],"o":[[-7.985,-4.284],[-22.297,10.465],[0,0],[1.033,0.032],[1.297,-8.801],[-0.605,-4.596]],"v":[[861.485,-970.966],[823.948,-966.859],[787.664,-941.411],[862.382,-927.682],[867.203,-930.949],[868.964,-958.995]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-12.303,-10.072],[-2.637,1.451],[-16.645,13.123],[-0.744,10.463],[33.849,-8.167]],"o":[[12.303,10.072],[1.45,1.187],[18.865,-10.381],[8.017,-6.321],[-34.624,-3.694],[0,0]],"v":[[824.518,-846.771],[853.425,-823.805],[866.711,-823.434],[922.584,-835.549],[927.136,-857.517],[823.926,-845.378]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-11.896,-3.394],[-0.703,5.898],[2.616,3.135],[5.418,-0.657],[4.597,-0.557]],"o":[[5.855,10.897],[3.104,0.886],[0.455,-3.817],[-0.461,-0.553],[-4.597,0.557],[0,0]],"v":[[761.339,-841.698],[797.453,-809.184],[813.703,-814.648],[800.737,-836.049],[775.541,-843.101],[761.751,-841.429]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-11,53],[9,-14],[0.702,0.026],[5.544,-20.327],[4.998,-8.401],[-0.674,-0.215],[9.099,33.797],[17,12]],"o":[[11,-53],[0,0],[13.747,14.156],[-2.343,9.762],[0.77,0.214],[22,7],[-5.25,-19.5],[-17,-12]],"v":[[1028,-928],[952,-927],[950.912,-927.04],[971.5,-876.5],[959.831,-849.643],[962,-849],[1032.75,-844.25],[1006,-885]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"body","np":6,"ty":"gr"}],"sr":1,"st":-225,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":42,"ip":-71,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.811],"y":[0.851]},"o":{"x":[0.167],"y":[0.167]},"s":[239.686],"t":-71},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.25],"y":[0.291]},"s":[655.292],"t":68},{"s":[809.686],"t":144}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.704],"y":[1.066]},"o":{"x":[0.167],"y":[0.167]},"s":[323.142],"t":-71},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.428],"y":[0.074]},"s":[293.391],"t":68},{"s":[314.142],"t":144}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-4],"t":-71},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":68},{"s":[15],"t":144}]},"s":{"a":0,"ix":6,"k":[-29,29,100]}},"nm":"skinny fish 7","op":144,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":-98,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":43,"ip":-116,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.833],"y":[0.835]},"o":{"x":[0.167],"y":[0.167]},"s":[230.769],"t":-116},{"i":{"x":[0.688],"y":[0.712]},"o":{"x":[0.167],"y":[0.168]},"s":[429.769],"t":-39},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.379],"y":[0.385]},"s":[650.769],"t":48},{"s":[770.769],"t":100}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.55],"y":[1.033]},"o":{"x":[0.167],"y":[0.167]},"s":[353.463],"t":-116},{"i":{"x":[0.652],"y":[-0.359]},"o":{"x":[0.405],"y":[1.216]},"s":[335.463],"t":-39},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.506],"y":[-0.021]},"s":[335.963],"t":48},{"s":[307.963],"t":100}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-11.513],"t":-116},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":-39},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":48},{"s":[-21.513],"t":100}]},"s":{"a":0,"ix":6,"k":[-12,12,100]}},"nm":"skinny fish 8","op":101,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":-214,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":44,"ip":-75,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.81],"y":[0.754]},"o":{"x":[0.167],"y":[0.167]},"s":[241.769],"t":-75},{"i":{"x":[0.736],"y":[0.685]},"o":{"x":[0.32],"y":[0.197]},"s":[383.747],"t":42.219},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.169],"y":[0.259]},"s":[577.032],"t":118},{"s":[752.769],"t":206}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.617],"y":[-0.25]},"o":{"x":[0.167],"y":[0.167]},"s":[186.463],"t":-75},{"i":{"x":[0.564],"y":[0.972]},"o":{"x":[0.443],"y":[0.973]},"s":[160.463],"t":42.219},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.37],"y":[-0.036]},"s":[135.463],"t":118},{"s":[154.463],"t":206}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":-75},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-7.513],"t":-5},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-24.513],"t":42},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-1.513],"t":82},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":118},{"s":[9.487],"t":206}]},"s":{"a":0,"ix":6,"k":[-12,12,100]}},"nm":"skinny fish 14","op":205,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":-173,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":45,"ip":-105,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.815],"y":[0.777]},"o":{"x":[0.167],"y":[0.167]},"s":[261.686],"t":-105},{"i":{"x":[0.736],"y":[0.751]},"o":{"x":[0.257],"y":[0.162]},"s":[366.573],"t":-8},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.293],"y":[0.185]},"s":[601.417],"t":105},{"s":[787.686],"t":165}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.762],"y":[1.172]},"o":{"x":[0.298],"y":[-0.456]},"s":[174.219],"t":-105},{"i":{"x":[0.635],"y":[-1.279]},"o":{"x":[0.181],"y":[3.579]},"s":[150.9],"t":-8},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.598],"y":[0.085]},"s":[151.896],"t":105},{"s":[175.142],"t":165}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[10],"t":-105},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-23],"t":-26},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[3],"t":-8},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-2],"t":21},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2],"t":105},{"s":[13],"t":165}]},"s":{"a":0,"ix":6,"k":[-26,26,100]}},"nm":"skinny fish 12","op":161,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":-105,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":46,"ip":403,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.81],"y":[0.754]},"o":{"x":[0.167],"y":[0.167]},"s":[241.769],"t":403},{"i":{"x":[0.736],"y":[0.685]},"o":{"x":[0.32],"y":[0.197]},"s":[383.747],"t":520.219},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.169],"y":[0.259]},"s":[577.032],"t":596},{"s":[752.769],"t":684}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.617],"y":[-0.25]},"o":{"x":[0.167],"y":[0.167]},"s":[186.463],"t":403},{"i":{"x":[0.564],"y":[0.972]},"o":{"x":[0.443],"y":[0.973]},"s":[160.463],"t":520.219},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.37],"y":[-0.036]},"s":[135.463],"t":596},{"s":[154.463],"t":684}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":403},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-7.513],"t":473},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-24.513],"t":520},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-1.513],"t":560},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2.487],"t":596},{"s":[9.487],"t":684}]},"s":{"a":0,"ix":6,"k":[-12,12,100]}},"nm":"skinny fish 30","op":785,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":305,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":47,"ip":373,"ks":{"a":{"a":0,"ix":1,"k":[804,-884,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":1,"ix":3,"k":[{"i":{"x":[0.815],"y":[0.777]},"o":{"x":[0.167],"y":[0.167]},"s":[261.686],"t":373},{"i":{"x":[0.736],"y":[0.751]},"o":{"x":[0.257],"y":[0.162]},"s":[366.573],"t":470},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.293],"y":[0.185]},"s":[601.417],"t":583},{"s":[787.686],"t":643}]},"y":{"a":1,"ix":4,"k":[{"i":{"x":[0.762],"y":[1.172]},"o":{"x":[0.298],"y":[-0.456]},"s":[174.219],"t":373},{"i":{"x":[0.635],"y":[-1.279]},"o":{"x":[0.181],"y":[3.579]},"s":[150.9],"t":470},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.598],"y":[0.085]},"s":[151.896],"t":583},{"s":[175.142],"t":643}]}},"r":{"a":1,"ix":10,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[10],"t":373},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-23],"t":452},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[3],"t":470},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[-2],"t":499},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"s":[2],"t":583},{"s":[13],"t":643}]},"s":{"a":0,"ix":6,"k":[-26,26,100]}},"nm":"skinny fish 29","op":853,"shapes":[{"bm":0,"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[2.438,1.308],[7.493,-3.517],[7.961,-3.933],[-0.098,0.664],[1.011,7.676]],"o":[[-4.767,-2.557],[-13.31,6.247],[0,0],[0.774,-5.254],[-0.361,-2.743]],"v":[[869.333,-938.206],[831.926,-937.754],[810.266,-922.563],[872.746,-914.318],[873.798,-931.06]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[8.206,8.451],[28.661,3.365],[4.841,-25.877],[-29.25,12.536],[-14.533,-4.035],[-1.398,5.827]],"o":[[-7.622,-0.279],[-30.236,-3.55],[-4.841,25.877],[28.354,-12.151],[2.983,-5.015],[3.309,-12.134]],"v":[[907.716,-913.985],[800.549,-923.454],[730.322,-888.423],[827.778,-863.221],[913.04,-867.783],[920.006,-883.815]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[0,0],[-7.344,-6.012],[-1.574,0.866],[-9.936,7.834],[-0.444,6.246],[20.206,-4.875]],"o":[[7.344,6.012],[0.865,0.709],[11.262,-6.197],[4.786,-3.773],[-20.668,-2.205],[0,0]],"v":[[832.266,-866.069],[849.522,-852.36],[857.452,-852.138],[890.805,-859.37],[893.523,-872.483],[831.912,-865.237]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":3,"ix":4,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0,0],[-7.101,-2.026],[-0.419,3.521],[1.562,1.872]],"o":[[3.495,6.505],[1.853,0.529],[0.271,-2.279],[-0.276,-0.33]],"v":[[771.551,-861.04],[804.61,-843.132],[825.81,-846.893],[818.07,-859.668]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 4","ty":"sh"},{"hd":false,"ind":4,"ix":5,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-6.566,31.638],[5.372,-8.357],[0.419,0.015],[3.309,-12.134],[2.983,-5.015],[-0.403,-0.128],[5.432,20.175],[3.9,9.389]],"o":[[6.566,-31.638],[0,0],[8.206,8.451],[-1.398,5.827],[0.46,0.128],[13.133,4.179],[-3.134,-11.64],[-4.765,-11.471]],"v":[[943.733,-919.058],[908.365,-913.961],[907.716,-913.985],[920.006,-883.815],[913.04,-867.783],[914.335,-867.399],[948.568,-862.064],[940.6,-888.889]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 5","ty":"sh"},{"bm":0,"c":{"a":0,"ix":4,"k":[0.06274510175,0.254901975393,0.72549021244,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"fish","np":6,"ty":"gr"}],"sr":1,"st":373,"ty":4},{"ao":0,"bm":0,"ddd":0,"hasMask":true,"ind":48,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[512,384,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[512,384,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"masksProperties":[{"inv":false,"mode":"a","nm":"Mask 1","o":{"a":0,"ix":3,"k":100},"pt":{"a":1,"ix":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[88.137,-12.962],[12.805,-45.665],[-38.866,-42.123],[-83.026,2.692],[-34.698,67.681],[48.329,60.278]],"o":[[-71.021,10.445],[-17.005,60.643],[55.351,59.99],[95.359,-3.092],[34.698,-67.681],[-67.763,-84.518]],"v":[[370.863,114.962],[244.005,217.498],[269.773,440.293],[508.4,522.256],[727.627,418.208],[731.058,183.362]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[85.046,-20.379],[10.42,-46.268],[-30.051,-48.804],[-83.026,2.692],[-34.698,67.681],[48.329,60.278]],"o":[[-69.808,16.728],[-17.005,75.502],[39.227,63.707],[95.359,-3.092],[34.698,-67.681],[-67.764,-84.518]],"v":[[383.863,122.962],[258.005,233.498],[278.773,455.293],[481.4,523.256],[741.627,414.208],[740.058,184.362]]}],"t":73},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[85.046,-20.379],[10.42,-46.268],[-35.044,-45.352],[-83.026,2.692],[-34.698,67.681],[67.942,51.638]],"o":[[-69.808,16.728],[-17.005,75.502],[49.227,63.707],[95.359,-3.092],[34.698,-67.681],[-86.246,-65.55]],"v":[[371.92,120.962],[258.005,233.498],[278.773,455.293],[503.4,529.256],[741.627,414.208],[701.115,163.362]]}],"t":126},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[84.137,-33.962],[14.995,-65.498],[-46.267,-51.524],[-82.802,6.663],[-34.697,67.681],[67.942,51.638]],"o":[[-66.566,26.869],[-17.272,75.441],[48.227,53.707],[102.6,-8.256],[34.698,-67.681],[-86.246,-65.55]],"v":[[356.863,114.962],[252.005,229.498],[278.773,455.293],[529.4,520.256],[741.627,414.208],[717.058,144.362]]}],"t":209},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[84.137,-33.962],[9.995,-61.498],[-51.671,-46.103],[-82.892,5.424],[-34.697,67.681],[74.942,48.638]],"o":[[-66.566,26.869],[-15.042,92.549],[51.227,45.707],[95.6,-6.256],[34.698,-67.681],[-90.869,-58.975]],"v":[[339.863,122.962],[247.005,243.498],[301.773,466.293],[542.4,517.256],[735.627,404.208],[710.058,147.362]]}],"t":307},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[104.137,-40.962],[0.63,-58.048],[-43.773,-49.293],[-82.892,5.424],[-34.697,67.681],[84.65,31.073]],"o":[[-66.802,26.276],[-1.005,92.502],[45.586,51.335],[95.6,-6.256],[34.698,-67.681],[-99.058,-36.362]],"v":[[333.863,133.962],[251.005,274.498],[301.773,466.293],[558.4,522.256],[735.627,411.208],[701.058,133.362]]}],"t":401},{"s":[{"c":true,"i":[[88.137,-12.962],[12.805,-45.665],[-38.866,-42.123],[-83.026,2.692],[-34.698,67.681],[48.329,60.278]],"o":[[-71.021,10.445],[-17.005,60.643],[55.351,59.99],[95.359,-3.092],[34.698,-67.681],[-67.763,-84.518]],"v":[[370.863,114.962],[244.005,217.498],[269.773,440.293],[508.4,522.256],[727.627,418.208],[731.058,183.362]]}],"t":479}]},"x":{"a":0,"ix":4,"k":0}}],"nm":"Royal Blue Solid 2","op":480,"sc":"#295bd6","sh":768,"sr":1,"st":0,"sw":1024,"ty":1},{"ao":0,"bm":0,"ddd":0,"hasMask":true,"ind":49,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[512,384,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[512,384,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"masksProperties":[{"inv":false,"mode":"a","nm":"Mask 1","o":{"a":0,"ix":3,"k":100},"pt":{"a":1,"ix":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[89.051,-16.552],[24.831,-57.178],[-41.731,-39.461],[-106.322,-2.671],[-35.963,66.206],[59.082,45.141]],"o":[[-89.051,16.552],[-24.876,57.282],[65.309,61.757],[102.883,2.585],[35.963,-66.207],[-99.87,-76.304]],"v":[[366.083,103.552],[203.585,205.293],[219.691,460.243],[500.411,539.857],[774.655,428.712],[770.918,163.505]]}],"t":0},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[89.864,-16.103],[25.058,-55.629],[-32.435,-46.308],[-107.324,0.385],[-36.291,64.412],[59.622,43.917]],"o":[[-89.864,16.103],[-25.104,55.729],[49.797,71.097],[135.123,-0.485],[36.291,-64.412],[-100.782,-74.236]],"v":[[370.69,100.545],[212.076,202.73],[225.346,451.719],[493.877,535.485],[769.393,410.125],[765.378,149.695]]}],"t":47},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[91.89,-16.153],[25.623,-55.802],[-33.166,-46.453],[-109.712,-2.607],[-37.109,64.613],[72.416,64.339]],"o":[[-91.89,16.153],[-25.669,55.903],[50.919,71.319],[106.164,2.523],[37.109,-64.613],[-94.344,-83.821]],"v":[[360.46,101.811],[205.318,206.979],[212.813,458.552],[485.25,551.81],[809.244,445.989],[774.81,168.887]]}],"t":143},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[92.876,-16.153],[25.898,-55.802],[-37.94,-42.92],[-110.889,-2.607],[-37.507,64.613],[73.193,64.339]],"o":[[-92.876,16.153],[-25.945,55.903],[59.508,67.319],[107.303,2.523],[37.507,-64.613],[-95.356,-83.821]],"v":[[387.814,96.295],[215.025,178.915],[213.492,454.681],[510.182,539.777],[798.645,446.957],[790.807,167.661]]}],"t":173},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[88.992,-15.833],[24.815,-54.696],[-44.612,-60.458],[-101.813,-5.663],[-35.939,63.332],[70.132,63.063]],"o":[[-88.992,15.833],[-24.86,54.794],[50.857,68.922],[105.291,5.856],[35.939,-63.332],[-91.368,-82.158]],"v":[[377.077,96.151],[189.86,190.239],[214.481,446.815],[460.575,534.144],[779.335,442.142],[777.868,157.158]]}],"t":269},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[89.624,-16.429],[18.389,-58.95],[-32.317,-58.667],[-102.537,-5.876],[-44.086,61.037],[70.631,65.438]],"o":[[-89.624,16.429],[-27.674,88.714],[42.298,76.786],[106.04,6.077],[46.251,-64.033],[-92.018,-85.253]],"v":[[383.888,98.571],[196.674,202.286],[215.317,457.202],[467.213,545.923],[766.167,463.722],[776.369,158.225]]}],"t":315},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[85.272,-16.153],[25.844,-61.915],[-45.261,-47.159],[-97.558,-5.777],[-41.946,60.011],[67.201,64.339]],"o":[[-85.272,16.153],[-23.474,56.235],[49.252,51.319],[100.891,5.975],[44.005,-62.957],[-87.55,-83.821]],"v":[[371.716,98.295],[210.156,184.915],[224.748,457.681],[484.558,533.777],[778.995,468.957],[768.799,153.661]]}],"t":413},{"s":[{"c":true,"i":[[89.051,-16.552],[24.831,-57.178],[-41.731,-39.461],[-106.322,-2.671],[-35.963,66.206],[59.082,45.141]],"o":[[-89.051,16.552],[-24.876,57.282],[65.309,61.757],[102.883,2.585],[35.963,-66.207],[-99.87,-76.304]],"v":[[366.083,103.552],[203.585,205.293],[219.691,460.243],[500.411,539.857],[774.655,428.712],[770.918,163.505]]}],"t":479}]},"x":{"a":0,"ix":4,"k":0}}],"nm":"Deep Royal Blue Solid 2","op":480,"sc":"#1041b9","sh":768,"sr":1,"st":0,"sw":1024,"ty":1},{"ao":0,"bm":0,"ddd":0,"ind":50,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[512,384,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[512,384,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Deep Royal Blue Solid 1","op":480,"sc":"#062e90","sh":768,"sr":1,"st":0,"sw":1024,"ty":1}],"markers":[],"nm":"Hunter gone too deep","op":480,"v":"5.5.9","w":1024}
diff --git a/cobalt/renderer/rasterizer/testdata/white_material_wave_loading.json b/cobalt/renderer/rasterizer/testdata/white_material_wave_loading.json
index cafcccf..b62abd4 100644
--- a/cobalt/renderer/rasterizer/testdata/white_material_wave_loading.json
+++ b/cobalt/renderer/rasterizer/testdata/white_material_wave_loading.json
@@ -1 +1 @@
-{"v":"4.6.8","fr":29.9700012207031,"ip":0,"op":40.0000016292334,"w":256,"h":256,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[208.6,127.969,0],"e":[208.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[208.6,88,0],"e":[208.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":40.0000016292334}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9843137,0.5490196,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[168.6,128,0],"e":[168.6,88,0],"to":[0,-6.66666650772095,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[168.6,88,0],"e":[168.6,128,0],"to":[0,0,0],"ti":[0,-6.66666650772095,0]},{"t":35.0000014255792}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9921569,0.8470588,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[128.594,127.969,0],"e":[128.594,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[128.594,88,0],"e":[128.594,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":30.0000012219251}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.2627451,0.627451,0.2784314,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 4","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":5,"s":[88.6,127.969,0],"e":[88.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[88.6,88,0],"e":[88.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":25.0000010182709}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.1176471,0.5333334,0.8980392,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 5","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[48.6,127.969,0],"e":[48.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[48.6,88,0],"e":[48.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":20.0000008146167}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.8980392,0.2235294,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1}]}
\ No newline at end of file
+{"v":"4.6.8","fr":29.9700012207031,"ip":0,"op":40.0000016292334,"w":256,"h":256,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[208.6,127.969,0],"e":[208.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[208.6,88,0],"e":[208.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":40.0000016292334}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9843137,0.5490196,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[168.6,128,0],"e":[168.6,88,0],"to":[0,-6.66666650772095,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[168.6,88,0],"e":[168.6,128,0],"to":[0,0,0],"ti":[0,-6.66666650772095,0]},{"t":35.0000014255792}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9921569,0.8470588,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[128.594,127.969,0],"e":[128.594,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[128.594,88,0],"e":[128.594,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":30.0000012219251}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.2627451,0.627451,0.2784314,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 4","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":5,"s":[88.6,127.969,0],"e":[88.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[88.6,88,0],"e":[88.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":25.0000010182709}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.1176471,0.5333334,0.8980392,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 5","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[48.6,127.969,0],"e":[48.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[48.6,88,0],"e":[48.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":20.0000008146167}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.8980392,0.2235294,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1}]}
diff --git a/cobalt/renderer/rasterizer/testdata/ytk_ink_logo_rotate.json b/cobalt/renderer/rasterizer/testdata/ytk_ink_logo_rotate.json
index 0c4889e..43412ee 100644
--- a/cobalt/renderer/rasterizer/testdata/ytk_ink_logo_rotate.json
+++ b/cobalt/renderer/rasterizer/testdata/ytk_ink_logo_rotate.json
@@ -1 +1 @@
-{"assets":[],"ddd":0,"fr":60,"h":800,"ip":0,"layers":[{"ao":0,"bm":0,"ddd":0,"ind":1,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[0,0,0]},"o":{"a":0,"ix":11,"k":0},"p":{"a":0,"ix":2,"k":[450,400,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":1,"ix":6,"k":[{"e":[90.314,90.314,100],"i":{"x":[0.644,0.644,0.833],"y":[1.071,1.071,1]},"n":["0p644_1p071_0p168_0p602","0p644_1p071_0p168_0p602","0p833_1_0p167_0"],"o":{"x":[0.168,0.168,0.167],"y":[0.602,0.602,0]},"s":[100,100,100],"t":60},{"e":[104.536,104.536,100],"i":{"x":[0.565,0.565,0.75],"y":[0.913,0.913,1]},"n":["0p565_0p913_0p443_0p07","0p565_0p913_0p443_0p07","0p75_1_0p313_0"],"o":{"x":[0.443,0.443,0.313],"y":[0.07,0.07,0]},"s":[90.314,90.314,100],"t":74},{"e":[97.517,97.517,100],"i":{"x":[0.583,0.583,0.75],"y":[0.95,0.95,1]},"n":["0p583_0p95_0p36_-0p167","0p583_0p95_0p36_-0p167","0p75_1_0p167_0"],"o":{"x":[0.36,0.36,0.167],"y":[-0.167,-0.167,0]},"s":[104.536,104.536,100],"t":90.334},{"e":[100,100,100],"i":{"x":[0.41,0.41,0.833],"y":[1,1,1]},"n":["0p41_1_0p345_-0p133","0p41_1_0p345_-0p133","0p833_1_0p167_0"],"o":{"x":[0.345,0.345,0.167],"y":[-0.133,-0.133,0]},"s":[97.517,97.517,100],"t":109},{"t":130}]}},"nm":"Null 5","op":794,"sr":1,"st":0,"ty":3},{"ao":0,"bm":0,"ddd":0,"ind":2,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-55.427,-3.31,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":0,"ix":3,"k":12.573},"y":{"a":0,"ix":4,"k":-4.31}},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"logo 2","op":77,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[3.269,-2.699],[11.728,-7.575],[3.91,-1.71],[2.362,12.462],[0.891,6.298],[0.935,5.344],[0.196,0.685],[-7.532,-2.115],[-14.661,-5.294],[-0.548,-0.22],[1.882,-1.558]],"o":[[-8.878,7.33],[-6.114,3.949],[-2.98,1.304],[-1.526,-8.052],[-0.252,-1.785],[-0.214,-1.222],[-0.977,-3.421],[10.998,3.088],[13.081,4.724],[2.444,0.976],[-7.086,5.864]],"v":[[-19.954,7.456],[-70.218,43.014],[-87.507,54.154],[-92.801,32.407],[-99.643,-16.461],[-102.494,-38.045],[-103.471,-43.258],[-91.58,-41.954],[-51.038,-27.617],[-8.249,-12.35],[0.435,-7.006]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.269,-2.699],[11.728,-7.575],[7.73,2.568],[2.362,12.462],[0.891,6.298],[0.935,5.344],[-2.77,4.114],[-10.821,-0.352],[-13.732,-7.376],[-4.859,-2.502],[-0.133,-2.44]],"o":[[-8.878,7.33],[-6.114,3.949],[-3.087,-1.025],[-1.526,-8.052],[-0.252,-1.785],[-0.214,-1.222],[3.936,-5.845],[8.204,0.267],[16.024,8.607],[8.662,4.46],[0.675,12.422]],"v":[[-20.042,19.432],[-66.66,49.812],[-83.142,54.307],[-100.622,31.626],[-110.605,-13.055],[-110.541,-25.505],[-110.309,-40.383],[-92.674,-52.038],[-53.267,-40.8],[-13.254,-20.92],[2.317,-2.15]]}],"t":40.322},{"t":62.09765625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[3.269,-2.699],[11.728,-7.575],[3.91,-1.71],[2.362,12.462],[0.891,6.298],[0.935,5.344],[0.196,0.685],[-7.532,-2.115],[-14.661,-5.294],[-0.548,-0.22],[1.882,-1.558]],"o":[[-8.878,7.33],[-6.114,3.949],[-2.98,1.304],[-1.526,-8.052],[-0.252,-1.785],[-0.214,-1.222],[-0.977,-3.421],[10.998,3.088],[13.081,4.724],[2.444,0.976],[-7.086,5.864]],"v":[[-19.954,7.456],[-70.218,43.014],[-87.507,54.154],[-92.801,32.407],[-99.643,-16.461],[-102.494,-38.045],[-103.471,-43.258],[-91.58,-41.954],[-51.038,-27.617],[-8.249,-12.35],[0.435,-7.006]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.502,-8.233],[18.153,-11.851],[4.093,0.399],[2.362,12.462],[2.659,14.953],[3.273,9.178],[-6.936,4.182],[-7.532,-2.115],[-14.661,-5.294],[-10.786,-3.588],[-4.452,-5.876]],"o":[[-8.271,8.009],[-6.094,3.979],[-3.238,-0.316],[-1.526,-8.052],[-2.659,-14.953],[-1.996,-5.597],[5.667,-3.416],[10.998,3.088],[13.081,4.724],[12.999,4.324],[5.555,7.331]],"v":[[-22.677,24.708],[-61.809,47.252],[-76.375,54.876],[-99.506,41.478],[-106.845,6.036],[-110.435,-19.767],[-108.993,-45.253],[-88.812,-54.248],[-56.223,-43.346],[-23.019,-29.185],[5.606,-5.041]]}],"t":40.322},{"t":62.09765625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[3.269,-2.699],[11.728,-7.575],[3.91,-1.71],[2.362,12.462],[0.891,6.298],[0.935,5.344],[0.196,0.685],[-7.532,-2.115],[-14.661,-5.294],[-0.548,-0.22],[1.882,-1.558]],"o":[[-8.878,7.33],[-6.114,3.949],[-2.98,1.304],[-1.526,-8.052],[-0.252,-1.785],[-0.214,-1.222],[-0.977,-3.421],[10.998,3.088],[13.081,4.724],[2.444,0.976],[-7.086,5.864]],"v":[[-19.954,7.456],[-70.218,43.014],[-87.507,54.154],[-92.801,32.407],[-99.643,-16.461],[-102.494,-38.045],[-103.471,-43.258],[-91.58,-41.954],[-51.038,-27.617],[-8.249,-12.35],[0.435,-7.006]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.125,-8.386],[20.489,-7.4],[6.842,2.815],[5.392,12.432],[3.345,15.71],[0.858,9.371],[-6.936,4.182],[-7.532,-2.115],[-14.661,-5.294],[-9.337,-6.482],[-1.511,-8.904]],"o":[[-9.469,6.549],[-6.845,2.472],[-3.008,-1.238],[-4.226,-9.745],[-2.745,-12.892],[-0.648,-7.082],[5.667,-3.416],[10.998,3.088],[13.081,4.724],[10.991,7.63],[2.229,13.136]],"v":[[-21.182,25.528],[-65.108,52.487],[-85.645,57.105],[-99.311,36.5],[-110.414,3.372],[-114.205,-25.134],[-105.755,-49.722],[-84.247,-54.354],[-52.911,-45.114],[-19.078,-27.014],[0.932,-6.923]]}],"t":40.322},{"t":62.09765625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"e":{"a":0,"ix":2,"k":0},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":1,"ix":3,"k":[{"e":[-358],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[5],"t":40.322},{"t":62.09765625}]},"s":{"a":1,"ix":1,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":40.322},{"t":62.09765625}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"lc":2,"lj":1,"ml":10,"ml2":{"a":0,"ix":8,"k":10},"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":13}},{"a":{"a":0,"ix":1,"k":[-52.527,0.805]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":39.516},{"t":40.322265625}]},"p":{"a":1,"ix":2,"k":[{"e":[-53.264,1.523],"i":{"x":0.25,"y":1},"n":"0p25_1_0p333_0","o":{"x":0.333,"y":0},"s":[-73.527,0.621],"t":40.322,"ti":[-3.37727856636047,-0.150390625],"to":[3.37727856636047,0.150390625]},{"t":62.09765625}]},"r":{"a":1,"ix":6,"k":[{"e":[0],"i":{"x":[0.25],"y":[1]},"n":["0p25_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[125],"t":40.322},{"t":62}]},"s":{"a":1,"ix":3,"k":[{"e":[95,95],"i":{"x":[0.25,0.25],"y":[1,1]},"n":["0p25_1_0p333_0","0p25_1_0p333_0"],"o":{"x":[0.333,0.333],"y":[0,0]},"s":[551,551],"t":40.322},{"t":62.09765625}]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"logo play outline 5","np":5,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-63.528,3.54]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-63.528,3.54]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"logo 1","np":1,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":3,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[4,-65,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[4,-1,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[150],"t":16.936},{"t":74.193359375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Shape Layer 9","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-6.888,-1.034],[-5.036,6.058],[5.18,-3.551],[3.786,-1.13]],"o":[[7.985,1.199],[5.983,-7.197],[-5.183,3.553],[-8.695,2.595]],"v":[[85.762,-6.982],[111.589,-17.862],[104.009,-29.738],[93.608,-17.684]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.491,-7.081],[-30.966,7.045],[13.73,-0.407],[8.207,-2.711]],"o":[[15.358,8.06],[19.962,-4.541],[-13.74,0.407],[-8.207,2.711]],"v":[[18.642,30.94],[70.374,17.651],[75.878,-7.444],[39.26,4.727]]}],"t":52.42},{"e":[{"c":true,"i":[[0.148,-2.047],[-1.234,1.389],[2.312,-1.938],[-0.04,-1.898]],"o":[[-0.183,2.525],[2.986,-3.362],[-1.268,1.063],[0.038,1.779]],"v":[[108.335,-24.141],[112.716,-26.264],[110.65,-31.377],[109.478,-27.98]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-6.888,-1.034],[-5.036,6.058],[5.18,-3.551],[3.786,-1.13]],"o":[[7.985,1.199],[5.983,-7.197],[-5.183,3.553],[-8.695,2.595]],"v":[[85.762,-6.982],[111.589,-17.862],[104.009,-29.738],[93.608,-17.684]]}],"t":55.645},{"t":59.677734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[242.859,-52.375]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":51.252},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":52.42},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.566},{"t":60.734375}]},"p":{"a":0,"ix":2,"k":[88.859,-229.375]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[7.177,6.544],[-8.738,-13.309],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-9.405,-8.575],[6.707,10.215],[4.565,9.006]],"v":[[401.129,15.626],[400.019,-2.962],[382.828,-20.875],[372.805,-16.537],[386.244,6.961]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.703,8.481],[4.983,6.127],[12.068,6.226],[-14.285,-12.581],[-12.849,-16.454]],"o":[[5.007,-5.512],[-12.952,-15.923],[-13.523,-6.976],[10.964,9.656],[8.692,11.131]],"v":[[387.993,-7.418],[383.362,-26.673],[341.474,-60.529],[327.67,-49.276],[366.851,-16.461]]}],"t":48.248},{"e":[{"c":true,"i":[[-0.993,1.489],[1.909,4.171],[2.276,1.629],[-5.541,-5.222],[-5.129,-9.53]],"o":[[2.399,-3.598],[-3.39,-7.407],[-3.667,-2.625],[2.433,2.293],[3.323,6.174]],"v":[[410.755,26.976],[412.085,18.426],[399.222,5.427],[394.157,11.071],[401.517,23.807]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[7.177,6.544],[-8.738,-13.309],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-9.405,-8.575],[6.707,10.215],[4.565,9.006]],"v":[[401.129,15.626],[400.019,-2.962],[382.828,-20.875],[372.805,-16.537],[386.244,6.961]]}],"t":51.252},{"e":[{"c":true,"i":[[-0.763,0.687],[0.18,1.155],[1.359,0.876],[-1.28,-2.687],[-4.111,-4.715]],"o":[[1.39,-1.252],[-0.339,-2.167],[-2.19,-1.41],[0.788,1.738],[0.894,1.025]],"v":[[428.895,47.993],[429.758,45.148],[426.433,40.728],[422.604,43.105],[425.772,47.866]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.993,1.489],[1.909,4.171],[2.276,1.629],[-5.541,-5.222],[-5.129,-9.53]],"o":[[2.399,-3.598],[-3.39,-7.407],[-3.667,-2.625],[2.433,2.293],[3.323,6.174]],"v":[[410.755,26.976],[412.085,18.426],[399.222,5.427],[394.157,11.071],[401.517,23.807]]}],"t":54.479},{"t":58.509765625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[365.484,-29.633]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":47.221},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":48.387},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":58.51},{"t":59.677734375}]},"p":{"a":0,"ix":2,"k":[200.484,-121.633]},"r":{"a":0,"ix":6,"k":29},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-8.917,2.196],[3.207,6.958],[-0.844,10.734],[4.459,-19.392],[-2.119,-7.876]],"o":[[7.833,-2.141],[-4.918,-10.119],[-0.503,-16.492],[-3.761,16.118],[3.666,11.898]],"v":[[408.596,154.877],[412.745,139.088],[405.995,115.788],[392.444,111.262],[392.729,141.753]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.751,1.764],[-2.424,7.903],[-1.784,10.117],[3.062,-19.823],[1.437,-9.478]],"o":[[9.229,-1.86],[7.139,-22.852],[2.052,-11.633],[-2.826,18.292],[-1.437,9.478]],"v":[[399.835,114.727],[409.4,88.963],[419.255,58.246],[399.474,62.446],[388.936,99.323]]}],"t":47.58},{"e":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[4.02,8.942],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-4.492,-9.991],[-4.331,14.842],[8.508,9.457]],"v":[[446.471,206.015],[444.156,190.874],[423.616,169.427],[408.875,159.068],[427.309,204.052]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.917,2.196],[3.207,6.958],[-0.844,10.734],[4.459,-19.392],[-2.119,-7.876]],"o":[[7.833,-2.141],[-4.918,-10.119],[-0.503,-16.492],[-3.761,16.118],[3.666,11.898]],"v":[[408.596,154.877],[412.745,139.088],[405.995,115.788],[392.444,111.262],[392.729,141.753]]}],"t":52.42},{"e":[{"c":true,"i":[[-0.01,4.04],[3.092,0.708],[3.262,1.803],[-0.596,-5.742],[-3.992,-1.697]],"o":[[0.013,-5.454],[-2.523,-0.578],[-1.65,-0.912],[0.528,5.09],[3.469,1.475]],"v":[[471.142,229.879],[466.566,225.043],[461.652,221.472],[456.102,227.307],[462.974,232.818]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[4.02,8.942],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-4.492,-9.991],[-4.331,14.842],[8.508,9.457]],"v":[[446.471,206.015],[444.156,190.874],[423.616,169.427],[408.875,159.068],[427.309,204.052]]}],"t":59.26},{"t":64.654296875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[402.877,73.469]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":46.412},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.58},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":65.1},{"t":66.267578125}]},"p":{"a":0,"ix":2,"k":[207.867,-67.961]},"r":{"a":0,"ix":6,"k":-20},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[11.29,3.117],[0.197,-12.283],[-3.081,-1.171],[-3.113,5.869]],"o":[[-11.144,-3.077],[-0.159,9.887],[3.081,1.171],[3.113,-5.869]],"v":[[329.72,193.61],[313.54,215.066],[329.213,221.643],[337.598,210.68]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[7.995,10.819],[10.117,-17.436],[-3.55,-1.349],[-3.586,6.762]],"o":[[-12.838,-17.494],[-5.717,9.853],[3.549,1.349],[3.586,-6.762]],"v":[[352.151,161.509],[314.797,197.956],[325.389,210.461],[345.809,187.782]]}],"t":46.773},{"e":[{"c":true,"i":[[2.833,0.782],[0.049,-3.082],[-0.773,-0.294],[-0.781,1.473]],"o":[[-2.796,-0.772],[-0.04,2.481],[0.773,0.294],[0.781,-1.473]],"v":[[317.816,242.457],[313.756,247.84],[317.689,249.49],[319.792,246.74]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[11.29,3.117],[0.197,-12.283],[-3.081,-1.171],[-3.113,5.869]],"o":[[-11.144,-3.077],[-0.159,9.887],[3.081,1.171],[3.113,-5.869]],"v":[[329.72,193.61],[313.54,215.066],[329.213,221.643],[337.598,210.68]]}],"t":50.807},{"t":56.0625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[330.678,195.95]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":45.551},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":46.719},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":56.062},{"t":57.23046875}]},"p":{"a":0,"ix":2,"k":[141.52,80.707]},"r":{"a":0,"ix":6,"k":60},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.957,-1.342],[0.612,6.503],[4.065,10.522],[7.951,-6.908],[-2.512,-4.393]],"o":[[6.145,2.789],[-0.46,-4.89],[-1.467,-3.796],[-10.803,9.386],[3.621,6.333]],"v":[[337.702,278.815],[347.336,268.819],[332.095,243.999],[316.172,236.617],[328.291,272.461]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-6.299,1.799],[-0.469,6.534],[1.52,8.173],[3.406,-8.013],[-0.07,-4.265]],"o":[[6.299,-1.799],[0.402,-9.84],[-1.909,-6.473],[-3.406,8.013],[-0.304,13.4]],"v":[[314.217,264.219],[321.753,251.593],[313.307,209.217],[300.113,205.547],[305.614,250.119]]}],"t":45.967},{"e":[{"c":true,"i":[[-2.073,2.612],[4.494,2.543],[5.985,2.616],[1.571,-5.041],[-6.029,-1.983]],"o":[[2.466,-3.108],[-3.338,-1.889],[-3.711,-1.622],[-3.101,9.947],[6.918,2.275]],"v":[[356.925,279.698],[355.495,268.51],[342.563,265.246],[330.417,264.86],[343.974,280.417]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.957,-1.342],[0.612,6.503],[4.065,10.522],[7.951,-6.908],[-2.512,-4.393]],"o":[[6.145,2.789],[-0.46,-4.89],[-1.467,-3.796],[-10.803,9.386],[3.621,6.333]],"v":[[337.702,278.815],[347.336,268.819],[332.095,243.999],[316.172,236.617],[328.291,272.461]]}],"t":50.807},{"e":[{"c":true,"i":[[-2.09,1.074],[0.323,2.58],[2.378,0.334],[0.937,-1.676],[-3.779,-0.758]],"o":[[2.69,-1.352],[0.061,-2.472],[-2.862,-0.104],[-1.245,2.227],[2.121,0.425]],"v":[[360.895,277.772],[363.141,274.149],[359.535,270.209],[353.456,272.24],[355.594,278.428]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.073,2.612],[4.494,2.543],[5.985,2.616],[1.571,-5.041],[-6.029,-1.983]],"o":[[2.466,-3.108],[-3.338,-1.889],[-3.711,-1.622],[-3.101,9.947],[6.918,2.275]],"v":[[356.925,279.698],[355.495,268.51],[342.563,265.246],[330.417,264.86],[343.974,280.417]]}],"t":54.838},{"t":59.677734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[311.207,234.285]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":44.801},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.967},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.678},{"t":60.484375}]},"p":{"a":0,"ix":2,"k":[-24.793,-187.715]},"r":{"a":0,"ix":6,"k":-92},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-5.863,-6.912],[-6.034,7.346],[5.062,0.736],[4.712,-2.057]],"o":[[6.432,7.583],[4.857,-5.913],[-2.524,-0.367],[-4.712,2.057]],"v":[[144.608,394.334],[175.766,387.545],[169.188,379.014],[149.13,380.929]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.863,-6.912],[-6.034,7.346],[1.302,2.193],[4.712,-2.057]],"o":[[6.432,7.583],[4.857,-5.913],[-1.302,-2.193],[-4.712,2.057]],"v":[[170.108,388.834],[193.266,376.795],[186.938,365.264],[171.13,371.429]]}],"t":40.879},{"e":[{"c":true,"i":[[-1.749,-2.192],[-3.165,2.925],[2.295,0.333],[2.23,-0.677]],"o":[[0.462,0.578],[1.126,-1.041],[-1.144,-0.166],[-0.852,0.259]],"v":[[116.499,391.697],[122.124,391.566],[120.615,389.285],[117.416,388.113]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.863,-6.912],[-6.034,7.346],[5.062,0.736],[4.712,-2.057]],"o":[[6.432,7.583],[4.857,-5.913],[-2.524,-0.367],[-4.712,2.057]],"v":[[144.608,394.334],[175.766,387.545],[169.188,379.014],[149.13,380.929]]}],"t":46.719},{"t":52.55859375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[180.867,376.203]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":39.711},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":40.879},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":52.559},{"t":53.7265625}]},"p":{"a":0,"ix":2,"k":[-196.133,54.203]},"r":{"a":0,"ix":6,"k":90},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.291,-2.98],[-7.25,4.085],[5.654,8.583],[5.059,-10.289],[1.871,-8.886]],"o":[[-3.119,7.2],[12.7,-7.156],[-2.239,-3.399],[-6.315,12.843],[-2.621,12.448]],"v":[[177.733,375.065],[190.522,382.514],[211.268,337.566],[194.441,338.289],[188.129,352.386]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.721,-3.167],[-3.431,7.581],[5.654,8.583],[5.059,-10.289],[1.871,-8.886]],"o":[[1.742,7.65],[6.011,-13.28],[-2.239,-3.399],[-6.315,12.843],[-2.621,12.448]],"v":[[197.421,355.676],[212.139,354.121],[213.768,307.566],[196.941,308.289],[197.129,333.886]]}],"t":40.1},{"e":[{"c":true,"i":[[1.788,-1.432],[-5.868,0.123],[-2.518,5.434],[5.114,1.499],[2.58,-1.872]],"o":[[-4.319,3.46],[5.414,-0.113],[1.711,-3.692],[-2.691,-0.789],[-1.879,1.364]],"v":[[156.319,384.501],[161.836,393.363],[189.018,380.316],[183.941,372.039],[160.879,381.386]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.291,-2.98],[-7.25,4.085],[5.654,8.583],[5.059,-10.289],[1.871,-8.886]],"o":[[-3.119,7.2],[12.7,-7.156],[-2.239,-3.399],[-6.315,12.843],[-2.621,12.448]],"v":[[177.733,375.065],[190.522,382.514],[211.268,337.566],[194.441,338.289],[188.129,352.386]]}],"t":45.941},{"e":[{"c":true,"i":[[0.744,-0.596],[-2.442,0.051],[-1.048,2.261],[2.128,0.624],[1.074,-0.779]],"o":[[-1.797,1.44],[2.253,-0.047],[0.712,-1.537],[-1.12,-0.328],[-0.782,0.568]],"v":[[152.797,387.943],[155.093,391.631],[160.788,389.739],[158.675,386.294],[154.695,386.646]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.788,-1.432],[-5.868,0.123],[-2.518,5.434],[5.114,1.499],[2.58,-1.872]],"o":[[-4.319,3.46],[5.414,-0.113],[1.711,-3.692],[-2.691,-0.789],[-1.879,1.364]],"v":[[156.319,384.501],[161.836,393.363],[189.018,380.316],[183.941,372.039],[160.879,381.386]]}],"t":51.779},{"t":55.28515625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[206.104,331.532]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":38.934},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":40.1},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":55.285},{"t":56.451171875}]},"p":{"a":0,"ix":2,"k":[-152.656,92.957]},"r":{"a":0,"ix":6,"k":112},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":false,"i":[[-15,1.5],[-38.315,-17.37],[-0.928,-50.216],[37.712,-6.486],[51.829,-5.767],[6.015,29.791],[-3.621,45.539],[-56.949,14.763],[-50.194,12.034],[-38,-44],[-21,-57],[28.841,-34.61],[69.662,-3.195],[43.026,5.819],[12.296,65.237]],"o":[[15,-1.5],[38.315,17.37],[0.928,50.216],[-58.651,8.258],[-56.8,6.29],[-5.8,-28.554],[3.621,-45.539],[63.535,-16.365],[61.351,-14.708],[36.888,42.712],[12.907,35.034],[-25,30],[-49.329,2.263],[-84.727,-11.458],[-6.123,-32.489]],"v":[[-3,-189.5],[123.573,-191.621],[183,-28],[130.252,43.17],[-80.811,95.607],[-193.612,2.888],[-197.621,-94.461],[-86.592,-209.641],[36.435,-224.29],[180,-195],[221,-33],[199,66],[65.338,77.195],[-84.273,114.458],[-211.2,12.815]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-15,1.5],[-38.315,-17.37],[-0.928,-50.216],[37.712,-6.486],[51.829,-5.767],[6.015,29.791],[-3.621,45.539],[-56.949,14.763],[-50.194,12.034],[-38,-44],[-21,-57],[28.841,-34.61],[69.662,-3.195],[43.026,5.819],[12.296,65.237]],"o":[[15,-1.5],[38.315,17.37],[0.928,50.216],[-58.651,8.258],[-56.8,6.29],[-5.8,-28.554],[3.621,-45.539],[63.535,-16.365],[61.351,-14.708],[36.888,42.712],[12.907,35.034],[-25,30],[-49.329,2.263],[-84.727,-11.458],[-6.123,-32.489]],"v":[[-3,-189.5],[123.573,-191.621],[183,-28],[130.252,43.17],[-80.811,95.607],[-193.612,2.888],[-197.621,-94.461],[-86.592,-209.641],[36.435,-224.29],[180,-195],[221,-33],[206,54],[67.338,89.195],[-84.273,114.458],[-211.2,12.815]]}],"t":31.451},{"e":[{"c":false,"i":[[-15,1.5],[-37.578,-19.583],[-3,-44],[37.712,-6.486],[51.829,-5.767],[6.015,29.791],[3.794,40.79],[-56.949,14.763],[-50.194,12.034],[-38,-44],[-21,-57],[28.841,-34.61],[69.662,-3.195],[43.026,5.819],[12.296,65.237]],"o":[[15,-1.5],[37.578,19.583],[3,44],[-58.651,8.258],[-56.8,6.29],[-5.8,-28.554],[-2.589,-29.677],[63.535,-16.365],[61.351,-14.708],[36.888,42.712],[12.907,35.034],[-25,30],[-49.329,2.263],[-84.727,-11.458],[-6.123,-32.489]],"v":[[-3,-189.5],[123.573,-184.621],[166,-45],[114.252,37.17],[-70.811,67.607],[-143.612,8.888],[-158.621,-101.461],[-73.592,-173.641],[44.435,-197.29],[172,-174],[221,-33],[199,66],[65.338,77.195],[-84.273,114.458],[-211.2,12.815]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-15,1.5],[-38.315,-17.37],[-0.928,-50.216],[37.712,-6.486],[51.829,-5.767],[6.015,29.791],[-3.621,45.539],[-56.949,14.763],[-50.194,12.034],[-38,-44],[-21,-57],[28.841,-34.61],[69.662,-3.195],[43.026,5.819],[12.296,65.237]],"o":[[15,-1.5],[38.315,17.37],[0.928,50.216],[-58.651,8.258],[-56.8,6.29],[-5.8,-28.554],[3.621,-45.539],[63.535,-16.365],[61.351,-14.708],[36.888,42.712],[12.907,35.034],[-25,30],[-49.329,2.263],[-84.727,-11.458],[-6.123,-32.489]],"v":[[-3,-189.5],[123.573,-191.621],[183,-28],[130.252,43.17],[-80.811,95.607],[-193.612,2.888],[-197.621,-94.461],[-86.592,-209.641],[36.435,-224.29],[180,-195],[221,-33],[199,66],[65.338,77.195],[-84.273,114.458],[-211.2,12.815]]}],"t":33.064},{"t":50.806640625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":false,"i":[[-11.5,1.5],[-41,-23],[-3,-56],[13.087,-9.063],[51.205,-8.814],[23,9],[19.081,46.266],[-11.971,51.481],[-45.803,14.665],[-27.796,-0.619],[-45.79,-47.157],[-13.75,-44.5],[29.336,-29.626],[54.166,-5.683],[66.818,2.018],[5.047,27.405]],"o":[[11.5,-1.5],[25.845,14.499],[3,56],[-21.772,16.534],[-62.024,13.529],[-23,-9],[-10.971,-26.602],[9.881,-42.493],[48.898,-15.655],[62.153,1.384],[33.5,34.5],[20.558,66.533],[-34.344,34.683],[-49.626,5.207],[-66.339,-2.004],[-5.047,-27.405]],"v":[[0,-190],[138,-184],[185.417,-56],[148,46],[40.024,60.471],[-121.796,90.374],[-189.029,8.602],[-185.029,-120.481],[-82.898,-206.345],[59.847,-232.384],[178.5,-180.5],[209.25,-60.5],[189,59.5],[44.834,71.683],[-97.661,104.004],[-210.313,28.794]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-11.5,1.5],[-41,-23],[-3,-56],[13.087,-9.063],[51.205,-8.814],[23,9],[19.081,46.266],[-11.971,51.481],[-45.803,14.665],[-27.796,-0.619],[-45.79,-47.157],[-13.75,-44.5],[29.336,-29.626],[54.166,-5.683],[66.818,2.018],[5.047,27.405]],"o":[[11.5,-1.5],[25.845,14.499],[3,56],[-21.772,16.534],[-62.024,13.529],[-23,-9],[-10.971,-26.602],[9.881,-42.493],[48.898,-15.655],[62.153,1.384],[33.5,34.5],[20.558,66.533],[-34.344,34.683],[-49.626,5.207],[-66.339,-2.004],[-5.047,-27.405]],"v":[[0,-190],[138,-184],[185.417,-56],[148,46],[40.024,60.471],[-121.796,90.374],[-189.029,8.602],[-185.029,-120.481],[-82.898,-206.345],[59.847,-232.384],[178.5,-180.5],[209.25,-60.5],[189,59.5],[46.834,83.683],[-97.661,104.004],[-210.313,28.794]]}],"t":31.451},{"e":[{"c":false,"i":[[-11.5,1.5],[-41,-23],[-3,-56],[13.087,-9.063],[51.205,-8.814],[23,9],[5,22],[5.969,43.216],[-27.724,1.98],[-27.292,5.304],[-45.79,-47.157],[-13.75,-44.5],[29.336,-29.626],[54.166,-5.683],[66.818,2.018],[5.047,27.405]],"o":[[11.5,-1.5],[25.845,14.499],[3,56],[-21.772,16.534],[-63.325,10.796],[-23,-9],[-5,-22],[-5.969,-43.217],[0,0],[61.979,-12.046],[33.5,34.5],[20.558,66.533],[-34.344,34.683],[-49.626,5.207],[-66.339,-2.004],[-5.047,-27.405]],"v":[[0,-190],[130,-182],[165.417,-61],[147,23],[41.024,50.471],[-110.796,62.374],[-144.029,10.602],[-160.029,-98.481],[-73.898,-173.345],[43.847,-197.384],[176.5,-168.5],[209.25,-60.5],[189,59.5],[44.834,71.683],[-97.661,104.004],[-210.313,28.794]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-11.5,1.5],[-41,-23],[-3,-56],[13.087,-9.063],[51.205,-8.814],[23,9],[19.081,46.266],[-11.971,51.481],[-45.803,14.665],[-27.796,-0.619],[-45.79,-47.157],[-13.75,-44.5],[29.336,-29.626],[54.166,-5.683],[66.818,2.018],[5.047,27.405]],"o":[[11.5,-1.5],[25.845,14.499],[3,56],[-21.772,16.534],[-62.024,13.529],[-23,-9],[-10.971,-26.602],[9.881,-42.493],[48.898,-15.655],[62.153,1.384],[33.5,34.5],[20.558,66.533],[-34.344,34.683],[-49.626,5.207],[-66.339,-2.004],[-5.047,-27.405]],"v":[[0,-190],[138,-184],[185.417,-56],[148,46],[40.024,60.471],[-121.796,90.374],[-189.029,8.602],[-185.029,-120.481],[-82.898,-206.345],[59.847,-232.384],[178.5,-180.5],[209.25,-60.5],[189,59.5],[44.834,71.683],[-97.661,104.004],[-210.313,28.794]]}],"t":33.064},{"t":50.806640625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":false,"i":[[-39,4.5],[-36,-3.5],[-7.408,-63.209],[31.359,-3.447],[28.632,-5.363],[24,17],[3,36],[-5.427,20.845],[-16.145,4.473],[-36.409,8.115],[-37,-25],[-7.758,-65.292],[30,-16.5],[66.602,-15.948],[68.619,-4.96],[-18.161,27.854]],"o":[[39,-4.5],[49.358,4.799],[8.554,73.485],[-23.792,3.221],[-36.364,6.981],[-24,-17],[-3,-36],[7.619,-30.98],[22.471,-6.384],[53.482,-12.12],[50.51,34.128],[6,50.5],[-34.787,19.133],[-72.334,17.32],[-76.228,5.51],[16.967,-26.022]],"v":[[-2.5,-188.5],[120,-196],[182.432,-74.005],[142.903,44.752],[-29.985,76.262],[-139.01,86.019],[-195.66,-60.5],[-179.631,-121.131],[-110.5,-178.67],[45.376,-215.521],[170,-193],[212,-29.5],[195,70.5],[49.334,74.68],[-84.272,116.49],[-211.339,12.146]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-39,4.5],[-36,-3.5],[-7.408,-63.209],[31.359,-3.447],[28.632,-5.363],[24,17],[3,36],[-5.427,20.845],[-16.145,4.473],[-36.409,8.115],[-37,-25],[-7.758,-65.292],[30,-16.5],[66.602,-15.948],[68.619,-4.96],[-18.161,27.854]],"o":[[39,-4.5],[49.358,4.799],[8.554,73.485],[-23.792,3.221],[-36.364,6.981],[-24,-17],[-3,-36],[7.619,-30.98],[22.471,-6.384],[53.482,-12.12],[50.51,34.128],[6,50.5],[-34.787,19.133],[-72.334,17.32],[-76.228,5.51],[16.967,-26.022]],"v":[[-2.5,-188.5],[120,-196],[182.432,-74.005],[142.903,44.752],[-29.985,76.262],[-139.01,86.019],[-195.66,-60.5],[-179.631,-121.131],[-110.5,-178.67],[45.376,-215.521],[170,-193],[212,-29.5],[195,70.5],[51.334,86.68],[-84.272,116.49],[-211.339,12.146]]}],"t":31.451},{"e":[{"c":false,"i":[[-39,4.5],[-36,-3.5],[-7.408,-63.209],[31.359,-3.447],[28.632,-5.363],[24,17],[3,36],[-5.427,20.845],[-16.145,4.473],[-36.409,8.115],[-37,-25],[-7.758,-65.292],[30,-16.5],[66.602,-15.948],[68.619,-4.96],[8.582,29.856]],"o":[[39,-4.5],[49.358,4.799],[8.554,73.485],[-23.792,3.221],[-36.364,6.981],[-24,-17],[-3,-36],[7.619,-30.98],[22.471,-6.384],[53.482,-12.12],[50.51,34.128],[6,50.5],[-34.787,19.133],[-72.334,17.32],[-76.228,5.51],[-8.582,-29.856]],"v":[[-2.5,-188.5],[94,-191],[166.432,-76.005],[119.903,36.752],[-15.985,60.262],[-120.01,60.019],[-155.66,-43.5],[-156.631,-116.131],[-90.5,-169.67],[44.376,-199.521],[168,-181],[212,-29.5],[195,70.5],[49.334,74.68],[-84.272,116.49],[-212.339,23.146]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-39,4.5],[-36,-3.5],[-7.408,-63.209],[31.359,-3.447],[28.632,-5.363],[24,17],[3,36],[-5.427,20.845],[-16.145,4.473],[-36.409,8.115],[-37,-25],[-7.758,-65.292],[30,-16.5],[66.602,-15.948],[68.619,-4.96],[-18.161,27.854]],"o":[[39,-4.5],[49.358,4.799],[8.554,73.485],[-23.792,3.221],[-36.364,6.981],[-24,-17],[-3,-36],[7.619,-30.98],[22.471,-6.384],[53.482,-12.12],[50.51,34.128],[6,50.5],[-34.787,19.133],[-72.334,17.32],[-76.228,5.51],[16.967,-26.022]],"v":[[-2.5,-188.5],[120,-196],[182.432,-74.005],[142.903,44.752],[-29.985,76.262],[-139.01,86.019],[-195.66,-60.5],[-179.631,-121.131],[-110.5,-178.67],[45.376,-215.521],[170,-193],[212,-29.5],[195,70.5],[49.334,74.68],[-84.272,116.49],[-211.339,12.146]]}],"t":33.064},{"t":50.806640625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":31.535},{"t":54.89453125}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":17.52},{"t":40.87890625}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":12}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":4,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[0,0,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[6.5,-5.5,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0.3],"y":[1]},"n":["0p3_1_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[23],"t":40.322},{"t":75}]},"s":{"a":0,"ix":6,"k":[325,325,100]}},"nm":"New YT Logo","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-0.326,-1.86],[-0.255,-1.494],[-1.767,1.07],[-1.963,1.265],[1.747,0.851],[1.85,0.446]],"o":[[0.282,1.61],[0.326,1.907],[4.66,-2.82],[2.093,-1.349],[-3.535,-1.721],[-1.349,-0.326]],"v":[[-11.952,-10.404],[-8.696,15.782],[-6.743,16.572],[16.792,0.852],[16.191,-1.472],[-10.836,-11.474]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":3,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"ix":8,"k":10},"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":61.291},{"t":62.09765625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Play outline","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[1.953,-1.488],[0,0],[0.372,3.814],[0.27,2.158],[-1.767,-0.651],[-5.94,-2.599]],"o":[[-0.145,0.11],[-2.233,1.674],[0,0],[-0.186,-1.488],[3.665,1.35],[2.977,1.302]],"v":[[17.908,1.828],[-5.626,17.549],[-10.092,15.596],[-13.347,-11.102],[-10.65,-12.869],[17.722,-2.358]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,1,1,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Play fill","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[11.851,-1.581],[3.54,-1.275],[3.086,-2.989],[-0.716,-7.44],[-1.804,-5.198],[-5.767,-0.279],[-7.298,2.017],[-15.482,0.075],[-5.023,9.116],[0.102,3.841],[0.005,0.359],[0.683,4.399],[2.974,2.189],[4.279,-0.465]],"o":[[-11.854,1.582],[-4.894,1.761],[-5.673,5.493],[0.556,5.771],[2.434,7.014],[5.316,0.257],[10.074,-2.784],[7.07,-0.034],[2.936,-5.297],[-0.011,-0.424],[-0.063,-4.579],[-0.837,-5.395],[-4.847,-3.567],[-5.475,0.595]],"v":[[-3.238,-34.06],[-33.505,-29.05],[-45.533,-21.986],[-50.743,-3.474],[-45.254,31.317],[-32.324,42.572],[-12.991,40.032],[24.699,35.317],[47.862,24.805],[50.462,8.871],[50.435,7.694],[47.118,-19.567],[39.676,-32.962],[24.699,-37.427]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":3,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"ix":8,"k":10},"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":41.129},{"t":41.935546875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Logo outline","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0.051,3.677],[1.339,3.555],[3.406,2.55],[4.532,0.087],[6.159,-2.255],[2.827,-2.784],[-0.733,-7.747],[-1.644,-4.818],[-5.513,-0.59],[-39.125,-0.085],[-2.451,4.497]],"o":[[-0.066,-4.824],[-0.864,-2.295],[-4.355,-3.26],[-3.16,-0.06],[-4.595,1.682],[-4.6,4.531],[0.665,7.025],[1.817,5.326],[16.83,1.8],[11.852,0.026],[2.882,-5.289]],"v":[[49.159,8.134],[44.959,-23.102],[38.853,-32.13],[26.415,-36.073],[-33.735,-27.452],[-44.765,-20.814],[-49.523,-4.122],[-43.917,31.02],[-33.246,41.022],[26.681,33.696],[46.878,24.062]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":58.871},{"t":59.677734375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Red fill","np":2,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":6,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[8,-59,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[8,5,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[120],"t":31.451},{"t":63.708984375}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p167_0p167","0_1_0p167_0p167","0p667_1_0p167_-1p171"],"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-1.171]},"s":[198,198,100],"t":31.451},{"t":60.484375}]}},"nm":"Shape Layer 11","op":83,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-4.179,5.573],[2.943,7.307],[-0.668,-6.244],[0.802,-3.869]],"o":[[4.844,-6.46],[-3.496,-8.681],[0.668,6.249],[-1.841,8.885]],"v":[[69.296,-33.328],[71.973,-61.224],[57.924,-60.187],[63.598,-45.312]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.203,-5.516],[-22.893,20.519],[11.802,-7.029],[6.815,-4.688]],"o":[[9.672,3.756],[15.233,-13.653],[-13.384,7.971],[-7.121,4.898]],"v":[[6.66,49.627],[54.714,17.911],[45.779,4.127],[20.757,20.39]]}],"t":52.42},{"e":[{"c":true,"i":[[-1.603,-1.281],[0.446,1.804],[-0.288,-3.003],[-1.587,-1.042]],"o":[[1.977,1.581],[-1.08,-4.365],[0.158,1.647],[1.487,0.976]],"v":[[50.032,-58.071],[50.764,-62.884],[45.38,-64.077],[47.515,-61.187]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.179,5.573],[2.943,7.307],[-0.668,-6.244],[0.802,-3.869]],"o":[[4.844,-6.46],[-3.496,-8.681],[0.668,6.249],[-1.841,8.885]],"v":[[69.296,-33.328],[71.973,-61.224],[57.924,-60.187],[63.598,-45.312]]}],"t":57.258},{"t":61.845703125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[49.414,12.564]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":51.252},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":52.42},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":61.734},{"t":62.90234375}]},"p":{"a":0,"ix":2,"k":[-129.586,-94.436]},"r":{"a":0,"ix":6,"k":-58},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-1.247,2.256],[5.565,3.559],[7.177,6.544],[-8.738,-13.309],[-8.848,-4.831]],"o":[[3.411,-6.173],[-8.295,-5.304],[-9.405,-8.575],[6.707,10.215],[8.862,4.839]],"v":[[397.21,-7.242],[385.77,-21.935],[368.596,-35.393],[358.574,-31.055],[380.034,-5.956]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.703,8.481],[4.983,6.127],[12.068,6.226],[-14.285,-12.581],[-12.849,-16.454]],"o":[[5.007,-5.512],[-12.952,-15.923],[-13.523,-6.976],[10.964,9.656],[8.692,11.131]],"v":[[387.993,-7.418],[383.362,-26.673],[341.474,-60.529],[327.67,-49.276],[366.851,-16.461]]}],"t":48.248},{"e":[{"c":true,"i":[[1.094,1.417],[4.464,-1.056],[2.587,1.069],[-6.583,-3.825],[-8.918,0.515]],"o":[[-2.643,-3.424],[-5.755,1.361],[-4.168,-1.722],[2.89,1.679],[7,-0.404]],"v":[[449.504,-13.056],[441.828,-17.05],[429.998,-17.645],[426.349,-10.997],[443.548,-5.316]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.247,2.256],[5.565,3.559],[7.177,6.544],[-8.738,-13.309],[-8.848,-4.831]],"o":[[3.411,-6.173],[-8.295,-5.304],[-9.405,-8.575],[6.707,10.215],[8.862,4.839]],"v":[[397.21,-7.242],[385.77,-21.935],[368.596,-35.393],[358.574,-31.055],[380.034,-5.956]]}],"t":51.613},{"e":[{"c":true,"i":[[0.478,0.909],[1.164,0.11],[1.184,-1.101],[-2.92,0.578],[-5.583,2.822]],"o":[[-0.871,-1.656],[-2.183,-0.206],[-1.907,1.774],[1.879,-0.335],[1.214,-0.614]],"v":[[462.507,-22.141],[459.963,-23.678],[454.859,-21.546],[456.219,-17.25],[461.614,-19.146]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.094,1.417],[4.464,-1.056],[2.587,1.069],[-6.583,-3.825],[-8.918,0.515]],"o":[[-2.643,-3.424],[-5.755,1.361],[-4.168,-1.722],[2.89,1.679],[7,-0.404]],"v":[[449.504,-13.056],[441.828,-17.05],[429.998,-17.645],[426.349,-10.997],[443.548,-5.316]]}],"t":54.838},{"t":58.064453125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[365.484,-29.633]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":47.221},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":48.387},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":58.51},{"t":59.677734375}]},"p":{"a":0,"ix":2,"k":[-64.516,-139.633]},"r":{"a":0,"ix":6,"k":-62},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-8.917,2.196],[3.207,6.958],[-0.844,10.734],[4.459,-19.392],[-2.119,-7.876]],"o":[[7.833,-2.141],[-4.918,-10.119],[-0.503,-16.492],[-3.761,16.118],[3.666,11.898]],"v":[[424.126,161.791],[428.275,146.003],[421.525,122.702],[407.975,118.177],[408.259,148.668]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.751,1.764],[-2.424,7.903],[-1.784,10.117],[3.062,-19.823],[1.437,-9.478]],"o":[[9.229,-1.86],[7.139,-22.852],[2.052,-11.633],[-2.826,18.292],[-1.437,9.478]],"v":[[399.835,114.727],[409.4,88.963],[419.255,58.246],[399.474,62.446],[388.936,99.323]]}],"t":47.58},{"e":[{"c":true,"i":[[-1.813,2.694],[6.968,4.55],[6.71,7.148],[-0.949,-20.035],[-5.456,-3.029]],"o":[[4.38,-6.51],[-14.412,-9.411],[-7.498,-7.987],[0.731,15.444],[11.121,6.175]],"v":[[474.569,195.314],[467.455,181.75],[441.057,168.149],[423.747,163.148],[455.811,199.69]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.917,2.196],[3.207,6.958],[-0.844,10.734],[4.459,-19.392],[-2.119,-7.876]],"o":[[7.833,-2.141],[-4.918,-10.119],[-0.503,-16.492],[-3.761,16.118],[3.666,11.898]],"v":[[424.126,161.791],[428.275,146.003],[421.525,122.702],[407.975,118.177],[408.259,148.668]]}],"t":52.42},{"e":[{"c":true,"i":[[-0.063,4],[3.165,0.826],[3.315,1.955],[-0.527,-6.082],[-4.013,-1.749]],"o":[[0.142,-5.46],[-2.767,-0.842],[-1.757,-1.108],[0.473,5.337],[3.625,1.628]],"v":[[499.512,207.038],[494.93,201.97],[489.562,198.061],[483.755,203.571],[491.079,209.938]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.813,2.694],[6.968,4.55],[6.71,7.148],[-0.949,-20.035],[-5.456,-3.029]],"o":[[4.38,-6.51],[-14.412,-9.411],[-7.498,-7.987],[0.731,15.444],[11.121,6.175]],"v":[[474.569,195.314],[467.455,181.75],[441.057,168.149],[423.747,163.148],[455.811,199.69]]}],"t":58.871},{"t":64.515625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[402.877,73.469]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":46.773},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.58},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":64.516},{"t":65.322265625}]},"p":{"a":0,"ix":2,"k":[86.867,13.039]},"r":{"a":0,"ix":6,"k":66},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[8.982,-7.476],[-0.935,-10.09],[-4.858,5.024],[-0.897,6.59]],"o":[[-7.958,6.624],[0.913,9.847],[2.294,-2.372],[0.897,-6.59]],"v":[[320.817,237.519],[312.93,263.37],[329.853,264.192],[333.974,250.904]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.186,0.552],[10.117,-17.436],[-3.55,-1.349],[-3.586,6.762]],"o":[[-17.701,-1.194],[-5.717,9.853],[3.549,1.349],[3.586,-6.762]],"v":[[355.736,164.275],[319.039,197.882],[324.31,209.419],[342.597,186.07]]}],"t":50.029},{"e":[{"c":true,"i":[[2.898,-0.485],[-1.255,-2.815],[-0.825,0.059],[-0.087,1.665]],"o":[[-2.861,0.479],[1.01,2.266],[0.825,-0.059],[0.087,-1.665]],"v":[[320.288,285.341],[318.877,291.934],[323.139,291.772],[323.886,288.391]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.982,-7.476],[-0.935,-10.09],[-4.858,5.024],[-0.897,6.59]],"o":[[-7.958,6.624],[0.913,9.847],[2.294,-2.372],[0.897,-6.59]],"v":[[320.817,237.519],[312.93,263.37],[329.853,264.192],[333.974,250.904]]}],"t":54.033},{"t":59.677734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[330.678,195.95]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":49.193},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":49.973},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.678},{"t":60.484375}]},"p":{"a":0,"ix":2,"k":[46.52,23.707]},"r":{"a":0,"ix":6,"k":46},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.957,-1.342],[0.612,6.503],[4.065,10.522],[7.951,-6.908],[-2.512,-4.393]],"o":[[6.145,2.789],[-0.46,-4.89],[-1.467,-3.796],[-10.803,9.386],[3.621,6.333]],"v":[[337.702,278.815],[347.336,268.819],[332.095,243.999],[316.172,236.617],[328.291,272.461]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-6.299,1.799],[-1.918,9.765],[12.822,9.564],[-5.616,-6.653],[3.778,-10.959]],"o":[[6.299,-1.799],[3.006,-15.305],[-9.84,-7.34],[5.616,6.653],[-2.216,6.43]],"v":[[308.007,264.208],[318.391,251.476],[304.753,206.716],[295.528,216.838],[302.858,249.168]]}],"t":45.967},{"e":[{"c":true,"i":[[-2.073,2.612],[4.494,2.543],[5.985,2.616],[0.702,-5.233],[-8.082,-3.812]],"o":[[2.466,-3.108],[-3.338,-1.889],[-3.711,-1.622],[-0.694,5.172],[6.587,3.107]],"v":[[391.939,297.312],[390.509,286.124],[377.293,284.078],[365.431,282.474],[378.988,298.031]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.957,-1.342],[0.612,6.503],[4.065,10.522],[7.951,-6.908],[-2.512,-4.393]],"o":[[6.145,2.789],[-0.46,-4.89],[-1.467,-3.796],[-10.803,9.386],[3.621,6.333]],"v":[[337.702,278.815],[347.336,268.819],[332.095,243.999],[316.172,236.617],[328.291,272.461]]}],"t":50.807},{"e":[{"c":true,"i":[[-1.752,1.566],[0.984,2.406],[2.382,-0.297],[0.468,-1.862],[-3.846,0.253]],"o":[[2.245,-2.007],[-0.586,-2.402],[-2.79,0.645],[-0.622,2.474],[2.159,-0.142]],"v":[[414.396,291.543],[415.621,287.461],[411.113,284.597],[405.773,288.142],[409.449,293.558]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.073,2.612],[4.494,2.543],[5.985,2.616],[0.702,-5.233],[-8.082,-3.812]],"o":[[2.466,-3.108],[-3.338,-1.889],[-3.711,-1.622],[-0.694,5.172],[6.587,3.107]],"v":[[391.939,297.312],[390.509,286.124],[377.293,284.078],[365.431,282.474],[378.988,298.031]]}],"t":54.838},{"t":59.677734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[311.207,234.285]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":44.801},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.967},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.678},{"t":60.484375}]},"p":{"a":0,"ix":2,"k":[-122.793,-107.715]},"r":{"a":0,"ix":6,"k":-140},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-5.824,-6.867],[-6.007,7.305],[5.035,0.732],[4.689,-2.044]],"o":[[6.376,7.517],[4.822,-5.867],[-2.511,-0.365],[-4.676,2.04]],"v":[[106.204,397.059],[137.121,390.333],[130.591,381.861],[110.692,383.747]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.863,-6.912],[-9.829,7.087],[14.414,-5.073],[4.712,-2.057]],"o":[[6.432,7.583],[6.207,-4.475],[-2.406,0.847],[-4.712,2.057]],"v":[[170.108,388.834],[201.326,373.436],[192.525,360.361],[171.13,371.429]]}],"t":41.129},{"e":[{"c":true,"i":[[-1.181,-2.706],[-3.896,2.111],[2.189,0.947],[2.395,-0.087]],"o":[[0.388,0.876],[1.474,-0.799],[-1.092,-0.472],[-0.99,0.044]],"v":[[83.098,390.291],[89.189,391.639],[88.251,388.869],[85.063,386.868]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.824,-6.867],[-6.007,7.305],[5.035,0.732],[4.689,-2.044]],"o":[[6.376,7.517],[4.822,-5.867],[-2.511,-0.365],[-4.676,2.04]],"v":[[106.204,397.059],[137.121,390.333],[130.591,381.861],[110.692,383.747]]}],"t":46.773},{"t":52.419921875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[180.867,376.203]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":39.961},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":41.129},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":52.559},{"t":53.7265625}]},"p":{"a":0,"ix":2,"k":[-106.133,25.203]},"r":{"a":0,"ix":6,"k":269},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.674,-12.115],[-2.46,13.816],[-5.666,13.221],[6.491,-9.451],[1.871,-8.886]],"o":[[1.691,7.662],[2.556,-14.352],[4.249,-9.913],[-6.787,9.881],[-2.621,12.448]],"v":[[181.686,425.644],[200.612,420.55],[206.614,374.991],[194.321,373.792],[182.362,396.293]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.721,-3.167],[-3.431,7.581],[5.654,8.583],[5.059,-10.289],[1.871,-8.886]],"o":[[1.742,7.65],[6.011,-13.28],[-2.239,-3.399],[-6.315,12.843],[-2.621,12.448]],"v":[[197.421,355.676],[212.139,354.121],[213.768,307.566],[196.941,308.289],[197.129,333.886]]}],"t":50},{"e":[{"c":true,"i":[[-1.661,-0.889],[7.605,8.008],[3.898,4.931],[2.238,-3.77],[-2.25,-1.347]],"o":[[4.014,2.149],[-6.131,-6.456],[-2.076,-2.626],[-1.178,1.984],[1.639,0.981]],"v":[[202.636,450.926],[207.156,440.915],[198.577,429.175],[193.356,430.703],[198.806,448.482]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.674,-12.115],[-2.46,13.816],[-5.666,13.221],[6.491,-9.451],[1.871,-8.886]],"o":[[1.691,7.662],[2.556,-14.352],[4.249,-9.913],[-6.787,9.881],[-2.621,12.448]],"v":[[181.686,425.644],[200.612,420.55],[206.614,374.991],[194.321,373.792],[182.362,396.293]]}],"t":55.645},{"e":[{"c":true,"i":[[-0.824,-0.48],[0.926,2.26],[2.487,0.165],[-0.183,-2.21],[-1.113,-0.722]],"o":[[1.99,1.159],[-0.854,-2.086],[-1.69,-0.112],[0.096,1.163],[0.811,0.526]],"v":[[218.314,466.062],[220.93,462.594],[217.117,457.961],[214.662,461.171],[216.422,464.757]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.661,-0.889],[7.605,8.008],[3.898,4.931],[2.238,-3.77],[-2.25,-1.347]],"o":[[4.014,2.149],[-6.131,-6.456],[-2.076,-2.626],[-1.178,1.984],[1.639,0.981]],"v":[[202.636,450.926],[207.156,440.915],[198.577,429.175],[193.356,430.703],[198.806,448.482]]}],"t":61.291},{"t":65.322265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[206.104,331.532]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":49.193},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":50},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":65.322},{"t":66.12890625}]},"p":{"a":0,"ix":2,"k":[-130.656,-76.043]},"r":{"a":0,"ix":6,"k":179},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[7.754,12.928],[-40.461,12.59],[-25,-15.5],[24.039,-24.094],[35.107,2.652],[15.446,18.576],[-7.383,16.86],[-22.777,7.448],[-51.613,-0.608],[-22.098,-8.756],[-3.697,-60.633],[9.5,-28],[29.148,-4.094],[25.741,-1.055],[7.928,-6.519]],"o":[[-7.754,-12.928],[26.927,-8.379],[37.482,23.239],[-37.888,37.974],[-23.963,-1.81],[-18.629,-22.404],[11.621,-26.539],[27.092,-8.859],[24.63,0.29],[26.5,10.5],[2.5,41],[-12.547,36.981],[-49.897,7.009],[-68.234,2.795],[-25.536,20.999]],"v":[[-48.56,-22.68],[-42.427,-135.121],[59,-106],[90.253,-37.83],[-42.037,16.31],[-110.224,-27.845],[-128.121,-105.461],[-75.092,-138.641],[28.37,-157.79],[100,-155.5],[140,-89.5],[135,-13],[49.338,20.195],[-65.931,39.444],[-127.828,-42.812]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[6.261,9.762],[-46.909,-3.086],[-15.089,-1.824],[24.5,-7],[26.126,-7.296],[14.707,9.493],[14.602,17.198],[-0.471,25.981],[-27.724,1.98],[-27.554,3.71],[-26.5,-14.5],[-4.182,-46.388],[31.357,-17.797],[54.382,-2.978],[47.132,-5.727],[3.608,30.754]],"o":[[-6.261,-9.762],[38,2.5],[33.083,4],[-23.234,6.638],[-26.886,7.508],[-20.751,-13.394],[-14.602,-17.198],[0.49,-27.019],[0,0],[15.718,-2.116],[10.098,5.525],[2.75,30.5],[-18.5,10.5],[-49.626,2.718],[-23.428,2.846],[-3.247,-27.676]],"v":[[-60.292,-34.68],[-45.5,-137],[70.917,-119.5],[84.5,-31.5],[8.524,5.971],[-67.707,11.007],[-109.802,-26.132],[-130.529,-76.481],[-67.398,-135.845],[28.282,-156.384],[105.5,-157.5],[139.25,-83.5],[126.5,6.5],[45.334,21.183],[-72.132,42.02],[-127.416,-38.265]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[20.604,33.418],[-11.115,34.42],[-23.381,-5.19],[31.597,-21.252],[19.985,-12.762],[19.025,11.239],[19.299,30.538],[-5.427,20.845],[-16.145,4.473],[-43.291,3.334],[-29.206,-5.96],[-1.596,-44.693],[15,-15.5],[68.183,-6.429],[38.991,-8.659],[5.403,30.591]],"o":[[-12.097,-19.62],[15.5,-48],[40.568,9.005],[-15.853,10.663],[-22.585,14.422],[-25.322,-14.959],[-19.299,-30.538],[7.619,-30.98],[22.471,-6.384],[32.189,-2.479],[24.5,5],[1.5,42],[-27.609,28.53],[-72.334,6.82],[-55.273,12.275],[-5.403,-30.591]],"v":[[-57.869,-33.058],[-72.5,-112],[79.932,-121.505],[71.403,-38.748],[22.015,-1.238],[-53.525,11.261],[-110.659,-27.492],[-127.131,-94.131],[-82,-135.17],[28.311,-158.521],[100.5,-157.5],[140.5,-86.5],[134.5,-4],[48.834,20.68],[-70.491,40.659],[-128.838,-44.094]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":0,"ix":2,"k":100},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":33.094},{"t":56.451171875}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[1,0,0,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":1,"ix":5,"k":[{"e":[55],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[10],"t":43.799},{"t":59.927734375}]}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.678},{"t":60.484375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":7,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[2,-59,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[2,5,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[100],"t":0},{"t":34.677734375}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[122,122,100],"t":0},{"t":21.7734375}]}},"nm":"Shape Layer 2","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-5.262,-4.305],[-12.876,5.92],[6.129,0.108],[2.884,-2.561]],"o":[[6.764,5.534],[8.3,-3.816],[-6.832,-0.121],[-2.884,2.561]],"v":[[296.894,-71.052],[322.675,-70.696],[321.32,-84.046],[307.607,-76.438]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.952,-9.013],[-17.617,-1.445],[5.339,6.185],[4.827,1.769]],"o":[[1.364,12.913],[12.137,0.995],[-5.297,-6.136],[-7.87,-2.883]],"v":[[238.44,-77.181],[268.195,-58.946],[280.942,-74.556],[258.182,-75.951]]}],"t":33.871},{"e":[{"c":true,"i":[[-2.091,0.861],[-1.098,1.48],[2.439,-1.733],[0.842,-1.684]],"o":[[3.944,-1.625],[2.657,-3.581],[-2.441,1.734],[-0.842,1.684]],"v":[[340.646,-81.155],[344.788,-83.634],[342.294,-87.688],[340.798,-86.199]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.262,-4.305],[-12.876,5.92],[6.129,0.108],[2.884,-2.561]],"o":[[6.764,5.534],[8.3,-3.816],[-6.832,-0.121],[-2.884,2.561]],"v":[[296.894,-71.052],[322.675,-70.696],[321.32,-84.046],[307.607,-76.438]]}],"t":37.375},{"t":42.046875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[262.625,-67.013]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.703},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":33.871},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":42.047},{"t":43.21484375}]},"p":{"a":0,"ix":2,"k":[-5.207,67]},"r":{"a":0,"ix":6,"k":155},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[8.653,4.412],[-11.948,-10.523],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-11.339,-5.781],[9.171,8.077],[4.565,9.006]],"v":[[390.943,2.407],[389.833,-16.181],[372.097,-35.412],[363.579,-28.577],[376.058,-6.258]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.76,1.884],[4.168,5.124],[7.914,1.98],[-11.948,-10.523],[-12.498,-10.86]],"o":[[4.251,-4.551],[-10.833,-13.319],[-12.347,-3.088],[9.171,8.077],[7.622,6.623]],"v":[[381.443,-19.093],[379.333,-33.681],[340.847,-63.912],[333.202,-51.464],[365.466,-20.77]]}],"t":33.871},{"e":[{"c":true,"i":[[-1.222,1.308],[1.206,4.426],[1.981,1.978],[-4.619,-6.053],[-3.512,-10.237]],"o":[[2.952,-3.161],[-2.141,-7.86],[-3.192,-3.186],[2.028,2.657],[2.275,6.632]],"v":[[393.913,7.789],[396.614,-0.432],[386.034,-15.348],[380.119,-10.602],[385.312,3.161]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[8.653,4.412],[-11.948,-10.523],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-11.339,-5.781],[9.171,8.077],[4.565,9.006]],"v":[[390.943,2.407],[389.833,-16.181],[372.097,-35.412],[363.579,-28.577],[376.058,-6.258]]}],"t":37.375},{"e":[{"c":true,"i":[[-0.886,0.471],[-0.13,1.044],[1.111,1.109],[-0.518,-2.792],[-3.024,-5.259]],"o":[[1.579,-0.84],[0.246,-1.975],[-1.789,-1.786],[0.341,1.842],[0.561,0.976]],"v":[[398.107,20.813],[399.524,18.443],[397.583,13.78],[393.392,15.175],[395.33,20.165]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.222,1.308],[1.206,4.426],[1.981,1.978],[-4.619,-6.053],[-3.512,-10.237]],"o":[[2.952,-3.161],[-2.141,-7.86],[-3.192,-3.186],[2.028,2.657],[2.275,6.632]],"v":[[393.913,7.789],[396.614,-0.432],[386.034,-15.348],[380.119,-10.602],[385.312,3.161]]}],"t":39.711},{"t":44.3828125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[357.25,-40.916]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.703},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":33.871},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":44.383},{"t":45.55078125}]},"p":{"a":0,"ix":2,"k":[-71.738,94.699]},"r":{"a":0,"ix":6,"k":110},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-8.767,2.886],[2.412,7.964],[0.005,10.277],[4.369,-19.576],[-7.882,-15.169]],"o":[[6.803,-2.24],[-5.719,-18.882],[-0.009,-17.469],[-3.237,14.505],[6.069,11.679]],"v":[[405.381,147.864],[410.436,129.873],[401.932,95.285],[387.647,89.427],[389.579,135.789]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.663,-1.858],[-1.416,8.2],[1.817,10.116],[-0.539,-20.051],[1.627,-4.792]],"o":[[6.435,4.49],[3.118,-18.056],[-2.509,-13.969],[0.416,15.456],[-4.089,12.045]],"v":[[390,106.8],[402.535,98.681],[404.538,36.778],[390.847,35.98],[385.378,84.251]]}],"t":30.367},{"e":[{"c":true,"i":[[-1.949,1.473],[4.632,4.209],[3.063,3.978],[0.417,-15.081],[-3.139,-3.489]],"o":[[4.708,-3.559],[-9.791,-8.897],[-3.476,-4.514],[-0.288,10.403],[6.399,7.113]],"v":[[430.171,173.641],[428.989,161.828],[414.504,149.442],[405.469,143.355],[413.855,165.776]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.767,2.886],[2.412,7.964],[0.005,10.277],[4.369,-19.576],[-7.882,-15.169]],"o":[[6.803,-2.24],[-5.719,-18.882],[-0.009,-17.469],[-3.237,14.505],[6.069,11.679]],"v":[[405.381,147.864],[410.436,129.873],[401.932,95.285],[387.647,89.427],[389.579,135.789]]}],"t":35.039},{"e":[{"c":true,"i":[[-0.827,2.371],[1.971,0.028],[1.832,1.417],[-0.085,-1.211],[-2.476,-0.82]],"o":[[0.68,-1.95],[-1.037,-0.015],[-0.927,-0.717],[0.179,2.56],[2.224,0.736]],"v":[[435.541,174.127],[432.651,171.009],[428.188,169.385],[426.205,169.659],[430.762,175.314]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.949,1.473],[4.632,4.209],[3.063,3.978],[0.417,-15.081],[-3.139,-3.489]],"o":[[4.708,-3.559],[-9.791,-8.897],[-3.476,-4.514],[-0.288,10.403],[6.399,7.113]],"v":[[430.171,173.641],[428.989,161.828],[414.504,149.442],[405.469,143.355],[413.855,165.776]]}],"t":40.879},{"t":50.22265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[396.535,67.065]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":29.199},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":30.367},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":50.223},{"t":51.390625}]},"p":{"a":0,"ix":2,"k":[-200.816,51.801]},"r":{"a":0,"ix":6,"k":154},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[6.44,1.778],[0.112,-7.007],[-1.758,-0.668],[-1.776,3.348]],"o":[[-6.358,-1.755],[-0.09,5.641],[1.758,0.668],[1.776,-3.348]],"v":[[332.765,203.855],[323.535,216.095],[332.476,219.847],[337.259,213.593]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.324,7.335],[0.152,-9.506],[-2.384,-0.906],[-2.409,4.542]],"o":[[-8.624,-11.881],[-0.123,7.651],[2.384,0.906],[2.409,-4.542]],"v":[[349.124,166.381],[325.603,197.485],[337.731,202.574],[344.72,184.091]]}],"t":29.199},{"e":[{"c":true,"i":[[2.833,0.782],[0.049,-3.082],[-0.773,-0.294],[-0.781,1.473]],"o":[[-2.796,-0.772],[-0.04,2.481],[0.773,0.294],[0.781,-1.473]],"v":[[329.913,234.119],[325.853,239.503],[329.785,241.153],[331.889,238.402]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.44,1.778],[0.112,-7.007],[-1.758,-0.668],[-1.776,3.348]],"o":[[-6.358,-1.755],[-0.09,5.641],[1.758,0.668],[1.776,-3.348]],"v":[[332.765,203.855],[323.535,216.095],[332.476,219.847],[337.259,213.593]]}],"t":32.703},{"t":35.0390625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[336.243,183.537]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":28.031},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":29.199},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":35.039},{"t":36.20703125}]},"p":{"a":0,"ix":2,"k":[-273.617,-102.945]},"r":{"a":0,"ix":6,"k":124},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[-0.067,6.605],[-2.226,7.848],[13.842,-7.868],[0.828,-3.931]],"o":[[5.497,2.929],[0.118,-11.643],[0.881,-3.108],[-9.876,5.614],[-2.081,9.88]],"v":[[318.598,248.071],[327.692,237.239],[333.98,215.381],[326.709,199.194],[315.871,233.392]]}],"t":28.031},{"e":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[317.396,295.449],[321.103,284.053],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"t":32.703},{"e":[{"c":true,"i":[[-2.193,-0.398],[-1.633,1.625],[1.49,0.732],[1.104,0.616],[-2.243,-2.497]],"o":[[2.866,0.521],[1.8,-1.792],[-2.422,-1.19],[-2.874,-1.603],[1.691,1.882]],"v":[[317.814,303.274],[321.644,303.175],[322.014,298.568],[317.877,296.455],[315.04,300.655]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[317.396,295.449],[321.103,284.053],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"t":37.375},{"t":42.046875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[320.584,230.135]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":26.863},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":28.031},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":42.047},{"t":43.21484375}]},"p":{"a":0,"ix":2,"k":[-290.578,-156.98]},"r":{"a":0,"ix":6,"k":161},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.112,-0.542],[-0.226,-0.603],[-0.466,0.032],[0.034,0.41]],"o":[[-1.112,0.542],[0.226,0.603],[0.466,-0.032],[-0.034,-0.41]],"v":[[-428.545,-130.894],[-428.976,-128.853],[-427.581,-128.641],[-427.259,-129.694]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.712,-5.32],[-0.957,-5.923],[-1.974,0.319],[0.145,4.029]],"o":[[-4.712,5.32],[0.957,5.923],[1.974,-0.319],[-0.145,-4.029]],"v":[[-428.675,-113.866],[-430.5,-93.818],[-424.592,-91.733],[-423.226,-102.084]]}],"t":25.807},{"t":31.451171875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-428.254,-104.227]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":24.639},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":25.807},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":31.34},{"t":32.5078125}]},"p":{"a":0,"ix":2,"k":[-225.254,-269.227]},"r":{"a":0,"ix":6,"k":64},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-3.096,0.981],[5.205,5.598],[2.75,8.25],[-3.466,-19.756],[-0.989,-2.42]],"o":[[5.282,-1.674],[-6.328,-6.806],[-1.287,-3.861],[2.5,14.25],[3.567,8.726]],"v":[[-411.44,-60.246],[-412.863,-72.518],[-419.158,-95.92],[-427.658,-87.17],[-422.975,-68.646]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.139,0.835],[7.7,3.156],[2.5,8.329],[-9.602,-16.436],[-4.305,-2.661]],"o":[[7.583,-2.017],[-13.488,-5.529],[-1.945,-6.481],[3.731,6.387],[10.69,6.609]],"v":[[-391.63,-32.099],[-393.714,-46.753],[-417.058,-67.729],[-427.5,-58.75],[-413.083,-40.715]]}],"t":27.42},{"e":[{"c":true,"i":[[-2.44,-0.355],[0.394,3.277],[0.869,6.544],[-0.603,-15.215],[-0.48,-1.926]],"o":[[4.163,0.606],[-0.842,-7.004],[-0.406,-3.063],[0.151,3.821],[1.182,4.74]],"v":[[-423.585,-93.044],[-420.682,-99.811],[-421.011,-111.355],[-428.601,-106.049],[-427.733,-98.237]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.096,0.981],[5.205,5.598],[2.75,8.25],[-3.466,-19.756],[-0.989,-2.42]],"o":[[5.282,-1.674],[-6.328,-6.806],[-1.287,-3.861],[2.5,14.25],[3.567,8.726]],"v":[[-411.44,-60.246],[-412.863,-72.518],[-419.158,-95.92],[-427.658,-87.17],[-422.975,-68.646]]}],"t":32.258},{"e":[{"c":true,"i":[[-0.408,-0.059],[0.066,0.549],[0.145,1.096],[-0.101,-2.547],[-0.08,-0.322]],"o":[[0.697,0.101],[-0.141,-1.173],[-0.068,-0.513],[0.025,0.64],[0.198,0.794]],"v":[[-427.053,-117.101],[-426.567,-118.234],[-426.622,-120.167],[-427.893,-119.279],[-427.748,-117.971]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.44,-0.355],[0.394,3.277],[0.869,6.544],[-0.603,-15.215],[-0.48,-1.926]],"o":[[4.163,0.606],[-0.842,-7.004],[-0.406,-3.063],[0.151,3.821],[1.182,4.74]],"v":[[-423.585,-93.044],[-420.682,-99.811],[-421.011,-111.355],[-428.601,-106.049],[-427.733,-98.237]]}],"t":38.709},{"t":44.103515625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-414.207,-48.82]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":26.25},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":27.42},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":44.104},{"t":45.2734375}]},"p":{"a":0,"ix":2,"k":[-262.207,-239.82]},"r":{"a":0,"ix":6,"k":88},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[10.786,-16.436],[36.698,-5.592],[51.5,1],[9,32],[15.916,31.57],[-1.093,53.88],[-56.534,10.139],[-48.62,14.681]],"o":[[-21,32],[-52.5,8],[-35.462,-0.689],[-8.036,-28.573],[-12.709,-25.209],[1.052,-51.855],[33.944,-6.088],[11.102,-3.352]],"v":[[154,7],[10.5,64],[-121,115.5],[-201,48],[-241.111,-47.775],[-291.407,-153.38],[-193.944,-279.912],[-57.38,-284.681]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[1.135,-32.538],[58,-8],[29.476,3.871],[6.943,26.458],[16.354,30.051],[-4.357,41.835],[-55.585,23.176],[-12.678,8.973]],"o":[[-1.5,43],[-36.773,5.072],[-49.5,-6.5],[-9.25,-35.25],[-22.994,-42.252],[3.538,-33.97],[22.176,-9.246],[12.678,-8.973]],"v":[[158.5,10.5],[8,70],[-134.5,113.5],[-209.75,34.5],[-239.695,-49.836],[-295.643,-167.835],[-198.915,-279.176],[-59.772,-283.797]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[6.725,-31.855],[58.724,-9.787],[29.512,3.586],[8.5,26],[18.327,29.502],[-2.717,47.431],[-27.557,6.484],[-6.782,7.107]],"o":[[-9.5,45],[-51,8.5],[-29.512,-3.587],[-9.223,-28.212],[-20.5,-33],[2.217,-38.701],[27.557,-6.484],[6.782,-7.107]],"v":[[157.5,7.5],[-1.5,64],[-143,113],[-205,49.5],[-251,-61],[-296.283,-170.931],[-204.122,-275.286],[-59.608,-284.485]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":12.848},{"t":36.20703125}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":0},{"t":23.359375}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":10}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":8,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[8,-61,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[8,3,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[130],"t":6.451},{"t":38.708984375}]},"s":{"a":1,"ix":6,"k":[{"e":[128,128,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[150,150,100],"t":6.451},{"t":25.806640625}]}},"nm":"Shape Layer 8","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-7.106,-6.258],[-19.353,-3.869],[7.891,3.257],[5.346,-0.525]],"o":[[9.134,8.045],[12.475,2.494],[-7.897,-3.259],[-5.346,0.525]],"v":[[274.032,-55.095],[304.612,-50.784],[314.013,-66.934],[292.335,-69.588]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.407,-9.045],[-24.08,12.646],[11.275,-3.359],[6.196,-4.05]],"o":[[13.477,12.958],[15.523,-8.152],[-11.283,3.361],[-6.196,4.05]],"v":[[231.694,-24.814],[277.822,-47.084],[271.175,-73.761],[244.812,-54.192]]}],"t":44.383},{"e":[{"c":true,"i":[[-2.784,-3.375],[-3.362,-1.186],[4.594,3.521],[3.593,0.597]],"o":[[5.252,6.366],[8.135,2.87],[-4.597,-3.524],[-3.593,-0.597]],"v":[[331.516,-54.519],[338.459,-48.273],[344.534,-55.195],[340.927,-57.113]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.106,-6.258],[-19.353,-3.869],[7.891,3.257],[5.346,-0.525]],"o":[[9.134,8.045],[12.475,2.494],[-7.897,-3.259],[-5.346,0.525]],"v":[[274.032,-55.095],[304.612,-50.784],[314.013,-66.934],[292.335,-69.588]]}],"t":47.887},{"t":51.390625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[257.377,-47.334]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":43.215},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":44.383},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":51.391},{"t":52.55859375}]},"p":{"a":0,"ix":2,"k":[-214.578,-131.191]},"r":{"a":0,"ix":6,"k":274},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.364,-1.029],[-3.018,5.876],[2.165,9.468],[0.41,-15.916],[3.976,-9.264]],"o":[[6.467,2.814],[4.499,-8.758],[-2.837,-12.407],[-0.315,12.216],[-3.982,9.279]],"v":[[316.822,40.131],[330.371,27.358],[333.75,1.416],[323.043,-0.735],[313.922,23.153]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-11.421,0.903],[0.255,7.893],[5.273,8.205],[-1.791,-18.951],[1.478,-21.761]],"o":[[7.423,-0.587],[-0.783,-24.217],[-8.227,-12.801],[1.374,14.545],[-0.818,12.044]],"v":[[325.378,-3.841],[340.783,-24.783],[320.013,-81.633],[298.25,-89.886],[308.522,-23.239]]}],"t":44.383},{"e":[{"c":true,"i":[[-1.782,0.165],[-2.041,4.108],[0.166,2.795],[0.573,-7.592],[4.181,-9.982]],"o":[[4.306,-0.399],[3.625,-7.295],[-0.267,-4.502],[-0.251,3.333],[-2.709,6.467]],"v":[[306.995,78.534],[314.478,74.189],[316.489,56.012],[308.915,55.627],[303.647,69.36]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.364,-1.029],[-3.018,5.876],[2.165,9.468],[0.41,-15.916],[3.976,-9.264]],"o":[[6.467,2.814],[4.499,-8.758],[-2.837,-12.407],[-0.315,12.216],[-3.982,9.279]],"v":[[316.822,40.131],[330.371,27.358],[333.75,1.416],[323.043,-0.735],[313.922,23.153]]}],"t":47.887},{"e":[{"c":true,"i":[[-0.951,-0.319],[-0.847,0.624],[-0.04,1.569],[1.67,-2.297],[1.735,-5.813]],"o":[[1.696,0.568],[1.602,-1.181],[0.065,-2.527],[-1.102,1.516],[-0.322,1.079]],"v":[[304.127,98.096],[306.822,97.493],[308.87,92.876],[304.974,90.795],[302.686,95.634]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.782,0.165],[-2.041,4.108],[0.166,2.795],[0.573,-7.592],[4.181,-9.982]],"o":[[4.306,-0.399],[3.625,-7.295],[-0.267,-4.502],[-0.251,3.333],[-2.709,6.467]],"v":[[306.995,78.534],[314.478,74.189],[316.489,56.012],[308.915,55.627],[303.647,69.36]]}],"t":50.223},{"t":54.89453125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[321.066,-50.164]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":43.215},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":44.383},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":54.895},{"t":56.0625}]},"p":{"a":0,"ix":2,"k":[-219.066,-213.836]},"r":{"a":0,"ix":6,"k":223},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-7.833,-3.87],[-5.637,6.122],[-2.016,10.078],[3.414,-19.765],[13.176,-28.168]],"o":[[7.146,3.53],[16.659,-18.093],[3.427,-17.13],[-2.632,15.235],[-5.39,11.522]],"v":[[379.999,178.335],[396.982,174.133],[416.912,113.469],[399.58,101.812],[380.14,151.363]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.613,0.737],[-2.424,7.903],[4.317,15.554],[-0.539,-20.051],[6.085,-25.403]],"o":[[9.399,-0.533],[7.139,-22.852],[-3.819,-13.762],[0.416,15.456],[-6.085,25.403]],"v":[[403.508,119.257],[418.174,93.773],[419.944,41.7],[395.677,45.267],[389.164,96.504]]}],"t":42.742},{"e":[{"c":true,"i":[[-2.497,-2.077],[-5.234,6.47],[-1.469,9.693],[9.39,-17.724],[3.567,-5.12]],"o":[[6.032,5.018],[10.825,-13.382],[1.641,-10.831],[-8.109,15.306],[-7.272,10.437]],"v":[[369.595,227.212],[383.812,221.512],[397.435,185.945],[390.663,169.248],[367.146,208.106]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.833,-3.87],[-5.637,6.122],[-2.016,10.078],[3.414,-19.765],[13.176,-28.168]],"o":[[7.146,3.53],[16.659,-18.093],[3.427,-17.13],[-2.632,15.235],[-5.39,11.522]],"v":[[379.999,178.335],[396.982,174.133],[416.912,113.469],[399.58,101.812],[380.14,151.363]]}],"t":47.58},{"e":[{"c":true,"i":[[-3.832,-1.279],[-1.644,2.713],[-2.737,2.53],[5.638,1.238],[2.865,-3.256]],"o":[[5.173,1.726],[1.341,-2.214],[1.384,-1.28],[-4.999,-1.098],[-2.49,2.83]],"v":[[356.714,245.601],[362.742,242.776],[367.676,239.233],[363.88,232.13],[356.49,236.923]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.497,-2.077],[-5.234,6.47],[-1.469,9.693],[9.39,-17.724],[3.567,-5.12]],"o":[[6.032,5.018],[10.825,-13.382],[1.641,-10.831],[-8.109,15.306],[-7.272,10.437]],"v":[[369.595,227.212],[383.812,221.512],[397.435,185.945],[390.663,169.248],[367.146,208.106]]}],"t":54.033},{"t":59.677734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[404.93,83.625]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":41.129},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":42.604},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.678},{"t":61.291015625}]},"p":{"a":0,"ix":2,"k":[-138.93,-276.625]},"r":{"a":0,"ix":6,"k":245},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[12.98,-6.184],[11.111,-16.056],[-3.914,3.539],[-5.98,1.979]],"o":[[-12.128,5.778],[-10.545,15.238],[10.106,-9.138],[19.279,-6.38]],"v":[[318.902,206.219],[279.794,228.558],[288.654,243.523],[317.301,222.249]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.927,-3.963],[19.952,-8.646],[-19.611,8.534],[-3.594,6.776]],"o":[[-21.701,6.652],[-23.559,10.21],[16.263,-7.077],[3.594,-6.776]],"v":[[354.921,151.162],[313.901,203.075],[317.224,218.145],[354.174,177.892]]}],"t":45.162},{"e":[{"c":true,"i":[[5.747,-1.951],[1.698,-9.872],[-1.334,1.718],[-4.992,1.049]],"o":[[-3.722,1.458],[-1.424,8.281],[4.426,-5.222],[2.361,-4.244]],"v":[[281.169,235.826],[264.082,251.171],[272.645,255.497],[285.355,241.514]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.98,-6.184],[11.111,-16.056],[-3.914,3.539],[-5.98,1.979]],"o":[[-12.128,5.778],[-10.545,15.238],[10.106,-9.138],[19.279,-6.38]],"v":[[318.902,206.219],[279.794,228.558],[288.654,243.523],[317.301,222.249]]}],"t":49.193},{"e":[{"c":true,"i":[[2.954,0.333],[-0.331,-3.154],[-0.805,-0.138],[-0.577,1.611]],"o":[[-2.881,-0.324],[0.272,2.595],[0.87,0.035],[0.586,-1.635]],"v":[[260.378,262.174],[256.889,268.362],[261.127,269.48],[262.984,266.158]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.747,-1.951],[1.698,-9.872],[-1.334,1.718],[-4.992,1.049]],"o":[[-3.722,1.458],[-1.424,8.281],[4.426,-5.222],[2.361,-4.244]],"v":[[281.169,235.826],[264.082,251.171],[272.645,255.497],[285.355,241.514]]}],"t":52.42},{"t":54.837890625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":43.994},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.162},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":54.838},{"t":55.64453125}]},"p":{"a":0,"ix":2,"k":[-119,-323]},"r":{"a":0,"ix":6,"k":56},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-3.21,-0.491],[2.35,6.095],[6.113,12.778],[-1.155,-14.158],[-8.147,-5.86]],"o":[[6.671,1.021],[-1.767,-4.583],[-1.756,-3.671],[1.045,12.807],[5.922,4.26]],"v":[[339.738,271.778],[345.218,260.984],[324.915,239.78],[315.011,238.392],[330.54,268.187]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[-0.067,6.605],[3.054,7.565],[10.791,-8.694],[0.224,-4.011]],"o":[[5.497,2.929],[0.118,-11.643],[-2.98,-7.381],[-8.846,7.127],[-0.871,15.608]],"v":[[314.598,259.571],[323.692,245.239],[319.127,198.585],[298.155,181.521],[302.945,244.529]]}],"t":45.162},{"e":[{"c":true,"i":[[-1.634,2.936],[5.475,3.562],[6.311,1.676],[1.373,-8.599],[-6.282,-1.072]],"o":[[1.936,-3.478],[-3.21,-2.088],[-3.933,-1.044],[-1.635,10.241],[7.191,1.227]],"v":[[367.527,262.648],[362.997,251.553],[351.283,250.625],[339.585,248.172],[354.764,265.266]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.21,-0.491],[2.35,6.095],[6.113,12.778],[-1.155,-14.158],[-8.147,-5.86]],"o":[[6.671,1.021],[-1.767,-4.583],[-1.756,-3.671],[1.045,12.807],[5.922,4.26]],"v":[[339.738,271.778],[345.218,260.984],[324.915,239.78],[315.011,238.392],[330.54,268.187]]}],"t":50},{"e":[{"c":true,"i":[[-1.924,1.124],[-0.182,2.297],[1.608,-0.414],[1.239,-0.251],[-3.328,-0.436]],"o":[[2.515,-1.469],[0.201,-2.532],[-2.614,0.673],[-3.225,0.653],[2.509,0.329]],"v":[[384.796,256.439],[387.639,253.871],[384.922,250.133],[380.406,251.22],[380.984,256.255]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.634,2.936],[5.475,3.562],[6.311,1.676],[1.373,-8.599],[-6.282,-1.072]],"o":[[1.936,-3.478],[-3.21,-2.088],[-3.933,-1.044],[-1.635,10.241],[7.191,1.227]],"v":[[367.527,262.648],[362.997,251.553],[351.283,250.625],[339.585,248.172],[354.764,265.266]]}],"t":54.838},{"t":59.56640625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[310.24,218.951]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":43.994},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.162},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.566},{"t":60.734375}]},"p":{"a":0,"ix":2,"k":[-161.211,-7.059]},"r":{"a":0,"ix":6,"k":171},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[3.141,0.827],[-0.338,-8.315],[-8.896,-10.141],[1.932,9.396],[-2.499,13.574]],"o":[[-8.094,-2.131],[0.593,14.565],[6.7,7.638],[-3.243,-15.772],[2.303,-12.51]],"v":[[-337.984,-433.641],[-349.504,-420.507],[-335.35,-382.508],[-319.857,-381.226],[-332.44,-416.538]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.072,-1.054],[-6.069,-9.317],[-8.059,-7.336],[0.738,14.37],[2.909,4.142]],"o":[[-7.422,2.545],[7.957,12.214],[3.01,2.74],[-0.734,-14.293],[-7.311,-10.409]],"v":[[-331.366,-387.145],[-326.659,-368.439],[-299.172,-340.202],[-282.749,-338.843],[-310.736,-374.277]]}],"t":38.709},{"e":[{"c":true,"i":[[1.664,1.849],[3.345,-6.351],[-5.055,-9.568],[-0.373,9.173],[-6.196,8.297]],"o":[[-4.289,-4.764],[-3.694,9.513],[3.974,7.71],[0.008,-11.58],[6.441,-7.959]],"v":[[-329.595,-451.856],[-343.553,-445.711],[-344.119,-413.456],[-332.261,-413.47],[-332.365,-437.17]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.141,0.827],[-0.338,-8.315],[-8.896,-10.141],[1.932,9.396],[-2.499,13.574]],"o":[[-8.094,-2.131],[0.593,14.565],[6.7,7.638],[-3.243,-15.772],[2.303,-12.51]],"v":[[-337.984,-433.641],[-349.504,-420.507],[-335.35,-382.508],[-319.857,-381.226],[-332.44,-416.538]]}],"t":43.549},{"e":[{"c":true,"i":[[0.647,2.399],[5.295,-5.158],[-3.648,-7.495],[-0.253,8.888],[-7.597,4.51]],"o":[[-1.666,-6.182],[-5.408,5.268],[3.212,6.6],[0.205,-7.188],[8.368,-4.968]],"v":[[-315.591,-472.782],[-330.122,-470.056],[-336.895,-443.958],[-328.882,-448.394],[-322.754,-460.041]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.664,1.849],[3.345,-6.351],[-5.055,-9.568],[-0.373,9.173],[-6.196,8.297]],"o":[[-4.289,-4.764],[-3.694,9.513],[3.974,7.71],[0.008,-11.58],[6.441,-7.959]],"v":[[-329.595,-451.856],[-343.553,-445.711],[-344.119,-413.456],[-332.261,-413.47],[-332.365,-437.17]]}],"t":45.967},{"e":[{"c":true,"i":[[1.068,0.325],[1.382,-3.02],[1.651,-2.396],[-2.55,1.625],[0.024,1.608]],"o":[[-1.501,-0.456],[-0.89,1.944],[-1.872,2.716],[1.578,-1.005],[-0.023,-1.589]],"v":[[-311.698,-481.914],[-315.538,-479.478],[-316.946,-475.353],[-313.345,-473.814],[-310.261,-478.673]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.647,2.399],[5.295,-5.158],[-3.648,-7.495],[-0.253,8.888],[-7.597,4.51]],"o":[[-1.666,-6.182],[-5.408,5.268],[3.212,6.6],[0.205,-7.188],[8.368,-4.968]],"v":[[-315.591,-472.782],[-330.122,-470.056],[-336.895,-443.958],[-328.882,-448.394],[-322.754,-460.041]]}],"t":48.387},{"t":53.2265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-304.289,-360.496]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":37.375},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":38.543},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":53.227},{"t":54.392578125}]},"p":{"a":0,"ix":2,"k":[96.711,-284.496]},"r":{"a":0,"ix":6,"k":117},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[19.514,-2.379],[94.782,15.632],[32.746,74.677],[-24.104,91.314],[-43.342,12.292],[-55.734,7.067],[-12.958,4.282],[-15.368,1.444],[-5.901,-12.316]],"o":[[-99.548,12.137],[-55.52,-9.157],[-26.168,-59.677],[9.262,-35.088],[68.046,-19.298],[48.989,-6.212],[28.248,-9.335],[35.867,-3.37],[5.901,12.316]],"v":[[103.934,36.653],[-110.782,59.368],[-176.678,-72.703],[-215.177,-209.012],[-133.845,-270.579],[-1.857,-267.213],[77.752,-281.665],[130.133,-295.63],[187.79,-273.42]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-6.081,-31.985],[24.757,12.653],[29.356,58.811],[-19.949,34.363],[-41.604,2.715],[-49.623,5.236],[-12.21,4.49],[-23.206,1.791],[-4.437,-11.718]],"o":[[3.738,19.66],[-52.987,-27.082],[-31.952,-64.012],[34.962,-60.224],[48.707,-3.178],[49.623,-5.236],[19.505,-7.172],[12.739,-0.983],[4.437,11.718]],"v":[[107.412,37.288],[-109.918,61.076],[-179.259,-74.059],[-228.303,-206.233],[-121.83,-288.659],[2.406,-267.49],[93.495,-286.828],[132.206,-295.791],[188.763,-269.948]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[30.906,10.239],[26.258,11.48],[18.527,60.223],[-53.765,63.702],[-34.731,0.011],[-34.854,4.38],[-24.683,0.853],[-15.663,0.963],[-5.142,-11.664]],"o":[[-47.919,-15.876],[-70.357,-30.76],[-11.618,-37.767],[23.033,-27.29],[52.229,-0.017],[42.963,-5.399],[24.007,-0.83],[36.19,-2.225],[5.142,11.664]],"v":[[107.315,39.786],[-111.261,57.02],[-178.386,-71.664],[-215.594,-209.237],[-125.189,-282.314],[-3.008,-265.22],[81.1,-281.477],[127.81,-296.775],[190.767,-266.91]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":25.695},{"t":49.0546875}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":12.848},{"t":36.20703125}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":12}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":9,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[3,-60,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[3,4,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[115],"t":4.838},{"t":34.677734375}]},"s":{"a":1,"ix":6,"k":[{"e":[129,129,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[151,151,100],"t":4.838},{"t":26.61328125}]}},"nm":"Shape Layer 7","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-5.673,-4.762],[-18.144,-8.136],[6.413,4.394],[5.067,0.196]],"o":[[6.889,6.254],[11.904,5.215],[-11.294,-7.739],[-6.612,1.03]],"v":[[281.484,-56.197],[316.648,-47.061],[328.35,-59.478],[295.503,-66.743]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-12.396,4.078],[-26.919,3.894],[11.275,-3.359],[5.797,-4.603]],"o":[[14.726,-4.845],[17.976,-2.6],[-11.283,3.361],[-10.431,8.283]],"v":[[231.694,-24.814],[274.564,-52.147],[273.316,-68.67],[244.55,-55.751]]}],"t":43.549},{"e":[{"c":true,"i":[[-2.311,-9.183],[-13.757,-14.151],[4.658,7.154],[4.703,2.596]],"o":[[2.97,11.804],[8.868,9.122],[-4.661,-7.159],[-4.703,-2.596]],"v":[[314.956,-50.966],[337.715,-30.091],[354.611,-38.075],[338.249,-52.541]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.673,-4.762],[-18.144,-8.136],[6.413,4.394],[5.067,0.196]],"o":[[6.889,6.254],[11.904,5.215],[-11.294,-7.739],[-6.612,1.03]],"v":[[281.484,-56.197],[316.648,-47.061],[328.35,-59.478],[295.503,-66.743]]}],"t":47.887},{"e":[{"c":true,"i":[[0.325,-4.363],[-1.606,-3.182],[0.88,5.721],[2.181,2.917]],"o":[[-0.612,8.23],[3.887,7.701],[-0.881,-5.725],[-2.181,-2.917]],"v":[[356.132,-20.162],[356.824,-10.849],[365.998,-11.643],[364.721,-15.523]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.311,-9.183],[-13.757,-14.151],[4.658,7.154],[4.703,2.596]],"o":[[2.97,11.804],[8.868,9.122],[-4.661,-7.159],[-4.703,-2.596]],"v":[[314.956,-50.966],[337.715,-30.091],[354.611,-38.075],[338.249,-52.541]]}],"t":49.055},{"t":52.55859375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":42.381},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":43.549},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":52.559},{"t":53.7265625}]},"p":{"a":0,"ix":2,"k":[-319,-12]},"r":{"a":0,"ix":6,"k":298},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.078,-1.526],[-4.242,5.063],[0.019,9.713],[3.918,-15.432],[5.925,-8.156]],"o":[[5.685,4.174],[6.323,-7.547],[-0.025,-12.727],[-3.007,11.844],[-5.934,8.169]],"v":[[298.689,40.643],[314.727,31.18],[323.755,6.626],[313.788,2.162],[299.614,23.444]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-11.421,0.903],[0.255,7.893],[5.273,8.205],[-1.791,-18.951],[1.478,-21.761]],"o":[[7.423,-0.587],[-0.783,-24.217],[-8.227,-12.801],[1.374,14.545],[-0.818,12.044]],"v":[[325.378,-3.841],[336.438,-31.273],[320.013,-81.633],[298.25,-89.886],[317.655,-28.815]]}],"t":43.549},{"e":[{"c":true,"i":[[-1.599,-0.805],[-3.908,2.402],[-1.341,2.458],[4.509,-6.135],[8.836,-6.249]],"o":[[3.863,1.944],[6.94,-4.265],[2.16,-3.959],[-1.98,2.694],[-5.724,4.049]],"v":[[276.962,51.013],[285.61,51.293],[296.948,36.945],[290.73,32.604],[278.984,41.458]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.078,-1.526],[-4.242,5.063],[0.019,9.713],[3.918,-15.432],[5.925,-8.156]],"o":[[5.685,4.174],[6.323,-7.547],[-0.025,-12.727],[-3.007,11.844],[-5.934,8.169]],"v":[[298.689,40.643],[314.727,31.18],[323.755,6.626],[313.788,2.162],[299.614,23.444]]}],"t":46.719},{"e":[{"c":true,"i":[[-0.732,-0.686],[-1.03,0.214],[-0.69,1.409],[2.475,-1.392],[4,-4.561]],"o":[[1.305,1.223],[1.948,-0.406],[1.112,-2.271],[-1.633,0.919],[-0.743,0.847]],"v":[[258.72,53.175],[261.421,53.75],[265.207,50.407],[262.532,46.891],[258.436,50.337]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.599,-0.805],[-3.908,2.402],[-1.341,2.458],[4.509,-6.135],[8.836,-6.249]],"o":[[3.863,1.944],[6.94,-4.265],[2.16,-3.959],[-1.98,2.694],[-5.724,4.049]],"v":[[276.962,51.013],[285.61,51.293],[296.948,36.945],[290.73,32.604],[278.984,41.458]]}],"t":49.055},{"t":53.7265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":42.381},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":43.549},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":53.727},{"t":54.89453125}]},"p":{"a":0,"ix":2,"k":[-110,-15]},"r":{"a":0,"ix":6,"k":264},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-7.732,4.067],[3.042,7.746],[0.005,10.277],[-0.539,-20.051],[-15.062,-27.206]],"o":[[7.054,-3.711],[-6.426,-16.363],[-0.009,-17.469],[0.416,15.456],[6.161,11.129]],"v":[[423.143,176.84],[429.606,159.901],[408.185,109.611],[393.012,101.88],[401.394,160.886]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.468,0.819],[-2.289,7.899],[-1.216,9.918],[-0.539,-20.051],[3.895,-17.689]],"o":[[9.341,-0.612],[6.804,-22.692],[1.748,-14.248],[0.416,15.456],[-2.222,10.089]],"v":[[400.264,121.335],[407.277,89.064],[415.34,40.943],[396.726,46.079],[387.633,99.652]]}],"t":41.129},{"e":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[4.02,8.942],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-4.492,-9.991],[-4.331,14.842],[8.508,9.457]],"v":[[446.471,206.015],[444.156,190.874],[423.616,169.427],[408.875,159.068],[427.309,204.052]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.732,4.067],[3.042,7.746],[0.005,10.277],[-0.539,-20.051],[-15.062,-27.206]],"o":[[7.054,-3.711],[-6.426,-16.363],[-0.009,-17.469],[0.416,15.456],[6.161,11.129]],"v":[[423.143,176.84],[429.606,159.901],[408.185,109.611],[393.012,101.88],[401.394,160.886]]}],"t":45.551},{"e":[{"c":true,"i":[[-0.627,3.991],[2.948,1.173],[2.948,2.281],[0.289,-5.765],[-3.685,-2.287]],"o":[[0.847,-5.388],[-2.405,-0.957],[-1.491,-1.154],[-0.256,5.111],[3.202,1.988]],"v":[[470.684,231.038],[466.901,225.56],[462.591,221.28],[456.214,226.198],[462.163,232.694]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[4.02,8.942],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-4.492,-9.991],[-4.331,14.842],[8.508,9.457]],"v":[[446.471,206.015],[444.156,190.874],[423.616,169.427],[408.875,159.068],[427.309,204.052]]}],"t":52.559},{"t":58.3984375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":39.711},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":40.879},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":58.398},{"t":59.56640625}]},"p":{"a":0,"ix":2,"k":[-235,62]},"r":{"a":0,"ix":6,"k":280},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-3.179,-0.665],[2.016,6.213],[3.142,17.876],[0.728,-14.187],[-3.41,-3.739]],"o":[[6.605,1.381],[-1.516,-4.672],[-2.326,-13.23],[-0.808,15.745],[4.916,5.39]],"v":[[321.216,291.57],[330.689,279.935],[319.139,243.191],[305.259,238.136],[312.226,287.486]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[3.434,14.705],[0.553,10.13],[5.503,-12.718],[-3.126,-13.881]],"o":[[5.497,2.929],[-2.647,-11.338],[-1.031,-18.877],[-7.856,18.155],[3.434,15.251]],"v":[[312.302,269.756],[324.661,257.524],[317.784,199.402],[301.971,183.906],[306.246,249.272]]}],"t":44.355},{"e":[{"c":true,"i":[[-3.271,0.769],[1.054,6.446],[3.012,5.794],[7.281,-4.776],[-3.438,-5.365]],"o":[[3.875,-0.911],[-0.618,-3.779],[-1.877,-3.611],[-8.672,5.688],[3.936,6.142]],"v":[[331.954,312.336],[337.105,301.515],[329.902,292.232],[319.278,281.248],[321.423,304.665]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.179,-0.665],[2.016,6.213],[3.142,17.876],[0.728,-14.187],[-3.41,-3.739]],"o":[[6.605,1.381],[-1.516,-4.672],[-2.326,-13.23],[-0.808,15.745],[4.916,5.39]],"v":[[321.216,291.57],[330.689,279.935],[319.139,243.191],[305.259,238.136],[312.226,287.486]]}],"t":49.027},{"e":[{"c":true,"i":[[-2.218,-0.219],[-1.495,1.753],[1.545,0.609],[1.15,0.524],[-2.438,-2.306]],"o":[[2.899,0.286],[1.648,-1.932],[-2.511,-0.99],[-2.994,-1.365],[1.838,1.739]],"v":[[339.992,318.322],[343.801,317.912],[343.795,313.291],[339.501,311.52],[337.014,315.936]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.271,0.769],[1.054,6.446],[3.012,5.794],[7.281,-4.776],[-3.438,-5.365]],"o":[[3.875,-0.911],[-0.618,-3.779],[-1.877,-3.611],[-8.672,5.688],[3.936,6.142]],"v":[[331.954,312.336],[337.105,301.515],[329.902,292.232],[319.278,281.248],[321.423,304.665]]}],"t":53.699},{"t":58.369140625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":43.604},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":44.355},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":58.119},{"t":58.92578125}]},"p":{"a":0,"ix":2,"k":[189,-160]},"r":{"a":0,"ix":6,"k":148},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.659,1.767],[2.042,-0.139],[-0.046,-0.681],[-1.373,-0.077]],"o":[[-1.659,-1.767],[-2.042,0.139],[0.046,0.681],[1.373,0.077]],"v":[[297.337,-363.857],[290.584,-365.106],[289.691,-363.164],[293.164,-362.375]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.573,6.143],[5.924,0.949],[0.316,-1.975],[-3.87,-1.127]],"o":[[-3.573,-6.143],[-5.924,-0.949],[-0.316,1.975],[3.87,1.127]],"v":[[266.466,-363.092],[248.002,-371.115],[244.17,-366.159],[253.569,-361.614]]}],"t":31.535},{"t":37.375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":30.367},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":31.535},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":37.375},{"t":38.54296875}]},"p":{"a":0,"ix":2,"k":[0,89]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[5.412,-4.886],[-8.316,0.301],[-8.696,0.023],[19.846,2.907],[5.025,-0.604]],"o":[[-5.824,5.258],[16.754,-0.606],[4.07,-0.011],[-14.315,-2.097],[-7.321,0.88]],"v":[[188.396,-372.408],[202.595,-365.629],[235.029,-365.913],[234.764,-376.269],[207.821,-377.38]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.206,-3.241],[-7.759,3.008],[-8.696,0.023],[19.846,2.907],[4.671,-1.948]],"o":[[0.499,7.83],[12.336,-4.783],[4.07,-0.011],[-14.315,-2.097],[-7.637,3.186]],"v":[[176.071,-367.658],[190.849,-366.843],[214.029,-368.913],[213.764,-379.269],[191.544,-378.666]]}],"t":33.871},{"e":[{"c":true,"i":[[0.7,-2.166],[-5.35,-1.792],[-6.171,-0.15],[14.241,0.353],[3.585,-0.214]],"o":[[-0.706,2.186],[8.455,2.77],[6.613,0.161],[-10.272,-0.255],[-6.384,0.381]],"v":[[223.108,-372.022],[231.508,-368.437],[247.014,-365.732],[244.812,-373.896],[233.202,-375.328]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.412,-4.886],[-8.316,0.301],[-8.696,0.023],[19.846,2.907],[5.025,-0.604]],"o":[[-5.824,5.258],[16.754,-0.606],[4.07,-0.011],[-14.315,-2.097],[-7.321,0.88]],"v":[[188.396,-372.408],[202.595,-365.629],[235.029,-365.913],[234.764,-376.269],[207.821,-377.38]]}],"t":38.709},{"e":[{"c":true,"i":[[-0.174,-0.783],[-1.859,0.883],[-0.719,0.551],[2.412,-0.802],[0.965,-0.712]],"o":[[0.314,1.41],[2.656,-1.262],[1.801,-1.379],[-1.264,0.421],[-1.803,1.33]],"v":[[267.812,-373.158],[270.939,-373.029],[273.177,-375.201],[272.191,-377.205],[269.581,-375.541]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.7,-2.166],[-5.35,-1.792],[-6.171,-0.15],[14.241,0.353],[3.585,-0.214]],"o":[[-0.706,2.186],[8.455,2.77],[6.613,0.161],[-10.272,-0.255],[-6.384,0.381]],"v":[[223.108,-372.022],[231.508,-368.437],[247.014,-365.732],[244.812,-373.896],[233.202,-375.328]]}],"t":41.936},{"t":46.7734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[198.41,-369.918]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.703},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":33.871},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":46.719},{"t":47.88671875}]},"p":{"a":0,"ix":2,"k":[281.463,-243.895]},"r":{"a":0,"ix":6,"k":86},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[3.112,19.412],[10.674,35.553],[17.968,31.767],[-30.425,13.391],[-28.972,-20.264],[-65.185,-11.41],[-12.448,-15.094],[-3.625,-8.609]],"o":[[-6.059,-37.793],[-15.271,-50.864],[-38.098,-67.356],[27.167,-11.957],[24.968,17.464],[31.565,5.525],[21.536,26.113],[3.625,8.609]],"v":[[-144.234,12.644],[-163.892,-135.328],[-233.902,-223.644],[-184.553,-335.632],[13.435,-282.458],[207.518,-281.588],[278.464,-263.113],[287.711,-177.953]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[21.095,24.799],[16.041,56.309],[6.528,29.004],[-60.825,1.267],[-28.794,-18.478],[-51.085,-10.087],[-13.359,-20.562],[-3.682,-7.089]],"o":[[-27.877,-32.773],[-10.17,-35.701],[-15.075,-66.979],[36.436,-0.759],[42.169,27.061],[37.502,7.405],[11.291,17.378],[3.682,7.089]],"v":[[-149.917,13.092],[-170.183,-136.964],[-239.925,-242.521],[-159.175,-341.267],[13.576,-279.962],[210.364,-290.231],[279.209,-253.378],[286.649,-180.337]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[13.732,29.52],[11.815,58.349],[10.077,29.724],[-48.147,12.056],[-32.713,-11.666],[-51.744,-7.909],[-9.299,-14.759],[-4.642,-6.714]],"o":[[-19.529,-41.981],[-10.04,-49.583],[-10.077,-29.724],[28.793,-7.21],[49.243,17.561],[30.359,4.64],[8.228,13.059],[3.517,5.087]],"v":[[-145.471,16.481],[-165.572,-147.211],[-241.62,-241.508],[-173.362,-334.464],[27.008,-272.711],[209.201,-286.814],[276.373,-257.803],[288.003,-173.706]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":23.359},{"t":46.71875}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":10.512},{"t":33.87109375}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":8}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":10,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[1,-59,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[1,5,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[140],"t":10.484},{"t":47.580078125}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[147,147,100],"t":10.484},{"t":27.419921875}]}},"nm":"Shape Layer 4","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-3.363,-5.909],[-12.237,-7.148],[4.597,4.054],[3.752,0.892]],"o":[[4.323,7.596],[7.888,4.608],[-4.601,-4.057],[-3.752,-0.892]],"v":[[312.812,-57.316],[332.569,-47.245],[342.724,-56.015],[328.625,-62.881]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.952,-9.013],[-18.451,-4.052],[7.493,3.259],[5.104,0.62]],"o":[[1.364,12.913],[11.894,2.612],[-7.498,-3.261],[-5.104,-0.62]],"v":[[270.136,-60.913],[304.606,-52.112],[313.007,-69.259],[290.247,-70.654]]}],"t":48.387},{"e":[{"c":true,"i":[[-2.93,-3.249],[-3.411,-1.038],[4.744,3.316],[3.615,0.439]],"o":[[5.527,6.129],[8.253,2.511],[-4.747,-3.319],[-3.615,-0.439]],"v":[[344.43,-43.937],[351.64,-38.002],[357.405,-45.184],[353.718,-46.941]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.363,-5.909],[-12.237,-7.148],[4.597,4.054],[3.752,0.892]],"o":[[4.323,7.596],[7.888,4.608],[-4.601,-4.057],[-3.752,-0.892]],"v":[[312.812,-57.316],[332.569,-47.245],[342.724,-56.015],[328.625,-62.881]]}],"t":52.143},{"t":54.478515625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[293,-62.359]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":47.221},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":48.387},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":54.479},{"t":55.64453125}]},"p":{"a":0,"ix":2,"k":[108,-185.359]},"r":{"a":0,"ix":6,"k":8},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[8.653,4.412],[-11.948,-10.523],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-11.339,-5.781],[9.171,8.077],[4.565,9.006]],"v":[[390.943,2.407],[389.833,-16.181],[372.097,-35.412],[363.579,-28.577],[376.058,-6.258]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.76,1.884],[4.168,5.124],[7.914,1.98],[-11.948,-10.523],[-7.558,-15.742]],"o":[[4.251,-4.551],[-10.833,-13.319],[-12.347,-3.088],[9.171,8.077],[4.37,9.103]],"v":[[381.443,-19.093],[379.333,-33.681],[340.847,-63.912],[324.829,-51.077],[359.058,-23.758]]}],"t":47.58},{"e":[{"c":true,"i":[[-1.222,1.308],[1.206,4.426],[1.981,1.978],[-4.619,-6.053],[-3.512,-10.237]],"o":[[2.952,-3.161],[-2.141,-7.86],[-3.192,-3.186],[2.028,2.657],[2.275,6.632]],"v":[[393.913,7.789],[396.614,-0.432],[386.034,-15.348],[380.119,-10.602],[385.312,3.161]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[8.653,4.412],[-11.948,-10.523],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-11.339,-5.781],[9.171,8.077],[4.565,9.006]],"v":[[390.943,2.407],[389.833,-16.181],[372.097,-35.412],[363.579,-28.577],[376.058,-6.258]]}],"t":51.084},{"e":[{"c":true,"i":[[-0.886,0.471],[-0.13,1.044],[1.111,1.109],[-0.518,-2.792],[-3.024,-5.259]],"o":[[1.579,-0.84],[0.246,-1.975],[-1.789,-1.786],[0.341,1.842],[0.561,0.976]],"v":[[394.302,8.896],[395.719,6.526],[393.778,1.863],[389.586,3.258],[391.524,8.248]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.222,1.308],[1.206,4.426],[1.981,1.978],[-4.619,-6.053],[-3.512,-10.237]],"o":[[2.952,-3.161],[-2.141,-7.86],[-3.192,-3.186],[2.028,2.657],[2.275,6.632]],"v":[[393.913,7.789],[396.614,-0.432],[386.034,-15.348],[380.119,-10.602],[385.312,3.161]]}],"t":53.42},{"t":58.091796875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[353.641,-44.633]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":46.412},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.58},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":58.092},{"t":59.259765625}]},"p":{"a":0,"ix":2,"k":[157.641,-152.633]},"r":{"a":0,"ix":6,"k":16},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.752,1.725],[4.516,6.989],[0.005,10.277],[-0.539,-20.051],[-15.062,-27.206]],"o":[[6.648,-4.167],[-9.341,-14.457],[-0.009,-17.469],[0.416,15.456],[6.161,11.129]],"v":[[424.873,148.291],[420.968,130.502],[407.009,76.969],[389.084,71.044],[399.416,129.381]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.663,-1.858],[-1.312,8.218],[1.817,10.116],[-0.539,-20.051],[1.627,-4.792]],"o":[[6.435,4.49],[3.153,-19.75],[-2.509,-13.969],[0.416,15.456],[-4.089,12.045]],"v":[[390,106.8],[404.847,96.25],[405.009,37.969],[388.084,33.044],[388.378,84.251]]}],"t":45.885},{"e":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[2.204,10.038],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-2.349,-10.7],[-4.331,14.842],[8.508,9.457]],"v":[[435.403,157.758],[429.46,144.376],[416.698,122.052],[397.806,110.811],[409.035,143.781]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.752,1.725],[4.516,6.989],[0.005,10.277],[-0.539,-20.051],[-15.062,-27.206]],"o":[[6.648,-4.167],[-9.341,-14.457],[-0.009,-17.469],[0.416,15.456],[6.161,11.129]],"v":[[424.873,148.291],[420.968,130.502],[407.009,76.969],[389.084,71.044],[399.416,129.381]]}],"t":50.584},{"e":[{"c":true,"i":[[-0.903,5.742],[4.241,1.687],[4.241,3.281],[0.416,-8.294],[-5.302,-3.291]],"o":[[1.218,-7.751],[-3.46,-1.376],[-2.145,-1.66],[-0.368,7.354],[4.607,2.86]],"v":[[443.903,153.258],[438.46,145.376],[432.259,139.219],[423.084,146.294],[431.643,155.64]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[2.204,10.038],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-2.349,-10.7],[-4.331,14.842],[8.508,9.457]],"v":[[435.403,157.758],[429.46,144.376],[416.698,122.052],[397.806,110.811],[409.035,143.781]]}],"t":56.424},{"t":65.767578125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[398.555,63.389]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":44.744},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.912},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":65.768},{"t":66.935546875}]},"p":{"a":0,"ix":2,"k":[247.555,63.389]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[6.44,1.778],[0.112,-7.007],[-1.758,-0.668],[-1.776,3.348]],"o":[[-6.358,-1.755],[-0.09,5.641],[1.758,0.668],[1.776,-3.348]],"v":[[327.801,200.755],[318.571,212.996],[327.512,216.748],[332.295,210.494]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.324,7.335],[0.152,-9.506],[-2.384,-0.906],[-2.409,4.542]],"o":[[-8.624,-11.881],[-0.123,7.651],[2.384,0.906],[2.409,-4.542]],"v":[[349.124,166.381],[325.603,197.485],[337.731,202.574],[344.72,184.091]]}],"t":42.047},{"e":[{"c":true,"i":[[2.833,0.782],[0.049,-3.082],[-0.773,-0.294],[-0.781,1.473]],"o":[[-2.796,-0.772],[-0.04,2.481],[0.773,0.294],[0.781,-1.473]],"v":[[319.08,229.772],[315.02,235.155],[318.952,236.806],[321.056,234.055]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.44,1.778],[0.112,-7.007],[-1.758,-0.668],[-1.776,3.348]],"o":[[-6.358,-1.755],[-0.09,5.641],[1.758,0.668],[1.776,-3.348]],"v":[[327.801,200.755],[318.571,212.996],[327.512,216.748],[332.295,210.494]]}],"t":45.551},{"t":47.88671875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[337.186,183.275]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":40.879},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":42.047},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.887},{"t":49.0546875}]},"p":{"a":0,"ix":2,"k":[104.186,180.275]},"r":{"a":0,"ix":6,"k":79},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[-0.067,6.605],[-2.226,7.848],[13.842,-7.868],[0.828,-3.931]],"o":[[5.497,2.929],[0.118,-11.643],[0.881,-3.108],[-9.876,5.614],[-2.081,9.88]],"v":[[318.598,248.071],[327.692,237.239],[333.98,215.381],[326.709,199.194],[315.871,233.392]]}],"t":40.879},{"e":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[320.144,292.814],[323.852,281.417],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"t":45.551},{"e":[{"c":true,"i":[[-2.193,-0.398],[-1.633,1.625],[1.49,0.732],[1.104,0.616],[-2.243,-2.497]],"o":[[2.866,0.521],[1.8,-1.792],[-2.422,-1.19],[-2.874,-1.603],[1.691,1.882]],"v":[[326.268,298.715],[330.098,298.615],[330.467,294.009],[326.33,291.896],[323.493,296.095]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[320.144,292.814],[323.852,281.417],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"t":50.223},{"t":54.89453125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[323.852,221.168]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":39.711},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":40.879},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":54.895},{"t":56.0625}]},"p":{"a":0,"ix":2,"k":[54.852,164.168]},"r":{"a":0,"ix":6,"k":97},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.679,-3.237],[-0.517,4.848],[1.969,-0.558],[0.664,-2.606]],"o":[[8.09,10.017],[0.417,-3.897],[-1.969,0.558],[-0.969,3.802]],"v":[[405.614,313.083],[414.667,298.965],[410.333,294.572],[404.595,302.826]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-6.795,-5.998],[-6.373,12.088],[4.518,-1.6],[3.021,-4.16]],"o":[[13.088,11.553],[3.569,-6.769],[-3.223,1.142],[-3.021,4.16]],"v":[[385.32,338.854],[419.885,311.036],[406.184,302.873],[394.003,314.89]]}],"t":36.291},{"e":[{"c":true,"i":[[-0.988,-0.454],[0.126,1.819],[1.409,0.146],[0.852,-0.91]],"o":[[2.559,1.176],[-0.101,-1.455],[-0.32,-0.174],[-1.643,1.754]],"v":[[412.365,292.824],[414.874,290.201],[413.099,289.039],[411.343,289.658]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.679,-3.237],[-0.517,4.848],[1.969,-0.558],[0.664,-2.606]],"o":[[8.09,10.017],[0.417,-3.897],[-1.969,0.558],[-0.969,3.802]],"v":[[405.614,313.083],[414.667,298.965],[410.333,294.572],[404.595,302.826]]}],"t":40.322},{"t":43.1875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[407.156,310.85]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":35.039},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":36.207},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":43.188},{"t":44.35546875}]},"p":{"a":0,"ix":2,"k":[-131.844,173.85]},"r":{"a":0,"ix":6,"k":229},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-4.532,12.868],[10.898,-0.052],[5.649,8.585],[-4.064,-19.622],[-3.802,-3.34]],"o":[[2.607,-7.401],[-14.767,0.07],[-2.261,-3.445],[2.358,11.386],[11.289,9.917]],"v":[[385.463,348.975],[368.239,333.893],[335.471,309.489],[328.706,316.715],[346.925,345.112]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.029,1.172],[5.5,6.245],[4.887,9.041],[-7.602,-18.562],[-3.068,-4.025]],"o":[[7.317,-2.832],[-9.238,-10.49],[-6.119,-11.321],[5.184,12.658],[7.711,10.117]],"v":[[347.016,347.734],[352.084,327.928],[327.391,296.339],[308.941,297.289],[331.78,336.989]]}],"t":39.516},{"e":[{"c":true,"i":[[-8.094,2.97],[11.386,-1.475],[7.828,0.358],[-6.48,-3.777],[-4.068,-0.501]],"o":[[5.296,-1.944],[-9.486,4.744],[-2.961,0.265],[6.594,3.735],[10.126,1.246]],"v":[[400.442,345.247],[396.945,331.977],[375.01,335.171],[369.236,342.852],[382.771,346.994]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.532,12.868],[10.898,-0.052],[5.649,8.585],[-4.064,-19.622],[-3.802,-3.34]],"o":[[2.607,-7.401],[-14.767,0.07],[-2.261,-3.445],[2.358,11.386],[11.289,9.917]],"v":[[385.463,348.975],[368.239,333.893],[335.471,309.489],[328.706,316.715],[346.925,345.112]]}],"t":44.355},{"e":[{"c":true,"i":[[-1.227,0.43],[1.803,0.107],[2.109,0.356],[0.189,-1.037],[-2.011,-0.254]],"o":[[2.912,-1.02],[-1.289,-0.076],[-1.607,-0.272],[-0.125,0.685],[2.567,0.324]],"v":[[408.639,336.559],[408.766,332.761],[404.083,333.618],[401.638,334.535],[403.674,336.207]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.094,2.97],[11.386,-1.475],[7.828,0.358],[-6.48,-3.777],[-4.068,-0.501]],"o":[[5.296,-1.944],[-9.486,4.744],[-2.961,0.265],[6.594,3.735],[10.126,1.246]],"v":[[400.442,345.247],[396.945,331.977],[375.01,335.171],[369.236,342.852],[382.771,346.994]]}],"t":49.193},{"e":[{"c":true,"i":[[-0.997,0.637],[2.053,0.116],[0.765,-0.196],[-1.074,-1.941],[-1.524,1.037]],"o":[[1.081,-0.69],[-1.172,-0.066],[-1.436,0.367],[0.307,0.554],[0.686,-0.467]],"v":[[418.342,330.83],[417.401,328.631],[416.032,328.723],[414.592,331.789],[416.978,331.8]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.227,0.43],[1.803,0.107],[2.109,0.356],[0.189,-1.037],[-2.011,-0.254]],"o":[[2.912,-1.02],[-1.289,-0.076],[-1.607,-0.272],[-0.125,0.685],[2.567,0.324]],"v":[[408.639,336.559],[408.766,332.761],[404.083,333.618],[401.638,334.535],[403.674,336.207]]}],"t":54.033},{"t":59.677734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[328.814,317.986]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":38.543},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":39.711},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.566},{"t":60.734375}]},"p":{"a":0,"ix":2,"k":[-60.186,155.986]},"r":{"a":0,"ix":6,"k":108},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-19.408,3.137],[-19.5,-21],[-46.37,-67.073],[49.191,-113.654],[47.576,19.36],[54.339,-14.267],[23.774,17.431],[32.642,42.74]],"o":[[99,-16],[38.289,41.234],[32.013,46.306],[-14.415,33.304],[-65.513,-26.659],[-47.762,12.54],[-35.67,-26.152],[-33.953,-44.457]],"v":[[32,-184],[142.5,-166],[204.373,-56.72],[223.746,148.873],[69.527,166.82],[-56.312,159.032],[-196.774,161.569],[-256.642,8.26]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[7.321,31.724],[-25.23,-11.681],[-44.123,-48.72],[32.583,-56.711],[37.658,17.892],[48.518,-11.655],[18.476,12.879],[34.214,46.676]],"o":[[-4.5,-19.5],[54,25],[48.026,53.029],[-34.691,60.381],[-44.087,-20.946],[-48.518,11.655],[-35.723,-24.902],[-30.244,-41.259]],"v":[[28.5,-184.5],[124,-182],[207.225,-56.11],[229.302,145.073],[73.942,176.399],[-65.398,154.268],[-206.927,155.694],[-260.214,4.324]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-31.28,-9.029],[-26.684,-10.45],[-46.732,-42.263],[61.896,-78.899],[30.339,16.905],[26.961,-22.519],[17.029,21.172],[12.787,36.703]],"o":[[48.5,14],[71.5,28],[22.05,19.941],[-22.042,28.097],[-45.625,-25.423],[-40.175,33.556],[-30.84,-38.342],[-11.284,-32.387]],"v":[[28.5,-187],[125.5,-178],[205.738,-58.182],[222.096,154.749],[75.499,174.794],[-60.914,157.995],[-202.724,155.315],[-258.787,0.297]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":25.695},{"t":49.0546875}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":12.848},{"t":36.20703125}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":11}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":11,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[0,-59,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[0,5,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[110],"t":4.033},{"t":36.291015625}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[162,162,100],"t":4.033},{"t":29.033203125}]}},"nm":"Shape Layer 3","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-9.478,-5.703],[-2.937,5.985],[0.706,8.203],[1.043,-16.034],[3.425,-6.409]],"o":[[6.508,3.916],[7.707,-15.706],[-0.975,-11.327],[-0.804,12.36],[-4.803,8.987]],"v":[[401.486,233.991],[421.051,218.79],[427.182,171.638],[410.614,174.093],[398.87,211.585]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.478,-5.703],[-2.937,5.985],[0.706,8.203],[1.043,-16.034],[3.425,-6.409]],"o":[[6.508,3.916],[7.707,-15.706],[-0.975,-11.327],[-0.804,12.36],[-4.803,8.987]],"v":[[401.486,233.991],[419.019,214.743],[427.182,171.638],[410.614,174.093],[402.747,212.047]]}],"t":33.871},{"e":[{"c":true,"i":[[-7.901,-5.866],[-5.204,5.248],[0.552,15.963],[2.497,-10.999],[16.333,-11.642]],"o":[[6.138,4.708],[10.993,-11.085],[-0.312,-9.012],[-3.273,14.414],[-6.691,9.19]],"v":[[382.683,247.373],[403.219,239.01],[422.998,195.364],[410.31,188.564],[383.558,225.318]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.478,-5.703],[-2.937,5.985],[0.706,8.203],[1.043,-16.034],[3.425,-6.409]],"o":[[6.508,3.916],[7.707,-15.706],[-0.975,-11.327],[-0.804,12.36],[-4.803,8.987]],"v":[[401.486,233.991],[421.051,218.79],[427.182,171.638],[410.614,174.093],[398.87,211.585]]}],"t":44.355},{"e":[{"c":true,"i":[[-6.324,-6.028],[-5.645,6.114],[-6.999,14.134],[9.853,-17.471],[23.111,-19.238]],"o":[[5.769,5.499],[22.604,-24.479],[7.752,-15.655],[-10.82,19.184],[-9.777,8.138]],"v":[[363.983,263.669],[385.386,259.231],[418.815,219.091],[408.306,205.927],[371.285,240.06]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.901,-5.866],[-5.204,5.248],[0.552,15.963],[2.497,-10.999],[16.333,-11.642]],"o":[[6.138,4.708],[10.993,-11.085],[-0.312,-9.012],[-3.273,14.414],[-6.691,9.19]],"v":[[382.683,247.373],[403.219,239.01],[422.998,195.364],[410.31,188.564],[383.558,225.318]]}],"t":46.773},{"e":[{"c":true,"i":[[-7.27,-0.812],[-1.416,8.2],[-6.694,8.68],[18.019,-8.81],[3.481,-19.9]],"o":[[7.798,0.871],[2.93,-16.961],[6.69,-8.675],[-13.89,6.791],[-2.192,12.53]],"v":[[357.253,291.519],[373.936,278.357],[384.557,249.111],[382.687,232.767],[348.497,273.634]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-6.324,-6.028],[-5.645,6.114],[-6.999,14.134],[9.853,-17.471],[23.111,-19.238]],"o":[[5.769,5.499],[22.604,-24.479],[7.752,-15.655],[-10.82,19.184],[-9.777,8.138]],"v":[[363.983,263.669],[385.386,259.231],[418.815,219.091],[408.306,205.927],[371.285,240.06]]}],"t":49.193},{"e":[{"c":true,"i":[[-2.752,2.958],[1.788,2.62],[0.924,3.673],[1.499,-4.39],[-1.288,-4.509]],"o":[[3.714,-3.993],[-1.459,-2.138],[-0.623,-2.477],[-1.193,3.495],[1.036,3.624]],"v":[[359.979,298.683],[359.906,292.026],[357.126,286.36],[352.062,284.793],[351.988,295.291]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.27,-0.812],[-1.416,8.2],[-6.694,8.68],[18.019,-8.81],[3.481,-19.9]],"o":[[7.798,0.871],[2.93,-16.961],[6.69,-8.675],[-13.89,6.791],[-2.192,12.53]],"v":[[357.253,291.519],[373.936,278.357],[384.557,249.111],[382.687,232.767],[348.497,273.634]]}],"t":55.645},{"t":62.09765625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.478431403637,0.84705889225,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":43.215},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":44.383},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":61.902},{"t":63.0703125}]},"p":{"a":0,"ix":2,"k":[-133,-292]},"r":{"a":0,"ix":6,"k":33},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-13.079,6.417],[13.804,-3.257],[-3.342,-1.821],[-7.45,-1.822]],"o":[[13.842,-6.791],[-11.111,2.621],[11.078,6.036],[7.45,1.822]],"v":[[240.86,184],[183.299,160.668],[178.901,178.052],[211.47,186.061]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.079,6.417],[13.804,-3.257],[-3.342,-1.821],[-7.45,-1.822]],"o":[[13.842,-6.791],[-11.111,2.621],[11.078,6.036],[7.45,1.822]],"v":[[240.86,184],[183.299,160.668],[178.051,175.701],[211.47,186.061]]}],"t":33.871},{"e":[{"c":true,"i":[[-0.481,11.702],[12.009,-2.588],[-3.21,-0.747],[-6.422,-1.703]],"o":[[0.475,-11.551],[-9.667,2.084],[8.655,2.014],[6.422,1.703]],"v":[[177.664,166.721],[142.409,158.299],[139.551,175.054],[162.819,178.258]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.079,6.417],[13.804,-3.257],[-3.342,-1.821],[-7.45,-1.822]],"o":[[13.842,-6.791],[-11.111,2.621],[11.078,6.036],[7.45,1.822]],"v":[[240.86,184],[183.299,160.668],[178.901,178.052],[211.47,186.061]]}],"t":40.879},{"e":[{"c":true,"i":[[0.227,2.93],[2.915,-1.001],[0.014,-0.827],[-1.65,-0.234]],"o":[[-0.225,-2.892],[-2.347,0.806],[-0.014,0.827],[1.65,0.234]],"v":[[130.301,172.278],[123.858,170.29],[123.643,174.549],[126.945,175.592]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.481,11.702],[12.009,-2.588],[-3.21,-0.747],[-6.422,-1.703]],"o":[[0.475,-11.551],[-9.667,2.084],[8.655,2.014],[6.422,1.703]],"v":[[177.664,166.721],[142.409,158.299],[139.551,175.054],[162.819,178.258]]}],"t":44.383},{"t":50.22265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.478431403637,0.84705889225,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":39.711},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":40.879},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":50.223},{"t":51.390625}]},"p":{"a":0,"ix":2,"k":[-215,10]},"r":{"a":0,"ix":6,"k":-17},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.795,-1.654],[-0.094,6.531],[2.11,10.058],[2.206,-14.033],[-2.023,-4.639]],"o":[[5.808,3.437],[0.071,-4.912],[-0.836,-3.983],[-1.581,10.057],[2.916,6.687]],"v":[[323.226,281.826],[332.338,273.857],[322.17,243.788],[309.081,236.943],[316.032,275.062]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[-0.067,6.605],[3.054,7.565],[1.291,-5.694],[0.224,-4.011]],"o":[[5.497,2.929],[0.118,-11.643],[-2.98,-7.381],[-2.513,11.079],[-0.871,15.608]],"v":[[314.598,259.571],[323.692,245.239],[312.98,196.381],[299.709,202.194],[307.371,241.392]]}],"t":36.207},{"e":[{"c":true,"i":[[-2.205,1.491],[2.596,4.475],[3.862,3.441],[4.045,-5.587],[-3.484,-3.652]],"o":[[2.612,-1.766],[-1.522,-2.624],[-2.407,-2.145],[-4.817,6.654],[6.383,6.69]],"v":[[331.075,291.106],[331.84,281.644],[326.268,274.029],[315.877,263.087],[319.117,287.31]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.795,-1.654],[-0.094,6.531],[2.11,10.058],[2.206,-14.033],[-2.023,-4.639]],"o":[[5.808,3.437],[0.071,-4.912],[-0.836,-3.983],[-1.581,10.057],[2.916,6.687]],"v":[[323.226,281.826],[332.338,273.857],[322.17,243.788],[309.081,236.943],[316.032,275.062]]}],"t":40.879},{"e":[{"c":true,"i":[[-2.219,0.206],[-1.135,2.005],[1.633,0.304],[1.229,0.296],[-2.832,-1.801]],"o":[[2.9,-0.269],[1.252,-2.21],[-2.653,-0.495],[-3.199,-0.771],[2.135,1.358]],"v":[[330.207,293.678],[333.87,292.552],[332.987,288.016],[328.434,287.093],[326.831,291.901]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.205,1.491],[2.596,4.475],[3.862,3.441],[4.045,-5.587],[-3.484,-3.652]],"o":[[2.612,-1.766],[-1.522,-2.624],[-2.407,-2.145],[-4.817,6.654],[6.383,6.69]],"v":[[331.075,291.106],[331.84,281.644],[326.268,274.029],[315.877,263.087],[319.117,287.31]]}],"t":45.551},{"t":50.22265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.478431403637,0.84705889225,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[311.738,226.23]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":35.039},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":36.207},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":50.223},{"t":51.390625}]},"p":{"a":0,"ix":2,"k":[-155.262,151.23]},"r":{"a":0,"ix":6,"k":123},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[4.248,3.123],[2,-4.932],[-1.974,0.319],[-2.787,2.913]],"o":[[-7.325,-5.384],[-2.255,5.56],[1.974,-0.319],[4.226,-4.416]],"v":[[-179.774,265.316],[-193.599,273.114],[-189.441,280.448],[-184.075,275.347]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.478,-2.921],[2.11,-8.245],[-1.668,1.103],[-0.976,3.911]],"o":[[-9.641,4.347],[-1.488,5.813],[4.132,-2.733],[1.617,-6.481]],"v":[[-200.047,280.328],[-209.579,310.509],[-203.3,317.556],[-197.226,301.916]]}],"t":33.871},{"e":[{"c":true,"i":[[1.183,0.665],[0,-1.37],[-0.508,0.082],[-0.511,0.903]],"o":[[-0.405,-0.228],[0,1.112],[0.508,-0.082],[0.316,-0.558]],"v":[[-177.262,258.624],[-178.89,259.73],[-178.206,261.168],[-176.567,260.048]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.248,3.123],[2,-4.932],[-1.974,0.319],[-2.787,2.913]],"o":[[-7.325,-5.384],[-2.255,5.56],[1.974,-0.319],[4.226,-4.416]],"v":[[-179.774,265.316],[-193.599,273.114],[-189.441,280.448],[-184.075,275.347]]}],"t":37.902},{"e":[{"c":true,"i":[[0.836,1.069],[0.528,-1.265],[-0.501,-0.12],[-0.82,0.637]],"o":[[-0.286,-0.366],[-0.428,1.026],[0.501,0.12],[0.506,-0.393]],"v":[[-176.806,258.966],[-178.735,259.36],[-178.657,260.95],[-176.713,260.548]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.183,0.665],[0,-1.37],[-0.508,0.082],[-0.511,0.903]],"o":[[-0.405,-0.228],[0,1.112],[0.508,-0.082],[0.316,-0.558]],"v":[[-177.262,258.624],[-178.89,259.73],[-178.206,261.168],[-176.567,260.048]]}],"t":41.045},{"t":41.12890625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.478431403637,0.84705889225,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-201.517,300.108]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.869},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":34.037},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":41.045},{"t":42.21484375}]},"p":{"a":0,"ix":2,"k":[-223.284,-41.979]},"r":{"a":0,"ix":6,"k":-20},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-1.656,2.794],[7.194,0.91],[5.037,6.761],[0.877,-7.851],[-5.98,-1.554]],"o":[[4,-6.75],[-12.603,-1.594],[-1.994,-2.677],[-1.303,11.668],[10.729,2.788]],"v":[[-144.875,343.375],[-156.511,333.024],[-191.674,311.069],[-199.377,315.851],[-169.77,342.804]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.656,2.794],[7.707,-3.14],[9.75,3.25],[-9.11,-17.87],[-4.9,-1.267]],"o":[[4,-6.75],[-13.5,5.5],[-3.861,-1.287],[6.5,12.75],[12.316,3.184]],"v":[[-124.5,346.25],[-136.25,337.25],[-179.75,327.75],[-189.5,331.25],[-149.6,347.767]]}],"t":33.871},{"e":[{"c":true,"i":[[-2.466,2.114],[6.682,4.96],[0.323,10.272],[6.254,-6.701],[-2.722,-4.266]],"o":[[5.25,-4.5],[-11.706,-8.688],[-0.128,-4.068],[-9.764,10.463],[7.439,11.659]],"v":[[-176.75,335.5],[-180.772,323.048],[-195.097,297.389],[-201.754,289.451],[-199.939,319.091]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.656,2.794],[7.194,0.91],[5.037,6.761],[0.877,-7.851],[-5.98,-1.554]],"o":[[4,-6.75],[-12.603,-1.594],[-1.994,-2.677],[-1.303,11.668],[10.729,2.788]],"v":[[-144.875,343.375],[-156.511,333.024],[-191.674,311.069],[-199.377,315.851],[-169.77,342.804]]}],"t":37.375},{"e":[{"c":true,"i":[[-3,-0.5],[0.128,4.198],[-0.802,5.812],[7.132,-5.649],[0.411,-5.359]],"o":[[3,0.5],[-0.128,-4.198],[1.118,-3.763],[-5.843,5.427],[-0.411,5.359]],"v":[[-199,310.25],[-192.622,303.198],[-190.057,288.853],[-196.364,282.839],[-204.089,300.391]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.466,2.114],[6.682,4.96],[0.323,10.272],[6.254,-6.701],[-2.722,-4.266]],"o":[[5.25,-4.5],[-11.706,-8.688],[-0.128,-4.068],[-9.764,10.463],[7.439,11.659]],"v":[[-176.75,335.5],[-180.772,323.048],[-195.097,297.389],[-201.754,289.451],[-199.939,319.091]]}],"t":40.879},{"e":[{"c":true,"i":[[-1.144,0],[-1.307,2.623],[-0.547,0.999],[2.718,-1.742],[0.525,-1.315]],"o":[[0.968,0],[0.184,-0.369],[0.686,-1.254],[-1.137,0.729],[-0.374,0.936]],"v":[[-189.856,280.797],[-186.342,279.141],[-185.436,276.892],[-187.574,275.225],[-190.187,277.835]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3,-0.5],[0.128,4.198],[-0.802,5.812],[7.132,-5.649],[0.411,-5.359]],"o":[[3,0.5],[-0.128,-4.198],[1.118,-3.763],[-5.843,5.427],[-0.411,5.359]],"v":[[-199,310.25],[-192.622,303.198],[-190.057,288.853],[-196.364,282.839],[-204.089,300.391]]}],"t":44.383},{"t":47.88671875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.478431403637,0.84705889225,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-158.706,337.807]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.703},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":33.871},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.887},{"t":49.0546875}]},"p":{"a":0,"ix":2,"k":[-206.637,100.803]},"r":{"a":0,"ix":6,"k":52},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-5.885,-18.758],[27.378,-25.069],[32,-25],[43.701,-23.415],[29.194,-19.942],[19.717,46.737],[0.948,16.073],[-2.882,19.018],[-17.763,21.089]],"o":[[16,51],[-41.5,38],[-44.473,34.744],[-26.163,14.018],[-43.249,29.543],[-12.61,-29.891],[-0.948,-16.073],[7.193,-47.469],[17.763,-21.089]],"v":[[160,-121],[159.5,18],[101,106],[-27.584,128.335],[-95.515,150.94],[-207.717,102.263],[-217.944,14.161],[-232.193,-106.531],[-185.004,-197.671]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[1.135,-32.538],[40.581,-42.204],[59.5,-4.5],[57.859,-13.541],[35.181,-22.373],[19.405,41.321],[0.434,29.526],[-0.99,13.305],[-10.765,15.342]],"o":[[-1.5,43],[-25,26],[-71.34,5.395],[-40.448,9.466],[-40.591,25.814],[-14.518,-30.915],[-0.434,-29.527],[4.118,-55.326],[10.765,-15.342]],"v":[[161.5,-121.5],[153,28],[73.5,117],[-27.859,122.041],[-93.917,153.889],[-213.195,93.897],[-219.069,9.063],[-233.118,-108.674],[-191.644,-191.575]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[6.725,-31.855],[43.5,-41],[35,-35],[64.433,-24.076],[29.307,-18.638],[20.481,33.129],[-3.033,17.148],[-3.437,16.453],[-14.649,15.745]],"o":[[-9.5,45],[-36.814,34.698],[-21.022,21.022],[-33.451,12.5],[-35.181,22.373],[-22.251,-35.992],[3.033,-17.148],[11.33,-54.236],[14.649,-15.745]],"v":[[162.5,-116],[145,25.5],[101,104],[-14.431,120.704],[-93.59,151.677],[-209.182,101.669],[-219.707,4.839],[-230.33,-112.764],[-185.666,-194.127]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":18.688},{"t":45.55078125}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":4.672},{"t":28.03125}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.992156922817,0.478431403637,0.84705889225,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":8}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":12,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[2,-61,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[2,3,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[145],"t":4.033},{"t":41.935546875}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[165,165,100],"t":4.033},{"t":25.806640625}]}},"nm":"Shape Layer 1","op":794,"parent":1,"shapes":[{"cix":2,"hd":true,"it":[{"hd":true,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.361,6.661],[9.412,10.595],[-3.111,-5.282],[-3.29,-2.014]],"o":[[-1.75,-8.563],[-6.067,-6.83],[3.113,5.286],[3.29,2.014]],"v":[[312.912,-55.962],[297.26,-71.67],[284.883,-66.488],[296.153,-55.583]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.549,10.146],[19.703,7.766],[-7.715,-4.94],[-5.539,-1.593]],"o":[[0.786,-14.537],[-12.701,-5.006],[7.72,4.943],[5.539,1.593]],"v":[[357.714,-44.424],[321.123,-60.295],[308.775,-42.809],[333.721,-37.218]]}],"t":42.047},{"e":[{"c":true,"i":[[0.541,4.341],[2.202,2.804],[-1.99,-5.435],[-2.712,-2.43]],"o":[[-1.02,-8.19],[-5.328,-6.785],[1.991,5.439],[2.712,2.43]],"v":[[291.516,-70.561],[289.004,-79.556],[280.166,-76.97],[282.182,-73.418]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.361,6.661],[9.412,10.595],[-3.111,-5.282],[-3.29,-2.014]],"o":[[-1.75,-8.563],[-6.067,-6.83],[3.113,5.286],[3.29,2.014]],"v":[[312.912,-55.962],[297.26,-71.67],[284.883,-66.488],[296.153,-55.583]]}],"t":45.551},{"t":47.88671875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.600000023842,0.333333343267,0.98431378603,1]},"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":40.879},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":42.047},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.887},{"t":49.0546875}]},"p":{"a":0,"ix":2,"k":[-559,161]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":true,"it":[{"hd":true,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[0.295,2.561],[6.597,-0.334],[9.416,-2.383],[-12.552,-3.048],[-9.548,3.233]],"o":[[-0.807,-7.006],[-9.833,0.497],[-11.045,2.795],[11.875,2.883],[11.707,-3.964]],"v":[[-175.469,106.444],[-193.814,106.123],[-222.955,104.205],[-220.948,123.048],[-189.707,120.464]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.223,1.907],[4.317,-3.88],[4.344,-5.703],[-12.641,5.995],[-11.776,9.837]],"o":[[-2.955,-4.606],[-14.334,12.885],[-6.777,8.897],[9.702,-4.602],[12.608,-10.531]],"v":[[-132.286,80.478],[-150.666,79.115],[-190.95,104.669],[-179.645,115.553],[-146.608,98.531]]}],"t":43.215},{"e":[{"c":true,"i":[[-0.178,2.15],[5.427,0.92],[6.446,1.2],[-7.449,-5.526],[-10.039,-0.321]],"o":[[0.41,-5.607],[-8.68,-1.612],[-7.02,-0.735],[6.848,4.674],[9.559,-0.463]],"v":[[-211.051,113.151],[-220.9,108.102],[-242.142,100.216],[-246.327,113.453],[-223.511,119.606]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.295,2.561],[6.597,-0.334],[9.416,-2.383],[-12.552,-3.048],[-9.548,3.233]],"o":[[-0.807,-7.006],[-9.833,0.497],[-11.045,2.795],[11.875,2.883],[11.707,-3.964]],"v":[[-175.469,106.444],[-193.814,106.123],[-222.955,104.205],[-220.948,123.048],[-189.707,120.464]]}],"t":46.719},{"e":[{"c":true,"i":[[-0.359,1.754],[4.357,1.435],[3.609,3.904],[-3.061,-6.971],[-10.526,-2.514]],"o":[[0.866,-4.237],[-7.705,-2.538],[-3.061,-3.312],[2.422,5.517],[7.305,1.745]],"v":[[-242.804,109.709],[-244.795,101.288],[-259.109,90.346],[-267.672,98.483],[-252.555,110.255]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.178,2.15],[5.427,0.92],[6.446,1.2],[-7.449,-5.526],[-10.039,-0.321]],"o":[[0.41,-5.607],[-8.68,-1.612],[-7.02,-0.735],[6.848,4.674],[9.559,-0.463]],"v":[[-211.051,113.151],[-220.9,108.102],[-242.142,100.216],[-246.327,113.453],[-223.511,119.606]]}],"t":49.055},{"e":[{"c":true,"i":[[-0.66,0.756],[0.251,1.021],[1.433,0.64],[-1.479,-2.424],[-1.953,-0.893]],"o":[[1.176,-1.347],[-0.475,-1.933],[-2.309,-1.031],[0.976,1.6],[1.024,0.469]],"v":[[-266.971,91.259],[-267.117,88.039],[-270.218,85.624],[-273.387,88.797],[-270.547,91.768]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.359,1.754],[4.357,1.435],[3.609,3.904],[-3.061,-6.971],[-10.526,-2.514]],"o":[[0.866,-4.237],[-7.705,-2.538],[-3.061,-3.312],[2.422,5.517],[7.305,1.745]],"v":[[-242.804,109.709],[-244.795,101.288],[-259.109,90.346],[-267.672,98.483],[-252.555,110.255]]}],"t":51.391},{"t":53.7265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.600000023842,0.333333343267,0.98431378603,1]},"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":42.047},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":43.215},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":53.727},{"t":54.89453125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":true,"it":[{"hd":true,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-1.442,-2.91],[-5.045,6.618],[-8.843,5.238],[19.731,-3.608],[11.564,-12.167]],"o":[[2.661,5.368],[10.435,-13.688],[8.338,-4.938],[-16.451,3.008],[-7.711,8.114]],"v":[[-49.911,85.632],[-30.934,79.381],[5.662,61.938],[-3.549,45.992],[-42.314,67.417]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.417,-2.922],[-8.084,1.975],[-8.679,-0.998],[19.717,-3.683],[15.906,-1.755]],"o":[[-3.423,7.06],[20.948,-5.118],[14.1,1.621],[-15.198,2.839],[-12.644,1.395]],"v":[[-22.2,53.363],[-5.198,62.868],[38.929,56.248],[40.089,39.882],[3.594,44.755]]}],"t":46.719},{"e":[{"c":true,"i":[[-3.124,-0.889],[-2.166,8.035],[-4.364,9.305],[8.677,-7.912],[1.189,-6.126]],"o":[[7.547,2.147],[4.481,-16.619],[4.651,-9.918],[-11.425,10.417],[-2.424,12.487]],"v":[[-59.331,139.22],[-52.229,126.417],[-44.784,102.206],[-52.927,81.787],[-64.055,109.753]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.442,-2.91],[-5.045,6.618],[-8.843,5.238],[19.731,-3.608],[11.564,-12.167]],"o":[[2.661,5.368],[10.435,-13.688],[8.338,-4.938],[-16.451,3.008],[-7.711,8.114]],"v":[[-49.911,85.632],[-30.934,79.381],[5.662,61.938],[-3.549,45.992],[-42.314,67.417]]}],"t":52.559},{"e":[{"c":true,"i":[[-2.424,1.108],[0.428,2.048],[0.664,2.367],[0.439,-3.782],[-0.471,-1.952]],"o":[[3.272,-1.496],[-0.349,-1.671],[-0.78,-2.782],[-0.253,2.185],[0.583,2.417]],"v":[[-61.64,148.162],[-60.004,144.086],[-61.22,140.032],[-66.247,138.315],[-65.654,144.077]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.124,-0.889],[-2.166,8.035],[-4.364,9.305],[8.677,-7.912],[1.189,-6.126]],"o":[[7.547,2.147],[4.481,-16.619],[4.651,-9.918],[-11.425,10.417],[-2.424,12.487]],"v":[[-59.331,139.22],[-52.229,126.417],[-44.784,102.206],[-52.927,81.787],[-64.055,109.753]]}],"t":59.566},{"t":65.40625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.600000023842,0.333333343267,0.98431378603,1]},"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":45.551},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":46.719},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":66.572},{"t":67.7421875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":true,"it":[{"hd":true,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.973,-1.051],[-0.058,5.729],[-1.931,6.807],[12.005,-6.824],[0.718,-3.41]],"o":[[4.767,2.54],[0.102,-10.098],[0.764,-2.696],[-8.566,4.869],[-1.805,8.57]],"v":[[317.96,240.543],[325.848,231.148],[331.302,212.189],[324.995,198.15],[315.595,227.811]]}],"t":28.031},{"e":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[320.144,292.814],[323.852,281.417],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"t":32.703},{"e":[{"c":true,"i":[[-2.193,-0.398],[-1.633,1.625],[1.49,0.732],[1.104,0.616],[-2.243,-2.497]],"o":[[2.866,0.521],[1.8,-1.792],[-2.422,-1.19],[-2.874,-1.603],[1.691,1.882]],"v":[[326.268,298.715],[330.098,298.615],[330.467,294.009],[326.33,291.896],[323.493,296.095]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[320.144,292.814],[323.852,281.417],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"t":37.375},{"t":42.046875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.600000023842,0.333333343267,0.98431378603,1]},"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":26.863},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":28.031},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":42.047},{"t":43.21484375}]},"p":{"a":0,"ix":2,"k":[-750,-113]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":true,"it":[{"hd":true,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.628,-2.167],[-0.46,-1.816],[-0.691,0.323],[0.473,1.463]],"o":[[-0.536,0.714],[0.561,2.218],[0.691,-0.323],[-0.473,-1.463]],"v":[[-428.61,106.531],[-429.644,110.032],[-426.919,110.33],[-426.223,106.575]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.596,-4.38],[0.25,-4.125],[-2,0],[-0.5,4]],"o":[[-2.875,2.25],[-0.363,5.989],[2,0],[0.5,-4]],"v":[[-410.5,67.375],[-415.5,74.5],[-410,80],[-401.875,71.25]]}],"t":33.871},{"t":39.7109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.6,0.333333333333,0.984313785329,1]},"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.703},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":33.871},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":39.711},{"t":40.87890625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":true,"it":[{"hd":true,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-0.96,3.103],[7.296,-4.219],[-0.476,-4.042],[-7.741,3.727],[-7.442,9.586]],"o":[[2.869,-9.275],[-12.619,7.297],[0.476,4.042],[2.506,-1.206],[7.572,-9.753]],"v":[[-371.718,45.678],[-389.895,46.753],[-413.098,71.506],[-403.921,77.414],[-389.897,60.579]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.24,3.239],[7.707,-3.14],[0.75,-4],[-8.5,1.25],[-5.43,2.334]],"o":[[1,-13.5],[-13.5,5.5],[-0.75,4],[2.752,-0.405],[11.344,-4.876]],"v":[[-355,42.25],[-375.25,36.75],[-400.25,57.25],[-393,62.75],[-378.6,52.767]]}],"t":33.871},{"e":[{"c":true,"i":[[-2.713,4.211],[3.088,-3.743],[-0.635,-2.98],[-5.512,3.313],[-2.768,8.653]],"o":[[3.937,-6.108],[-6.944,8.417],[0.635,2.98],[1.784,-1.073],[0.543,-1.697]],"v":[[-402.446,71.108],[-408.746,69.388],[-417.03,85.045],[-409.782,88.814],[-406.45,77.669]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.96,3.103],[7.296,-4.219],[-0.476,-4.042],[-7.741,3.727],[-7.442,9.586]],"o":[[2.869,-9.275],[-12.619,7.297],[0.476,4.042],[2.506,-1.206],[7.572,-9.753]],"v":[[-371.718,45.678],[-389.895,46.753],[-413.098,71.506],[-403.921,77.414],[-389.897,60.579]]}],"t":38.543},{"e":[{"c":true,"i":[[0.561,1.74],[0.093,-1.247],[-0.579,-0.949],[-0.806,0.839],[0.024,1.087]],"o":[[-0.306,-0.95],[-0.067,0.907],[0.579,0.949],[0.332,-0.346],[-0.014,-0.65]],"v":[[-418.312,92.219],[-420.136,94.516],[-419.871,96.273],[-418.145,95.819],[-417.925,94.428]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.713,4.211],[3.088,-3.743],[-0.635,-2.98],[-5.512,3.313],[-2.768,8.653]],"o":[[3.937,-6.108],[-6.944,8.417],[0.635,2.98],[1.784,-1.073],[0.543,-1.697]],"v":[[-402.446,71.108],[-408.746,69.388],[-417.03,85.045],[-409.782,88.814],[-406.45,77.669]]}],"t":43.215},{"t":49.0546875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.600000023842,0.333333343267,0.98431378603,1]},"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.703},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":33.871},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":49.055},{"t":50.22265625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-1,22],[123.5,-13],[33,-17],[29,0],[17,19],[-9.499,24.13],[0.729,36.777],[-32.887,6.622],[-8.011,3.213]],"o":[[0.747,-16.43],[-30.398,3.2],[-33,17],[-29,0],[-19.792,-22.12],[9.089,-23.087],[-1.43,-72.116],[45.69,-9.199],[8.011,-3.213]],"v":[[156,18.5],[-15,54],[-134.5,86],[-209,103],[-270,52],[-267.74,-21.23],[-243.729,-110.777],[-162.559,-228.388],[-57.069,-230.979]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-34.711,-31.625],[16.377,-0.224],[49,-12.5],[29.512,3.587],[6.943,26.458],[-3.669,11.469],[0.093,10.659],[-49.053,-0.468],[-9.838,1.808]],"o":[[22.5,20.5],[-36.5,0.5],[-35.969,9.176],[-29.512,-3.586],[-9.25,-35.25],[7.304,-22.831],[-0.591,-67.706],[9.37,0.089],[9.838,-1.808]],"v":[[154.5,18],[-13.5,57.5],[-128,83],[-203.5,95.5],[-275.75,49.5],[-263.084,-23.438],[-248.409,-113.294],[-156.915,-236.114],[-54.184,-231.84]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[24,-22],[50.828,-3.279],[58.5,-25.5],[29.512,3.586],[8.5,26],[-8.802,24.037],[-1.102,8.68],[-52.994,14.316],[-11.989,2.514]],"o":[[-24,22],[-46.5,3],[-34.029,14.833],[-29.512,-3.587],[-9.223,-28.212],[11.83,-32.306],[12.236,-96.423],[34.114,-9.216],[11.989,-2.514]],"v":[[155.5,15],[-15.5,53],[-134.5,78],[-210,102],[-267,57.5],[-267.38,-26.045],[-254.236,-107.577],[-160.181,-236.934],[-52.471,-232.199]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":17.52},{"t":50.22265625}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":4.672},{"t":37.375}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.600000023842,0.333333343267,0.98431378603,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":10}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":13,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[0,-60,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[0,4,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[120],"t":9.678},{"t":45.966796875}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[135,135,100],"t":9.678},{"t":28.2265625}]}},"nm":"Shape Layer 6","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-3.363,-5.909],[-12.237,-7.148],[4.597,4.054],[3.752,0.892]],"o":[[4.323,7.596],[7.888,4.608],[-4.601,-4.057],[-3.752,-0.892]],"v":[[312.812,-57.316],[332.569,-47.245],[342.724,-56.015],[328.625,-62.881]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.952,-9.013],[-18.451,-4.052],[7.493,3.259],[5.104,0.62]],"o":[[1.364,12.913],[11.894,2.612],[-7.498,-3.261],[-5.104,-0.62]],"v":[[270.136,-60.913],[304.606,-52.112],[313.007,-69.259],[290.247,-70.654]]}],"t":50.807},{"e":[{"c":true,"i":[[-2.93,-3.249],[-3.411,-1.038],[4.744,3.316],[3.615,0.439]],"o":[[5.527,6.129],[8.253,2.511],[-4.747,-3.319],[-3.615,-0.439]],"v":[[344.43,-43.937],[351.64,-38.002],[357.405,-45.184],[353.718,-46.941]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.363,-5.909],[-12.237,-7.148],[4.597,4.054],[3.752,0.892]],"o":[[4.323,7.596],[7.888,4.608],[-4.601,-4.057],[-3.752,-0.892]],"v":[[312.812,-57.316],[332.569,-47.245],[342.724,-56.015],[328.625,-62.881]]}],"t":54.561},{"t":56.896484375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[292.434,-60.719]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":49.639},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":50.807},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":56.896},{"t":58.064453125}]},"p":{"a":0,"ix":2,"k":[17.434,-251.719]},"r":{"a":0,"ix":6,"k":-29},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.752,1.725],[4.516,6.989],[0.005,10.277],[-0.539,-20.051],[-15.062,-27.206]],"o":[[6.648,-4.167],[-9.341,-14.457],[-0.009,-17.469],[0.416,15.456],[6.161,11.129]],"v":[[424.873,148.291],[420.968,130.502],[407.009,76.969],[389.084,71.044],[399.416,129.381]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.663,-1.858],[-4.667,6.89],[1.817,10.116],[-0.539,-20.051],[1.627,-4.792]],"o":[[6.435,4.49],[9.653,-14.25],[-2.509,-13.969],[0.416,15.456],[-4.089,12.045]],"v":[[390,106.8],[404.847,96.25],[408.509,37.469],[388.084,33.044],[385.378,84.251]]}],"t":49.945},{"e":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[2.204,10.038],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-2.349,-10.7],[-4.331,14.842],[8.508,9.457]],"v":[[435.403,157.758],[429.46,144.376],[416.698,122.052],[397.806,110.811],[409.035,143.781]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.752,1.725],[4.516,6.989],[0.005,10.277],[-0.539,-20.051],[-15.062,-27.206]],"o":[[6.648,-4.167],[-9.341,-14.457],[-0.009,-17.469],[0.416,15.456],[6.161,11.129]],"v":[[424.873,148.291],[420.968,130.502],[407.009,76.969],[389.084,71.044],[399.416,129.381]]}],"t":54.617},{"e":[{"c":true,"i":[[-0.903,5.742],[4.241,1.687],[4.241,3.281],[0.416,-8.294],[-5.302,-3.291]],"o":[[1.218,-7.751],[-3.46,-1.376],[-2.145,-1.66],[-0.368,7.354],[4.607,2.86]],"v":[[443.903,153.258],[438.46,145.376],[432.259,139.219],[423.084,146.294],[431.643,155.64]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[2.204,10.038],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-2.349,-10.7],[-4.331,14.842],[8.508,9.457]],"v":[[435.403,157.758],[429.46,144.376],[416.698,122.052],[397.806,110.811],[409.035,143.781]]}],"t":60.455},{"t":69.798828125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[396.555,65.137]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":48.775},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":49.945},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":69.799},{"t":70.966796875}]},"p":{"a":0,"ix":2,"k":[79.555,-281.863]},"r":{"a":0,"ix":6,"k":-114},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[6.44,1.778],[0.112,-7.007],[-1.758,-0.668],[-1.776,3.348]],"o":[[-6.358,-1.755],[-0.09,5.641],[1.758,0.668],[1.776,-3.348]],"v":[[327.801,200.755],[318.571,212.996],[327.512,216.748],[332.295,210.494]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.51,0.798],[2.848,-11.949],[-3.735,7.145],[0.01,5.141]],"o":[[-14.529,-2.104],[-1.774,7.444],[4.86,-9.297],[-0.018,-8.885]],"v":[[329.808,160.641],[322.057,196.166],[335.144,203.18],[339.526,181.612]]}],"t":47.58},{"e":[{"c":true,"i":[[2.833,0.782],[0.049,-3.082],[-0.773,-0.294],[-0.781,1.473]],"o":[[-2.796,-0.772],[-0.04,2.481],[0.773,0.294],[0.781,-1.473]],"v":[[319.08,229.772],[315.02,235.155],[318.952,236.806],[321.056,234.055]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.44,1.778],[0.112,-7.007],[-1.758,-0.668],[-1.776,3.348]],"o":[[-6.358,-1.755],[-0.09,5.641],[1.758,0.668],[1.776,-3.348]],"v":[[327.801,200.755],[318.571,212.996],[327.512,216.748],[332.295,210.494]]}],"t":51.334},{"t":53.669921875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[334.293,183.16]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":46.412},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.58},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":53.67},{"t":54.837890625}]},"p":{"a":0,"ix":2,"k":[267.293,-247.84]},"r":{"a":0,"ix":6,"k":-28},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[-0.067,6.605],[-2.226,7.848],[13.842,-7.868],[0.828,-3.931]],"o":[[5.497,2.929],[0.118,-11.643],[0.881,-3.108],[-9.876,5.614],[-2.081,9.88]],"v":[[318.598,248.071],[327.692,237.239],[333.98,215.381],[326.709,199.194],[315.871,233.392]]}],"t":46.912},{"e":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[320.144,292.814],[323.852,281.417],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"t":51.584},{"e":[{"c":true,"i":[[-2.193,-0.398],[-1.633,1.625],[1.49,0.732],[1.104,0.616],[-2.243,-2.497]],"o":[[2.866,0.521],[1.8,-1.792],[-2.422,-1.19],[-2.874,-1.603],[1.691,1.882]],"v":[[326.268,298.715],[330.098,298.615],[330.467,294.009],[326.33,291.896],[323.493,296.095]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[320.144,292.814],[323.852,281.417],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"t":56.256},{"t":60.927734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[322.121,224.023]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":45.746},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":46.912},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":60.928},{"t":62.09765625}]},"p":{"a":0,"ix":2,"k":[271.121,-187.977]},"r":{"a":0,"ix":6,"k":346},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-3.029,1.172],[10.666,-2.428],[5.654,8.583],[3.888,-19.677],[-3.068,-4.025]],"o":[[7.317,-2.832],[-14.214,3.235],[-2.239,-3.399],[-2.774,14.04],[7.711,10.117]],"v":[[387.004,343.266],[368.334,333.928],[335.518,309.566],[323.441,313.289],[347.839,341.19]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.029,1.172],[8.824,9.246],[5.654,8.583],[-7.246,-18.703],[-3.068,-4.025]],"o":[[7.317,-2.832],[-10.064,-10.546],[-2.239,-3.399],[6.33,16.34],[7.711,10.117]],"v":[[355.754,342.266],[352.084,327.928],[329.768,295.566],[310.599,298.407],[334.885,333.794]]}],"t":45.551},{"e":[{"c":true,"i":[[-2.948,-1.363],[14.416,6.822],[15.482,-1.566],[-9.209,-5.155],[-5.059,0.157]],"o":[[6.996,3.234],[-13.176,-6.235],[-4.049,0.41],[9.309,5.211],[14.161,-0.44]],"v":[[397.754,346.766],[399.334,338.678],[367.268,330.816],[359.441,341.539],[376.839,344.44]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.029,1.172],[10.666,-2.428],[5.654,8.583],[3.888,-19.677],[-3.068,-4.025]],"o":[[7.317,-2.832],[-14.214,3.235],[-2.239,-3.399],[-2.774,14.04],[7.711,10.117]],"v":[[387.004,343.266],[368.334,333.928],[335.518,309.566],[323.441,313.289],[347.839,341.19]]}],"t":49.777},{"e":[{"c":true,"i":[[-2.948,-1.363],[4.166,7.572],[6.982,2.184],[2.809,-5.289],[-5.021,-0.635]],"o":[[6.996,3.234],[-1.554,-2.824],[-3.884,-1.215],[-0.816,1.536],[6.411,0.81]],"v":[[403.754,348.766],[410.584,342.178],[400.518,336.316],[390.691,339.289],[397.589,344.19]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.948,-1.363],[14.416,6.822],[15.482,-1.566],[-9.209,-5.155],[-5.059,0.157]],"o":[[6.996,3.234],[-13.176,-6.235],[-4.049,0.41],[9.309,5.211],[14.161,-0.44]],"v":[[397.754,346.766],[399.334,338.678],[367.268,330.816],[359.441,341.539],[376.839,344.44]]}],"t":54.449},{"e":[{"c":true,"i":[[-1.552,-1.544],[0.618,3.756],[0.662,1.304],[3.073,-2.723],[-2.487,-2.336]],"o":[[1.682,1.674],[-0.353,-2.144],[-1.242,-2.446],[-0.877,0.777],[1.12,1.052]],"v":[[408.79,349.826],[412.382,347.238],[411.664,344.803],[405.545,343.437],[406.487,347.752]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.948,-1.363],[4.166,7.572],[6.982,2.184],[2.809,-5.289],[-5.021,-0.635]],"o":[[6.996,3.234],[-1.554,-2.824],[-3.884,-1.215],[-0.816,1.536],[6.411,0.81]],"v":[[403.754,348.766],[410.584,342.178],[400.518,336.316],[390.691,339.289],[397.589,344.19]]}],"t":59.121},{"t":64.9609375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[328.254,317.867]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":44.381},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.551},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":64.961},{"t":66.12890625}]},"p":{"a":0,"ix":2,"k":[276.254,-124.133]},"r":{"a":0,"ix":6,"k":24},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 9","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.655,-2.672],[-1.957,-1.793],[-0.597,0.652],[1.155,1.358]],"o":[[-3.672,5.929],[1.957,1.793],[0.597,-0.652],[-1.155,-1.358]],"v":[[309.793,-274.248],[313.365,-263.794],[315.987,-264.692],[313.621,-268.658]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.97,1.386],[0.112,-7.555],[-1.974,0.319],[0.145,4.029]],"o":[[-11.153,-2.218],[-0.089,5.999],[1.974,-0.319],[-0.145,-4.029]],"v":[[304.825,-314.366],[294.698,-290.204],[300.718,-283.511],[307.158,-292.711]]}],"t":41.129},{"t":45.966796875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[299.937,-302.805]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":40.322},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":41.129},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.967},{"t":46.7734375}]},"p":{"a":0,"ix":2,"k":[274.688,71.682]},"r":{"a":0,"ix":6,"k":402},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.085,-2.593],[-7.2,0.179],[-7.392,-1.934],[1.588,4.551],[9.608,1.982]],"o":[[-2.621,6.265],[12.072,-0.3],[6.079,1.591],[-2.552,-7.31],[-10.783,-2.224]],"v":[[305.392,-348.662],[316.542,-342.354],[337.821,-336.969],[345.879,-341.41],[326.727,-352.967]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.992,-1.263],[-6.903,-4.647],[-8.561,-5.687],[18.988,6.146],[8.432,7.621]],"o":[[-7.228,3.052],[11.966,8.056],[9.406,6.248],[-19.319,-6.253],[-9.437,-8.53]],"v":[[326.479,-355.408],[332.703,-337.094],[381.356,-316.88],[385.461,-332.541],[345.28,-348.584]]}],"t":43.549},{"e":[{"c":true,"i":[[-0.536,-1.572],[-3.113,0.999],[-3.212,1.593],[1.299,0.115],[1.688,-1.035]],"o":[[0.699,2.048],[1.594,-0.511],[2.799,-1.388],[-3.076,-0.273],[-2.696,1.652]],"v":[[296.62,-347.231],[301.407,-345.869],[305.998,-349.185],[306.733,-352.77],[299.423,-351.803]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.085,-2.593],[-7.2,0.179],[-7.392,-1.934],[1.588,4.551],[9.608,1.982]],"o":[[-2.621,6.265],[12.072,-0.3],[6.079,1.591],[-2.552,-7.31],[-10.783,-2.224]],"v":[[305.392,-348.662],[316.542,-342.354],[337.821,-336.969],[345.879,-341.41],[326.727,-352.967]]}],"t":48.387},{"t":53.2265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[357.286,-335.878]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":42.742},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":43.549},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":53.227},{"t":54.033203125}]},"p":{"a":0,"ix":2,"k":[298.375,20.281]},"r":{"a":0,"ix":6,"k":-112},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-15.718,-11.808],[-110.853,29.695],[-69.097,16.681],[-31.437,-38.337],[-13.834,-32.537],[17.145,-31.611],[52.916,-11.439]],"o":[[10.618,7.977],[54.353,-14.56],[83.852,-20.243],[48.953,59.697],[30.413,71.53],[-21.288,39.249],[-13.519,2.922]],"v":[[-151.067,-71.884],[-73.667,-179.774],[72.148,-283.257],[251.047,-259.697],[271.587,-153.53],[292.804,53.08],[137.92,149.235]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[3.81,32.334],[-37.912,24.295],[-60.961,4.723],[-28.674,-27.507],[-4.719,-44.918],[17.132,-35.418],[38.689,-10.071]],"o":[[-5.87,-49.813],[30.369,-19.461],[71.33,-5.527],[42.049,40.338],[5.026,47.841],[-14.872,30.746],[-13.327,3.469]],"v":[[-152.648,-71.897],[-68.844,-183.778],[89.56,-289.113],[249.899,-265.495],[274.719,-157.082],[291.508,54.754],[141.199,150.134]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[5.886,32.021],[-48.758,34.583],[-77.872,27.27],[-49.259,-48.008],[-4.511,-39.569],[28.818,-50.831],[56.767,-19.398]],"o":[[-12.5,-68],[41.263,-29.267],[73.631,-25.785],[25.574,24.924],[4.722,41.424],[-22.003,38.811],[-17.993,6.149]],"v":[[-157.5,-70],[-69.87,-176.215],[70.372,-273.27],[248.534,-273.339],[275.511,-149.431],[293.182,51.831],[136.634,147.529]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":26.863},{"t":53.7265625}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":11.68},{"t":38.54296875}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":10}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":14,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[0,-63,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[0,1,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[115],"t":16.129},{"t":51.61328125}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[122,122,100],"t":16.129},{"t":37.90234375}]}},"nm":"Shape Layer 5","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-7.106,-6.258],[-19.353,-3.869],[7.891,3.257],[5.346,-0.525]],"o":[[9.134,8.045],[12.475,2.494],[-7.897,-3.259],[-5.346,0.525]],"v":[[274.032,-55.095],[304.612,-50.784],[314.013,-66.934],[292.335,-69.588]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-10.261,-11.263],[-30.338,9.388],[13.659,-1.454],[7.976,-3.33]],"o":[[11.756,12.904],[19.557,-6.052],[-13.669,1.455],[-7.976,3.33]],"v":[[208.744,-31.404],[266.443,-47.143],[266.495,-72.184],[230.562,-58.335]]}],"t":53.227},{"e":[{"c":true,"i":[[-2.784,-3.375],[-3.362,-1.186],[4.594,3.521],[3.593,0.597]],"o":[[5.252,6.366],[8.135,2.87],[-4.597,-3.524],[-3.593,-0.597]],"v":[[331.516,-54.519],[338.459,-48.273],[344.534,-55.195],[340.927,-57.113]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.106,-6.258],[-19.353,-3.869],[7.891,3.257],[5.346,-0.525]],"o":[[9.134,8.045],[12.475,2.494],[-7.897,-3.259],[-5.346,0.525]],"v":[[274.032,-55.095],[304.612,-50.784],[314.013,-66.934],[292.335,-69.588]]}],"t":56.619},{"t":60.12109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":51.947},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":53.113},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":60.121},{"t":61.291015625}]},"p":{"a":0,"ix":2,"k":[-154,-177]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[8.653,4.412],[-11.948,-10.523],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-11.339,-5.781],[9.171,8.077],[4.565,9.006]],"v":[[390.943,2.407],[389.833,-16.181],[372.097,-35.412],[363.579,-28.577],[376.058,-6.258]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.703,8.481],[4.983,6.127],[9.462,2.367],[-17.377,-7.771],[-12.209,-16.935]],"o":[[5.007,-5.512],[-12.952,-15.923],[-14.762,-3.692],[14.203,6.352],[7.574,10.506]],"v":[[387.993,-7.418],[381.373,-32.728],[336.86,-64.37],[322.797,-44.352],[366.426,-12.506]]}],"t":52.42},{"e":[{"c":true,"i":[[-1.222,1.308],[1.206,4.426],[1.981,1.978],[-4.619,-6.053],[-3.512,-10.237]],"o":[[2.952,-3.161],[-2.141,-7.86],[-3.192,-3.186],[2.028,2.657],[2.275,6.632]],"v":[[393.913,7.789],[396.614,-0.432],[386.034,-15.348],[380.119,-10.602],[385.312,3.161]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[8.653,4.412],[-11.948,-10.523],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-11.339,-5.781],[9.171,8.077],[4.565,9.006]],"v":[[390.943,2.407],[389.833,-16.181],[372.097,-35.412],[363.579,-28.577],[376.058,-6.258]]}],"t":55.924},{"e":[{"c":true,"i":[[-0.886,0.471],[-0.13,1.044],[1.111,1.109],[-0.518,-2.792],[-3.024,-5.259]],"o":[[1.579,-0.84],[0.246,-1.975],[-1.789,-1.786],[0.341,1.842],[0.561,0.976]],"v":[[394.302,8.896],[395.719,6.526],[393.778,1.863],[389.586,3.258],[391.524,8.248]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.222,1.308],[1.206,4.426],[1.981,1.978],[-4.619,-6.053],[-3.512,-10.237]],"o":[[2.952,-3.161],[-2.141,-7.86],[-3.192,-3.186],[2.028,2.657],[2.275,6.632]],"v":[[393.913,7.789],[396.614,-0.432],[386.034,-15.348],[380.119,-10.602],[385.312,3.161]]}],"t":58.26},{"t":62.931640625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":51.252},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":52.42},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":62.932},{"t":64.099609375}]},"p":{"a":0,"ix":2,"k":[-161,-181]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-7.732,4.067],[3.042,7.746],[0.005,10.277],[-0.539,-20.051],[-9.865,-24.335]],"o":[[7.054,-3.711],[-6.426,-16.363],[-0.009,-17.469],[0.416,15.456],[4.779,11.789]],"v":[[423.143,176.84],[427.81,161.233],[413.218,124.084],[393.932,116.063],[403.124,162.008]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.793,0.635],[-2.591,7.908],[-0.543,12.547],[-0.539,-20.051],[2.644,-8.677]],"o":[[9.471,-0.436],[7.553,-23.05],[0.613,-14.179],[0.416,15.456],[-4.252,13.954]],"v":[[396.137,108.769],[412.71,88.163],[421.793,32.708],[400.087,44.503],[391.337,87.772]]}],"t":51.613},{"e":[{"c":true,"i":[[-1.936,1.463],[3.818,4.909],[3.004,6.682],[4.199,-14.388],[-3.119,-3.467]],"o":[[4.677,-3.535],[-7.896,-10.153],[-3.357,-7.466],[-3.237,11.091],[6.358,7.067]],"v":[[444.226,208.388],[442.495,197.074],[427.147,181.047],[416.131,173.306],[429.906,206.921]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.732,4.067],[3.042,7.746],[0.005,10.277],[-0.539,-20.051],[-9.865,-24.335]],"o":[[7.054,-3.711],[-6.426,-16.363],[-0.009,-17.469],[0.416,15.456],[4.779,11.789]],"v":[[423.143,176.84],[427.81,161.233],[413.218,124.084],[393.932,116.063],[403.124,162.008]]}],"t":56.451},{"e":[{"c":true,"i":[[-0.627,3.991],[2.948,1.173],[2.948,2.281],[0.289,-5.765],[-3.685,-2.287]],"o":[[0.847,-5.388],[-2.405,-0.957],[-1.491,-1.154],[-0.256,5.111],[3.202,1.988]],"v":[[470.684,231.038],[466.901,225.56],[462.591,221.28],[456.214,226.198],[462.163,232.694]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.936,1.463],[3.818,4.909],[3.004,6.682],[4.199,-14.388],[-3.119,-3.467]],"o":[[4.677,-3.535],[-7.896,-10.153],[-3.357,-7.466],[-3.237,11.091],[6.358,7.067]],"v":[[444.226,208.388],[442.495,197.074],[427.147,181.047],[416.131,173.306],[429.906,206.921]]}],"t":62.902},{"t":68.9921875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[404.213,73.056]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":50.305},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":51.475},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":68.992},{"t":70.162109375}]},"p":{"a":0,"ix":2,"k":[271.213,-71.58]},"r":{"a":0,"ix":6,"k":-47},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[3.525,3.745],[0.197,-12.283],[-2.566,2.068],[0.177,6.641]],"o":[[-7.924,-8.418],[-0.159,9.887],[6.605,-5.324],[-0.187,-7.009]],"v":[[328.406,207.34],[312.226,228.796],[325.289,242.279],[331.346,224.065]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[9.055,6.442],[9.961,-17.416],[-8.692,7.913],[-11.235,9.332]],"o":[[-11.197,-7.967],[-7.42,12.974],[7.127,-6.488],[5.9,-4.901]],"v":[[352.51,160.995],[310.164,199.677],[323.183,214.358],[347.728,187.186]]}],"t":50.807},{"e":[{"c":true,"i":[[2.833,0.782],[0.049,-3.082],[-0.773,-0.294],[-0.781,1.473]],"o":[[-2.796,-0.772],[-0.04,2.481],[0.773,0.294],[0.781,-1.473]],"v":[[317.816,242.457],[313.756,247.84],[317.689,249.49],[319.792,246.74]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.525,3.745],[0.197,-12.283],[-2.566,2.068],[0.177,6.641]],"o":[[-7.924,-8.418],[-0.159,9.887],[6.605,-5.324],[-0.187,-7.009]],"v":[[328.406,207.34],[312.226,228.796],[325.289,242.279],[331.346,224.065]]}],"t":54.838},{"t":60.123046875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[334.533,186.047]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":50},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":50.779},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":60.123},{"t":61.291015625}]},"p":{"a":0,"ix":2,"k":[301.311,-1.891]},"r":{"a":0,"ix":6,"k":-49},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.337,-2.255],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[4.856,4.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[313.144,277.314],[323.852,271.667],[319.523,242.63],[311.113,230.488],[307.709,269.07]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[-0.067,6.605],[3.054,7.565],[10.791,-8.694],[0.224,-4.011]],"o":[[5.497,2.929],[0.118,-11.643],[-2.98,-7.381],[-8.846,7.127],[-0.871,15.608]],"v":[[314.598,259.571],[323.692,245.239],[321.98,196.381],[296.209,196.694],[304.871,243.392]]}],"t":48.387},{"e":[{"c":true,"i":[[-2.784,1.882],[3.278,5.65],[4.875,4.344],[5.106,-7.053],[-5.122,-3.792]],"o":[[3.297,-2.23],[-1.921,-3.312],[-3.039,-2.707],[-6.082,8.4],[5.863,4.34]],"v":[[330.193,290.216],[331.159,278.271],[321.125,272.156],[311.793,264.686],[317.622,286.792]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.337,-2.255],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[4.856,4.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[313.144,277.314],[323.852,271.667],[319.523,242.63],[311.113,230.488],[307.709,269.07]]}],"t":53.059},{"e":[{"c":true,"i":[[-2.193,-0.398],[-1.633,1.625],[1.49,0.732],[1.104,0.616],[-2.243,-2.497]],"o":[[2.866,0.521],[1.8,-1.792],[-2.422,-1.19],[-2.874,-1.603],[1.691,1.882]],"v":[[337.768,292.215],[341.598,292.115],[341.967,287.509],[337.83,285.396],[334.993,289.595]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.784,1.882],[3.278,5.65],[4.875,4.344],[5.106,-7.053],[-5.122,-3.792]],"o":[[3.297,-2.23],[-1.921,-3.312],[-3.039,-2.707],[-6.082,8.4],[5.863,4.34]],"v":[[330.193,290.216],[331.159,278.271],[321.125,272.156],[311.793,264.686],[317.622,286.792]]}],"t":57.73},{"t":62.40234375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[310.299,226.027]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":47.58},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":48.387},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":62.402},{"t":63.5703125}]},"p":{"a":0,"ix":2,"k":[197.299,147.027]},"r":{"a":0,"ix":6,"k":84},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-5.863,-6.912],[-6.034,7.346],[5.062,0.736],[4.712,-2.057]],"o":[[6.432,7.583],[4.857,-5.913],[-2.524,-0.367],[-4.712,2.057]],"v":[[144.608,394.334],[175.766,387.545],[169.188,379.014],[149.13,380.929]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.863,-6.912],[-6.034,7.346],[5.312,-0.514],[4.12,-3.429]],"o":[[6.432,7.583],[4.857,-5.913],[-2.539,0.246],[-3.951,3.289]],"v":[[170.108,388.834],[193.266,376.795],[186.938,365.264],[171.13,371.429]]}],"t":46.773},{"e":[{"c":true,"i":[[-1.749,-2.192],[-3.165,2.925],[2.295,0.333],[2.23,-0.677]],"o":[[0.462,0.578],[1.126,-1.041],[-1.144,-0.166],[-0.852,0.259]],"v":[[116.499,391.697],[122.124,391.566],[120.615,389.285],[117.416,388.113]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.863,-6.912],[-6.034,7.346],[5.062,0.736],[4.712,-2.057]],"o":[[6.432,7.583],[4.857,-5.913],[-2.524,-0.367],[-4.712,2.057]],"v":[[144.608,394.334],[175.766,387.545],[169.188,379.014],[149.13,380.929]]}],"t":52.67},{"t":58.5078125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[179.853,376.812]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":45.662},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":46.83},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":58.508},{"t":59.677734375}]},"p":{"a":0,"ix":2,"k":[104.853,154.812]},"r":{"a":0,"ix":6,"k":31},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-0.664,-3.179],[-0.686,10.48],[0.693,14.372],[2.402,-11.211],[1.871,-8.886]],"o":[[1.604,7.681],[0.998,-15.252],[-0.196,-4.065],[-1.349,6.295],[-2.621,12.448]],"v":[[191.927,378.89],[206.672,377.602],[205.567,334.993],[194.441,338.289],[191.468,353.466]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.721,-3.167],[-0.992,8.262],[-2.952,13.171],[2.926,-11.086],[0.442,-9.063]],"o":[[1.742,7.65],[1.816,-15.128],[0.89,-3.971],[-2.597,9.838],[-0.619,12.706]],"v":[[197.421,355.676],[208.618,352.159],[213.768,307.566],[199.584,309.087],[194.949,333.275]]}],"t":45.967},{"e":[{"c":true,"i":[[-1.959,-1.143],[1.762,4.669],[-0.707,8.692],[1.735,-5.805],[-2.148,-2.498]],"o":[[5.594,3.264],[-2.913,-7.718],[0.353,-4.338],[-2.357,7.887],[1.737,1.85]],"v":[[203.799,406.417],[212.197,400.386],[202.76,377.508],[196.606,377.88],[199.916,402.113]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.664,-3.179],[-0.686,10.48],[0.693,14.372],[2.402,-11.211],[1.871,-8.886]],"o":[[1.604,7.681],[0.998,-15.252],[-0.196,-4.065],[-1.349,6.295],[-2.621,12.448]],"v":[[191.927,378.89],[206.672,377.602],[205.567,334.993],[194.441,338.289],[191.468,353.466]]}],"t":51.613},{"e":[{"c":true,"i":[[-0.872,-0.385],[1.171,2.143],[2.49,-0.113],[-0.428,-2.176],[-1.187,-0.594]],"o":[[2.107,0.931],[-1.081,-1.978],[-1.692,0.077],[0.225,1.145],[0.864,0.432]],"v":[[210.857,414.203],[213.072,410.465],[208.767,406.285],[206.684,409.748],[208.832,413.117]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.959,-1.143],[1.762,4.669],[-0.707,8.692],[1.735,-5.805],[-2.148,-2.498]],"o":[[5.594,3.264],[-2.913,-7.718],[0.353,-4.338],[-2.357,7.887],[1.737,1.85]],"v":[[203.799,406.417],[212.197,400.386],[202.76,377.508],[196.606,377.88],[199.916,402.113]]}],"t":57.258},{"t":61.291015625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[201.186,347.654]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":45.162},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.967},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":61.291},{"t":62.09765625}]},"p":{"a":0,"ix":2,"k":[41.186,165.654]},"r":{"a":0,"ix":6,"k":68},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-17.442,9.07],[-45.407,24.545],[-67.999,-45],[-46.425,-39.176],[24.284,-37.946],[19.131,-3.317],[16.851,-7.636],[22.338,24.372]],"o":[[50,-26],[55.5,-30],[47.064,31.145],[28.534,24.079],[-38.125,59.574],[-48.655,8.437],[-16.851,7.636],[-22.338,-24.372]],"v":[[-70,-168],[37.5,-189],[193,-226],[274.625,-74.287],[287,104],[96.104,154.527],[-65.51,204.464],[-199.186,161.156]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[7.321,31.724],[-20.78,18.471],[-46.284,-46.673],[-33.945,-31.892],[29.336,-29.625],[49.431,6.815],[14.746,-2.969],[16.646,22.348]],"o":[[-4.5,-19.5],[54,-48],[59.5,60],[50.752,47.682],[-34.344,34.683],[-49.431,-6.815],[-39.238,7.9],[-16.646,-22.348]],"v":[[-83.5,-166.5],[32,-198],[195.5,-213.5],[250.82,-92.388],[292,97.5],[94.587,154.973],[-65.432,208.271],[-203.524,155.572]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-32.033,5.824],[-10.696,26.586],[-58.097,-32.713],[-39.01,-52.929],[60.246,-75.012],[39.072,-1.851],[15.451,-2.501],[20.9,22.982]],"o":[[16.5,-3],[9.127,-22.687],[45.286,25.5],[30.172,40.938],[-51,63.5],[-30.07,1.424],[-35.801,5.794],[-20.9,-22.982]],"v":[[-82.5,-164],[35.5,-197],[197,-217],[268.53,-66.797],[283,108.5],[94.087,154.955],[-66.421,204.876],[-207.839,151.402]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":31.535},{"t":54.89453125}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":17.52},{"t":40.87890625}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":12}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":15,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[450,400,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[450,400,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"White Solid 2","op":794,"sc":"#ffffff","sh":800,"sr":1,"st":0,"sw":900,"ty":1}],"markers":[],"nm":"YTK Logo Bump Drawn v5","op":181,"v":"5.3.4","w":900}
\ No newline at end of file
+{"assets":[],"ddd":0,"fr":60,"h":800,"ip":0,"layers":[{"ao":0,"bm":0,"ddd":0,"ind":1,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[0,0,0]},"o":{"a":0,"ix":11,"k":0},"p":{"a":0,"ix":2,"k":[450,400,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":1,"ix":6,"k":[{"e":[90.314,90.314,100],"i":{"x":[0.644,0.644,0.833],"y":[1.071,1.071,1]},"n":["0p644_1p071_0p168_0p602","0p644_1p071_0p168_0p602","0p833_1_0p167_0"],"o":{"x":[0.168,0.168,0.167],"y":[0.602,0.602,0]},"s":[100,100,100],"t":60},{"e":[104.536,104.536,100],"i":{"x":[0.565,0.565,0.75],"y":[0.913,0.913,1]},"n":["0p565_0p913_0p443_0p07","0p565_0p913_0p443_0p07","0p75_1_0p313_0"],"o":{"x":[0.443,0.443,0.313],"y":[0.07,0.07,0]},"s":[90.314,90.314,100],"t":74},{"e":[97.517,97.517,100],"i":{"x":[0.583,0.583,0.75],"y":[0.95,0.95,1]},"n":["0p583_0p95_0p36_-0p167","0p583_0p95_0p36_-0p167","0p75_1_0p167_0"],"o":{"x":[0.36,0.36,0.167],"y":[-0.167,-0.167,0]},"s":[104.536,104.536,100],"t":90.334},{"e":[100,100,100],"i":{"x":[0.41,0.41,0.833],"y":[1,1,1]},"n":["0p41_1_0p345_-0p133","0p41_1_0p345_-0p133","0p833_1_0p167_0"],"o":{"x":[0.345,0.345,0.167],"y":[-0.133,-0.133,0]},"s":[97.517,97.517,100],"t":109},{"t":130}]}},"nm":"Null 5","op":794,"sr":1,"st":0,"ty":3},{"ao":0,"bm":0,"ddd":0,"ind":2,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[-55.427,-3.31,0]},"o":{"a":0,"ix":11,"k":100},"p":{"s":true,"x":{"a":0,"ix":3,"k":12.573},"y":{"a":0,"ix":4,"k":-4.31}},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"logo 2","op":77,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[3.269,-2.699],[11.728,-7.575],[3.91,-1.71],[2.362,12.462],[0.891,6.298],[0.935,5.344],[0.196,0.685],[-7.532,-2.115],[-14.661,-5.294],[-0.548,-0.22],[1.882,-1.558]],"o":[[-8.878,7.33],[-6.114,3.949],[-2.98,1.304],[-1.526,-8.052],[-0.252,-1.785],[-0.214,-1.222],[-0.977,-3.421],[10.998,3.088],[13.081,4.724],[2.444,0.976],[-7.086,5.864]],"v":[[-19.954,7.456],[-70.218,43.014],[-87.507,54.154],[-92.801,32.407],[-99.643,-16.461],[-102.494,-38.045],[-103.471,-43.258],[-91.58,-41.954],[-51.038,-27.617],[-8.249,-12.35],[0.435,-7.006]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.269,-2.699],[11.728,-7.575],[7.73,2.568],[2.362,12.462],[0.891,6.298],[0.935,5.344],[-2.77,4.114],[-10.821,-0.352],[-13.732,-7.376],[-4.859,-2.502],[-0.133,-2.44]],"o":[[-8.878,7.33],[-6.114,3.949],[-3.087,-1.025],[-1.526,-8.052],[-0.252,-1.785],[-0.214,-1.222],[3.936,-5.845],[8.204,0.267],[16.024,8.607],[8.662,4.46],[0.675,12.422]],"v":[[-20.042,19.432],[-66.66,49.812],[-83.142,54.307],[-100.622,31.626],[-110.605,-13.055],[-110.541,-25.505],[-110.309,-40.383],[-92.674,-52.038],[-53.267,-40.8],[-13.254,-20.92],[2.317,-2.15]]}],"t":40.322},{"t":62.09765625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[3.269,-2.699],[11.728,-7.575],[3.91,-1.71],[2.362,12.462],[0.891,6.298],[0.935,5.344],[0.196,0.685],[-7.532,-2.115],[-14.661,-5.294],[-0.548,-0.22],[1.882,-1.558]],"o":[[-8.878,7.33],[-6.114,3.949],[-2.98,1.304],[-1.526,-8.052],[-0.252,-1.785],[-0.214,-1.222],[-0.977,-3.421],[10.998,3.088],[13.081,4.724],[2.444,0.976],[-7.086,5.864]],"v":[[-19.954,7.456],[-70.218,43.014],[-87.507,54.154],[-92.801,32.407],[-99.643,-16.461],[-102.494,-38.045],[-103.471,-43.258],[-91.58,-41.954],[-51.038,-27.617],[-8.249,-12.35],[0.435,-7.006]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.502,-8.233],[18.153,-11.851],[4.093,0.399],[2.362,12.462],[2.659,14.953],[3.273,9.178],[-6.936,4.182],[-7.532,-2.115],[-14.661,-5.294],[-10.786,-3.588],[-4.452,-5.876]],"o":[[-8.271,8.009],[-6.094,3.979],[-3.238,-0.316],[-1.526,-8.052],[-2.659,-14.953],[-1.996,-5.597],[5.667,-3.416],[10.998,3.088],[13.081,4.724],[12.999,4.324],[5.555,7.331]],"v":[[-22.677,24.708],[-61.809,47.252],[-76.375,54.876],[-99.506,41.478],[-106.845,6.036],[-110.435,-19.767],[-108.993,-45.253],[-88.812,-54.248],[-56.223,-43.346],[-23.019,-29.185],[5.606,-5.041]]}],"t":40.322},{"t":62.09765625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[3.269,-2.699],[11.728,-7.575],[3.91,-1.71],[2.362,12.462],[0.891,6.298],[0.935,5.344],[0.196,0.685],[-7.532,-2.115],[-14.661,-5.294],[-0.548,-0.22],[1.882,-1.558]],"o":[[-8.878,7.33],[-6.114,3.949],[-2.98,1.304],[-1.526,-8.052],[-0.252,-1.785],[-0.214,-1.222],[-0.977,-3.421],[10.998,3.088],[13.081,4.724],[2.444,0.976],[-7.086,5.864]],"v":[[-19.954,7.456],[-70.218,43.014],[-87.507,54.154],[-92.801,32.407],[-99.643,-16.461],[-102.494,-38.045],[-103.471,-43.258],[-91.58,-41.954],[-51.038,-27.617],[-8.249,-12.35],[0.435,-7.006]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.125,-8.386],[20.489,-7.4],[6.842,2.815],[5.392,12.432],[3.345,15.71],[0.858,9.371],[-6.936,4.182],[-7.532,-2.115],[-14.661,-5.294],[-9.337,-6.482],[-1.511,-8.904]],"o":[[-9.469,6.549],[-6.845,2.472],[-3.008,-1.238],[-4.226,-9.745],[-2.745,-12.892],[-0.648,-7.082],[5.667,-3.416],[10.998,3.088],[13.081,4.724],[10.991,7.63],[2.229,13.136]],"v":[[-21.182,25.528],[-65.108,52.487],[-85.645,57.105],[-99.311,36.5],[-110.414,3.372],[-114.205,-25.134],[-105.755,-49.722],[-84.247,-54.354],[-52.911,-45.114],[-19.078,-27.014],[0.932,-6.923]]}],"t":40.322},{"t":62.09765625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"e":{"a":0,"ix":2,"k":0},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":1,"ix":3,"k":[{"e":[-358],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[5],"t":40.322},{"t":62.09765625}]},"s":{"a":1,"ix":1,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":40.322},{"t":62.09765625}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"lc":2,"lj":1,"ml":10,"ml2":{"a":0,"ix":8,"k":10},"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":13}},{"a":{"a":0,"ix":1,"k":[-52.527,0.805]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":39.516},{"t":40.322265625}]},"p":{"a":1,"ix":2,"k":[{"e":[-53.264,1.523],"i":{"x":0.25,"y":1},"n":"0p25_1_0p333_0","o":{"x":0.333,"y":0},"s":[-73.527,0.621],"t":40.322,"ti":[-3.37727856636047,-0.150390625],"to":[3.37727856636047,0.150390625]},{"t":62.09765625}]},"r":{"a":1,"ix":6,"k":[{"e":[0],"i":{"x":[0.25],"y":[1]},"n":["0p25_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[125],"t":40.322},{"t":62}]},"s":{"a":1,"ix":3,"k":[{"e":[95,95],"i":{"x":[0.25,0.25],"y":[1,1]},"n":["0p25_1_0p333_0","0p25_1_0p333_0"],"o":{"x":[0.333,0.333],"y":[0,0]},"s":[551,551],"t":40.322},{"t":62.09765625}]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"logo play outline 5","np":5,"ty":"gr"},{"a":{"a":0,"ix":1,"k":[-63.528,3.54]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[-63.528,3.54]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"logo 1","np":1,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":3,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[4,-65,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[4,-1,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[150],"t":16.936},{"t":74.193359375}]},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"Shape Layer 9","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-6.888,-1.034],[-5.036,6.058],[5.18,-3.551],[3.786,-1.13]],"o":[[7.985,1.199],[5.983,-7.197],[-5.183,3.553],[-8.695,2.595]],"v":[[85.762,-6.982],[111.589,-17.862],[104.009,-29.738],[93.608,-17.684]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.491,-7.081],[-30.966,7.045],[13.73,-0.407],[8.207,-2.711]],"o":[[15.358,8.06],[19.962,-4.541],[-13.74,0.407],[-8.207,2.711]],"v":[[18.642,30.94],[70.374,17.651],[75.878,-7.444],[39.26,4.727]]}],"t":52.42},{"e":[{"c":true,"i":[[0.148,-2.047],[-1.234,1.389],[2.312,-1.938],[-0.04,-1.898]],"o":[[-0.183,2.525],[2.986,-3.362],[-1.268,1.063],[0.038,1.779]],"v":[[108.335,-24.141],[112.716,-26.264],[110.65,-31.377],[109.478,-27.98]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-6.888,-1.034],[-5.036,6.058],[5.18,-3.551],[3.786,-1.13]],"o":[[7.985,1.199],[5.983,-7.197],[-5.183,3.553],[-8.695,2.595]],"v":[[85.762,-6.982],[111.589,-17.862],[104.009,-29.738],[93.608,-17.684]]}],"t":55.645},{"t":59.677734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[242.859,-52.375]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":51.252},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":52.42},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.566},{"t":60.734375}]},"p":{"a":0,"ix":2,"k":[88.859,-229.375]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[7.177,6.544],[-8.738,-13.309],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-9.405,-8.575],[6.707,10.215],[4.565,9.006]],"v":[[401.129,15.626],[400.019,-2.962],[382.828,-20.875],[372.805,-16.537],[386.244,6.961]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.703,8.481],[4.983,6.127],[12.068,6.226],[-14.285,-12.581],[-12.849,-16.454]],"o":[[5.007,-5.512],[-12.952,-15.923],[-13.523,-6.976],[10.964,9.656],[8.692,11.131]],"v":[[387.993,-7.418],[383.362,-26.673],[341.474,-60.529],[327.67,-49.276],[366.851,-16.461]]}],"t":48.248},{"e":[{"c":true,"i":[[-0.993,1.489],[1.909,4.171],[2.276,1.629],[-5.541,-5.222],[-5.129,-9.53]],"o":[[2.399,-3.598],[-3.39,-7.407],[-3.667,-2.625],[2.433,2.293],[3.323,6.174]],"v":[[410.755,26.976],[412.085,18.426],[399.222,5.427],[394.157,11.071],[401.517,23.807]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[7.177,6.544],[-8.738,-13.309],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-9.405,-8.575],[6.707,10.215],[4.565,9.006]],"v":[[401.129,15.626],[400.019,-2.962],[382.828,-20.875],[372.805,-16.537],[386.244,6.961]]}],"t":51.252},{"e":[{"c":true,"i":[[-0.763,0.687],[0.18,1.155],[1.359,0.876],[-1.28,-2.687],[-4.111,-4.715]],"o":[[1.39,-1.252],[-0.339,-2.167],[-2.19,-1.41],[0.788,1.738],[0.894,1.025]],"v":[[428.895,47.993],[429.758,45.148],[426.433,40.728],[422.604,43.105],[425.772,47.866]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.993,1.489],[1.909,4.171],[2.276,1.629],[-5.541,-5.222],[-5.129,-9.53]],"o":[[2.399,-3.598],[-3.39,-7.407],[-3.667,-2.625],[2.433,2.293],[3.323,6.174]],"v":[[410.755,26.976],[412.085,18.426],[399.222,5.427],[394.157,11.071],[401.517,23.807]]}],"t":54.479},{"t":58.509765625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[365.484,-29.633]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":47.221},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":48.387},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":58.51},{"t":59.677734375}]},"p":{"a":0,"ix":2,"k":[200.484,-121.633]},"r":{"a":0,"ix":6,"k":29},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-8.917,2.196],[3.207,6.958],[-0.844,10.734],[4.459,-19.392],[-2.119,-7.876]],"o":[[7.833,-2.141],[-4.918,-10.119],[-0.503,-16.492],[-3.761,16.118],[3.666,11.898]],"v":[[408.596,154.877],[412.745,139.088],[405.995,115.788],[392.444,111.262],[392.729,141.753]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.751,1.764],[-2.424,7.903],[-1.784,10.117],[3.062,-19.823],[1.437,-9.478]],"o":[[9.229,-1.86],[7.139,-22.852],[2.052,-11.633],[-2.826,18.292],[-1.437,9.478]],"v":[[399.835,114.727],[409.4,88.963],[419.255,58.246],[399.474,62.446],[388.936,99.323]]}],"t":47.58},{"e":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[4.02,8.942],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-4.492,-9.991],[-4.331,14.842],[8.508,9.457]],"v":[[446.471,206.015],[444.156,190.874],[423.616,169.427],[408.875,159.068],[427.309,204.052]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.917,2.196],[3.207,6.958],[-0.844,10.734],[4.459,-19.392],[-2.119,-7.876]],"o":[[7.833,-2.141],[-4.918,-10.119],[-0.503,-16.492],[-3.761,16.118],[3.666,11.898]],"v":[[408.596,154.877],[412.745,139.088],[405.995,115.788],[392.444,111.262],[392.729,141.753]]}],"t":52.42},{"e":[{"c":true,"i":[[-0.01,4.04],[3.092,0.708],[3.262,1.803],[-0.596,-5.742],[-3.992,-1.697]],"o":[[0.013,-5.454],[-2.523,-0.578],[-1.65,-0.912],[0.528,5.09],[3.469,1.475]],"v":[[471.142,229.879],[466.566,225.043],[461.652,221.472],[456.102,227.307],[462.974,232.818]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[4.02,8.942],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-4.492,-9.991],[-4.331,14.842],[8.508,9.457]],"v":[[446.471,206.015],[444.156,190.874],[423.616,169.427],[408.875,159.068],[427.309,204.052]]}],"t":59.26},{"t":64.654296875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[402.877,73.469]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":46.412},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.58},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":65.1},{"t":66.267578125}]},"p":{"a":0,"ix":2,"k":[207.867,-67.961]},"r":{"a":0,"ix":6,"k":-20},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[11.29,3.117],[0.197,-12.283],[-3.081,-1.171],[-3.113,5.869]],"o":[[-11.144,-3.077],[-0.159,9.887],[3.081,1.171],[3.113,-5.869]],"v":[[329.72,193.61],[313.54,215.066],[329.213,221.643],[337.598,210.68]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[7.995,10.819],[10.117,-17.436],[-3.55,-1.349],[-3.586,6.762]],"o":[[-12.838,-17.494],[-5.717,9.853],[3.549,1.349],[3.586,-6.762]],"v":[[352.151,161.509],[314.797,197.956],[325.389,210.461],[345.809,187.782]]}],"t":46.773},{"e":[{"c":true,"i":[[2.833,0.782],[0.049,-3.082],[-0.773,-0.294],[-0.781,1.473]],"o":[[-2.796,-0.772],[-0.04,2.481],[0.773,0.294],[0.781,-1.473]],"v":[[317.816,242.457],[313.756,247.84],[317.689,249.49],[319.792,246.74]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[11.29,3.117],[0.197,-12.283],[-3.081,-1.171],[-3.113,5.869]],"o":[[-11.144,-3.077],[-0.159,9.887],[3.081,1.171],[3.113,-5.869]],"v":[[329.72,193.61],[313.54,215.066],[329.213,221.643],[337.598,210.68]]}],"t":50.807},{"t":56.0625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[330.678,195.95]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":45.551},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":46.719},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":56.062},{"t":57.23046875}]},"p":{"a":0,"ix":2,"k":[141.52,80.707]},"r":{"a":0,"ix":6,"k":60},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.957,-1.342],[0.612,6.503],[4.065,10.522],[7.951,-6.908],[-2.512,-4.393]],"o":[[6.145,2.789],[-0.46,-4.89],[-1.467,-3.796],[-10.803,9.386],[3.621,6.333]],"v":[[337.702,278.815],[347.336,268.819],[332.095,243.999],[316.172,236.617],[328.291,272.461]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-6.299,1.799],[-0.469,6.534],[1.52,8.173],[3.406,-8.013],[-0.07,-4.265]],"o":[[6.299,-1.799],[0.402,-9.84],[-1.909,-6.473],[-3.406,8.013],[-0.304,13.4]],"v":[[314.217,264.219],[321.753,251.593],[313.307,209.217],[300.113,205.547],[305.614,250.119]]}],"t":45.967},{"e":[{"c":true,"i":[[-2.073,2.612],[4.494,2.543],[5.985,2.616],[1.571,-5.041],[-6.029,-1.983]],"o":[[2.466,-3.108],[-3.338,-1.889],[-3.711,-1.622],[-3.101,9.947],[6.918,2.275]],"v":[[356.925,279.698],[355.495,268.51],[342.563,265.246],[330.417,264.86],[343.974,280.417]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.957,-1.342],[0.612,6.503],[4.065,10.522],[7.951,-6.908],[-2.512,-4.393]],"o":[[6.145,2.789],[-0.46,-4.89],[-1.467,-3.796],[-10.803,9.386],[3.621,6.333]],"v":[[337.702,278.815],[347.336,268.819],[332.095,243.999],[316.172,236.617],[328.291,272.461]]}],"t":50.807},{"e":[{"c":true,"i":[[-2.09,1.074],[0.323,2.58],[2.378,0.334],[0.937,-1.676],[-3.779,-0.758]],"o":[[2.69,-1.352],[0.061,-2.472],[-2.862,-0.104],[-1.245,2.227],[2.121,0.425]],"v":[[360.895,277.772],[363.141,274.149],[359.535,270.209],[353.456,272.24],[355.594,278.428]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.073,2.612],[4.494,2.543],[5.985,2.616],[1.571,-5.041],[-6.029,-1.983]],"o":[[2.466,-3.108],[-3.338,-1.889],[-3.711,-1.622],[-3.101,9.947],[6.918,2.275]],"v":[[356.925,279.698],[355.495,268.51],[342.563,265.246],[330.417,264.86],[343.974,280.417]]}],"t":54.838},{"t":59.677734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[311.207,234.285]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":44.801},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.967},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.678},{"t":60.484375}]},"p":{"a":0,"ix":2,"k":[-24.793,-187.715]},"r":{"a":0,"ix":6,"k":-92},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-5.863,-6.912],[-6.034,7.346],[5.062,0.736],[4.712,-2.057]],"o":[[6.432,7.583],[4.857,-5.913],[-2.524,-0.367],[-4.712,2.057]],"v":[[144.608,394.334],[175.766,387.545],[169.188,379.014],[149.13,380.929]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.863,-6.912],[-6.034,7.346],[1.302,2.193],[4.712,-2.057]],"o":[[6.432,7.583],[4.857,-5.913],[-1.302,-2.193],[-4.712,2.057]],"v":[[170.108,388.834],[193.266,376.795],[186.938,365.264],[171.13,371.429]]}],"t":40.879},{"e":[{"c":true,"i":[[-1.749,-2.192],[-3.165,2.925],[2.295,0.333],[2.23,-0.677]],"o":[[0.462,0.578],[1.126,-1.041],[-1.144,-0.166],[-0.852,0.259]],"v":[[116.499,391.697],[122.124,391.566],[120.615,389.285],[117.416,388.113]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.863,-6.912],[-6.034,7.346],[5.062,0.736],[4.712,-2.057]],"o":[[6.432,7.583],[4.857,-5.913],[-2.524,-0.367],[-4.712,2.057]],"v":[[144.608,394.334],[175.766,387.545],[169.188,379.014],[149.13,380.929]]}],"t":46.719},{"t":52.55859375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[180.867,376.203]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":39.711},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":40.879},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":52.559},{"t":53.7265625}]},"p":{"a":0,"ix":2,"k":[-196.133,54.203]},"r":{"a":0,"ix":6,"k":90},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.291,-2.98],[-7.25,4.085],[5.654,8.583],[5.059,-10.289],[1.871,-8.886]],"o":[[-3.119,7.2],[12.7,-7.156],[-2.239,-3.399],[-6.315,12.843],[-2.621,12.448]],"v":[[177.733,375.065],[190.522,382.514],[211.268,337.566],[194.441,338.289],[188.129,352.386]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.721,-3.167],[-3.431,7.581],[5.654,8.583],[5.059,-10.289],[1.871,-8.886]],"o":[[1.742,7.65],[6.011,-13.28],[-2.239,-3.399],[-6.315,12.843],[-2.621,12.448]],"v":[[197.421,355.676],[212.139,354.121],[213.768,307.566],[196.941,308.289],[197.129,333.886]]}],"t":40.1},{"e":[{"c":true,"i":[[1.788,-1.432],[-5.868,0.123],[-2.518,5.434],[5.114,1.499],[2.58,-1.872]],"o":[[-4.319,3.46],[5.414,-0.113],[1.711,-3.692],[-2.691,-0.789],[-1.879,1.364]],"v":[[156.319,384.501],[161.836,393.363],[189.018,380.316],[183.941,372.039],[160.879,381.386]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.291,-2.98],[-7.25,4.085],[5.654,8.583],[5.059,-10.289],[1.871,-8.886]],"o":[[-3.119,7.2],[12.7,-7.156],[-2.239,-3.399],[-6.315,12.843],[-2.621,12.448]],"v":[[177.733,375.065],[190.522,382.514],[211.268,337.566],[194.441,338.289],[188.129,352.386]]}],"t":45.941},{"e":[{"c":true,"i":[[0.744,-0.596],[-2.442,0.051],[-1.048,2.261],[2.128,0.624],[1.074,-0.779]],"o":[[-1.797,1.44],[2.253,-0.047],[0.712,-1.537],[-1.12,-0.328],[-0.782,0.568]],"v":[[152.797,387.943],[155.093,391.631],[160.788,389.739],[158.675,386.294],[154.695,386.646]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.788,-1.432],[-5.868,0.123],[-2.518,5.434],[5.114,1.499],[2.58,-1.872]],"o":[[-4.319,3.46],[5.414,-0.113],[1.711,-3.692],[-2.691,-0.789],[-1.879,1.364]],"v":[[156.319,384.501],[161.836,393.363],[189.018,380.316],[183.941,372.039],[160.879,381.386]]}],"t":51.779},{"t":55.28515625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[206.104,331.532]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":38.934},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":40.1},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":55.285},{"t":56.451171875}]},"p":{"a":0,"ix":2,"k":[-152.656,92.957]},"r":{"a":0,"ix":6,"k":112},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":false,"i":[[-15,1.5],[-38.315,-17.37],[-0.928,-50.216],[37.712,-6.486],[51.829,-5.767],[6.015,29.791],[-3.621,45.539],[-56.949,14.763],[-50.194,12.034],[-38,-44],[-21,-57],[28.841,-34.61],[69.662,-3.195],[43.026,5.819],[12.296,65.237]],"o":[[15,-1.5],[38.315,17.37],[0.928,50.216],[-58.651,8.258],[-56.8,6.29],[-5.8,-28.554],[3.621,-45.539],[63.535,-16.365],[61.351,-14.708],[36.888,42.712],[12.907,35.034],[-25,30],[-49.329,2.263],[-84.727,-11.458],[-6.123,-32.489]],"v":[[-3,-189.5],[123.573,-191.621],[183,-28],[130.252,43.17],[-80.811,95.607],[-193.612,2.888],[-197.621,-94.461],[-86.592,-209.641],[36.435,-224.29],[180,-195],[221,-33],[199,66],[65.338,77.195],[-84.273,114.458],[-211.2,12.815]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-15,1.5],[-38.315,-17.37],[-0.928,-50.216],[37.712,-6.486],[51.829,-5.767],[6.015,29.791],[-3.621,45.539],[-56.949,14.763],[-50.194,12.034],[-38,-44],[-21,-57],[28.841,-34.61],[69.662,-3.195],[43.026,5.819],[12.296,65.237]],"o":[[15,-1.5],[38.315,17.37],[0.928,50.216],[-58.651,8.258],[-56.8,6.29],[-5.8,-28.554],[3.621,-45.539],[63.535,-16.365],[61.351,-14.708],[36.888,42.712],[12.907,35.034],[-25,30],[-49.329,2.263],[-84.727,-11.458],[-6.123,-32.489]],"v":[[-3,-189.5],[123.573,-191.621],[183,-28],[130.252,43.17],[-80.811,95.607],[-193.612,2.888],[-197.621,-94.461],[-86.592,-209.641],[36.435,-224.29],[180,-195],[221,-33],[206,54],[67.338,89.195],[-84.273,114.458],[-211.2,12.815]]}],"t":31.451},{"e":[{"c":false,"i":[[-15,1.5],[-37.578,-19.583],[-3,-44],[37.712,-6.486],[51.829,-5.767],[6.015,29.791],[3.794,40.79],[-56.949,14.763],[-50.194,12.034],[-38,-44],[-21,-57],[28.841,-34.61],[69.662,-3.195],[43.026,5.819],[12.296,65.237]],"o":[[15,-1.5],[37.578,19.583],[3,44],[-58.651,8.258],[-56.8,6.29],[-5.8,-28.554],[-2.589,-29.677],[63.535,-16.365],[61.351,-14.708],[36.888,42.712],[12.907,35.034],[-25,30],[-49.329,2.263],[-84.727,-11.458],[-6.123,-32.489]],"v":[[-3,-189.5],[123.573,-184.621],[166,-45],[114.252,37.17],[-70.811,67.607],[-143.612,8.888],[-158.621,-101.461],[-73.592,-173.641],[44.435,-197.29],[172,-174],[221,-33],[199,66],[65.338,77.195],[-84.273,114.458],[-211.2,12.815]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-15,1.5],[-38.315,-17.37],[-0.928,-50.216],[37.712,-6.486],[51.829,-5.767],[6.015,29.791],[-3.621,45.539],[-56.949,14.763],[-50.194,12.034],[-38,-44],[-21,-57],[28.841,-34.61],[69.662,-3.195],[43.026,5.819],[12.296,65.237]],"o":[[15,-1.5],[38.315,17.37],[0.928,50.216],[-58.651,8.258],[-56.8,6.29],[-5.8,-28.554],[3.621,-45.539],[63.535,-16.365],[61.351,-14.708],[36.888,42.712],[12.907,35.034],[-25,30],[-49.329,2.263],[-84.727,-11.458],[-6.123,-32.489]],"v":[[-3,-189.5],[123.573,-191.621],[183,-28],[130.252,43.17],[-80.811,95.607],[-193.612,2.888],[-197.621,-94.461],[-86.592,-209.641],[36.435,-224.29],[180,-195],[221,-33],[199,66],[65.338,77.195],[-84.273,114.458],[-211.2,12.815]]}],"t":33.064},{"t":50.806640625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":false,"i":[[-11.5,1.5],[-41,-23],[-3,-56],[13.087,-9.063],[51.205,-8.814],[23,9],[19.081,46.266],[-11.971,51.481],[-45.803,14.665],[-27.796,-0.619],[-45.79,-47.157],[-13.75,-44.5],[29.336,-29.626],[54.166,-5.683],[66.818,2.018],[5.047,27.405]],"o":[[11.5,-1.5],[25.845,14.499],[3,56],[-21.772,16.534],[-62.024,13.529],[-23,-9],[-10.971,-26.602],[9.881,-42.493],[48.898,-15.655],[62.153,1.384],[33.5,34.5],[20.558,66.533],[-34.344,34.683],[-49.626,5.207],[-66.339,-2.004],[-5.047,-27.405]],"v":[[0,-190],[138,-184],[185.417,-56],[148,46],[40.024,60.471],[-121.796,90.374],[-189.029,8.602],[-185.029,-120.481],[-82.898,-206.345],[59.847,-232.384],[178.5,-180.5],[209.25,-60.5],[189,59.5],[44.834,71.683],[-97.661,104.004],[-210.313,28.794]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-11.5,1.5],[-41,-23],[-3,-56],[13.087,-9.063],[51.205,-8.814],[23,9],[19.081,46.266],[-11.971,51.481],[-45.803,14.665],[-27.796,-0.619],[-45.79,-47.157],[-13.75,-44.5],[29.336,-29.626],[54.166,-5.683],[66.818,2.018],[5.047,27.405]],"o":[[11.5,-1.5],[25.845,14.499],[3,56],[-21.772,16.534],[-62.024,13.529],[-23,-9],[-10.971,-26.602],[9.881,-42.493],[48.898,-15.655],[62.153,1.384],[33.5,34.5],[20.558,66.533],[-34.344,34.683],[-49.626,5.207],[-66.339,-2.004],[-5.047,-27.405]],"v":[[0,-190],[138,-184],[185.417,-56],[148,46],[40.024,60.471],[-121.796,90.374],[-189.029,8.602],[-185.029,-120.481],[-82.898,-206.345],[59.847,-232.384],[178.5,-180.5],[209.25,-60.5],[189,59.5],[46.834,83.683],[-97.661,104.004],[-210.313,28.794]]}],"t":31.451},{"e":[{"c":false,"i":[[-11.5,1.5],[-41,-23],[-3,-56],[13.087,-9.063],[51.205,-8.814],[23,9],[5,22],[5.969,43.216],[-27.724,1.98],[-27.292,5.304],[-45.79,-47.157],[-13.75,-44.5],[29.336,-29.626],[54.166,-5.683],[66.818,2.018],[5.047,27.405]],"o":[[11.5,-1.5],[25.845,14.499],[3,56],[-21.772,16.534],[-63.325,10.796],[-23,-9],[-5,-22],[-5.969,-43.217],[0,0],[61.979,-12.046],[33.5,34.5],[20.558,66.533],[-34.344,34.683],[-49.626,5.207],[-66.339,-2.004],[-5.047,-27.405]],"v":[[0,-190],[130,-182],[165.417,-61],[147,23],[41.024,50.471],[-110.796,62.374],[-144.029,10.602],[-160.029,-98.481],[-73.898,-173.345],[43.847,-197.384],[176.5,-168.5],[209.25,-60.5],[189,59.5],[44.834,71.683],[-97.661,104.004],[-210.313,28.794]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-11.5,1.5],[-41,-23],[-3,-56],[13.087,-9.063],[51.205,-8.814],[23,9],[19.081,46.266],[-11.971,51.481],[-45.803,14.665],[-27.796,-0.619],[-45.79,-47.157],[-13.75,-44.5],[29.336,-29.626],[54.166,-5.683],[66.818,2.018],[5.047,27.405]],"o":[[11.5,-1.5],[25.845,14.499],[3,56],[-21.772,16.534],[-62.024,13.529],[-23,-9],[-10.971,-26.602],[9.881,-42.493],[48.898,-15.655],[62.153,1.384],[33.5,34.5],[20.558,66.533],[-34.344,34.683],[-49.626,5.207],[-66.339,-2.004],[-5.047,-27.405]],"v":[[0,-190],[138,-184],[185.417,-56],[148,46],[40.024,60.471],[-121.796,90.374],[-189.029,8.602],[-185.029,-120.481],[-82.898,-206.345],[59.847,-232.384],[178.5,-180.5],[209.25,-60.5],[189,59.5],[44.834,71.683],[-97.661,104.004],[-210.313,28.794]]}],"t":33.064},{"t":50.806640625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":false,"i":[[-39,4.5],[-36,-3.5],[-7.408,-63.209],[31.359,-3.447],[28.632,-5.363],[24,17],[3,36],[-5.427,20.845],[-16.145,4.473],[-36.409,8.115],[-37,-25],[-7.758,-65.292],[30,-16.5],[66.602,-15.948],[68.619,-4.96],[-18.161,27.854]],"o":[[39,-4.5],[49.358,4.799],[8.554,73.485],[-23.792,3.221],[-36.364,6.981],[-24,-17],[-3,-36],[7.619,-30.98],[22.471,-6.384],[53.482,-12.12],[50.51,34.128],[6,50.5],[-34.787,19.133],[-72.334,17.32],[-76.228,5.51],[16.967,-26.022]],"v":[[-2.5,-188.5],[120,-196],[182.432,-74.005],[142.903,44.752],[-29.985,76.262],[-139.01,86.019],[-195.66,-60.5],[-179.631,-121.131],[-110.5,-178.67],[45.376,-215.521],[170,-193],[212,-29.5],[195,70.5],[49.334,74.68],[-84.272,116.49],[-211.339,12.146]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-39,4.5],[-36,-3.5],[-7.408,-63.209],[31.359,-3.447],[28.632,-5.363],[24,17],[3,36],[-5.427,20.845],[-16.145,4.473],[-36.409,8.115],[-37,-25],[-7.758,-65.292],[30,-16.5],[66.602,-15.948],[68.619,-4.96],[-18.161,27.854]],"o":[[39,-4.5],[49.358,4.799],[8.554,73.485],[-23.792,3.221],[-36.364,6.981],[-24,-17],[-3,-36],[7.619,-30.98],[22.471,-6.384],[53.482,-12.12],[50.51,34.128],[6,50.5],[-34.787,19.133],[-72.334,17.32],[-76.228,5.51],[16.967,-26.022]],"v":[[-2.5,-188.5],[120,-196],[182.432,-74.005],[142.903,44.752],[-29.985,76.262],[-139.01,86.019],[-195.66,-60.5],[-179.631,-121.131],[-110.5,-178.67],[45.376,-215.521],[170,-193],[212,-29.5],[195,70.5],[51.334,86.68],[-84.272,116.49],[-211.339,12.146]]}],"t":31.451},{"e":[{"c":false,"i":[[-39,4.5],[-36,-3.5],[-7.408,-63.209],[31.359,-3.447],[28.632,-5.363],[24,17],[3,36],[-5.427,20.845],[-16.145,4.473],[-36.409,8.115],[-37,-25],[-7.758,-65.292],[30,-16.5],[66.602,-15.948],[68.619,-4.96],[8.582,29.856]],"o":[[39,-4.5],[49.358,4.799],[8.554,73.485],[-23.792,3.221],[-36.364,6.981],[-24,-17],[-3,-36],[7.619,-30.98],[22.471,-6.384],[53.482,-12.12],[50.51,34.128],[6,50.5],[-34.787,19.133],[-72.334,17.32],[-76.228,5.51],[-8.582,-29.856]],"v":[[-2.5,-188.5],[94,-191],[166.432,-76.005],[119.903,36.752],[-15.985,60.262],[-120.01,60.019],[-155.66,-43.5],[-156.631,-116.131],[-90.5,-169.67],[44.376,-199.521],[168,-181],[212,-29.5],[195,70.5],[49.334,74.68],[-84.272,116.49],[-212.339,23.146]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":false,"i":[[-39,4.5],[-36,-3.5],[-7.408,-63.209],[31.359,-3.447],[28.632,-5.363],[24,17],[3,36],[-5.427,20.845],[-16.145,4.473],[-36.409,8.115],[-37,-25],[-7.758,-65.292],[30,-16.5],[66.602,-15.948],[68.619,-4.96],[-18.161,27.854]],"o":[[39,-4.5],[49.358,4.799],[8.554,73.485],[-23.792,3.221],[-36.364,6.981],[-24,-17],[-3,-36],[7.619,-30.98],[22.471,-6.384],[53.482,-12.12],[50.51,34.128],[6,50.5],[-34.787,19.133],[-72.334,17.32],[-76.228,5.51],[16.967,-26.022]],"v":[[-2.5,-188.5],[120,-196],[182.432,-74.005],[142.903,44.752],[-29.985,76.262],[-139.01,86.019],[-195.66,-60.5],[-179.631,-121.131],[-110.5,-178.67],[45.376,-215.521],[170,-193],[212,-29.5],[195,70.5],[49.334,74.68],[-84.272,116.49],[-211.339,12.146]]}],"t":33.064},{"t":50.806640625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":31.535},{"t":54.89453125}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":17.52},{"t":40.87890625}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":12}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":4,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[0,0,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[6.5,-5.5,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0.3],"y":[1]},"n":["0p3_1_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[23],"t":40.322},{"t":75}]},"s":{"a":0,"ix":6,"k":[325,325,100]}},"nm":"New YT Logo","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[-0.326,-1.86],[-0.255,-1.494],[-1.767,1.07],[-1.963,1.265],[1.747,0.851],[1.85,0.446]],"o":[[0.282,1.61],[0.326,1.907],[4.66,-2.82],[2.093,-1.349],[-3.535,-1.721],[-1.349,-0.326]],"v":[[-11.952,-10.404],[-8.696,15.782],[-6.743,16.572],[16.792,0.852],[16.191,-1.472],[-10.836,-11.474]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":3,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"ix":8,"k":10},"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":61.291},{"t":62.09765625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Play outline","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[1.953,-1.488],[0,0],[0.372,3.814],[0.27,2.158],[-1.767,-0.651],[-5.94,-2.599]],"o":[[-0.145,0.11],[-2.233,1.674],[0,0],[-0.186,-1.488],[3.665,1.35],[2.977,1.302]],"v":[[17.908,1.828],[-5.626,17.549],[-10.092,15.596],[-13.347,-11.102],[-10.65,-12.869],[17.722,-2.358]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,1,1,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Play fill","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[11.851,-1.581],[3.54,-1.275],[3.086,-2.989],[-0.716,-7.44],[-1.804,-5.198],[-5.767,-0.279],[-7.298,2.017],[-15.482,0.075],[-5.023,9.116],[0.102,3.841],[0.005,0.359],[0.683,4.399],[2.974,2.189],[4.279,-0.465]],"o":[[-11.854,1.582],[-4.894,1.761],[-5.673,5.493],[0.556,5.771],[2.434,7.014],[5.316,0.257],[10.074,-2.784],[7.07,-0.034],[2.936,-5.297],[-0.011,-0.424],[-0.063,-4.579],[-0.837,-5.395],[-4.847,-3.567],[-5.475,0.595]],"v":[[-3.238,-34.06],[-33.505,-29.05],[-45.533,-21.986],[-50.743,-3.474],[-45.254,31.317],[-32.324,42.572],[-12.991,40.032],[24.699,35.317],[47.862,24.805],[50.462,8.871],[50.435,7.694],[47.118,-19.567],[39.676,-32.962],[24.699,-37.427]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":3,"k":[0.156862750649,0.156862750649,0.156862750649,1]},"hd":false,"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"ix":8,"k":10},"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":4}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":41.129},{"t":41.935546875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Logo outline","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":true,"i":[[0.051,3.677],[1.339,3.555],[3.406,2.55],[4.532,0.087],[6.159,-2.255],[2.827,-2.784],[-0.733,-7.747],[-1.644,-4.818],[-5.513,-0.59],[-39.125,-0.085],[-2.451,4.497]],"o":[[-0.066,-4.824],[-0.864,-2.295],[-4.355,-3.26],[-3.16,-0.06],[-4.595,1.682],[-4.6,4.531],[0.665,7.025],[1.817,5.326],[16.83,1.8],[11.852,0.026],[2.882,-5.289]],"v":[[49.159,8.134],[44.959,-23.102],[38.853,-32.13],[26.415,-36.073],[-33.735,-27.452],[-44.765,-20.814],[-49.523,-4.122],[-43.917,31.02],[-33.246,41.022],[26.681,33.696],[46.878,24.062]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":58.871},{"t":59.677734375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Red fill","np":2,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":6,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[8,-59,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[8,5,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[120],"t":31.451},{"t":63.708984375}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p167_0p167","0_1_0p167_0p167","0p667_1_0p167_-1p171"],"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-1.171]},"s":[198,198,100],"t":31.451},{"t":60.484375}]}},"nm":"Shape Layer 11","op":83,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-4.179,5.573],[2.943,7.307],[-0.668,-6.244],[0.802,-3.869]],"o":[[4.844,-6.46],[-3.496,-8.681],[0.668,6.249],[-1.841,8.885]],"v":[[69.296,-33.328],[71.973,-61.224],[57.924,-60.187],[63.598,-45.312]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-14.203,-5.516],[-22.893,20.519],[11.802,-7.029],[6.815,-4.688]],"o":[[9.672,3.756],[15.233,-13.653],[-13.384,7.971],[-7.121,4.898]],"v":[[6.66,49.627],[54.714,17.911],[45.779,4.127],[20.757,20.39]]}],"t":52.42},{"e":[{"c":true,"i":[[-1.603,-1.281],[0.446,1.804],[-0.288,-3.003],[-1.587,-1.042]],"o":[[1.977,1.581],[-1.08,-4.365],[0.158,1.647],[1.487,0.976]],"v":[[50.032,-58.071],[50.764,-62.884],[45.38,-64.077],[47.515,-61.187]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.179,5.573],[2.943,7.307],[-0.668,-6.244],[0.802,-3.869]],"o":[[4.844,-6.46],[-3.496,-8.681],[0.668,6.249],[-1.841,8.885]],"v":[[69.296,-33.328],[71.973,-61.224],[57.924,-60.187],[63.598,-45.312]]}],"t":57.258},{"t":61.845703125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[49.414,12.564]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":51.252},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":52.42},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":61.734},{"t":62.90234375}]},"p":{"a":0,"ix":2,"k":[-129.586,-94.436]},"r":{"a":0,"ix":6,"k":-58},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-1.247,2.256],[5.565,3.559],[7.177,6.544],[-8.738,-13.309],[-8.848,-4.831]],"o":[[3.411,-6.173],[-8.295,-5.304],[-9.405,-8.575],[6.707,10.215],[8.862,4.839]],"v":[[397.21,-7.242],[385.77,-21.935],[368.596,-35.393],[358.574,-31.055],[380.034,-5.956]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.703,8.481],[4.983,6.127],[12.068,6.226],[-14.285,-12.581],[-12.849,-16.454]],"o":[[5.007,-5.512],[-12.952,-15.923],[-13.523,-6.976],[10.964,9.656],[8.692,11.131]],"v":[[387.993,-7.418],[383.362,-26.673],[341.474,-60.529],[327.67,-49.276],[366.851,-16.461]]}],"t":48.248},{"e":[{"c":true,"i":[[1.094,1.417],[4.464,-1.056],[2.587,1.069],[-6.583,-3.825],[-8.918,0.515]],"o":[[-2.643,-3.424],[-5.755,1.361],[-4.168,-1.722],[2.89,1.679],[7,-0.404]],"v":[[449.504,-13.056],[441.828,-17.05],[429.998,-17.645],[426.349,-10.997],[443.548,-5.316]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.247,2.256],[5.565,3.559],[7.177,6.544],[-8.738,-13.309],[-8.848,-4.831]],"o":[[3.411,-6.173],[-8.295,-5.304],[-9.405,-8.575],[6.707,10.215],[8.862,4.839]],"v":[[397.21,-7.242],[385.77,-21.935],[368.596,-35.393],[358.574,-31.055],[380.034,-5.956]]}],"t":51.613},{"e":[{"c":true,"i":[[0.478,0.909],[1.164,0.11],[1.184,-1.101],[-2.92,0.578],[-5.583,2.822]],"o":[[-0.871,-1.656],[-2.183,-0.206],[-1.907,1.774],[1.879,-0.335],[1.214,-0.614]],"v":[[462.507,-22.141],[459.963,-23.678],[454.859,-21.546],[456.219,-17.25],[461.614,-19.146]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.094,1.417],[4.464,-1.056],[2.587,1.069],[-6.583,-3.825],[-8.918,0.515]],"o":[[-2.643,-3.424],[-5.755,1.361],[-4.168,-1.722],[2.89,1.679],[7,-0.404]],"v":[[449.504,-13.056],[441.828,-17.05],[429.998,-17.645],[426.349,-10.997],[443.548,-5.316]]}],"t":54.838},{"t":58.064453125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[365.484,-29.633]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":47.221},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":48.387},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":58.51},{"t":59.677734375}]},"p":{"a":0,"ix":2,"k":[-64.516,-139.633]},"r":{"a":0,"ix":6,"k":-62},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-8.917,2.196],[3.207,6.958],[-0.844,10.734],[4.459,-19.392],[-2.119,-7.876]],"o":[[7.833,-2.141],[-4.918,-10.119],[-0.503,-16.492],[-3.761,16.118],[3.666,11.898]],"v":[[424.126,161.791],[428.275,146.003],[421.525,122.702],[407.975,118.177],[408.259,148.668]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.751,1.764],[-2.424,7.903],[-1.784,10.117],[3.062,-19.823],[1.437,-9.478]],"o":[[9.229,-1.86],[7.139,-22.852],[2.052,-11.633],[-2.826,18.292],[-1.437,9.478]],"v":[[399.835,114.727],[409.4,88.963],[419.255,58.246],[399.474,62.446],[388.936,99.323]]}],"t":47.58},{"e":[{"c":true,"i":[[-1.813,2.694],[6.968,4.55],[6.71,7.148],[-0.949,-20.035],[-5.456,-3.029]],"o":[[4.38,-6.51],[-14.412,-9.411],[-7.498,-7.987],[0.731,15.444],[11.121,6.175]],"v":[[474.569,195.314],[467.455,181.75],[441.057,168.149],[423.747,163.148],[455.811,199.69]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.917,2.196],[3.207,6.958],[-0.844,10.734],[4.459,-19.392],[-2.119,-7.876]],"o":[[7.833,-2.141],[-4.918,-10.119],[-0.503,-16.492],[-3.761,16.118],[3.666,11.898]],"v":[[424.126,161.791],[428.275,146.003],[421.525,122.702],[407.975,118.177],[408.259,148.668]]}],"t":52.42},{"e":[{"c":true,"i":[[-0.063,4],[3.165,0.826],[3.315,1.955],[-0.527,-6.082],[-4.013,-1.749]],"o":[[0.142,-5.46],[-2.767,-0.842],[-1.757,-1.108],[0.473,5.337],[3.625,1.628]],"v":[[499.512,207.038],[494.93,201.97],[489.562,198.061],[483.755,203.571],[491.079,209.938]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.813,2.694],[6.968,4.55],[6.71,7.148],[-0.949,-20.035],[-5.456,-3.029]],"o":[[4.38,-6.51],[-14.412,-9.411],[-7.498,-7.987],[0.731,15.444],[11.121,6.175]],"v":[[474.569,195.314],[467.455,181.75],[441.057,168.149],[423.747,163.148],[455.811,199.69]]}],"t":58.871},{"t":64.515625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[402.877,73.469]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":46.773},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.58},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":64.516},{"t":65.322265625}]},"p":{"a":0,"ix":2,"k":[86.867,13.039]},"r":{"a":0,"ix":6,"k":66},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[8.982,-7.476],[-0.935,-10.09],[-4.858,5.024],[-0.897,6.59]],"o":[[-7.958,6.624],[0.913,9.847],[2.294,-2.372],[0.897,-6.59]],"v":[[320.817,237.519],[312.93,263.37],[329.853,264.192],[333.974,250.904]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.186,0.552],[10.117,-17.436],[-3.55,-1.349],[-3.586,6.762]],"o":[[-17.701,-1.194],[-5.717,9.853],[3.549,1.349],[3.586,-6.762]],"v":[[355.736,164.275],[319.039,197.882],[324.31,209.419],[342.597,186.07]]}],"t":50.029},{"e":[{"c":true,"i":[[2.898,-0.485],[-1.255,-2.815],[-0.825,0.059],[-0.087,1.665]],"o":[[-2.861,0.479],[1.01,2.266],[0.825,-0.059],[0.087,-1.665]],"v":[[320.288,285.341],[318.877,291.934],[323.139,291.772],[323.886,288.391]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[8.982,-7.476],[-0.935,-10.09],[-4.858,5.024],[-0.897,6.59]],"o":[[-7.958,6.624],[0.913,9.847],[2.294,-2.372],[0.897,-6.59]],"v":[[320.817,237.519],[312.93,263.37],[329.853,264.192],[333.974,250.904]]}],"t":54.033},{"t":59.677734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[330.678,195.95]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":49.193},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":49.973},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.678},{"t":60.484375}]},"p":{"a":0,"ix":2,"k":[46.52,23.707]},"r":{"a":0,"ix":6,"k":46},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.957,-1.342],[0.612,6.503],[4.065,10.522],[7.951,-6.908],[-2.512,-4.393]],"o":[[6.145,2.789],[-0.46,-4.89],[-1.467,-3.796],[-10.803,9.386],[3.621,6.333]],"v":[[337.702,278.815],[347.336,268.819],[332.095,243.999],[316.172,236.617],[328.291,272.461]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-6.299,1.799],[-1.918,9.765],[12.822,9.564],[-5.616,-6.653],[3.778,-10.959]],"o":[[6.299,-1.799],[3.006,-15.305],[-9.84,-7.34],[5.616,6.653],[-2.216,6.43]],"v":[[308.007,264.208],[318.391,251.476],[304.753,206.716],[295.528,216.838],[302.858,249.168]]}],"t":45.967},{"e":[{"c":true,"i":[[-2.073,2.612],[4.494,2.543],[5.985,2.616],[0.702,-5.233],[-8.082,-3.812]],"o":[[2.466,-3.108],[-3.338,-1.889],[-3.711,-1.622],[-0.694,5.172],[6.587,3.107]],"v":[[391.939,297.312],[390.509,286.124],[377.293,284.078],[365.431,282.474],[378.988,298.031]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.957,-1.342],[0.612,6.503],[4.065,10.522],[7.951,-6.908],[-2.512,-4.393]],"o":[[6.145,2.789],[-0.46,-4.89],[-1.467,-3.796],[-10.803,9.386],[3.621,6.333]],"v":[[337.702,278.815],[347.336,268.819],[332.095,243.999],[316.172,236.617],[328.291,272.461]]}],"t":50.807},{"e":[{"c":true,"i":[[-1.752,1.566],[0.984,2.406],[2.382,-0.297],[0.468,-1.862],[-3.846,0.253]],"o":[[2.245,-2.007],[-0.586,-2.402],[-2.79,0.645],[-0.622,2.474],[2.159,-0.142]],"v":[[414.396,291.543],[415.621,287.461],[411.113,284.597],[405.773,288.142],[409.449,293.558]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.073,2.612],[4.494,2.543],[5.985,2.616],[0.702,-5.233],[-8.082,-3.812]],"o":[[2.466,-3.108],[-3.338,-1.889],[-3.711,-1.622],[-0.694,5.172],[6.587,3.107]],"v":[[391.939,297.312],[390.509,286.124],[377.293,284.078],[365.431,282.474],[378.988,298.031]]}],"t":54.838},{"t":59.677734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[311.207,234.285]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":44.801},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.967},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.678},{"t":60.484375}]},"p":{"a":0,"ix":2,"k":[-122.793,-107.715]},"r":{"a":0,"ix":6,"k":-140},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-5.824,-6.867],[-6.007,7.305],[5.035,0.732],[4.689,-2.044]],"o":[[6.376,7.517],[4.822,-5.867],[-2.511,-0.365],[-4.676,2.04]],"v":[[106.204,397.059],[137.121,390.333],[130.591,381.861],[110.692,383.747]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.863,-6.912],[-9.829,7.087],[14.414,-5.073],[4.712,-2.057]],"o":[[6.432,7.583],[6.207,-4.475],[-2.406,0.847],[-4.712,2.057]],"v":[[170.108,388.834],[201.326,373.436],[192.525,360.361],[171.13,371.429]]}],"t":41.129},{"e":[{"c":true,"i":[[-1.181,-2.706],[-3.896,2.111],[2.189,0.947],[2.395,-0.087]],"o":[[0.388,0.876],[1.474,-0.799],[-1.092,-0.472],[-0.99,0.044]],"v":[[83.098,390.291],[89.189,391.639],[88.251,388.869],[85.063,386.868]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.824,-6.867],[-6.007,7.305],[5.035,0.732],[4.689,-2.044]],"o":[[6.376,7.517],[4.822,-5.867],[-2.511,-0.365],[-4.676,2.04]],"v":[[106.204,397.059],[137.121,390.333],[130.591,381.861],[110.692,383.747]]}],"t":46.773},{"t":52.419921875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[180.867,376.203]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":39.961},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":41.129},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":52.559},{"t":53.7265625}]},"p":{"a":0,"ix":2,"k":[-106.133,25.203]},"r":{"a":0,"ix":6,"k":269},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.674,-12.115],[-2.46,13.816],[-5.666,13.221],[6.491,-9.451],[1.871,-8.886]],"o":[[1.691,7.662],[2.556,-14.352],[4.249,-9.913],[-6.787,9.881],[-2.621,12.448]],"v":[[181.686,425.644],[200.612,420.55],[206.614,374.991],[194.321,373.792],[182.362,396.293]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.721,-3.167],[-3.431,7.581],[5.654,8.583],[5.059,-10.289],[1.871,-8.886]],"o":[[1.742,7.65],[6.011,-13.28],[-2.239,-3.399],[-6.315,12.843],[-2.621,12.448]],"v":[[197.421,355.676],[212.139,354.121],[213.768,307.566],[196.941,308.289],[197.129,333.886]]}],"t":50},{"e":[{"c":true,"i":[[-1.661,-0.889],[7.605,8.008],[3.898,4.931],[2.238,-3.77],[-2.25,-1.347]],"o":[[4.014,2.149],[-6.131,-6.456],[-2.076,-2.626],[-1.178,1.984],[1.639,0.981]],"v":[[202.636,450.926],[207.156,440.915],[198.577,429.175],[193.356,430.703],[198.806,448.482]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.674,-12.115],[-2.46,13.816],[-5.666,13.221],[6.491,-9.451],[1.871,-8.886]],"o":[[1.691,7.662],[2.556,-14.352],[4.249,-9.913],[-6.787,9.881],[-2.621,12.448]],"v":[[181.686,425.644],[200.612,420.55],[206.614,374.991],[194.321,373.792],[182.362,396.293]]}],"t":55.645},{"e":[{"c":true,"i":[[-0.824,-0.48],[0.926,2.26],[2.487,0.165],[-0.183,-2.21],[-1.113,-0.722]],"o":[[1.99,1.159],[-0.854,-2.086],[-1.69,-0.112],[0.096,1.163],[0.811,0.526]],"v":[[218.314,466.062],[220.93,462.594],[217.117,457.961],[214.662,461.171],[216.422,464.757]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.661,-0.889],[7.605,8.008],[3.898,4.931],[2.238,-3.77],[-2.25,-1.347]],"o":[[4.014,2.149],[-6.131,-6.456],[-2.076,-2.626],[-1.178,1.984],[1.639,0.981]],"v":[[202.636,450.926],[207.156,440.915],[198.577,429.175],[193.356,430.703],[198.806,448.482]]}],"t":61.291},{"t":65.322265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[1,0,0,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[206.104,331.532]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":49.193},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":50},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":65.322},{"t":66.12890625}]},"p":{"a":0,"ix":2,"k":[-130.656,-76.043]},"r":{"a":0,"ix":6,"k":179},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[7.754,12.928],[-40.461,12.59],[-25,-15.5],[24.039,-24.094],[35.107,2.652],[15.446,18.576],[-7.383,16.86],[-22.777,7.448],[-51.613,-0.608],[-22.098,-8.756],[-3.697,-60.633],[9.5,-28],[29.148,-4.094],[25.741,-1.055],[7.928,-6.519]],"o":[[-7.754,-12.928],[26.927,-8.379],[37.482,23.239],[-37.888,37.974],[-23.963,-1.81],[-18.629,-22.404],[11.621,-26.539],[27.092,-8.859],[24.63,0.29],[26.5,10.5],[2.5,41],[-12.547,36.981],[-49.897,7.009],[-68.234,2.795],[-25.536,20.999]],"v":[[-48.56,-22.68],[-42.427,-135.121],[59,-106],[90.253,-37.83],[-42.037,16.31],[-110.224,-27.845],[-128.121,-105.461],[-75.092,-138.641],[28.37,-157.79],[100,-155.5],[140,-89.5],[135,-13],[49.338,20.195],[-65.931,39.444],[-127.828,-42.812]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[6.261,9.762],[-46.909,-3.086],[-15.089,-1.824],[24.5,-7],[26.126,-7.296],[14.707,9.493],[14.602,17.198],[-0.471,25.981],[-27.724,1.98],[-27.554,3.71],[-26.5,-14.5],[-4.182,-46.388],[31.357,-17.797],[54.382,-2.978],[47.132,-5.727],[3.608,30.754]],"o":[[-6.261,-9.762],[38,2.5],[33.083,4],[-23.234,6.638],[-26.886,7.508],[-20.751,-13.394],[-14.602,-17.198],[0.49,-27.019],[0,0],[15.718,-2.116],[10.098,5.525],[2.75,30.5],[-18.5,10.5],[-49.626,2.718],[-23.428,2.846],[-3.247,-27.676]],"v":[[-60.292,-34.68],[-45.5,-137],[70.917,-119.5],[84.5,-31.5],[8.524,5.971],[-67.707,11.007],[-109.802,-26.132],[-130.529,-76.481],[-67.398,-135.845],[28.282,-156.384],[105.5,-157.5],[139.25,-83.5],[126.5,6.5],[45.334,21.183],[-72.132,42.02],[-127.416,-38.265]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[20.604,33.418],[-11.115,34.42],[-23.381,-5.19],[31.597,-21.252],[19.985,-12.762],[19.025,11.239],[19.299,30.538],[-5.427,20.845],[-16.145,4.473],[-43.291,3.334],[-29.206,-5.96],[-1.596,-44.693],[15,-15.5],[68.183,-6.429],[38.991,-8.659],[5.403,30.591]],"o":[[-12.097,-19.62],[15.5,-48],[40.568,9.005],[-15.853,10.663],[-22.585,14.422],[-25.322,-14.959],[-19.299,-30.538],[7.619,-30.98],[22.471,-6.384],[32.189,-2.479],[24.5,5],[1.5,42],[-27.609,28.53],[-72.334,6.82],[-55.273,12.275],[-5.403,-30.591]],"v":[[-57.869,-33.058],[-72.5,-112],[79.932,-121.505],[71.403,-38.748],[22.015,-1.238],[-53.525,11.261],[-110.659,-27.492],[-127.131,-94.131],[-82,-135.17],[28.311,-158.521],[100.5,-157.5],[140.5,-86.5],[134.5,-4],[48.834,20.68],[-70.491,40.659],[-128.838,-44.094]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":0,"ix":2,"k":100},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":33.094},{"t":56.451171875}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[1,0,0,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":1,"ix":5,"k":[{"e":[55],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[10],"t":43.799},{"t":59.927734375}]}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.678},{"t":60.484375}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":7,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[2,-59,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[2,5,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[100],"t":0},{"t":34.677734375}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[122,122,100],"t":0},{"t":21.7734375}]}},"nm":"Shape Layer 2","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-5.262,-4.305],[-12.876,5.92],[6.129,0.108],[2.884,-2.561]],"o":[[6.764,5.534],[8.3,-3.816],[-6.832,-0.121],[-2.884,2.561]],"v":[[296.894,-71.052],[322.675,-70.696],[321.32,-84.046],[307.607,-76.438]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.952,-9.013],[-17.617,-1.445],[5.339,6.185],[4.827,1.769]],"o":[[1.364,12.913],[12.137,0.995],[-5.297,-6.136],[-7.87,-2.883]],"v":[[238.44,-77.181],[268.195,-58.946],[280.942,-74.556],[258.182,-75.951]]}],"t":33.871},{"e":[{"c":true,"i":[[-2.091,0.861],[-1.098,1.48],[2.439,-1.733],[0.842,-1.684]],"o":[[3.944,-1.625],[2.657,-3.581],[-2.441,1.734],[-0.842,1.684]],"v":[[340.646,-81.155],[344.788,-83.634],[342.294,-87.688],[340.798,-86.199]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.262,-4.305],[-12.876,5.92],[6.129,0.108],[2.884,-2.561]],"o":[[6.764,5.534],[8.3,-3.816],[-6.832,-0.121],[-2.884,2.561]],"v":[[296.894,-71.052],[322.675,-70.696],[321.32,-84.046],[307.607,-76.438]]}],"t":37.375},{"t":42.046875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[262.625,-67.013]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.703},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":33.871},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":42.047},{"t":43.21484375}]},"p":{"a":0,"ix":2,"k":[-5.207,67]},"r":{"a":0,"ix":6,"k":155},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[8.653,4.412],[-11.948,-10.523],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-11.339,-5.781],[9.171,8.077],[4.565,9.006]],"v":[[390.943,2.407],[389.833,-16.181],[372.097,-35.412],[363.579,-28.577],[376.058,-6.258]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.76,1.884],[4.168,5.124],[7.914,1.98],[-11.948,-10.523],[-12.498,-10.86]],"o":[[4.251,-4.551],[-10.833,-13.319],[-12.347,-3.088],[9.171,8.077],[7.622,6.623]],"v":[[381.443,-19.093],[379.333,-33.681],[340.847,-63.912],[333.202,-51.464],[365.466,-20.77]]}],"t":33.871},{"e":[{"c":true,"i":[[-1.222,1.308],[1.206,4.426],[1.981,1.978],[-4.619,-6.053],[-3.512,-10.237]],"o":[[2.952,-3.161],[-2.141,-7.86],[-3.192,-3.186],[2.028,2.657],[2.275,6.632]],"v":[[393.913,7.789],[396.614,-0.432],[386.034,-15.348],[380.119,-10.602],[385.312,3.161]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[8.653,4.412],[-11.948,-10.523],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-11.339,-5.781],[9.171,8.077],[4.565,9.006]],"v":[[390.943,2.407],[389.833,-16.181],[372.097,-35.412],[363.579,-28.577],[376.058,-6.258]]}],"t":37.375},{"e":[{"c":true,"i":[[-0.886,0.471],[-0.13,1.044],[1.111,1.109],[-0.518,-2.792],[-3.024,-5.259]],"o":[[1.579,-0.84],[0.246,-1.975],[-1.789,-1.786],[0.341,1.842],[0.561,0.976]],"v":[[398.107,20.813],[399.524,18.443],[397.583,13.78],[393.392,15.175],[395.33,20.165]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.222,1.308],[1.206,4.426],[1.981,1.978],[-4.619,-6.053],[-3.512,-10.237]],"o":[[2.952,-3.161],[-2.141,-7.86],[-3.192,-3.186],[2.028,2.657],[2.275,6.632]],"v":[[393.913,7.789],[396.614,-0.432],[386.034,-15.348],[380.119,-10.602],[385.312,3.161]]}],"t":39.711},{"t":44.3828125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[357.25,-40.916]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.703},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":33.871},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":44.383},{"t":45.55078125}]},"p":{"a":0,"ix":2,"k":[-71.738,94.699]},"r":{"a":0,"ix":6,"k":110},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-8.767,2.886],[2.412,7.964],[0.005,10.277],[4.369,-19.576],[-7.882,-15.169]],"o":[[6.803,-2.24],[-5.719,-18.882],[-0.009,-17.469],[-3.237,14.505],[6.069,11.679]],"v":[[405.381,147.864],[410.436,129.873],[401.932,95.285],[387.647,89.427],[389.579,135.789]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.663,-1.858],[-1.416,8.2],[1.817,10.116],[-0.539,-20.051],[1.627,-4.792]],"o":[[6.435,4.49],[3.118,-18.056],[-2.509,-13.969],[0.416,15.456],[-4.089,12.045]],"v":[[390,106.8],[402.535,98.681],[404.538,36.778],[390.847,35.98],[385.378,84.251]]}],"t":30.367},{"e":[{"c":true,"i":[[-1.949,1.473],[4.632,4.209],[3.063,3.978],[0.417,-15.081],[-3.139,-3.489]],"o":[[4.708,-3.559],[-9.791,-8.897],[-3.476,-4.514],[-0.288,10.403],[6.399,7.113]],"v":[[430.171,173.641],[428.989,161.828],[414.504,149.442],[405.469,143.355],[413.855,165.776]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.767,2.886],[2.412,7.964],[0.005,10.277],[4.369,-19.576],[-7.882,-15.169]],"o":[[6.803,-2.24],[-5.719,-18.882],[-0.009,-17.469],[-3.237,14.505],[6.069,11.679]],"v":[[405.381,147.864],[410.436,129.873],[401.932,95.285],[387.647,89.427],[389.579,135.789]]}],"t":35.039},{"e":[{"c":true,"i":[[-0.827,2.371],[1.971,0.028],[1.832,1.417],[-0.085,-1.211],[-2.476,-0.82]],"o":[[0.68,-1.95],[-1.037,-0.015],[-0.927,-0.717],[0.179,2.56],[2.224,0.736]],"v":[[435.541,174.127],[432.651,171.009],[428.188,169.385],[426.205,169.659],[430.762,175.314]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.949,1.473],[4.632,4.209],[3.063,3.978],[0.417,-15.081],[-3.139,-3.489]],"o":[[4.708,-3.559],[-9.791,-8.897],[-3.476,-4.514],[-0.288,10.403],[6.399,7.113]],"v":[[430.171,173.641],[428.989,161.828],[414.504,149.442],[405.469,143.355],[413.855,165.776]]}],"t":40.879},{"t":50.22265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[396.535,67.065]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":29.199},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":30.367},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":50.223},{"t":51.390625}]},"p":{"a":0,"ix":2,"k":[-200.816,51.801]},"r":{"a":0,"ix":6,"k":154},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[6.44,1.778],[0.112,-7.007],[-1.758,-0.668],[-1.776,3.348]],"o":[[-6.358,-1.755],[-0.09,5.641],[1.758,0.668],[1.776,-3.348]],"v":[[332.765,203.855],[323.535,216.095],[332.476,219.847],[337.259,213.593]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.324,7.335],[0.152,-9.506],[-2.384,-0.906],[-2.409,4.542]],"o":[[-8.624,-11.881],[-0.123,7.651],[2.384,0.906],[2.409,-4.542]],"v":[[349.124,166.381],[325.603,197.485],[337.731,202.574],[344.72,184.091]]}],"t":29.199},{"e":[{"c":true,"i":[[2.833,0.782],[0.049,-3.082],[-0.773,-0.294],[-0.781,1.473]],"o":[[-2.796,-0.772],[-0.04,2.481],[0.773,0.294],[0.781,-1.473]],"v":[[329.913,234.119],[325.853,239.503],[329.785,241.153],[331.889,238.402]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.44,1.778],[0.112,-7.007],[-1.758,-0.668],[-1.776,3.348]],"o":[[-6.358,-1.755],[-0.09,5.641],[1.758,0.668],[1.776,-3.348]],"v":[[332.765,203.855],[323.535,216.095],[332.476,219.847],[337.259,213.593]]}],"t":32.703},{"t":35.0390625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[336.243,183.537]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":28.031},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":29.199},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":35.039},{"t":36.20703125}]},"p":{"a":0,"ix":2,"k":[-273.617,-102.945]},"r":{"a":0,"ix":6,"k":124},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[-0.067,6.605],[-2.226,7.848],[13.842,-7.868],[0.828,-3.931]],"o":[[5.497,2.929],[0.118,-11.643],[0.881,-3.108],[-9.876,5.614],[-2.081,9.88]],"v":[[318.598,248.071],[327.692,237.239],[333.98,215.381],[326.709,199.194],[315.871,233.392]]}],"t":28.031},{"e":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[317.396,295.449],[321.103,284.053],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"t":32.703},{"e":[{"c":true,"i":[[-2.193,-0.398],[-1.633,1.625],[1.49,0.732],[1.104,0.616],[-2.243,-2.497]],"o":[[2.866,0.521],[1.8,-1.792],[-2.422,-1.19],[-2.874,-1.603],[1.691,1.882]],"v":[[317.814,303.274],[321.644,303.175],[322.014,298.568],[317.877,296.455],[315.04,300.655]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[317.396,295.449],[321.103,284.053],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"t":37.375},{"t":42.046875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[320.584,230.135]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":26.863},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":28.031},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":42.047},{"t":43.21484375}]},"p":{"a":0,"ix":2,"k":[-290.578,-156.98]},"r":{"a":0,"ix":6,"k":161},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.112,-0.542],[-0.226,-0.603],[-0.466,0.032],[0.034,0.41]],"o":[[-1.112,0.542],[0.226,0.603],[0.466,-0.032],[-0.034,-0.41]],"v":[[-428.545,-130.894],[-428.976,-128.853],[-427.581,-128.641],[-427.259,-129.694]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.712,-5.32],[-0.957,-5.923],[-1.974,0.319],[0.145,4.029]],"o":[[-4.712,5.32],[0.957,5.923],[1.974,-0.319],[-0.145,-4.029]],"v":[[-428.675,-113.866],[-430.5,-93.818],[-424.592,-91.733],[-423.226,-102.084]]}],"t":25.807},{"t":31.451171875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-428.254,-104.227]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":24.639},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":25.807},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":31.34},{"t":32.5078125}]},"p":{"a":0,"ix":2,"k":[-225.254,-269.227]},"r":{"a":0,"ix":6,"k":64},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-3.096,0.981],[5.205,5.598],[2.75,8.25],[-3.466,-19.756],[-0.989,-2.42]],"o":[[5.282,-1.674],[-6.328,-6.806],[-1.287,-3.861],[2.5,14.25],[3.567,8.726]],"v":[[-411.44,-60.246],[-412.863,-72.518],[-419.158,-95.92],[-427.658,-87.17],[-422.975,-68.646]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.139,0.835],[7.7,3.156],[2.5,8.329],[-9.602,-16.436],[-4.305,-2.661]],"o":[[7.583,-2.017],[-13.488,-5.529],[-1.945,-6.481],[3.731,6.387],[10.69,6.609]],"v":[[-391.63,-32.099],[-393.714,-46.753],[-417.058,-67.729],[-427.5,-58.75],[-413.083,-40.715]]}],"t":27.42},{"e":[{"c":true,"i":[[-2.44,-0.355],[0.394,3.277],[0.869,6.544],[-0.603,-15.215],[-0.48,-1.926]],"o":[[4.163,0.606],[-0.842,-7.004],[-0.406,-3.063],[0.151,3.821],[1.182,4.74]],"v":[[-423.585,-93.044],[-420.682,-99.811],[-421.011,-111.355],[-428.601,-106.049],[-427.733,-98.237]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.096,0.981],[5.205,5.598],[2.75,8.25],[-3.466,-19.756],[-0.989,-2.42]],"o":[[5.282,-1.674],[-6.328,-6.806],[-1.287,-3.861],[2.5,14.25],[3.567,8.726]],"v":[[-411.44,-60.246],[-412.863,-72.518],[-419.158,-95.92],[-427.658,-87.17],[-422.975,-68.646]]}],"t":32.258},{"e":[{"c":true,"i":[[-0.408,-0.059],[0.066,0.549],[0.145,1.096],[-0.101,-2.547],[-0.08,-0.322]],"o":[[0.697,0.101],[-0.141,-1.173],[-0.068,-0.513],[0.025,0.64],[0.198,0.794]],"v":[[-427.053,-117.101],[-426.567,-118.234],[-426.622,-120.167],[-427.893,-119.279],[-427.748,-117.971]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.44,-0.355],[0.394,3.277],[0.869,6.544],[-0.603,-15.215],[-0.48,-1.926]],"o":[[4.163,0.606],[-0.842,-7.004],[-0.406,-3.063],[0.151,3.821],[1.182,4.74]],"v":[[-423.585,-93.044],[-420.682,-99.811],[-421.011,-111.355],[-428.601,-106.049],[-427.733,-98.237]]}],"t":38.709},{"t":44.103515625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-414.207,-48.82]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":26.25},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":27.42},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":44.104},{"t":45.2734375}]},"p":{"a":0,"ix":2,"k":[-262.207,-239.82]},"r":{"a":0,"ix":6,"k":88},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[10.786,-16.436],[36.698,-5.592],[51.5,1],[9,32],[15.916,31.57],[-1.093,53.88],[-56.534,10.139],[-48.62,14.681]],"o":[[-21,32],[-52.5,8],[-35.462,-0.689],[-8.036,-28.573],[-12.709,-25.209],[1.052,-51.855],[33.944,-6.088],[11.102,-3.352]],"v":[[154,7],[10.5,64],[-121,115.5],[-201,48],[-241.111,-47.775],[-291.407,-153.38],[-193.944,-279.912],[-57.38,-284.681]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[1.135,-32.538],[58,-8],[29.476,3.871],[6.943,26.458],[16.354,30.051],[-4.357,41.835],[-55.585,23.176],[-12.678,8.973]],"o":[[-1.5,43],[-36.773,5.072],[-49.5,-6.5],[-9.25,-35.25],[-22.994,-42.252],[3.538,-33.97],[22.176,-9.246],[12.678,-8.973]],"v":[[158.5,10.5],[8,70],[-134.5,113.5],[-209.75,34.5],[-239.695,-49.836],[-295.643,-167.835],[-198.915,-279.176],[-59.772,-283.797]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[6.725,-31.855],[58.724,-9.787],[29.512,3.586],[8.5,26],[18.327,29.502],[-2.717,47.431],[-27.557,6.484],[-6.782,7.107]],"o":[[-9.5,45],[-51,8.5],[-29.512,-3.587],[-9.223,-28.212],[-20.5,-33],[2.217,-38.701],[27.557,-6.484],[6.782,-7.107]],"v":[[157.5,7.5],[-1.5,64],[-143,113],[-205,49.5],[-251,-61],[-296.283,-170.931],[-204.122,-275.286],[-59.608,-284.485]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":12.848},{"t":36.20703125}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":0},{"t":23.359375}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.156862750649,0.937254965305,0.764705955982,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":10}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":8,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[8,-61,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[8,3,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[130],"t":6.451},{"t":38.708984375}]},"s":{"a":1,"ix":6,"k":[{"e":[128,128,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[150,150,100],"t":6.451},{"t":25.806640625}]}},"nm":"Shape Layer 8","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-7.106,-6.258],[-19.353,-3.869],[7.891,3.257],[5.346,-0.525]],"o":[[9.134,8.045],[12.475,2.494],[-7.897,-3.259],[-5.346,0.525]],"v":[[274.032,-55.095],[304.612,-50.784],[314.013,-66.934],[292.335,-69.588]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.407,-9.045],[-24.08,12.646],[11.275,-3.359],[6.196,-4.05]],"o":[[13.477,12.958],[15.523,-8.152],[-11.283,3.361],[-6.196,4.05]],"v":[[231.694,-24.814],[277.822,-47.084],[271.175,-73.761],[244.812,-54.192]]}],"t":44.383},{"e":[{"c":true,"i":[[-2.784,-3.375],[-3.362,-1.186],[4.594,3.521],[3.593,0.597]],"o":[[5.252,6.366],[8.135,2.87],[-4.597,-3.524],[-3.593,-0.597]],"v":[[331.516,-54.519],[338.459,-48.273],[344.534,-55.195],[340.927,-57.113]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.106,-6.258],[-19.353,-3.869],[7.891,3.257],[5.346,-0.525]],"o":[[9.134,8.045],[12.475,2.494],[-7.897,-3.259],[-5.346,0.525]],"v":[[274.032,-55.095],[304.612,-50.784],[314.013,-66.934],[292.335,-69.588]]}],"t":47.887},{"t":51.390625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[257.377,-47.334]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":43.215},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":44.383},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":51.391},{"t":52.55859375}]},"p":{"a":0,"ix":2,"k":[-214.578,-131.191]},"r":{"a":0,"ix":6,"k":274},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.364,-1.029],[-3.018,5.876],[2.165,9.468],[0.41,-15.916],[3.976,-9.264]],"o":[[6.467,2.814],[4.499,-8.758],[-2.837,-12.407],[-0.315,12.216],[-3.982,9.279]],"v":[[316.822,40.131],[330.371,27.358],[333.75,1.416],[323.043,-0.735],[313.922,23.153]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-11.421,0.903],[0.255,7.893],[5.273,8.205],[-1.791,-18.951],[1.478,-21.761]],"o":[[7.423,-0.587],[-0.783,-24.217],[-8.227,-12.801],[1.374,14.545],[-0.818,12.044]],"v":[[325.378,-3.841],[340.783,-24.783],[320.013,-81.633],[298.25,-89.886],[308.522,-23.239]]}],"t":44.383},{"e":[{"c":true,"i":[[-1.782,0.165],[-2.041,4.108],[0.166,2.795],[0.573,-7.592],[4.181,-9.982]],"o":[[4.306,-0.399],[3.625,-7.295],[-0.267,-4.502],[-0.251,3.333],[-2.709,6.467]],"v":[[306.995,78.534],[314.478,74.189],[316.489,56.012],[308.915,55.627],[303.647,69.36]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.364,-1.029],[-3.018,5.876],[2.165,9.468],[0.41,-15.916],[3.976,-9.264]],"o":[[6.467,2.814],[4.499,-8.758],[-2.837,-12.407],[-0.315,12.216],[-3.982,9.279]],"v":[[316.822,40.131],[330.371,27.358],[333.75,1.416],[323.043,-0.735],[313.922,23.153]]}],"t":47.887},{"e":[{"c":true,"i":[[-0.951,-0.319],[-0.847,0.624],[-0.04,1.569],[1.67,-2.297],[1.735,-5.813]],"o":[[1.696,0.568],[1.602,-1.181],[0.065,-2.527],[-1.102,1.516],[-0.322,1.079]],"v":[[304.127,98.096],[306.822,97.493],[308.87,92.876],[304.974,90.795],[302.686,95.634]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.782,0.165],[-2.041,4.108],[0.166,2.795],[0.573,-7.592],[4.181,-9.982]],"o":[[4.306,-0.399],[3.625,-7.295],[-0.267,-4.502],[-0.251,3.333],[-2.709,6.467]],"v":[[306.995,78.534],[314.478,74.189],[316.489,56.012],[308.915,55.627],[303.647,69.36]]}],"t":50.223},{"t":54.89453125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[321.066,-50.164]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":43.215},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":44.383},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":54.895},{"t":56.0625}]},"p":{"a":0,"ix":2,"k":[-219.066,-213.836]},"r":{"a":0,"ix":6,"k":223},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-7.833,-3.87],[-5.637,6.122],[-2.016,10.078],[3.414,-19.765],[13.176,-28.168]],"o":[[7.146,3.53],[16.659,-18.093],[3.427,-17.13],[-2.632,15.235],[-5.39,11.522]],"v":[[379.999,178.335],[396.982,174.133],[416.912,113.469],[399.58,101.812],[380.14,151.363]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.613,0.737],[-2.424,7.903],[4.317,15.554],[-0.539,-20.051],[6.085,-25.403]],"o":[[9.399,-0.533],[7.139,-22.852],[-3.819,-13.762],[0.416,15.456],[-6.085,25.403]],"v":[[403.508,119.257],[418.174,93.773],[419.944,41.7],[395.677,45.267],[389.164,96.504]]}],"t":42.742},{"e":[{"c":true,"i":[[-2.497,-2.077],[-5.234,6.47],[-1.469,9.693],[9.39,-17.724],[3.567,-5.12]],"o":[[6.032,5.018],[10.825,-13.382],[1.641,-10.831],[-8.109,15.306],[-7.272,10.437]],"v":[[369.595,227.212],[383.812,221.512],[397.435,185.945],[390.663,169.248],[367.146,208.106]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.833,-3.87],[-5.637,6.122],[-2.016,10.078],[3.414,-19.765],[13.176,-28.168]],"o":[[7.146,3.53],[16.659,-18.093],[3.427,-17.13],[-2.632,15.235],[-5.39,11.522]],"v":[[379.999,178.335],[396.982,174.133],[416.912,113.469],[399.58,101.812],[380.14,151.363]]}],"t":47.58},{"e":[{"c":true,"i":[[-3.832,-1.279],[-1.644,2.713],[-2.737,2.53],[5.638,1.238],[2.865,-3.256]],"o":[[5.173,1.726],[1.341,-2.214],[1.384,-1.28],[-4.999,-1.098],[-2.49,2.83]],"v":[[356.714,245.601],[362.742,242.776],[367.676,239.233],[363.88,232.13],[356.49,236.923]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.497,-2.077],[-5.234,6.47],[-1.469,9.693],[9.39,-17.724],[3.567,-5.12]],"o":[[6.032,5.018],[10.825,-13.382],[1.641,-10.831],[-8.109,15.306],[-7.272,10.437]],"v":[[369.595,227.212],[383.812,221.512],[397.435,185.945],[390.663,169.248],[367.146,208.106]]}],"t":54.033},{"t":59.677734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[404.93,83.625]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":41.129},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":42.604},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.678},{"t":61.291015625}]},"p":{"a":0,"ix":2,"k":[-138.93,-276.625]},"r":{"a":0,"ix":6,"k":245},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[12.98,-6.184],[11.111,-16.056],[-3.914,3.539],[-5.98,1.979]],"o":[[-12.128,5.778],[-10.545,15.238],[10.106,-9.138],[19.279,-6.38]],"v":[[318.902,206.219],[279.794,228.558],[288.654,243.523],[317.301,222.249]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.927,-3.963],[19.952,-8.646],[-19.611,8.534],[-3.594,6.776]],"o":[[-21.701,6.652],[-23.559,10.21],[16.263,-7.077],[3.594,-6.776]],"v":[[354.921,151.162],[313.901,203.075],[317.224,218.145],[354.174,177.892]]}],"t":45.162},{"e":[{"c":true,"i":[[5.747,-1.951],[1.698,-9.872],[-1.334,1.718],[-4.992,1.049]],"o":[[-3.722,1.458],[-1.424,8.281],[4.426,-5.222],[2.361,-4.244]],"v":[[281.169,235.826],[264.082,251.171],[272.645,255.497],[285.355,241.514]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[12.98,-6.184],[11.111,-16.056],[-3.914,3.539],[-5.98,1.979]],"o":[[-12.128,5.778],[-10.545,15.238],[10.106,-9.138],[19.279,-6.38]],"v":[[318.902,206.219],[279.794,228.558],[288.654,243.523],[317.301,222.249]]}],"t":49.193},{"e":[{"c":true,"i":[[2.954,0.333],[-0.331,-3.154],[-0.805,-0.138],[-0.577,1.611]],"o":[[-2.881,-0.324],[0.272,2.595],[0.87,0.035],[0.586,-1.635]],"v":[[260.378,262.174],[256.889,268.362],[261.127,269.48],[262.984,266.158]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.747,-1.951],[1.698,-9.872],[-1.334,1.718],[-4.992,1.049]],"o":[[-3.722,1.458],[-1.424,8.281],[4.426,-5.222],[2.361,-4.244]],"v":[[281.169,235.826],[264.082,251.171],[272.645,255.497],[285.355,241.514]]}],"t":52.42},{"t":54.837890625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":43.994},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.162},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":54.838},{"t":55.64453125}]},"p":{"a":0,"ix":2,"k":[-119,-323]},"r":{"a":0,"ix":6,"k":56},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-3.21,-0.491],[2.35,6.095],[6.113,12.778],[-1.155,-14.158],[-8.147,-5.86]],"o":[[6.671,1.021],[-1.767,-4.583],[-1.756,-3.671],[1.045,12.807],[5.922,4.26]],"v":[[339.738,271.778],[345.218,260.984],[324.915,239.78],[315.011,238.392],[330.54,268.187]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[-0.067,6.605],[3.054,7.565],[10.791,-8.694],[0.224,-4.011]],"o":[[5.497,2.929],[0.118,-11.643],[-2.98,-7.381],[-8.846,7.127],[-0.871,15.608]],"v":[[314.598,259.571],[323.692,245.239],[319.127,198.585],[298.155,181.521],[302.945,244.529]]}],"t":45.162},{"e":[{"c":true,"i":[[-1.634,2.936],[5.475,3.562],[6.311,1.676],[1.373,-8.599],[-6.282,-1.072]],"o":[[1.936,-3.478],[-3.21,-2.088],[-3.933,-1.044],[-1.635,10.241],[7.191,1.227]],"v":[[367.527,262.648],[362.997,251.553],[351.283,250.625],[339.585,248.172],[354.764,265.266]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.21,-0.491],[2.35,6.095],[6.113,12.778],[-1.155,-14.158],[-8.147,-5.86]],"o":[[6.671,1.021],[-1.767,-4.583],[-1.756,-3.671],[1.045,12.807],[5.922,4.26]],"v":[[339.738,271.778],[345.218,260.984],[324.915,239.78],[315.011,238.392],[330.54,268.187]]}],"t":50},{"e":[{"c":true,"i":[[-1.924,1.124],[-0.182,2.297],[1.608,-0.414],[1.239,-0.251],[-3.328,-0.436]],"o":[[2.515,-1.469],[0.201,-2.532],[-2.614,0.673],[-3.225,0.653],[2.509,0.329]],"v":[[384.796,256.439],[387.639,253.871],[384.922,250.133],[380.406,251.22],[380.984,256.255]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.634,2.936],[5.475,3.562],[6.311,1.676],[1.373,-8.599],[-6.282,-1.072]],"o":[[1.936,-3.478],[-3.21,-2.088],[-3.933,-1.044],[-1.635,10.241],[7.191,1.227]],"v":[[367.527,262.648],[362.997,251.553],[351.283,250.625],[339.585,248.172],[354.764,265.266]]}],"t":54.838},{"t":59.56640625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[310.24,218.951]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":43.994},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.162},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.566},{"t":60.734375}]},"p":{"a":0,"ix":2,"k":[-161.211,-7.059]},"r":{"a":0,"ix":6,"k":171},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[3.141,0.827],[-0.338,-8.315],[-8.896,-10.141],[1.932,9.396],[-2.499,13.574]],"o":[[-8.094,-2.131],[0.593,14.565],[6.7,7.638],[-3.243,-15.772],[2.303,-12.51]],"v":[[-337.984,-433.641],[-349.504,-420.507],[-335.35,-382.508],[-319.857,-381.226],[-332.44,-416.538]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.072,-1.054],[-6.069,-9.317],[-8.059,-7.336],[0.738,14.37],[2.909,4.142]],"o":[[-7.422,2.545],[7.957,12.214],[3.01,2.74],[-0.734,-14.293],[-7.311,-10.409]],"v":[[-331.366,-387.145],[-326.659,-368.439],[-299.172,-340.202],[-282.749,-338.843],[-310.736,-374.277]]}],"t":38.709},{"e":[{"c":true,"i":[[1.664,1.849],[3.345,-6.351],[-5.055,-9.568],[-0.373,9.173],[-6.196,8.297]],"o":[[-4.289,-4.764],[-3.694,9.513],[3.974,7.71],[0.008,-11.58],[6.441,-7.959]],"v":[[-329.595,-451.856],[-343.553,-445.711],[-344.119,-413.456],[-332.261,-413.47],[-332.365,-437.17]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.141,0.827],[-0.338,-8.315],[-8.896,-10.141],[1.932,9.396],[-2.499,13.574]],"o":[[-8.094,-2.131],[0.593,14.565],[6.7,7.638],[-3.243,-15.772],[2.303,-12.51]],"v":[[-337.984,-433.641],[-349.504,-420.507],[-335.35,-382.508],[-319.857,-381.226],[-332.44,-416.538]]}],"t":43.549},{"e":[{"c":true,"i":[[0.647,2.399],[5.295,-5.158],[-3.648,-7.495],[-0.253,8.888],[-7.597,4.51]],"o":[[-1.666,-6.182],[-5.408,5.268],[3.212,6.6],[0.205,-7.188],[8.368,-4.968]],"v":[[-315.591,-472.782],[-330.122,-470.056],[-336.895,-443.958],[-328.882,-448.394],[-322.754,-460.041]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.664,1.849],[3.345,-6.351],[-5.055,-9.568],[-0.373,9.173],[-6.196,8.297]],"o":[[-4.289,-4.764],[-3.694,9.513],[3.974,7.71],[0.008,-11.58],[6.441,-7.959]],"v":[[-329.595,-451.856],[-343.553,-445.711],[-344.119,-413.456],[-332.261,-413.47],[-332.365,-437.17]]}],"t":45.967},{"e":[{"c":true,"i":[[1.068,0.325],[1.382,-3.02],[1.651,-2.396],[-2.55,1.625],[0.024,1.608]],"o":[[-1.501,-0.456],[-0.89,1.944],[-1.872,2.716],[1.578,-1.005],[-0.023,-1.589]],"v":[[-311.698,-481.914],[-315.538,-479.478],[-316.946,-475.353],[-313.345,-473.814],[-310.261,-478.673]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.647,2.399],[5.295,-5.158],[-3.648,-7.495],[-0.253,8.888],[-7.597,4.51]],"o":[[-1.666,-6.182],[-5.408,5.268],[3.212,6.6],[0.205,-7.188],[8.368,-4.968]],"v":[[-315.591,-472.782],[-330.122,-470.056],[-336.895,-443.958],[-328.882,-448.394],[-322.754,-460.041]]}],"t":48.387},{"t":53.2265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-304.289,-360.496]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":37.375},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":38.543},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":53.227},{"t":54.392578125}]},"p":{"a":0,"ix":2,"k":[96.711,-284.496]},"r":{"a":0,"ix":6,"k":117},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[19.514,-2.379],[94.782,15.632],[32.746,74.677],[-24.104,91.314],[-43.342,12.292],[-55.734,7.067],[-12.958,4.282],[-15.368,1.444],[-5.901,-12.316]],"o":[[-99.548,12.137],[-55.52,-9.157],[-26.168,-59.677],[9.262,-35.088],[68.046,-19.298],[48.989,-6.212],[28.248,-9.335],[35.867,-3.37],[5.901,12.316]],"v":[[103.934,36.653],[-110.782,59.368],[-176.678,-72.703],[-215.177,-209.012],[-133.845,-270.579],[-1.857,-267.213],[77.752,-281.665],[130.133,-295.63],[187.79,-273.42]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-6.081,-31.985],[24.757,12.653],[29.356,58.811],[-19.949,34.363],[-41.604,2.715],[-49.623,5.236],[-12.21,4.49],[-23.206,1.791],[-4.437,-11.718]],"o":[[3.738,19.66],[-52.987,-27.082],[-31.952,-64.012],[34.962,-60.224],[48.707,-3.178],[49.623,-5.236],[19.505,-7.172],[12.739,-0.983],[4.437,11.718]],"v":[[107.412,37.288],[-109.918,61.076],[-179.259,-74.059],[-228.303,-206.233],[-121.83,-288.659],[2.406,-267.49],[93.495,-286.828],[132.206,-295.791],[188.763,-269.948]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[30.906,10.239],[26.258,11.48],[18.527,60.223],[-53.765,63.702],[-34.731,0.011],[-34.854,4.38],[-24.683,0.853],[-15.663,0.963],[-5.142,-11.664]],"o":[[-47.919,-15.876],[-70.357,-30.76],[-11.618,-37.767],[23.033,-27.29],[52.229,-0.017],[42.963,-5.399],[24.007,-0.83],[36.19,-2.225],[5.142,11.664]],"v":[[107.315,39.786],[-111.261,57.02],[-178.386,-71.664],[-215.594,-209.237],[-125.189,-282.314],[-3.008,-265.22],[81.1,-281.477],[127.81,-296.775],[190.767,-266.91]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":25.695},{"t":49.0546875}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":12.848},{"t":36.20703125}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.419607877731,0.756862819195,0.988235354424,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":12}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":9,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[3,-60,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[3,4,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[115],"t":4.838},{"t":34.677734375}]},"s":{"a":1,"ix":6,"k":[{"e":[129,129,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[151,151,100],"t":4.838},{"t":26.61328125}]}},"nm":"Shape Layer 7","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-5.673,-4.762],[-18.144,-8.136],[6.413,4.394],[5.067,0.196]],"o":[[6.889,6.254],[11.904,5.215],[-11.294,-7.739],[-6.612,1.03]],"v":[[281.484,-56.197],[316.648,-47.061],[328.35,-59.478],[295.503,-66.743]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-12.396,4.078],[-26.919,3.894],[11.275,-3.359],[5.797,-4.603]],"o":[[14.726,-4.845],[17.976,-2.6],[-11.283,3.361],[-10.431,8.283]],"v":[[231.694,-24.814],[274.564,-52.147],[273.316,-68.67],[244.55,-55.751]]}],"t":43.549},{"e":[{"c":true,"i":[[-2.311,-9.183],[-13.757,-14.151],[4.658,7.154],[4.703,2.596]],"o":[[2.97,11.804],[8.868,9.122],[-4.661,-7.159],[-4.703,-2.596]],"v":[[314.956,-50.966],[337.715,-30.091],[354.611,-38.075],[338.249,-52.541]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.673,-4.762],[-18.144,-8.136],[6.413,4.394],[5.067,0.196]],"o":[[6.889,6.254],[11.904,5.215],[-11.294,-7.739],[-6.612,1.03]],"v":[[281.484,-56.197],[316.648,-47.061],[328.35,-59.478],[295.503,-66.743]]}],"t":47.887},{"e":[{"c":true,"i":[[0.325,-4.363],[-1.606,-3.182],[0.88,5.721],[2.181,2.917]],"o":[[-0.612,8.23],[3.887,7.701],[-0.881,-5.725],[-2.181,-2.917]],"v":[[356.132,-20.162],[356.824,-10.849],[365.998,-11.643],[364.721,-15.523]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.311,-9.183],[-13.757,-14.151],[4.658,7.154],[4.703,2.596]],"o":[[2.97,11.804],[8.868,9.122],[-4.661,-7.159],[-4.703,-2.596]],"v":[[314.956,-50.966],[337.715,-30.091],[354.611,-38.075],[338.249,-52.541]]}],"t":49.055},{"t":52.55859375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":42.381},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":43.549},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":52.559},{"t":53.7265625}]},"p":{"a":0,"ix":2,"k":[-319,-12]},"r":{"a":0,"ix":6,"k":298},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.078,-1.526],[-4.242,5.063],[0.019,9.713],[3.918,-15.432],[5.925,-8.156]],"o":[[5.685,4.174],[6.323,-7.547],[-0.025,-12.727],[-3.007,11.844],[-5.934,8.169]],"v":[[298.689,40.643],[314.727,31.18],[323.755,6.626],[313.788,2.162],[299.614,23.444]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-11.421,0.903],[0.255,7.893],[5.273,8.205],[-1.791,-18.951],[1.478,-21.761]],"o":[[7.423,-0.587],[-0.783,-24.217],[-8.227,-12.801],[1.374,14.545],[-0.818,12.044]],"v":[[325.378,-3.841],[336.438,-31.273],[320.013,-81.633],[298.25,-89.886],[317.655,-28.815]]}],"t":43.549},{"e":[{"c":true,"i":[[-1.599,-0.805],[-3.908,2.402],[-1.341,2.458],[4.509,-6.135],[8.836,-6.249]],"o":[[3.863,1.944],[6.94,-4.265],[2.16,-3.959],[-1.98,2.694],[-5.724,4.049]],"v":[[276.962,51.013],[285.61,51.293],[296.948,36.945],[290.73,32.604],[278.984,41.458]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.078,-1.526],[-4.242,5.063],[0.019,9.713],[3.918,-15.432],[5.925,-8.156]],"o":[[5.685,4.174],[6.323,-7.547],[-0.025,-12.727],[-3.007,11.844],[-5.934,8.169]],"v":[[298.689,40.643],[314.727,31.18],[323.755,6.626],[313.788,2.162],[299.614,23.444]]}],"t":46.719},{"e":[{"c":true,"i":[[-0.732,-0.686],[-1.03,0.214],[-0.69,1.409],[2.475,-1.392],[4,-4.561]],"o":[[1.305,1.223],[1.948,-0.406],[1.112,-2.271],[-1.633,0.919],[-0.743,0.847]],"v":[[258.72,53.175],[261.421,53.75],[265.207,50.407],[262.532,46.891],[258.436,50.337]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.599,-0.805],[-3.908,2.402],[-1.341,2.458],[4.509,-6.135],[8.836,-6.249]],"o":[[3.863,1.944],[6.94,-4.265],[2.16,-3.959],[-1.98,2.694],[-5.724,4.049]],"v":[[276.962,51.013],[285.61,51.293],[296.948,36.945],[290.73,32.604],[278.984,41.458]]}],"t":49.055},{"t":53.7265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":42.381},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":43.549},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":53.727},{"t":54.89453125}]},"p":{"a":0,"ix":2,"k":[-110,-15]},"r":{"a":0,"ix":6,"k":264},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-7.732,4.067],[3.042,7.746],[0.005,10.277],[-0.539,-20.051],[-15.062,-27.206]],"o":[[7.054,-3.711],[-6.426,-16.363],[-0.009,-17.469],[0.416,15.456],[6.161,11.129]],"v":[[423.143,176.84],[429.606,159.901],[408.185,109.611],[393.012,101.88],[401.394,160.886]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.468,0.819],[-2.289,7.899],[-1.216,9.918],[-0.539,-20.051],[3.895,-17.689]],"o":[[9.341,-0.612],[6.804,-22.692],[1.748,-14.248],[0.416,15.456],[-2.222,10.089]],"v":[[400.264,121.335],[407.277,89.064],[415.34,40.943],[396.726,46.079],[387.633,99.652]]}],"t":41.129},{"e":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[4.02,8.942],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-4.492,-9.991],[-4.331,14.842],[8.508,9.457]],"v":[[446.471,206.015],[444.156,190.874],[423.616,169.427],[408.875,159.068],[427.309,204.052]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.732,4.067],[3.042,7.746],[0.005,10.277],[-0.539,-20.051],[-15.062,-27.206]],"o":[[7.054,-3.711],[-6.426,-16.363],[-0.009,-17.469],[0.416,15.456],[6.161,11.129]],"v":[[423.143,176.84],[429.606,159.901],[408.185,109.611],[393.012,101.88],[401.394,160.886]]}],"t":45.551},{"e":[{"c":true,"i":[[-0.627,3.991],[2.948,1.173],[2.948,2.281],[0.289,-5.765],[-3.685,-2.287]],"o":[[0.847,-5.388],[-2.405,-0.957],[-1.491,-1.154],[-0.256,5.111],[3.202,1.988]],"v":[[470.684,231.038],[466.901,225.56],[462.591,221.28],[456.214,226.198],[462.163,232.694]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[4.02,8.942],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-4.492,-9.991],[-4.331,14.842],[8.508,9.457]],"v":[[446.471,206.015],[444.156,190.874],[423.616,169.427],[408.875,159.068],[427.309,204.052]]}],"t":52.559},{"t":58.3984375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":39.711},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":40.879},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":58.398},{"t":59.56640625}]},"p":{"a":0,"ix":2,"k":[-235,62]},"r":{"a":0,"ix":6,"k":280},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-3.179,-0.665],[2.016,6.213],[3.142,17.876],[0.728,-14.187],[-3.41,-3.739]],"o":[[6.605,1.381],[-1.516,-4.672],[-2.326,-13.23],[-0.808,15.745],[4.916,5.39]],"v":[[321.216,291.57],[330.689,279.935],[319.139,243.191],[305.259,238.136],[312.226,287.486]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[3.434,14.705],[0.553,10.13],[5.503,-12.718],[-3.126,-13.881]],"o":[[5.497,2.929],[-2.647,-11.338],[-1.031,-18.877],[-7.856,18.155],[3.434,15.251]],"v":[[312.302,269.756],[324.661,257.524],[317.784,199.402],[301.971,183.906],[306.246,249.272]]}],"t":44.355},{"e":[{"c":true,"i":[[-3.271,0.769],[1.054,6.446],[3.012,5.794],[7.281,-4.776],[-3.438,-5.365]],"o":[[3.875,-0.911],[-0.618,-3.779],[-1.877,-3.611],[-8.672,5.688],[3.936,6.142]],"v":[[331.954,312.336],[337.105,301.515],[329.902,292.232],[319.278,281.248],[321.423,304.665]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.179,-0.665],[2.016,6.213],[3.142,17.876],[0.728,-14.187],[-3.41,-3.739]],"o":[[6.605,1.381],[-1.516,-4.672],[-2.326,-13.23],[-0.808,15.745],[4.916,5.39]],"v":[[321.216,291.57],[330.689,279.935],[319.139,243.191],[305.259,238.136],[312.226,287.486]]}],"t":49.027},{"e":[{"c":true,"i":[[-2.218,-0.219],[-1.495,1.753],[1.545,0.609],[1.15,0.524],[-2.438,-2.306]],"o":[[2.899,0.286],[1.648,-1.932],[-2.511,-0.99],[-2.994,-1.365],[1.838,1.739]],"v":[[339.992,318.322],[343.801,317.912],[343.795,313.291],[339.501,311.52],[337.014,315.936]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.271,0.769],[1.054,6.446],[3.012,5.794],[7.281,-4.776],[-3.438,-5.365]],"o":[[3.875,-0.911],[-0.618,-3.779],[-1.877,-3.611],[-8.672,5.688],[3.936,6.142]],"v":[[331.954,312.336],[337.105,301.515],[329.902,292.232],[319.278,281.248],[321.423,304.665]]}],"t":53.699},{"t":58.369140625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":43.604},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":44.355},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":58.119},{"t":58.92578125}]},"p":{"a":0,"ix":2,"k":[189,-160]},"r":{"a":0,"ix":6,"k":148},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.659,1.767],[2.042,-0.139],[-0.046,-0.681],[-1.373,-0.077]],"o":[[-1.659,-1.767],[-2.042,0.139],[0.046,0.681],[1.373,0.077]],"v":[[297.337,-363.857],[290.584,-365.106],[289.691,-363.164],[293.164,-362.375]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.573,6.143],[5.924,0.949],[0.316,-1.975],[-3.87,-1.127]],"o":[[-3.573,-6.143],[-5.924,-0.949],[-0.316,1.975],[3.87,1.127]],"v":[[266.466,-363.092],[248.002,-371.115],[244.17,-366.159],[253.569,-361.614]]}],"t":31.535},{"t":37.375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":30.367},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":31.535},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":37.375},{"t":38.54296875}]},"p":{"a":0,"ix":2,"k":[0,89]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[5.412,-4.886],[-8.316,0.301],[-8.696,0.023],[19.846,2.907],[5.025,-0.604]],"o":[[-5.824,5.258],[16.754,-0.606],[4.07,-0.011],[-14.315,-2.097],[-7.321,0.88]],"v":[[188.396,-372.408],[202.595,-365.629],[235.029,-365.913],[234.764,-376.269],[207.821,-377.38]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.206,-3.241],[-7.759,3.008],[-8.696,0.023],[19.846,2.907],[4.671,-1.948]],"o":[[0.499,7.83],[12.336,-4.783],[4.07,-0.011],[-14.315,-2.097],[-7.637,3.186]],"v":[[176.071,-367.658],[190.849,-366.843],[214.029,-368.913],[213.764,-379.269],[191.544,-378.666]]}],"t":33.871},{"e":[{"c":true,"i":[[0.7,-2.166],[-5.35,-1.792],[-6.171,-0.15],[14.241,0.353],[3.585,-0.214]],"o":[[-0.706,2.186],[8.455,2.77],[6.613,0.161],[-10.272,-0.255],[-6.384,0.381]],"v":[[223.108,-372.022],[231.508,-368.437],[247.014,-365.732],[244.812,-373.896],[233.202,-375.328]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.412,-4.886],[-8.316,0.301],[-8.696,0.023],[19.846,2.907],[5.025,-0.604]],"o":[[-5.824,5.258],[16.754,-0.606],[4.07,-0.011],[-14.315,-2.097],[-7.321,0.88]],"v":[[188.396,-372.408],[202.595,-365.629],[235.029,-365.913],[234.764,-376.269],[207.821,-377.38]]}],"t":38.709},{"e":[{"c":true,"i":[[-0.174,-0.783],[-1.859,0.883],[-0.719,0.551],[2.412,-0.802],[0.965,-0.712]],"o":[[0.314,1.41],[2.656,-1.262],[1.801,-1.379],[-1.264,0.421],[-1.803,1.33]],"v":[[267.812,-373.158],[270.939,-373.029],[273.177,-375.201],[272.191,-377.205],[269.581,-375.541]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.7,-2.166],[-5.35,-1.792],[-6.171,-0.15],[14.241,0.353],[3.585,-0.214]],"o":[[-0.706,2.186],[8.455,2.77],[6.613,0.161],[-10.272,-0.255],[-6.384,0.381]],"v":[[223.108,-372.022],[231.508,-368.437],[247.014,-365.732],[244.812,-373.896],[233.202,-375.328]]}],"t":41.936},{"t":46.7734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[198.41,-369.918]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.703},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":33.871},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":46.719},{"t":47.88671875}]},"p":{"a":0,"ix":2,"k":[281.463,-243.895]},"r":{"a":0,"ix":6,"k":86},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[3.112,19.412],[10.674,35.553],[17.968,31.767],[-30.425,13.391],[-28.972,-20.264],[-65.185,-11.41],[-12.448,-15.094],[-3.625,-8.609]],"o":[[-6.059,-37.793],[-15.271,-50.864],[-38.098,-67.356],[27.167,-11.957],[24.968,17.464],[31.565,5.525],[21.536,26.113],[3.625,8.609]],"v":[[-144.234,12.644],[-163.892,-135.328],[-233.902,-223.644],[-184.553,-335.632],[13.435,-282.458],[207.518,-281.588],[278.464,-263.113],[287.711,-177.953]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[21.095,24.799],[16.041,56.309],[6.528,29.004],[-60.825,1.267],[-28.794,-18.478],[-51.085,-10.087],[-13.359,-20.562],[-3.682,-7.089]],"o":[[-27.877,-32.773],[-10.17,-35.701],[-15.075,-66.979],[36.436,-0.759],[42.169,27.061],[37.502,7.405],[11.291,17.378],[3.682,7.089]],"v":[[-149.917,13.092],[-170.183,-136.964],[-239.925,-242.521],[-159.175,-341.267],[13.576,-279.962],[210.364,-290.231],[279.209,-253.378],[286.649,-180.337]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[13.732,29.52],[11.815,58.349],[10.077,29.724],[-48.147,12.056],[-32.713,-11.666],[-51.744,-7.909],[-9.299,-14.759],[-4.642,-6.714]],"o":[[-19.529,-41.981],[-10.04,-49.583],[-10.077,-29.724],[28.793,-7.21],[49.243,17.561],[30.359,4.64],[8.228,13.059],[3.517,5.087]],"v":[[-145.471,16.481],[-165.572,-147.211],[-241.62,-241.508],[-173.362,-334.464],[27.008,-272.711],[209.201,-286.814],[276.373,-257.803],[288.003,-173.706]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":23.359},{"t":46.71875}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":10.512},{"t":33.87109375}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.992156922817,0.615686297417,0.913725554943,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":8}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":10,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[1,-59,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[1,5,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[140],"t":10.484},{"t":47.580078125}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[147,147,100],"t":10.484},{"t":27.419921875}]}},"nm":"Shape Layer 4","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-3.363,-5.909],[-12.237,-7.148],[4.597,4.054],[3.752,0.892]],"o":[[4.323,7.596],[7.888,4.608],[-4.601,-4.057],[-3.752,-0.892]],"v":[[312.812,-57.316],[332.569,-47.245],[342.724,-56.015],[328.625,-62.881]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.952,-9.013],[-18.451,-4.052],[7.493,3.259],[5.104,0.62]],"o":[[1.364,12.913],[11.894,2.612],[-7.498,-3.261],[-5.104,-0.62]],"v":[[270.136,-60.913],[304.606,-52.112],[313.007,-69.259],[290.247,-70.654]]}],"t":48.387},{"e":[{"c":true,"i":[[-2.93,-3.249],[-3.411,-1.038],[4.744,3.316],[3.615,0.439]],"o":[[5.527,6.129],[8.253,2.511],[-4.747,-3.319],[-3.615,-0.439]],"v":[[344.43,-43.937],[351.64,-38.002],[357.405,-45.184],[353.718,-46.941]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.363,-5.909],[-12.237,-7.148],[4.597,4.054],[3.752,0.892]],"o":[[4.323,7.596],[7.888,4.608],[-4.601,-4.057],[-3.752,-0.892]],"v":[[312.812,-57.316],[332.569,-47.245],[342.724,-56.015],[328.625,-62.881]]}],"t":52.143},{"t":54.478515625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[293,-62.359]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":47.221},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":48.387},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":54.479},{"t":55.64453125}]},"p":{"a":0,"ix":2,"k":[108,-185.359]},"r":{"a":0,"ix":6,"k":8},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[8.653,4.412],[-11.948,-10.523],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-11.339,-5.781],[9.171,8.077],[4.565,9.006]],"v":[[390.943,2.407],[389.833,-16.181],[372.097,-35.412],[363.579,-28.577],[376.058,-6.258]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.76,1.884],[4.168,5.124],[7.914,1.98],[-11.948,-10.523],[-7.558,-15.742]],"o":[[4.251,-4.551],[-10.833,-13.319],[-12.347,-3.088],[9.171,8.077],[4.37,9.103]],"v":[[381.443,-19.093],[379.333,-33.681],[340.847,-63.912],[324.829,-51.077],[359.058,-23.758]]}],"t":47.58},{"e":[{"c":true,"i":[[-1.222,1.308],[1.206,4.426],[1.981,1.978],[-4.619,-6.053],[-3.512,-10.237]],"o":[[2.952,-3.161],[-2.141,-7.86],[-3.192,-3.186],[2.028,2.657],[2.275,6.632]],"v":[[393.913,7.789],[396.614,-0.432],[386.034,-15.348],[380.119,-10.602],[385.312,3.161]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[8.653,4.412],[-11.948,-10.523],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-11.339,-5.781],[9.171,8.077],[4.565,9.006]],"v":[[390.943,2.407],[389.833,-16.181],[372.097,-35.412],[363.579,-28.577],[376.058,-6.258]]}],"t":51.084},{"e":[{"c":true,"i":[[-0.886,0.471],[-0.13,1.044],[1.111,1.109],[-0.518,-2.792],[-3.024,-5.259]],"o":[[1.579,-0.84],[0.246,-1.975],[-1.789,-1.786],[0.341,1.842],[0.561,0.976]],"v":[[394.302,8.896],[395.719,6.526],[393.778,1.863],[389.586,3.258],[391.524,8.248]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.222,1.308],[1.206,4.426],[1.981,1.978],[-4.619,-6.053],[-3.512,-10.237]],"o":[[2.952,-3.161],[-2.141,-7.86],[-3.192,-3.186],[2.028,2.657],[2.275,6.632]],"v":[[393.913,7.789],[396.614,-0.432],[386.034,-15.348],[380.119,-10.602],[385.312,3.161]]}],"t":53.42},{"t":58.091796875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[353.641,-44.633]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":46.412},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.58},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":58.092},{"t":59.259765625}]},"p":{"a":0,"ix":2,"k":[157.641,-152.633]},"r":{"a":0,"ix":6,"k":16},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.752,1.725],[4.516,6.989],[0.005,10.277],[-0.539,-20.051],[-15.062,-27.206]],"o":[[6.648,-4.167],[-9.341,-14.457],[-0.009,-17.469],[0.416,15.456],[6.161,11.129]],"v":[[424.873,148.291],[420.968,130.502],[407.009,76.969],[389.084,71.044],[399.416,129.381]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.663,-1.858],[-1.312,8.218],[1.817,10.116],[-0.539,-20.051],[1.627,-4.792]],"o":[[6.435,4.49],[3.153,-19.75],[-2.509,-13.969],[0.416,15.456],[-4.089,12.045]],"v":[[390,106.8],[404.847,96.25],[405.009,37.969],[388.084,33.044],[388.378,84.251]]}],"t":45.885},{"e":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[2.204,10.038],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-2.349,-10.7],[-4.331,14.842],[8.508,9.457]],"v":[[435.403,157.758],[429.46,144.376],[416.698,122.052],[397.806,110.811],[409.035,143.781]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.752,1.725],[4.516,6.989],[0.005,10.277],[-0.539,-20.051],[-15.062,-27.206]],"o":[[6.648,-4.167],[-9.341,-14.457],[-0.009,-17.469],[0.416,15.456],[6.161,11.129]],"v":[[424.873,148.291],[420.968,130.502],[407.009,76.969],[389.084,71.044],[399.416,129.381]]}],"t":50.584},{"e":[{"c":true,"i":[[-0.903,5.742],[4.241,1.687],[4.241,3.281],[0.416,-8.294],[-5.302,-3.291]],"o":[[1.218,-7.751],[-3.46,-1.376],[-2.145,-1.66],[-0.368,7.354],[4.607,2.86]],"v":[[443.903,153.258],[438.46,145.376],[432.259,139.219],[423.084,146.294],[431.643,155.64]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[2.204,10.038],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-2.349,-10.7],[-4.331,14.842],[8.508,9.457]],"v":[[435.403,157.758],[429.46,144.376],[416.698,122.052],[397.806,110.811],[409.035,143.781]]}],"t":56.424},{"t":65.767578125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[398.555,63.389]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":44.744},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.912},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":65.768},{"t":66.935546875}]},"p":{"a":0,"ix":2,"k":[247.555,63.389]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[6.44,1.778],[0.112,-7.007],[-1.758,-0.668],[-1.776,3.348]],"o":[[-6.358,-1.755],[-0.09,5.641],[1.758,0.668],[1.776,-3.348]],"v":[[327.801,200.755],[318.571,212.996],[327.512,216.748],[332.295,210.494]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.324,7.335],[0.152,-9.506],[-2.384,-0.906],[-2.409,4.542]],"o":[[-8.624,-11.881],[-0.123,7.651],[2.384,0.906],[2.409,-4.542]],"v":[[349.124,166.381],[325.603,197.485],[337.731,202.574],[344.72,184.091]]}],"t":42.047},{"e":[{"c":true,"i":[[2.833,0.782],[0.049,-3.082],[-0.773,-0.294],[-0.781,1.473]],"o":[[-2.796,-0.772],[-0.04,2.481],[0.773,0.294],[0.781,-1.473]],"v":[[319.08,229.772],[315.02,235.155],[318.952,236.806],[321.056,234.055]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.44,1.778],[0.112,-7.007],[-1.758,-0.668],[-1.776,3.348]],"o":[[-6.358,-1.755],[-0.09,5.641],[1.758,0.668],[1.776,-3.348]],"v":[[327.801,200.755],[318.571,212.996],[327.512,216.748],[332.295,210.494]]}],"t":45.551},{"t":47.88671875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[337.186,183.275]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":40.879},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":42.047},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.887},{"t":49.0546875}]},"p":{"a":0,"ix":2,"k":[104.186,180.275]},"r":{"a":0,"ix":6,"k":79},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[-0.067,6.605],[-2.226,7.848],[13.842,-7.868],[0.828,-3.931]],"o":[[5.497,2.929],[0.118,-11.643],[0.881,-3.108],[-9.876,5.614],[-2.081,9.88]],"v":[[318.598,248.071],[327.692,237.239],[333.98,215.381],[326.709,199.194],[315.871,233.392]]}],"t":40.879},{"e":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[320.144,292.814],[323.852,281.417],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"t":45.551},{"e":[{"c":true,"i":[[-2.193,-0.398],[-1.633,1.625],[1.49,0.732],[1.104,0.616],[-2.243,-2.497]],"o":[[2.866,0.521],[1.8,-1.792],[-2.422,-1.19],[-2.874,-1.603],[1.691,1.882]],"v":[[326.268,298.715],[330.098,298.615],[330.467,294.009],[326.33,291.896],[323.493,296.095]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[320.144,292.814],[323.852,281.417],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"t":50.223},{"t":54.89453125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[323.852,221.168]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":39.711},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":40.879},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":54.895},{"t":56.0625}]},"p":{"a":0,"ix":2,"k":[54.852,164.168]},"r":{"a":0,"ix":6,"k":97},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.679,-3.237],[-0.517,4.848],[1.969,-0.558],[0.664,-2.606]],"o":[[8.09,10.017],[0.417,-3.897],[-1.969,0.558],[-0.969,3.802]],"v":[[405.614,313.083],[414.667,298.965],[410.333,294.572],[404.595,302.826]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-6.795,-5.998],[-6.373,12.088],[4.518,-1.6],[3.021,-4.16]],"o":[[13.088,11.553],[3.569,-6.769],[-3.223,1.142],[-3.021,4.16]],"v":[[385.32,338.854],[419.885,311.036],[406.184,302.873],[394.003,314.89]]}],"t":36.291},{"e":[{"c":true,"i":[[-0.988,-0.454],[0.126,1.819],[1.409,0.146],[0.852,-0.91]],"o":[[2.559,1.176],[-0.101,-1.455],[-0.32,-0.174],[-1.643,1.754]],"v":[[412.365,292.824],[414.874,290.201],[413.099,289.039],[411.343,289.658]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.679,-3.237],[-0.517,4.848],[1.969,-0.558],[0.664,-2.606]],"o":[[8.09,10.017],[0.417,-3.897],[-1.969,0.558],[-0.969,3.802]],"v":[[405.614,313.083],[414.667,298.965],[410.333,294.572],[404.595,302.826]]}],"t":40.322},{"t":43.1875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[407.156,310.85]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":35.039},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":36.207},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":43.188},{"t":44.35546875}]},"p":{"a":0,"ix":2,"k":[-131.844,173.85]},"r":{"a":0,"ix":6,"k":229},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-4.532,12.868],[10.898,-0.052],[5.649,8.585],[-4.064,-19.622],[-3.802,-3.34]],"o":[[2.607,-7.401],[-14.767,0.07],[-2.261,-3.445],[2.358,11.386],[11.289,9.917]],"v":[[385.463,348.975],[368.239,333.893],[335.471,309.489],[328.706,316.715],[346.925,345.112]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.029,1.172],[5.5,6.245],[4.887,9.041],[-7.602,-18.562],[-3.068,-4.025]],"o":[[7.317,-2.832],[-9.238,-10.49],[-6.119,-11.321],[5.184,12.658],[7.711,10.117]],"v":[[347.016,347.734],[352.084,327.928],[327.391,296.339],[308.941,297.289],[331.78,336.989]]}],"t":39.516},{"e":[{"c":true,"i":[[-8.094,2.97],[11.386,-1.475],[7.828,0.358],[-6.48,-3.777],[-4.068,-0.501]],"o":[[5.296,-1.944],[-9.486,4.744],[-2.961,0.265],[6.594,3.735],[10.126,1.246]],"v":[[400.442,345.247],[396.945,331.977],[375.01,335.171],[369.236,342.852],[382.771,346.994]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-4.532,12.868],[10.898,-0.052],[5.649,8.585],[-4.064,-19.622],[-3.802,-3.34]],"o":[[2.607,-7.401],[-14.767,0.07],[-2.261,-3.445],[2.358,11.386],[11.289,9.917]],"v":[[385.463,348.975],[368.239,333.893],[335.471,309.489],[328.706,316.715],[346.925,345.112]]}],"t":44.355},{"e":[{"c":true,"i":[[-1.227,0.43],[1.803,0.107],[2.109,0.356],[0.189,-1.037],[-2.011,-0.254]],"o":[[2.912,-1.02],[-1.289,-0.076],[-1.607,-0.272],[-0.125,0.685],[2.567,0.324]],"v":[[408.639,336.559],[408.766,332.761],[404.083,333.618],[401.638,334.535],[403.674,336.207]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-8.094,2.97],[11.386,-1.475],[7.828,0.358],[-6.48,-3.777],[-4.068,-0.501]],"o":[[5.296,-1.944],[-9.486,4.744],[-2.961,0.265],[6.594,3.735],[10.126,1.246]],"v":[[400.442,345.247],[396.945,331.977],[375.01,335.171],[369.236,342.852],[382.771,346.994]]}],"t":49.193},{"e":[{"c":true,"i":[[-0.997,0.637],[2.053,0.116],[0.765,-0.196],[-1.074,-1.941],[-1.524,1.037]],"o":[[1.081,-0.69],[-1.172,-0.066],[-1.436,0.367],[0.307,0.554],[0.686,-0.467]],"v":[[418.342,330.83],[417.401,328.631],[416.032,328.723],[414.592,331.789],[416.978,331.8]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.227,0.43],[1.803,0.107],[2.109,0.356],[0.189,-1.037],[-2.011,-0.254]],"o":[[2.912,-1.02],[-1.289,-0.076],[-1.607,-0.272],[-0.125,0.685],[2.567,0.324]],"v":[[408.639,336.559],[408.766,332.761],[404.083,333.618],[401.638,334.535],[403.674,336.207]]}],"t":54.033},{"t":59.677734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[328.814,317.986]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":38.543},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":39.711},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":59.566},{"t":60.734375}]},"p":{"a":0,"ix":2,"k":[-60.186,155.986]},"r":{"a":0,"ix":6,"k":108},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-19.408,3.137],[-19.5,-21],[-46.37,-67.073],[49.191,-113.654],[47.576,19.36],[54.339,-14.267],[23.774,17.431],[32.642,42.74]],"o":[[99,-16],[38.289,41.234],[32.013,46.306],[-14.415,33.304],[-65.513,-26.659],[-47.762,12.54],[-35.67,-26.152],[-33.953,-44.457]],"v":[[32,-184],[142.5,-166],[204.373,-56.72],[223.746,148.873],[69.527,166.82],[-56.312,159.032],[-196.774,161.569],[-256.642,8.26]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[7.321,31.724],[-25.23,-11.681],[-44.123,-48.72],[32.583,-56.711],[37.658,17.892],[48.518,-11.655],[18.476,12.879],[34.214,46.676]],"o":[[-4.5,-19.5],[54,25],[48.026,53.029],[-34.691,60.381],[-44.087,-20.946],[-48.518,11.655],[-35.723,-24.902],[-30.244,-41.259]],"v":[[28.5,-184.5],[124,-182],[207.225,-56.11],[229.302,145.073],[73.942,176.399],[-65.398,154.268],[-206.927,155.694],[-260.214,4.324]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-31.28,-9.029],[-26.684,-10.45],[-46.732,-42.263],[61.896,-78.899],[30.339,16.905],[26.961,-22.519],[17.029,21.172],[12.787,36.703]],"o":[[48.5,14],[71.5,28],[22.05,19.941],[-22.042,28.097],[-45.625,-25.423],[-40.175,33.556],[-30.84,-38.342],[-11.284,-32.387]],"v":[[28.5,-187],[125.5,-178],[205.738,-58.182],[222.096,154.749],[75.499,174.794],[-60.914,157.995],[-202.724,155.315],[-258.787,0.297]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":25.695},{"t":49.0546875}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":12.848},{"t":36.20703125}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.207843154669,0.521568655968,0.98431378603,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":11}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":11,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[0,-59,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[0,5,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[110],"t":4.033},{"t":36.291015625}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[162,162,100],"t":4.033},{"t":29.033203125}]}},"nm":"Shape Layer 3","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-9.478,-5.703],[-2.937,5.985],[0.706,8.203],[1.043,-16.034],[3.425,-6.409]],"o":[[6.508,3.916],[7.707,-15.706],[-0.975,-11.327],[-0.804,12.36],[-4.803,8.987]],"v":[[401.486,233.991],[421.051,218.79],[427.182,171.638],[410.614,174.093],[398.87,211.585]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.478,-5.703],[-2.937,5.985],[0.706,8.203],[1.043,-16.034],[3.425,-6.409]],"o":[[6.508,3.916],[7.707,-15.706],[-0.975,-11.327],[-0.804,12.36],[-4.803,8.987]],"v":[[401.486,233.991],[419.019,214.743],[427.182,171.638],[410.614,174.093],[402.747,212.047]]}],"t":33.871},{"e":[{"c":true,"i":[[-7.901,-5.866],[-5.204,5.248],[0.552,15.963],[2.497,-10.999],[16.333,-11.642]],"o":[[6.138,4.708],[10.993,-11.085],[-0.312,-9.012],[-3.273,14.414],[-6.691,9.19]],"v":[[382.683,247.373],[403.219,239.01],[422.998,195.364],[410.31,188.564],[383.558,225.318]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-9.478,-5.703],[-2.937,5.985],[0.706,8.203],[1.043,-16.034],[3.425,-6.409]],"o":[[6.508,3.916],[7.707,-15.706],[-0.975,-11.327],[-0.804,12.36],[-4.803,8.987]],"v":[[401.486,233.991],[421.051,218.79],[427.182,171.638],[410.614,174.093],[398.87,211.585]]}],"t":44.355},{"e":[{"c":true,"i":[[-6.324,-6.028],[-5.645,6.114],[-6.999,14.134],[9.853,-17.471],[23.111,-19.238]],"o":[[5.769,5.499],[22.604,-24.479],[7.752,-15.655],[-10.82,19.184],[-9.777,8.138]],"v":[[363.983,263.669],[385.386,259.231],[418.815,219.091],[408.306,205.927],[371.285,240.06]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.901,-5.866],[-5.204,5.248],[0.552,15.963],[2.497,-10.999],[16.333,-11.642]],"o":[[6.138,4.708],[10.993,-11.085],[-0.312,-9.012],[-3.273,14.414],[-6.691,9.19]],"v":[[382.683,247.373],[403.219,239.01],[422.998,195.364],[410.31,188.564],[383.558,225.318]]}],"t":46.773},{"e":[{"c":true,"i":[[-7.27,-0.812],[-1.416,8.2],[-6.694,8.68],[18.019,-8.81],[3.481,-19.9]],"o":[[7.798,0.871],[2.93,-16.961],[6.69,-8.675],[-13.89,6.791],[-2.192,12.53]],"v":[[357.253,291.519],[373.936,278.357],[384.557,249.111],[382.687,232.767],[348.497,273.634]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-6.324,-6.028],[-5.645,6.114],[-6.999,14.134],[9.853,-17.471],[23.111,-19.238]],"o":[[5.769,5.499],[22.604,-24.479],[7.752,-15.655],[-10.82,19.184],[-9.777,8.138]],"v":[[363.983,263.669],[385.386,259.231],[418.815,219.091],[408.306,205.927],[371.285,240.06]]}],"t":49.193},{"e":[{"c":true,"i":[[-2.752,2.958],[1.788,2.62],[0.924,3.673],[1.499,-4.39],[-1.288,-4.509]],"o":[[3.714,-3.993],[-1.459,-2.138],[-0.623,-2.477],[-1.193,3.495],[1.036,3.624]],"v":[[359.979,298.683],[359.906,292.026],[357.126,286.36],[352.062,284.793],[351.988,295.291]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.27,-0.812],[-1.416,8.2],[-6.694,8.68],[18.019,-8.81],[3.481,-19.9]],"o":[[7.798,0.871],[2.93,-16.961],[6.69,-8.675],[-13.89,6.791],[-2.192,12.53]],"v":[[357.253,291.519],[373.936,278.357],[384.557,249.111],[382.687,232.767],[348.497,273.634]]}],"t":55.645},{"t":62.09765625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.478431403637,0.84705889225,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":43.215},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":44.383},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":61.902},{"t":63.0703125}]},"p":{"a":0,"ix":2,"k":[-133,-292]},"r":{"a":0,"ix":6,"k":33},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-13.079,6.417],[13.804,-3.257],[-3.342,-1.821],[-7.45,-1.822]],"o":[[13.842,-6.791],[-11.111,2.621],[11.078,6.036],[7.45,1.822]],"v":[[240.86,184],[183.299,160.668],[178.901,178.052],[211.47,186.061]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.079,6.417],[13.804,-3.257],[-3.342,-1.821],[-7.45,-1.822]],"o":[[13.842,-6.791],[-11.111,2.621],[11.078,6.036],[7.45,1.822]],"v":[[240.86,184],[183.299,160.668],[178.051,175.701],[211.47,186.061]]}],"t":33.871},{"e":[{"c":true,"i":[[-0.481,11.702],[12.009,-2.588],[-3.21,-0.747],[-6.422,-1.703]],"o":[[0.475,-11.551],[-9.667,2.084],[8.655,2.014],[6.422,1.703]],"v":[[177.664,166.721],[142.409,158.299],[139.551,175.054],[162.819,178.258]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.079,6.417],[13.804,-3.257],[-3.342,-1.821],[-7.45,-1.822]],"o":[[13.842,-6.791],[-11.111,2.621],[11.078,6.036],[7.45,1.822]],"v":[[240.86,184],[183.299,160.668],[178.901,178.052],[211.47,186.061]]}],"t":40.879},{"e":[{"c":true,"i":[[0.227,2.93],[2.915,-1.001],[0.014,-0.827],[-1.65,-0.234]],"o":[[-0.225,-2.892],[-2.347,0.806],[-0.014,0.827],[1.65,0.234]],"v":[[130.301,172.278],[123.858,170.29],[123.643,174.549],[126.945,175.592]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.481,11.702],[12.009,-2.588],[-3.21,-0.747],[-6.422,-1.703]],"o":[[0.475,-11.551],[-9.667,2.084],[8.655,2.014],[6.422,1.703]],"v":[[177.664,166.721],[142.409,158.299],[139.551,175.054],[162.819,178.258]]}],"t":44.383},{"t":50.22265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.478431403637,0.84705889225,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":39.711},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":40.879},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":50.223},{"t":51.390625}]},"p":{"a":0,"ix":2,"k":[-215,10]},"r":{"a":0,"ix":6,"k":-17},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.795,-1.654],[-0.094,6.531],[2.11,10.058],[2.206,-14.033],[-2.023,-4.639]],"o":[[5.808,3.437],[0.071,-4.912],[-0.836,-3.983],[-1.581,10.057],[2.916,6.687]],"v":[[323.226,281.826],[332.338,273.857],[322.17,243.788],[309.081,236.943],[316.032,275.062]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[-0.067,6.605],[3.054,7.565],[1.291,-5.694],[0.224,-4.011]],"o":[[5.497,2.929],[0.118,-11.643],[-2.98,-7.381],[-2.513,11.079],[-0.871,15.608]],"v":[[314.598,259.571],[323.692,245.239],[312.98,196.381],[299.709,202.194],[307.371,241.392]]}],"t":36.207},{"e":[{"c":true,"i":[[-2.205,1.491],[2.596,4.475],[3.862,3.441],[4.045,-5.587],[-3.484,-3.652]],"o":[[2.612,-1.766],[-1.522,-2.624],[-2.407,-2.145],[-4.817,6.654],[6.383,6.69]],"v":[[331.075,291.106],[331.84,281.644],[326.268,274.029],[315.877,263.087],[319.117,287.31]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.795,-1.654],[-0.094,6.531],[2.11,10.058],[2.206,-14.033],[-2.023,-4.639]],"o":[[5.808,3.437],[0.071,-4.912],[-0.836,-3.983],[-1.581,10.057],[2.916,6.687]],"v":[[323.226,281.826],[332.338,273.857],[322.17,243.788],[309.081,236.943],[316.032,275.062]]}],"t":40.879},{"e":[{"c":true,"i":[[-2.219,0.206],[-1.135,2.005],[1.633,0.304],[1.229,0.296],[-2.832,-1.801]],"o":[[2.9,-0.269],[1.252,-2.21],[-2.653,-0.495],[-3.199,-0.771],[2.135,1.358]],"v":[[330.207,293.678],[333.87,292.552],[332.987,288.016],[328.434,287.093],[326.831,291.901]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.205,1.491],[2.596,4.475],[3.862,3.441],[4.045,-5.587],[-3.484,-3.652]],"o":[[2.612,-1.766],[-1.522,-2.624],[-2.407,-2.145],[-4.817,6.654],[6.383,6.69]],"v":[[331.075,291.106],[331.84,281.644],[326.268,274.029],[315.877,263.087],[319.117,287.31]]}],"t":45.551},{"t":50.22265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.478431403637,0.84705889225,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[311.738,226.23]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":35.039},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":36.207},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":50.223},{"t":51.390625}]},"p":{"a":0,"ix":2,"k":[-155.262,151.23]},"r":{"a":0,"ix":6,"k":123},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[4.248,3.123],[2,-4.932],[-1.974,0.319],[-2.787,2.913]],"o":[[-7.325,-5.384],[-2.255,5.56],[1.974,-0.319],[4.226,-4.416]],"v":[[-179.774,265.316],[-193.599,273.114],[-189.441,280.448],[-184.075,275.347]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.478,-2.921],[2.11,-8.245],[-1.668,1.103],[-0.976,3.911]],"o":[[-9.641,4.347],[-1.488,5.813],[4.132,-2.733],[1.617,-6.481]],"v":[[-200.047,280.328],[-209.579,310.509],[-203.3,317.556],[-197.226,301.916]]}],"t":33.871},{"e":[{"c":true,"i":[[1.183,0.665],[0,-1.37],[-0.508,0.082],[-0.511,0.903]],"o":[[-0.405,-0.228],[0,1.112],[0.508,-0.082],[0.316,-0.558]],"v":[[-177.262,258.624],[-178.89,259.73],[-178.206,261.168],[-176.567,260.048]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[4.248,3.123],[2,-4.932],[-1.974,0.319],[-2.787,2.913]],"o":[[-7.325,-5.384],[-2.255,5.56],[1.974,-0.319],[4.226,-4.416]],"v":[[-179.774,265.316],[-193.599,273.114],[-189.441,280.448],[-184.075,275.347]]}],"t":37.902},{"e":[{"c":true,"i":[[0.836,1.069],[0.528,-1.265],[-0.501,-0.12],[-0.82,0.637]],"o":[[-0.286,-0.366],[-0.428,1.026],[0.501,0.12],[0.506,-0.393]],"v":[[-176.806,258.966],[-178.735,259.36],[-178.657,260.95],[-176.713,260.548]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.183,0.665],[0,-1.37],[-0.508,0.082],[-0.511,0.903]],"o":[[-0.405,-0.228],[0,1.112],[0.508,-0.082],[0.316,-0.558]],"v":[[-177.262,258.624],[-178.89,259.73],[-178.206,261.168],[-176.567,260.048]]}],"t":41.045},{"t":41.12890625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.478431403637,0.84705889225,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-201.517,300.108]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.869},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":34.037},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":41.045},{"t":42.21484375}]},"p":{"a":0,"ix":2,"k":[-223.284,-41.979]},"r":{"a":0,"ix":6,"k":-20},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-1.656,2.794],[7.194,0.91],[5.037,6.761],[0.877,-7.851],[-5.98,-1.554]],"o":[[4,-6.75],[-12.603,-1.594],[-1.994,-2.677],[-1.303,11.668],[10.729,2.788]],"v":[[-144.875,343.375],[-156.511,333.024],[-191.674,311.069],[-199.377,315.851],[-169.77,342.804]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.656,2.794],[7.707,-3.14],[9.75,3.25],[-9.11,-17.87],[-4.9,-1.267]],"o":[[4,-6.75],[-13.5,5.5],[-3.861,-1.287],[6.5,12.75],[12.316,3.184]],"v":[[-124.5,346.25],[-136.25,337.25],[-179.75,327.75],[-189.5,331.25],[-149.6,347.767]]}],"t":33.871},{"e":[{"c":true,"i":[[-2.466,2.114],[6.682,4.96],[0.323,10.272],[6.254,-6.701],[-2.722,-4.266]],"o":[[5.25,-4.5],[-11.706,-8.688],[-0.128,-4.068],[-9.764,10.463],[7.439,11.659]],"v":[[-176.75,335.5],[-180.772,323.048],[-195.097,297.389],[-201.754,289.451],[-199.939,319.091]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.656,2.794],[7.194,0.91],[5.037,6.761],[0.877,-7.851],[-5.98,-1.554]],"o":[[4,-6.75],[-12.603,-1.594],[-1.994,-2.677],[-1.303,11.668],[10.729,2.788]],"v":[[-144.875,343.375],[-156.511,333.024],[-191.674,311.069],[-199.377,315.851],[-169.77,342.804]]}],"t":37.375},{"e":[{"c":true,"i":[[-3,-0.5],[0.128,4.198],[-0.802,5.812],[7.132,-5.649],[0.411,-5.359]],"o":[[3,0.5],[-0.128,-4.198],[1.118,-3.763],[-5.843,5.427],[-0.411,5.359]],"v":[[-199,310.25],[-192.622,303.198],[-190.057,288.853],[-196.364,282.839],[-204.089,300.391]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.466,2.114],[6.682,4.96],[0.323,10.272],[6.254,-6.701],[-2.722,-4.266]],"o":[[5.25,-4.5],[-11.706,-8.688],[-0.128,-4.068],[-9.764,10.463],[7.439,11.659]],"v":[[-176.75,335.5],[-180.772,323.048],[-195.097,297.389],[-201.754,289.451],[-199.939,319.091]]}],"t":40.879},{"e":[{"c":true,"i":[[-1.144,0],[-1.307,2.623],[-0.547,0.999],[2.718,-1.742],[0.525,-1.315]],"o":[[0.968,0],[0.184,-0.369],[0.686,-1.254],[-1.137,0.729],[-0.374,0.936]],"v":[[-189.856,280.797],[-186.342,279.141],[-185.436,276.892],[-187.574,275.225],[-190.187,277.835]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3,-0.5],[0.128,4.198],[-0.802,5.812],[7.132,-5.649],[0.411,-5.359]],"o":[[3,0.5],[-0.128,-4.198],[1.118,-3.763],[-5.843,5.427],[-0.411,5.359]],"v":[[-199,310.25],[-192.622,303.198],[-190.057,288.853],[-196.364,282.839],[-204.089,300.391]]}],"t":44.383},{"t":47.88671875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.478431403637,0.84705889225,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[-158.706,337.807]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.703},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":33.871},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.887},{"t":49.0546875}]},"p":{"a":0,"ix":2,"k":[-206.637,100.803]},"r":{"a":0,"ix":6,"k":52},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-5.885,-18.758],[27.378,-25.069],[32,-25],[43.701,-23.415],[29.194,-19.942],[19.717,46.737],[0.948,16.073],[-2.882,19.018],[-17.763,21.089]],"o":[[16,51],[-41.5,38],[-44.473,34.744],[-26.163,14.018],[-43.249,29.543],[-12.61,-29.891],[-0.948,-16.073],[7.193,-47.469],[17.763,-21.089]],"v":[[160,-121],[159.5,18],[101,106],[-27.584,128.335],[-95.515,150.94],[-207.717,102.263],[-217.944,14.161],[-232.193,-106.531],[-185.004,-197.671]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[1.135,-32.538],[40.581,-42.204],[59.5,-4.5],[57.859,-13.541],[35.181,-22.373],[19.405,41.321],[0.434,29.526],[-0.99,13.305],[-10.765,15.342]],"o":[[-1.5,43],[-25,26],[-71.34,5.395],[-40.448,9.466],[-40.591,25.814],[-14.518,-30.915],[-0.434,-29.527],[4.118,-55.326],[10.765,-15.342]],"v":[[161.5,-121.5],[153,28],[73.5,117],[-27.859,122.041],[-93.917,153.889],[-213.195,93.897],[-219.069,9.063],[-233.118,-108.674],[-191.644,-191.575]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[6.725,-31.855],[43.5,-41],[35,-35],[64.433,-24.076],[29.307,-18.638],[20.481,33.129],[-3.033,17.148],[-3.437,16.453],[-14.649,15.745]],"o":[[-9.5,45],[-36.814,34.698],[-21.022,21.022],[-33.451,12.5],[-35.181,22.373],[-22.251,-35.992],[3.033,-17.148],[11.33,-54.236],[14.649,-15.745]],"v":[[162.5,-116],[145,25.5],[101,104],[-14.431,120.704],[-93.59,151.677],[-209.182,101.669],[-219.707,4.839],[-230.33,-112.764],[-185.666,-194.127]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":18.688},{"t":45.55078125}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":4.672},{"t":28.03125}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.992156922817,0.478431403637,0.84705889225,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":8}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":12,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[2,-61,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[2,3,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[145],"t":4.033},{"t":41.935546875}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[165,165,100],"t":4.033},{"t":25.806640625}]}},"nm":"Shape Layer 1","op":794,"parent":1,"shapes":[{"cix":2,"hd":true,"it":[{"hd":true,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.361,6.661],[9.412,10.595],[-3.111,-5.282],[-3.29,-2.014]],"o":[[-1.75,-8.563],[-6.067,-6.83],[3.113,5.286],[3.29,2.014]],"v":[[312.912,-55.962],[297.26,-71.67],[284.883,-66.488],[296.153,-55.583]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.549,10.146],[19.703,7.766],[-7.715,-4.94],[-5.539,-1.593]],"o":[[0.786,-14.537],[-12.701,-5.006],[7.72,4.943],[5.539,1.593]],"v":[[357.714,-44.424],[321.123,-60.295],[308.775,-42.809],[333.721,-37.218]]}],"t":42.047},{"e":[{"c":true,"i":[[0.541,4.341],[2.202,2.804],[-1.99,-5.435],[-2.712,-2.43]],"o":[[-1.02,-8.19],[-5.328,-6.785],[1.991,5.439],[2.712,2.43]],"v":[[291.516,-70.561],[289.004,-79.556],[280.166,-76.97],[282.182,-73.418]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.361,6.661],[9.412,10.595],[-3.111,-5.282],[-3.29,-2.014]],"o":[[-1.75,-8.563],[-6.067,-6.83],[3.113,5.286],[3.29,2.014]],"v":[[312.912,-55.962],[297.26,-71.67],[284.883,-66.488],[296.153,-55.583]]}],"t":45.551},{"t":47.88671875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.600000023842,0.333333343267,0.98431378603,1]},"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":40.879},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":42.047},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.887},{"t":49.0546875}]},"p":{"a":0,"ix":2,"k":[-559,161]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":true,"it":[{"hd":true,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[0.295,2.561],[6.597,-0.334],[9.416,-2.383],[-12.552,-3.048],[-9.548,3.233]],"o":[[-0.807,-7.006],[-9.833,0.497],[-11.045,2.795],[11.875,2.883],[11.707,-3.964]],"v":[[-175.469,106.444],[-193.814,106.123],[-222.955,104.205],[-220.948,123.048],[-189.707,120.464]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.223,1.907],[4.317,-3.88],[4.344,-5.703],[-12.641,5.995],[-11.776,9.837]],"o":[[-2.955,-4.606],[-14.334,12.885],[-6.777,8.897],[9.702,-4.602],[12.608,-10.531]],"v":[[-132.286,80.478],[-150.666,79.115],[-190.95,104.669],[-179.645,115.553],[-146.608,98.531]]}],"t":43.215},{"e":[{"c":true,"i":[[-0.178,2.15],[5.427,0.92],[6.446,1.2],[-7.449,-5.526],[-10.039,-0.321]],"o":[[0.41,-5.607],[-8.68,-1.612],[-7.02,-0.735],[6.848,4.674],[9.559,-0.463]],"v":[[-211.051,113.151],[-220.9,108.102],[-242.142,100.216],[-246.327,113.453],[-223.511,119.606]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[0.295,2.561],[6.597,-0.334],[9.416,-2.383],[-12.552,-3.048],[-9.548,3.233]],"o":[[-0.807,-7.006],[-9.833,0.497],[-11.045,2.795],[11.875,2.883],[11.707,-3.964]],"v":[[-175.469,106.444],[-193.814,106.123],[-222.955,104.205],[-220.948,123.048],[-189.707,120.464]]}],"t":46.719},{"e":[{"c":true,"i":[[-0.359,1.754],[4.357,1.435],[3.609,3.904],[-3.061,-6.971],[-10.526,-2.514]],"o":[[0.866,-4.237],[-7.705,-2.538],[-3.061,-3.312],[2.422,5.517],[7.305,1.745]],"v":[[-242.804,109.709],[-244.795,101.288],[-259.109,90.346],[-267.672,98.483],[-252.555,110.255]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.178,2.15],[5.427,0.92],[6.446,1.2],[-7.449,-5.526],[-10.039,-0.321]],"o":[[0.41,-5.607],[-8.68,-1.612],[-7.02,-0.735],[6.848,4.674],[9.559,-0.463]],"v":[[-211.051,113.151],[-220.9,108.102],[-242.142,100.216],[-246.327,113.453],[-223.511,119.606]]}],"t":49.055},{"e":[{"c":true,"i":[[-0.66,0.756],[0.251,1.021],[1.433,0.64],[-1.479,-2.424],[-1.953,-0.893]],"o":[[1.176,-1.347],[-0.475,-1.933],[-2.309,-1.031],[0.976,1.6],[1.024,0.469]],"v":[[-266.971,91.259],[-267.117,88.039],[-270.218,85.624],[-273.387,88.797],[-270.547,91.768]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.359,1.754],[4.357,1.435],[3.609,3.904],[-3.061,-6.971],[-10.526,-2.514]],"o":[[0.866,-4.237],[-7.705,-2.538],[-3.061,-3.312],[2.422,5.517],[7.305,1.745]],"v":[[-242.804,109.709],[-244.795,101.288],[-259.109,90.346],[-267.672,98.483],[-252.555,110.255]]}],"t":51.391},{"t":53.7265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.600000023842,0.333333343267,0.98431378603,1]},"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":42.047},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":43.215},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":53.727},{"t":54.89453125}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":true,"it":[{"hd":true,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-1.442,-2.91],[-5.045,6.618],[-8.843,5.238],[19.731,-3.608],[11.564,-12.167]],"o":[[2.661,5.368],[10.435,-13.688],[8.338,-4.938],[-16.451,3.008],[-7.711,8.114]],"v":[[-49.911,85.632],[-30.934,79.381],[5.662,61.938],[-3.549,45.992],[-42.314,67.417]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.417,-2.922],[-8.084,1.975],[-8.679,-0.998],[19.717,-3.683],[15.906,-1.755]],"o":[[-3.423,7.06],[20.948,-5.118],[14.1,1.621],[-15.198,2.839],[-12.644,1.395]],"v":[[-22.2,53.363],[-5.198,62.868],[38.929,56.248],[40.089,39.882],[3.594,44.755]]}],"t":46.719},{"e":[{"c":true,"i":[[-3.124,-0.889],[-2.166,8.035],[-4.364,9.305],[8.677,-7.912],[1.189,-6.126]],"o":[[7.547,2.147],[4.481,-16.619],[4.651,-9.918],[-11.425,10.417],[-2.424,12.487]],"v":[[-59.331,139.22],[-52.229,126.417],[-44.784,102.206],[-52.927,81.787],[-64.055,109.753]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.442,-2.91],[-5.045,6.618],[-8.843,5.238],[19.731,-3.608],[11.564,-12.167]],"o":[[2.661,5.368],[10.435,-13.688],[8.338,-4.938],[-16.451,3.008],[-7.711,8.114]],"v":[[-49.911,85.632],[-30.934,79.381],[5.662,61.938],[-3.549,45.992],[-42.314,67.417]]}],"t":52.559},{"e":[{"c":true,"i":[[-2.424,1.108],[0.428,2.048],[0.664,2.367],[0.439,-3.782],[-0.471,-1.952]],"o":[[3.272,-1.496],[-0.349,-1.671],[-0.78,-2.782],[-0.253,2.185],[0.583,2.417]],"v":[[-61.64,148.162],[-60.004,144.086],[-61.22,140.032],[-66.247,138.315],[-65.654,144.077]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.124,-0.889],[-2.166,8.035],[-4.364,9.305],[8.677,-7.912],[1.189,-6.126]],"o":[[7.547,2.147],[4.481,-16.619],[4.651,-9.918],[-11.425,10.417],[-2.424,12.487]],"v":[[-59.331,139.22],[-52.229,126.417],[-44.784,102.206],[-52.927,81.787],[-64.055,109.753]]}],"t":59.566},{"t":65.40625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.600000023842,0.333333343267,0.98431378603,1]},"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":45.551},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":46.719},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":66.572},{"t":67.7421875}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":true,"it":[{"hd":true,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.973,-1.051],[-0.058,5.729],[-1.931,6.807],[12.005,-6.824],[0.718,-3.41]],"o":[[4.767,2.54],[0.102,-10.098],[0.764,-2.696],[-8.566,4.869],[-1.805,8.57]],"v":[[317.96,240.543],[325.848,231.148],[331.302,212.189],[324.995,198.15],[315.595,227.811]]}],"t":28.031},{"e":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[320.144,292.814],[323.852,281.417],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"t":32.703},{"e":[{"c":true,"i":[[-2.193,-0.398],[-1.633,1.625],[1.49,0.732],[1.104,0.616],[-2.243,-2.497]],"o":[[2.866,0.521],[1.8,-1.792],[-2.422,-1.19],[-2.874,-1.603],[1.691,1.882]],"v":[[326.268,298.715],[330.098,298.615],[330.467,294.009],[326.33,291.896],[323.493,296.095]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[320.144,292.814],[323.852,281.417],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"t":37.375},{"t":42.046875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.600000023842,0.333333343267,0.98431378603,1]},"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":26.863},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":28.031},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":42.047},{"t":43.21484375}]},"p":{"a":0,"ix":2,"k":[-750,-113]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":true,"it":[{"hd":true,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.628,-2.167],[-0.46,-1.816],[-0.691,0.323],[0.473,1.463]],"o":[[-0.536,0.714],[0.561,2.218],[0.691,-0.323],[-0.473,-1.463]],"v":[[-428.61,106.531],[-429.644,110.032],[-426.919,110.33],[-426.223,106.575]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.596,-4.38],[0.25,-4.125],[-2,0],[-0.5,4]],"o":[[-2.875,2.25],[-0.363,5.989],[2,0],[0.5,-4]],"v":[[-410.5,67.375],[-415.5,74.5],[-410,80],[-401.875,71.25]]}],"t":33.871},{"t":39.7109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.6,0.333333333333,0.984313785329,1]},"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.703},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":33.871},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":39.711},{"t":40.87890625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":true,"it":[{"hd":true,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-0.96,3.103],[7.296,-4.219],[-0.476,-4.042],[-7.741,3.727],[-7.442,9.586]],"o":[[2.869,-9.275],[-12.619,7.297],[0.476,4.042],[2.506,-1.206],[7.572,-9.753]],"v":[[-371.718,45.678],[-389.895,46.753],[-413.098,71.506],[-403.921,77.414],[-389.897,60.579]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.24,3.239],[7.707,-3.14],[0.75,-4],[-8.5,1.25],[-5.43,2.334]],"o":[[1,-13.5],[-13.5,5.5],[-0.75,4],[2.752,-0.405],[11.344,-4.876]],"v":[[-355,42.25],[-375.25,36.75],[-400.25,57.25],[-393,62.75],[-378.6,52.767]]}],"t":33.871},{"e":[{"c":true,"i":[[-2.713,4.211],[3.088,-3.743],[-0.635,-2.98],[-5.512,3.313],[-2.768,8.653]],"o":[[3.937,-6.108],[-6.944,8.417],[0.635,2.98],[1.784,-1.073],[0.543,-1.697]],"v":[[-402.446,71.108],[-408.746,69.388],[-417.03,85.045],[-409.782,88.814],[-406.45,77.669]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.96,3.103],[7.296,-4.219],[-0.476,-4.042],[-7.741,3.727],[-7.442,9.586]],"o":[[2.869,-9.275],[-12.619,7.297],[0.476,4.042],[2.506,-1.206],[7.572,-9.753]],"v":[[-371.718,45.678],[-389.895,46.753],[-413.098,71.506],[-403.921,77.414],[-389.897,60.579]]}],"t":38.543},{"e":[{"c":true,"i":[[0.561,1.74],[0.093,-1.247],[-0.579,-0.949],[-0.806,0.839],[0.024,1.087]],"o":[[-0.306,-0.95],[-0.067,0.907],[0.579,0.949],[0.332,-0.346],[-0.014,-0.65]],"v":[[-418.312,92.219],[-420.136,94.516],[-419.871,96.273],[-418.145,95.819],[-417.925,94.428]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.713,4.211],[3.088,-3.743],[-0.635,-2.98],[-5.512,3.313],[-2.768,8.653]],"o":[[3.937,-6.108],[-6.944,8.417],[0.635,2.98],[1.784,-1.073],[0.543,-1.697]],"v":[[-402.446,71.108],[-408.746,69.388],[-417.03,85.045],[-409.782,88.814],[-406.45,77.669]]}],"t":43.215},{"t":49.0546875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.600000023842,0.333333343267,0.98431378603,1]},"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":32.703},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":33.871},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":49.055},{"t":50.22265625}]},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-1,22],[123.5,-13],[33,-17],[29,0],[17,19],[-9.499,24.13],[0.729,36.777],[-32.887,6.622],[-8.011,3.213]],"o":[[0.747,-16.43],[-30.398,3.2],[-33,17],[-29,0],[-19.792,-22.12],[9.089,-23.087],[-1.43,-72.116],[45.69,-9.199],[8.011,-3.213]],"v":[[156,18.5],[-15,54],[-134.5,86],[-209,103],[-270,52],[-267.74,-21.23],[-243.729,-110.777],[-162.559,-228.388],[-57.069,-230.979]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-34.711,-31.625],[16.377,-0.224],[49,-12.5],[29.512,3.587],[6.943,26.458],[-3.669,11.469],[0.093,10.659],[-49.053,-0.468],[-9.838,1.808]],"o":[[22.5,20.5],[-36.5,0.5],[-35.969,9.176],[-29.512,-3.586],[-9.25,-35.25],[7.304,-22.831],[-0.591,-67.706],[9.37,0.089],[9.838,-1.808]],"v":[[154.5,18],[-13.5,57.5],[-128,83],[-203.5,95.5],[-275.75,49.5],[-263.084,-23.438],[-248.409,-113.294],[-156.915,-236.114],[-54.184,-231.84]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[24,-22],[50.828,-3.279],[58.5,-25.5],[29.512,3.586],[8.5,26],[-8.802,24.037],[-1.102,8.68],[-52.994,14.316],[-11.989,2.514]],"o":[[-24,22],[-46.5,3],[-34.029,14.833],[-29.512,-3.587],[-9.223,-28.212],[11.83,-32.306],[12.236,-96.423],[34.114,-9.216],[11.989,-2.514]],"v":[[155.5,15],[-15.5,53],[-134.5,78],[-210,102],[-267,57.5],[-267.38,-26.045],[-254.236,-107.577],[-160.181,-236.934],[-52.471,-232.199]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":17.52},{"t":50.22265625}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":4.672},{"t":37.375}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.600000023842,0.333333343267,0.98431378603,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":10}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":13,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[0,-60,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[0,4,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[120],"t":9.678},{"t":45.966796875}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[135,135,100],"t":9.678},{"t":28.2265625}]}},"nm":"Shape Layer 6","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-3.363,-5.909],[-12.237,-7.148],[4.597,4.054],[3.752,0.892]],"o":[[4.323,7.596],[7.888,4.608],[-4.601,-4.057],[-3.752,-0.892]],"v":[[312.812,-57.316],[332.569,-47.245],[342.724,-56.015],[328.625,-62.881]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.952,-9.013],[-18.451,-4.052],[7.493,3.259],[5.104,0.62]],"o":[[1.364,12.913],[11.894,2.612],[-7.498,-3.261],[-5.104,-0.62]],"v":[[270.136,-60.913],[304.606,-52.112],[313.007,-69.259],[290.247,-70.654]]}],"t":50.807},{"e":[{"c":true,"i":[[-2.93,-3.249],[-3.411,-1.038],[4.744,3.316],[3.615,0.439]],"o":[[5.527,6.129],[8.253,2.511],[-4.747,-3.319],[-3.615,-0.439]],"v":[[344.43,-43.937],[351.64,-38.002],[357.405,-45.184],[353.718,-46.941]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.363,-5.909],[-12.237,-7.148],[4.597,4.054],[3.752,0.892]],"o":[[4.323,7.596],[7.888,4.608],[-4.601,-4.057],[-3.752,-0.892]],"v":[[312.812,-57.316],[332.569,-47.245],[342.724,-56.015],[328.625,-62.881]]}],"t":54.561},{"t":56.896484375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[292.434,-60.719]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":49.639},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":50.807},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":56.896},{"t":58.064453125}]},"p":{"a":0,"ix":2,"k":[17.434,-251.719]},"r":{"a":0,"ix":6,"k":-29},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.752,1.725],[4.516,6.989],[0.005,10.277],[-0.539,-20.051],[-15.062,-27.206]],"o":[[6.648,-4.167],[-9.341,-14.457],[-0.009,-17.469],[0.416,15.456],[6.161,11.129]],"v":[[424.873,148.291],[420.968,130.502],[407.009,76.969],[389.084,71.044],[399.416,129.381]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.663,-1.858],[-4.667,6.89],[1.817,10.116],[-0.539,-20.051],[1.627,-4.792]],"o":[[6.435,4.49],[9.653,-14.25],[-2.509,-13.969],[0.416,15.456],[-4.089,12.045]],"v":[[390,106.8],[404.847,96.25],[408.509,37.469],[388.084,33.044],[385.378,84.251]]}],"t":49.945},{"e":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[2.204,10.038],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-2.349,-10.7],[-4.331,14.842],[8.508,9.457]],"v":[[435.403,157.758],[429.46,144.376],[416.698,122.052],[397.806,110.811],[409.035,143.781]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.752,1.725],[4.516,6.989],[0.005,10.277],[-0.539,-20.051],[-15.062,-27.206]],"o":[[6.648,-4.167],[-9.341,-14.457],[-0.009,-17.469],[0.416,15.456],[6.161,11.129]],"v":[[424.873,148.291],[420.968,130.502],[407.009,76.969],[389.084,71.044],[399.416,129.381]]}],"t":54.617},{"e":[{"c":true,"i":[[-0.903,5.742],[4.241,1.687],[4.241,3.281],[0.416,-8.294],[-5.302,-3.291]],"o":[[1.218,-7.751],[-3.46,-1.376],[-2.145,-1.66],[-0.368,7.354],[4.607,2.86]],"v":[[443.903,153.258],[438.46,145.376],[432.259,139.219],[423.084,146.294],[431.643,155.64]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.591,1.958],[5.109,6.569],[2.204,10.038],[5.619,-19.255],[-4.174,-4.639]],"o":[[6.259,-4.731],[-10.567,-13.587],[-2.349,-10.7],[-4.331,14.842],[8.508,9.457]],"v":[[435.403,157.758],[429.46,144.376],[416.698,122.052],[397.806,110.811],[409.035,143.781]]}],"t":60.455},{"t":69.798828125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[396.555,65.137]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":48.775},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":49.945},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":69.799},{"t":70.966796875}]},"p":{"a":0,"ix":2,"k":[79.555,-281.863]},"r":{"a":0,"ix":6,"k":-114},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[6.44,1.778],[0.112,-7.007],[-1.758,-0.668],[-1.776,3.348]],"o":[[-6.358,-1.755],[-0.09,5.641],[1.758,0.668],[1.776,-3.348]],"v":[[327.801,200.755],[318.571,212.996],[327.512,216.748],[332.295,210.494]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[5.51,0.798],[2.848,-11.949],[-3.735,7.145],[0.01,5.141]],"o":[[-14.529,-2.104],[-1.774,7.444],[4.86,-9.297],[-0.018,-8.885]],"v":[[329.808,160.641],[322.057,196.166],[335.144,203.18],[339.526,181.612]]}],"t":47.58},{"e":[{"c":true,"i":[[2.833,0.782],[0.049,-3.082],[-0.773,-0.294],[-0.781,1.473]],"o":[[-2.796,-0.772],[-0.04,2.481],[0.773,0.294],[0.781,-1.473]],"v":[[319.08,229.772],[315.02,235.155],[318.952,236.806],[321.056,234.055]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.44,1.778],[0.112,-7.007],[-1.758,-0.668],[-1.776,3.348]],"o":[[-6.358,-1.755],[-0.09,5.641],[1.758,0.668],[1.776,-3.348]],"v":[[327.801,200.755],[318.571,212.996],[327.512,216.748],[332.295,210.494]]}],"t":51.334},{"t":53.669921875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[334.293,183.16]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":46.412},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":47.58},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":53.67},{"t":54.837890625}]},"p":{"a":0,"ix":2,"k":[267.293,-247.84]},"r":{"a":0,"ix":6,"k":-28},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[-0.067,6.605],[-2.226,7.848],[13.842,-7.868],[0.828,-3.931]],"o":[[5.497,2.929],[0.118,-11.643],[0.881,-3.108],[-9.876,5.614],[-2.081,9.88]],"v":[[318.598,248.071],[327.692,237.239],[333.98,215.381],[326.709,199.194],[315.871,233.392]]}],"t":46.912},{"e":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[320.144,292.814],[323.852,281.417],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.942,-1.376],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[3.606,1.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[311.144,276.814],[320.352,270.667],[322.523,242.13],[316.613,230.988],[307.709,269.07]]}],"t":51.584},{"e":[{"c":true,"i":[[-2.193,-0.398],[-1.633,1.625],[1.49,0.732],[1.104,0.616],[-2.243,-2.497]],"o":[[2.866,0.521],[1.8,-1.792],[-2.422,-1.19],[-2.874,-1.603],[1.691,1.882]],"v":[[326.268,298.715],[330.098,298.615],[330.467,294.009],[326.33,291.896],[323.493,296.095]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.144,1.186],[1.879,6.256],[0.977,8.62],[6.602,-5.678],[-0.896,-4.981]],"o":[[3.724,-1.405],[-1.102,-3.667],[-0.458,-4.044],[-7.863,6.762],[1.291,7.18]],"v":[[320.144,292.814],[323.852,281.417],[318.773,272.38],[312.863,261.238],[308.709,286.57]]}],"t":56.256},{"t":60.927734375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[322.121,224.023]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":45.746},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":46.912},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":60.928},{"t":62.09765625}]},"p":{"a":0,"ix":2,"k":[271.121,-187.977]},"r":{"a":0,"ix":6,"k":346},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-3.029,1.172],[10.666,-2.428],[5.654,8.583],[3.888,-19.677],[-3.068,-4.025]],"o":[[7.317,-2.832],[-14.214,3.235],[-2.239,-3.399],[-2.774,14.04],[7.711,10.117]],"v":[[387.004,343.266],[368.334,333.928],[335.518,309.566],[323.441,313.289],[347.839,341.19]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.029,1.172],[8.824,9.246],[5.654,8.583],[-7.246,-18.703],[-3.068,-4.025]],"o":[[7.317,-2.832],[-10.064,-10.546],[-2.239,-3.399],[6.33,16.34],[7.711,10.117]],"v":[[355.754,342.266],[352.084,327.928],[329.768,295.566],[310.599,298.407],[334.885,333.794]]}],"t":45.551},{"e":[{"c":true,"i":[[-2.948,-1.363],[14.416,6.822],[15.482,-1.566],[-9.209,-5.155],[-5.059,0.157]],"o":[[6.996,3.234],[-13.176,-6.235],[-4.049,0.41],[9.309,5.211],[14.161,-0.44]],"v":[[397.754,346.766],[399.334,338.678],[367.268,330.816],[359.441,341.539],[376.839,344.44]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-3.029,1.172],[10.666,-2.428],[5.654,8.583],[3.888,-19.677],[-3.068,-4.025]],"o":[[7.317,-2.832],[-14.214,3.235],[-2.239,-3.399],[-2.774,14.04],[7.711,10.117]],"v":[[387.004,343.266],[368.334,333.928],[335.518,309.566],[323.441,313.289],[347.839,341.19]]}],"t":49.777},{"e":[{"c":true,"i":[[-2.948,-1.363],[4.166,7.572],[6.982,2.184],[2.809,-5.289],[-5.021,-0.635]],"o":[[6.996,3.234],[-1.554,-2.824],[-3.884,-1.215],[-0.816,1.536],[6.411,0.81]],"v":[[403.754,348.766],[410.584,342.178],[400.518,336.316],[390.691,339.289],[397.589,344.19]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.948,-1.363],[14.416,6.822],[15.482,-1.566],[-9.209,-5.155],[-5.059,0.157]],"o":[[6.996,3.234],[-13.176,-6.235],[-4.049,0.41],[9.309,5.211],[14.161,-0.44]],"v":[[397.754,346.766],[399.334,338.678],[367.268,330.816],[359.441,341.539],[376.839,344.44]]}],"t":54.449},{"e":[{"c":true,"i":[[-1.552,-1.544],[0.618,3.756],[0.662,1.304],[3.073,-2.723],[-2.487,-2.336]],"o":[[1.682,1.674],[-0.353,-2.144],[-1.242,-2.446],[-0.877,0.777],[1.12,1.052]],"v":[[408.79,349.826],[412.382,347.238],[411.664,344.803],[405.545,343.437],[406.487,347.752]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.948,-1.363],[4.166,7.572],[6.982,2.184],[2.809,-5.289],[-5.021,-0.635]],"o":[[6.996,3.234],[-1.554,-2.824],[-3.884,-1.215],[-0.816,1.536],[6.411,0.81]],"v":[[403.754,348.766],[410.584,342.178],[400.518,336.316],[390.691,339.289],[397.589,344.19]]}],"t":59.121},{"t":64.9609375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[328.254,317.867]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":44.381},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.551},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":64.961},{"t":66.12890625}]},"p":{"a":0,"ix":2,"k":[276.254,-124.133]},"r":{"a":0,"ix":6,"k":24},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 9","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.655,-2.672],[-1.957,-1.793],[-0.597,0.652],[1.155,1.358]],"o":[[-3.672,5.929],[1.957,1.793],[0.597,-0.652],[-1.155,-1.358]],"v":[[309.793,-274.248],[313.365,-263.794],[315.987,-264.692],[313.621,-268.658]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[6.97,1.386],[0.112,-7.555],[-1.974,0.319],[0.145,4.029]],"o":[[-11.153,-2.218],[-0.089,5.999],[1.974,-0.319],[-0.145,-4.029]],"v":[[304.825,-314.366],[294.698,-290.204],[300.718,-283.511],[307.158,-292.711]]}],"t":41.129},{"t":45.966796875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[299.937,-302.805]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":40.322},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":41.129},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.967},{"t":46.7734375}]},"p":{"a":0,"ix":2,"k":[274.688,71.682]},"r":{"a":0,"ix":6,"k":402},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[1.085,-2.593],[-7.2,0.179],[-7.392,-1.934],[1.588,4.551],[9.608,1.982]],"o":[[-2.621,6.265],[12.072,-0.3],[6.079,1.591],[-2.552,-7.31],[-10.783,-2.224]],"v":[[305.392,-348.662],[316.542,-342.354],[337.821,-336.969],[345.879,-341.41],[326.727,-352.967]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[2.992,-1.263],[-6.903,-4.647],[-8.561,-5.687],[18.988,6.146],[8.432,7.621]],"o":[[-7.228,3.052],[11.966,8.056],[9.406,6.248],[-19.319,-6.253],[-9.437,-8.53]],"v":[[326.479,-355.408],[332.703,-337.094],[381.356,-316.88],[385.461,-332.541],[345.28,-348.584]]}],"t":43.549},{"e":[{"c":true,"i":[[-0.536,-1.572],[-3.113,0.999],[-3.212,1.593],[1.299,0.115],[1.688,-1.035]],"o":[[0.699,2.048],[1.594,-0.511],[2.799,-1.388],[-3.076,-0.273],[-2.696,1.652]],"v":[[296.62,-347.231],[301.407,-345.869],[305.998,-349.185],[306.733,-352.77],[299.423,-351.803]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[1.085,-2.593],[-7.2,0.179],[-7.392,-1.934],[1.588,4.551],[9.608,1.982]],"o":[[-2.621,6.265],[12.072,-0.3],[6.079,1.591],[-2.552,-7.31],[-10.783,-2.224]],"v":[[305.392,-348.662],[316.542,-342.354],[337.821,-336.969],[345.879,-341.41],[326.727,-352.967]]}],"t":48.387},{"t":53.2265625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[357.286,-335.878]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":42.742},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":43.549},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":53.227},{"t":54.033203125}]},"p":{"a":0,"ix":2,"k":[298.375,20.281]},"r":{"a":0,"ix":6,"k":-112},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-15.718,-11.808],[-110.853,29.695],[-69.097,16.681],[-31.437,-38.337],[-13.834,-32.537],[17.145,-31.611],[52.916,-11.439]],"o":[[10.618,7.977],[54.353,-14.56],[83.852,-20.243],[48.953,59.697],[30.413,71.53],[-21.288,39.249],[-13.519,2.922]],"v":[[-151.067,-71.884],[-73.667,-179.774],[72.148,-283.257],[251.047,-259.697],[271.587,-153.53],[292.804,53.08],[137.92,149.235]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[3.81,32.334],[-37.912,24.295],[-60.961,4.723],[-28.674,-27.507],[-4.719,-44.918],[17.132,-35.418],[38.689,-10.071]],"o":[[-5.87,-49.813],[30.369,-19.461],[71.33,-5.527],[42.049,40.338],[5.026,47.841],[-14.872,30.746],[-13.327,3.469]],"v":[[-152.648,-71.897],[-68.844,-183.778],[89.56,-289.113],[249.899,-265.495],[274.719,-157.082],[291.508,54.754],[141.199,150.134]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[5.886,32.021],[-48.758,34.583],[-77.872,27.27],[-49.259,-48.008],[-4.511,-39.569],[28.818,-50.831],[56.767,-19.398]],"o":[[-12.5,-68],[41.263,-29.267],[73.631,-25.785],[25.574,24.924],[4.722,41.424],[-22.003,38.811],[-17.993,6.149]],"v":[[-157.5,-70],[-69.87,-176.215],[70.372,-273.27],[248.534,-273.339],[275.511,-149.431],[293.182,51.831],[136.634,147.529]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":26.863},{"t":53.7265625}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":11.68},{"t":38.54296875}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.992156922817,0.552941203117,0.172549024224,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":10}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":14,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[0,-63,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[0,1,0]},"r":{"a":1,"ix":10,"k":[{"e":[0],"i":{"x":[0],"y":[1]},"n":["0_1_0p333_0"],"o":{"x":[0.333],"y":[0]},"s":[115],"t":16.129},{"t":51.61328125}]},"s":{"a":1,"ix":6,"k":[{"e":[100,100,100],"i":{"x":[0,0,0.667],"y":[1,1,1]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"s":[122,122,100],"t":16.129},{"t":37.90234375}]}},"nm":"Shape Layer 5","op":794,"parent":1,"shapes":[{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-7.106,-6.258],[-19.353,-3.869],[7.891,3.257],[5.346,-0.525]],"o":[[9.134,8.045],[12.475,2.494],[-7.897,-3.259],[-5.346,0.525]],"v":[[274.032,-55.095],[304.612,-50.784],[314.013,-66.934],[292.335,-69.588]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-10.261,-11.263],[-30.338,9.388],[13.659,-1.454],[7.976,-3.33]],"o":[[11.756,12.904],[19.557,-6.052],[-13.669,1.455],[-7.976,3.33]],"v":[[208.744,-31.404],[266.443,-47.143],[266.495,-72.184],[230.562,-58.335]]}],"t":53.227},{"e":[{"c":true,"i":[[-2.784,-3.375],[-3.362,-1.186],[4.594,3.521],[3.593,0.597]],"o":[[5.252,6.366],[8.135,2.87],[-4.597,-3.524],[-3.593,-0.597]],"v":[[331.516,-54.519],[338.459,-48.273],[344.534,-55.195],[340.927,-57.113]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.106,-6.258],[-19.353,-3.869],[7.891,3.257],[5.346,-0.525]],"o":[[9.134,8.045],[12.475,2.494],[-7.897,-3.259],[-5.346,0.525]],"v":[[274.032,-55.095],[304.612,-50.784],[314.013,-66.934],[292.335,-69.588]]}],"t":56.619},{"t":60.12109375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":51.947},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":53.113},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":60.121},{"t":61.291015625}]},"p":{"a":0,"ix":2,"k":[-154,-177]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":1,"mn":"ADBE Vector Group","nm":"Shape 8","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[8.653,4.412],[-11.948,-10.523],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-11.339,-5.781],[9.171,8.077],[4.565,9.006]],"v":[[390.943,2.407],[389.833,-16.181],[372.097,-35.412],[363.579,-28.577],[376.058,-6.258]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.703,8.481],[4.983,6.127],[9.462,2.367],[-17.377,-7.771],[-12.209,-16.935]],"o":[[5.007,-5.512],[-12.952,-15.923],[-14.762,-3.692],[14.203,6.352],[7.574,10.506]],"v":[[387.993,-7.418],[381.373,-32.728],[336.86,-64.37],[322.797,-44.352],[366.426,-12.506]]}],"t":52.42},{"e":[{"c":true,"i":[[-1.222,1.308],[1.206,4.426],[1.981,1.978],[-4.619,-6.053],[-3.512,-10.237]],"o":[[2.952,-3.161],[-2.141,-7.86],[-3.192,-3.186],[2.028,2.657],[2.275,6.632]],"v":[[393.913,7.789],[396.614,-0.432],[386.034,-15.348],[380.119,-10.602],[385.312,3.161]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.305,1.154],[2.572,6.084],[8.653,4.412],[-11.948,-10.523],[-4.558,-8.992]],"o":[[6.307,-3.157],[-3.833,-9.069],[-11.339,-5.781],[9.171,8.077],[4.565,9.006]],"v":[[390.943,2.407],[389.833,-16.181],[372.097,-35.412],[363.579,-28.577],[376.058,-6.258]]}],"t":55.924},{"e":[{"c":true,"i":[[-0.886,0.471],[-0.13,1.044],[1.111,1.109],[-0.518,-2.792],[-3.024,-5.259]],"o":[[1.579,-0.84],[0.246,-1.975],[-1.789,-1.786],[0.341,1.842],[0.561,0.976]],"v":[[394.302,8.896],[395.719,6.526],[393.778,1.863],[389.586,3.258],[391.524,8.248]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.222,1.308],[1.206,4.426],[1.981,1.978],[-4.619,-6.053],[-3.512,-10.237]],"o":[[2.952,-3.161],[-2.141,-7.86],[-3.192,-3.186],[2.028,2.657],[2.275,6.632]],"v":[[393.913,7.789],[396.614,-0.432],[386.034,-15.348],[380.119,-10.602],[385.312,3.161]]}],"t":58.26},{"t":62.931640625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":51.252},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":52.42},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":62.932},{"t":64.099609375}]},"p":{"a":0,"ix":2,"k":[-161,-181]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":2,"mn":"ADBE Vector Group","nm":"Shape 7","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-7.732,4.067],[3.042,7.746],[0.005,10.277],[-0.539,-20.051],[-9.865,-24.335]],"o":[[7.054,-3.711],[-6.426,-16.363],[-0.009,-17.469],[0.416,15.456],[4.779,11.789]],"v":[[423.143,176.84],[427.81,161.233],[413.218,124.084],[393.932,116.063],[403.124,162.008]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-13.793,0.635],[-2.591,7.908],[-0.543,12.547],[-0.539,-20.051],[2.644,-8.677]],"o":[[9.471,-0.436],[7.553,-23.05],[0.613,-14.179],[0.416,15.456],[-4.252,13.954]],"v":[[396.137,108.769],[412.71,88.163],[421.793,32.708],[400.087,44.503],[391.337,87.772]]}],"t":51.613},{"e":[{"c":true,"i":[[-1.936,1.463],[3.818,4.909],[3.004,6.682],[4.199,-14.388],[-3.119,-3.467]],"o":[[4.677,-3.535],[-7.896,-10.153],[-3.357,-7.466],[-3.237,11.091],[6.358,7.067]],"v":[[444.226,208.388],[442.495,197.074],[427.147,181.047],[416.131,173.306],[429.906,206.921]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-7.732,4.067],[3.042,7.746],[0.005,10.277],[-0.539,-20.051],[-9.865,-24.335]],"o":[[7.054,-3.711],[-6.426,-16.363],[-0.009,-17.469],[0.416,15.456],[4.779,11.789]],"v":[[423.143,176.84],[427.81,161.233],[413.218,124.084],[393.932,116.063],[403.124,162.008]]}],"t":56.451},{"e":[{"c":true,"i":[[-0.627,3.991],[2.948,1.173],[2.948,2.281],[0.289,-5.765],[-3.685,-2.287]],"o":[[0.847,-5.388],[-2.405,-0.957],[-1.491,-1.154],[-0.256,5.111],[3.202,1.988]],"v":[[470.684,231.038],[466.901,225.56],[462.591,221.28],[456.214,226.198],[462.163,232.694]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.936,1.463],[3.818,4.909],[3.004,6.682],[4.199,-14.388],[-3.119,-3.467]],"o":[[4.677,-3.535],[-7.896,-10.153],[-3.357,-7.466],[-3.237,11.091],[6.358,7.067]],"v":[[444.226,208.388],[442.495,197.074],[427.147,181.047],[416.131,173.306],[429.906,206.921]]}],"t":62.902},{"t":68.9921875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[404.213,73.056]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":50.305},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":51.475},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":68.992},{"t":70.162109375}]},"p":{"a":0,"ix":2,"k":[271.213,-71.58]},"r":{"a":0,"ix":6,"k":-47},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":3,"mn":"ADBE Vector Group","nm":"Shape 6","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[3.525,3.745],[0.197,-12.283],[-2.566,2.068],[0.177,6.641]],"o":[[-7.924,-8.418],[-0.159,9.887],[6.605,-5.324],[-0.187,-7.009]],"v":[[328.406,207.34],[312.226,228.796],[325.289,242.279],[331.346,224.065]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[9.055,6.442],[9.961,-17.416],[-8.692,7.913],[-11.235,9.332]],"o":[[-11.197,-7.967],[-7.42,12.974],[7.127,-6.488],[5.9,-4.901]],"v":[[352.51,160.995],[310.164,199.677],[323.183,214.358],[347.728,187.186]]}],"t":50.807},{"e":[{"c":true,"i":[[2.833,0.782],[0.049,-3.082],[-0.773,-0.294],[-0.781,1.473]],"o":[[-2.796,-0.772],[-0.04,2.481],[0.773,0.294],[0.781,-1.473]],"v":[[317.816,242.457],[313.756,247.84],[317.689,249.49],[319.792,246.74]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[3.525,3.745],[0.197,-12.283],[-2.566,2.068],[0.177,6.641]],"o":[[-7.924,-8.418],[-0.159,9.887],[6.605,-5.324],[-0.187,-7.009]],"v":[[328.406,207.34],[312.226,228.796],[325.289,242.279],[331.346,224.065]]}],"t":54.838},{"t":60.123046875}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[334.533,186.047]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":50},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":50.779},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":60.123},{"t":61.291015625}]},"p":{"a":0,"ix":2,"k":[301.311,-1.891]},"r":{"a":0,"ix":6,"k":-49},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":4,"mn":"ADBE Vector Group","nm":"Shape 5","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-2.337,-2.255],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[4.856,4.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[313.144,277.314],[323.852,271.667],[319.523,242.63],[311.113,230.488],[307.709,269.07]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.275,-1.212],[-0.067,6.605],[3.054,7.565],[10.791,-8.694],[0.224,-4.011]],"o":[[5.497,2.929],[0.118,-11.643],[-2.98,-7.381],[-8.846,7.127],[-0.871,15.608]],"v":[[314.598,259.571],[323.692,245.239],[321.98,196.381],[296.209,196.694],[304.871,243.392]]}],"t":48.387},{"e":[{"c":true,"i":[[-2.784,1.882],[3.278,5.65],[4.875,4.344],[5.106,-7.053],[-5.122,-3.792]],"o":[[3.297,-2.23],[-1.921,-3.312],[-3.039,-2.707],[-6.082,8.4],[5.863,4.34]],"v":[[330.193,290.216],[331.159,278.271],[321.125,272.156],[311.793,264.686],[317.622,286.792]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.337,-2.255],[-1.602,6.333],[-2.804,9.887],[12.637,-6.488],[-0.896,-4.981]],"o":[[4.856,4.686],[1.204,-4.762],[1.11,-3.915],[-12.732,6.536],[1.291,7.18]],"v":[[313.144,277.314],[323.852,271.667],[319.523,242.63],[311.113,230.488],[307.709,269.07]]}],"t":53.059},{"e":[{"c":true,"i":[[-2.193,-0.398],[-1.633,1.625],[1.49,0.732],[1.104,0.616],[-2.243,-2.497]],"o":[[2.866,0.521],[1.8,-1.792],[-2.422,-1.19],[-2.874,-1.603],[1.691,1.882]],"v":[[337.768,292.215],[341.598,292.115],[341.967,287.509],[337.83,285.396],[334.993,289.595]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-2.784,1.882],[3.278,5.65],[4.875,4.344],[5.106,-7.053],[-5.122,-3.792]],"o":[[3.297,-2.23],[-1.921,-3.312],[-3.039,-2.707],[-6.082,8.4],[5.863,4.34]],"v":[[330.193,290.216],[331.159,278.271],[321.125,272.156],[311.793,264.686],[317.622,286.792]]}],"t":57.73},{"t":62.40234375}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[310.299,226.027]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":47.58},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":48.387},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":62.402},{"t":63.5703125}]},"p":{"a":0,"ix":2,"k":[197.299,147.027]},"r":{"a":0,"ix":6,"k":84},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":5,"mn":"ADBE Vector Group","nm":"Shape 4","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-5.863,-6.912],[-6.034,7.346],[5.062,0.736],[4.712,-2.057]],"o":[[6.432,7.583],[4.857,-5.913],[-2.524,-0.367],[-4.712,2.057]],"v":[[144.608,394.334],[175.766,387.545],[169.188,379.014],[149.13,380.929]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.863,-6.912],[-6.034,7.346],[5.312,-0.514],[4.12,-3.429]],"o":[[6.432,7.583],[4.857,-5.913],[-2.539,0.246],[-3.951,3.289]],"v":[[170.108,388.834],[193.266,376.795],[186.938,365.264],[171.13,371.429]]}],"t":46.773},{"e":[{"c":true,"i":[[-1.749,-2.192],[-3.165,2.925],[2.295,0.333],[2.23,-0.677]],"o":[[0.462,0.578],[1.126,-1.041],[-1.144,-0.166],[-0.852,0.259]],"v":[[116.499,391.697],[122.124,391.566],[120.615,389.285],[117.416,388.113]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-5.863,-6.912],[-6.034,7.346],[5.062,0.736],[4.712,-2.057]],"o":[[6.432,7.583],[4.857,-5.913],[-2.524,-0.367],[-4.712,2.057]],"v":[[144.608,394.334],[175.766,387.545],[169.188,379.014],[149.13,380.929]]}],"t":52.67},{"t":58.5078125}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[179.853,376.812]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":45.662},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":46.83},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":58.508},{"t":59.677734375}]},"p":{"a":0,"ix":2,"k":[104.853,154.812]},"r":{"a":0,"ix":6,"k":31},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":6,"mn":"ADBE Vector Group","nm":"Shape 3","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":1,"ix":2,"k":[{"e":[{"c":true,"i":[[-0.664,-3.179],[-0.686,10.48],[0.693,14.372],[2.402,-11.211],[1.871,-8.886]],"o":[[1.604,7.681],[0.998,-15.252],[-0.196,-4.065],[-1.349,6.295],[-2.621,12.448]],"v":[[191.927,378.89],[206.672,377.602],[205.567,334.993],[194.441,338.289],[191.468,353.466]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.721,-3.167],[-0.992,8.262],[-2.952,13.171],[2.926,-11.086],[0.442,-9.063]],"o":[[1.742,7.65],[1.816,-15.128],[0.89,-3.971],[-2.597,9.838],[-0.619,12.706]],"v":[[197.421,355.676],[208.618,352.159],[213.768,307.566],[199.584,309.087],[194.949,333.275]]}],"t":45.967},{"e":[{"c":true,"i":[[-1.959,-1.143],[1.762,4.669],[-0.707,8.692],[1.735,-5.805],[-2.148,-2.498]],"o":[[5.594,3.264],[-2.913,-7.718],[0.353,-4.338],[-2.357,7.887],[1.737,1.85]],"v":[[203.799,406.417],[212.197,400.386],[202.76,377.508],[196.606,377.88],[199.916,402.113]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-0.664,-3.179],[-0.686,10.48],[0.693,14.372],[2.402,-11.211],[1.871,-8.886]],"o":[[1.604,7.681],[0.998,-15.252],[-0.196,-4.065],[-1.349,6.295],[-2.621,12.448]],"v":[[191.927,378.89],[206.672,377.602],[205.567,334.993],[194.441,338.289],[191.468,353.466]]}],"t":51.613},{"e":[{"c":true,"i":[[-0.872,-0.385],[1.171,2.143],[2.49,-0.113],[-0.428,-2.176],[-1.187,-0.594]],"o":[[2.107,0.931],[-1.081,-1.978],[-1.692,0.077],[0.225,1.145],[0.864,0.432]],"v":[[210.857,414.203],[213.072,410.465],[208.767,406.285],[206.684,409.748],[208.832,413.117]]}],"i":{"x":0.833,"y":0.833},"n":"0p833_0p833_0p167_0p167","o":{"x":0.167,"y":0.167},"s":[{"c":true,"i":[[-1.959,-1.143],[1.762,4.669],[-0.707,8.692],[1.735,-5.805],[-2.148,-2.498]],"o":[[5.594,3.264],[-2.913,-7.718],[0.353,-4.338],[-2.357,7.887],[1.737,1.85]],"v":[[203.799,406.417],[212.197,400.386],[202.76,377.508],[196.606,377.88],[199.916,402.113]]}],"t":57.258},{"t":61.291015625}]},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"c":{"a":0,"ix":4,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","o":{"a":0,"ix":5,"k":100},"r":1,"ty":"fl"},{"a":{"a":0,"ix":1,"k":[201.186,347.654]},"nm":"Transform","o":{"a":1,"ix":7,"k":[{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[0],"t":45.162},{"e":[100],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":45.967},{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p167_0p167"],"o":{"x":[0.167],"y":[0.167]},"s":[100],"t":61.291},{"t":62.09765625}]},"p":{"a":0,"ix":2,"k":[41.186,165.654]},"r":{"a":0,"ix":6,"k":68},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":7,"mn":"ADBE Vector Group","nm":"Shape 2","np":2,"ty":"gr"},{"cix":2,"hd":false,"it":[{"hd":false,"ind":0,"ix":1,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-17.442,9.07],[-45.407,24.545],[-67.999,-45],[-46.425,-39.176],[24.284,-37.946],[19.131,-3.317],[16.851,-7.636],[22.338,24.372]],"o":[[50,-26],[55.5,-30],[47.064,31.145],[28.534,24.079],[-38.125,59.574],[-48.655,8.437],[-16.851,7.636],[-22.338,-24.372]],"v":[[-70,-168],[37.5,-189],[193,-226],[274.625,-74.287],[287,104],[96.104,154.527],[-65.51,204.464],[-199.186,161.156]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 1","ty":"sh"},{"hd":false,"ind":1,"ix":2,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[7.321,31.724],[-20.78,18.471],[-46.284,-46.673],[-33.945,-31.892],[29.336,-29.625],[49.431,6.815],[14.746,-2.969],[16.646,22.348]],"o":[[-4.5,-19.5],[54,-48],[59.5,60],[50.752,47.682],[-34.344,34.683],[-49.431,-6.815],[-39.238,7.9],[-16.646,-22.348]],"v":[[-83.5,-166.5],[32,-198],[195.5,-213.5],[250.82,-92.388],[292,97.5],[94.587,154.973],[-65.432,208.271],[-203.524,155.572]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 2","ty":"sh"},{"hd":false,"ind":2,"ix":3,"ks":{"a":0,"ix":2,"k":{"c":false,"i":[[-32.033,5.824],[-10.696,26.586],[-58.097,-32.713],[-39.01,-52.929],[60.246,-75.012],[39.072,-1.851],[15.451,-2.501],[20.9,22.982]],"o":[[16.5,-3],[9.127,-22.687],[45.286,25.5],[30.172,40.938],[-51,63.5],[-30.07,1.424],[-35.801,5.794],[-20.9,-22.982]],"v":[[-82.5,-164],[35.5,-197],[197,-217],[268.53,-66.797],[283,108.5],[94.087,154.955],[-66.421,204.876],[-207.839,151.402]]}},"mn":"ADBE Vector Shape - Group","nm":"Path 3","ty":"sh"},{"e":{"a":1,"ix":2,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":31.535},{"t":54.89453125}]},"hd":false,"ix":4,"m":1,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 2","o":{"a":0,"ix":3,"k":0},"s":{"a":1,"ix":1,"k":[{"e":[0],"i":{"x":[0.833],"y":[0.833]},"n":["0p833_0p833_0p8_0"],"o":{"x":[0.8],"y":[0]},"s":[100],"t":17.52},{"t":40.87890625}]},"ty":"tm"},{"c":{"a":0,"ix":3,"k":[0.996078491211,0.901960849762,0.384313762188,1]},"hd":false,"lc":2,"lj":2,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","o":{"a":0,"ix":4,"k":100},"ty":"st","w":{"a":0,"ix":5,"k":12}},{"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":0,"ix":6,"k":0},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}],"ix":8,"mn":"ADBE Vector Group","nm":"Shape 1","np":5,"ty":"gr"}],"sr":1,"st":0,"ty":4},{"ao":0,"bm":0,"ddd":0,"ind":15,"ip":0,"ks":{"a":{"a":0,"ix":1,"k":[450,400,0]},"o":{"a":0,"ix":11,"k":100},"p":{"a":0,"ix":2,"k":[450,400,0]},"r":{"a":0,"ix":10,"k":0},"s":{"a":0,"ix":6,"k":[100,100,100]}},"nm":"White Solid 2","op":794,"sc":"#ffffff","sh":800,"sr":1,"st":0,"sw":900,"ty":1}],"markers":[],"nm":"YTK Logo Bump Drawn v5","op":181,"v":"5.3.4","w":900}
diff --git a/cobalt/renderer/renderer_module.cc b/cobalt/renderer/renderer_module.cc
index 3fc7a0f..c186d60 100644
--- a/cobalt/renderer/renderer_module.cc
+++ b/cobalt/renderer/renderer_module.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/renderer/renderer_module.h"
+
 #include <memory>
 #include <string>
 
-#include "cobalt/renderer/renderer_module.h"
-
 #include "base/memory/ptr_util.h"
 #include "base/trace_event/trace_event.h"
 #include "cobalt/browser/memory_settings/calculations.h"
diff --git a/cobalt/renderer/renderer_module_default_options.cc b/cobalt/renderer/renderer_module_default_options.cc
index 04b688c..53b83a6 100644
--- a/cobalt/renderer/renderer_module_default_options.cc
+++ b/cobalt/renderer/renderer_module_default_options.cc
@@ -12,11 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "base/logging.h"
 #include "cobalt/renderer/get_default_rasterizer_for_platform.h"
 #include "cobalt/renderer/renderer_module.h"
 
-#include "base/logging.h"
-
 namespace cobalt {
 namespace renderer {
 
diff --git a/cobalt/renderer/resource_provider_test.cc b/cobalt/renderer/resource_provider_test.cc
index 1f73889..90c0d9a 100644
--- a/cobalt/renderer/resource_provider_test.cc
+++ b/cobalt/renderer/resource_provider_test.cc
@@ -12,20 +12,19 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
+#include "cobalt/render_tree/resource_provider.h"
 
-#include "base/threading/simple_thread.h"
+#include <memory>
 
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "cobalt/render_tree/resource_provider.h"
+#include "base/threading/simple_thread.h"
 #include "cobalt/renderer/backend/default_graphics_system.h"
 #include "cobalt/renderer/backend/graphics_context.h"
 #include "cobalt/renderer/backend/graphics_system.h"
 #include "cobalt/renderer/backend/render_target.h"
 #include "cobalt/renderer/rasterizer/rasterizer.h"
 #include "cobalt/renderer/renderer_module.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 using cobalt::render_tree::ResourceProvider;
diff --git a/cobalt/renderer/smoothed_value_test.cc b/cobalt/renderer/smoothed_value_test.cc
index daeee61..208fb97 100644
--- a/cobalt/renderer/smoothed_value_test.cc
+++ b/cobalt/renderer/smoothed_value_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/renderer/smoothed_value.h"
+
 #include "base/time/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/cobalt/renderer/submission_queue.cc b/cobalt/renderer/submission_queue.cc
index 669ad35..40d357e 100644
--- a/cobalt/renderer/submission_queue.cc
+++ b/cobalt/renderer/submission_queue.cc
@@ -16,6 +16,7 @@
 
 #include <cmath>
 #include <memory>
+#include <utility>
 
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/cobalt/renderer/submission_queue_test.cc b/cobalt/renderer/submission_queue_test.cc
index 5db7899..6d33036 100644
--- a/cobalt/renderer/submission_queue_test.cc
+++ b/cobalt/renderer/submission_queue_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/renderer/submission_queue.h"
+
 #include "base/time/time.h"
 #include "cobalt/render_tree/composition_node.h"
 #include "cobalt/renderer/submission.h"
diff --git a/cobalt/renderer/test/jpeg_utils/jpeg_encode.cc b/cobalt/renderer/test/jpeg_utils/jpeg_encode.cc
index b734a68..d5700bb 100644
--- a/cobalt/renderer/test/jpeg_utils/jpeg_encode.cc
+++ b/cobalt/renderer/test/jpeg_utils/jpeg_encode.cc
@@ -1,3 +1,4 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
 // Copyright 2018 Google Inc. All Rights Reserved.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,6 +16,7 @@
 #include "cobalt/renderer/test/jpeg_utils/jpeg_encode.h"
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "base/trace_event/trace_event.h"
@@ -32,7 +34,7 @@
                                             size_t* out_size) {
   TRACE_EVENT0("cobalt::renderer", "jpegEncode::EncodeRGBAToBuffer()");
   unsigned char* jpeg_buffer = NULL;
-  unsigned long jpegSize = 0;
+  unsigned long jpegSize = 0;  // NOLINT(runtime/int)
 
   int flags = 0;
   // This can be a value between 1 and 100.
diff --git a/cobalt/renderer/test/png_utils/BUILD.gn b/cobalt/renderer/test/png_utils/BUILD.gn
index 28e8ac1..2e8135e 100644
--- a/cobalt/renderer/test/png_utils/BUILD.gn
+++ b/cobalt/renderer/test/png_utils/BUILD.gn
@@ -40,15 +40,18 @@
 
   deps = [
     ":png_utils",
-    ":png_utils_copy_test_data",
     "//cobalt/base",
     "//cobalt/test:run_all_unittests",
     "//testing/gmock",
     "//testing/gtest",
   ]
+
+  data_deps = [ ":png_utils_copy_test_data" ]
 }
 
 copy("png_utils_copy_test_data") {
+  install_content = true
+
   sources = [
     "png_benchmark_image.png",
     "png_premultiplied_alpha_test_image.png",
diff --git a/cobalt/renderer/test/png_utils/png_decode.cc b/cobalt/renderer/test/png_utils/png_decode.cc
index fd40861..69d5973 100644
--- a/cobalt/renderer/test/png_utils/png_decode.cc
+++ b/cobalt/renderer/test/png_utils/png_decode.cc
@@ -15,6 +15,7 @@
 #include "cobalt/renderer/test/png_utils/png_decode.h"
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "base/files/file_util.h"
diff --git a/cobalt/renderer/test/png_utils/png_decode_test.cc b/cobalt/renderer/test/png_utils/png_decode_test.cc
index a0cd2d6..be6fb28 100644
--- a/cobalt/renderer/test/png_utils/png_decode_test.cc
+++ b/cobalt/renderer/test/png_utils/png_decode_test.cc
@@ -12,12 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/renderer/test/png_utils/png_decode.h"
+
 #include <memory>
 
 #include "base/files/file_path.h"
 #include "base/path_service.h"
 #include "cobalt/base/cobalt_paths.h"
-#include "cobalt/renderer/test/png_utils/png_decode.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using cobalt::renderer::test::png_utils::DecodePNGToPremultipliedAlphaRGBA;
diff --git a/cobalt/renderer/test/png_utils/png_encode.cc b/cobalt/renderer/test/png_utils/png_encode.cc
index 38416f4..3b4d58b 100644
--- a/cobalt/renderer/test/png_utils/png_encode.cc
+++ b/cobalt/renderer/test/png_utils/png_encode.cc
@@ -15,8 +15,10 @@
 #include "cobalt/renderer/test/png_utils/png_encode.h"
 
 #include <memory>
+#include <utility>
 #include <vector>
 
+#include "base/files/file_starboard.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/trace_event/trace_event.h"
@@ -58,6 +60,7 @@
   DCHECK_NE(file, kSbFileInvalid);
   int bytes_written =
       SbFileWrite(file, reinterpret_cast<char*>(buffer.get()), size);
+  base::RecordFileWriteStat(bytes_written);
   SbFileClose(file);
   DLOG_IF(ERROR, bytes_written != size) << "Error writing PNG to file.";
 }
diff --git a/cobalt/renderer/test/scenes/all_scenes_combined_scene.cc b/cobalt/renderer/test/scenes/all_scenes_combined_scene.cc
index 81b000f..8b0a0a8 100644
--- a/cobalt/renderer/test/scenes/all_scenes_combined_scene.cc
+++ b/cobalt/renderer/test/scenes/all_scenes_combined_scene.cc
@@ -14,6 +14,8 @@
 
 #include "cobalt/renderer/test/scenes/all_scenes_combined_scene.h"
 
+#include <utility>
+
 #include "base/trace_event/trace_event.h"
 #include "cobalt/math/matrix3_f.h"
 #include "cobalt/math/size_f.h"
@@ -37,8 +39,7 @@
 scoped_refptr<render_tree::Node> CreateAllScenesCombinedScene(
     ResourceProvider* resource_provider, const SizeF& output_dimensions,
     base::TimeDelta start_time) {
-  TRACE_EVENT0("cobalt::renderer_sandbox",
-               "CreateAllScenesCombinedScene()");
+  TRACE_EVENT0("cobalt::renderer_sandbox", "CreateAllScenesCombinedScene()");
   CompositionNode::Builder all_scenes_combined_scene_builder;
 
   // Compose all the render trees representing the sub-scenes through a
diff --git a/cobalt/renderer/test/scenes/growing_rect_scene.cc b/cobalt/renderer/test/scenes/growing_rect_scene.cc
index 0c483a5..a6dbd34 100644
--- a/cobalt/renderer/test/scenes/growing_rect_scene.cc
+++ b/cobalt/renderer/test/scenes/growing_rect_scene.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/renderer/test/scenes/growing_rect_scene.h"
 
+#include <memory>
+
 #include "base/bind.h"
 #include "cobalt/math/size_f.h"
 #include "cobalt/math/transform_2d.h"
@@ -27,15 +27,15 @@
 using cobalt::math::ScaleMatrix;
 using cobalt::math::SizeF;
 using cobalt::math::TranslateMatrix;
-using cobalt::render_tree::animations::AnimateNode;
-using cobalt::render_tree::animations::Animation;
-using cobalt::render_tree::animations::AnimationList;
 using cobalt::render_tree::Brush;
 using cobalt::render_tree::ColorRGBA;
 using cobalt::render_tree::MatrixTransformNode;
 using cobalt::render_tree::Node;
 using cobalt::render_tree::RectNode;
 using cobalt::render_tree::SolidColorBrush;
+using cobalt::render_tree::animations::AnimateNode;
+using cobalt::render_tree::animations::Animation;
+using cobalt::render_tree::animations::AnimationList;
 
 namespace cobalt {
 namespace renderer {
diff --git a/cobalt/renderer/test/scenes/image_wrap_scene.cc b/cobalt/renderer/test/scenes/image_wrap_scene.cc
index 0f1592a..70fc952 100644
--- a/cobalt/renderer/test/scenes/image_wrap_scene.cc
+++ b/cobalt/renderer/test/scenes/image_wrap_scene.cc
@@ -32,15 +32,15 @@
 
 using cobalt::math::Matrix3F;
 using cobalt::math::SizeF;
-using cobalt::render_tree::animations::AnimateNode;
-using cobalt::render_tree::animations::Animation;
-using cobalt::render_tree::animations::AnimationList;
 using cobalt::render_tree::CompositionNode;
 using cobalt::render_tree::Image;
 using cobalt::render_tree::ImageNode;
 using cobalt::render_tree::MatrixTransformNode;
 using cobalt::render_tree::Node;
 using cobalt::render_tree::ResourceProvider;
+using cobalt::render_tree::animations::AnimateNode;
+using cobalt::render_tree::animations::Animation;
+using cobalt::render_tree::animations::AnimationList;
 using cobalt::renderer::test::png_utils::DecodePNGToRenderTreeImage;
 
 namespace cobalt {
@@ -59,9 +59,9 @@
   const float kScalePeriodInSeconds = 1.5f;
   const float kScaleAmplitude = 0.4f;
   const float kScalePhaseShift = 0.55f;
-  float scale =
-      kScalePhaseShift + kScaleAmplitude *
-      sin(2 * M_PI * elapsed_time_in_seconds / kScalePeriodInSeconds);
+  float scale = kScalePhaseShift +
+                kScaleAmplitude * sin(2 * M_PI * elapsed_time_in_seconds /
+                                      kScalePeriodInSeconds);
 
   // Determine the rotation of the local transform given the current time.
   const float kRotationPeriod = 3.0f;
@@ -69,9 +69,9 @@
 
   // Combine the scale and rotation together, translating to the center to
   // use that as the origin.
-  composition_node->local_transform =
-      math::TranslateMatrix(0.5f, 0.5f) *
-      math::ScaleMatrix(scale) * math::RotateMatrix(rotation);
+  composition_node->local_transform = math::TranslateMatrix(0.5f, 0.5f) *
+                                      math::ScaleMatrix(scale) *
+                                      math::RotateMatrix(rotation);
 }
 
 scoped_refptr<Image> GetTestImage(ResourceProvider* resource_provider) {
diff --git a/cobalt/renderer/test/scenes/marquee_scene.cc b/cobalt/renderer/test/scenes/marquee_scene.cc
index 62eff90..84fb5fe 100644
--- a/cobalt/renderer/test/scenes/marquee_scene.cc
+++ b/cobalt/renderer/test/scenes/marquee_scene.cc
@@ -16,6 +16,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/bind.h"
 #include "cobalt/math/size_f.h"
@@ -32,9 +33,6 @@
 using cobalt::math::RectF;
 using cobalt::math::SizeF;
 using cobalt::math::TranslateMatrix;
-using cobalt::render_tree::animations::AnimateNode;
-using cobalt::render_tree::animations::Animation;
-using cobalt::render_tree::animations::AnimationList;
 using cobalt::render_tree::Brush;
 using cobalt::render_tree::ColorRGBA;
 using cobalt::render_tree::CompositionNode;
@@ -47,6 +45,9 @@
 using cobalt::render_tree::ResourceProvider;
 using cobalt::render_tree::SolidColorBrush;
 using cobalt::render_tree::TextNode;
+using cobalt::render_tree::animations::AnimateNode;
+using cobalt::render_tree::animations::Animation;
+using cobalt::render_tree::animations::AnimationList;
 
 namespace cobalt {
 namespace renderer {
@@ -107,9 +108,8 @@
   // a switch from the right side to the left is not noticed.
 
   // Center the text's bounding box vertically on the screen.
-  float y_position =
-      (output_dimensions.height() / 2.0f) - text_bounds.y() -
-          (text_bounds.height() / 2.0f);
+  float y_position = (output_dimensions.height() / 2.0f) - text_bounds.y() -
+                     (text_bounds.height() / 2.0f);
 
   // Add a background rectangle to the text in order to demonstrate the
   // relationship between the text's origin and its bounding box.
diff --git a/cobalt/renderer/test/scenes/scaling_text_scene.cc b/cobalt/renderer/test/scenes/scaling_text_scene.cc
index 44c4752..5135552 100644
--- a/cobalt/renderer/test/scenes/scaling_text_scene.cc
+++ b/cobalt/renderer/test/scenes/scaling_text_scene.cc
@@ -16,6 +16,7 @@
 
 #include <cmath>
 #include <string>
+#include <utility>
 
 #include "base/bind.h"
 #include "cobalt/math/size_f.h"
@@ -30,8 +31,8 @@
 
 using cobalt::math::Matrix3F;
 using cobalt::math::RectF;
-using cobalt::math::SizeF;
 using cobalt::math::ScaleMatrix;
+using cobalt::math::SizeF;
 using cobalt::math::TranslateMatrix;
 using cobalt::render_tree::ColorRGBA;
 using cobalt::render_tree::CompositionNode;
@@ -41,9 +42,9 @@
 using cobalt::render_tree::MatrixTransformNode;
 using cobalt::render_tree::ResourceProvider;
 using cobalt::render_tree::TextNode;
+using cobalt::render_tree::animations::AnimateNode;
 using cobalt::render_tree::animations::Animation;
 using cobalt::render_tree::animations::AnimationList;
-using cobalt::render_tree::animations::AnimateNode;
 
 namespace cobalt {
 namespace renderer {
diff --git a/cobalt/renderer/test/scenes/scene_helpers.cc b/cobalt/renderer/test/scenes/scene_helpers.cc
index ea9b614..3dd9261 100644
--- a/cobalt/renderer/test/scenes/scene_helpers.cc
+++ b/cobalt/renderer/test/scenes/scene_helpers.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/renderer/test/scenes/scene_helpers.h"
 
+#include <memory>
+#include <utility>
+
 #include "cobalt/math/matrix3_f.h"
 #include "cobalt/math/size_f.h"
 #include "cobalt/render_tree/color_rgba.h"
diff --git a/cobalt/renderer/test/scenes/spinning_sprites_scene.cc b/cobalt/renderer/test/scenes/spinning_sprites_scene.cc
index f09f99a..88fc067 100644
--- a/cobalt/renderer/test/scenes/spinning_sprites_scene.cc
+++ b/cobalt/renderer/test/scenes/spinning_sprites_scene.cc
@@ -15,6 +15,7 @@
 #include "cobalt/renderer/test/scenes/spinning_sprites_scene.h"
 
 #include <cmath>
+#include <utility>
 #include <vector>
 
 #include "base/files/file_path.h"
@@ -38,15 +39,15 @@
 using cobalt::math::ScaleMatrix;
 using cobalt::math::SizeF;
 using cobalt::math::TranslateMatrix;
-using cobalt::render_tree::animations::AnimateNode;
-using cobalt::render_tree::animations::Animation;
-using cobalt::render_tree::animations::AnimationList;
 using cobalt::render_tree::CompositionNode;
 using cobalt::render_tree::Image;
 using cobalt::render_tree::ImageNode;
 using cobalt::render_tree::MatrixTransformNode;
 using cobalt::render_tree::Node;
 using cobalt::render_tree::ResourceProvider;
+using cobalt::render_tree::animations::AnimateNode;
+using cobalt::render_tree::animations::Animation;
+using cobalt::render_tree::animations::AnimationList;
 using cobalt::renderer::test::png_utils::DecodePNGToRenderTreeImage;
 
 namespace cobalt {
diff --git a/cobalt/samples/simple_example/simple_example_main.cc b/cobalt/samples/simple_example/simple_example_main.cc
index 3bf11ea..73c2364 100644
--- a/cobalt/samples/simple_example/simple_example_main.cc
+++ b/cobalt/samples/simple_example/simple_example_main.cc
@@ -12,11 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "cobalt/samples/simple_example/simple_example.h"
-
 #include "base/logging.h"
 #include "base/strings/stringprintf.h"
 #include "cobalt/base/wrap_main.h"
+#include "cobalt/samples/simple_example/simple_example.h"
 
 namespace {
 
diff --git a/cobalt/samples/simple_example/simple_example_test.cc b/cobalt/samples/simple_example/simple_example_test.cc
index 80621a5..9a8117c 100644
--- a/cobalt/samples/simple_example/simple_example_test.cc
+++ b/cobalt/samples/simple_example/simple_example_test.cc
@@ -79,7 +79,9 @@
   ASSERT_TRUE(base::PathExists(data_dir));
 
   const char* kCaseFiles[] = {
-      "case1.txt", "case2.txt", "case3.txt",
+      "case1.txt",
+      "case2.txt",
+      "case3.txt",
   };
   const int kNumInputArgs = 3;
 
diff --git a/cobalt/script/BUILD.gn b/cobalt/script/BUILD.gn
index 1582517..55a307a 100644
--- a/cobalt/script/BUILD.gn
+++ b/cobalt/script/BUILD.gn
@@ -51,7 +51,6 @@
     "typed_arrays.h",
     "union_type.h",
     "union_type_internal.h",
-    "util/stack_trace_helpers.h",
     "value_handle.h",
     "wrappable.h",
   ]
@@ -59,7 +58,6 @@
   deps = [
     "//cobalt/base",
     "//cobalt/loader:origin",
-    "//nb",
     "//starboard:starboard_headers_only",
     "//third_party/v8",
     "//third_party/v8:v8_libplatform",
diff --git a/cobalt/script/callback_function.h b/cobalt/script/callback_function.h
index 53a70ec..0d45814 100644
--- a/cobalt/script/callback_function.h
+++ b/cobalt/script/callback_function.h
@@ -86,8 +86,7 @@
   typedef R Signature(void);
   typedef CallbackResult<R> ReturnValue;
 
-  virtual CallbackResult<R> Run()
-      const = 0;
+  virtual CallbackResult<R> Run() const = 0;
 
  protected:
   virtual ~CallbackFunction() {}
@@ -147,7 +146,7 @@
   virtual ~CallbackFunction() {}
 };
 template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5>
+          typename A5>
 class CallbackFunction<R(A1, A2, A3, A4, A5)> {
  public:
   typedef R Signature(A1, A2, A3, A4, A5);
@@ -164,7 +163,7 @@
   virtual ~CallbackFunction() {}
 };
 template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5, typename A6>
+          typename A5, typename A6>
 class CallbackFunction<R(A1, A2, A3, A4, A5, A6)> {
  public:
   typedef R Signature(A1, A2, A3, A4, A5, A6);
@@ -182,7 +181,7 @@
   virtual ~CallbackFunction() {}
 };
 template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5, typename A6, typename A7>
+          typename A5, typename A6, typename A7>
 class CallbackFunction<R(A1, A2, A3, A4, A5, A6, A7)> {
  public:
   typedef R Signature(A1, A2, A3, A4, A5, A6, A7);
diff --git a/cobalt/script/execution_state.cc b/cobalt/script/execution_state.cc
index 363ec34..4c737db 100644
--- a/cobalt/script/execution_state.cc
+++ b/cobalt/script/execution_state.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/script/execution_state.h"
 
+#include <memory>
+
 #include "cobalt/script/global_environment.h"
 
 namespace cobalt {
diff --git a/cobalt/script/script_runner.cc b/cobalt/script/script_runner.cc
index 8463a48..c8fb8bb 100644
--- a/cobalt/script/script_runner.cc
+++ b/cobalt/script/script_runner.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/script/script_runner.h"
 
+#include <memory>
+
 #include "base/logging.h"
 #include "cobalt/script/global_environment.h"
 #include "cobalt/script/source_code.h"
diff --git a/cobalt/script/sequence.h b/cobalt/script/sequence.h
index 5c32d8d..dfed5d1 100644
--- a/cobalt/script/sequence.h
+++ b/cobalt/script/sequence.h
@@ -17,6 +17,7 @@
 
 #include <algorithm>
 #include <iosfwd>
+#include <utility>
 #include <vector>
 
 #include "base/memory/ref_counted.h"
diff --git a/cobalt/script/testing/mock_exception_state.h b/cobalt/script/testing/mock_exception_state.h
index 392c1d6..328fa7b 100644
--- a/cobalt/script/testing/mock_exception_state.h
+++ b/cobalt/script/testing/mock_exception_state.h
@@ -15,9 +15,8 @@
 #ifndef COBALT_SCRIPT_TESTING_MOCK_EXCEPTION_STATE_H_
 #define COBALT_SCRIPT_TESTING_MOCK_EXCEPTION_STATE_H_
 
-#include "cobalt/script/exception_state.h"
-
 #include "base/memory/ref_counted.h"
+#include "cobalt/script/exception_state.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace cobalt {
diff --git a/cobalt/script/testing/mock_property_enumerator.h b/cobalt/script/testing/mock_property_enumerator.h
index 29d5115..67dcddc 100644
--- a/cobalt/script/testing/mock_property_enumerator.h
+++ b/cobalt/script/testing/mock_property_enumerator.h
@@ -18,7 +18,6 @@
 #include <string>
 
 #include "cobalt/script/property_enumerator.h"
-
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace cobalt {
diff --git a/cobalt/script/union_type.h b/cobalt/script/union_type.h
index 19a8562..961bd28 100644
--- a/cobalt/script/union_type.h
+++ b/cobalt/script/union_type.h
@@ -67,9 +67,7 @@
     new (storage_.void_data()) T2(arg);
   }
 
-  UnionType2(const UnionType2& other) {
-    ConstructFromOther(other);
-  }
+  UnionType2(const UnionType2& other) { ConstructFromOther(other); }
 
   UnionType2& operator=(const UnionType2& other) {
     if (&other != this) {
@@ -79,9 +77,7 @@
     return *this;
   }
 
-  ~UnionType2() {
-    Destruct();
-  }
+  ~UnionType2() { Destruct(); }
 
   // Forward these checks to the UnionTypeCheck helper class, which works around
   // being unable to do template specializations in class scope.
@@ -116,12 +112,12 @@
     static bool IsType(const UnionType2<T1, T2>* union_value) {
       return union_value->specific_type_ == kTypeT1;
     }
-    static typename internal::UnionTypeTraits<T1>::ReturnType
-        AsType(UnionType2<T1, T2>* union_value) {
+    static typename internal::UnionTypeTraits<T1>::ReturnType AsType(
+        UnionType2<T1, T2>* union_value) {
       return *(union_value->storage_.template data_as<T1>());
     }
-    static typename internal::UnionTypeTraits<T1>::ConstReturnType
-        AsType(const UnionType2<T1, T2>* union_value) {
+    static typename internal::UnionTypeTraits<T1>::ConstReturnType AsType(
+        const UnionType2<T1, T2>* union_value) {
       return *(union_value->storage_.template data_as<T1>());
     }
     friend class UnionType2<T1, T2>;
@@ -132,12 +128,12 @@
     static bool IsType(const UnionType2<T1, T2>* union_value) {
       return union_value->specific_type_ == kTypeT2;
     }
-    static typename internal::UnionTypeTraits<T2>::ReturnType
-        AsType(UnionType2<T1, T2>* union_value) {
+    static typename internal::UnionTypeTraits<T2>::ReturnType AsType(
+        UnionType2<T1, T2>* union_value) {
       return *(union_value->storage_.template data_as<T2>());
     }
-    static typename internal::UnionTypeTraits<T2>::ConstReturnType
-        AsType(const UnionType2<T1, T2>* union_value) {
+    static typename internal::UnionTypeTraits<T2>::ConstReturnType AsType(
+        const UnionType2<T1, T2>* union_value) {
       return *(union_value->storage_.template data_as<T2>());
     }
     friend class UnionType2<T1, T2>;
@@ -199,9 +195,8 @@
 
 // Needed to instantiate base::Optional<UnionTypeN>
 template <typename T1, typename T2>
-inline std::ostream& operator<<(
-    std::ostream& stream, const UnionType2<T1, T2>& union_value) {
-
+inline std::ostream& operator<<(std::ostream& stream,
+                                const UnionType2<T1, T2>& union_value) {
   if (union_value.template IsType<T1>()) {
     stream << union_value.template AsType<T1>();
   } else if (union_value.template IsType<T2>()) {
@@ -232,9 +227,7 @@
     new (storage_.void_data()) T3(arg);
   }
 
-  UnionType3(const UnionType3& other) {
-    ConstructFromOther(other);
-  }
+  UnionType3(const UnionType3& other) { ConstructFromOther(other); }
 
   UnionType3& operator=(const UnionType3& other) {
     if (&other != this) {
@@ -244,9 +237,7 @@
     return *this;
   }
 
-  ~UnionType3() {
-    Destruct();
-  }
+  ~UnionType3() { Destruct(); }
 
   // Forward these checks to the UnionTypeCheck helper class, which works around
   // being unable to do template specializations in class scope.
@@ -281,12 +272,12 @@
     static bool IsType(const UnionType3<T1, T2, T3>* union_value) {
       return union_value->specific_type_ == kTypeT1;
     }
-    static typename internal::UnionTypeTraits<T1>::ReturnType
-        AsType(UnionType3<T1, T2, T3>* union_value) {
+    static typename internal::UnionTypeTraits<T1>::ReturnType AsType(
+        UnionType3<T1, T2, T3>* union_value) {
       return *(union_value->storage_.template data_as<T1>());
     }
-    static typename internal::UnionTypeTraits<T1>::ConstReturnType
-        AsType(const UnionType3<T1, T2, T3>* union_value) {
+    static typename internal::UnionTypeTraits<T1>::ConstReturnType AsType(
+        const UnionType3<T1, T2, T3>* union_value) {
       return *(union_value->storage_.template data_as<T1>());
     }
     friend class UnionType3<T1, T2, T3>;
@@ -297,12 +288,12 @@
     static bool IsType(const UnionType3<T1, T2, T3>* union_value) {
       return union_value->specific_type_ == kTypeT2;
     }
-    static typename internal::UnionTypeTraits<T2>::ReturnType
-        AsType(UnionType3<T1, T2, T3>* union_value) {
+    static typename internal::UnionTypeTraits<T2>::ReturnType AsType(
+        UnionType3<T1, T2, T3>* union_value) {
       return *(union_value->storage_.template data_as<T2>());
     }
-    static typename internal::UnionTypeTraits<T2>::ConstReturnType
-        AsType(const UnionType3<T1, T2, T3>* union_value) {
+    static typename internal::UnionTypeTraits<T2>::ConstReturnType AsType(
+        const UnionType3<T1, T2, T3>* union_value) {
       return *(union_value->storage_.template data_as<T2>());
     }
     friend class UnionType3<T1, T2, T3>;
@@ -313,12 +304,12 @@
     static bool IsType(const UnionType3<T1, T2, T3>* union_value) {
       return union_value->specific_type_ == kTypeT3;
     }
-    static typename internal::UnionTypeTraits<T3>::ReturnType
-        AsType(UnionType3<T1, T2, T3>* union_value) {
+    static typename internal::UnionTypeTraits<T3>::ReturnType AsType(
+        UnionType3<T1, T2, T3>* union_value) {
       return *(union_value->storage_.template data_as<T3>());
     }
-    static typename internal::UnionTypeTraits<T3>::ConstReturnType
-        AsType(const UnionType3<T1, T2, T3>* union_value) {
+    static typename internal::UnionTypeTraits<T3>::ConstReturnType AsType(
+        const UnionType3<T1, T2, T3>* union_value) {
       return *(union_value->storage_.template data_as<T3>());
     }
     friend class UnionType3<T1, T2, T3>;
@@ -389,9 +380,8 @@
 
 // Needed to instantiate base::Optional<UnionTypeN>
 template <typename T1, typename T2, typename T3>
-inline std::ostream& operator<<(
-    std::ostream& stream, const UnionType3<T1, T2, T3>& union_value) {
-
+inline std::ostream& operator<<(std::ostream& stream,
+                                const UnionType3<T1, T2, T3>& union_value) {
   if (union_value.template IsType<T1>()) {
     stream << union_value.template AsType<T1>();
   } else if (union_value.template IsType<T2>()) {
@@ -428,9 +418,7 @@
     new (storage_.void_data()) T4(arg);
   }
 
-  UnionType4(const UnionType4& other) {
-    ConstructFromOther(other);
-  }
+  UnionType4(const UnionType4& other) { ConstructFromOther(other); }
 
   UnionType4& operator=(const UnionType4& other) {
     if (&other != this) {
@@ -440,9 +428,7 @@
     return *this;
   }
 
-  ~UnionType4() {
-    Destruct();
-  }
+  ~UnionType4() { Destruct(); }
 
   // Forward these checks to the UnionTypeCheck helper class, which works around
   // being unable to do template specializations in class scope.
@@ -477,12 +463,12 @@
     static bool IsType(const UnionType4<T1, T2, T3, T4>* union_value) {
       return union_value->specific_type_ == kTypeT1;
     }
-    static typename internal::UnionTypeTraits<T1>::ReturnType
-        AsType(UnionType4<T1, T2, T3, T4>* union_value) {
+    static typename internal::UnionTypeTraits<T1>::ReturnType AsType(
+        UnionType4<T1, T2, T3, T4>* union_value) {
       return *(union_value->storage_.template data_as<T1>());
     }
-    static typename internal::UnionTypeTraits<T1>::ConstReturnType
-        AsType(const UnionType4<T1, T2, T3, T4>* union_value) {
+    static typename internal::UnionTypeTraits<T1>::ConstReturnType AsType(
+        const UnionType4<T1, T2, T3, T4>* union_value) {
       return *(union_value->storage_.template data_as<T1>());
     }
     friend class UnionType4<T1, T2, T3, T4>;
@@ -493,12 +479,12 @@
     static bool IsType(const UnionType4<T1, T2, T3, T4>* union_value) {
       return union_value->specific_type_ == kTypeT2;
     }
-    static typename internal::UnionTypeTraits<T2>::ReturnType
-        AsType(UnionType4<T1, T2, T3, T4>* union_value) {
+    static typename internal::UnionTypeTraits<T2>::ReturnType AsType(
+        UnionType4<T1, T2, T3, T4>* union_value) {
       return *(union_value->storage_.template data_as<T2>());
     }
-    static typename internal::UnionTypeTraits<T2>::ConstReturnType
-        AsType(const UnionType4<T1, T2, T3, T4>* union_value) {
+    static typename internal::UnionTypeTraits<T2>::ConstReturnType AsType(
+        const UnionType4<T1, T2, T3, T4>* union_value) {
       return *(union_value->storage_.template data_as<T2>());
     }
     friend class UnionType4<T1, T2, T3, T4>;
@@ -509,12 +495,12 @@
     static bool IsType(const UnionType4<T1, T2, T3, T4>* union_value) {
       return union_value->specific_type_ == kTypeT3;
     }
-    static typename internal::UnionTypeTraits<T3>::ReturnType
-        AsType(UnionType4<T1, T2, T3, T4>* union_value) {
+    static typename internal::UnionTypeTraits<T3>::ReturnType AsType(
+        UnionType4<T1, T2, T3, T4>* union_value) {
       return *(union_value->storage_.template data_as<T3>());
     }
-    static typename internal::UnionTypeTraits<T3>::ConstReturnType
-        AsType(const UnionType4<T1, T2, T3, T4>* union_value) {
+    static typename internal::UnionTypeTraits<T3>::ConstReturnType AsType(
+        const UnionType4<T1, T2, T3, T4>* union_value) {
       return *(union_value->storage_.template data_as<T3>());
     }
     friend class UnionType4<T1, T2, T3, T4>;
@@ -525,12 +511,12 @@
     static bool IsType(const UnionType4<T1, T2, T3, T4>* union_value) {
       return union_value->specific_type_ == kTypeT4;
     }
-    static typename internal::UnionTypeTraits<T4>::ReturnType
-        AsType(UnionType4<T1, T2, T3, T4>* union_value) {
+    static typename internal::UnionTypeTraits<T4>::ReturnType AsType(
+        UnionType4<T1, T2, T3, T4>* union_value) {
       return *(union_value->storage_.template data_as<T4>());
     }
-    static typename internal::UnionTypeTraits<T4>::ConstReturnType
-        AsType(const UnionType4<T1, T2, T3, T4>* union_value) {
+    static typename internal::UnionTypeTraits<T4>::ConstReturnType AsType(
+        const UnionType4<T1, T2, T3, T4>* union_value) {
       return *(union_value->storage_.template data_as<T4>());
     }
     friend class UnionType4<T1, T2, T3, T4>;
@@ -610,9 +596,8 @@
 
 // Needed to instantiate base::Optional<UnionTypeN>
 template <typename T1, typename T2, typename T3, typename T4>
-inline std::ostream& operator<<(
-    std::ostream& stream, const UnionType4<T1, T2, T3, T4>& union_value) {
-
+inline std::ostream& operator<<(std::ostream& stream,
+                                const UnionType4<T1, T2, T3, T4>& union_value) {
   if (union_value.template IsType<T1>()) {
     stream << union_value.template AsType<T1>();
   } else if (union_value.template IsType<T2>()) {
diff --git a/cobalt/script/union_type_internal.h b/cobalt/script/union_type_internal.h
index 54f6f17..879e63e 100644
--- a/cobalt/script/union_type_internal.h
+++ b/cobalt/script/union_type_internal.h
@@ -57,8 +57,8 @@
 };
 
 template <typename T>
-struct UnionTypeTraits<scoped_refptr<T> >
-    : UnionTypeDefaultTraits<scoped_refptr<T> > {
+struct UnionTypeTraits<scoped_refptr<T>>
+    : UnionTypeDefaultTraits<scoped_refptr<T>> {
   static base::TypeId GetTypeID() { return base::GetTypeId<T>(); }
   static const bool is_interface_type = true;
 };
diff --git a/cobalt/script/util/stack_trace_helpers.h b/cobalt/script/util/stack_trace_helpers.h
deleted file mode 100644
index caebaed..0000000
--- a/cobalt/script/util/stack_trace_helpers.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_SCRIPT_UTIL_STACK_TRACE_HELPERS_H_
-#define COBALT_SCRIPT_UTIL_STACK_TRACE_HELPERS_H_
-
-#include <string>
-
-#include "cobalt/script/stack_frame.h"
-#include "nb/rewindable_vector.h"
-
-namespace cobalt {
-namespace script {
-namespace util {
-
-class StackTraceGenerator {
- public:
-  virtual ~StackTraceGenerator() {}
-
-  // Returns |true| if the current StackTraceGenerator can generate information
-  // about the stack.
-  virtual bool Valid() = 0;
-
-  // Generates stack traces in the raw form. Returns true if any stack
-  // frames were generated. False otherwise. Output vector will be
-  // unconditionally rewound to being empty.
-  virtual bool GenerateStackTrace(int depth,
-                                  nb::RewindableVector<StackFrame>* out) = 0;
-
-  // Returns true if any stack traces were written. The output vector will be
-  // re-wound to being empty.
-  // The first position is the most immediate stack frame.
-  virtual bool GenerateStackTraceLines(
-      int depth, nb::RewindableVector<std::string>* out) = 0;
-
-  // Prints stack trace. Returns true on success.
-  virtual bool GenerateStackTraceString(int depth, std::string* out) = 0;
-
-  virtual bool GenerateStackTraceString(int depth, char* buff,
-                                        size_t buff_size) = 0;
-};
-
-// Get's the thread local StackTraceGenerator.
-// Defined in engine specific implementation.
-StackTraceGenerator* GetThreadLocalStackTraceGenerator();
-
-}  // namespace util
-}  // namespace script
-}  // namespace cobalt
-
-#endif  // COBALT_SCRIPT_UTIL_STACK_TRACE_HELPERS_H_
diff --git a/cobalt/script/v8c/BUILD.gn b/cobalt/script/v8c/BUILD.gn
index 3ecb6e0..af95907 100644
--- a/cobalt/script/v8c/BUILD.gn
+++ b/cobalt/script/v8c/BUILD.gn
@@ -77,7 +77,6 @@
     "isolate_fellowship.h",
     "native_promise.h",
     "scoped_persistent.h",
-    "stack_trace_helpers.cc",
     "switches.cc",
     "switches.h",
     "type_traits.h",
@@ -132,7 +131,6 @@
     "//cobalt/cache",
     "//cobalt/configuration",
     "//cobalt/script",
-    "//nb",
     "//third_party/v8",
     "//third_party/v8:v8_libplatform",
     "//third_party/v8/third_party/inspector_protocol:crdtp",
diff --git a/cobalt/script/v8c/cobalt_platform.cc b/cobalt/script/v8c/cobalt_platform.cc
index 161d6b6..796963a 100644
--- a/cobalt/script/v8c/cobalt_platform.cc
+++ b/cobalt/script/v8c/cobalt_platform.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
-#include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/script/v8c/cobalt_platform.h"
 
+#include <memory>
+
 #include "base/logging.h"
+#include "cobalt/base/polymorphic_downcast.h"
 
 namespace cobalt {
 namespace script {
@@ -47,13 +47,14 @@
   }
 }
 
-// Since we put these v8 tasks direclty on the message loop, all the tasks are
+// Since we put these v8 tasks directly on the message loop, all the tasks are
 // "NonNestable".
-void CobaltPlatform::CobaltV8TaskRunner::PostNonNestableTask(std::unique_ptr<v8::Task> task) {
+void CobaltPlatform::CobaltV8TaskRunner::PostNonNestableTask(
+    std::unique_ptr<v8::Task> task) {
   return PostTask(std::move(task));
 }
-void CobaltPlatform::CobaltV8TaskRunner::PostNonNestableDelayedTask(std::unique_ptr<v8::Task> task,
-                                    double delay_in_seconds) {
+void CobaltPlatform::CobaltV8TaskRunner::PostNonNestableDelayedTask(
+    std::unique_ptr<v8::Task> task, double delay_in_seconds) {
   return PostDelayedTask(std::move(task), 0);
 }
 
diff --git a/cobalt/script/v8c/conversion_helpers.cc b/cobalt/script/v8c/conversion_helpers.cc
index 08931b6..47ea07d 100644
--- a/cobalt/script/v8c/conversion_helpers.cc
+++ b/cobalt/script/v8c/conversion_helpers.cc
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/script/v8c/conversion_helpers.h"
-#include "nb/memory_scope.h"
+
 #include "v8/include/v8.h"
 
 namespace cobalt {
@@ -108,7 +108,6 @@
 // base::Time -> JSValue
 void ToJSValue(v8::Isolate* isolate, const base::Time& time,
                v8::Local<v8::Value>* out_value) {
-  TRACK_MEMORY_SCOPE("Javascript");
   *out_value =
       v8::Date::New(isolate->GetCurrentContext(),
                     time.is_null() ? std::numeric_limits<double>::quiet_NaN()
@@ -120,8 +119,6 @@
 void FromJSValue(v8::Isolate* isolate, v8::Local<v8::Value> value,
                  int conversion_flags, ExceptionState* exception_state,
                  base::Time* out_time) {
-  TRACK_MEMORY_SCOPE("Javascript");
-
   if (!value->IsObject()) {
     exception_state->SetSimpleException(kNotObjectType);
     return;
@@ -142,7 +139,6 @@
 void FromJSValue(v8::Isolate* isolate, v8::Local<v8::Value> value,
                  int conversion_flags, ExceptionState* exception_state,
                  V8cValueHandleHolder* out_holder) {
-  TRACK_MEMORY_SCOPE("Javascript");
   DCHECK_EQ(conversion_flags & ~kConversionFlagsValueHandle, 0)
       << "Unexpected conversion flags found.";
   // If |value| is expected to be an IDL object, then we are supposed to throw
diff --git a/cobalt/script/v8c/conversion_helpers.h b/cobalt/script/v8c/conversion_helpers.h
index d1779af..e9b2fd7 100644
--- a/cobalt/script/v8c/conversion_helpers.h
+++ b/cobalt/script/v8c/conversion_helpers.h
@@ -43,7 +43,6 @@
 #include "cobalt/script/v8c/v8c_user_object_holder.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
 #include "cobalt/script/value_handle.h"
-#include "nb/memory_scope.h"
 #include "v8/include/v8.h"
 
 namespace cobalt {
@@ -720,7 +719,6 @@
 template <typename T>
 void ToJSValue(v8::Isolate* isolate, const Handle<T>& local,
                v8::Local<v8::Value>* out_value) {
-  TRACK_MEMORY_SCOPE("Javascript");
   ToJSValue(isolate, local.GetScriptValue(), out_value);
 }
 
diff --git a/cobalt/script/v8c/isolate_fellowship.h b/cobalt/script/v8c/isolate_fellowship.h
index e90267c..ae938c0 100644
--- a/cobalt/script/v8c/isolate_fellowship.h
+++ b/cobalt/script/v8c/isolate_fellowship.h
@@ -15,6 +15,8 @@
 #ifndef COBALT_SCRIPT_V8C_ISOLATE_FELLOWSHIP_H_
 #define COBALT_SCRIPT_V8C_ISOLATE_FELLOWSHIP_H_
 
+#include <memory>
+
 #include "base/memory/singleton.h"
 #include "cobalt/configuration/configuration.h"
 #include "cobalt/script/v8c/cobalt_platform.h"
@@ -46,7 +48,6 @@
  private:
   IsolateFellowship();
   ~IsolateFellowship();
-
 };
 
 }  // namespace v8c
diff --git a/cobalt/script/v8c/v8c_callback_function.h b/cobalt/script/v8c/v8c_callback_function.h
index 6ff4d05..aefb7b9 100644
--- a/cobalt/script/v8c/v8c_callback_function.h
+++ b/cobalt/script/v8c/v8c_callback_function.h
@@ -27,7 +27,6 @@
 #include "cobalt/script/v8c/conversion_helpers.h"
 #include "cobalt/script/v8c/entry_scope.h"
 #include "cobalt/script/v8c/scoped_persistent.h"
-#include "nb/memory_scope.h"
 #include "v8/include/v8.h"
 
 namespace cobalt {
diff --git a/cobalt/script/v8c/v8c_callback_function.h.pump b/cobalt/script/v8c/v8c_callback_function.h.pump
index 325cdbb..d60339f 100644
--- a/cobalt/script/v8c/v8c_callback_function.h.pump
+++ b/cobalt/script/v8c/v8c_callback_function.h.pump
@@ -32,7 +32,6 @@
 #include "cobalt/script/v8c/conversion_helpers.h"
 #include "cobalt/script/v8c/entry_scope.h"
 #include "cobalt/script/v8c/scoped_persistent.h"
-#include "nb/memory_scope.h"
 #include "v8/include/v8.h"
 
 namespace cobalt {
diff --git a/cobalt/script/v8c/v8c_global_environment.cc b/cobalt/script/v8c/v8c_global_environment.cc
index c3df50c..9ec5c07 100644
--- a/cobalt/script/v8c/v8c_global_environment.cc
+++ b/cobalt/script/v8c/v8c_global_environment.cc
@@ -30,7 +30,6 @@
 #include "cobalt/script/v8c/v8c_source_code.h"
 #include "cobalt/script/v8c/v8c_user_object_holder.h"
 #include "cobalt/script/v8c/v8c_value_handle.h"
-#include "nb/memory_scope.h"
 #include "starboard/common/murmurhash2.h"
 
 
@@ -92,15 +91,14 @@
       destruction_helper_(isolate),
       wrapper_factory_(new WrapperFactory(isolate)),
       script_value_factory_(new V8cScriptValueFactory(isolate)) {
-  TRACK_MEMORY_SCOPE("Javascript");
   TRACE_EVENT0("cobalt::script",
                "V8cGlobalEnvironment::V8cGlobalEnvironment()");
   wrapper_factory_.reset(new WrapperFactory(isolate));
   isolate_->SetData(kIsolateDataIndex, this);
   DCHECK(isolate_->GetData(kIsolateDataIndex) == this);
 
-  isolate_->SetAllowCodeGenerationFromStringsCallback(
-      AllowCodeGenerationFromStringsCallback);
+  isolate_->SetModifyCodeGenerationFromStringsCallback(
+      ModifyCodeGenerationFromStringsCallback);
 
   isolate_->SetAllowWasmCodeGenerationCallback(
       [](v8::Local<v8::Context> context, v8::Local<v8::String> source) {
@@ -127,7 +125,6 @@
 
 void V8cGlobalEnvironment::CreateGlobalObject() {
   TRACE_EVENT0("cobalt::script", "V8cGlobalEnvironment::CreateGlobalObject()");
-  TRACK_MEMORY_SCOPE("Javascript");
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   // Intentionally not an |EntryScope|, since the context doesn't exist yet.
@@ -143,7 +140,6 @@
 bool V8cGlobalEnvironment::EvaluateScript(
     const scoped_refptr<SourceCode>& source_code,
     std::string* out_result_utf8) {
-  TRACK_MEMORY_SCOPE("Javascript");
   TRACE_EVENT0("cobalt::script", "V8cGlobalEnvironment::EvaluateScript()");
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
@@ -181,7 +177,6 @@
     const scoped_refptr<SourceCode>& source_code,
     const scoped_refptr<Wrappable>& owning_object,
     base::Optional<ValueHandleHolder::Reference>* out_value_handle) {
-  TRACK_MEMORY_SCOPE("Javascript");
   TRACE_EVENT0("cobalt::script", "V8cGlobalEnvironment::EvaluateScript()");
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
@@ -259,7 +254,6 @@
 }
 
 void V8cGlobalEnvironment::AllowGarbageCollection(Wrappable* wrappable) {
-  TRACK_MEMORY_SCOPE("Javascript");
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   RemoveRoot(wrappable);
@@ -314,7 +308,6 @@
 void V8cGlobalEnvironment::Bind(const std::string& identifier,
                                 const scoped_refptr<Wrappable>& impl) {
   TRACE_EVENT0("cobalt::script", "V8cGlobalEnvironment::Bind()");
-  TRACK_MEMORY_SCOPE("Javascript");
   DCHECK(impl);
 
   EntryScope entry_scope(isolate_);
@@ -336,7 +329,6 @@
                                   const scoped_refptr<Wrappable>& impl,
                                   const std::string& local_object_name) {
   TRACE_EVENT0("cobalt::script", "V8cGlobalEnvironment::BindTo()");
-  TRACK_MEMORY_SCOPE("Javascript");
   DCHECK(impl);
 
   EntryScope entry_scope(isolate_);
@@ -379,8 +371,10 @@
 }
 
 // static
-bool V8cGlobalEnvironment::AllowCodeGenerationFromStringsCallback(
-    v8::Local<v8::Context> context, v8::Local<v8::String> source) {
+v8::ModifyCodeGenerationFromStringsResult
+V8cGlobalEnvironment::ModifyCodeGenerationFromStringsCallback(
+    v8::Local<v8::Context> context, v8::Local<v8::Value> source,
+    bool is_code_like) {
   V8cGlobalEnvironment* global_environment =
       V8cGlobalEnvironment::GetFromIsolate(context->GetIsolate());
   DCHECK(global_environment);
@@ -393,7 +387,7 @@
   // WebAssembly callback has not been explicitly set, however we *have* set
   // one.
   DCHECK_EQ(context->IsCodeGenerationFromStringsAllowed(), false);
-  return context->IsCodeGenerationFromStringsAllowed();
+  return {context->IsCodeGenerationFromStringsAllowed(), {}};
 }
 
 // static
@@ -402,14 +396,14 @@
   v8::Isolate* isolate = v8::Isolate::GetCurrent();
   V8cGlobalEnvironment* global_environment =
       V8cGlobalEnvironment::GetFromIsolate(isolate);
-  if (isolate->GetEnteredContext().IsEmpty()) {
+  if (isolate->GetEnteredOrMicrotaskContext().IsEmpty()) {
     return;
   }
   if (message->ErrorLevel() != v8::Isolate::kMessageError) {
     return;
   }
 
-  v8::Local<v8::Context> context = isolate->GetEnteredContext();
+  v8::Local<v8::Context> context = isolate->GetEnteredOrMicrotaskContext();
   ErrorReport error_report;
   error_report.message = *v8::String::Utf8Value(isolate, message->Get());
   error_report.filename =
@@ -431,7 +425,6 @@
 
 v8::MaybeLocal<v8::Value> V8cGlobalEnvironment::EvaluateScriptInternal(
     const scoped_refptr<SourceCode>& source_code) {
-  TRACK_MEMORY_SCOPE("Javascript");
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   // Note that we expect an |EntryScope| and |v8::TryCatch| to have been set
@@ -553,7 +546,6 @@
                                                   const char* filename) {
   TRACE_EVENT1("cobalt::script", "V8cGlobalEnvironment::EvaluateEmbeddedScript",
                "filename", filename);
-  TRACK_MEMORY_SCOPE("Javascript");
   std::string source(reinterpret_cast<const char*>(data), size);
   scoped_refptr<SourceCode> source_code =
       new V8cSourceCode(source, base::SourceLocation(filename, 1, 1));
diff --git a/cobalt/script/v8c/v8c_global_environment.h b/cobalt/script/v8c/v8c_global_environment.h
index 265c2e1..6996e62 100644
--- a/cobalt/script/v8c/v8c_global_environment.h
+++ b/cobalt/script/v8c/v8c_global_environment.h
@@ -151,8 +151,10 @@
     v8::Isolate* isolate_;
   };
 
-  static bool AllowCodeGenerationFromStringsCallback(
-      v8::Local<v8::Context> context, v8::Local<v8::String> source);
+  static v8::ModifyCodeGenerationFromStringsResult
+  ModifyCodeGenerationFromStringsCallback(v8::Local<v8::Context> context,
+                                          v8::Local<v8::Value> source,
+                                          bool is_code_like);
 
   static void MessageHandler(v8::Local<v8::Message> message,
                              v8::Local<v8::Value> data);
diff --git a/cobalt/script/v8c/v8c_heap_tracer.cc b/cobalt/script/v8c/v8c_heap_tracer.cc
index cd20679..841ca15 100644
--- a/cobalt/script/v8c/v8c_heap_tracer.cc
+++ b/cobalt/script/v8c/v8c_heap_tracer.cc
@@ -92,7 +92,8 @@
           wrapper_factory->MaybeGetWrapperPrivate(
               static_cast<Wrappable*>(traceable));
       if (maybe_wrapper_private) {
-        RegisterEmbedderReference(maybe_wrapper_private->traced_global().As<v8::Data>());
+        RegisterEmbedderReference(
+            maybe_wrapper_private->traced_global().As<v8::Data>());
       }
     }
 
diff --git a/cobalt/script/v8c/v8c_heap_tracer.h b/cobalt/script/v8c/v8c_heap_tracer.h
index a807bfa..fb4c363 100644
--- a/cobalt/script/v8c/v8c_heap_tracer.h
+++ b/cobalt/script/v8c/v8c_heap_tracer.h
@@ -70,9 +70,7 @@
 
   // Used during shutdown to ask V8cHeapTracer do nothing so that V8 can
   // GC every embedder-created object.
-  void DisableForShutdown() {
-    disabled_ = true;
-  }
+  void DisableForShutdown() { disabled_ = true; }
 
  private:
   void MaybeAddToFrontier(Traceable* traceable);
diff --git a/cobalt/script/v8c/v8c_script_debugger.cc b/cobalt/script/v8c/v8c_script_debugger.cc
index 197f747..f9b4733 100644
--- a/cobalt/script/v8c/v8c_script_debugger.cc
+++ b/cobalt/script/v8c/v8c_script_debugger.cc
@@ -27,7 +27,6 @@
 #include "cobalt/script/v8c/conversion_helpers.h"
 #include "cobalt/script/v8c/v8c_tracing_controller.h"
 #include "include/inspector/Runtime.h"  // generated
-#include "nb/memory_scope.h"
 #include "v8/include/libplatform/v8-tracing.h"
 #include "v8/include/v8-inspector.h"
 #include "v8/third_party/inspector_protocol/crdtp/json.h"
@@ -139,8 +138,6 @@
                                sizeof(kContextName) - 1)));
 }
 
-V8cScriptDebugger::~V8cScriptDebugger() {}
-
 void V8cScriptDebugger::Attach(const std::string& state) {
   DCHECK(!inspector_session_);
   inspector_session_ =
@@ -172,7 +169,6 @@
 
 bool V8cScriptDebugger::EvaluateDebuggerScript(const std::string& js_code,
                                                std::string* out_result_utf8) {
-  TRACK_MEMORY_SCOPE("Javascript");
   TRACE_EVENT0("cobalt::script", "V8cScriptDebugger::EvaluateDebuggerScript()");
 
   v8::Isolate* isolate = global_environment_->isolate();
diff --git a/cobalt/script/v8c/v8c_script_debugger.h b/cobalt/script/v8c/v8c_script_debugger.h
index ac71e77..95c76d3 100644
--- a/cobalt/script/v8c/v8c_script_debugger.h
+++ b/cobalt/script/v8c/v8c_script_debugger.h
@@ -34,8 +34,9 @@
  public:
   V8cScriptDebugger(V8cGlobalEnvironment* v8c_global_environment,
                     Delegate* delegate);
-  ~V8cScriptDebugger() override;
+  ~V8cScriptDebugger() override {}
 
+  // From ScriptDebugger.
   void Attach(const std::string& state) override;
   std::string Detach() override;
 
@@ -60,6 +61,7 @@
   PauseOnExceptionsState SetPauseOnExceptions(
       PauseOnExceptionsState state) override;
 
+  // From base::DebuggerHooks.
   void AsyncTaskScheduled(const void* task, const std::string& name,
                           bool recurring) override;
   void AsyncTaskStarted(const void* task) override;
@@ -67,7 +69,7 @@
   void AsyncTaskCanceled(const void* task) override;
   void AllAsyncTasksCanceled() override;
 
-  // v8_inspector::V8InspectorClient implementation.
+  // From v8_inspector::V8InspectorClient.
   void runMessageLoopOnPause(int contextGroupId) override;
   void quitMessageLoopOnPause() override;
   void runIfWaitingForDebugger(int contextGroupId) override;
@@ -82,7 +84,7 @@
                          unsigned lineNumber, unsigned columnNumber,
                          v8_inspector::V8StackTrace*) override;
 
-  // v8_inspector::V8Inspector::Channel implementation.
+  // From v8_inspector::V8Inspector::Channel.
   void sendResponse(
       int callId, std::unique_ptr<v8_inspector::StringBuffer> message) override;
   void sendNotification(
diff --git a/cobalt/script/v8c/v8c_tracing_controller.h b/cobalt/script/v8c/v8c_tracing_controller.h
index c346eb6..dbd6467 100644
--- a/cobalt/script/v8c/v8c_tracing_controller.h
+++ b/cobalt/script/v8c/v8c_tracing_controller.h
@@ -15,6 +15,7 @@
 #ifndef COBALT_SCRIPT_V8C_V8C_TRACING_CONTROLLER_H_
 #define COBALT_SCRIPT_V8C_V8C_TRACING_CONTROLLER_H_
 
+#include <memory>
 #include <string>
 #include <vector>
 
diff --git a/cobalt/script/v8c/v8c_user_object_holder.h b/cobalt/script/v8c/v8c_user_object_holder.h
index 8548849..749690c 100644
--- a/cobalt/script/v8c/v8c_user_object_holder.h
+++ b/cobalt/script/v8c/v8c_user_object_holder.h
@@ -45,8 +45,7 @@
   V8cUserObjectHolder(v8::Isolate* isolate, v8::Local<v8::Value> value)
       : isolate_(isolate),
         handle_(isolate, value),
-        prevent_garbage_collection_count_(0) {
-  }
+        prevent_garbage_collection_count_(0) {}
   V8cUserObjectHolder(const V8cUserObjectHolder&) = delete;
   V8cUserObjectHolder& operator=(const V8cUserObjectHolder&) = delete;
   V8cUserObjectHolder(V8cUserObjectHolder&& other)
@@ -140,4 +139,4 @@
 }  // namespace script
 }  // namespace cobalt
 
-#endif  // COBALT_SCRIPT_V8C_V8C_USER_OBJECT_HOLDER_H_
\ No newline at end of file
+#endif  // COBALT_SCRIPT_V8C_V8C_USER_OBJECT_HOLDER_H_
diff --git a/cobalt/script/wrappable.h b/cobalt/script/wrappable.h
index 28cced8..a99d039 100644
--- a/cobalt/script/wrappable.h
+++ b/cobalt/script/wrappable.h
@@ -16,6 +16,7 @@
 #define COBALT_SCRIPT_WRAPPABLE_H_
 
 #include <memory>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/logging.h"
@@ -77,7 +78,7 @@
   virtual JSObjectType GetJSObjectType() { return JSObjectType::kObject; }
 
  protected:
-  virtual ~Wrappable() { }
+  virtual ~Wrappable() {}
 
  private:
   // A cached weak reference to the interface's corresponding wrapper object.
diff --git a/cobalt/site/docs/contributors/index.md b/cobalt/site/docs/contributors/index.md
index 77811fa..3eb235f 100644
--- a/cobalt/site/docs/contributors/index.md
+++ b/cobalt/site/docs/contributors/index.md
@@ -4,61 +4,6 @@
 ---
 
 We'd love to hear about how you would like to contribute to Cobalt!
-Please read through this document first to understand the process and
-to make sure you know what to expect.
 
-## Before You Contribute
-
-### As an Individual
-
-Before Cobalt can use your code, as an unaffiliated individual, you must sign
-the [Google Individual Contributor License
-Agreement](https://cla.developers.google.com/about/google-individual) (CLA).
-You can complete that process online.
-
-### As a Company
-
-If you represent a company that wishes to have one or more employees contribute
-to Cobalt on behalf of your company, you need to agree to the
-[Software Grant and Corporate Contributor License Agreement](
-https://cla.developers.google.com/about/google-corporate).
-
-### What is a CLA?
-
-The Contributor License Agreement is necessary mainly because you own the
-copyright to your changes, even after your contribution becomes part of our
-codebase, so we need your permission to use and distribute your code. We also
-need to be sure of various other things — for instance that you‘ll tell us if
-you know that your code infringes on other people’s patents.
-
-You don‘t have to sign the CLA until after you’ve submitted your code for
-review and a member has approved it, but you must do it before we can put
-your code into our codebase. Before you start working on a larger
-contribution, get in touch with us to discuss your idea so that we can help
-out and possibly guide you. Early coordination makes it much easier to avoid
-frustration later on.
-
-### Code Reviews
-
-All submissions, including submissions by project members, require review. We
-currently use [Gerrit Code Review](https://www.gerritcodereview.com/) for this
-purpose. Currently, team-member submissions are reviewed privately, and
-external submissions go through public reviews.
-
-## Submission Process
-
-The following steps explain the submission process:
-
-*  Ensure you or your company have signed the appropriate CLA as discussed
-   in the [Before You Contribute](#before-you-contribute) section above.
-*  Rebase your changes down into a single git commit.
-*  Run `git push origin HEAD:refs/for/master` to upload the review to
-   [Cobalt's Gerrit instance](https://cobalt-review.googlesource.com/).
-*  Someone from the maintainers team reviews the code, adding comments on
-   any things that need to change before the code can be submitted.
-*  If you need to make changes, make them locally, test them, then
-   `git commit --amend` to add them to the **existing** commit. Then return
-   to step 2.
-*  If you do not need to make any more changes, a maintainer integrates the
-   change into our private repository, and it is pushed out to the public
-   repository after some time.
+Please find the contribution guidelines in the Cobalt
+[GitHub repo](https://github.com/youtube/cobalt/blob/main/CONTRIBUTING.md).
diff --git a/cobalt/site/docs/development/setup-docker.md b/cobalt/site/docs/development/setup-docker.md
index d7b2beb..ae9c1b1 100644
--- a/cobalt/site/docs/development/setup-docker.md
+++ b/cobalt/site/docs/development/setup-docker.md
@@ -4,7 +4,7 @@
 ---
 
 We provide <a
-href="https://cobalt.googlesource.com/cobalt/+/refs/heads/22.lts.stable/src/docker/linux/">Docker image definitions</a> to simplify managing build environments.
+href="https://github.com/youtube/cobalt/tree/main/docker/linux/">Docker image definitions</a> to simplify managing build environments.
 
 The instructions below assume Docker is installed and is able to run basic
 hello-world verification. `docker-compose` command is expected to be available as well.
@@ -15,7 +15,7 @@
 `cobalt` directory that contains the repository:
 
 ```
-$ git clone https://cobalt.googlesource.com/cobalt
+$ git clone https://github.com/youtube/cobalt.git
 $ cd cobalt
 ```
 
@@ -38,7 +38,7 @@
 `qa` and `gold`, and target is the build target passed to ninja
 
 See <a
-href="https://cobalt.googlesource.com/cobalt/+/refs/heads/22.lts.stable/src/README.md#build-types">Cobalt README</a> for full details.
+href="https://github.com/youtube/cobalt#building-and-running-the-code">Cobalt README</a> for full details.
 
 Builds will be available in your `${COBALT_SRC}/out` directory.
 
@@ -47,6 +47,15 @@
 output files in `src/out/<platform>` directory have `root` as file owner.
 </aside>
 
+#### Windows Builds
+
+We have a separate docker compose file for windows. Use the -f or --file flags
+to specify a configuration file to use.
+
+```
+docker-compose -f docker-compose-windows.yml run win-win32
+```
+
 ### Customization
 
 To parametrize base operating system images used for the build, pass
@@ -90,4 +99,4 @@
 ```
 
 and try to build Cobalt with the <a
-href="https://cobalt.googlesource.com/cobalt/+/refs/heads/22.lts.stable/src/README.md#building-and-running-the-code">usual GN / ninja flow.</a>
+href="https://github.com/youtube/cobalt#building-and-running-the-code">usual GN / ninja flow.</a>
diff --git a/cobalt/site/docs/development/setup-linux.md b/cobalt/site/docs/development/setup-linux.md
index 0acdd64..124a3d0 100644
--- a/cobalt/site/docs/development/setup-linux.md
+++ b/cobalt/site/docs/development/setup-linux.md
@@ -9,7 +9,7 @@
 on the machine that you are using to view the client. For example, you cannot
 SSH into another machine and run the binary on that machine.
 
-These instructions were tested on a fresh ubuntu:20.04 Docker image. (1/12/22)
+These instructions were tested on a clean ubuntu:20.04 Docker image. (7/11/23)
 Required libraries can differ depending on your Linux distribution and version.
 
 ## Set up your workstation
@@ -19,10 +19,22 @@
 
     ```
     $ sudo apt update && sudo apt install -qqy --no-install-recommends \
-        pkgconf ninja-build bison nasm yasm binutils clang libgles2-mesa-dev \
-        mesa-common-dev libpulse-dev libavresample-dev libasound2-dev \
-        libxrender-dev libxcomposite-dev libxml2-dev curl git \
-        python3.8-venv libxi-dev
+        bison clang libasound2-dev libgles2-mesa-dev libglib2.0-dev \
+        libxcomposite-dev libxi-dev libxrender-dev nasm ninja-build \
+        python3.8-venv
+    ```
+
+1.  Install ccache to support build acceleration. Build acceleration is \
+    enabled by default and must be disabled if ccache is not installed.
+
+    ```
+    $ sudo apt install -qqy --no-install-recommends ccache
+    ```
+
+    We recommend adjusting the cache size as needed to increase cache hits:
+
+    ```
+    $ ccache --max-size=20G
     ```
 
 1.  Install Node.js via `nvm`:
@@ -39,19 +51,6 @@
         && nvm use default
     ```
 
-1.  Install ccache to support build acceleration. ccache is automatically used
-    when available, otherwise defaults to unaccelerated building:
-
-    ```
-    $ sudo apt install -qqy --no-install-recommends ccache
-    ```
-
-    We recommend adjusting the cache size as needed to increase cache hits:
-
-    ```
-    $ ccache --max-size=20G
-    ```
-
 1.  Install GN, which we use for our build system code. There are a few ways to
     get the binary, follow the instructions for whichever way you prefer
     [here](https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/#getting-a-binary).
@@ -60,7 +59,7 @@
     `cobalt` directory that contains the repository:
 
     ```
-    $ git clone https://cobalt.googlesource.com/cobalt
+    $ git clone https://github.com/youtube/cobalt.git
     ```
 
 1.  Set `PYTHONPATH` environment variable to include the full path to the
@@ -200,10 +199,3 @@
 better understand Cobalt's execution flow in general.
 
 Simply build and run one of these configs and observe the terminal output.
-<!--
-<aside class="note">
-<b>Note:</b> If you plan to upload reviews to the Cobalt repository, you
-also need to <a href="/development/setup-gitcookies.html">follow these
-instructions</a> to set up a <code>.gitcookies</code> file.
-</aside>
--->
diff --git a/cobalt/site/docs/development/setup-raspi.md b/cobalt/site/docs/development/setup-raspi.md
index 60a2099..84952f3 100644
--- a/cobalt/site/docs/development/setup-raspi.md
+++ b/cobalt/site/docs/development/setup-raspi.md
@@ -54,8 +54,8 @@
 
     ```
     $ sudo apt install -qqy --no-install-recommends g++-multilib \
-        wget xz-utils libxml2  binutils-aarch64-linux-gnu \
-        binutils-arm-linux-gnueabi  libglib2.0-dev
+        wget xz-utils libxml2 binutils-aarch64-linux-gnu \
+        binutils-arm-linux-gnueabi libglib2.0-dev
     ```
 
 1.  Choose a location for the installed toolchain &ndash; e.g. `raspi-tools`
diff --git a/cobalt/site/docs/development/setup-windows.md b/cobalt/site/docs/development/setup-windows.md
new file mode 100644
index 0000000..65b9496
--- /dev/null
+++ b/cobalt/site/docs/development/setup-windows.md
@@ -0,0 +1,266 @@
+---

+layout: doc

+title: "Set up your environment - Windows"

+---

+

+These instructions explain how Windows users can set up their Cobalt development

+environment, clone a copy of the Cobalt code repository, and build a Cobalt

+binary. Note that the binary has a graphical client and must be run locally on

+the machine that you are using to view the client. For example, you cannot SSH

+into another machine and run the binary on that machine.

+

+## Set up your workstation

+

+1.  Install the following required packages:

+    * [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)

+    (see the `Installing on Windows` instructions)

+    * [ninja](https://ninja-build.org/) (see the `Getting Ninja` instructions)

+    * [nodejs](https://nodejs.org/en)

+    * [python3](https://www.python.org/downloads/)

+    * The following [VS2022](https://visualstudio.microsoft.com/vs/) components:

+      * Microsoft.VisualStudio.Component.VC.14.34.17.4.x86.x64

+      * Microsoft.VisualStudio.Component.VC.Llvm.Clang

+      * Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset

+      * Microsoft.VisualStudio.Component.Windows10SDK.18362

+      * Microsoft.VisualStudio.Workload.NativeDesktop

+    * [winflexbison](https://github.com/lexxmark/winflexbison)

+

+    <aside class="note">

+      <b>Note:</b> By default, Cobalt's build system will check

+      C:\Program Files (x86)\ for the Visual Studio install directory. If you

+      installed it elsewhere, you can set the `VSINSTALLDIR` environment

+      variable to point to the correct location. For example

+      `C:/Program Files/Microsoft Visual Studio/2022/Professional`

+    </aside>

+

+1.  Install GN, which we use for our build system code. There are a few ways to

+    get the binary, follow the instructions for whichever way you prefer

+    [here](https://cobalt.googlesource.com/third_party/gn/+/refs/heads/main/#getting-a-binary).

+

+1.  (Optional)

+    [Install Sccache](https://github.com/mozilla/sccache#installation) to

+    support build acceleration.

+

+1.  Make sure all of the above installed packages are on your Path environment

+    variable.

+

+    ```

+    "C:\Program Files\Git"

+    "C:\Program Files\Ninja"

+    "C:\Program Files\nodejs"

+    "C:\python_38" # Python 3.8 is the oldest supported python version. You may have a newer version installed.

+    "C:\python_38\Scripts"

+    "C:\winflexbison" # Or wherever you chose to unpack the zip file

+    "C:\gn"

+    "C:\sccache"

+    ```

+

+1.  Clone the Cobalt code repository. The following `git` command creates a

+    `cobalt` directory that contains the repository:

+

+    ```

+    $ git clone https://github.com/youtube/cobalt.git

+    ```

+

+    <aside class="note">

+      If you plan to contribute to the Cobalt codebase it is recommended that

+      you create your own

+      [fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/about-forks)

+      of the [Cobalt repository](https://github.com/youtube/cobalt), apply

+      changes to the fork, and then

+      [create a pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork)

+      to merge those changes into the Cobalt repository.

+    </aside>

+

+1.  Set the `PYTHONPATH` environment variable to include the full path to the

+    top-level `cobalt` directory from the previous step.

+

+### Set up Developer Tools

+

+1.  Enter your new `cobalt` directory:

+

+    ```

+    $ cd cobalt

+    ```

+

+1.  Create a virtual evnrionment by running the following in cmd:

+

+    ```

+    py -3 -m venv "%HOME%/.virtualenvs/cobalt_dev"

+    "%HOME%/.virtualenvs/cobalt_dev/Scripts/activate.bat"

+    pip install -r requirements.txt

+    ```

+

+    Or the following in Powershell:

+

+    ```

+    py -3 -m venv $env:HOME/.virtualenvs/cobalt_dev

+    $env:HOME/.virtualenvs/cobalt_dev/Scripts/activate.ps1

+    pip install -r requirements.txt

+    ```

+

+    Or the following in Git Bash:

+

+    ```

+    py -3 -m venv ~/.virtualenvs/cobalt_dev

+    source ~/.virtualenvs/cobalt_dev/Scripts/activate

+    pip install -r requirements.txt

+    ```

+

+1.  Install the pre-commit hooks:

+

+    ```

+    $ pre-commit install -t post-checkout -t pre-commit -t pre-push --allow-missing-config

+    $ git checkout -b <my-branch-name> origin/main

+    ```

+

+## Build and Run Cobalt

+

+1.  Build the code running the following command in the top-level `cobalt`

+    directory. You must specify a platform when running this command. On Windows

+    the canonical platform is `win-win32`.

+

+    You can also use the `-c` command-line flag to specify a `build_type`.

+    Valid build types are `debug`, `devel`, `qa`, and `gold`. If you

+    specify a build type, the command finishes sooner. Otherwise, all types

+    are built.

+

+    ```

+    $ python cobalt/build/gn.py [-c <build_type>] -p <platform>

+    ```

+

+1.  Compile the code from the `cobalt/` directory:

+

+    ```

+    $ ninja -C out/<platform>_<build_type> <target_name>

+    ```

+

+    The previous command contains three variables:

+

+    1.  `<platform>` is the [platform

+        configuration](/starboard/porting.html#1-enumerate-and-name-your-platform-configurations)

+        that identifies the platform. As described in the Starboard porting

+        guide, it contains a `family name` (like `linux`) and a

+        `binary variant` (like `x64x11`), separated by a hyphen.

+    1.  `<build_type>` is the build you are compiling. Possible values are

+        `debug`, `devel`, `qa`, and `gold`.

+    1.  `<target_name>` is the name assigned to the compiled code and it is

+        used to run the code compiled in this step. The most common names are

+        `cobalt`, `nplb`, and `all`:

+        *   `cobalt` builds the Cobalt app.

+        *   `nplb` builds Starboard's platform verification test suite to

+            ensure that your platform's code passes all tests for running

+            Cobalt.

+        *   `all` builds all targets.

+

+    For example:

+

+    ```

+    ninja -C out/win-win32_debug cobalt

+    ```

+

+    This command compiles the Cobalt `debug` configuration for the

+    `win-win32` platform and creates a target named `cobalt` that

+    you can then use to run the compiled code.

+

+1.  Run the compiled code to launch the Cobalt client:

+

+    ```

+    # Note that 'cobalt' was the <target_name> from the previous step.

+    $ out/win-win32_debug/cobalt [--url=<url>]

+    ```

+

+    The flags in the following table are frequently used, and the full set

+    of flags that this command supports are in

+    [cobalt/browser/switches.cc](https://github.com/youtube/cobalt/blob/main/cobalt/browser/switches.cc).

+

+    <table class="details responsive">

+      <tr>

+        <th colspan="2">Flags</th>

+      </tr>

+      <tr>

+        <td><code>allow_http</code></td>

+        <td>Indicates that you want to use <code>http</code> instead of

+            <code>https</code>.</td>

+      </tr>

+      <tr>

+        <td><code>ignore_certificate_errors</code></td>

+        <td>Indicates that you want to connect to an <code>https</code> host

+            that doesn't have a certificate that can be validated by our set

+            of root CAs.</td>

+      </tr>

+      <tr>

+        <td><code>url</code></td>

+        <td>Defines the startup URL that Cobalt will use. If no value is set,

+            then Cobalt uses a default URL. This option lets you point at a

+            different app than the YouTube app.</td>

+      </tr>

+    </table>

+

+## Debugging Cobalt

+

+`debug`, `devel`, and `qa` configs of Cobalt expose a feature enabling

+developers to trace Cobalt's callstacks per-thread. This is not only a great way

+to debug application performance, but also a great way to debug issues and

+better understand Cobalt's execution flow in general.

+

+Simply build and run one of these configs and observe the terminal output.

+

+## Cobalt on Xbox One

+

+In order to build Cobalt for Xbox One, you will need access to Microsoft's XDK.

+In order to sideload and run custom apps on Xbox you will need either an Xbox

+devkit or the ability to put an Xbox into developer mode. Those steps are

+outside the scope of this document.

+

+### AppxManifest Settings

+

+Cobalt makes use of several template files and a settings file to generate an

+AppxManifest.xml during the ninja step. The settings can be found in

+`starboard/xb1/appx_product_settings.py`. Most of the default values are stubs

+and intended to be overwritten by developers creating their own app with Cobalt,

+but they should work for local testing.

+

+<aside class="note">

+  <b>Note:</b> if you change the value of `PUBLISHER` in

+  `appx_product_settings.py` you <b>must</b> regenerate a pfx file in order for

+  the packaging step below to work correctly. Follow the instructions in

+  `starboard/xb1/cert/README.md` to generate your own pfx.

+</aside>

+

+### Build Cobalt

+

+To build Cobalt for the Xbox One, set the platform to `xb1` in the gn step:

+

+```

+$ python cobalt/build/gn.py [-c <build_type>] -p xb1

+```

+

+Then specify the `cobalt_install` build target in the ninja step:

+

+```

+ninja -C out/xb1_devel cobalt_install

+```

+

+### Package an Appx

+

+There's a convenience script at `starboard/xb1/tools/packager.py` for packaging

+the compiled code into an appx and then signing the appx with the pfx file

+located at `starboard/xb1/cert/cobalt.pfx`. The source, output, and product

+flags must be specified, and the only valid product for an external build is

+`cobalt`. Here's an example usage:

+

+```

+python starboard/xb1/tools/packager.py -s out/xb1_devel/ -o out/xb1_devel/package -p cobalt

+```

+

+Alternatively, you can use the

+[MakeAppx](https://learn.microsoft.com/en-us/windows/win32/appxpkg/make-appx-package--makeappx-exe-)

+and

+[SignTool](https://learn.microsoft.com/en-us/windows/win32/seccrypto/signtool)

+PowerShell commands to manually perform those steps.

+

+Once the appx has been created and signed, it can be deployed to an Xbox using

+the

+[WinAppDeployCmd](https://learn.microsoft.com/en-us/windows/uwp/packaging/install-universal-windows-apps-with-the-winappdeploycmd-tool)

+PowerShell command.

diff --git a/cobalt/site/docs/gen/cobalt/doc/cvals.md b/cobalt/site/docs/gen/cobalt/doc/cvals.md
index 752fc7f..665c6a1 100644
--- a/cobalt/site/docs/gen/cobalt/doc/cvals.md
+++ b/cobalt/site/docs/gen/cobalt/doc/cvals.md
@@ -79,7 +79,7 @@
 
 #### PublicCVals
 
-*   **Count.DOM.EventListeners** - The total number of EventListeners in
+*   **Count.WEB.EventListeners** - The total number of EventListeners in
     existence globally. This includes ones that are pending garbage collection.
 *   **Count.DOM.Nodes** - The total number of Nodes in existence globally. This
     includes ones that are pending garbage collection.
@@ -95,7 +95,7 @@
 
 #### DebugCVals
 
-*   **Count.DOM.ActiveJavaScriptEvents** - The number of JavaScript events that
+*   **Count.WEB.ActiveJavaScriptEvents** - The number of JavaScript events that
     are currently running.
 *   **Count.DOM.Attrs** - The total number of Attrs in existence globally. This
     includes ones that are pending garbage collection.
diff --git a/cobalt/site/docs/reference/starboard/configuration-public.md b/cobalt/site/docs/reference/starboard/configuration-public.md
index 285f90e..44659a2 100644
--- a/cobalt/site/docs/reference/starboard/configuration-public.md
+++ b/cobalt/site/docs/reference/starboard/configuration-public.md
@@ -50,7 +50,6 @@
 
 | Properties |
 | :--- |
-| **`SB_HAS_BILINEAR_FILTERING_SUPPORT`**<br><br>Indicates whether or not the given platform supports bilinear filtering. This can be checked to enable/disable renderer tests that verify that this is working properly.<br><br>The default value in the Stub implementation is `1` |
 | **`SB_HAS_NV12_TEXTURE_SUPPORT`**<br><br>Indicates whether or not the given platform supports rendering of NV12 textures. These textures typically originate from video decoders.<br><br>The default value in the Stub implementation is `0` |
 | **`SB_HAS_VIRTUAL_REALITY`**<br><br>The default value in the Stub implementation is `1` |
 
diff --git a/cobalt/site/docs/reference/starboard/modules/13/accessibility.md b/cobalt/site/docs/reference/starboard/modules/13/accessibility.md
index a6c8460..1a5adcb 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/accessibility.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/accessibility.md
@@ -251,4 +251,3 @@
 ```
 bool SbAccessibilitySetCaptionsEnabled(bool enabled)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/atomic.md b/cobalt/site/docs/reference/starboard/modules/13/atomic.md
index 5f79990..9741f3c 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/atomic.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/atomic.md
@@ -108,4 +108,3 @@
 ```
 static SbAtomic8 SbAtomicRelease_CompareAndSwap8(volatile SbAtomic8 *ptr, SbAtomic8 old_value, SbAtomic8 new_value)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/byte_swap.md b/cobalt/site/docs/reference/starboard/modules/13/byte_swap.md
index 580bc5d..c83927d 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/byte_swap.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/byte_swap.md
@@ -73,4 +73,3 @@
 ```
 uint64_t SbByteSwapU64(uint64_t value)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/condition_variable.md b/cobalt/site/docs/reference/starboard/modules/13/condition_variable.md
index 836c4b8..e58e106 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/condition_variable.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/condition_variable.md
@@ -138,4 +138,3 @@
 ```
 SbConditionVariableResult SbConditionVariableWaitTimed(SbConditionVariable *condition, SbMutex *mutex, SbTime timeout_duration)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/cpu_features.md b/cobalt/site/docs/reference/starboard/modules/13/cpu_features.md
index ee12e71..7a4bcc0 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/cpu_features.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/cpu_features.md
@@ -259,4 +259,3 @@
 ```
 bool SbCPUFeaturesGet(SbCPUFeatures *features)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/directory.md b/cobalt/site/docs/reference/starboard/modules/13/directory.md
index d46c9a1..dcdf48a 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/directory.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/directory.md
@@ -115,4 +115,3 @@
 ```
 SbDirectory SbDirectoryOpen(const char *path, SbFileError *out_error)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/egl.md b/cobalt/site/docs/reference/starboard/modules/13/egl.md
index b1e120b..c8c2120 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/egl.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/egl.md
@@ -144,4 +144,3 @@
     config, void *native_pixmap, const SbEglAttrib *attrib_list)`
 *   `SbEglBoolean(*eglWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
     flags)`
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/file.md b/cobalt/site/docs/reference/starboard/modules/13/file.md
index e22edeb..56eb415 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/file.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/file.md
@@ -402,4 +402,3 @@
 ```
 static int SbFileWriteAll(SbFile file, const char *data, int size)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/gles.md b/cobalt/site/docs/reference/starboard/modules/13/gles.md
index 7a9108a..163d8d7 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/gles.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/gles.md
@@ -459,4 +459,3 @@
     internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth)`
 *   `void(*glGetInternalformativ)(SbGlEnum target, SbGlEnum internalformat,
     SbGlEnum pname, SbGlSizei bufSize, SbGlInt32 *params)`
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/input.md b/cobalt/site/docs/reference/starboard/modules/13/input.md
index e8df816..ec86793 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/input.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/input.md
@@ -168,4 +168,3 @@
 
 *   `float x`
 *   `float y`
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/key.md b/cobalt/site/docs/reference/starboard/modules/13/key.md
index 16be3c1..bf8583c 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/key.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/key.md
@@ -290,4 +290,3 @@
 *   `kSbKeyModifiersPointerButtonMiddle`
 *   `kSbKeyModifiersPointerButtonBack`
 *   `kSbKeyModifiersPointerButtonForward`
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/memory.md b/cobalt/site/docs/reference/starboard/modules/13/memory.md
index e09dbc3..a094a66 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/memory.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/memory.md
@@ -345,4 +345,3 @@
 ```
 bool SbMemoryUnmap(void *virtual_address, int64_t size_bytes)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/memory_reporter.md b/cobalt/site/docs/reference/starboard/modules/13/memory_reporter.md
index 4b4a539..d67ef1a 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/memory_reporter.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/memory_reporter.md
@@ -101,4 +101,3 @@
 ```
 bool SbMemorySetReporter(struct SbMemoryReporter *tracker)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/microphone.md b/cobalt/site/docs/reference/starboard/modules/13/microphone.md
index 1379f86..d760e1e 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/microphone.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/microphone.md
@@ -260,4 +260,3 @@
 ```
 int SbMicrophoneRead(SbMicrophone microphone, void *out_audio_data, int audio_data_size)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/mutex.md b/cobalt/site/docs/reference/starboard/modules/13/mutex.md
index 58f1907..05dd810 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/mutex.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/mutex.md
@@ -125,4 +125,3 @@
 ```
 bool SbMutexRelease(SbMutex *mutex)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/once.md b/cobalt/site/docs/reference/starboard/modules/13/once.md
index ce3c4d6..2ad1959 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/once.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/once.md
@@ -55,4 +55,3 @@
 ```
 bool SbOnce(SbOnceControl *once_control, SbOnceInitRoutine init_routine)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/socket_waiter.md b/cobalt/site/docs/reference/starboard/modules/13/socket_waiter.md
index 738fafb..855dcf8 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/socket_waiter.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/socket_waiter.md
@@ -235,4 +235,3 @@
 ```
 void SbSocketWaiterWakeUp(SbSocketWaiter waiter)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/speech_recognizer.md b/cobalt/site/docs/reference/starboard/modules/13/speech_recognizer.md
deleted file mode 100644
index 2a40f19..0000000
--- a/cobalt/site/docs/reference/starboard/modules/13/speech_recognizer.md
+++ /dev/null
@@ -1,268 +0,0 @@
----
-layout: doc
-title: "Starboard Module Reference: speech_recognizer.h"
----
-
-Defines a streaming speech recognizer API. It provides access to the platform
-speech recognition service.
-
-Note that there can be only one speech recognizer. Attempting to create a second
-speech recognizer without destroying the first one will result in undefined
-behavior.
-
-`SbSpeechRecognizerCreate`, `SbSpeechRecognizerStart`, `SbSpeechRecognizerStop`,
-`SbSpeechRecognizerCancel` and `SbSpeechRecognizerDestroy` should be called from
-a single thread. Callbacks defined in `SbSpeechRecognizerHandler` will happen on
-another thread, so calls back into the SbSpeechRecognizer from the callback
-thread are disallowed.
-
-## Macros ##
-
-### kSbSpeechRecognizerInvalid ###
-
-Well-defined value for an invalid speech recognizer handle.
-
-## Enums ##
-
-### SbSpeechRecognizerError ###
-
-Indicates what has gone wrong with the recognition.
-
-#### Values ####
-
-*   `kSbNoSpeechError`
-
-    No speech was detected. Speech timed out.
-*   `kSbAborted`
-
-    Speech input was aborted somehow.
-*   `kSbAudioCaptureError`
-
-    Audio capture failed.
-*   `kSbNetworkError`
-
-    Some network communication that was required to complete the recognition
-    failed.
-*   `kSbNotAllowed`
-
-    The implementation is not allowing any speech input to occur for reasons of
-    security, privacy or user preference.
-*   `kSbServiceNotAllowed`
-
-    The implementation is not allowing the application requested speech service,
-    but would allow some speech service, to be used either because the
-    implementation doesn't support the selected one or because of reasons of
-    security, privacy or user preference.
-*   `kSbBadGrammar`
-
-    There was an error in the speech recognition grammar or semantic tags, or
-    the grammar format or semantic tag format is supported.
-*   `kSbLanguageNotSupported`
-
-    The language was not supported.
-
-## Typedefs ##
-
-### SbSpeechRecognizer ###
-
-An opaque handle to an implementation-private structure that represents a speech
-recognizer.
-
-#### Definition ####
-
-```
-typedef struct SbSpeechRecognizerPrivate* SbSpeechRecognizer
-```
-
-### SbSpeechRecognizerErrorFunction ###
-
-A function to notify that a speech recognition error occurred. `error`: The
-occurred speech recognition error.
-
-#### Definition ####
-
-```
-typedef void(* SbSpeechRecognizerErrorFunction) (void *context, SbSpeechRecognizerError error)
-```
-
-### SbSpeechRecognizerResultsFunction ###
-
-A function to notify that the recognition results are ready. `results`: the list
-of recognition results. `results_size`: the number of `results`. `is_final`:
-indicates if the `results` is final.
-
-#### Definition ####
-
-```
-typedef void(* SbSpeechRecognizerResultsFunction) (void *context, SbSpeechResult *results, int results_size, bool is_final)
-```
-
-### SbSpeechRecognizerSpeechDetectedFunction ###
-
-A function to notify that the user has started to speak or stops speaking.
-`detected`: true if the user has started to speak, and false if the user stops
-speaking.
-
-#### Definition ####
-
-```
-typedef void(* SbSpeechRecognizerSpeechDetectedFunction) (void *context, bool detected)
-```
-
-## Structs ##
-
-### SbSpeechConfiguration ###
-
-#### Members ####
-
-*   `bool continuous`
-
-    When the continuous value is set to false, the implementation MUST return no
-    more than one final result in response to starting recognition. When the
-    continuous attribute is set to true, the implementation MUST return zero or
-    more final results representing multiple consecutive recognitions in
-    response to starting recognition. This attribute setting does not affect
-    interim results.
-*   `bool interim_results`
-
-    Controls whether interim results are returned. When set to true, interim
-    results SHOULD be returned. When set to false, interim results MUST NOT be
-    returned. This value setting does not affect final results.
-*   `int max_alternatives`
-
-    This sets the maximum number of SbSpeechResult in
-    `SbSpeechRecognizerOnResults` callback.
-
-### SbSpeechRecognizerHandler ###
-
-Allows receiving notifications from the device when recognition related events
-occur.
-
-The void* context is passed to every function.
-
-#### Members ####
-
-*   `SbSpeechRecognizerSpeechDetectedFunction on_speech_detected`
-
-    Function to notify the beginning/end of the speech.
-*   `SbSpeechRecognizerErrorFunction on_error`
-
-    Function to notify the speech error.
-*   `SbSpeechRecognizerResultsFunction on_results`
-
-    Function to notify that the recognition results are available.
-*   `void * context`
-
-    This is passed to handler functions as first argument.
-
-### SbSpeechResult ###
-
-The recognition response that is received from the recognizer.
-
-#### Members ####
-
-*   `char * transcript`
-
-    The raw words that the user spoke.
-*   `float confidence`
-
-    A numeric estimate between 0 and 1 of how confident the recognition system
-    is that the recognition is correct. A higher number means the system is more
-    confident. NaN represents an unavailable confidence score.
-
-## Functions ##
-
-### SbSpeechRecognizerCancel ###
-
-Cancels speech recognition. The speech recognizer stops listening to audio and
-does not return any information. When `SbSpeechRecognizerCancel` is called, the
-implementation MUST NOT collect additional audio, MUST NOT continue to listen to
-the user, and MUST stop recognizing. This is important for privacy reasons. If
-`SbSpeechRecognizerCancel` is called on a speech recognizer which is already
-stopped or cancelled, the implementation MUST ignore the call.
-
-#### Declaration ####
-
-```
-void SbSpeechRecognizerCancel(SbSpeechRecognizer recognizer)
-```
-
-### SbSpeechRecognizerCreate ###
-
-Creates a speech recognizer with a speech recognizer handler.
-
-If the system has a speech recognition service available, this function returns
-the newly created handle.
-
-If no speech recognition service is available on the device, this function
-returns `kSbSpeechRecognizerInvalid`.
-
-`SbSpeechRecognizerCreate` does not expect the passed SbSpeechRecognizerHandler
-structure to live after `SbSpeechRecognizerCreate` is called, so the
-implementation must copy the contents if necessary.
-
-#### Declaration ####
-
-```
-SbSpeechRecognizer SbSpeechRecognizerCreate(const SbSpeechRecognizerHandler *handler)
-```
-
-### SbSpeechRecognizerDestroy ###
-
-Destroys the given speech recognizer. If the speech recognizer is in the started
-state, it is first stopped and then destroyed.
-
-#### Declaration ####
-
-```
-void SbSpeechRecognizerDestroy(SbSpeechRecognizer recognizer)
-```
-
-### SbSpeechRecognizerIsSupported ###
-
-Returns whether the platform supports SbSpeechRecognizer.
-
-#### Declaration ####
-
-```
-bool SbSpeechRecognizerIsSupported()
-```
-
-### SbSpeechRecognizerIsValid ###
-
-Indicates whether the given speech recognizer is valid.
-
-#### Declaration ####
-
-```
-static bool SbSpeechRecognizerIsValid(SbSpeechRecognizer recognizer)
-```
-
-### SbSpeechRecognizerStart ###
-
-Starts listening to audio and recognizing speech with the specified speech
-configuration. If `SbSpeechRecognizerStart` is called on an already started
-speech recognizer, the implementation MUST ignore the call and return false.
-
-Returns whether the speech recognizer is started successfully.
-
-#### Declaration ####
-
-```
-bool SbSpeechRecognizerStart(SbSpeechRecognizer recognizer, const SbSpeechConfiguration *configuration)
-```
-
-### SbSpeechRecognizerStop ###
-
-Stops listening to audio and returns a result using just the audio that it has
-already received. Once `SbSpeechRecognizerStop` is called, the implementation
-MUST NOT collect additional audio and MUST NOT continue to listen to the user.
-This is important for privacy reasons. If `SbSpeechRecognizerStop` is called on
-a speech recognizer which is already stopped or being stopped, the
-implementation MUST ignore the call.
-
-#### Declaration ####
-
-```
-void SbSpeechRecognizerStop(SbSpeechRecognizer recognizer)
-```
diff --git a/cobalt/site/docs/reference/starboard/modules/13/speech_synthesis.md b/cobalt/site/docs/reference/starboard/modules/13/speech_synthesis.md
index e46a2ca..1622318 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/speech_synthesis.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/speech_synthesis.md
@@ -49,4 +49,3 @@
 ```
 void SbSpeechSynthesisSpeak(const char *text)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/storage.md b/cobalt/site/docs/reference/starboard/modules/13/storage.md
index c98207b..db7e950 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/storage.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/storage.md
@@ -156,4 +156,3 @@
 ```
 bool SbStorageWriteRecord(SbStorageRecord record, const char *data, int64_t data_size)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/string.md b/cobalt/site/docs/reference/starboard/modules/13/string.md
index 95790d4..685f5e8 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/string.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/string.md
@@ -172,4 +172,3 @@
 ```
 static int SbStringScanF(const char *buffer, const char *pattern,...)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/thread.md b/cobalt/site/docs/reference/starboard/modules/13/thread.md
index 8440477..1191e9a 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/thread.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/thread.md
@@ -531,4 +531,3 @@
 ```
 void SbThreadYield()
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/time.md b/cobalt/site/docs/reference/starboard/modules/13/time.md
index 17ea6ad..19a7e4f 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/time.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/time.md
@@ -150,4 +150,3 @@
 ```
 static int64_t SbTimeToPosix(SbTime time)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/time_zone.md b/cobalt/site/docs/reference/starboard/modules/13/time_zone.md
index 5768bc3..f9e3fcb 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/time_zone.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/time_zone.md
@@ -45,4 +45,3 @@
 ```
 const char* SbTimeZoneGetName()
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/user.md b/cobalt/site/docs/reference/starboard/modules/13/user.md
index a30cc95..406e695 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/user.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/user.md
@@ -131,4 +131,3 @@
 ```
 static bool SbUserIsValid(SbUser user)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/13/window.md b/cobalt/site/docs/reference/starboard/modules/13/window.md
index 53cda4a..915e254 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/window.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/window.md
@@ -328,4 +328,3 @@
 ```
 void SbWindowUpdateOnScreenKeyboardSuggestions(SbWindow window, const char *suggestions[], int num_suggestions, int ticket)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/14/speech_recognizer.md b/cobalt/site/docs/reference/starboard/modules/14/speech_recognizer.md
deleted file mode 100644
index 2a40f19..0000000
--- a/cobalt/site/docs/reference/starboard/modules/14/speech_recognizer.md
+++ /dev/null
@@ -1,268 +0,0 @@
----
-layout: doc
-title: "Starboard Module Reference: speech_recognizer.h"
----
-
-Defines a streaming speech recognizer API. It provides access to the platform
-speech recognition service.
-
-Note that there can be only one speech recognizer. Attempting to create a second
-speech recognizer without destroying the first one will result in undefined
-behavior.
-
-`SbSpeechRecognizerCreate`, `SbSpeechRecognizerStart`, `SbSpeechRecognizerStop`,
-`SbSpeechRecognizerCancel` and `SbSpeechRecognizerDestroy` should be called from
-a single thread. Callbacks defined in `SbSpeechRecognizerHandler` will happen on
-another thread, so calls back into the SbSpeechRecognizer from the callback
-thread are disallowed.
-
-## Macros ##
-
-### kSbSpeechRecognizerInvalid ###
-
-Well-defined value for an invalid speech recognizer handle.
-
-## Enums ##
-
-### SbSpeechRecognizerError ###
-
-Indicates what has gone wrong with the recognition.
-
-#### Values ####
-
-*   `kSbNoSpeechError`
-
-    No speech was detected. Speech timed out.
-*   `kSbAborted`
-
-    Speech input was aborted somehow.
-*   `kSbAudioCaptureError`
-
-    Audio capture failed.
-*   `kSbNetworkError`
-
-    Some network communication that was required to complete the recognition
-    failed.
-*   `kSbNotAllowed`
-
-    The implementation is not allowing any speech input to occur for reasons of
-    security, privacy or user preference.
-*   `kSbServiceNotAllowed`
-
-    The implementation is not allowing the application requested speech service,
-    but would allow some speech service, to be used either because the
-    implementation doesn't support the selected one or because of reasons of
-    security, privacy or user preference.
-*   `kSbBadGrammar`
-
-    There was an error in the speech recognition grammar or semantic tags, or
-    the grammar format or semantic tag format is supported.
-*   `kSbLanguageNotSupported`
-
-    The language was not supported.
-
-## Typedefs ##
-
-### SbSpeechRecognizer ###
-
-An opaque handle to an implementation-private structure that represents a speech
-recognizer.
-
-#### Definition ####
-
-```
-typedef struct SbSpeechRecognizerPrivate* SbSpeechRecognizer
-```
-
-### SbSpeechRecognizerErrorFunction ###
-
-A function to notify that a speech recognition error occurred. `error`: The
-occurred speech recognition error.
-
-#### Definition ####
-
-```
-typedef void(* SbSpeechRecognizerErrorFunction) (void *context, SbSpeechRecognizerError error)
-```
-
-### SbSpeechRecognizerResultsFunction ###
-
-A function to notify that the recognition results are ready. `results`: the list
-of recognition results. `results_size`: the number of `results`. `is_final`:
-indicates if the `results` is final.
-
-#### Definition ####
-
-```
-typedef void(* SbSpeechRecognizerResultsFunction) (void *context, SbSpeechResult *results, int results_size, bool is_final)
-```
-
-### SbSpeechRecognizerSpeechDetectedFunction ###
-
-A function to notify that the user has started to speak or stops speaking.
-`detected`: true if the user has started to speak, and false if the user stops
-speaking.
-
-#### Definition ####
-
-```
-typedef void(* SbSpeechRecognizerSpeechDetectedFunction) (void *context, bool detected)
-```
-
-## Structs ##
-
-### SbSpeechConfiguration ###
-
-#### Members ####
-
-*   `bool continuous`
-
-    When the continuous value is set to false, the implementation MUST return no
-    more than one final result in response to starting recognition. When the
-    continuous attribute is set to true, the implementation MUST return zero or
-    more final results representing multiple consecutive recognitions in
-    response to starting recognition. This attribute setting does not affect
-    interim results.
-*   `bool interim_results`
-
-    Controls whether interim results are returned. When set to true, interim
-    results SHOULD be returned. When set to false, interim results MUST NOT be
-    returned. This value setting does not affect final results.
-*   `int max_alternatives`
-
-    This sets the maximum number of SbSpeechResult in
-    `SbSpeechRecognizerOnResults` callback.
-
-### SbSpeechRecognizerHandler ###
-
-Allows receiving notifications from the device when recognition related events
-occur.
-
-The void* context is passed to every function.
-
-#### Members ####
-
-*   `SbSpeechRecognizerSpeechDetectedFunction on_speech_detected`
-
-    Function to notify the beginning/end of the speech.
-*   `SbSpeechRecognizerErrorFunction on_error`
-
-    Function to notify the speech error.
-*   `SbSpeechRecognizerResultsFunction on_results`
-
-    Function to notify that the recognition results are available.
-*   `void * context`
-
-    This is passed to handler functions as first argument.
-
-### SbSpeechResult ###
-
-The recognition response that is received from the recognizer.
-
-#### Members ####
-
-*   `char * transcript`
-
-    The raw words that the user spoke.
-*   `float confidence`
-
-    A numeric estimate between 0 and 1 of how confident the recognition system
-    is that the recognition is correct. A higher number means the system is more
-    confident. NaN represents an unavailable confidence score.
-
-## Functions ##
-
-### SbSpeechRecognizerCancel ###
-
-Cancels speech recognition. The speech recognizer stops listening to audio and
-does not return any information. When `SbSpeechRecognizerCancel` is called, the
-implementation MUST NOT collect additional audio, MUST NOT continue to listen to
-the user, and MUST stop recognizing. This is important for privacy reasons. If
-`SbSpeechRecognizerCancel` is called on a speech recognizer which is already
-stopped or cancelled, the implementation MUST ignore the call.
-
-#### Declaration ####
-
-```
-void SbSpeechRecognizerCancel(SbSpeechRecognizer recognizer)
-```
-
-### SbSpeechRecognizerCreate ###
-
-Creates a speech recognizer with a speech recognizer handler.
-
-If the system has a speech recognition service available, this function returns
-the newly created handle.
-
-If no speech recognition service is available on the device, this function
-returns `kSbSpeechRecognizerInvalid`.
-
-`SbSpeechRecognizerCreate` does not expect the passed SbSpeechRecognizerHandler
-structure to live after `SbSpeechRecognizerCreate` is called, so the
-implementation must copy the contents if necessary.
-
-#### Declaration ####
-
-```
-SbSpeechRecognizer SbSpeechRecognizerCreate(const SbSpeechRecognizerHandler *handler)
-```
-
-### SbSpeechRecognizerDestroy ###
-
-Destroys the given speech recognizer. If the speech recognizer is in the started
-state, it is first stopped and then destroyed.
-
-#### Declaration ####
-
-```
-void SbSpeechRecognizerDestroy(SbSpeechRecognizer recognizer)
-```
-
-### SbSpeechRecognizerIsSupported ###
-
-Returns whether the platform supports SbSpeechRecognizer.
-
-#### Declaration ####
-
-```
-bool SbSpeechRecognizerIsSupported()
-```
-
-### SbSpeechRecognizerIsValid ###
-
-Indicates whether the given speech recognizer is valid.
-
-#### Declaration ####
-
-```
-static bool SbSpeechRecognizerIsValid(SbSpeechRecognizer recognizer)
-```
-
-### SbSpeechRecognizerStart ###
-
-Starts listening to audio and recognizing speech with the specified speech
-configuration. If `SbSpeechRecognizerStart` is called on an already started
-speech recognizer, the implementation MUST ignore the call and return false.
-
-Returns whether the speech recognizer is started successfully.
-
-#### Declaration ####
-
-```
-bool SbSpeechRecognizerStart(SbSpeechRecognizer recognizer, const SbSpeechConfiguration *configuration)
-```
-
-### SbSpeechRecognizerStop ###
-
-Stops listening to audio and returns a result using just the audio that it has
-already received. Once `SbSpeechRecognizerStop` is called, the implementation
-MUST NOT collect additional audio and MUST NOT continue to listen to the user.
-This is important for privacy reasons. If `SbSpeechRecognizerStop` is called on
-a speech recognizer which is already stopped or being stopped, the
-implementation MUST ignore the call.
-
-#### Declaration ####
-
-```
-void SbSpeechRecognizerStop(SbSpeechRecognizer recognizer)
-```
diff --git a/cobalt/site/docs/reference/starboard/modules/accessibility.md b/cobalt/site/docs/reference/starboard/modules/accessibility.md
index a6c8460..1a5adcb 100644
--- a/cobalt/site/docs/reference/starboard/modules/accessibility.md
+++ b/cobalt/site/docs/reference/starboard/modules/accessibility.md
@@ -251,4 +251,3 @@
 ```
 bool SbAccessibilitySetCaptionsEnabled(bool enabled)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/atomic.md b/cobalt/site/docs/reference/starboard/modules/atomic.md
index 5f79990..9741f3c 100644
--- a/cobalt/site/docs/reference/starboard/modules/atomic.md
+++ b/cobalt/site/docs/reference/starboard/modules/atomic.md
@@ -108,4 +108,3 @@
 ```
 static SbAtomic8 SbAtomicRelease_CompareAndSwap8(volatile SbAtomic8 *ptr, SbAtomic8 old_value, SbAtomic8 new_value)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/byte_swap.md b/cobalt/site/docs/reference/starboard/modules/byte_swap.md
deleted file mode 100644
index 580bc5d..0000000
--- a/cobalt/site/docs/reference/starboard/modules/byte_swap.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-layout: doc
-title: "Starboard Module Reference: byte_swap.h"
----
-
-Specifies functions for swapping byte order. These functions are used to deal
-with endianness when performing I/O.
-
-## Functions ##
-
-### SbByteSwapS16 ###
-
-Unconditionally swaps the byte order in signed 16-bit `value`. `value`: The
-value for which the byte order will be swapped.
-
-#### Declaration ####
-
-```
-int16_t SbByteSwapS16(int16_t value)
-```
-
-### SbByteSwapS32 ###
-
-Unconditionally swaps the byte order in signed 32-bit `value`. `value`: The
-value for which the byte order will be swapped.
-
-#### Declaration ####
-
-```
-int32_t SbByteSwapS32(int32_t value)
-```
-
-### SbByteSwapS64 ###
-
-Unconditionally swaps the byte order in signed 64-bit `value`. `value`: The
-value for which the byte order will be swapped.
-
-#### Declaration ####
-
-```
-int64_t SbByteSwapS64(int64_t value)
-```
-
-### SbByteSwapU16 ###
-
-Unconditionally swaps the byte order in unsigned 16-bit `value`. `value`: The
-value for which the byte order will be swapped.
-
-#### Declaration ####
-
-```
-uint16_t SbByteSwapU16(uint16_t value)
-```
-
-### SbByteSwapU32 ###
-
-Unconditionally swaps the byte order in unsigned 32-bit `value`. `value`: The
-value for which the byte order will be swapped.
-
-#### Declaration ####
-
-```
-uint32_t SbByteSwapU32(uint32_t value)
-```
-
-### SbByteSwapU64 ###
-
-Unconditionally swaps the byte order in unsigned 64-bit `value`. `value`: The
-value for which the byte order will be swapped.
-
-#### Declaration ####
-
-```
-uint64_t SbByteSwapU64(uint64_t value)
-```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/condition_variable.md b/cobalt/site/docs/reference/starboard/modules/condition_variable.md
index 836c4b8..e58e106 100644
--- a/cobalt/site/docs/reference/starboard/modules/condition_variable.md
+++ b/cobalt/site/docs/reference/starboard/modules/condition_variable.md
@@ -138,4 +138,3 @@
 ```
 SbConditionVariableResult SbConditionVariableWaitTimed(SbConditionVariable *condition, SbMutex *mutex, SbTime timeout_duration)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/cpu_features.md b/cobalt/site/docs/reference/starboard/modules/cpu_features.md
index ee12e71..7a4bcc0 100644
--- a/cobalt/site/docs/reference/starboard/modules/cpu_features.md
+++ b/cobalt/site/docs/reference/starboard/modules/cpu_features.md
@@ -259,4 +259,3 @@
 ```
 bool SbCPUFeaturesGet(SbCPUFeatures *features)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/directory.md b/cobalt/site/docs/reference/starboard/modules/directory.md
index d46c9a1..dcdf48a 100644
--- a/cobalt/site/docs/reference/starboard/modules/directory.md
+++ b/cobalt/site/docs/reference/starboard/modules/directory.md
@@ -115,4 +115,3 @@
 ```
 SbDirectory SbDirectoryOpen(const char *path, SbFileError *out_error)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/egl.md b/cobalt/site/docs/reference/starboard/modules/egl.md
index b1e120b..c8c2120 100644
--- a/cobalt/site/docs/reference/starboard/modules/egl.md
+++ b/cobalt/site/docs/reference/starboard/modules/egl.md
@@ -144,4 +144,3 @@
     config, void *native_pixmap, const SbEglAttrib *attrib_list)`
 *   `SbEglBoolean(*eglWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
     flags)`
-
diff --git a/cobalt/site/docs/reference/starboard/modules/file.md b/cobalt/site/docs/reference/starboard/modules/file.md
index e22edeb..56eb415 100644
--- a/cobalt/site/docs/reference/starboard/modules/file.md
+++ b/cobalt/site/docs/reference/starboard/modules/file.md
@@ -402,4 +402,3 @@
 ```
 static int SbFileWriteAll(SbFile file, const char *data, int size)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/gles.md b/cobalt/site/docs/reference/starboard/modules/gles.md
index 7a9108a..163d8d7 100644
--- a/cobalt/site/docs/reference/starboard/modules/gles.md
+++ b/cobalt/site/docs/reference/starboard/modules/gles.md
@@ -459,4 +459,3 @@
     internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth)`
 *   `void(*glGetInternalformativ)(SbGlEnum target, SbGlEnum internalformat,
     SbGlEnum pname, SbGlSizei bufSize, SbGlInt32 *params)`
-
diff --git a/cobalt/site/docs/reference/starboard/modules/input.md b/cobalt/site/docs/reference/starboard/modules/input.md
index e8df816..ec86793 100644
--- a/cobalt/site/docs/reference/starboard/modules/input.md
+++ b/cobalt/site/docs/reference/starboard/modules/input.md
@@ -168,4 +168,3 @@
 
 *   `float x`
 *   `float y`
-
diff --git a/cobalt/site/docs/reference/starboard/modules/memory_reporter.md b/cobalt/site/docs/reference/starboard/modules/memory_reporter.md
index 4b4a539..d67ef1a 100644
--- a/cobalt/site/docs/reference/starboard/modules/memory_reporter.md
+++ b/cobalt/site/docs/reference/starboard/modules/memory_reporter.md
@@ -101,4 +101,3 @@
 ```
 bool SbMemorySetReporter(struct SbMemoryReporter *tracker)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/microphone.md b/cobalt/site/docs/reference/starboard/modules/microphone.md
index 1379f86..d760e1e 100644
--- a/cobalt/site/docs/reference/starboard/modules/microphone.md
+++ b/cobalt/site/docs/reference/starboard/modules/microphone.md
@@ -260,4 +260,3 @@
 ```
 int SbMicrophoneRead(SbMicrophone microphone, void *out_audio_data, int audio_data_size)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/mutex.md b/cobalt/site/docs/reference/starboard/modules/mutex.md
index 58f1907..05dd810 100644
--- a/cobalt/site/docs/reference/starboard/modules/mutex.md
+++ b/cobalt/site/docs/reference/starboard/modules/mutex.md
@@ -125,4 +125,3 @@
 ```
 bool SbMutexRelease(SbMutex *mutex)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/once.md b/cobalt/site/docs/reference/starboard/modules/once.md
index ce3c4d6..2ad1959 100644
--- a/cobalt/site/docs/reference/starboard/modules/once.md
+++ b/cobalt/site/docs/reference/starboard/modules/once.md
@@ -55,4 +55,3 @@
 ```
 bool SbOnce(SbOnceControl *once_control, SbOnceInitRoutine init_routine)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/socket_waiter.md b/cobalt/site/docs/reference/starboard/modules/socket_waiter.md
index 738fafb..855dcf8 100644
--- a/cobalt/site/docs/reference/starboard/modules/socket_waiter.md
+++ b/cobalt/site/docs/reference/starboard/modules/socket_waiter.md
@@ -235,4 +235,3 @@
 ```
 void SbSocketWaiterWakeUp(SbSocketWaiter waiter)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/speech_synthesis.md b/cobalt/site/docs/reference/starboard/modules/speech_synthesis.md
index e46a2ca..1622318 100644
--- a/cobalt/site/docs/reference/starboard/modules/speech_synthesis.md
+++ b/cobalt/site/docs/reference/starboard/modules/speech_synthesis.md
@@ -49,4 +49,3 @@
 ```
 void SbSpeechSynthesisSpeak(const char *text)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/storage.md b/cobalt/site/docs/reference/starboard/modules/storage.md
index c98207b..db7e950 100644
--- a/cobalt/site/docs/reference/starboard/modules/storage.md
+++ b/cobalt/site/docs/reference/starboard/modules/storage.md
@@ -156,4 +156,3 @@
 ```
 bool SbStorageWriteRecord(SbStorageRecord record, const char *data, int64_t data_size)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/string.md b/cobalt/site/docs/reference/starboard/modules/string.md
index 95790d4..685f5e8 100644
--- a/cobalt/site/docs/reference/starboard/modules/string.md
+++ b/cobalt/site/docs/reference/starboard/modules/string.md
@@ -172,4 +172,3 @@
 ```
 static int SbStringScanF(const char *buffer, const char *pattern,...)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/thread.md b/cobalt/site/docs/reference/starboard/modules/thread.md
index 8440477..1191e9a 100644
--- a/cobalt/site/docs/reference/starboard/modules/thread.md
+++ b/cobalt/site/docs/reference/starboard/modules/thread.md
@@ -531,4 +531,3 @@
 ```
 void SbThreadYield()
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/time.md b/cobalt/site/docs/reference/starboard/modules/time.md
index 17ea6ad..19a7e4f 100644
--- a/cobalt/site/docs/reference/starboard/modules/time.md
+++ b/cobalt/site/docs/reference/starboard/modules/time.md
@@ -150,4 +150,3 @@
 ```
 static int64_t SbTimeToPosix(SbTime time)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/time_zone.md b/cobalt/site/docs/reference/starboard/modules/time_zone.md
index 5768bc3..f9e3fcb 100644
--- a/cobalt/site/docs/reference/starboard/modules/time_zone.md
+++ b/cobalt/site/docs/reference/starboard/modules/time_zone.md
@@ -45,4 +45,3 @@
 ```
 const char* SbTimeZoneGetName()
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/user.md b/cobalt/site/docs/reference/starboard/modules/user.md
index a30cc95..406e695 100644
--- a/cobalt/site/docs/reference/starboard/modules/user.md
+++ b/cobalt/site/docs/reference/starboard/modules/user.md
@@ -131,4 +131,3 @@
 ```
 static bool SbUserIsValid(SbUser user)
 ```
-
diff --git a/cobalt/site/docs/reference/starboard/modules/window.md b/cobalt/site/docs/reference/starboard/modules/window.md
index 53cda4a..915e254 100644
--- a/cobalt/site/docs/reference/starboard/modules/window.md
+++ b/cobalt/site/docs/reference/starboard/modules/window.md
@@ -328,4 +328,3 @@
 ```
 void SbWindowUpdateOnScreenKeyboardSuggestions(SbWindow window, const char *suggestions[], int num_suggestions, int ticket)
 ```
-
diff --git a/cobalt/speech/audio_encoder_flac.cc b/cobalt/speech/audio_encoder_flac.cc
index d15bc55..f5c7d87 100644
--- a/cobalt/speech/audio_encoder_flac.cc
+++ b/cobalt/speech/audio_encoder_flac.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/speech/audio_encoder_flac.h"
 
+#include <memory>
+
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
 
diff --git a/cobalt/speech/microphone_fake.cc b/cobalt/speech/microphone_fake.cc
index 643bbe7..b245d98 100644
--- a/cobalt/speech/microphone_fake.cc
+++ b/cobalt/speech/microphone_fake.cc
@@ -94,7 +94,7 @@
                      file_length_ / audio::GetSampleTypeSize(AudioBus::kInt16),
                      AudioBus::kInt16, AudioBus::kInterleaved));
     memcpy(audio_bus_->interleaved_data(), options.external_audio_data,
-                 file_length_);
+           file_length_);
   }
 }
 
@@ -136,7 +136,7 @@
           file_buffer_size / audio::GetSampleTypeSize(AudioBus::kInt16),
           AudioBus::kInt16, AudioBus::kInterleaved));
       memcpy(audio_bus_->interleaved_data(), audio_input.get(),
-                   file_buffer_size);
+             file_buffer_size);
       file_length_ = file_buffer_size;
     } else if (reader->sample_type() != AudioBus::kInt16 ||
                reader->sample_rate() != kSupportedSampleRate ||
@@ -163,8 +163,7 @@
   }
 
   int copy_bytes = std::min(file_length_ - read_index_, data_size);
-  memcpy(out_data, audio_bus_->interleaved_data() + read_index_,
-               copy_bytes);
+  memcpy(out_data, audio_bus_->interleaved_data() + read_index_, copy_bytes);
   read_index_ += copy_bytes;
   if (read_index_ == file_length_) {
     read_index_ = 0;
diff --git a/cobalt/speech/microphone_manager.cc b/cobalt/speech/microphone_manager.cc
index cddf31e..a57de81 100644
--- a/cobalt/speech/microphone_manager.cc
+++ b/cobalt/speech/microphone_manager.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/speech/microphone_manager.h"
 
+#include <memory>
+#include <utility>
+
 namespace cobalt {
 namespace speech {
 
diff --git a/cobalt/speech/microphone_manager.h b/cobalt/speech/microphone_manager.h
index 0bb3903..87e5b4f 100644
--- a/cobalt/speech/microphone_manager.h
+++ b/cobalt/speech/microphone_manager.h
@@ -18,14 +18,13 @@
 #include <memory>
 #include <string>
 
-#include "cobalt/speech/speech_configuration.h"
-
 #include "base/callback.h"
 #include "base/optional.h"
 #include "base/threading/thread.h"
 #include "base/timer/timer.h"
 #include "cobalt/media/base/audio_bus.h"
 #include "cobalt/speech/microphone.h"
+#include "cobalt/speech/speech_configuration.h"
 #include "cobalt/web/event.h"
 
 namespace cobalt {
diff --git a/cobalt/speech/speech_recognition_alternative.h b/cobalt/speech/speech_recognition_alternative.h
index dc11a93..ce577fe 100644
--- a/cobalt/speech/speech_recognition_alternative.h
+++ b/cobalt/speech/speech_recognition_alternative.h
@@ -16,6 +16,7 @@
 #define COBALT_SPEECH_SPEECH_RECOGNITION_ALTERNATIVE_H_
 
 #include <string>
+#include <utility>
 
 #include "base/basictypes.h"
 #include "cobalt/script/wrappable.h"
diff --git a/cobalt/speech/url_fetcher_fake.cc b/cobalt/speech/url_fetcher_fake.cc
index 681cd4e..ecb217a 100644
--- a/cobalt/speech/url_fetcher_fake.cc
+++ b/cobalt/speech/url_fetcher_fake.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/speech/url_fetcher_fake.h"
 
+#include <memory>
+
 #if defined(ENABLE_FAKE_MICROPHONE)
 
 #include "base/basictypes.h"
@@ -49,27 +49,33 @@
 };
 
 const RecognitionAlternative kAlternatives_4[] = {
-    {" or not to be", 0.0f}, {"to be", 0.0f},
+    {" or not to be", 0.0f},
+    {"to be", 0.0f},
 };
 
 const RecognitionAlternative kAlternatives_5[] = {
-    {"to be or not to be", 0.728f}, {"2 B or not to be", 0.0f},
+    {"to be or not to be", 0.728f},
+    {"2 B or not to be", 0.0f},
 };
 
 const RecognitionAlternative kAlternatives_6[] = {
-    {"that", 0.0f}, {"is the", 0.0f},
+    {"that", 0.0f},
+    {"is the", 0.0f},
 };
 
 const RecognitionAlternative kAlternatives_7[] = {
-    {"that", 0.0f}, {"is the question", 0.0f},
+    {"that", 0.0f},
+    {"is the question", 0.0f},
 };
 
 const RecognitionAlternative kAlternatives_8[] = {
-    {"that is", 0.0f}, {"the question", 0.0f},
+    {"that is", 0.0f},
+    {"the question", 0.0f},
 };
 
 const RecognitionAlternative kAlternatives_9[] = {
-    {"that is the question", 0.8577f}, {"that is a question", 0.0f},
+    {"that is the question", 0.8577f},
+    {"that is a question", 0.0f},
 };
 
 struct RecognitionResult {
diff --git a/cobalt/speech/url_fetcher_fake.h b/cobalt/speech/url_fetcher_fake.h
index 7b6d3cb..43ac8c5 100644
--- a/cobalt/speech/url_fetcher_fake.h
+++ b/cobalt/speech/url_fetcher_fake.h
@@ -84,6 +84,7 @@
   void SaveResponseToFileAtPath(
       const base::FilePath& file_path,
       scoped_refptr<base::SequencedTaskRunner> file_task_runner) override {}
+  void SaveResponseToLargeString() override {}
   void SaveResponseToTemporaryFile(
       scoped_refptr<base::SequencedTaskRunner> file_task_runner) override {}
   void SaveResponseWithWriter(
@@ -151,6 +152,11 @@
     NOTREACHED();
     return false;
   }
+  bool GetResponseAsLargeString(
+      std::string* out_response_string) const override {
+    NOTREACHED();
+    return false;
+  }
 
  private:
   void OnURLFetchDownloadData();
diff --git a/cobalt/storage/savegame_fake.cc b/cobalt/storage/savegame_fake.cc
index 0b3fa5c..ea992ed 100644
--- a/cobalt/storage/savegame_fake.cc
+++ b/cobalt/storage/savegame_fake.cc
@@ -14,10 +14,10 @@
 
 #if !defined(COBALT_BUILD_TYPE_GOLD)
 
-#include <memory>
-
 #include "cobalt/storage/savegame_fake.h"
 
+#include <memory>
+
 namespace cobalt {
 namespace storage {
 
diff --git a/cobalt/storage/savegame_starboard.cc b/cobalt/storage/savegame_starboard.cc
index 5a1399c..77e8052 100644
--- a/cobalt/storage/savegame_starboard.cc
+++ b/cobalt/storage/savegame_starboard.cc
@@ -12,8 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "cobalt/storage/savegame.h"
-
 #include <algorithm>
 #include <memory>
 
@@ -22,8 +20,9 @@
 #include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/path_service.h"
+#include "cobalt/storage/savegame.h"
+#include "starboard/common/metrics/stats_tracker.h"
 #include "starboard/common/storage.h"
-#include "starboard/user.h"
 
 namespace cobalt {
 namespace storage {
@@ -77,8 +76,14 @@
   int64_t byte_count = static_cast<int64_t>(bytes.size());
   bool success =
       record->Write(reinterpret_cast<const char*>(bytes.data()), byte_count);
+  auto& stats_tracker =
+      starboard::StatsTrackerContainer::GetInstance()->stats_tracker();
   if (success) {
     DLOG(INFO) << "Successfully wrote storage record.";
+    stats_tracker.StorageWriteRecordSuccess();
+    stats_tracker.StorageWriteRecordBytesWritten(/*bytes_written=*/byte_count);
+  } else {
+    stats_tracker.StorageWriteRecordFail();
   }
   return success;
 }
diff --git a/cobalt/storage/savegame_test.cc b/cobalt/storage/savegame_test.cc
index 9064492..40e6451 100644
--- a/cobalt/storage/savegame_test.cc
+++ b/cobalt/storage/savegame_test.cc
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/storage/savegame.h"
+
 #include <memory>
 
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/path_service.h"
 #include "cobalt/base/cobalt_paths.h"
-#include "cobalt/storage/savegame.h"
-
 #include "testing/gtest/include/gtest/gtest.h"
 
 static size_t kMaxSaveGameSizeBytes = 4 * 1024 * 1024;
diff --git a/cobalt/storage/storage_manager.cc b/cobalt/storage/storage_manager.cc
index e3a278e..06a9670 100644
--- a/cobalt/storage/storage_manager.cc
+++ b/cobalt/storage/storage_manager.cc
@@ -37,7 +37,6 @@
 
 StorageManager::StorageManager(const Options& options)
     : options_(options),
-      storage_thread_(new base::Thread("StorageManager")),
       loaded_database_version_(0),
       initialized_(false),
       flush_processing_(false),
@@ -45,18 +44,26 @@
       no_flushes_pending_(base::WaitableEvent::ResetPolicy::MANUAL,
                           base::WaitableEvent::InitialState::SIGNALED) {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
+}
 
-  // Start the savegame load immediately.
-  storage_thread_->Start();
-  storage_task_runner_ = storage_thread_->task_runner();
-  DCHECK(storage_task_runner_);
+void StorageManager::EnsureStarted() {
+  if (!storage_thread_) {
+    TRACE_EVENT0("cobalt::storage", __FUNCTION__);
+    // Start the savegame load immediately.
+    storage_thread_.reset(new base::Thread("StorageManager"));
+    storage_thread_->Start();
+    DCHECK(!storage_task_runner_);
+    storage_task_runner_ = storage_thread_->task_runner();
 
-  storage_task_runner_->PostTask(
-      FROM_HERE, base::Bind(&StorageManager::InitializeTaskInThread,
-                            base::Unretained(this)));
+    DCHECK(storage_task_runner_);
+    storage_task_runner_->PostTask(
+        FROM_HERE, base::Bind(&StorageManager::InitializeTaskInThread,
+                              base::Unretained(this)));
+  }
 }
 
 void StorageManager::InitializeTaskInThread() {
+  DCHECK(storage_task_runner_);
   DCHECK(storage_task_runner_->RunsTasksInCurrentSequence());
   base::MessageLoopCurrent::Get()->AddDestructionObserver(this);
 
@@ -69,21 +76,26 @@
 
 StorageManager::~StorageManager() {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
-  DCHECK(!storage_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(!storage_task_runner_ ||
+         !storage_task_runner_->RunsTasksInCurrentSequence());
 
   // Wait for all I/O operations to complete.
   FinishIO();
 
-  // Wait for all previously posted tasks to finish.
-  storage_thread_->message_loop()->task_runner()->WaitForFence();
-  // This will trigger a call to WillDestroyCurrentMessageLoop in the thread and
-  // wait for it to finish.
-  storage_thread_.reset();
+  if (storage_thread_) {
+    // Wait for all previously posted tasks to finish.
+    DCHECK(storage_task_runner_);
+    storage_task_runner_->WaitForFence();
+    // This will trigger a call to WillDestroyCurrentMessageLoop in the thread
+    // and wait for it to finish.
+    storage_thread_.reset();
+  }
 }
 
 void StorageManager::WithReadOnlyMemoryStore(
     const ReadOnlyMemoryStoreCallback& callback) {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
+  EnsureStarted();
   if (!storage_task_runner_->RunsTasksInCurrentSequence()) {
     storage_task_runner_->PostTask(
         FROM_HERE, base::Bind(&StorageManager::WithReadOnlyMemoryStore,
@@ -96,6 +108,7 @@
 
 void StorageManager::WithMemoryStore(const MemoryStoreCallback& callback) {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
+  EnsureStarted();
   if (!storage_task_runner_->RunsTasksInCurrentSequence()) {
     storage_task_runner_->PostTask(
         FROM_HERE, base::Bind(&StorageManager::WithMemoryStore,
@@ -110,6 +123,7 @@
 void StorageManager::FlushOnChange() {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
   // Make sure this runs on the correct thread.
+  EnsureStarted();
   if (!storage_task_runner_->RunsTasksInCurrentSequence()) {
     storage_task_runner_->PostTask(
         FROM_HERE,
@@ -137,6 +151,7 @@
 void StorageManager::FlushNow(base::OnceClosure callback) {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
   // Make sure this runs on the correct thread.
+  EnsureStarted();
   if (!storage_task_runner_->RunsTasksInCurrentSequence()) {
     storage_task_runner_->PostTask(
         FROM_HERE, base::Bind(&StorageManager::FlushNow, base::Unretained(this),
@@ -162,6 +177,7 @@
 
 void StorageManager::FinishInit() {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
+  DCHECK(storage_task_runner_);
   DCHECK(storage_task_runner_->RunsTasksInCurrentSequence());
   if (initialized_) {
     return;
@@ -195,6 +211,7 @@
 
 void StorageManager::OnFlushOnChangeTimerFired() {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
+  DCHECK(storage_task_runner_);
   DCHECK(storage_task_runner_->RunsTasksInCurrentSequence());
 
   StopFlushOnChangeTimers();
@@ -204,6 +221,7 @@
 void StorageManager::OnFlushIOCompletedCallback() {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
   // Make sure this runs on the SQL message loop.
+  EnsureStarted();
   if (!storage_task_runner_->RunsTasksInCurrentSequence()) {
     storage_task_runner_->PostTask(
         FROM_HERE, base::Bind(&StorageManager::OnFlushIOCompletedCallback,
@@ -234,6 +252,7 @@
 
 void StorageManager::QueueFlush(base::OnceClosure callback) {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
+  DCHECK(storage_task_runner_);
   DCHECK(storage_task_runner_->RunsTasksInCurrentSequence());
 
   if (!flush_processing_) {
@@ -255,6 +274,7 @@
 
 void StorageManager::FlushInternal() {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
+  DCHECK(storage_task_runner_);
   DCHECK(storage_task_runner_->RunsTasksInCurrentSequence());
   FinishInit();
 
@@ -277,6 +297,8 @@
 
 void StorageManager::FinishIO() {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
+  if (!storage_task_runner_) return;
+  DCHECK(storage_task_runner_);
   DCHECK(!storage_task_runner_->RunsTasksInCurrentSequence());
 
   // Make sure that the on change timers fire if they're running.
@@ -304,6 +326,7 @@
 
 void StorageManager::FireRunningOnChangeTimers() {
   TRACE_EVENT0("cobalt::storage", __FUNCTION__);
+  DCHECK(storage_task_runner_);
   DCHECK(storage_task_runner_->RunsTasksInCurrentSequence());
 
   if (flush_on_last_change_timer_->IsRunning() ||
@@ -320,6 +343,7 @@
   // Ensure these objects are destroyed on the proper thread.
   flush_on_last_change_timer_.reset(NULL);
   flush_on_change_max_delay_timer_.reset(NULL);
+  memory_store_.reset();
 }
 
 }  // namespace storage
diff --git a/cobalt/storage/storage_manager.h b/cobalt/storage/storage_manager.h
index ff49a6d..9d99818 100644
--- a/cobalt/storage/storage_manager.h
+++ b/cobalt/storage/storage_manager.h
@@ -51,13 +51,15 @@
   explicit StorageManager(const Options& options);
   virtual ~StorageManager();
 
+  // Ensures the StorageManager thread is started.
+  void EnsureStarted();
+
   void WithReadOnlyMemoryStore(const ReadOnlyMemoryStoreCallback& callback);
   void WithMemoryStore(const MemoryStoreCallback& callback);
 
   // Schedule a write of our memory store to disk to happen at some point in the
   // future after a change occurs. Multiple calls to Flush() do not necessarily
-  // result in multiple writes to disk.
-  // This call returns immediately.
+  // result in multiple writes to disk. This call returns immediately.
   void FlushOnChange();
 
   // Triggers a write to disk to happen immediately.  Each call to FlushNow()
diff --git a/cobalt/storage/storage_manager_test.cc b/cobalt/storage/storage_manager_test.cc
index 64ea3bf..1fee29e 100644
--- a/cobalt/storage/storage_manager_test.cc
+++ b/cobalt/storage/storage_manager_test.cc
@@ -29,9 +29,9 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::_;
+using ::testing::Eq;
 using ::testing::InvokeWithoutArgs;
 using ::testing::NotNull;
-using ::testing::Eq;
 
 namespace cobalt {
 namespace storage {
diff --git a/cobalt/storage/store/BUILD.gn b/cobalt/storage/store/BUILD.gn
index f9c895f..793cf4e 100644
--- a/cobalt/storage/store/BUILD.gn
+++ b/cobalt/storage/store/BUILD.gn
@@ -24,7 +24,6 @@
     "//cobalt/base",
     "//cobalt/loader:origin",
     "//cobalt/storage:storage_constants",
-    "//nb",
     "//net",
     "//third_party/protobuf:protobuf_lite",
     "//url",
diff --git a/cobalt/storage/store/memory_store.cc b/cobalt/storage/store/memory_store.cc
index e59741c..3637b2f 100644
--- a/cobalt/storage/store/memory_store.cc
+++ b/cobalt/storage/store/memory_store.cc
@@ -18,12 +18,12 @@
 #include <memory>
 #include <string>
 #include <tuple>
+#include <utility>
 #include <vector>
 
 #include "base/trace_event/trace_event.h"
 #include "cobalt/storage/storage_constants.h"
 #include "cobalt/storage/store/storage.pb.h"
-#include "nb/memory_scope.h"
 #include "url/gurl.h"
 
 namespace cobalt {
@@ -85,7 +85,6 @@
 MemoryStore::Impl::Impl() {}
 
 bool MemoryStore::Impl::Initialize(const std::vector<uint8>& in) {
-  TRACK_MEMORY_SCOPE("Storage");
   if (!IsValidFormat(in)) {
     LOG(ERROR) << "Invalid format with size=" << in.size();
     return false;
@@ -120,7 +119,6 @@
 }
 
 bool MemoryStore::Impl::Serialize(std::vector<uint8>* out) const {
-  TRACK_MEMORY_SCOPE("Storage");
   Storage storage_data;
   for (const auto& cookie_pair : cookies_map_) {
     *(storage_data.add_cookies()) = cookie_pair.second;
@@ -150,7 +148,6 @@
 
 void MemoryStore::Impl::GetAllCookies(
     std::vector<std::unique_ptr<net::CanonicalCookie>>* cookies) const {
-  TRACK_MEMORY_SCOPE("Storage");
   for (const auto& cookie_pair : cookies_map_) {
     // We create a CanonicalCookie directly through its constructor instead of
     // through CanonicalCookie::Create() and its sanitization because these
@@ -170,7 +167,6 @@
 
 void MemoryStore::Impl::AddCookie(const net::CanonicalCookie& cc,
                                   int64 expiration_time_us) {
-  TRACK_MEMORY_SCOPE("Storage");
   Cookie cookie;
   cookie.set_domain(cc.Domain());
   cookie.set_path(cc.Path());
@@ -200,7 +196,6 @@
 
 void MemoryStore::Impl::ReadAllLocalStorage(
     const loader::Origin& origin, LocalStorageMap* local_storage_map) const {
-  TRACK_MEMORY_SCOPE("Storage");
   const auto& it = local_storage_by_origin_map_.find(origin.SerializedOrigin());
 
   if (it != local_storage_by_origin_map_.end()) {
@@ -211,18 +206,15 @@
 void MemoryStore::Impl::WriteToLocalStorage(const loader::Origin& origin,
                                             const std::string& key,
                                             const std::string& value) {
-  TRACK_MEMORY_SCOPE("Storage");
   local_storage_by_origin_map_[origin.SerializedOrigin()][key] = value;
 }
 
 void MemoryStore::Impl::DeleteFromLocalStorage(const loader::Origin& origin,
                                                const std::string& key) {
-  TRACK_MEMORY_SCOPE("Storage");
   local_storage_by_origin_map_[origin.SerializedOrigin()].erase(key);
 }
 
 void MemoryStore::Impl::ClearLocalStorage(const loader::Origin& origin) {
-  TRACK_MEMORY_SCOPE("Storage");
   local_storage_by_origin_map_[origin.SerializedOrigin()].clear();
 }
 
diff --git a/cobalt/storage/store/memory_store_test.cc b/cobalt/storage/store/memory_store_test.cc
index dda8821..b630f62 100644
--- a/cobalt/storage/store/memory_store_test.cc
+++ b/cobalt/storage/store/memory_store_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/storage/store/memory_store.h"
 
+#include <memory>
+
 #include "base/trace_event/trace_event.h"
 #include "cobalt/storage/storage_constants.h"
 #include "cobalt/storage/store/storage.pb.h"
diff --git a/cobalt/streams/embedded_scripts/byte_length_queuing_strategy.js b/cobalt/streams/embedded_scripts/byte_length_queuing_strategy.js
index 7a537ac..74e265f 100644
--- a/cobalt/streams/embedded_scripts/byte_length_queuing_strategy.js
+++ b/cobalt/streams/embedded_scripts/byte_length_queuing_strategy.js
@@ -1 +1 @@
-'use strict';(function(b){var c=b.Object.defineProperty,d=function(a){c(this,"highWaterMark",{value:a.highWaterMark,enumerable:!0,configurable:!0,writable:!0})};d.prototype.size=function(a){return a.byteLength};c(b,"ByteLengthQueuingStrategy",{value:d,enumerable:!1,configurable:!0,writable:!0})})(this);
\ No newline at end of file
+'use strict';(function(b){var c=b.Object.defineProperty,d=function(a){c(this,"highWaterMark",{value:a.highWaterMark,enumerable:!0,configurable:!0,writable:!0})};d.prototype.size=function(a){return a.byteLength};c(b,"ByteLengthQueuingStrategy",{value:d,enumerable:!1,configurable:!0,writable:!0})})(this);
diff --git a/cobalt/streams/embedded_scripts/count_queuing_strategy.js b/cobalt/streams/embedded_scripts/count_queuing_strategy.js
index 288aed3..097f8b0 100644
--- a/cobalt/streams/embedded_scripts/count_queuing_strategy.js
+++ b/cobalt/streams/embedded_scripts/count_queuing_strategy.js
@@ -1 +1 @@
-'use strict';(function(a){var b=a.Object.defineProperty,c=function(a){b(this,"highWaterMark",{value:a.highWaterMark,enumerable:!0,configurable:!0,writable:!0})};c.prototype.size=function(a){return 1};b(a,"CountQueuingStrategy",{value:c,enumerable:!1,configurable:!0,writable:!0})})(this);
\ No newline at end of file
+'use strict';(function(a){var b=a.Object.defineProperty,c=function(a){b(this,"highWaterMark",{value:a.highWaterMark,enumerable:!0,configurable:!0,writable:!0})};c.prototype.size=function(a){return 1};b(a,"CountQueuingStrategy",{value:c,enumerable:!1,configurable:!0,writable:!0})})(this);
diff --git a/cobalt/streams/embedded_scripts/readable_stream.js b/cobalt/streams/embedded_scripts/readable_stream.js
index f91aac3..a793dcc 100644
--- a/cobalt/streams/embedded_scripts/readable_stream.js
+++ b/cobalt/streams/embedded_scripts/readable_stream.js
@@ -17,4 +17,4 @@
 if(1===b)throw new c("Cannot error a close readable stream");return A(this,a)}});m(N.prototype,"closed",{enumerable:!1,configurable:!0,get:function(){return!1===D(this)?n(new c("Illegal invocation")):this[t]}});m(N.prototype,"cancel",{enumerable:!1,configurable:!0,writable:!0,value:function(a){return!1===D(this)?n(new c("Illegal invocation")):this[x]===e?n(new c("This readable stream reader has been released and cannot be used to cancel its previous owner stream")):R(this[x],a)}});m(N.prototype,"read",
 {enumerable:!1,configurable:!0,writable:!0,value:function(){return!1===D(this)?n(new c("Illegal invocation")):this[x]===e?n(new c("This readable stream reader has been released and cannot be used to read from its previous owner stream")):ba(this)}});m(N.prototype,"releaseLock",{enumerable:!1,configurable:!0,writable:!0,value:function(){if(!1===D(this))throw new c("Illegal invocation");if(this[x]===e)return e;if(0<this[r].length)throw new c("Cannot release a readable stream reader when it still has outstanding read() calls that have not yet settled");
 if(0===k(this[x])){var a=new c("This readable stream reader has been released and cannot be used to monitor the stream's state");this[t][Q](a)}else this[t]=n(new c("This readable stream reader has been released and cannot be used to monitor the stream's state"));V(this[t]);this[x][u]=e;this[x]=e}});m(d,"ReadableStream",{value:v,enumerable:!1,configurable:!0,writable:!0});d.AcquireReadableStreamDefaultReader=X;d.IsReadableStream=B;d.IsReadableStreamDisturbed=function(a){return a[p]&1};d.IsReadableStreamLocked=
-I;d.IsReadableStreamReadable=function(a){return 0===k(a)};d.IsReadableStreamClosed=function(a){return 1===k(a)};d.IsReadableStreamErrored=function(a){return 2===k(a)};d.IsReadableStreamDefaultReader=D;d.ReadableStreamDefaultReaderRead=ba;d.ReadableStreamTee=ia;d.ReadableStreamDefaultControllerClose=S;d.ReadableStreamDefaultControllerGetDesiredSize=aa;d.ReadableStreamDefaultControllerEnqueue=T;d.ReadableStreamDefaultControllerError=A})(this);
\ No newline at end of file
+I;d.IsReadableStreamReadable=function(a){return 0===k(a)};d.IsReadableStreamClosed=function(a){return 1===k(a)};d.IsReadableStreamErrored=function(a){return 2===k(a)};d.IsReadableStreamDefaultReader=D;d.ReadableStreamDefaultReaderRead=ba;d.ReadableStreamTee=ia;d.ReadableStreamDefaultControllerClose=S;d.ReadableStreamDefaultControllerGetDesiredSize=aa;d.ReadableStreamDefaultControllerEnqueue=T;d.ReadableStreamDefaultControllerError=A})(this);
diff --git a/cobalt/streams/readable_stream.js b/cobalt/streams/readable_stream.js
index 611a889..3d26dad 100644
--- a/cobalt/streams/readable_stream.js
+++ b/cobalt/streams/readable_stream.js
@@ -1050,8 +1050,8 @@
     let method;
     try {
       method = O[P];
-    } catch (methodE) {
-      return Promise_reject(methodE);
+    } catch (methodError) {
+      return Promise_reject(methodError);
     }
 
     if (method === undefined) {
diff --git a/cobalt/subtlecrypto/crypto_impl_test.cc b/cobalt/subtlecrypto/crypto_impl_test.cc
index cea8588..5f98134 100644
--- a/cobalt/subtlecrypto/crypto_impl_test.cc
+++ b/cobalt/subtlecrypto/crypto_impl_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/subtlecrypto/crypto_impl.h"
+
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/cobalt/subtlecrypto/crypto_key.cc b/cobalt/subtlecrypto/crypto_key.cc
index 465603e..9f0a7fd 100644
--- a/cobalt/subtlecrypto/crypto_key.cc
+++ b/cobalt/subtlecrypto/crypto_key.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/subtlecrypto/crypto_key.h"
+
 #include <algorithm>
 
 namespace cobalt {
diff --git a/cobalt/subtlecrypto/crypto_key.h b/cobalt/subtlecrypto/crypto_key.h
index 02a0e85..365d0bf 100644
--- a/cobalt/subtlecrypto/crypto_key.h
+++ b/cobalt/subtlecrypto/crypto_key.h
@@ -20,7 +20,6 @@
 
 #include "cobalt/script/union_type.h"
 #include "cobalt/script/value_handle.h"
-
 #include "cobalt/subtlecrypto/algorithm.h"
 #include "cobalt/subtlecrypto/key_type.h"
 #include "cobalt/subtlecrypto/key_usage.h"
diff --git a/cobalt/subtlecrypto/subtle_crypto.h b/cobalt/subtlecrypto/subtle_crypto.h
index 90bc319..7789f15 100644
--- a/cobalt/subtlecrypto/subtle_crypto.h
+++ b/cobalt/subtlecrypto/subtle_crypto.h
@@ -22,15 +22,14 @@
 #include "cobalt/script/exception_state.h"
 #include "cobalt/script/global_environment.h"
 #include "cobalt/script/promise.h"
-#include "cobalt/web/buffer_source.h"
-#include "cobalt/web/dom_exception.h"
-
 #include "cobalt/subtlecrypto/aes_ctr_params.h"
 #include "cobalt/subtlecrypto/algorithm.h"
 #include "cobalt/subtlecrypto/crypto_key.h"
 #include "cobalt/subtlecrypto/import_key_algorithm_params.h"
 #include "cobalt/subtlecrypto/key_format.h"
 #include "cobalt/subtlecrypto/key_usage.h"
+#include "cobalt/web/buffer_source.h"
+#include "cobalt/web/dom_exception.h"
 
 namespace cobalt {
 
diff --git a/cobalt/system_window/system_window.h b/cobalt/system_window/system_window.h
index 0059c84..4b11324 100644
--- a/cobalt/system_window/system_window.h
+++ b/cobalt/system_window/system_window.h
@@ -72,8 +72,8 @@
   void UpdateModifiers(SbKey key, bool pressed);
   InputEvent::Modifiers GetModifiers();
 
-  void DispatchInputEvent(const SbEvent* event,
-                          InputEvent::Type type, bool is_repeat);
+  void DispatchInputEvent(const SbEvent* event, InputEvent::Type type,
+                          bool is_repeat);
 
   void HandlePointerInputEvent(const SbEvent* event);
 
diff --git a/cobalt/test/empty_document.h b/cobalt/test/empty_document.h
index e865a5f..3c09f74 100644
--- a/cobalt/test/empty_document.h
+++ b/cobalt/test/empty_document.h
@@ -34,11 +34,11 @@
   EmptyDocument()
       : css_parser_(css_parser::Parser::Create()),
         dom_stat_tracker_(new dom::DomStatTracker("EmptyDocument")),
-        html_element_context_(
-            &environment_settings_, NULL, NULL, css_parser_.get(), NULL, NULL,
-            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-            dom_stat_tracker_.get(), "", base::kApplicationStateStarted, NULL,
-            NULL),
+        html_element_context_(&environment_settings_, NULL, NULL,
+                              css_parser_.get(), NULL, NULL, NULL, NULL, NULL,
+                              NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                              dom_stat_tracker_.get(), "",
+                              base::kApplicationStateStarted, NULL, NULL),
         document_(new dom::Document(&html_element_context_)) {}
 
   dom::Document* document() { return document_.get(); }
diff --git a/cobalt/tools/automated_testing/cobalt_runner.py b/cobalt/tools/automated_testing/cobalt_runner.py
index 82db23a..9efd5f3 100644
--- a/cobalt/tools/automated_testing/cobalt_runner.py
+++ b/cobalt/tools/automated_testing/cobalt_runner.py
@@ -100,6 +100,7 @@
                success_message=None,
                log_handler=None,
                poll_until_wait_seconds=POLL_UNTIL_WAIT_SECONDS,
+               web_server_port=None,
                **kwargs):
     """CobaltRunner constructor.
 
@@ -113,6 +114,7 @@
       success_message:  Optional success message to be printed on successful
         exit.
       pull_until_wait_seconds:  Seconds to wait while polling for an event.
+      web_server_port:  The port to host testdata server before Cobalt starts.
       **kwargs:  Additional parameters to be passed to the launcher.
     """
 
@@ -127,6 +129,7 @@
     self.launcher_is_running = False
     self.windowdriver_created = threading.Event()
     self.webmodule_loaded = threading.Event()
+    self.web_server_port = web_server_port
 
     self.selenium_webdriver_module = webdriver_utils.import_selenium_module(
         'webdriver')
@@ -190,6 +193,12 @@
     """Sends a deep link to Cobalt."""
     return self.launcher.SendDeepLink(link)
 
+  def CreateDeviceToHostTunnel(self, host_port, device_port):
+    self.launcher.CreateDeviceToHostTunnel(host_port, device_port)
+
+  def RemoveDeviceToHostTunnel(self, host_port):
+    self.launcher.RemoveDeviceToHostTunnel(host_port)
+
   def GetURL(self):
     return self.url
 
@@ -261,6 +270,15 @@
     self.launcher_read_pipe = os.fdopen(read_fd, 'r')
     self.launcher_write_pipe = os.fdopen(write_fd, 'w')
 
+    launcher_args = {}
+    if self.launcher_params.target_params:
+      for param in self.launcher_params.target_params:
+        pname = param.replace('--', '')
+        val = True
+        if '=' in pname:
+          pname, val = pname.split('=')
+        launcher_args[pname] = val
+
     self.launcher = abstract_launcher.LauncherFactory(
         self.launcher_params.platform,
         'cobalt',
@@ -272,7 +290,11 @@
         loader_platform=self.launcher_params.loader_platform,
         loader_config=self.launcher_params.loader_config,
         loader_out_directory=self.launcher_params.loader_out_directory,
+        launcher_args=launcher_args,
         **self.kwargs)
+    # Start the Device->Host tunnel now in case Cobalt connects the host.
+    if self.web_server_port:
+      self.CreateDeviceToHostTunnel(self.web_server_port, self.web_server_port)
 
     self.runner_thread = threading.Thread(target=self._RunLauncher)
     self.runner_thread.start()
diff --git a/cobalt/tools/binary_to_callgraph.sh b/cobalt/tools/binary_to_callgraph.sh
deleted file mode 100755
index 8ec9c1e..0000000
--- a/cobalt/tools/binary_to_callgraph.sh
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the 'License');
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an 'AS IS' BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# Create a callgraph from an x86 or x86-64 binary.
-#
-# Example Usage:
-#     cobalt/tools/binary_to_callgraph.sh out/linux-x64x11_debug/cobalt > callgraph.txt
-#
-# TODO: It'd be cool to include "...->PostTask(...)" stuff in here too.
-# TODO: It'd be cool to output to a sqlite database instead of text, and then
-# have a command line program to search through it.
-# TODO: It'd be cool to support ARM and MIPS too.
-
-set -e
-
-objdump -d "$1" |
-python3 -c '
-import collections
-import re
-import sys
-
-caller = None
-callee = None
-graph = collections.defaultdict(set)
-for line in sys.stdin:
-  m = re.match(r"\w+ <(.*?)>:", line)
-  if m:
-    caller = m.group(1)
-    continue
-
-  m = re.match(".*callq?.*?<(.*?)>", line)
-  if m:
-    callee = m.group(1)
-    graph[caller].add(callee)
-
-for key, value in graph.items():
-  for item in value:
-    print(key)
-    print(item)
-' | c++filt |
-python3 -c '
-import sys
-
-buffer = []
-for line in sys.stdin:
-  buffer.append(line.rstrip())
-  if len(buffer) == 2:
-    print("{} @@ {}".format(*buffer))
-    buffer = []
-'
-
-
diff --git a/cobalt/tools/cobalt_in_a_tab/README.md b/cobalt/tools/cobalt_in_a_tab/README.md
deleted file mode 100644
index e147115..0000000
--- a/cobalt/tools/cobalt_in_a_tab/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Cobalt-In-A-Tab
-
-## Overview
-
-Cobalt-In-A-Tab is a chrome extension that makes testing and running cobalt applications easy.
-
-## How to install:
-
-1. Navigate to chrome://extensions/
-2. Click Load Unpacked at the top of the page
-3. Choose cobalt/src/cobalt/tools/cobalt-in-a-tab as the extension directory
-
-Viola! The Cobalt icon should show in the top right corner of your chrome browser
-
-## How to use:
-
-1. Launch Cobalt
-2. Press the Cobalt extension icon
-3. Select the device you want to connect to
-
-## Save custom IP endpoints
-
-1. Right-click on the Cobalt extension icon and choose "options"
-2. From here you can save and name device endpoints for future use
-
-## Future Goals:
-
-1. Integrate Cobalt-In-A-Tab with Cobalt devtools
-2. Launch Cobalt in headless mode from Chrome Extension
-3. Allow navigation to different web pages than youtube from chrome extension
-4. Allow launching cobalt on remote devices
\ No newline at end of file
diff --git a/cobalt/tools/cobalt_in_a_tab/background.js b/cobalt/tools/cobalt_in_a_tab/background.js
deleted file mode 100644
index 6080171..0000000
--- a/cobalt/tools/cobalt_in_a_tab/background.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// Local machine is the first "Default" IP.
-chrome.runtime.onInstalled.addListener(function() {
-    chrome.storage.sync.set({
-        ip_endpoints: [{
-            device: 'Local',
-            endpoint: 'http://localhost'
-        }],
-    });
-});
diff --git a/cobalt/tools/cobalt_in_a_tab/cobaltService.js b/cobalt/tools/cobalt_in_a_tab/cobaltService.js
deleted file mode 100644
index 4c71801..0000000
--- a/cobalt/tools/cobalt_in_a_tab/cobaltService.js
+++ /dev/null
@@ -1,144 +0,0 @@
-let CobaltService = class CobaltService{
-    constructor(){}
-
-    async initialize(){
-        this.cobaltIP = await this.getCobaltIP();
-        this.webdriverAddress = this.cobaltIP + ":4444";
-
-        this.screencastAddress = "";
-        this.imageId = 0;
-    }
-
-    async getCobaltIP(){
-        return new Promise((resolve) => {
-            chrome.storage.sync.get('selected_ip', function(data) {
-                resolve(data.selected_ip);
-            });
-        });
-    }
-
-    setScreencastPort(port){
-        this.screencastAddress = this.cobaltIP + ":" + port;
-    }
-
-    // Boilerplate code. It makes a request to |address| with |data|
-    // and returns json.value (or something else if you define resolveFunction)
-    fetchRequest(address, data, resolveFunction = (json) => { return json.value; }) {
-        return new Promise((resolve, reject) => {
-            fetch(address, data)
-            .then((response) => {return response.json();})
-            .then((json) => {
-                resolve(resolveFunction(json));
-            })
-            .catch((error) => {
-                console.log(error);
-                reject(error);
-            });
-        })
-    }
-
-    makeSession(){
-        let address = `${this.webdriverAddress}/session`;
-        let dataObject = {
-            method: "POST",
-            body: JSON.stringify({
-                "capabilities": {
-                    "alwaysMatch": {
-                        "browserName": "cobalt",
-                        "platformName": "linux"
-                    },
-                    "firstMatch": [{}]},
-                "desiredCapabilities": {
-                    "javascriptEnabled": true,
-                    "browserName": "cobalt",
-                    "platform": "LINUX"
-                }
-            })
-        };
-        let resolveFunction = function (json) {
-            console.log("session id returned:");
-            console.log(json);
-            return json.sessionId;
-        }
-        return this.fetchRequest(address, dataObject, resolveFunction);
-    }
-
-    deleteSession(sessionId){
-        let address = `${this.webdriverAddress}/session/${sessionId}`;
-        let dataObject = {
-            method: "DELETE"
-        };
-        return this.fetchRequest(address, dataObject);
-    }
-
-    getElement(sessionId){
-        let address = `${this.webdriverAddress}/session/${sessionId}/element`;
-        let data = {
-            method: "POST",
-            body: JSON.stringify({
-                using: "css selector",
-                value: "body"
-            })
-        }
-        return this.fetchRequest(address, data);
-    }
-
-    getStatus(){
-        let address = `${this.webdriverAddress}/status`;
-        let data = {method: "GET"};
-        return this.fetchRequest(address, data);
-    }
-
-    getSessions(){
-        let address = `${this.webdriverAddress}/sessions`;
-        let data = {method: "GET"};
-        return this.fetchRequest(address, data);
-    }
-
-    sendKeystrokes(sessionId, keys){
-        fetch(`${this.webdriverAddress}/session/${sessionId}/keys`, {
-            method: "POST",
-            body: JSON.stringify({value: keys})
-        });
-    }
-
-    sendClick(sessionId, data){
-        fetch(`${this.webdriverAddress}/session/${sessionId}/click`, {
-            method: "POST",
-            body: JSON.stringify(data)
-        });
-    }
-
-    sendMouseMove(sessionId, data){
-        let address = `${this.webdriverAddress}/session/${sessionId}/moveto`;
-        let headers = {
-            method: "POST",
-            body: JSON.stringify(data)
-        };
-        return this.fetchRequest(address, headers);
-    }
-
-    startScreencast(sessionId){
-        let address = `${this.webdriverAddress}/session/${sessionId}/startscreencast`;
-        let data = {method: "GET"};
-        return this.fetchRequest(address, data);
-    }
-
-    stopScreencast(sessionId){
-        let address = `${this.webdriverAddress}/session/${sessionId}/stopscreencast`;
-        let data = {method: "GET"};
-        return this.fetchRequest(address, data);
-    }
-
-    //combine this call to a call with getNextScreenshotId()
-    getScreenshotURL(){
-        return `${this.screencastAddress}/screenshot/`;
-    }
-
-    createNextScreenshotId(){
-        return this.imageId++;
-    }
-}
-
-const cobaltService = new CobaltService()
-export default cobaltService;
\ No newline at end of file
diff --git a/cobalt/tools/cobalt_in_a_tab/cobaltView.html b/cobalt/tools/cobalt_in_a_tab/cobaltView.html
deleted file mode 100644
index 49169c7..0000000
--- a/cobalt/tools/cobalt_in_a_tab/cobaltView.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Cobalt</title>
-    <script type="module" src="./screenshot.js"></script>
-    <link rel="stylesheet" href="styles.css">
-</head>
-<body class="black">
-    <div id="screenContainer">
-    </div>
-</body>
-</html>
\ No newline at end of file
diff --git a/cobalt/tools/cobalt_in_a_tab/logo/cobalt.logo@1024x.png b/cobalt/tools/cobalt_in_a_tab/logo/cobalt.logo@1024x.png
deleted file mode 100644
index 443a571..0000000
--- a/cobalt/tools/cobalt_in_a_tab/logo/cobalt.logo@1024x.png
+++ /dev/null
Binary files differ
diff --git a/cobalt/tools/cobalt_in_a_tab/manifest.json b/cobalt/tools/cobalt_in_a_tab/manifest.json
deleted file mode 100644
index c1f60cd..0000000
--- a/cobalt/tools/cobalt_in_a_tab/manifest.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "name": "Cobalt Extension",
-  "version": "1.0",
-  "description": "Run cobalt through chrome.",
-  "manifest_version": 2,
-  "permissions":
-    ["tabs", "webRequest", "webRequestBlocking", "*://*/", "storage"],
-  "background": {
-    "scripts": ["background.js"],
-    "persistent": true
-  },
-  "options_page": "options.html",
-  "browser_action": {
-    "default_title": "Cobalt",
-    "default_popup": "popup.html" 
-  },
-  "web_accessible_resources": [
-    "cobaltService.js"
-  ],
-  "icons": {
-    "1024": "logo/cobalt.logo@1024x.png"
-  }
-}
\ No newline at end of file
diff --git a/cobalt/tools/cobalt_in_a_tab/options.html b/cobalt/tools/cobalt_in_a_tab/options.html
deleted file mode 100644
index 53bcd01..0000000
--- a/cobalt/tools/cobalt_in_a_tab/options.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-  <html>
-    <head>
-      <link rel="stylesheet" href="styles.css">
-    </head>
-    <body>
-      <h1>IP Endpoints</h1>
-      <div id="ip_list" class="table">
-        <div class="row">
-          <h3 class="listItem">Name</h3>
-          <h3 class="listItem">Endpoint</h3>
-        </div>
-        <div class="row">
-          <input id="inputDevice" type="text" class="listItem" />
-          <div class="listItem">
-            <p class="inline">http://</p>
-            <input id="inputIP" type="text" />
-          </div>
-          <input type="button" value="+" id="addIP"/>
-        </div>
-      </div>
-    </body>
-    <script src="options.js"></script>
-  </html>
\ No newline at end of file
diff --git a/cobalt/tools/cobalt_in_a_tab/options.js b/cobalt/tools/cobalt_in_a_tab/options.js
deleted file mode 100644
index 9b0629e..0000000
--- a/cobalt/tools/cobalt_in_a_tab/options.js
+++ /dev/null
@@ -1,49 +0,0 @@
-let ip_list = document.getElementById('ip_list');
-let ip_data = null;
-
-// Make list of ip endpoints dynamically.
-let current_ips = chrome.storage.sync.get('ip_endpoints', function(data) {
-  ip_data = data.ip_endpoints;
-  for (let i = 0; i < data.ip_endpoints.length; i++){
-    let item = data.ip_endpoints[i];
-    let ip_item = document.createElement('div');
-    ip_item.classList.add("row");
-    ip_item.id = item.endpoint;
-
-    let ip_title = document.createElement('p');
-    ip_title.innerText += item.device;
-    ip_title.classList.add("listItem");
-
-    let ip_endpoint = document.createElement('p');
-    ip_endpoint.innerText += item.endpoint;
-    ip_endpoint.classList.add("listItem");
-
-    let delete_button = document.createElement('input');
-    delete_button.type = "button";
-    delete_button.value = "-";
-    delete_button.classList.add("listItem");
-    delete_button.onclick = function(){
-      ip_data.splice(i, 1);
-      chrome.storage.sync.set({ip_endpoints: ip_data});
-      window.location.reload();
-    };
-
-    ip_list.appendChild(ip_item);
-
-    ip_item.appendChild(ip_title);
-    ip_item.appendChild(ip_endpoint);
-    ip_item.appendChild(delete_button);
-  }
-});
-
-document.getElementById("addIP").onclick = function () {
-  let add_device = document.getElementById("inputDevice").value;
-  let add_endpoint = "http://" + document.getElementById("inputIP").value;
-  let item = {
-    device: add_device,
-    endpoint: add_endpoint
-  };
-  ip_data.push(item);
-  chrome.storage.sync.set({ip_endpoints: ip_data});
-  window.location.reload();
-};
\ No newline at end of file
diff --git a/cobalt/tools/cobalt_in_a_tab/popup.html b/cobalt/tools/cobalt_in_a_tab/popup.html
deleted file mode 100644
index afe1427..0000000
--- a/cobalt/tools/cobalt_in_a_tab/popup.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <link rel="stylesheet" href="styles.css">
-  </head>
-  <body id="popup_body">
-  </body>
-  <script type="text/javascript" src="popup.js"></script>
-</html>
\ No newline at end of file
diff --git a/cobalt/tools/cobalt_in_a_tab/popup.js b/cobalt/tools/cobalt_in_a_tab/popup.js
deleted file mode 100644
index f8ba95b..0000000
--- a/cobalt/tools/cobalt_in_a_tab/popup.js
+++ /dev/null
@@ -1,23 +0,0 @@
-let body = document.getElementById('popup_body');
-
-// Dynamically create list of device endpoints.
-let current_ips = chrome.storage.sync.get('ip_endpoints', function(data) {
-  for (let i = 0; i < data.ip_endpoints.length; i++){
-    let item = data.ip_endpoints[i];
-    let ip_item = document.createElement('input');
-    item.device !== "" ? ip_item.value = item.device : ip_item.value = item.endpoint;
-    ip_item.type = "button";
-    ip_item.classList.add("buttonListItem");
-    ip_item.onclick = function(){
-      chrome.storage.sync.set({selected_ip: item.endpoint});
-      //open a new tab
-      createProperties = {
-        url: chrome.extension.getURL('cobaltView.html')
-      };
-      chrome.tabs.create(createProperties, function(tab){
-      });
-    };
-
-    body.appendChild(ip_item);
-  }
-});
\ No newline at end of file
diff --git a/cobalt/tools/cobalt_in_a_tab/screenshot.js b/cobalt/tools/cobalt_in_a_tab/screenshot.js
deleted file mode 100644
index 17833eb..0000000
--- a/cobalt/tools/cobalt_in_a_tab/screenshot.js
+++ /dev/null
@@ -1,295 +0,0 @@
-import cobaltService from "./cobaltService.js";
-
-// The unique ID needed for almost every webdriver command.
-let sessionId = null;
-// A container holding all the screens sending requests for frames.
-let screenList = [];
-// The number of screens requesting frames from Cobalt.
-// This must be greater than 1, but can be optimized for performance.
-// On flakey networks, more may be necessary.
-// 3-4 are recommended for stable behavior on a reliable, fast network.
-let numScreens = 4;
-// The screen that is currently displayed to the user.
-let visibleScreen = null;
-// The current position of the mouse relative to the screens.
-let mousePosition = {xPos: 0, yPos:0};
-// The ID of cobalt's body element.
-// Used to send mouse positioning instructions.
-let bodyElementId = null;
-// A cancelable event that sends mouse position to Cobalt.
-let mouseInterval = null;
-// The div that contains all the image frames.
-let parentContainer = null;
-
-window.onload = async function(){
-    await cobaltService.initialize();
-    // Create image tags with the appropriate css.
-    parentContainer = document.getElementById("screenContainer");
-    if (numScreens < 1) return;
-    for (let i = 0; i < numScreens; i++){
-        // Create an image and append it to DOM.
-        let newScreen = document.createElement("img");
-        newScreen.id = "screen" + i;
-        newScreen.classList.add("screen");
-        parentContainer.appendChild(newScreen);
-        screenList.push(newScreen);
-    }
-
-    // Grab a current session.
-    let sessions = await cobaltService.getSessions();
-    if(sessions.length > 0){
-        sessionId = sessions[0];
-    }
-    else{
-        // Create a new session if none are already created.
-        sessionId = await cobaltService.makeSession();
-    }
-    // Get Webdriver body element for mouse positioning.
-    bodyElementId = await cobaltService.getElement(sessionId);
-
-    cobaltService.startScreencast(sessionId).then((response) => {
-        cobaltService.setScreencastPort(response);
-        subscribeToMouseEvents();
-        window.addEventListener("keydown", sendKeyPress);
-        window.addEventListener("beforeunload", function(e){
-            cobaltService.stopScreencast(sessionId);
-            cobaltService.deleteSession(sessionId);
-        }, false);
-
-        // Start requesting screenshots.
-        for (let i = 0; i < screenList.length; i++) {
-            assignScreenshotURLAndId(screenList[i]);
-            // No screenshots are currently displayed.
-            screenList[i].currentImageId = -1;
-            visibleScreen = screenList[0];
-        }
-    });
-
-    // Assign image behavior.
-    for (let i = 0; i < screenList.length; i++) {
-        screenList[i].onload = () => { imageLoaded(screenList[i]) };
-        // Reload on error.
-        // TODO - differentiate between types of errors.
-        screenList[i].onerror = () => { assignScreenshotURLAndId(screenList[i]) };
-    }
-}
-
-function assignScreenshotURLAndId(screen){
-    let nextImageId = cobaltService.createNextScreenshotId();
-    screen.nextImageId = nextImageId;
-    screen.src = cobaltService.getScreenshotURL() + nextImageId;
-}
-
-function imageLoaded(screen){
-    // The image will only become visible if it's more recent than the last image.
-    if(screen.nextImageId > visibleScreen.currentImageId){
-        visibleScreen.classList.remove("visibleScreen");
-        screen.classList.add("visibleScreen");
-        visibleScreen = screen;
-    }
-    screen.currentImageId = screen.nextImageId;
-    assignScreenshotURLAndId(screen);
-}
-
-function sendClick(event){
-    let data = {
-        button: event.button
-    };
-    cobaltService.sendClick(sessionId, data);
-}
-
-function sendScroll(event){
-    // Prevent default browser action like scrolling on mouseKey.
-    event.preventDefault();
-}
-
-function saveMousePos(event){
-    mousePosition = {
-        xPos: event.clientX,
-        yPos: event.clientY
-    };
-}
-
-// Requests that get stalled send outdated mouse positions,
-// so only send one at a time. This will help ensure no mouse
-// movements are delayed.
-var mouseLock = false;
-function sendMousePos(){
-    if (mouseLock) return;
-    let viewportOffset = parentContainer.getBoundingClientRect();
-
-    let data = {
-        element: bodyElementId,
-        xoffset: mousePosition.xPos - viewportOffset.left,
-        yoffset: mousePosition.yPos - viewportOffset.top
-    };
-    mouseLock = true;
-    cobaltService.sendMouseMove(sessionId, data)
-    .then((response) => {
-        mouseLock = false;
-    });
-}
-
-function subscribeToMouseEvents(){
-    window.addEventListener('mousemove', saveMousePos);
-    window.addEventListener('click', sendClick);
-    window.addEventListener('scroll', sendScroll);
-    mouseInterval = setInterval(sendMousePos, 200);
-}
-
-if (typeof KeyEvent === 'undefined') {
-    var KeyEvent = {
-        DOM_VK_CANCEL: 3,
-        DOM_VK_HELP: 6,
-        DOM_VK_BACK_SPACE: 8,
-        DOM_VK_TAB: 9,
-        DOM_VK_CLEAR: 12,
-        DOM_VK_RETURN: 13,
-        DOM_VK_ENTER: 14,
-        DOM_VK_SHIFT: 16,
-        DOM_VK_CONTROL: 17,
-        DOM_VK_ALT: 18,
-        DOM_VK_PAUSE: 19,
-        DOM_VK_CAPS_LOCK: 20,
-        DOM_VK_ESCAPE: 27,
-        DOM_VK_SPACE: 32,
-        DOM_VK_PAGE_UP: 33,
-        DOM_VK_PAGE_DOWN: 34,
-        DOM_VK_END: 35,
-        DOM_VK_HOME: 36,
-        DOM_VK_LEFT: 37,
-        DOM_VK_UP: 38,
-        DOM_VK_RIGHT: 39,
-        DOM_VK_DOWN: 40,
-        DOM_VK_PRINTSCREEN: 44,
-        DOM_VK_INSERT: 45,
-        DOM_VK_DELETE: 46,
-        DOM_VK_0: 48,
-        DOM_VK_1: 49,
-        DOM_VK_2: 50,
-        DOM_VK_3: 51,
-        DOM_VK_4: 52,
-        DOM_VK_5: 53,
-        DOM_VK_6: 54,
-        DOM_VK_7: 55,
-        DOM_VK_8: 56,
-        DOM_VK_9: 57,
-        DOM_VK_SEMICOLON: 59,
-        DOM_VK_EQUALS: 61,
-        DOM_VK_A: 65,
-        DOM_VK_B: 66,
-        DOM_VK_C: 67,
-        DOM_VK_D: 68,
-        DOM_VK_E: 69,
-        DOM_VK_F: 70,
-        DOM_VK_G: 71,
-        DOM_VK_H: 72,
-        DOM_VK_I: 73,
-        DOM_VK_J: 74,
-        DOM_VK_K: 75,
-        DOM_VK_L: 76,
-        DOM_VK_M: 77,
-        DOM_VK_N: 78,
-        DOM_VK_O: 79,
-        DOM_VK_P: 80,
-        DOM_VK_Q: 81,
-        DOM_VK_R: 82,
-        DOM_VK_S: 83,
-        DOM_VK_T: 84,
-        DOM_VK_U: 85,
-        DOM_VK_V: 86,
-        DOM_VK_W: 87,
-        DOM_VK_X: 88,
-        DOM_VK_Y: 89,
-        DOM_VK_Z: 90,
-        DOM_VK_CONTEXT_MENU: 93,
-        DOM_VK_NUMPAD0: 96,
-        DOM_VK_NUMPAD1: 97,
-        DOM_VK_NUMPAD2: 98,
-        DOM_VK_NUMPAD3: 99,
-        DOM_VK_NUMPAD4: 100,
-        DOM_VK_NUMPAD5: 101,
-        DOM_VK_NUMPAD6: 102,
-        DOM_VK_NUMPAD7: 103,
-        DOM_VK_NUMPAD8: 104,
-        DOM_VK_NUMPAD9: 105,
-        DOM_VK_MULTIPLY: 106,
-        DOM_VK_ADD: 107,
-        DOM_VK_SEPARATOR: 108,
-        DOM_VK_SUBTRACT: 109,
-        DOM_VK_DECIMAL: 110,
-        DOM_VK_DIVIDE: 111,
-        DOM_VK_F1: 112,
-        DOM_VK_F2: 113,
-        DOM_VK_F3: 114,
-        DOM_VK_F4: 115,
-        DOM_VK_F5: 116,
-        DOM_VK_F6: 117,
-        DOM_VK_F7: 118,
-        DOM_VK_F8: 119,
-        DOM_VK_F9: 120,
-        DOM_VK_F10: 121,
-        DOM_VK_F11: 122,
-        DOM_VK_F12: 123,
-        DOM_VK_F13: 124,
-        DOM_VK_F14: 125,
-        DOM_VK_F15: 126,
-        DOM_VK_F16: 127,
-        DOM_VK_F17: 128,
-        DOM_VK_F18: 129,
-        DOM_VK_F19: 130,
-        DOM_VK_F20: 131,
-        DOM_VK_F21: 132,
-        DOM_VK_F22: 133,
-        DOM_VK_F23: 134,
-        DOM_VK_F24: 135,
-        DOM_VK_NUM_LOCK: 144,
-        DOM_VK_SCROLL_LOCK: 145,
-        DOM_VK_COMMA: 188,
-        DOM_VK_PERIOD: 190,
-        DOM_VK_SLASH: 191,
-        DOM_VK_BACK_QUOTE: 192,
-        DOM_VK_OPEN_BRACKET: 219,
-        DOM_VK_BACK_SLASH: 220,
-        DOM_VK_CLOSE_BRACKET: 221,
-        DOM_VK_QUOTE: 222,
-        DOM_VK_META: 224
-    };
-}
-
-function mapKeyCode(code){
-    // We want to optimize this for all printable characters ideally.
-    switch(code){
-        case KeyEvent.DOM_VK_UP:
-            return '\ue013';
-        case KeyEvent.DOM_VK_DOWN:
-            return '\ue015';
-        case KeyEvent.DOM_VK_LEFT:
-            return '\ue012';
-        case KeyEvent.DOM_VK_RIGHT:
-            return '\ue014';
-        case KeyEvent.DOM_VK_ENTER:
-            return '\ue007';
-        case KeyEvent.DOM_VK_RETURN:
-            return '\ue006';
-        case KeyEvent.DOM_VK_ESCAPE:
-            return '\ue00c';
-        case KeyEvent.DOM_VK_BACK_SPACE:
-            return '\ue003';
-        case KeyEvent.DOM_VK_SPACE:
-            return '\ue00d';
-        case KeyEvent.DOM_VK_SHIFT:
-            return '\ue008';
-        default:
-            return null;
-    }
-}
-
-function sendKeyPress(event){
-    // Prevent default browser action like scrolling on mouseKey.
-    event.preventDefault();
-
-    let uKeyCode = mapKeyCode(event.keyCode);
-    if(uKeyCode === null) uKeyCode = event.key;
-    cobaltService.sendKeystrokes(sessionId, [uKeyCode]);
-}
diff --git a/cobalt/tools/cobalt_in_a_tab/styles.css b/cobalt/tools/cobalt_in_a_tab/styles.css
deleted file mode 100644
index d0ee406..0000000
--- a/cobalt/tools/cobalt_in_a_tab/styles.css
+++ /dev/null
@@ -1,41 +0,0 @@
-.black {
-    background-color: black;
-}
-
-#screenContainer {
-    position: relative;
-}
-
-.screen {
-    position: absolute;
-    top: 0;
-    left: 0;
-    visibility: hidden;
-}
-
-.visibleScreen {
-    visibility: visible;
-}
-
-.table {
-    display: table;
-}
-
-.row {
-    display: table-row;
-    align-items: center;
-}
-
-.listItem {
-    display: table-cell;
-    padding-right: 5px;
-    padding-left: 5px;
-}
-
-.inline {
-    display: inline;
-}
-
-.buttonListItem {
-    display: block;
-}
\ No newline at end of file
diff --git a/cobalt/tools/collectd/install.sh b/cobalt/tools/collectd/install.sh
index d2ef017..1dff384 100755
--- a/cobalt/tools/collectd/install.sh
+++ b/cobalt/tools/collectd/install.sh
@@ -66,4 +66,3 @@
 print_msg "Cobalt DevTools do not currently listen on 'localhost' or 127.0.0.1"
 print_msg "Please manually edit target IP address to your adapter IP address in " ${COLLECTD_CONF_DIR}/cobalt.conf
 ifconfig | egrep "inet " | sed -E "s/.*inet (.*) netmask.*/\1/" | egrep -v "127.0.0.1"
-
diff --git a/cobalt/tools/verify-trace-members/README.md b/cobalt/tools/verify-trace-members/README.md
deleted file mode 100644
index c9fff3a..0000000
--- a/cobalt/tools/verify-trace-members/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# Verify Trace Members
-
-## Overview
-
-`verify-trace-members` is a tool to verify correct usage of Cobalt's tracer members system.
-
-## Usage
-
-`verify-trace-members` consists of two components:
-
-1.  A clang based static analysis tool, that produces and inspects an AST, and outputs suspected
-TraceMembers issues that it finds.
-2.  A python wrapper of component 1, that is responsible for running 1 for multiple translation
-units, and filtering its output.
-
-Before you can run the tool, both gyp and ninja (for the all target) must be run for linux-x64x11.
-Why?
-Because in order to properly comprehend C++ in Cobalt, we must know the exact commands Clang
-is invoked with when building it.
-Ninja must be run because of generated headers.
-
-Then, you can run `cobalt/tools/verify-trace-members/verify-trace-members.py` from `src/`, which
-will output suspected TraceMembers issues.
-
-## Build instructions
-
-Follow the instructions available [here](https://clang.llvm.org/docs/LibASTMatchersTutorial.html).
-You will have to check out (all hashes are from the git mirrors):
-
-* llvm (last built against f7f7143561)
-* clang (last built against 0caffbcfca)
-* clang-tools-extra (last built against 7007ecbdf8)
-
-Just add VerifyTraceMembers.cpp in place of LoopConvert.cpp.
-The only important extra step not in the tutorial is to run cmake for the final binary with
-`-DCMAKE_BUILD_TYPE=Release`.
diff --git a/cobalt/tools/verify-trace-members/VerifyTraceMembers.cpp b/cobalt/tools/verify-trace-members/VerifyTraceMembers.cpp
deleted file mode 100644
index 25f6ace..0000000
--- a/cobalt/tools/verify-trace-members/VerifyTraceMembers.cpp
+++ /dev/null
@@ -1,504 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Note: This file is here for reference only, and is *NOT* part of Cobalt's
-// build system.  See adjacent README.md for build instructions.
-
-#include "clang/ASTMatchers/ASTMatchFinder.h"
-#include "clang/ASTMatchers/ASTMatchers.h"
-#include "clang/Frontend/FrontendActions.h"
-#include "clang/Tooling/CommonOptionsParser.h"
-#include "clang/Tooling/Tooling.h"
-#include "llvm/Support/CommandLine.h"
-
-#include <algorithm>
-#include <iomanip>
-#include <iostream>
-#include <sstream>
-#include <string>
-#include <unordered_set>
-#include <vector>
-
-using namespace clang::ast_matchers;
-using namespace clang::tooling;
-using namespace clang;
-
-// My"Cool"String -> My\"Cool\"String
-std::string EscapeJson(const std::string& string) {
-  std::ostringstream o;
-  for (auto c : string) {
-    switch (c) {
-      case '"':
-        o << "\\\"";
-        break;
-      case '\\':
-        o << "\\\\";
-        break;
-      case '\b':
-        o << "\\b";
-        break;
-      case '\f':
-        o << "\\f";
-        break;
-      case '\n':
-        o << "\\n";
-        break;
-      case '\r':
-        o << "\\r";
-        break;
-      case '\t':
-        o << "\\t";
-        break;
-      default:
-        if ('\x00' <= c && c <= '\x1f') {
-          o << "\\u" << std::hex << std::setw(4) << std::setfill('0')
-            << static_cast<int>(c);
-        } else {
-          o << c;
-        }
-    }
-  }
-  return o.str();
-}
-
-enum JsonConversionType {
-  kNeedsEscape,
-  kAlreadyJson,
-};
-
-// Helper struct to make call sites of |ToJson| nice and fresh.
-struct KeyValue {
-  KeyValue(const std::string& key, const std::string& value,
-           JsonConversionType conversion_type = kNeedsEscape) {
-    this->key = '"' + EscapeJson(key) + '"';
-    if (conversion_type == kNeedsEscape) {
-      this->value = '"' + EscapeJson(value) + '"';
-    } else if (conversion_type == kAlreadyJson) {
-      this->value = value;
-    } else {
-      assert(false);
-    }
-  }
-  KeyValue(const std::string& key, int value) {
-    this->key = '"' + EscapeJson(key) + '"';
-    this->value = std::to_string(value);
-  }
-  KeyValue(const std::string& key, unsigned value) {
-    this->key = '"' + EscapeJson(key) + '"';
-    this->value = std::to_string(value);
-  }
-
-  std::string key;
-  std::string value;
-};
-
-// {{"foo", "bar"}, {"baz", 5}} -> {"foo": "bar", "baz": 5}
-std::string ToJson(std::vector<KeyValue> key_values) {
-  std::string result = "{";
-  bool needs_comma = false;
-  for (auto& key_value : key_values) {
-    if (needs_comma) result += ", ";
-    needs_comma = true;
-    result += key_value.key + ": " + key_value.value;
-  }
-  result += "}";
-  return result;
-}
-
-// Get an unsugared and unqualified string representation of
-// |qual_type|.
-std::string ToString(QualType qual_type) {
-  const Type* type = qual_type.getTypePtrOrNull();
-  if (!type) {
-    return "<INTERNALLY NULL>";
-  }
-  const Type* unqualified_desugared_type = type->getUnqualifiedDesugaredType();
-  CanQualType can_qual_type =
-      unqualified_desugared_type->getCanonicalTypeUnqualified();
-  return static_cast<QualType>(can_qual_type).getAsString();
-}
-
-// Return whether |base_decl| is a base class of |derived|.
-bool IsBaseOf(CXXRecordDecl* base_decl, QualType derived) {
-  const Type* derived_type = derived.getTypePtrOrNull();
-  CXXRecordDecl* derived_decl = derived_type->getAsCXXRecordDecl();
-  if (!derived_decl) {
-    return false;
-  }
-  if (base_decl == derived_decl) {
-    return true;
-  }
-  for (auto& base : derived_decl->bases()) {
-    if (IsBaseOf(base_decl, base.getType())) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// We need to keep track of types we've already visited due to type cycles in
-// templates. Consider, for example, "class Foo : public MyCrtp<Foo> {};".
-using Visited = std::unordered_set<const Type*>;
-
-// Utility functions to check if a type is roughly Traceable.
-// "Is roughly Traceable" is defined as follows:
-//   1. Traceable is roughly Traceable.
-//   2. A type is roughly Traceable if any of its parent classes are roughly
-//   Traceable.
-//   3. A type is roughly Traceable if any of its template arguments are roughly
-//   Traceable.
-//   4. T* is roughly Traceable if T is roughly Traceable.
-//
-// Note that this definition is intentionally liberal in what it considers
-// Traceable.  False positives (such as the T* field in scoped_refptr) are
-// expected to be handled by a white list that is implemented in a wrapper
-// script (in order to facilitate modification of the white list without
-// recompilation).
-bool IsTraceable(QualType qual_type, Visited& visited);
-bool IsTraceable(const RecordDecl* record_decl, Visited& visited);
-bool IsTraceable(QualType qual_type) {
-  Visited visited;
-  return IsTraceable(qual_type, visited);
-}
-
-bool IsTraceable(QualType qual_type, Visited& visited) {
-  const Type* type = qual_type.getTypePtrOrNull();
-  if (!type) {
-    return false;
-  }
-  if (visited.count(type) == 1) {
-    return false;
-  }
-  visited.insert(type);
-
-  // 1. Traceable is roughly Traceable.
-  const Type* unqualified_desugared_type = type->getUnqualifiedDesugaredType();
-  CanQualType can_qual_type =
-      unqualified_desugared_type->getCanonicalTypeUnqualified();
-  if (static_cast<QualType>(can_qual_type).getAsString() ==
-      "class cobalt::script::Traceable") {
-    return true;
-  }
-
-  // 4. T* is roughly Traceable if T is roughly Traceable.
-  if (type->isPointerType()) {
-    if (IsTraceable(type->getPointeeType(), visited)) {
-      return true;
-    }
-  }
-
-  // 3. A type is roughly Traceable if any of its template arguments are
-  // roughly Traceable.
-  if (auto* tst = qual_type.getNonReferenceType()
-                      ->getAs<TemplateSpecializationType>()) {
-    for (auto& arg : *tst) {
-      if (arg.getKind() == TemplateArgument::Type) {
-        if (IsTraceable(arg.getAsType(), visited)) {
-          return true;
-        }
-      }
-    }
-  }
-
-  return IsTraceable(type->getAsCXXRecordDecl(), visited);
-}
-
-bool IsTraceable(const RecordDecl* record_decl,
-                 std::unordered_set<const Type*>& visited) {
-  if (record_decl == nullptr) {
-    return false;
-  }
-  const CXXRecordDecl* cxx_record_decl =
-      dyn_cast<const CXXRecordDecl>(record_decl);
-  if (!cxx_record_decl || !cxx_record_decl->hasDefinition()) {
-    return false;
-  }
-  // 2. A type is roughly Traceable if any of its parent classes are roughly
-  // Traceable.
-  for (auto& base : cxx_record_decl->bases()) {
-    if (IsTraceable(base.getType(), visited)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Search |stmt| (and its children) for a reference to a member
-// expression named |target|.
-// clang-format off
-// Example tree:
-// tracer->Trace(wrappable_);
-//   |-CXXMemberCallExpr 0x98b2b80 'void'
-//   | |-MemberExpr 0x98b2af8 '<bound member function type>' ->Trace 0x5d490b0
-//   | | `-ImplicitCastExpr 0x98b2ae0 'script::Tracer *' <LValueToRValue>
-//   | |   `-DeclRefExpr 0x98b2ab8 'script::Tracer *' lvalue ParmVar 0x98b27e0 'tracer' 'script::Tracer *'
-//   | `-ImplicitCastExpr 0x98b2c78 'class cobalt::script::Traceable *' <DerivedToBase (Traceable)>
-//   |   `-ImplicitCastExpr 0x98b2c60 'class cobalt::dom::DOMImplementation *' <UserDefinedConversion>
-//   |     `-CXXMemberCallExpr 0x98b2c38 'class cobalt::dom::DOMImplementation *'
-//   |       `-MemberExpr 0x98b2c00 '<bound member function type>' .operator cobalt::dom::DOMImplementation * 0x90f1ad8
-//   |         `-ImplicitCastExpr 0x98b2be8 'const class scoped_refptr<class cobalt::dom::DOMImplementation>' lvalue <NoOp>
-//   |           `-MemberExpr 0x98b2b48 'scoped_refptr<class cobalt::dom::DOMImplementation>':'class scoped_refptr<class cobalt::dom::DOMImplementation>' lvalue ->implementation_ 0x90f2be8
-//   |             `-CXXThisExpr 0x98b2b30 'class cobalt::dom::Document *' this
-// clang-format on
-bool SearchForMemberExpr(Stmt* stmt, const std::string& target) {
-  if (MemberExpr* member_expr = dyn_cast<MemberExpr>(stmt)) {
-    if (member_expr->getMemberDecl()->getNameAsString() == target) {
-      return true;
-    }
-  }
-  for (auto& child : stmt->children()) {
-    if (SearchForMemberExpr(child, target)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Attempt to get the |n|th child of |body| as a |T|.  Returns nullptr if
-// there are not enough children, or the child was not |dyn_cast|able to |T|.
-template <typename T>
-T* MaybeGetNthChildAs(Stmt* body, int n) {
-  auto children = body->children();
-  if (std::distance(children.begin(), children.end()) < n) {
-    return nullptr;
-  }
-  auto it = children.begin();
-  std::advance(it, n);
-  return dyn_cast<T>(*it);
-}
-
-// Check if |stmt| matches something like:
-// clang-format off
-// (this example is from inside void Document::TraceMembers(script::Tracer* tracer))
-//   Node::TraceMembers(tracer);
-// Example tree:
-//   |-CXXMemberCallExpr 0x98b2a50 'void'
-//   | |-MemberExpr 0x98b29d8 '<bound member function type>' ->TraceMembers 0x7b979a0
-//   | | `-ImplicitCastExpr 0x98b2a80 'class cobalt::dom::Node *' <UncheckedDerivedToBase (Node)>
-//   | |   `-CXXThisExpr 0x98b29c0 'class cobalt::dom::Document *' this
-//   | `-ImplicitCastExpr 0x98b2aa0 'script::Tracer *' <LValueToRValue>
-//   |   `-DeclRefExpr 0x98b2a28 'script::Tracer *' lvalue ParmVar 0x98b27e0 'tracer' 'script::Tracer *'
-// clang-format on
-bool IsBaseClassTracerCall(Stmt* stmt) {
-  CXXMemberCallExpr* cxx_member_call_expr = dyn_cast<CXXMemberCallExpr>(stmt);
-  if (!cxx_member_call_expr) {
-    return false;
-  }
-
-  {
-    MemberExpr* member_expr =
-        MaybeGetNthChildAs<MemberExpr>(cxx_member_call_expr, 0);
-    if (!member_expr) {
-      return false;
-    }
-    {
-      ImplicitCastExpr* implicit_cast_expr =
-          MaybeGetNthChildAs<ImplicitCastExpr>(member_expr, 0);
-      if (!implicit_cast_expr) {
-        return false;
-      }
-      {
-        CXXThisExpr* cxx_this_expr =
-            MaybeGetNthChildAs<CXXThisExpr>(implicit_cast_expr, 0);
-        if (!cxx_this_expr) {
-          return false;
-        }
-
-        auto GetPointeeType = [](QualType qual_type) -> const Type* {
-          const Type* type = qual_type.getTypePtrOrNull();
-          if (!type) {
-            return nullptr;
-          }
-
-          if (!type->isPointerType()) {
-            return nullptr;
-          }
-
-          QualType pointee_qual_type = type->getPointeeType();
-          return pointee_qual_type.getTypePtrOrNull();
-        };
-
-        // Ensure that we are calling our base's TraceMembers.
-        const Type* this_type = GetPointeeType(cxx_this_expr->getType());
-        const Type* cast_type = GetPointeeType(implicit_cast_expr->getType());
-        if (!this_type || !cast_type) {
-          return false;
-        }
-
-        CXXRecordDecl* cast_decl = cast_type->getAsCXXRecordDecl();
-        CXXRecordDecl* this_decl = cast_type->getAsCXXRecordDecl();
-
-        if (!cast_decl || !this_decl) {
-          return false;
-        }
-
-        if (!IsBaseOf(cast_decl, cxx_this_expr->getType())) {
-          return false;
-        }
-      }
-    }
-  }
-
-  {
-    ImplicitCastExpr* implicit_cast_expr =
-        MaybeGetNthChildAs<ImplicitCastExpr>(cxx_member_call_expr, 1);
-    if (!implicit_cast_expr) {
-      return false;
-    }
-    // TODO: Check if this is of type script::Tracer*
-  }
-
-  return true;
-}
-
-class FieldPrinter : public MatchFinder::MatchCallback {
- public:
-  // Iterate over each field declaration (FieldDecl) of each class.  Check
-  // that the owning class's |TraceMembers| traces it.
-  void run(const MatchFinder::MatchResult& result) override {
-    const FieldDecl* field_decl =
-        result.Nodes.getNodeAs<clang::FieldDecl>("fieldDecl");
-    if (!field_decl) {
-      return;
-    }
-
-    QualType qual_type = field_decl->getType();
-    if (!IsTraceable(qual_type)) {
-      return;
-    }
-
-    const RecordDecl* parent = field_decl->getParent();
-    const CXXRecordDecl* cxx_parent = dyn_cast<const CXXRecordDecl>(parent);
-    if (!cxx_parent) {
-      return;
-    }
-
-    bool is_traced = false;
-    bool had_trace_members_declaration = false;
-    bool had_trace_members_body = false;
-    bool calls_base_trace_members = false;
-
-    auto methods = cxx_parent->methods();
-    auto trace_members_it =
-        std::find_if(methods.begin(), methods.end(), [](CXXMethodDecl* method) {
-          return method->getNameInfo().getName().getAsString() ==
-                 "TraceMembers";
-        });
-
-    if (trace_members_it != methods.end()) {
-      auto method = *trace_members_it;
-      had_trace_members_declaration = true;
-      Stmt* body = method->getBody();
-      if (body) {
-        had_trace_members_body = true;
-        bool first_statement = true;
-        for (Stmt* stmt : body->children()) {
-          if (first_statement) {
-            first_statement = false;
-            calls_base_trace_members |= IsBaseClassTracerCall(stmt);
-          }
-
-          if (CXXMemberCallExpr* call = dyn_cast<CXXMemberCallExpr>(stmt)) {
-            // TODO: Check that this is actually a tracer call
-            int nargs = call->getNumArgs();
-            if (nargs == 0) {
-              continue;
-            }
-            Expr* arg = call->getArg(0);
-            is_traced |=
-                SearchForMemberExpr(arg, field_decl->getNameAsString());
-          }
-        }
-      }
-    }
-
-    std::string field_name = field_decl->getNameAsString();
-    std::string field_class = ToString(qual_type);
-    std::string field_class_friendly = qual_type.getAsString();
-    std::string parent_class =
-        cxx_parent->getCanonicalDecl()->getQualifiedNameAsString();
-    std::string parent_class_friendly = cxx_parent->getNameAsString();
-    // TODO: Maybe get some line/column numbers and a filename too?
-
-    if (!had_trace_members_declaration) {
-      std::cout << ToJson({
-                       {"messageType", "needsTraceMembersDeclaration"},
-                       {"fieldName", field_name},
-                       {"fieldClass", field_class},
-                       {"fieldClassFriendly", field_class_friendly},
-                       {"parentClass", parent_class},
-                       {"parentClassFriendly", parent_class_friendly},
-                   })
-                << '\n';
-    } else {
-      if (had_trace_members_body) {
-        if (!is_traced) {
-          std::cout << ToJson({
-                           {"messageType", "needsTracerTraceField"},
-                           {"fieldName", field_name},
-                           {"fieldClass", field_class},
-                           {"fieldClassFriendly", field_class_friendly},
-                           {"parentClass", parent_class},
-                           {"parentClassFriendly", parent_class_friendly},
-                       })
-                    << '\n';
-        }
-        // Note that for a class that fails to call its base class's
-        // |TraceMembers|, this message will be printed for each field
-        // declaration it has.  We expect the script wrapping us to de-dupe
-        // these messages.
-        if (!calls_base_trace_members) {
-          // We need to dump the base classes so our wrapper script can filter
-          // out classes with direct bases of script::Wrappable and
-          // script::Traceable.
-          std::string bases = "[";
-          bool first = true;
-          for (auto base : cxx_parent->bases()) {
-            if (!first) bases += ", ";
-            first = false;
-            bases += '"' + EscapeJson(ToString(base.getType())) + '"';
-          }
-          bases += "]";
-          std::cout << ToJson({
-                           {"messageType", "needsCallBaseTraceMembers"},
-                           {"parentClass", parent_class},
-                           {"parentClassFriendly", parent_class_friendly},
-                           {"baseNames", bases, kAlreadyJson},
-                       })
-                    << '\n';
-        }
-      }
-      // Don't handle the case where there isn't a body.  We will find it
-      // later in another translation unit, or else the code would not be
-      // able to link successfully.
-    }
-  }
-};
-
-int main(int argc, const char** argv) {
-  llvm::cl::OptionCategory my_tool_category("verify-trace-members options");
-  llvm::cl::extrahelp common_help(CommonOptionsParser::HelpMessage);
-  llvm::cl::extrahelp more_help("\nMore help...");
-
-  CommonOptionsParser options_parser(argc, argv, my_tool_category);
-  ClangTool tool(options_parser.getCompilations(),
-                 options_parser.getSourcePathList());
-
-  FieldPrinter field_printer;
-  MatchFinder match_finder;
-  DeclarationMatcher field_matcher = fieldDecl().bind("fieldDecl");
-  match_finder.addMatcher(field_matcher, &field_printer);
-
-  return tool.run(newFrontendActionFactory(&match_finder).get());
-}
diff --git a/cobalt/tools/verify-trace-members/verify-trace-members.py b/cobalt/tools/verify-trace-members/verify-trace-members.py
deleted file mode 100755
index 3643891..0000000
--- a/cobalt/tools/verify-trace-members/verify-trace-members.py
+++ /dev/null
@@ -1,275 +0,0 @@
-#!/usr/bin/env python3
-
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the 'License');
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an 'AS IS' BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# pylint: disable=invalid-name
-"""A wrapper around the native-trace-members binary
-
-This script is responsible for:
-
-* Getting and translating Clang invocations required to build Cobalt into
-  verify-trace-members invocations.
-  * The Clang invocations are retrieved by asking ninja for them.
-  * Then, "clang++ -std=c++11 -c my_file.cc -o my_file.o" becomes
-    "verify-trace-members my_file.cc -- -std=c++11", for each command.
-
-* Filtering the output of verify-trace-members.
-  * We must remove repeated messages (as we could e.g., encounter the same
-    header multiple times in different translation units).
-
-  * We must also remove false positives due to the verify-trace-members output
-    being overly eager in what it thinks is a TraceMembers usage error.  It is
-    set up like this because changing the binary is painful, whereas changing
-    the wrapper script is not, so it's easier to just dump as much as possible
-    (relevant stuff) in the binary, and then filter here, rather than
-    attempt to filter in the binary.
-"""
-
-import json
-import logging
-import os
-import re
-import subprocess
-import sys
-
-# TODO: Probably pretty easy to speed this up by using multiprocessing for the
-# clang tool calls.
-
-LINUX_OUT_DIRS = [
-    'out/linux-x64x11_debug',
-    'out/linux-x64x11_devel',
-    'out/linux-x64x11_qa',
-    'out/linux-x64x11_gold',
-]
-
-# A little bit of environment set up.  We're going to be invoking a clang-like
-# tool as if we were clang, so we need to be in the same dir that clang
-# normally is.
-found_dir = False
-for out_dir in LINUX_OUT_DIRS:
-  if os.path.isdir(out_dir):
-    found_dir = True
-    os.chdir(out_dir)
-    break
-
-if not found_dir:
-  logging.error('At least one of %s must exist.', LINUX_OUT_DIRS)
-  sys.exit(1)
-
-
-def GetRawClangCommands():
-  """Ask ninja to output all the commands that would need to be run in order
-
-  to build the target "all".
-  """
-  p = subprocess.Popen(  # pylint: disable=consider-using-with
-      ['ninja', '-t', 'commands', 'all'],
-      stdout=subprocess.PIPE,
-      stderr=subprocess.PIPE)
-  stdout, stderr = p.communicate()
-  assert len(stderr) == 0
-  assert p.returncode == 0
-  lines = stdout.splitlines()
-  raw_commands = [line.decode() for line in lines]
-  return raw_commands
-
-
-def IsClangCommand(command):
-  """Determine if a command is a call to clang."""
-  no_goma = command[1:] if command[0] == 'gomacc' else command
-  if no_goma[0].endswith('bin/clang') or no_goma[0].endswith('bin/clang++'):
-    return True
-  return False
-
-
-def CommandStringToList(command_string):
-  """Parse a raw command string into a list of separate arguments."""
-  # We want to split on spaces, but we still have to respect quotes.
-  quote_split = re.split(r" ('.*?') ", command_string)
-  split = []
-  for item in quote_split:
-    if item.startswith("'"):
-      split.append(item[1:-1])
-    else:
-      for sub_item in item.split(' '):
-        split.append(sub_item)
-  return split
-
-
-def FindSourceFile(command):
-  """Extract the sole source file being compiled in a clang command.
-
-  Return None if no such file is found.
-  """
-  if len(command) < 2:
-    return None
-  if not ('clang' in command[0] or 'clang' in command[1]):
-    return None
-
-  for i, arg in enumerate(command):
-    if arg == '-c':
-      # Don't even bother trying to handle "-c" being the last arg, just
-      # crash.
-      assert i + 1 < len(command)
-      return command[i + 1]
-
-  return None
-
-
-def StripRelative(file_arg):
-  """ "../../cobalt/dom/document.cc" -> "cobalt/dom/document.cc" """
-  return re.sub(r'^(\.\./)+', '', file_arg)
-
-
-def ConvertClangCommandToVerifyTraceMembers(clang_command):
-  """Transform a clang invocation into a verify-trace-members invocation.
-
-  Returns None for non clang invocations.
-  """
-
-  source_file = FindSourceFile(clang_command)
-  if source_file is None:
-    return None
-
-  without_cxx = clang_command
-  if without_cxx[0].startswith('goma'):
-    without_cxx = without_cxx[1:]
-  without_cxx = without_cxx[1:]
-
-  # We want to keep everything except for "-c *" (which we already extracted),
-  # and "-o *".
-  result = []
-  i = 0
-  while i < len(without_cxx):
-    arg = without_cxx[i]
-    if arg == '-c':
-      i += 2
-      continue
-    if arg == '-o':
-      i += 2
-      continue
-    result.append(arg)
-    i += 1
-
-  result = [
-      # TODO: Need to put binary on google cloud, add hook to pull it from
-      # there, and add to gitignore.
-      '../../cobalt/tools/verify-trace-members',
-      source_file,
-      '--'
-  ] + result
-  # The tool is built against trunk clang, which has some warnings that we
-  # don't pass, therefore we must turn off -Wall.
-  result = [item for item in result if item != '-Wall']
-  return result
-
-
-doesnt_need_call_base_trace_members = {
-    'class cobalt::script::Wrappable',
-    'class cobalt::script::Traceable',
-}
-
-
-def main():
-  # TODO: Add arguments via argparse
-
-  raw_commands = GetRawClangCommands()
-  commands = [CommandStringToList(raw_command) for raw_command in raw_commands]
-
-  suggestions = set()
-  for command in commands:
-    tool_command = ConvertClangCommandToVerifyTraceMembers(command)
-    if tool_command is None:
-      continue
-    source_file = FindSourceFile(command)
-    # TODO: Accept list of files as arguments.
-    if not source_file.startswith('../../cobalt/dom/'):
-      continue
-    p = subprocess.Popen(  # pylint: disable=consider-using-with
-        tool_command,
-        stdout=subprocess.PIPE,
-        stderr=subprocess.PIPE)
-    stdout, stderr = p.communicate()
-    if len(stderr.decode()) != 0 or p.returncode != 0:
-      logging.error(stderr)
-      exit(1)  # pylint: disable=consider-using-sys-exit
-    for line in stdout.decode().splitlines():
-      # Load and then dump to JSON to standardize w.r.t. to whitespace/order, so
-      # we can use the stringified object itself as a key into a set.
-      suggestions.add(json.dumps(json.loads(line), sort_keys=True))
-
-  suggestions = [json.loads(s) for s in suggestions]
-
-  # Filter out some special cases that we should ignore.
-  actual_suggestions = []
-  for suggestion in suggestions:
-    message_type = suggestion['messageType']
-
-    if 'fieldClass' in suggestion:
-      field_class = suggestion['fieldClass']
-      # scoped_refptr and std::unique_ptr are currently the only way to signal
-      # ownership.
-      if not ('scoped_refptr' in field_class or
-              'std::unique_ptr' in field_class):
-        continue
-
-    if message_type == 'needsTraceMembersDeclaration':
-      pass
-    elif message_type == 'needsTracerTraceField':
-      pass
-    elif message_type == 'needsCallBaseTraceMembers':
-      base_names = suggestion['baseNames']
-      if any(
-          name in doesnt_need_call_base_trace_members for name in base_names):
-        continue
-    else:
-      assert False
-
-    actual_suggestions.append(suggestion)
-
-  for suggestion in actual_suggestions:
-    message_type = suggestion['messageType']
-    if message_type == 'needsTraceMembersDeclaration':
-      parent_class_friendly = suggestion['parentClassFriendly']
-      field_name = suggestion['fieldName']
-      print(f'{parent_class_friendly} needs to declare TraceMembers because '
-            f'of field {field_name}')
-      print('  void TraceMembers(script::Tracer* tracer) override;')
-    elif message_type == 'needsTracerTraceField':
-      parent_class_friendly = suggestion['parentClassFriendly']
-      field_name = suggestion['fieldName']
-      print(f'{parent_class_friendly} needs to trace field {field_name}')
-      print(f'  tracer->Trace({field_name});')
-    elif message_type == 'needsCallBaseTraceMembers':
-      parent_class_friendly = suggestion['parentClassFriendly']
-      base_names = suggestion['baseNames']
-      print(f'{parent_class_friendly} needs to call base class TraceMembers '
-            'in its TraceMembers')
-      print('Something like (this is probably over-qualified):')
-      for base_name in base_names:
-        print(f'  {base_name}::TraceMembers(tracer);')
-    else:
-      assert False
-
-    # TODO: Put this under a verbose output command line argument.
-    print(
-        json.dumps(
-            suggestion, sort_keys=True, indent=4, separators=(',', ': ')))
-    print('')
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/cobalt/trace_event/json_file_outputter.cc b/cobalt/trace_event/json_file_outputter.cc
index 2b85b61..df63ef1 100644
--- a/cobalt/trace_event/json_file_outputter.cc
+++ b/cobalt/trace_event/json_file_outputter.cc
@@ -15,10 +15,12 @@
 #include "cobalt/trace_event/json_file_outputter.h"
 
 #include <string>
+#include <utility>
 
 #if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 #include "base/command_line.h"
 #endif
+#include "base/files/file_starboard.h"
 #include "base/files/platform_file.h"
 #include "base/logging.h"
 #if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
@@ -27,7 +29,6 @@
 #endif
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread.h"
-
 #include "starboard/common/string.h"
 
 namespace cobalt {
@@ -135,6 +136,7 @@
   }
 
   int count = SbFileWrite(file_, buffer, length);
+  base::RecordFileWriteStat(count);
   if (count < 0) {
     Close();
   }
diff --git a/cobalt/trace_event/sample_benchmark.cc b/cobalt/trace_event/sample_benchmark.cc
index 629c46e..e0d7268 100644
--- a/cobalt/trace_event/sample_benchmark.cc
+++ b/cobalt/trace_event/sample_benchmark.cc
@@ -23,9 +23,8 @@
 
 // A sample simple benchmark that tracks only a single event, in this case,
 // "LoopIteration".
-TRACE_EVENT_BENCHMARK1(
-    SampleTestBenchmarkWithOneTrackedEvent,
-    "LoopIteration", cobalt::trace_event::IN_SCOPE_DURATION) {
+TRACE_EVENT_BENCHMARK1(SampleTestBenchmarkWithOneTrackedEvent, "LoopIteration",
+                       cobalt::trace_event::IN_SCOPE_DURATION) {
   const int kRenderIterationCount = 40;
   for (int i = 0; i < kRenderIterationCount; ++i) {
     TRACE_EVENT0("SampleBenchmark", "LoopIteration");
@@ -44,12 +43,12 @@
 // above, however it tracks 3 events instead of 1.  For one of those 3 events,
 // "SubEventA", we track both its in-scope duration as well as the time between
 // subsequent event instance start times.
-TRACE_EVENT_BENCHMARK4(
-    SampleTestBenchmarkWithThreeTrackedEvents,
-    "LoopIteration", cobalt::trace_event::IN_SCOPE_DURATION,
-    "SubEventA", cobalt::trace_event::IN_SCOPE_DURATION,
-    "SubEventA", cobalt::trace_event::TIME_BETWEEN_EVENT_STARTS,
-    "SubEventB", cobalt::trace_event::IN_SCOPE_DURATION) {
+TRACE_EVENT_BENCHMARK4(SampleTestBenchmarkWithThreeTrackedEvents,
+                       "LoopIteration", cobalt::trace_event::IN_SCOPE_DURATION,
+                       "SubEventA", cobalt::trace_event::IN_SCOPE_DURATION,
+                       "SubEventA",
+                       cobalt::trace_event::TIME_BETWEEN_EVENT_STARTS,
+                       "SubEventB", cobalt::trace_event::IN_SCOPE_DURATION) {
   const int kRenderIterationCount = 40;
   for (int i = 0; i < kRenderIterationCount; ++i) {
     TRACE_EVENT0("SampleBenchmark", "LoopIteration");
@@ -77,12 +76,11 @@
   usleep(10000);
 }
 
-TRACE_EVENT_BENCHMARK4(
-    FlowExample,
-    "FlowInitiator", cobalt::trace_event::IN_SCOPE_DURATION,
-    "FlowInitiator", cobalt::trace_event::FLOW_DURATION,
-    "FlowInitiator", cobalt::trace_event::TIME_BETWEEN_EVENT_STARTS,
-    "HandleTask()", cobalt::trace_event::FLOW_DURATION) {
+TRACE_EVENT_BENCHMARK4(FlowExample, "FlowInitiator",
+                       cobalt::trace_event::IN_SCOPE_DURATION, "FlowInitiator",
+                       cobalt::trace_event::FLOW_DURATION, "FlowInitiator",
+                       cobalt::trace_event::TIME_BETWEEN_EVENT_STARTS,
+                       "HandleTask()", cobalt::trace_event::FLOW_DURATION) {
   base::Thread thread("Worker");
   thread.Start();
 
diff --git a/cobalt/updater/configurator.cc b/cobalt/updater/configurator.cc
index 4fbcd1b..aa1e743 100644
--- a/cobalt/updater/configurator.cc
+++ b/cobalt/updater/configurator.cc
@@ -34,6 +34,8 @@
 const int kDelayOneMinute = 60;
 const int kDelayOneHour = kDelayOneMinute * 60;
 const char kDefaultUpdaterChannel[] = "prod";
+const char kOmahaCobaltLTSNightlyAppID[] =
+    "{26CD2F67-091F-4680-A9A9-2229635B65A5}";
 const char kOmahaCobaltTrunkAppID[] = "{A9557415-DDCD-4948-8113-C643EFCF710C}";
 const char kOmahaCobaltAppID[] = "{6D4E53F3-CC64-4CB8-B6BD-AB0B8F300E1C}";
 
@@ -63,8 +65,7 @@
           base::MakeRefCounted<NetworkFetcherFactoryCobalt>(network_module)),
       patch_factory_(base::MakeRefCounted<PatcherFactory>()) {
   LOG(INFO) << "Configurator::Configurator";
-  const std::string persisted_channel =
-      persisted_data_->GetUpdaterChannel(GetAppGuid());
+  const std::string persisted_channel = persisted_data_->GetLatestChannel();
   if (persisted_channel.empty()) {
     SetChannel(kDefaultUpdaterChannel);
   } else {
@@ -224,7 +225,11 @@
 
 std::vector<uint8_t> Configurator::GetRunActionKeyHash() const { return {}; }
 
-std::string Configurator::GetAppGuidHelper(const std::string& version) {
+std::string Configurator::GetAppGuidHelper(const std::string& updater_channel,
+                                           const std::string& version) {
+  if (updater_channel == "ltsnightly") {
+    return kOmahaCobaltLTSNightlyAppID;
+  }
   if (version.find(".lts.") != std::string::npos &&
       version.find(".master.") == std::string::npos) {
     return kOmahaCobaltAppID;
@@ -234,7 +239,7 @@
 
 std::string Configurator::GetAppGuid() const {
   const std::string version(COBALT_VERSION);
-  return GetAppGuidHelper(version);
+  return GetAppGuidHelper(updater_channel_, version);
 }
 
 std::unique_ptr<update_client::ProtocolHandlerFactory>
diff --git a/cobalt/updater/configurator.h b/cobalt/updater/configurator.h
index 1286b68..13bb9e6 100644
--- a/cobalt/updater/configurator.h
+++ b/cobalt/updater/configurator.h
@@ -102,7 +102,8 @@
   bool GetUseCompressedUpdates() const override;
   void SetUseCompressedUpdates(bool use_compressed_updates) override;
   // Added for testing purposes.
-  static std::string GetAppGuidHelper(const std::string&);
+  static std::string GetAppGuidHelper(const std::string& updater_channel,
+                                      const std::string& version);
 
  private:
   friend class base::RefCountedThreadSafe<Configurator>;
diff --git a/cobalt/updater/configurator_test.cc b/cobalt/updater/configurator_test.cc
index cba7ccf..e0bf7b1 100644
--- a/cobalt/updater/configurator_test.cc
+++ b/cobalt/updater/configurator_test.cc
@@ -13,9 +13,12 @@
 // limitations under the License.
 
 #include "cobalt/updater/configurator.h"
+
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
+const char kOmahaCobaltLTSNightlyAppID[] =
+    "{26CD2F67-091F-4680-A9A9-2229635B65A5}";
 const char kOmahaCobaltTrunkAppID[] = "{A9557415-DDCD-4948-8113-C643EFCF710C}";
 const char kOmahaCobaltAppID[] = "{6D4E53F3-CC64-4CB8-B6BD-AB0B8F300E1C}";
 }  // namespace
@@ -30,28 +33,47 @@
 };
 
 TEST_F(ConfiguratorTest, GetAppGuidReturnsTrunkIdWithVersionMaster) {
-  CHECK_EQ(cobalt::updater::Configurator::GetAppGuidHelper("23.master.0"),
-           kOmahaCobaltTrunkAppID);
+  CHECK_EQ(
+      cobalt::updater::Configurator::GetAppGuidHelper("prod", "23.master.0"),
+      kOmahaCobaltTrunkAppID);
+}
+
+TEST_F(ConfiguratorTest, GetAppGuidReturnsLtsIdWithVersionMaster) {
+  CHECK_EQ(cobalt::updater::Configurator::GetAppGuidHelper("ltsnightly",
+                                                           "23.master.0"),
+           kOmahaCobaltLTSNightlyAppID);
+}
+
+TEST_F(ConfiguratorTest, GetAppGuidReturnsLtsIdWithVersionLts) {
+  CHECK_EQ(
+      cobalt::updater::Configurator::GetAppGuidHelper("ltsnightly", "23.lts.0"),
+      kOmahaCobaltLTSNightlyAppID);
 }
 
 TEST_F(ConfiguratorTest, GetAppGuidReturnsTrunkIdWithVersionMain) {
-  CHECK_EQ(cobalt::updater::Configurator::GetAppGuidHelper("23.main.0"),
+  CHECK_EQ(cobalt::updater::Configurator::GetAppGuidHelper("prod", "23.main.0"),
            kOmahaCobaltTrunkAppID);
 }
 
 TEST_F(ConfiguratorTest, GetAppGuidReturnsProdIdWithVersionLts) {
-  CHECK_EQ(cobalt::updater::Configurator::GetAppGuidHelper("23.lts.0"),
+  CHECK_EQ(cobalt::updater::Configurator::GetAppGuidHelper("prod", "23.lts.0"),
+           kOmahaCobaltAppID);
+}
+
+TEST_F(ConfiguratorTest, GetAppGuidReturnsProdIdWithChannelEmpty) {
+  CHECK_EQ(cobalt::updater::Configurator::GetAppGuidHelper("", "23.lts.0"),
            kOmahaCobaltAppID);
 }
 
 TEST_F(ConfiguratorTest, GetAppGuidReturnsTrunkIdWithVersionEmpty) {
-  CHECK_EQ(cobalt::updater::Configurator::GetAppGuidHelper(""),
+  CHECK_EQ(cobalt::updater::Configurator::GetAppGuidHelper("", ""),
            kOmahaCobaltTrunkAppID);
 }
 
 TEST_F(ConfiguratorTest, GetAppGuidReturnsTrunkIdWithVersionMasterLts) {
-  CHECK_EQ(cobalt::updater::Configurator::GetAppGuidHelper("23.master.lts.0"),
-           kOmahaCobaltTrunkAppID);
+  CHECK_EQ(
+      cobalt::updater::Configurator::GetAppGuidHelper("", "23.master.lts.0"),
+      kOmahaCobaltTrunkAppID);
 }
 
 }  // namespace updater
diff --git a/cobalt/updater/crash_client.cc b/cobalt/updater/crash_client.cc
index 75d2fa5..7a81ab6 100644
--- a/cobalt/updater/crash_client.cc
+++ b/cobalt/updater/crash_client.cc
@@ -21,6 +21,7 @@
 
 #if defined(OS_WIN)
 #include <windows.h>
+
 #include "base/win/wrapped_window_proc.h"
 #endif
 
@@ -73,8 +74,7 @@
 bool CrashClient::InitializeCrashReporting() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  if (!InitializeDatabaseOnly())
-    return false;
+  if (!InitializeDatabaseOnly()) return false;
 
 #if defined(OS_WIN)
   // Catch exceptions thrown from a window procedure.
diff --git a/cobalt/updater/crash_sandbox.cc b/cobalt/updater/crash_sandbox.cc
index 869c589..4ef31a2 100644
--- a/cobalt/updater/crash_sandbox.cc
+++ b/cobalt/updater/crash_sandbox.cc
@@ -18,6 +18,6 @@
 #include "starboard/event.h"
 
 void SbEventHandle(const SbEvent* event) {
-  volatile int* a = (int*)(NULL);
+  volatile int* a = reinterpret_cast<int*>(NULL);
   *a = 1;
 }
diff --git a/cobalt/updater/installer.cc b/cobalt/updater/installer.cc
index ab14865..c542624 100644
--- a/cobalt/updater/installer.cc
+++ b/cobalt/updater/installer.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/updater/installer.h"
+#include "chrome/updater/installer.h"  // NOLINT(build/include)
 
 #include <utility>
 
@@ -78,8 +78,7 @@
     const base::Version version(path.BaseName().MaybeAsASCII());
 
     // Ignore folders that don't have valid version names.
-    if (!version.IsValid())
-      continue;
+    if (!version.IsValid()) continue;
 
     // The |version| not newer than the latest found version is marked for
     // removal. |kNullVersion| is also removed.
@@ -89,8 +88,7 @@
     }
 
     // New valid |version| folder found.
-    if (!latest_path.empty())
-      older_paths.push_back(latest_path);
+    if (!latest_path.empty()) older_paths.push_back(latest_path);
 
     latest_version = version;
     latest_path = path;
@@ -102,14 +100,12 @@
   base::ReadFileToString(latest_path.AppendASCII("manifest.fingerprint"),
                          &install_info_->fingerprint);
 
-  for (const auto& older_path : older_paths)
-    base::DeleteFile(older_path, true);
+  for (const auto& older_path : older_paths) base::DeleteFile(older_path, true);
 }
 
 Installer::Result Installer::InstallHelper(const base::FilePath& unpack_path) {
   auto local_manifest = update_client::ReadManifest(unpack_path);
-  if (!local_manifest)
-    return Result(update_client::InstallError::BAD_MANIFEST);
+  if (!local_manifest) return Result(update_client::InstallError::BAD_MANIFEST);
 
   std::string version_ascii;
   local_manifest->GetStringASCII("version", &version_ascii);
@@ -166,8 +162,7 @@
 }
 
 void Installer::Install(const base::FilePath& unpack_path,
-                        const std::string& public_key,
-                        Callback callback) {
+                        const std::string& public_key, Callback callback) {
   std::unique_ptr<base::DictionaryValue> manifest;
   base::Version version;
   base::FilePath install_path;
@@ -182,8 +177,6 @@
   return false;
 }
 
-bool Installer::Uninstall() {
-  return false;
-}
+bool Installer::Uninstall() { return false; }
 
 }  // namespace updater
diff --git a/cobalt/updater/installer.h b/cobalt/updater/installer.h
index ef97e84..db45903 100644
--- a/cobalt/updater/installer.h
+++ b/cobalt/updater/installer.h
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_UPDATER_INSTALLER_H_
+#ifndef CHROME_UPDATER_INSTALLER_H_  // NOLINT(build/header_guard)
 #define CHROME_UPDATER_INSTALLER_H_
 
 #include <stdint.h>
@@ -53,8 +53,7 @@
 
   // Overrides from update_client::CrxInstaller.
   void OnUpdateError(int error) override;
-  void Install(const base::FilePath& unpack_path,
-               const std::string& public_key,
+  void Install(const base::FilePath& unpack_path, const std::string& public_key,
                Callback callback) override;
   bool GetInstalledFile(const std::string& file,
                         base::FilePath* installed_file) override;
diff --git a/cobalt/updater/network_fetcher.cc b/cobalt/updater/network_fetcher.cc
index 0f4887e..2c180a9 100644
--- a/cobalt/updater/network_fetcher.cc
+++ b/cobalt/updater/network_fetcher.cc
@@ -109,6 +109,35 @@
   url_fetcher_->Start();
 }
 
+#if defined(IN_MEMORY_UPDATES)
+void NetworkFetcher::DownloadToString(
+    const GURL& url, std::string* dst,
+    ResponseStartedCallback response_started_callback,
+    ProgressCallback progress_callback,
+    DownloadToStringCompleteCallback download_to_string_complete_callback) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  LOG(INFO) << "cobalt::updater::NetworkFetcher::DownloadToString";
+  LOG(INFO) << "DownloadToString url = " << url;
+
+  CHECK(dst != nullptr);
+  dst_str_ = dst;
+
+  response_started_callback_ = std::move(response_started_callback);
+  progress_callback_ = std::move(progress_callback);
+  download_to_string_complete_callback_ =
+      std::move(download_to_string_complete_callback);
+
+  CreateUrlFetcher(url, net::URLFetcher::GET);
+
+  url_fetcher_->SaveResponseToLargeString();
+
+  url_fetcher_type_ = kUrlFetcherTypeDownloadToString;
+
+  url_fetcher_->Start();
+}
+
+#else
 void NetworkFetcher::DownloadToFile(
     const GURL& url, const base::FilePath& file_path,
     ResponseStartedCallback response_started_callback,
@@ -134,6 +163,7 @@
 
   url_fetcher_->Start();
 }
+#endif
 
 void NetworkFetcher::Cancel() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -158,9 +188,15 @@
   const int response_code = source->GetResponseCode();
   if (url_fetcher_type_ == kUrlFetcherTypePostRequest) {
     OnPostRequestComplete(source, status.error());
+#if defined(IN_MEMORY_UPDATES)
+  } else if (url_fetcher_type_ == kUrlFetcherTypeDownloadToString) {
+    OnDownloadToStringComplete(source, status.error());
+  }
+#else
   } else if (url_fetcher_type_ == kUrlFetcherTypeDownloadToFile) {
     OnDownloadToFileComplete(source, status.error());
   }
+#endif
 
   if (!status.is_success() || !IsResponseCodeSuccess(response_code)) {
     std::string msg(base::StringPrintf(
@@ -229,6 +265,22 @@
                           update_client::NetworkFetcher::kHeaderXRetryAfter));
 }
 
+#if defined(IN_MEMORY_UPDATES)
+void NetworkFetcher::OnDownloadToStringComplete(const net::URLFetcher* source,
+                                                const int status_error) {
+  LOG(INFO) << "cobalt::updater::NetworkFetcher::OnDownloadToStringComplete";
+
+  if (!source->GetResponseAsLargeString(dst_str_)) {
+    LOG(ERROR) << "DownloadToString failed to get response from a string";
+  }
+
+  std::move(download_to_string_complete_callback_)
+      .Run(dst_str_, status_error,
+           source->GetResponseHeaders()
+               ? source->GetResponseHeaders()->GetContentLength()
+               : -1);
+}
+#else
 void NetworkFetcher::OnDownloadToFileComplete(const net::URLFetcher* source,
                                               const int status_error) {
   LOG(INFO) << "cobalt::updater::NetworkFetcher::OnDownloadToFileComplete";
@@ -244,6 +296,7 @@
                ? source->GetResponseHeaders()->GetContentLength()
                : -1);
 }
+#endif
 
 NetworkFetcher::ReturnWrapper NetworkFetcher::HandleError(
     const std::string& message) {
diff --git a/cobalt/updater/network_fetcher.h b/cobalt/updater/network_fetcher.h
index c32f74d..1ec57e3 100644
--- a/cobalt/updater/network_fetcher.h
+++ b/cobalt/updater/network_fetcher.h
@@ -40,7 +40,11 @@
 
 typedef enum UrlFetcherType {
   kUrlFetcherTypePostRequest,
+#if defined(IN_MEMORY_UPDATES)
+  kUrlFetcherTypeDownloadToString,
+#else
   kUrlFetcherTypeDownloadToFile,
+#endif
 } UrlFetcherType;
 
 class NetworkFetcher : public update_client::NetworkFetcher,
@@ -51,8 +55,13 @@
   using ProgressCallback = update_client::NetworkFetcher::ProgressCallback;
   using PostRequestCompleteCallback =
       update_client::NetworkFetcher::PostRequestCompleteCallback;
+#if defined(IN_MEMORY_UPDATES)
+  using DownloadToStringCompleteCallback =
+      update_client::NetworkFetcher::DownloadToStringCompleteCallback;
+#else
   using DownloadToFileCompleteCallback =
       update_client::NetworkFetcher::DownloadToFileCompleteCallback;
+#endif
 
   explicit NetworkFetcher(const network::NetworkModule* network_module);
   ~NetworkFetcher() override;
@@ -64,11 +73,21 @@
       ResponseStartedCallback response_started_callback,
       ProgressCallback progress_callback,
       PostRequestCompleteCallback post_request_complete_callback) override;
+#if defined(IN_MEMORY_UPDATES)
+  // Does not take ownership of |dst|, which must refer to a valid string that
+  // outlives this object.
+  void DownloadToString(const GURL& url, std::string* dst,
+                        ResponseStartedCallback response_started_callback,
+                        ProgressCallback progress_callback,
+                        DownloadToStringCompleteCallback
+                            download_to_string_complete_callback) override;
+#else
   void DownloadToFile(const GURL& url, const base::FilePath& file_path,
                       ResponseStartedCallback response_started_callback,
                       ProgressCallback progress_callback,
                       DownloadToFileCompleteCallback
                           download_to_file_complete_callback) override;
+#endif
   void Cancel() override;
 
   // net::URLFetcherDelegate interface.
@@ -97,8 +116,14 @@
 
   void OnPostRequestComplete(const net::URLFetcher* source,
                              const int status_error);
+
+#if defined(IN_MEMORY_UPDATES)
+  void OnDownloadToStringComplete(const net::URLFetcher* source,
+                                  const int status_error);
+#else
   void OnDownloadToFileComplete(const net::URLFetcher* source,
                                 const int status_error);
+#endif
 
   static constexpr int kMaxRetriesOnNetworkChange = 3;
 
@@ -111,7 +136,12 @@
   ResponseStartedCallback response_started_callback_;
   ProgressCallback progress_callback_;
   PostRequestCompleteCallback post_request_complete_callback_;
+#if defined(IN_MEMORY_UPDATES)
+  DownloadToStringCompleteCallback download_to_string_complete_callback_;
+  std::string* dst_str_;  // not owned, can't be null
+#else
   DownloadToFileCompleteCallback download_to_file_complete_callback_;
+#endif
 
   const network::NetworkModule* network_module_;
 
diff --git a/cobalt/updater/patcher.cc b/cobalt/updater/patcher.cc
index 805ffff..8d9dbff 100644
--- a/cobalt/updater/patcher.cc
+++ b/cobalt/updater/patcher.cc
@@ -5,6 +5,7 @@
 #include "cobalt/updater/patcher.h"
 
 #include <utility>
+
 #include "base/callback.h"
 #include "base/files/file.h"
 #include "base/files/file_path.h"
diff --git a/cobalt/version.h b/cobalt/version.h
index 12dce9f..95464e8 100644
--- a/cobalt/version.h
+++ b/cobalt/version.h
@@ -35,6 +35,6 @@
 //                  release is cut.
 //.
 
-#define COBALT_VERSION "24.master.0"
+#define COBALT_VERSION "25.master.0"
 
 #endif  // COBALT_VERSION_H_
diff --git a/cobalt/watchdog/watchdog.cc b/cobalt/watchdog/watchdog.cc
index 61cc134..4821d04 100644
--- a/cobalt/watchdog/watchdog.cc
+++ b/cobalt/watchdog/watchdog.cc
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/watchdog/watchdog.h"
+
 #include <algorithm>
 #include <sstream>
 #include <utility>
@@ -20,7 +22,6 @@
 #include "base/command_line.h"
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
-#include "cobalt/watchdog/watchdog.h"
 #include "starboard/common/file.h"
 #include "starboard/common/log.h"
 #include "starboard/configuration_constants.h"
@@ -146,6 +147,14 @@
   return watchdog_file_path_;
 }
 
+std::vector<std::string> Watchdog::GetWatchdogClientNames() {
+  std::vector<std::string> names;
+  for (auto& it : client_map_) {
+    names.push_back(it.first);
+  }
+  return names;
+}
+
 void Watchdog::WriteWatchdogViolations() {
   // Writes Watchdog violations to persistent storage as a json file.
   std::string watchdog_json;
@@ -517,39 +526,87 @@
   return client_exists;
 }
 
-std::string Watchdog::GetWatchdogViolations(bool clear) {
+std::string Watchdog::GetWatchdogViolations(
+    const std::vector<std::string>& clients, bool clear) {
   // Gets a json string containing the Watchdog violations since the last
   // call (up to the kWatchdogMaxViolations limit).
-
   if (is_disabled_) return "";
 
   std::string watchdog_json = "";
+  std::string watchdog_json_fetched = "";
 
   starboard::ScopedLock scoped_lock(mutex_);
 
   if (pending_write_) WriteWatchdogViolations();
 
-  starboard::ScopedFile read_file(GetWatchdogFilePath().c_str(),
-                                  kSbFileOpenOnly | kSbFileRead);
-  if (read_file.IsValid()) {
-    int64_t kFileSize = read_file.GetSize();
+  starboard::ScopedFile file(GetWatchdogFilePath().c_str(),
+                             kSbFileOpenOnly | kSbFileRead | kSbFileWrite);
+  if (file.IsValid()) {
+    int64_t kFileSize = file.GetSize();
     std::vector<char> buffer(kFileSize + 1, 0);
-    read_file.ReadAll(buffer.data(), kFileSize);
+    file.ReadAll(buffer.data(), kFileSize);
     watchdog_json = std::string(buffer.data());
 
-    // Removes all Watchdog violations.
-    if (clear) {
-      if (violations_map_) {
-        static_cast<base::DictionaryValue*>(violations_map_.get())->Clear();
-        violations_count_ = 0;
+    // If clients is empty we will fetch all clients.
+    if (clients.empty()) {
+      if (clear) {
+        if (violations_map_) {
+          static_cast<base::DictionaryValue*>(violations_map_.get())->Clear();
+          violations_count_ = 0;
+        }
+        starboard::SbFileDeleteRecursive(GetWatchdogFilePath().c_str(), true);
       }
-      starboard::SbFileDeleteRecursive(GetWatchdogFilePath().c_str(), true);
+      watchdog_json_fetched = watchdog_json;
+    } else {
+      std::string watchdog_json_not_read = "";
+      std::unique_ptr<base::Value> violations_map =
+          base::JSONReader::Read(watchdog_json);
+      base::Value filtered_client_data(base::Value::Type::DICTIONARY);
+      for (int i = 0; i < clients.size(); i++) {
+        base::Value* violation_dict = violations_map->FindKey(clients[i]);
+        if (violation_dict != nullptr) {
+          filtered_client_data.SetKey(clients[i], (*violation_dict).Clone());
+          if (clear) {
+            base::Value* violations = violation_dict->FindKey("violations");
+            int violations_count = violations->GetList().size();
+            violations_map->RemoveKey(clients[i]);
+            if (violations_map_) {
+              bool result =
+                  static_cast<base::DictionaryValue*>(violations_map_.get())
+                      ->RemoveKey(clients[i]);
+              if (result) {
+                violations_count_ -= violations_count;
+              }
+              if (violations_count_ == 0) {
+                static_cast<base::DictionaryValue*>(violations_map_.get())
+                    ->Clear();
+              }
+            }
+          }
+        }
+      }
+      if (!filtered_client_data.DictEmpty()) {
+        base::JSONWriter::Write(filtered_client_data, &watchdog_json_fetched);
+      }
+      if (clear) {
+        // If all data is fetched, delete the violation file.
+        if (violations_map->DictEmpty()) {
+          starboard::SbFileDeleteRecursive(GetWatchdogFilePath().c_str(), true);
+        } else {
+          base::JSONWriter::Write(*violations_map, &watchdog_json_not_read);
+          file.Seek(kSbFileFromBegin, 0);
+          file.WriteAll(watchdog_json_not_read.c_str(),
+                        static_cast<int>(watchdog_json_not_read.size()));
+          file.Truncate(static_cast<int>(watchdog_json_not_read.size()));
+          time_last_written_microseconds_ = SbTimeGetMonotonicNow();
+        }
+      }
     }
-    SB_LOG(INFO) << "[Watchdog] Reading violations:\n" << watchdog_json;
+    SB_LOG(INFO) << "[Watchdog] Reading violations:\n" << watchdog_json_fetched;
   } else {
     SB_LOG(INFO) << "[Watchdog] No violations.";
   }
-  return watchdog_json;
+  return watchdog_json_fetched;
 }
 
 bool Watchdog::GetPersistentSettingWatchdogEnable() {
diff --git a/cobalt/watchdog/watchdog.h b/cobalt/watchdog/watchdog.h
index b689e86..fde3b4b 100644
--- a/cobalt/watchdog/watchdog.h
+++ b/cobalt/watchdog/watchdog.h
@@ -18,6 +18,7 @@
 #include <memory>
 #include <string>
 #include <unordered_map>
+#include <vector>
 
 #include "base/values.h"
 #include "cobalt/base/application_state.h"
@@ -81,6 +82,7 @@
   bool InitializeStub();
   void Uninitialize();
   std::string GetWatchdogFilePath();
+  std::vector<std::string> GetWatchdogClientNames();
   void UpdateState(base::ApplicationState state);
   bool Register(std::string name, std::string description,
                 base::ApplicationState monitor_state,
@@ -89,7 +91,8 @@
   bool Unregister(const std::string& name, bool lock = true);
   bool Ping(const std::string& name);
   bool Ping(const std::string& name, const std::string& info);
-  std::string GetWatchdogViolations(bool clear = true);
+  std::string GetWatchdogViolations(
+      const std::vector<std::string>& clients = {}, bool clear = true);
   bool GetPersistentSettingWatchdogEnable();
   void SetPersistentSettingWatchdogEnable(bool enable_watchdog);
   bool GetPersistentSettingWatchdogCrash();
diff --git a/cobalt/watchdog/watchdog_test.cc b/cobalt/watchdog/watchdog_test.cc
index fb0cf19..0681ce0 100644
--- a/cobalt/watchdog/watchdog_test.cc
+++ b/cobalt/watchdog/watchdog_test.cc
@@ -12,11 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/watchdog/watchdog.h"
+
+#include <set>
 #include <vector>
 
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
-#include "cobalt/watchdog/watchdog.h"
 #include "starboard/common/file.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -27,6 +29,7 @@
 
 const char kWatchdogViolationsJson[] = "watchdog_test.json";
 const int64_t kWatchdogMonitorFrequency = 100000;
+const int64_t kWatchdogSleepDuration = kWatchdogMonitorFrequency * 4;
 
 }  // namespace
 
@@ -163,7 +166,7 @@
                                   base::kApplicationStateStarted,
                                   kWatchdogMonitorFrequency));
   ASSERT_TRUE(watchdog_->Ping("test-name", "test-ping"));
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
+  SbThreadSleep(kWatchdogSleepDuration);
   ASSERT_TRUE(watchdog_->Unregister("test-name"));
   TearDown();
   watchdog_ = new watchdog::Watchdog();
@@ -233,8 +236,8 @@
   ASSERT_TRUE(watchdog_->Register("test-name", "test-desc",
                                   base::kApplicationStateStarted,
                                   kWatchdogMonitorFrequency));
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
-  std::string json = watchdog_->GetWatchdogViolations(false);
+  SbThreadSleep(kWatchdogSleepDuration);
+  std::string json = watchdog_->GetWatchdogViolations({}, false);
   ASSERT_NE(json, "");
   std::unique_ptr<base::Value> uncleared_violations_map =
       base::JSONReader::Read(json);
@@ -250,8 +253,8 @@
       std::stoll(violations->GetList()[0]
                      .FindKey("violationDurationMilliseconds")
                      ->GetString());
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
-  json = watchdog_->GetWatchdogViolations(false);
+  SbThreadSleep(kWatchdogSleepDuration);
+  json = watchdog_->GetWatchdogViolations({}, false);
   ASSERT_NE(json, "");
   std::unique_ptr<base::Value> violations_map = base::JSONReader::Read(json);
   ASSERT_NE(violations_map, nullptr);
@@ -273,7 +276,7 @@
   ASSERT_TRUE(watchdog_->Register("test-name-1", "test-desc-1",
                                   base::kApplicationStateStarted,
                                   kWatchdogMonitorFrequency));
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
+  SbThreadSleep(kWatchdogSleepDuration);
   ASSERT_TRUE(watchdog_->Unregister("test-name-1"));
   std::string json = watchdog_->GetWatchdogViolations();
   ASSERT_NE(json.find("test-name-1"), std::string::npos);
@@ -281,7 +284,7 @@
   ASSERT_TRUE(watchdog_->Register("test-name-2", "test-desc-2",
                                   base::kApplicationStateStarted,
                                   kWatchdogMonitorFrequency));
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
+  SbThreadSleep(kWatchdogSleepDuration);
   ASSERT_TRUE(watchdog_->Unregister("test-name-2"));
   json = watchdog_->GetWatchdogViolations();
   ASSERT_EQ(json.find("test-name-1"), std::string::npos);
@@ -296,7 +299,7 @@
   for (int i = 0; i < 21; i++) {
     ASSERT_TRUE(watchdog_->Ping("test-name", std::to_string(i)));
   }
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
+  SbThreadSleep(kWatchdogSleepDuration);
   std::string json = watchdog_->GetWatchdogViolations();
   ASSERT_NE(json, "");
   std::unique_ptr<base::Value> violations_map = base::JSONReader::Read(json);
@@ -329,9 +332,9 @@
   ASSERT_TRUE(watchdog_->Register("test-name-4", "test-desc-4",
                                   base::kApplicationStateStarted,
                                   kWatchdogMonitorFrequency));
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
+  SbThreadSleep(kWatchdogSleepDuration);
 
-  json = watchdog_->GetWatchdogViolations(false);
+  json = watchdog_->GetWatchdogViolations({}, false);
   ASSERT_NE(json, "");
   std::unique_ptr<base::Value> uncleared_violations_map =
       base::JSONReader::Read(json);
@@ -355,7 +358,7 @@
   ASSERT_EQ(violations->GetList().size(), 1);
 
   ASSERT_TRUE(watchdog_->Ping("test-name-3"));
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
+  SbThreadSleep(kWatchdogSleepDuration);
 
   json = watchdog_->GetWatchdogViolations();
   ASSERT_NE(json, "");
@@ -387,7 +390,7 @@
                                   base::kApplicationStateStarted,
                                   kWatchdogMonitorFrequency));
   watchdog_->UpdateState(base::kApplicationStateBlurred);
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
+  SbThreadSleep(kWatchdogSleepDuration);
   ASSERT_EQ(watchdog_->GetWatchdogViolations(), "");
   ASSERT_TRUE(watchdog_->Unregister("test-name"));
 }
@@ -395,8 +398,9 @@
 TEST_F(WatchdogTest, TimeWaitShouldPreventViolations) {
   ASSERT_TRUE(watchdog_->Register(
       "test-name", "test-desc", base::kApplicationStateStarted,
-      kWatchdogMonitorFrequency, kWatchdogMonitorFrequency * 3));
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
+      kWatchdogMonitorFrequency,
+      kWatchdogSleepDuration + kWatchdogMonitorFrequency));
+  SbThreadSleep(kWatchdogSleepDuration);
   ASSERT_EQ(watchdog_->GetWatchdogViolations(), "");
   ASSERT_TRUE(watchdog_->Unregister("test-name"));
 }
@@ -436,7 +440,7 @@
                                   base::kApplicationStateStarted,
                                   kWatchdogMonitorFrequency));
   ASSERT_TRUE(watchdog_->Unregister("test-name"));
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
+  SbThreadSleep(kWatchdogSleepDuration);
   ASSERT_EQ(watchdog_->GetWatchdogViolations(), "");
 }
 
@@ -447,7 +451,7 @@
   ASSERT_TRUE(watchdog_->Register("test-name", "test-desc",
                                   base::kApplicationStateStarted,
                                   kWatchdogMonitorFrequency));
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
+  SbThreadSleep(kWatchdogSleepDuration);
   ASSERT_EQ(watchdog_->GetWatchdogViolations(), "");
   ASSERT_TRUE(watchdog_->Unregister("test-name"));
 }
@@ -456,7 +460,7 @@
   ASSERT_TRUE(watchdog_->Register("test-name", "test-desc",
                                   base::kApplicationStateStarted,
                                   kWatchdogMonitorFrequency));
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
+  SbThreadSleep(kWatchdogSleepDuration);
   std::string write_json = "";
   starboard::ScopedFile read_file(watchdog_->GetWatchdogFilePath().c_str(),
                                   kSbFileOpenOnly | kSbFileRead);
@@ -468,7 +472,7 @@
   }
   ASSERT_NE(write_json, "");
   ASSERT_TRUE(watchdog_->Ping("test-name"));
-  SbThreadSleep(kWatchdogMonitorFrequency * 2);
+  SbThreadSleep(kWatchdogSleepDuration);
   ASSERT_TRUE(watchdog_->Unregister("test-name"));
   std::string no_write_json = "";
   starboard::ScopedFile read_file_again(
@@ -485,5 +489,89 @@
   ASSERT_NE(write_json, json);
 }
 
+TEST_F(WatchdogTest, GetRegisteredClientNames) {
+  ASSERT_TRUE(watchdog_->Register("test-name-1", "test-desc-1",
+                                  base::kApplicationStateStarted,
+                                  kWatchdogMonitorFrequency));
+  ASSERT_TRUE(watchdog_->Register("test-name-2", "test-desc-2",
+                                  base::kApplicationStateStarted,
+                                  kWatchdogMonitorFrequency));
+  std::vector<std::string> names = watchdog_->GetWatchdogClientNames();
+  std::set<std::string> expected_names = {"test-name-1", "test-name-2"};
+  for (std::vector<std::string>::const_iterator it = names.begin();
+       it != names.end(); ++it) {
+    const std::string name = *it;
+    ASSERT_TRUE((expected_names.find(name) != expected_names.end()));
+  }
+  ASSERT_TRUE(watchdog_->Unregister("test-name-1"));
+  ASSERT_TRUE(watchdog_->Unregister("test-name-2"));
+  names = watchdog_->GetWatchdogClientNames();
+  ASSERT_EQ(names.size(), 0);
+}
+
+TEST_F(WatchdogTest, GetPartialViolationsByClients) {
+  ASSERT_TRUE(watchdog_->Register("test-name-1", "test-desc-1",
+                                  base::kApplicationStateStarted,
+                                  kWatchdogMonitorFrequency));
+  ASSERT_TRUE(watchdog_->Register("test-name-2", "test-desc-2",
+                                  base::kApplicationStateStarted,
+                                  kWatchdogMonitorFrequency));
+  ASSERT_TRUE(watchdog_->Register("test-name-3", "test-desc-3",
+                                  base::kApplicationStateStarted,
+                                  kWatchdogMonitorFrequency));
+  SbThreadSleep(kWatchdogSleepDuration);
+  ASSERT_TRUE(watchdog_->Unregister("test-name-1"));
+  ASSERT_TRUE(watchdog_->Unregister("test-name-2"));
+  ASSERT_TRUE(watchdog_->Unregister("test-name-3"));
+  const std::vector<std::string> clients = {"test-name-1"};
+  std::string json = watchdog_->GetWatchdogViolations(clients);
+  ASSERT_NE(json, "");
+  std::unique_ptr<base::Value> violations_map = base::JSONReader::Read(json);
+  ASSERT_NE(violations_map, nullptr);
+  base::Value* violation_dict = violations_map->FindKey("test-name-1");
+  ASSERT_NE(violation_dict, nullptr);
+  violation_dict = violations_map->FindKey("test-name-2");
+  ASSERT_EQ(violation_dict, nullptr);
+  violation_dict = violations_map->FindKey("test-name-3");
+  ASSERT_EQ(violation_dict, nullptr);
+
+  std::string file_json = "";
+  starboard::ScopedFile read_file(watchdog_->GetWatchdogFilePath().c_str(),
+                                  kSbFileOpenOnly | kSbFileRead);
+  if (read_file.IsValid()) {
+    int64_t kFileSize = read_file.GetSize();
+    std::vector<char> buffer(kFileSize + 1, 0);
+    read_file.ReadAll(buffer.data(), kFileSize);
+    file_json = std::string(buffer.data());
+  }
+  ASSERT_NE(file_json, "");
+  violations_map = base::JSONReader::Read(file_json);
+  ASSERT_NE(violations_map, nullptr);
+  violation_dict = violations_map->FindKey("test-name-2");
+  ASSERT_NE(violation_dict, nullptr);
+  violation_dict = violations_map->FindKey("test-name-3");
+  ASSERT_NE(violation_dict, nullptr);
+  violation_dict = violations_map->FindKey("test-name-1");
+  ASSERT_EQ(violation_dict, nullptr);
+
+  json = watchdog_->GetWatchdogViolations(clients);
+  ASSERT_EQ(json, "");
+
+  const std::vector<std::string> clients2 = {"test-name-2", "test-name-3"};
+  json = watchdog_->GetWatchdogViolations(clients2);
+  ASSERT_NE(json, "");
+  violations_map = base::JSONReader::Read(json);
+  ASSERT_NE(violations_map, nullptr);
+  violation_dict = violations_map->FindKey("test-name-1");
+  ASSERT_EQ(violation_dict, nullptr);
+  violation_dict = violations_map->FindKey("test-name-2");
+  ASSERT_NE(violation_dict, nullptr);
+  violation_dict = violations_map->FindKey("test-name-3");
+  ASSERT_NE(violation_dict, nullptr);
+  starboard::ScopedFile read_file_again(
+      watchdog_->GetWatchdogFilePath().c_str(), kSbFileOpenOnly | kSbFileRead);
+  ASSERT_EQ(read_file_again.IsValid(), false);
+}
+
 }  // namespace watchdog
 }  // namespace cobalt
diff --git a/cobalt/web/BUILD.gn b/cobalt/web/BUILD.gn
index fe6c751..042f255 100644
--- a/cobalt/web/BUILD.gn
+++ b/cobalt/web/BUILD.gn
@@ -37,7 +37,6 @@
     "//cobalt/script",
     "//cobalt/script:engine",
     "//cobalt/script/v8c:engine",
-    "//nb",
     "//url",
   ]
 
@@ -114,6 +113,7 @@
     "//cobalt/script",
     "//cobalt/script:engine",
     "//cobalt/script/v8c:engine",
+    "//cobalt/watchdog",
     "//cobalt/xhr:xhr_settings",
     "//net",
     "//url",
@@ -145,7 +145,6 @@
     ":web_events",
     "//cobalt/base",
     "//cobalt/script",
-    "//nb",
   ]
 }
 
@@ -208,7 +207,6 @@
     "//cobalt/script/v8c:engine",
     "//cobalt/test:run_all_unittests",
     "//cobalt/web/testing:web_testing",
-    "//nb",
     "//net:test_support",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/cobalt/web/agent.cc b/cobalt/web/agent.cc
index 4efb0a4..a2f8901 100644
--- a/cobalt/web/agent.cc
+++ b/cobalt/web/agent.cc
@@ -32,6 +32,7 @@
 #include "cobalt/script/javascript_engine.h"
 #include "cobalt/script/script_runner.h"
 #include "cobalt/script/wrappable.h"
+#include "cobalt/watchdog/watchdog.h"
 #include "cobalt/web/blob.h"
 #include "cobalt/web/context.h"
 #include "cobalt/web/environment_settings.h"
@@ -50,6 +51,16 @@
 // must be called on the message loop of the Agent thread, so they
 // execute synchronously with respect to one another.
 namespace {
+
+// The watchdog time interval in microseconds allowed between pings before
+// triggering violations.
+const int64_t kWatchdogTimeInterval = 15000000;
+// The watchdog time wait in microseconds to initially wait before triggering
+// violations.
+const int64_t kWatchdogTimeWait = 15000000;
+// The watchdog time interval in milliseconds between pings.
+const int64_t kWatchdogTimePing = 5000;
+
 class Impl : public Context {
  public:
   Impl(const std::string& name, const Agent::Options& options);
@@ -535,6 +546,12 @@
     context()->service_worker_context()->UnregisterWebContext(context());
   }
 
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+  if (watchdog) {
+    watchdog_registered_ = false;
+    watchdog->Unregister(watchdog_name_);
+  }
+
   // Ensure that the destruction observer got added before stopping the thread.
   destruction_observer_added_.Wait();
   // Wait for all previously posted tasks to finish.
@@ -560,6 +577,21 @@
   if (!thread_.StartWithOptions(thread_options)) return;
   DCHECK(message_loop());
 
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+
+  // Registers service worker thread as a watchdog client.
+  if (watchdog) {
+    watchdog_name_ =
+        thread_.thread_name() + std::to_string(thread_.GetThreadId());
+    watchdog_registered_ = true;
+    watchdog->Register(watchdog_name_, watchdog_name_,
+                       base::kApplicationStateStarted, kWatchdogTimeInterval,
+                       kWatchdogTimeWait, watchdog::PING);
+    message_loop()->task_runner()->PostDelayedTask(
+        FROM_HERE, base::Bind(&Agent::PingWatchdog, base::Unretained(this)),
+        base::TimeDelta::FromMilliseconds(kWatchdogTimePing));
+  }
+
   message_loop()->task_runner()->PostTask(
       FROM_HERE,
       base::Bind(&Agent::InitializeTaskInThread, base::Unretained(this),
@@ -628,5 +660,19 @@
   callback.Run(heap_statistics);
 }
 
+// Ping watchdog every 5 second, otherwise a violation will be triggered.
+void Agent::PingWatchdog() {
+  DCHECK_EQ(base::MessageLoop::current(), message_loop());
+
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+  // If watchdog is already unregistered or shut down, stop ping watchdog.
+  if (!watchdog_registered_ || !watchdog) return;
+
+  watchdog->Ping(watchdog_name_);
+  message_loop()->task_runner()->PostDelayedTask(
+      FROM_HERE, base::Bind(&Agent::PingWatchdog, base::Unretained(this)),
+      base::TimeDelta::FromMilliseconds(kWatchdogTimePing));
+}
+
 }  // namespace web
 }  // namespace cobalt
diff --git a/cobalt/web/agent.h b/cobalt/web/agent.h
index 091cee0..6755f51 100644
--- a/cobalt/web/agent.h
+++ b/cobalt/web/agent.h
@@ -27,6 +27,7 @@
 #include "cobalt/network/network_module.h"
 #include "cobalt/script/javascript_engine.h"
 #include "cobalt/script/wrappable.h"
+#include "cobalt/watchdog/watchdog.h"
 #include "cobalt/web/context.h"
 #include "cobalt/web/environment_settings.h"
 #include "cobalt/web/user_agent_platform_info.h"
@@ -119,11 +120,17 @@
   void InitializeTaskInThread(const Options& options,
                               InitializeCallback initialize_callback);
 
+  void PingWatchdog();
+
   // The thread created and owned by this Web Agent.
   // All sub-objects of this object are created on this thread, and all public
   // member functions are re-posted to this thread if necessary.
   base::Thread thread_;
 
+  bool watchdog_registered_ = false;
+
+  std::string watchdog_name_;
+
   // Interface to the web Context
   std::unique_ptr<Context> context_;
 
diff --git a/cobalt/web/crypto_test.cc b/cobalt/web/crypto_test.cc
index d65efca..990f8e9 100644
--- a/cobalt/web/crypto_test.cc
+++ b/cobalt/web/crypto_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/web/crypto.h"
 
+#include <memory>
+
 #include "base/test/scoped_task_environment.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/dom/dom_settings.h"
diff --git a/cobalt/web/csp_violation_reporter.cc b/cobalt/web/csp_violation_reporter.cc
index 63d2cbd..c59c2b2 100644
--- a/cobalt/web/csp_violation_reporter.cc
+++ b/cobalt/web/csp_violation_reporter.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/web/csp_violation_reporter.h"
+
 #include <memory>
 #include <utility>
 
-#include "cobalt/web/csp_violation_reporter.h"
-
 #include "base/hash.h"
 #include "base/json/json_writer.h"
 #include "base/values.h"
diff --git a/cobalt/web/event_target.cc b/cobalt/web/event_target.cc
index f270d18..2622b4b 100644
--- a/cobalt/web/event_target.cc
+++ b/cobalt/web/event_target.cc
@@ -27,7 +27,6 @@
 #include "cobalt/script/environment_settings.h"
 #include "cobalt/web/dom_exception.h"
 #include "cobalt/web/global_stats.h"
-#include "nb/memory_scope.h"
 
 namespace cobalt {
 namespace web {
@@ -285,7 +284,6 @@
 
 void EventTarget::AddEventListenerInternal(
     std::unique_ptr<EventTargetListenerInfo> listener_info) {
-  TRACK_MEMORY_SCOPE("DOM");
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   // Remove existing attribute listener of the same type.
@@ -320,7 +318,6 @@
 }
 
 bool EventTarget::HasEventListener(base::Token type) {
-  TRACK_MEMORY_SCOPE("DOM");
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   for (EventListenerInfos::iterator iter = event_listener_infos_.begin();
diff --git a/cobalt/web/testing/mock_event_listener.h b/cobalt/web/testing/mock_event_listener.h
index 7d0e5ee..446b5cf 100644
--- a/cobalt/web/testing/mock_event_listener.h
+++ b/cobalt/web/testing/mock_event_listener.h
@@ -18,13 +18,12 @@
 #include <memory>
 #include <string>
 
-#include "cobalt/web/event_listener.h"
-
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/script/script_value.h"
 #include "cobalt/script/wrappable.h"
+#include "cobalt/web/event_listener.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace cobalt {
diff --git a/cobalt/web/window_timers.cc b/cobalt/web/window_timers.cc
index 01a84bc..8bdcd0b 100644
--- a/cobalt/web/window_timers.cc
+++ b/cobalt/web/window_timers.cc
@@ -25,7 +25,6 @@
 #include "cobalt/base/application_state.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/web/global_stats.h"
-#include "nb/memory_scope.h"
 
 namespace cobalt {
 namespace web {
@@ -60,7 +59,6 @@
       << "WindowTimers::SetTimeout received negative timeout: " << timeout;
   timeout = std::max(timeout, 0);
 
-  TRACK_MEMORY_SCOPE("DOM");
   return TryAddNewTimer(Timer::kOneShot, handler, timeout);
 }
 
@@ -80,7 +78,6 @@
       << "WindowTimers::SetInterval received negative interval: " << timeout;
   timeout = std::max(timeout, 0);
 
-  TRACK_MEMORY_SCOPE("DOM");
   return TryAddNewTimer(Timer::kRepeating, handler, timeout);
 }
 
diff --git a/cobalt/web_animations/animation.cc b/cobalt/web_animations/animation.cc
index a4b251f..61eb558 100644
--- a/cobalt/web_animations/animation.cc
+++ b/cobalt/web_animations/animation.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/web_animations/animation.h"
 
+#include <memory>
+
 #include "base/logging.h"
 #include "cobalt/web_animations/animation_set.h"
 #include "cobalt/web_animations/keyframe_effect_read_only.h"
diff --git a/cobalt/web_animations/animation_effect_timing_read_only_test.cc b/cobalt/web_animations/animation_effect_timing_read_only_test.cc
index 2d77ffb..92dd2ae 100644
--- a/cobalt/web_animations/animation_effect_timing_read_only_test.cc
+++ b/cobalt/web_animations/animation_effect_timing_read_only_test.cc
@@ -12,9 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/web_animations/animation_effect_timing_read_only.h"
+
 #include <limits>
 
-#include "cobalt/web_animations/animation_effect_timing_read_only.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/web_animations/animation_set.h b/cobalt/web_animations/animation_set.h
index 1311425..fb5aab4 100644
--- a/cobalt/web_animations/animation_set.h
+++ b/cobalt/web_animations/animation_set.h
@@ -15,14 +15,13 @@
 #ifndef COBALT_WEB_ANIMATIONS_ANIMATION_SET_H_
 #define COBALT_WEB_ANIMATIONS_ANIMATION_SET_H_
 
-#include "cobalt/web_animations/animation_set.h"
-
 #include <set>
 
 #include "base/basictypes.h"
 #include "base/memory/ref_counted.h"
 #include "cobalt/cssom/property_definitions.h"
 #include "cobalt/web_animations/animation.h"
+#include "cobalt/web_animations/animation_set.h"
 
 namespace cobalt {
 namespace web_animations {
diff --git a/cobalt/web_animations/animation_test.cc b/cobalt/web_animations/animation_test.cc
index a23f816..749ad70 100644
--- a/cobalt/web_animations/animation_test.cc
+++ b/cobalt/web_animations/animation_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/web_animations/animation.h"
+
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
diff --git a/cobalt/web_animations/animation_timeline.cc b/cobalt/web_animations/animation_timeline.cc
index 9ccaf05..9195503 100644
--- a/cobalt/web_animations/animation_timeline.cc
+++ b/cobalt/web_animations/animation_timeline.cc
@@ -12,11 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/web_animations/animation_timeline.h"
+
 #include <memory>
 
 #include "cobalt/web_animations/animation.h"
 #include "cobalt/web_animations/animation_set.h"
-#include "cobalt/web_animations/animation_timeline.h"
 
 namespace cobalt {
 namespace web_animations {
diff --git a/cobalt/web_animations/baked_animation_set.h b/cobalt/web_animations/baked_animation_set.h
index ada5943..adb6d56 100644
--- a/cobalt/web_animations/baked_animation_set.h
+++ b/cobalt/web_animations/baked_animation_set.h
@@ -72,7 +72,7 @@
              cssom::MutableCSSComputedStyleData* in_out_style) const;
 
   // Returns the timeline time at which point all animations in the set are
-  // ended, or base::TimeDelta::Max() if at leats one animation will never end.
+  // ended, or base::TimeDelta::Max() if at least one animation will never end.
   base::TimeDelta end_time() const;
 
  private:
diff --git a/cobalt/web_animations/keyframe.h b/cobalt/web_animations/keyframe.h
index cd1baf5..714002c 100644
--- a/cobalt/web_animations/keyframe.h
+++ b/cobalt/web_animations/keyframe.h
@@ -17,6 +17,7 @@
 
 #include <map>
 #include <string>
+#include <utility>
 
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
@@ -97,9 +98,7 @@
     NOTIMPLEMENTED();
     return std::string("linear");
   }
-  void set_easing(const std::string& easing) {
-    NOTIMPLEMENTED();
-  }
+  void set_easing(const std::string& easing) { NOTIMPLEMENTED(); }
 
   // Custom, not in any spec.
   const Data& data() const { return data_; }
diff --git a/cobalt/web_animations/keyframe_effect_read_only.cc b/cobalt/web_animations/keyframe_effect_read_only.cc
index a2444ae..d6f9821 100644
--- a/cobalt/web_animations/keyframe_effect_read_only.cc
+++ b/cobalt/web_animations/keyframe_effect_read_only.cc
@@ -233,7 +233,7 @@
                            target_property),
         target_property);
   } else {
-    // Find the keyframe immediately preceeding the iteration_progress and set
+    // Find the keyframe immediately preceding the iteration_progress and set
     // that to the first endpoint, and set the next keyframe as the second
     // endpoint.
     KeyframeEffectReadOnly::Data::KeyframeSequence::const_iterator prev_iter =
diff --git a/cobalt/web_animations/keyframe_effect_read_only_test.cc b/cobalt/web_animations/keyframe_effect_read_only_test.cc
index b04e044..6f10962 100644
--- a/cobalt/web_animations/keyframe_effect_read_only_test.cc
+++ b/cobalt/web_animations/keyframe_effect_read_only_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/web_animations/keyframe_effect_read_only.h"
+
 #include "cobalt/cssom/length_value.h"
 #include "cobalt/cssom/number_value.h"
 #include "cobalt/cssom/property_definitions.h"
diff --git a/cobalt/web_animations/timed_task_queue.cc b/cobalt/web_animations/timed_task_queue.cc
index c832d04..9661fb3 100644
--- a/cobalt/web_animations/timed_task_queue.cc
+++ b/cobalt/web_animations/timed_task_queue.cc
@@ -12,10 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/web_animations/timed_task_queue.h"
+
 #include <memory>
+#include <utility>
 
 #include "base/memory/ptr_util.h"
-#include "cobalt/web_animations/timed_task_queue.h"
 
 namespace cobalt {
 namespace web_animations {
diff --git a/cobalt/webdriver/dispatcher.cc b/cobalt/webdriver/dispatcher.cc
index f10bdc7..c04f40d 100644
--- a/cobalt/webdriver/dispatcher.cc
+++ b/cobalt/webdriver/dispatcher.cc
@@ -180,7 +180,8 @@
   typedef std::vector<std::string>::const_reverse_iterator MismatchResult;
   typedef std::pair<MismatchResult, MismatchResult> MismatchResultPair;
   typedef std::pair<CommandMappingLookup::iterator,
-                    CommandMappingLookup::iterator> EqualRangeResultPair;
+                    CommandMappingLookup::iterator>
+      EqualRangeResultPair;
 
   PathComponentsAreEqualPredicate predicate(strategy == kMatchExact);
 
diff --git a/cobalt/webdriver/get_element_text_test.cc b/cobalt/webdriver/get_element_text_test.cc
index 357ca38..f0ee01a 100644
--- a/cobalt/webdriver/get_element_text_test.cc
+++ b/cobalt/webdriver/get_element_text_test.cc
@@ -47,12 +47,11 @@
   GetElementTextTest()
       : css_parser_(css_parser::Parser::Create()),
         dom_stat_tracker_(new dom::DomStatTracker("GetElementTextTest")),
-        html_element_context_(
-            &environment_settings_, NULL, NULL, css_parser_.get(), NULL, NULL,
-            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-            dom_stat_tracker_.get(), "", base::kApplicationStateStarted, NULL,
-            NULL) {
-  }
+        html_element_context_(&environment_settings_, NULL, NULL,
+                              css_parser_.get(), NULL, NULL, NULL, NULL, NULL,
+                              NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                              dom_stat_tracker_.get(), "",
+                              base::kApplicationStateStarted, NULL, NULL) {}
 
   void SetUp() override {
     dom::Document::Options options;
@@ -99,8 +98,8 @@
 }
 
 TEST_F(GetElementTextTest, NewLinesAreConvertedToSpaces) {
-  AppendText("a\r\nb\rc\nd");
-  EXPECT_STREQ("a b c d", algorithms::GetElementText(div_.get()).c_str());
+  AppendText("a\r\nb\rc\ne");
+  EXPECT_STREQ("a b c e", algorithms::GetElementText(div_.get()).c_str());
 }
 
 TEST_F(GetElementTextTest, NoWrapStyle) {
diff --git a/cobalt/webdriver/keyboard_test.cc b/cobalt/webdriver/keyboard_test.cc
index c431932..2940638 100644
--- a/cobalt/webdriver/keyboard_test.cc
+++ b/cobalt/webdriver/keyboard_test.cc
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/webdriver/keyboard.h"
+
 #include <algorithm>
 #include <vector>
 
@@ -19,7 +21,6 @@
 #include "cobalt/dom/keyboard_event.h"
 #include "cobalt/dom/keyboard_event_init.h"
 #include "cobalt/dom/keycode.h"
-#include "cobalt/webdriver/keyboard.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/cobalt/webdriver/protocol/button.cc b/cobalt/webdriver/protocol/button.cc
index e0947ce..e0fe3db 100644
--- a/cobalt/webdriver/protocol/button.cc
+++ b/cobalt/webdriver/protocol/button.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/webdriver/protocol/button.h"
 
+#include <memory>
+
 namespace cobalt {
 namespace webdriver {
 namespace protocol {
diff --git a/cobalt/webdriver/protocol/capabilities.cc b/cobalt/webdriver/protocol/capabilities.cc
index 5f44f7c..76e67d5 100644
--- a/cobalt/webdriver/protocol/capabilities.cc
+++ b/cobalt/webdriver/protocol/capabilities.cc
@@ -13,10 +13,9 @@
 
 #include <memory>
 // limitations under the License.
-#include "cobalt/webdriver/protocol/capabilities.h"
-
 #include "base/values.h"
 #include "cobalt/version.h"
+#include "cobalt/webdriver/protocol/capabilities.h"
 
 namespace cobalt {
 namespace webdriver {
diff --git a/cobalt/webdriver/protocol/cookie.cc b/cobalt/webdriver/protocol/cookie.cc
index 59ea062..1a4d175 100644
--- a/cobalt/webdriver/protocol/cookie.cc
+++ b/cobalt/webdriver/protocol/cookie.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/webdriver/protocol/cookie.h"
 
+#include <memory>
+
 #include "base/strings/string_split.h"
 #include "base/strings/stringprintf.h"
 
diff --git a/cobalt/webdriver/protocol/element_id.cc b/cobalt/webdriver/protocol/element_id.cc
index bd0d037..b061e00 100644
--- a/cobalt/webdriver/protocol/element_id.cc
+++ b/cobalt/webdriver/protocol/element_id.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/webdriver/protocol/element_id.h"
 
+#include <memory>
+
 namespace cobalt {
 namespace webdriver {
 namespace protocol {
diff --git a/cobalt/webdriver/protocol/response.cc b/cobalt/webdriver/protocol/response.cc
index 8905309..f004e3a 100644
--- a/cobalt/webdriver/protocol/response.cc
+++ b/cobalt/webdriver/protocol/response.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/webdriver/protocol/response.h"
 
+#include <memory>
+#include <utility>
+
 namespace cobalt {
 namespace webdriver {
 namespace protocol {
diff --git a/cobalt/webdriver/protocol/script.cc b/cobalt/webdriver/protocol/script.cc
index 37a98e7..db6ddc8 100644
--- a/cobalt/webdriver/protocol/script.cc
+++ b/cobalt/webdriver/protocol/script.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/webdriver/protocol/script.h"
 
+#include <memory>
+
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/memory/ptr_util.h"
@@ -26,7 +26,7 @@
 namespace {
 const char kScriptKey[] = "script";
 const char kArgsKey[] = "args";
-}
+}  // namespace
 
 base::Optional<Script> Script::FromValue(const base::Value* value) {
   const base::DictionaryValue* dictionary_value;
diff --git a/cobalt/webdriver/protocol/size.cc b/cobalt/webdriver/protocol/size.cc
index 6d6f205..3f64bad 100644
--- a/cobalt/webdriver/protocol/size.cc
+++ b/cobalt/webdriver/protocol/size.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/webdriver/protocol/size.h"
 
+#include <memory>
+
 namespace cobalt {
 namespace webdriver {
 namespace protocol {
diff --git a/cobalt/webdriver/screencast/screencast_module.cc b/cobalt/webdriver/screencast/screencast_module.cc
index 1cf739b..62062e7 100644
--- a/cobalt/webdriver/screencast/screencast_module.cc
+++ b/cobalt/webdriver/screencast/screencast_module.cc
@@ -12,8 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/webdriver/screencast/screencast_module.h"
+
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/base64.h"
 #include "base/bind.h"
@@ -23,8 +26,6 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/trace_event/trace_event.h"
 
-#include "cobalt/webdriver/screencast/screencast_module.h"
-
 namespace cobalt {
 namespace webdriver {
 namespace screencast {
@@ -33,7 +34,7 @@
 const char kJpegContentType[] = "image/jpeg";
 // Add screencast frame rate as 30 fps.
 const int kScreencastFramesPerSecond = 30;
-}
+}  // namespace
 
 ScreencastModule::ScreencastModule(
     int server_port, const std::string& listen_ip,
@@ -88,10 +89,10 @@
 
   const base::Closure screenshot_event =
       base::Bind(&ScreencastModule::TakeScreenshot, base::Unretained(this));
-  screenshot_timer_->Start(FROM_HERE,
-                           base::TimeDelta::FromMilliseconds(
-                               1000.0f / kScreencastFramesPerSecond),
-                           screenshot_event);
+  screenshot_timer_->Start(
+      FROM_HERE,
+      base::TimeDelta::FromMilliseconds(1000.0f / kScreencastFramesPerSecond),
+      screenshot_event);
 }
 
 void ScreencastModule::StopTimer() {
diff --git a/cobalt/webdriver/screenshot.cc b/cobalt/webdriver/screenshot.cc
index 184e9c0..a067783 100644
--- a/cobalt/webdriver/screenshot.cc
+++ b/cobalt/webdriver/screenshot.cc
@@ -14,6 +14,7 @@
 // limitations under the License.
 
 #include "cobalt/webdriver/screenshot.h"
+
 #include "base/base64.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/trace_event/trace_event.h"
diff --git a/cobalt/webdriver/screenshot.h b/cobalt/webdriver/screenshot.h
index 4d3e56c..6b81620 100644
--- a/cobalt/webdriver/screenshot.h
+++ b/cobalt/webdriver/screenshot.h
@@ -16,6 +16,7 @@
 #define COBALT_WEBDRIVER_SCREENSHOT_H_
 
 #include <string>
+
 #include "base/optional.h"
 #include "cobalt/loader/image/image_encoder.h"
 #include "cobalt/math/rect.h"
diff --git a/cobalt/webdriver/script_executor.h b/cobalt/webdriver/script_executor.h
index b5596fe..5159833 100644
--- a/cobalt/webdriver/script_executor.h
+++ b/cobalt/webdriver/script_executor.h
@@ -36,9 +36,8 @@
 namespace webdriver {
 
 // ScriptExecutor
-class ScriptExecutor :
-    public base::SupportsWeakPtr<ScriptExecutor>,
-    public script::Wrappable {
+class ScriptExecutor : public base::SupportsWeakPtr<ScriptExecutor>,
+                       public script::Wrappable {
  public:
   typedef script::CallbackFunction<void(
       const scoped_refptr<ScriptExecutorParams>&,
diff --git a/cobalt/webdriver/stub_web_driver_module.cc b/cobalt/webdriver/stub_web_driver_module.cc
index 787fa1d..aadf0d6 100644
--- a/cobalt/webdriver/stub_web_driver_module.cc
+++ b/cobalt/webdriver/stub_web_driver_module.cc
@@ -22,4 +22,4 @@
 namespace webdriver {
 class WebDriverModule {};
 }  // namespace webdriver
-}  // namespace cobalt
\ No newline at end of file
+}  // namespace cobalt
diff --git a/cobalt/webdriver/util/dispatch_command_factory.h b/cobalt/webdriver/util/dispatch_command_factory.h
index 35afd3e..c5cfe60 100644
--- a/cobalt/webdriver/util/dispatch_command_factory.h
+++ b/cobalt/webdriver/util/dispatch_command_factory.h
@@ -18,6 +18,7 @@
 #include <algorithm>
 #include <memory>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/bind.h"
@@ -28,7 +29,7 @@
 namespace webdriver {
 namespace util {
 namespace internal {
-namespace {
+namespace {  // NOLINT(build/namespaces_headers)
 template <typename T>
 struct ForwardType {
   typedef const T& value;
diff --git a/cobalt/websocket/close_event.idl b/cobalt/websocket/close_event.idl
index 26d5388..1422690 100644
--- a/cobalt/websocket/close_event.idl
+++ b/cobalt/websocket/close_event.idl
@@ -27,4 +27,3 @@
                       unsigned short code,
                       DOMString reason);
 };
-
diff --git a/cobalt/websocket/cobalt_web_socket_event_handler.cc b/cobalt/websocket/cobalt_web_socket_event_handler.cc
index c0c2d86..25dfd1f 100644
--- a/cobalt/websocket/cobalt_web_socket_event_handler.cc
+++ b/cobalt/websocket/cobalt_web_socket_event_handler.cc
@@ -14,6 +14,7 @@
 
 #include "cobalt/websocket/cobalt_web_socket_event_handler.h"
 
+#include <memory>
 #include <utility>
 #include <vector>
 
@@ -115,7 +116,7 @@
     const GURL& url, const net::SSLInfo& ssl_info, bool fatal) {
   // TODO: determine if there are circumstances we want to continue
   // the request.
-  DLOG(WARNING) << "SSL cert failure occured, cancelling connection";
+  DLOG(WARNING) << "SSL cert failure occurred, cancelling connection";
   ssl_error_callbacks->CancelSSLRequest(net::ERR_BAD_SSL_CLIENT_AUTH_CERT,
                                         nullptr);
 }
diff --git a/cobalt/websocket/cobalt_web_socket_event_handler.h b/cobalt/websocket/cobalt_web_socket_event_handler.h
index 176b4c7..764abce 100644
--- a/cobalt/websocket/cobalt_web_socket_event_handler.h
+++ b/cobalt/websocket/cobalt_web_socket_event_handler.h
@@ -15,6 +15,7 @@
 #ifndef COBALT_WEBSOCKET_COBALT_WEB_SOCKET_EVENT_HANDLER_H_
 #define COBALT_WEBSOCKET_COBALT_WEB_SOCKET_EVENT_HANDLER_H_
 
+#include <memory>
 #include <string>
 #include <utility>
 #include <vector>
diff --git a/cobalt/websocket/mock_websocket_channel.cc b/cobalt/websocket/mock_websocket_channel.cc
index 8fc17cf..034293d 100644
--- a/cobalt/websocket/mock_websocket_channel.cc
+++ b/cobalt/websocket/mock_websocket_channel.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "cobalt/websocket/mock_websocket_channel.h"
+
 #include "cobalt/websocket/cobalt_web_socket_event_handler.h"
 
 // Generated constructors and destructors for GMock objects are very large. By
@@ -20,4 +21,4 @@
 MockWebSocketChannel::~MockWebSocketChannel() = default;
 
 }  // namespace websocket
-}  // namespace cobalt
\ No newline at end of file
+}  // namespace cobalt
diff --git a/cobalt/websocket/mock_websocket_channel.h b/cobalt/websocket/mock_websocket_channel.h
index 85bb534..0443a06 100644
--- a/cobalt/websocket/mock_websocket_channel.h
+++ b/cobalt/websocket/mock_websocket_channel.h
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBSOCKETS_MOCK_WEBSOCKET_CHANNEL_H_
-#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBSOCKETS_MOCK_WEBSOCKET_CHANNEL_H_
+#ifndef COBALT_WEBSOCKET_MOCK_WEBSOCKET_CHANNEL_H_
+#define COBALT_WEBSOCKET_MOCK_WEBSOCKET_CHANNEL_H_
 
 #include <memory>
+#include <utility>
 
 #include "base/memory/scoped_refptr.h"
 #include "base/synchronization/lock.h"
@@ -55,4 +56,4 @@
 }  // namespace websocket
 }  // namespace cobalt
 
-#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBSOCKETS_MOCK_WEBSOCKET_CHANNEL_H_
\ No newline at end of file
+#endif  // COBALT_WEBSOCKET_MOCK_WEBSOCKET_CHANNEL_H_
diff --git a/cobalt/websocket/web_socket_event_interface.cc b/cobalt/websocket/web_socket_event_interface.cc
index 8230aaa..a0d0318 100644
--- a/cobalt/websocket/web_socket_event_interface.cc
+++ b/cobalt/websocket/web_socket_event_interface.cc
@@ -14,6 +14,8 @@
 
 #include "cobalt/websocket/web_socket_event_interface.h"
 
+#include <memory>
+
 #include "base/logging.h"
 #include "cobalt/websocket/web_socket_impl.h"
 
@@ -107,7 +109,7 @@
     const GURL& url, const SSLInfo& ssl_info, bool fatal) {
   // TODO: determine if there are circumstances we want to continue
   // the request.
-  DLOG(WARNING) << "SSL cert failure occured, cancelling connection";
+  DLOG(WARNING) << "SSL cert failure occurred, cancelling connection";
   ssl_error_callbacks->CancelSSLRequest(-1, ssl_info);
 }
 int CobaltWebSocketEventHandler::OnAuthRequired(
diff --git a/cobalt/websocket/web_socket_event_interface.h b/cobalt/websocket/web_socket_event_interface.h
index 9a0f011..7a629de 100644
--- a/cobalt/websocket/web_socket_event_interface.h
+++ b/cobalt/websocket/web_socket_event_interface.h
@@ -15,6 +15,7 @@
 #ifndef COBALT_WEBSOCKET_WEB_SOCKET_EVENT_INTERFACE_H_
 #define COBALT_WEBSOCKET_WEB_SOCKET_EVENT_INTERFACE_H_
 
+#include <memory>
 #include <string>
 #include <utility>
 #include <vector>
@@ -68,7 +69,7 @@
   void OnClosingHandshake() override;
 
   // Called when the channel has been dropped, either due to a network close, a
-  // network error, or a protocol error. This may or may not be preceeded by a
+  // network error, or a protocol error. This may or may not be preceded by a
   // call to OnClosingHandshake().
   //
   // Warning: Both the |code| and |reason| are passed through to Javascript, so
diff --git a/cobalt/websocket/web_socket_frame_container.h b/cobalt/websocket/web_socket_frame_container.h
index 9c40841..88ef8bc 100644
--- a/cobalt/websocket/web_socket_frame_container.h
+++ b/cobalt/websocket/web_socket_frame_container.h
@@ -17,6 +17,7 @@
 #include <algorithm>
 #include <deque>
 #include <memory>
+#include <utility>
 
 #include "base/basictypes.h"
 #include "net/base/io_buffer.h"
diff --git a/cobalt/websocket/web_socket_frame_container_test.cc b/cobalt/websocket/web_socket_frame_container_test.cc
index 7a1aac4..92986a0 100644
--- a/cobalt/websocket/web_socket_frame_container_test.cc
+++ b/cobalt/websocket/web_socket_frame_container_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/websocket/web_socket_frame_container.h"
 
+#include <memory>
+
 #include "base/memory/ref_counted.h"
 #include "net/base/io_buffer.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/cobalt/websocket/web_socket_handshake_helper_test.cc b/cobalt/websocket/web_socket_handshake_helper_test.cc
index 5fd60f8..a2616f4 100644
--- a/cobalt/websocket/web_socket_handshake_helper_test.cc
+++ b/cobalt/websocket/web_socket_handshake_helper_test.cc
@@ -82,11 +82,10 @@
 
   handshake_helper_.GenerateSecWebSocketKey();
   std::string null_key(SecWebSocketKey::kKeySizeInBytes, '\0');
-  EXPECT_EQ(
-      memcmp(null_key.data(),
-             handshake_helper_.sec_websocket_key_.GetRawKeyBytes(),
-             SecWebSocketKey::kKeySizeInBytes),
-      0);
+  EXPECT_EQ(memcmp(null_key.data(),
+                   handshake_helper_.sec_websocket_key_.GetRawKeyBytes(),
+                   SecWebSocketKey::kKeySizeInBytes),
+            0);
 }
 
 TEST_F(WebSocketHandshakeHelperTest, HandshakeInfo) {
diff --git a/cobalt/websocket/web_socket_message_container_test.cc b/cobalt/websocket/web_socket_message_container_test.cc
index dcaada5..2a8f496 100644
--- a/cobalt/websocket/web_socket_message_container_test.cc
+++ b/cobalt/websocket/web_socket_message_container_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/websocket/web_socket_message_container.h"
 
+#include <memory>
+
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
diff --git a/cobalt/worker/BUILD.gn b/cobalt/worker/BUILD.gn
index 23aeaa1..bc04579 100644
--- a/cobalt/worker/BUILD.gn
+++ b/cobalt/worker/BUILD.gn
@@ -115,7 +115,6 @@
     "//cobalt/test:run_all_unittests",
     "//cobalt/web/testing:web_testing",
     "//cobalt/worker/testing:worker_testing",
-    "//nb",
     "//net:test_support",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/cobalt/worker/service_worker_context.cc b/cobalt/worker/service_worker_context.cc
index 3dc9a4e..5c39206 100644
--- a/cobalt/worker/service_worker_context.cc
+++ b/cobalt/worker/service_worker_context.cc
@@ -364,7 +364,8 @@
       done_event));
   base::TimeTicks start = base::TimeTicks::Now();
   auto registration =
-      scope_to_registration_map_->GetRegistration(storage_key, client_url);
+      scope_to_registration_map_->MatchServiceWorkerRegistration(storage_key,
+                                                                 client_url);
   if (!registration) {
     return;
   }
@@ -438,6 +439,7 @@
     // said that the service worker client is using the service worker’s
     // containing service worker registration.
     //   https://www.w3.org/TR/2022/CRD-service-workers-20220712/#dfn-control
+    if (context->GetWindowOrWorkerGlobalScope()->IsServiceWorker()) continue;
     if (context->is_controlled_by(registration->active_worker())) {
       any_client_is_using = true;
       break;
@@ -959,9 +961,6 @@
 
   // 4. If any other service worker client is using registration, abort these
   //    steps.
-  // Ensure the client is already removed from the registrations when this runs.
-  DCHECK(web_context_registrations_.end() ==
-         web_context_registrations_.find(client));
   if (IsAnyClientUsingRegistration(registration)) return;
 
   // 5. If registration is unregistered, invoke Try Clear Registration with
diff --git a/cobalt/worker/worker.cc b/cobalt/worker/worker.cc
index d01d252..dce06b4 100644
--- a/cobalt/worker/worker.cc
+++ b/cobalt/worker/worker.cc
@@ -174,9 +174,14 @@
   //     1. Set request's reserved client to inside settings.
   //     2. Fetch request, and asynchronously wait to run the remaining steps as
   //        part of fetch's process response for the response response.
+  DCHECK(web_context_);
+  DCHECK(web_context_->environment_settings());
   const GURL& url = web_context_->environment_settings()->creation_url();
+  DCHECK(!url.is_empty());
   loader::Origin origin = loader::Origin(url.GetOrigin());
 
+  DCHECK(options_.outside_context);
+  DCHECK(options_.outside_context->GetWindowOrWorkerGlobalScope());
   csp::SecurityCallback csp_callback = base::Bind(
       &web::CspDelegate::CanLoad,
       base::Unretained(options_.outside_context->GetWindowOrWorkerGlobalScope()
diff --git a/cobalt/worker/worker.h b/cobalt/worker/worker.h
index d37d462..364837a 100644
--- a/cobalt/worker/worker.h
+++ b/cobalt/worker/worker.h
@@ -63,13 +63,13 @@
     base::SourceLocation construction_location;
 
     // True if worker is a SharedWorker object, and false otherwise.
-    bool is_shared;
+    bool is_shared = false;
 
     // Parameters from 'Run a worker' step 9.1 in the spec.
     //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#dom-worker
     GURL url;
     web::Context* outside_context = nullptr;
-    web::EventTarget* outside_event_target;
+    web::EventTarget* outside_event_target = nullptr;
     web::MessagePort* outside_port = nullptr;
     WorkerOptions options;
   };
diff --git a/cobalt/xhr/BUILD.gn b/cobalt/xhr/BUILD.gn
index c2bd6fc..00ff51a 100644
--- a/cobalt/xhr/BUILD.gn
+++ b/cobalt/xhr/BUILD.gn
@@ -44,7 +44,6 @@
     "//cobalt/network",
     "//cobalt/script",
     "//cobalt/web",
-    "//nb",
     "//net",
     "//starboard",
     "//third_party/protobuf:protobuf_lite",
diff --git a/cobalt/xhr/xml_http_request.cc b/cobalt/xhr/xml_http_request.cc
index 12aee93..cd41040 100644
--- a/cobalt/xhr/xml_http_request.cc
+++ b/cobalt/xhr/xml_http_request.cc
@@ -44,7 +44,6 @@
 #include "cobalt/web/csp_delegate.h"
 #include "cobalt/web/environment_settings.h"
 #include "cobalt/xhr/global_stats.h"
-#include "nb/memory_scope.h"
 #include "net/http/http_util.h"
 
 namespace cobalt {
@@ -405,7 +404,6 @@
                               const base::Optional<std::string>& username,
                               const base::Optional<std::string>& password,
                               script::ExceptionState* exception_state) {
-  TRACK_MEMORY_SCOPE("XHR");
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   XMLHttpRequest::State previous_state = state_;
@@ -462,7 +460,6 @@
 void XMLHttpRequestImpl::SetRequestHeader(
     const std::string& header, const std::string& value,
     script::ExceptionState* exception_state) {
-  TRACK_MEMORY_SCOPE("XHR");
   // https://www.w3.org/TR/2014/WD-XMLHttpRequest-20140130/#dom-xmlhttprequest-setrequestheader
   if (state_ != XMLHttpRequest::kOpened || sent_) {
     web::DOMException::Raise(web::DOMException::kInvalidStateErr,
@@ -617,7 +614,6 @@
                        base::Unretained(this), request_body, exception_state));
     return;
   }
-  TRACK_MEMORY_SCOPE("XHR");
   // https://www.w3.org/TR/2014/WD-XMLHttpRequest-20140130/#the-send()-method
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   // Step 1
@@ -989,7 +985,6 @@
 void XMLHttpRequestImpl::OnURLFetchDownloadProgress(
     const net::URLFetcher* source, int64_t /*current*/, int64_t /*total*/,
     int64_t /*current_network_bytes*/, bool request_done) {
-  TRACK_MEMORY_SCOPE("XHR");
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK_NE(state_, XMLHttpRequest::kDone);
 
@@ -1095,7 +1090,6 @@
 void XMLHttpRequestImpl::OnURLFetchUploadProgress(const net::URLFetcher* source,
                                                   int64 current_val,
                                                   int64 total_val) {
-  TRACK_MEMORY_SCOPE("XHR");
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   if (upload_complete_) {
     return;
@@ -1321,7 +1315,6 @@
 
 script::Handle<script::ArrayBuffer>
 XMLHttpRequestImpl::response_array_buffer() {
-  TRACK_MEMORY_SCOPE("XHR");
   // https://www.w3.org/TR/XMLHttpRequest/#response-entity-body
   if (error_ || state_ != XMLHttpRequest::kDone) {
     // Return a handle holding a nullptr.
@@ -1372,8 +1365,6 @@
 }
 
 void XMLHttpRequestImpl::StartRequest(const std::string& request_body) {
-  TRACK_MEMORY_SCOPE("XHR");
-
   const auto& xhr_settings =
       environment_settings()->context()->web_settings()->xhr_settings();
   const bool fetch_buffer_pool_enabled =
diff --git a/cobalt/xhr/xml_http_request_test.cc b/cobalt/xhr/xml_http_request_test.cc
index 290566a..6a60255 100644
--- a/cobalt/xhr/xml_http_request_test.cc
+++ b/cobalt/xhr/xml_http_request_test.cc
@@ -29,10 +29,10 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
-using cobalt::web::EventListener;
-using cobalt::web::testing::MockEventListener;
 using cobalt::script::testing::FakeScriptValue;
 using cobalt::script::testing::MockExceptionState;
+using cobalt::web::EventListener;
+using cobalt::web::testing::MockEventListener;
 using ::testing::_;
 using ::testing::Eq;
 using ::testing::HasSubstr;
diff --git a/components/crx_file/crx_creator.cc b/components/crx_file/crx_creator.cc
index 8ec6bb3..1eb90d4 100644
--- a/components/crx_file/crx_creator.cc
+++ b/components/crx_file/crx_creator.cc
@@ -4,6 +4,9 @@
 
 #include "components/crx_file/crx_creator.h"
 
+#include <string>
+#include <vector>
+
 #include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/stl_util.h"
diff --git a/components/crx_file/crx_creator_unittest.cc b/components/crx_file/crx_creator_unittest.cc
index 086a5a5..e65679f 100644
--- a/components/crx_file/crx_creator_unittest.cc
+++ b/components/crx_file/crx_creator_unittest.cc
@@ -2,12 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/crx_file/crx_creator.h"
+#include <string>
+#include <vector>
+
 #include "base/base64.h"
 #include "base/base_paths.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/path_service.h"
+#include "components/crx_file/crx_creator.h"
 #include "components/crx_file/crx_verifier.h"
 #include "crypto/rsa_private_key.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/crx_file/crx_verifier.cc b/components/crx_file/crx_verifier.cc
index b8a875e..3ac941a 100644
--- a/components/crx_file/crx_verifier.cc
+++ b/components/crx_file/crx_verifier.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
+// Copyright 2017 The Cobalt Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -64,6 +64,23 @@
     hash->Update(buffer, read);
   return read;
 }
+#if defined(IN_MEMORY_UPDATES)
+int ReadAndHashBufferFromString(uint8_t* buffer,
+                                int length,
+                                std::string::const_iterator* it,
+                                crypto::SecureHash* hash) {
+  static_assert(sizeof(char) == sizeof(uint8_t), "Unsupported char size.");
+  memcpy(buffer, &(**it), length);
+  hash->Update(buffer, length);
+
+  // TODO(b/158043520): consider wrapping the CRX string in a type that keeps
+  // track of how much of the string has already been copied so that the string
+  // can be "read" like a file, without direct management of the iterator.
+  std::advance(*it, length);
+
+  return length;
+}
+#endif
 
 // Returns UINT32_MAX in the case of an unexpected EOF or read error, else
 // returns the read uint32.
@@ -74,6 +91,16 @@
     return UINT32_MAX;
   return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];
 }
+#if defined(IN_MEMORY_UPDATES)
+// Returns the read uint32.
+uint32_t ReadAndHashLittleEndianUInt32FromString(
+    std::string::const_iterator* it,
+    crypto::SecureHash* hash) {
+  uint8_t buffer[4] = {};
+  ReadAndHashBufferFromString(buffer, sizeof(buffer), it, hash);
+  return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];
+}
+#endif
 
 // Read to the end of the file, updating the hash and all verifiers.
 bool ReadHashAndVerifyArchive(base::File* file,
@@ -92,6 +119,34 @@
   }
   return len == 0;
 }
+#if defined(IN_MEMORY_UPDATES)
+// Reads to the end of the string, updating the hash and all verifiers.
+bool ReadHashAndVerifyArchiveFromString(const std::string& crx_str,
+                                        std::string::const_iterator* it,
+                                        crypto::SecureHash* hash,
+                                        const VerifierCollection& verifiers) {
+  int remaining_bytes = crx_str.end() - *it;
+
+  uint8_t buffer[1 << 12] = {};
+  while (remaining_bytes > 0) {
+    size_t len = remaining_bytes >= base::size(buffer) ? base::size(buffer)
+                                                       : remaining_bytes;
+
+    ReadAndHashBufferFromString(buffer, len, it, hash);
+    remaining_bytes -= len;
+
+    for (auto& verifier : verifiers) {
+      verifier->VerifyUpdate(base::make_span(buffer, len));
+    }
+  }
+
+  for (auto& verifier : verifiers) {
+    if (!verifier->VerifyFinal())
+      return false;
+  }
+  return true;
+}
+#endif
 
 // The remaining contents of a Crx3 file are [header-size][header][archive].
 // [header] is an encoded protocol buffer and contains both a signed and
@@ -208,6 +263,129 @@
   return VerifierResult::OK_FULL;
 }
 
+#if defined(IN_MEMORY_UPDATES)
+// TODO(b/158043520): because we want to leave the Chromium code relatively
+// intact and also want to support both in-memory and legacy updates in the same
+// build while we develop the feature, there is for now a lot of duplicated code
+// in some of these functions. For these functions that implement longer
+// algorithms that are mostly agnostic about the Crx's representation we could
+// likely share code by making them generic, but it probably makes more sense to
+// live with the duplication for now. Once the feature is complete and we only
+// need to support in-memory updates in builds, we can have one copy of the
+// function that uses preprocessor conditions to enlist the appropriate helpers.
+VerifierResult VerifyCrx3FromString(
+    const std::string& crx_str,
+    std::string::const_iterator* it,
+    crypto::SecureHash* hash,
+    const std::vector<std::vector<uint8_t>>& required_key_hashes,
+    std::string* public_key,
+    std::string* crx_id,
+    bool require_publisher_key,
+    bool accept_publisher_test_key) {
+  // Parse [header-size] and [header].
+  const uint32_t header_size =
+      ReadAndHashLittleEndianUInt32FromString(it, hash);
+  if (header_size > kMaxHeaderSize)
+    return VerifierResult::ERROR_HEADER_INVALID;
+  std::vector<uint8_t> header_bytes(header_size);
+  // Assuming kMaxHeaderSize can fit in an int, the following cast is safe.
+  if (ReadAndHashBufferFromString(header_bytes.data(), header_size, it, hash) !=
+      static_cast<int>(header_size))
+    return VerifierResult::ERROR_HEADER_INVALID;
+  CrxFileHeader header;
+  if (!header.ParseFromArray(header_bytes.data(), header_size))
+    return VerifierResult::ERROR_HEADER_INVALID;
+
+  // Parse [signed-header].
+  const std::string& signed_header_data_str = header.signed_header_data();
+  SignedData signed_header_data;
+  if (!signed_header_data.ParseFromString(signed_header_data_str))
+    return VerifierResult::ERROR_HEADER_INVALID;
+  const std::string& crx_id_encoded = signed_header_data.crx_id();
+  const std::string declared_crx_id = id_util::GenerateIdFromHex(
+      base::HexEncode(crx_id_encoded.data(), crx_id_encoded.size()));
+
+  // Create a little-endian representation of [signed-header-size].
+  const int signed_header_size = signed_header_data_str.size();
+  const uint8_t header_size_octets[] = {
+      static_cast<uint8_t>(signed_header_size),
+      static_cast<uint8_t>(signed_header_size >> 8),
+      static_cast<uint8_t>(signed_header_size >> 16),
+      static_cast<uint8_t>(signed_header_size >> 24)};
+
+  // Create a set of all required key hashes.
+  std::set<std::vector<uint8_t>> required_key_set(required_key_hashes.begin(),
+                                                  required_key_hashes.end());
+
+  using ProofFetcher = const RepeatedProof& (CrxFileHeader::*)() const;
+  ProofFetcher rsa = &CrxFileHeader::sha256_with_rsa;
+  ProofFetcher ecdsa = &CrxFileHeader::sha256_with_ecdsa;
+
+  std::string public_key_bytes;
+  VerifierCollection verifiers;
+  verifiers.reserve(header.sha256_with_rsa_size() +
+                    header.sha256_with_ecdsa_size());
+  const std::vector<
+      std::pair<ProofFetcher, crypto::SignatureVerifier::SignatureAlgorithm>>
+      proof_types = {
+          std::make_pair(rsa, crypto::SignatureVerifier::RSA_PKCS1_SHA256),
+          std::make_pair(ecdsa, crypto::SignatureVerifier::ECDSA_SHA256)};
+
+  std::vector<uint8_t> publisher_key(std::begin(kPublisherKeyHash),
+                                     std::end(kPublisherKeyHash));
+  base::Optional<std::vector<uint8_t>> publisher_test_key;
+  if (accept_publisher_test_key) {
+    publisher_test_key.emplace(std::begin(kPublisherTestKeyHash),
+                               std::end(kPublisherTestKeyHash));
+  }
+  bool found_publisher_key = false;
+
+  // Initialize all verifiers and update them with
+  // [prefix][signed-header-size][signed-header].
+  // Clear any elements of required_key_set that are encountered, and watch for
+  // the developer key.
+  for (const auto& proof_type : proof_types) {
+    for (const auto& proof : (header.*proof_type.first)()) {
+      const std::string& key = proof.public_key();
+      const std::string& sig = proof.signature();
+      if (id_util::GenerateId(key) == declared_crx_id)
+        public_key_bytes = key;
+      std::vector<uint8_t> key_hash(crypto::kSHA256Length);
+      crypto::SHA256HashString(key, key_hash.data(), key_hash.size());
+      required_key_set.erase(key_hash);
+      DCHECK_EQ(accept_publisher_test_key, publisher_test_key.has_value());
+      found_publisher_key =
+          found_publisher_key || key_hash == publisher_key ||
+          (accept_publisher_test_key && key_hash == *publisher_test_key);
+      auto v = std::make_unique<crypto::SignatureVerifier>();
+      static_assert(sizeof(unsigned char) == sizeof(uint8_t),
+                    "Unsupported char size.");
+      if (!v->VerifyInit(proof_type.second,
+                         base::as_bytes(base::make_span(sig)),
+                         base::as_bytes(base::make_span(key))))
+        return VerifierResult::ERROR_SIGNATURE_INITIALIZATION_FAILED;
+      v->VerifyUpdate(kSignatureContext);
+      v->VerifyUpdate(header_size_octets);
+      v->VerifyUpdate(base::as_bytes(base::make_span(signed_header_data_str)));
+      verifiers.push_back(std::move(v));
+    }
+  }
+  if (public_key_bytes.empty() || !required_key_set.empty())
+    return VerifierResult::ERROR_REQUIRED_PROOF_MISSING;
+
+  if (require_publisher_key && !found_publisher_key)
+    return VerifierResult::ERROR_REQUIRED_PROOF_MISSING;
+
+  // Update and finalize the verifiers with [archive].
+  if (!ReadHashAndVerifyArchiveFromString(crx_str, it, hash, verifiers))
+    return VerifierResult::ERROR_SIGNATURE_VERIFICATION_FAILED;
+
+  base::Base64Encode(public_key_bytes, public_key);
+  *crx_id = declared_crx_id;
+  return VerifierResult::OK_FULL;
+}
+#endif
+
 VerifierResult VerifyCrx2(
     base::File* file,
     crypto::SecureHash* hash,
@@ -255,6 +433,56 @@
   return VerifierResult::OK_FULL;
 }
 
+#if defined(IN_MEMORY_UPDATES)
+VerifierResult VerifyCrx2FromString(
+    const std::string& crx_str,
+    std::string::const_iterator* it,
+    crypto::SecureHash* hash,
+    const std::vector<std::vector<uint8_t>>& required_key_hashes,
+    std::string* public_key,
+    std::string* crx_id) {
+  const uint32_t key_size = ReadAndHashLittleEndianUInt32FromString(it, hash);
+  if (key_size > kMaxPublicKeySize)
+    return VerifierResult::ERROR_HEADER_INVALID;
+  const uint32_t sig_size = ReadAndHashLittleEndianUInt32FromString(it, hash);
+  if (sig_size > kMaxSignatureSize)
+    return VerifierResult::ERROR_HEADER_INVALID;
+  std::vector<uint8_t> key(key_size);
+  if (ReadAndHashBufferFromString(key.data(), key_size, it, hash) !=
+      static_cast<int>(key_size))
+    return VerifierResult::ERROR_HEADER_INVALID;
+  for (const auto& expected_hash : required_key_hashes) {
+    // In practice we expect zero or one key_hashes_ for Crx2 files.
+    std::vector<uint8_t> hash(crypto::kSHA256Length);
+    std::unique_ptr<crypto::SecureHash> sha256 =
+        crypto::SecureHash::Create(crypto::SecureHash::SHA256);
+    sha256->Update(key.data(), key.size());
+    sha256->Finish(hash.data(), hash.size());
+    if (hash != expected_hash)
+      return VerifierResult::ERROR_REQUIRED_PROOF_MISSING;
+  }
+
+  std::vector<uint8_t> sig(sig_size);
+  if (ReadAndHashBufferFromString(sig.data(), sig_size, it, hash) !=
+      static_cast<int>(sig_size))
+    return VerifierResult::ERROR_HEADER_INVALID;
+  std::vector<std::unique_ptr<crypto::SignatureVerifier>> verifiers;
+  verifiers.push_back(std::make_unique<crypto::SignatureVerifier>());
+  if (!verifiers[0]->VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, sig,
+                                key)) {
+    return VerifierResult::ERROR_SIGNATURE_INITIALIZATION_FAILED;
+  }
+
+  if (!ReadHashAndVerifyArchiveFromString(crx_str, it, hash, verifiers))
+    return VerifierResult::ERROR_SIGNATURE_VERIFICATION_FAILED;
+
+  const std::string public_key_bytes(key.begin(), key.end());
+  base::Base64Encode(public_key_bytes, public_key);
+  *crx_id = id_util::GenerateId(public_key_bytes);
+  return VerifierResult::OK_FULL;
+}
+#endif
+
 }  // namespace
 
 VerifierResult Verify(
@@ -330,4 +558,80 @@
   return diff ? VerifierResult::OK_DELTA : VerifierResult::OK_FULL;
 }
 
+#if defined(IN_MEMORY_UPDATES)
+VerifierResult Verify(
+    const std::string& crx_str,
+    const VerifierFormat& format,
+    const std::vector<std::vector<uint8_t>>& required_key_hashes,
+    const std::vector<uint8_t>& required_file_hash,
+    std::string* public_key,
+    std::string* crx_id) {
+  std::string public_key_local;
+  std::string crx_id_local;
+
+  std::unique_ptr<crypto::SecureHash> file_hash =
+      crypto::SecureHash::Create(crypto::SecureHash::SHA256);
+
+  // Magic number.
+  bool diff = false;
+  if (!strncmp(crx_str.c_str(), kCrxDiffFileHeaderMagic,
+               kCrxFileHeaderMagicSize)) {
+    diff = true;
+  } else if (strncmp(crx_str.c_str(), kCrxFileHeaderMagic,
+                     kCrxFileHeaderMagicSize)) {
+    return VerifierResult::ERROR_HEADER_INVALID;
+  }
+  file_hash->Update(crx_str.c_str(), kCrxFileHeaderMagicSize);
+
+  std::string::const_iterator it = crx_str.begin();
+  // Advance the iterator past the magic string embedded in the header.
+  std::advance(it, kCrxFileHeaderMagicSize);
+
+  // Version number.
+  const uint32_t version =
+      ReadAndHashLittleEndianUInt32FromString(&it, file_hash.get());
+  VerifierResult result;
+  if (version == 2)
+    SB_LOG(WARNING) << "The string is in CRX2 format, which is deprecated and "
+                    << "will not be supported in M78+";
+  if (format == VerifierFormat::CRX2_OR_CRX3 &&
+      (version == 2 || (diff && version == 0))) {
+    result =
+        VerifyCrx2FromString(crx_str, &it, file_hash.get(), required_key_hashes,
+                             &public_key_local, &crx_id_local);
+  } else if (version == 3) {
+    bool require_publisher_key =
+        format == VerifierFormat::CRX3_WITH_PUBLISHER_PROOF ||
+        format == VerifierFormat::CRX3_WITH_TEST_PUBLISHER_PROOF;
+    result = VerifyCrx3FromString(
+        crx_str, &it, file_hash.get(), required_key_hashes, &public_key_local,
+        &crx_id_local, require_publisher_key,
+        format == VerifierFormat::CRX3_WITH_TEST_PUBLISHER_PROOF);
+  } else {
+    result = VerifierResult::ERROR_HEADER_INVALID;
+  }
+  if (result != VerifierResult::OK_FULL)
+    return result;
+
+  // Finalize file hash.
+  uint8_t final_hash[crypto::kSHA256Length] = {};
+  file_hash->Finish(final_hash, sizeof(final_hash));
+  if (!required_file_hash.empty()) {
+    if (required_file_hash.size() != crypto::kSHA256Length)
+      return VerifierResult::ERROR_EXPECTED_HASH_INVALID;
+    if (!crypto::SecureMemEqual(final_hash, required_file_hash.data(),
+                                crypto::kSHA256Length)) {
+      return VerifierResult::ERROR_FILE_HASH_FAILED;
+    }
+  }
+
+  // All is well. Set the out-params and return.
+  if (public_key)
+    *public_key = public_key_local;
+  if (crx_id)
+    *crx_id = crx_id_local;
+  return diff ? VerifierResult::OK_DELTA : VerifierResult::OK_FULL;
+}
+#endif
+
 }  // namespace crx_file
diff --git a/components/crx_file/crx_verifier.h b/components/crx_file/crx_verifier.h
index b770626..2631a89 100644
--- a/components/crx_file/crx_verifier.h
+++ b/components/crx_file/crx_verifier.h
@@ -1,4 +1,4 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
+// Copyright 2017 The Cobalt Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -51,6 +51,17 @@
     std::string* public_key,
     std::string* crx_id);
 
+#if defined(IN_MEMORY_UPDATES)
+// An overload that instead verifies |crx_str| as a valid Crx.
+VerifierResult Verify(
+    const std::string& crx_str,
+    const VerifierFormat& format,
+    const std::vector<std::vector<uint8_t>>& required_key_hashes,
+    const std::vector<uint8_t>& required_file_hash,
+    std::string* public_key,
+    std::string* crx_id);
+#endif
+
 }  // namespace crx_file
 
 #endif  // COMPONENTS_CRX_FILE_CRX_VERIFIER_H_
diff --git a/components/crx_file/crx_verifier_unittest.cc b/components/crx_file/crx_verifier_unittest.cc
index 4c41e4e..05969db 100644
--- a/components/crx_file/crx_verifier_unittest.cc
+++ b/components/crx_file/crx_verifier_unittest.cc
@@ -5,6 +5,9 @@
 #include "components/crx_file/crx_verifier.h"
 #include "base/base_paths.h"
 #include "base/files/file_path.h"
+#if defined(IN_MEMORY_UPDATES)
+#include "base/files/file_util.h"
+#endif
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
 #if defined(STARBOARD)
@@ -76,6 +79,23 @@
   EXPECT_EQ(std::string(kOjjKey), public_key);
 }
 
+#if defined(IN_MEMORY_UPDATES)
+TEST_F(CrxVerifierTest, ValidFullCrx2FromString) {
+  const std::vector<std::vector<uint8_t>> keys;
+  const std::vector<uint8_t> hash;
+  std::string public_key;
+  std::string crx_id;
+  std::string crx_str;
+  ASSERT_TRUE(base::ReadFileToString(TestFile("valid.crx2"), &crx_str));
+
+  EXPECT_EQ(VerifierResult::OK_FULL,
+            Verify(crx_str, VerifierFormat::CRX2_OR_CRX3, keys, hash,
+                   &public_key, &crx_id));
+  EXPECT_EQ(std::string(kOjjHash), crx_id);
+  EXPECT_EQ(std::string(kOjjKey), public_key);
+}
+#endif
+
 TEST_F(CrxVerifierTest, ValidFullCrx3) {
   const std::vector<std::vector<uint8_t>> keys;
   const std::vector<uint8_t> hash;
@@ -97,6 +117,30 @@
   EXPECT_EQ(std::string(kOjjKey), public_key);
 }
 
+#if defined(IN_MEMORY_UPDATES)
+TEST_F(CrxVerifierTest, ValidFullCrx3FromString) {
+  const std::vector<std::vector<uint8_t>> keys;
+  const std::vector<uint8_t> hash;
+  std::string public_key = "UNSET";
+  std::string crx_id = "UNSET";
+  std::string crx_str;
+  ASSERT_TRUE(
+      base::ReadFileToString(TestFile("valid_no_publisher.crx3"), &crx_str));
+  EXPECT_EQ(VerifierResult::OK_FULL,
+            Verify(crx_str, VerifierFormat::CRX2_OR_CRX3, keys, hash,
+                   &public_key, &crx_id));
+  EXPECT_EQ(std::string(kOjjHash), crx_id);
+  EXPECT_EQ(std::string(kOjjKey), public_key);
+
+  public_key = "UNSET";
+  crx_id = "UNSET";
+  EXPECT_EQ(VerifierResult::OK_FULL, Verify(crx_str, VerifierFormat::CRX3, keys,
+                                            hash, &public_key, &crx_id));
+  EXPECT_EQ(std::string(kOjjHash), crx_id);
+  EXPECT_EQ(std::string(kOjjKey), public_key);
+}
+#endif
+
 TEST_F(CrxVerifierTest, Crx3RejectsCrx2) {
   const std::vector<std::vector<uint8_t>> keys;
   const std::vector<uint8_t> hash;
@@ -110,6 +154,23 @@
   EXPECT_EQ("UNSET", public_key);
 }
 
+#if defined(IN_MEMORY_UPDATES)
+TEST_F(CrxVerifierTest, Crx3RejectsCrx2FromString) {
+  const std::vector<std::vector<uint8_t>> keys;
+  const std::vector<uint8_t> hash;
+  std::string public_key = "UNSET";
+  std::string crx_id = "UNSET";
+  std::string crx_str;
+  ASSERT_TRUE(base::ReadFileToString(TestFile("valid.crx2"), &crx_str));
+
+  EXPECT_EQ(
+      VerifierResult::ERROR_HEADER_INVALID,
+      Verify(crx_str, VerifierFormat::CRX3, keys, hash, &public_key, &crx_id));
+  EXPECT_EQ("UNSET", crx_id);
+  EXPECT_EQ("UNSET", public_key);
+}
+#endif
+
 TEST_F(CrxVerifierTest, VerifiesFileHash) {
   const std::vector<std::vector<uint8_t>> keys;
   std::vector<uint8_t> hash;
@@ -146,6 +207,48 @@
   EXPECT_EQ("UNSET", public_key);
 }
 
+#if defined(IN_MEMORY_UPDATES)
+TEST_F(CrxVerifierTest, VerifiesFileHashForCrxFromString) {
+  const std::vector<std::vector<uint8_t>> keys;
+  std::vector<uint8_t> hash;
+  std::string crx_str;
+  ASSERT_TRUE(
+      base::ReadFileToString(TestFile("valid_no_publisher.crx3"), &crx_str));
+
+  EXPECT_TRUE(base::HexStringToBytes(
+      "d033c510f9e4ee081ccb60ea2bf530dc2e5cb0e71085b55503c8b13b74515fe4",
+      &hash));
+  std::string public_key = "UNSET";
+  std::string crx_id = "UNSET";
+
+  EXPECT_EQ(VerifierResult::OK_FULL,
+            Verify(crx_str, VerifierFormat::CRX2_OR_CRX3, keys, hash,
+                   &public_key, &crx_id));
+  EXPECT_EQ(std::string(kOjjHash), crx_id);
+  EXPECT_EQ(std::string(kOjjKey), public_key);
+
+  hash.clear();
+  EXPECT_TRUE(base::HexStringToBytes(std::string(32, '0'), &hash));
+  public_key = "UNSET";
+  crx_id = "UNSET";
+  EXPECT_EQ(
+      VerifierResult::ERROR_EXPECTED_HASH_INVALID,
+      Verify(crx_str, VerifierFormat::CRX3, keys, hash, &public_key, &crx_id));
+  EXPECT_EQ("UNSET", crx_id);
+  EXPECT_EQ("UNSET", public_key);
+
+  hash.clear();
+  EXPECT_TRUE(base::HexStringToBytes(std::string(64, '0'), &hash));
+  public_key = "UNSET";
+  crx_id = "UNSET";
+  EXPECT_EQ(
+      VerifierResult::ERROR_FILE_HASH_FAILED,
+      Verify(crx_str, VerifierFormat::CRX3, keys, hash, &public_key, &crx_id));
+  EXPECT_EQ("UNSET", crx_id);
+  EXPECT_EQ("UNSET", public_key);
+}
+#endif
+
 TEST_F(CrxVerifierTest, ChecksRequiredKeyHashes) {
   const std::vector<uint8_t> hash;
 
@@ -175,6 +278,39 @@
   EXPECT_EQ("UNSET", public_key);
 }
 
+#if defined(IN_MEMORY_UPDATES)
+TEST_F(CrxVerifierTest, ChecksRequiredKeyHashesForCrxFromString) {
+  const std::vector<uint8_t> hash;
+  std::string crx_str;
+  ASSERT_TRUE(
+      base::ReadFileToString(TestFile("valid_no_publisher.crx3"), &crx_str));
+
+  std::vector<uint8_t> good_key;
+  EXPECT_TRUE(base::HexStringToBytes(
+      "e996dfa8eed34bc6614a57bb7308cd7e519bcc690841e1969f7cb173ef16800a",
+      &good_key));
+  const std::vector<std::vector<uint8_t>> good_keys = {good_key};
+  std::string public_key = "UNSET";
+  std::string crx_id = "UNSET";
+  EXPECT_EQ(VerifierResult::OK_FULL,
+            Verify(crx_str, VerifierFormat::CRX2_OR_CRX3, good_keys, hash,
+                   &public_key, &crx_id));
+  EXPECT_EQ(std::string(kOjjHash), crx_id);
+  EXPECT_EQ(std::string(kOjjKey), public_key);
+
+  std::vector<uint8_t> bad_key;
+  EXPECT_TRUE(base::HexStringToBytes(std::string(64, '0'), &bad_key));
+  const std::vector<std::vector<uint8_t>> bad_keys = {bad_key};
+  public_key = "UNSET";
+  crx_id = "UNSET";
+  EXPECT_EQ(VerifierResult::ERROR_REQUIRED_PROOF_MISSING,
+            Verify(crx_str, VerifierFormat::CRX3, bad_keys, hash, &public_key,
+                   &crx_id));
+  EXPECT_EQ("UNSET", crx_id);
+  EXPECT_EQ("UNSET", public_key);
+}
+#endif
+
 TEST_F(CrxVerifierTest, ChecksPinnedKey) {
   const std::vector<uint8_t> hash;
   const std::vector<std::vector<uint8_t>> keys;
@@ -206,6 +342,49 @@
   EXPECT_EQ("UNSET", public_key);
 }
 
+#if defined(IN_MEMORY_UPDATES)
+TEST_F(CrxVerifierTest, ChecksPinnedKeyForCrxFromString) {
+  const std::vector<uint8_t> hash;
+  const std::vector<std::vector<uint8_t>> keys;
+  std::string public_key = "UNSET";
+  std::string crx_id = "UNSET";
+  std::string valid_publisher_crx_str;
+  EXPECT_TRUE(base::ReadFileToString(TestFile("valid_publisher.crx3"),
+                                     &valid_publisher_crx_str));
+
+  EXPECT_EQ(
+      VerifierResult::OK_FULL,
+      Verify(valid_publisher_crx_str, VerifierFormat::CRX3_WITH_PUBLISHER_PROOF,
+             keys, hash, &public_key, &crx_id));
+  EXPECT_EQ(std::string(kOjjHash), crx_id);
+  EXPECT_EQ(std::string(kOjjKey), public_key);
+
+  public_key = "UNSET";
+  crx_id = "UNSET";
+  std::string valid_test_publisher_crx_str;
+  EXPECT_TRUE(base::ReadFileToString(TestFile("valid_test_publisher.crx3"),
+                                     &valid_test_publisher_crx_str));
+  EXPECT_EQ(VerifierResult::ERROR_REQUIRED_PROOF_MISSING,
+            Verify(valid_test_publisher_crx_str,
+                   VerifierFormat::CRX3_WITH_PUBLISHER_PROOF, keys, hash,
+                   &public_key, &crx_id));
+  EXPECT_EQ("UNSET", crx_id);
+  EXPECT_EQ("UNSET", public_key);
+
+  public_key = "UNSET";
+  crx_id = "UNSET";
+  std::string valid_no_publisher_crx_str;
+  EXPECT_TRUE(base::ReadFileToString(TestFile("valid_no_publisher.crx3"),
+                                     &valid_no_publisher_crx_str));
+  EXPECT_EQ(VerifierResult::ERROR_REQUIRED_PROOF_MISSING,
+            Verify(valid_no_publisher_crx_str,
+                   VerifierFormat::CRX3_WITH_PUBLISHER_PROOF, keys, hash,
+                   &public_key, &crx_id));
+  EXPECT_EQ("UNSET", crx_id);
+  EXPECT_EQ("UNSET", public_key);
+}
+#endif
+
 TEST_F(CrxVerifierTest, ChecksPinnedKeyAcceptsTest) {
   const std::vector<uint8_t> hash;
   const std::vector<std::vector<uint8_t>> keys;
@@ -237,6 +416,48 @@
   EXPECT_EQ("UNSET", public_key);
 }
 
+#if defined(IN_MEMORY_UPDATES)
+TEST_F(CrxVerifierTest, ChecksPinnedKeyAcceptsTestForCrxFromString) {
+  const std::vector<uint8_t> hash;
+  const std::vector<std::vector<uint8_t>> keys;
+  std::string public_key = "UNSET";
+  std::string crx_id = "UNSET";
+  std::string valid_publisher_crx_str;
+  EXPECT_TRUE(base::ReadFileToString(TestFile("valid_publisher.crx3"),
+                                     &valid_publisher_crx_str));
+  EXPECT_EQ(VerifierResult::OK_FULL,
+            Verify(valid_publisher_crx_str,
+                   VerifierFormat::CRX3_WITH_TEST_PUBLISHER_PROOF, keys, hash,
+                   &public_key, &crx_id));
+  EXPECT_EQ(std::string(kOjjHash), crx_id);
+  EXPECT_EQ(std::string(kOjjKey), public_key);
+
+  public_key = "UNSET";
+  crx_id = "UNSET";
+  std::string valid_test_publisher_crx_str;
+  EXPECT_TRUE(base::ReadFileToString(TestFile("valid_test_publisher.crx3"),
+                                     &valid_test_publisher_crx_str));
+  EXPECT_EQ(VerifierResult::OK_FULL,
+            Verify(valid_test_publisher_crx_str,
+                   VerifierFormat::CRX3_WITH_TEST_PUBLISHER_PROOF, keys, hash,
+                   &public_key, &crx_id));
+  EXPECT_EQ(std::string(kJlnHash), crx_id);
+  EXPECT_EQ(std::string(kJlnKey), public_key);
+
+  public_key = "UNSET";
+  crx_id = "UNSET";
+  std::string valid_no_publisher_crx_str;
+  EXPECT_TRUE(base::ReadFileToString(TestFile("valid_no_publisher.crx3"),
+                                     &valid_no_publisher_crx_str));
+  EXPECT_EQ(VerifierResult::ERROR_REQUIRED_PROOF_MISSING,
+            Verify(valid_no_publisher_crx_str,
+                   VerifierFormat::CRX3_WITH_TEST_PUBLISHER_PROOF, keys, hash,
+                   &public_key, &crx_id));
+  EXPECT_EQ("UNSET", crx_id);
+  EXPECT_EQ("UNSET", public_key);
+}
+#endif
+
 TEST_F(CrxVerifierTest, NullptrSafe) {
   const std::vector<uint8_t> hash;
   const std::vector<std::vector<uint8_t>> keys;
@@ -246,6 +467,20 @@
                    nullptr, nullptr));
 }
 
+#if defined(IN_MEMORY_UPDATES)
+TEST_F(CrxVerifierTest, NullptrSafeForCrxFromString) {
+  const std::vector<uint8_t> hash;
+  const std::vector<std::vector<uint8_t>> keys;
+  std::string crx_str;
+  ASSERT_TRUE(
+      base::ReadFileToString(TestFile("valid_publisher.crx3"), &crx_str));
+
+  EXPECT_EQ(VerifierResult::OK_FULL,
+            Verify(crx_str, VerifierFormat::CRX3_WITH_PUBLISHER_PROOF, keys,
+                   hash, nullptr, nullptr));
+}
+#endif
+
 TEST_F(CrxVerifierTest, RequiresDeveloperKey) {
   const std::vector<uint8_t> hash;
   const std::vector<std::vector<uint8_t>> keys;
@@ -258,4 +493,21 @@
   EXPECT_EQ("UNSET", public_key);
 }
 
+#if defined(IN_MEMORY_UPDATES)
+TEST_F(CrxVerifierTest, RequiresDeveloperKeyForCrxFromString) {
+  const std::vector<uint8_t> hash;
+  const std::vector<std::vector<uint8_t>> keys;
+  std::string public_key = "UNSET";
+  std::string crx_id = "UNSET";
+  std::string crx_str;
+  ASSERT_TRUE(base::ReadFileToString(TestFile("unsigned.crx3"), &crx_str));
+
+  EXPECT_EQ(VerifierResult::ERROR_REQUIRED_PROOF_MISSING,
+            Verify(crx_str, VerifierFormat::CRX2_OR_CRX3, keys, hash,
+                   &public_key, &crx_id));
+  EXPECT_EQ("UNSET", crx_id);
+  EXPECT_EQ("UNSET", public_key);
+}
+#endif
+
 }  // namespace crx_file
diff --git a/components/crx_file/id_util.h b/components/crx_file/id_util.h
index 6370560..e188262 100644
--- a/components/crx_file/id_util.h
+++ b/components/crx_file/id_util.h
@@ -5,13 +5,13 @@
 #ifndef COMPONENTS_CRX_FILE_ID_UTIL_H_
 #define COMPONENTS_CRX_FILE_ID_UTIL_H_
 
-#include "base/strings/string_piece.h"
-
 #include <stddef.h>
 #include <stdint.h>
 
 #include <string>
 
+#include "base/strings/string_piece.h"
+
 namespace base {
 class FilePath;
 }
diff --git a/components/metrics/BUILD.gn b/components/metrics/BUILD.gn
index b7c04f3..e69be69 100644
--- a/components/metrics/BUILD.gn
+++ b/components/metrics/BUILD.gn
@@ -120,6 +120,11 @@
 
   if (use_cobalt_customizations) {
     sources -= [
+      # Allows removal of unused sampled_profile.proto, which adds ~200KB to
+      # the binary. See b/290819695.
+      "call_stack_profile_metrics_provider.cc",
+      "call_stack_profile_metrics_provider.h",
+
       # All code should be OS agnostic above SB.
       "drive_metrics_provider_android.cc",
       "drive_metrics_provider_ios.mm",
@@ -130,12 +135,17 @@
       # MemoryMapped files, etc).
       "file_metrics_provider.cc",
       "file_metrics_provider.h",
-       # All code should be OS agnostic above SB.
+      # All code should be OS agnostic above SB.
       "machine_id_provider_win.cc",
       "system_memory_stats_recorder_linux.cc",
       "system_memory_stats_recorder_win.cc",
       "system_session_analyzer_win.cc",
       "system_session_analyzer_win.h",
+
+      # Files with unused symbols. ex: DriveMetricsProvider::HasSeekPenalty
+      # These files give linker errors about undefined symbols during modualr builds.
+      "drive_metrics_provider.cc",
+      "drive_metrics_provider.h",
     ]
   }
 
@@ -279,7 +289,6 @@
       "//components/metrics/public/interfaces:single_sample_metrics_mojo_bindings",
     ]
   }
-  
 
   source_set("call_stack_profile_params") {
     public = [
@@ -380,7 +389,6 @@
   }
 }
 
-# TODO(b/283275474): Re-enable as many of these tests as possible.
 if (!use_cobalt_customizations) {
   source_set("unit_tests") {
     testonly = true
@@ -469,3 +477,34 @@
     ]
   }
 }
+
+if (use_cobalt_customizations) {
+  target(gtest_target_type, "components_metrics_tests") {
+    testonly = true
+    has_pedantic_warnings = true
+    sources = [
+      "histogram_encoder_unittest.cc",
+      "metrics_log_manager_unittest.cc",
+      "metrics_log_store_unittest.cc",
+      "metrics_log_unittest.cc",
+      "metrics_service_unittest.cc",
+      "metrics_state_manager_unittest.cc",
+      "reporting_service_unittest.cc",
+      "stability_metrics_helper_unittest.cc",
+      "stability_metrics_provider_unittest.cc",
+    ]
+
+    deps = [
+      ":metrics",
+      ":test_support",
+      "//base",
+      "//base/test:test_support",
+      "//cobalt/test:run_all_unittests",
+      "//components/prefs:test_support",
+      "//components/variations",
+      "//extensions/buildflags",
+      "//testing/gtest",
+      "//third_party/zlib/google:compression_utils",
+    ]
+  }
+}
diff --git a/components/metrics/metrics_log.cc b/components/metrics/metrics_log.cc
index 39ad9b1..8fe32c7 100644
--- a/components/metrics/metrics_log.cc
+++ b/components/metrics/metrics_log.cc
@@ -169,11 +169,8 @@
 #endif
 
   metrics::SystemProfileProto::OS* os = system_profile->mutable_os();
-// TODO(b/283256747): Remove when base::SysInfo is Starboardized.
-#if !defined(STARBOARD)
   os->set_name(base::SysInfo::OperatingSystemName());
   os->set_version(base::SysInfo::OperatingSystemVersion());
-#endif
 #if defined(OS_CHROMEOS)
   os->set_kernel_version(base::SysInfo::KernelVersion());
 #elif defined(OS_ANDROID)
@@ -332,7 +329,8 @@
         internal::kUserActionEventLimit,
         uma_proto_.user_action_event_size() - internal::kUserActionEventLimit);
   }
-
+// Omnibox proto removed for binary size reasons: b/290819695.
+#if !defined(USE_COBALT_CUSTOMIZATIONS)
   if (uma_proto_.omnibox_event_size() > internal::kOmniboxEventLimit) {
     UMA_HISTOGRAM_COUNTS_100000("UMA.TruncatedEvents.Omnibox",
                                 uma_proto_.omnibox_event_size());
@@ -340,6 +338,7 @@
         internal::kOmniboxEventLimit,
         uma_proto_.omnibox_event_size() - internal::kOmniboxEventLimit);
   }
+#endif
 }
 
 void MetricsLog::GetEncodedLog(std::string* encoded_log) {
diff --git a/components/metrics/metrics_log_unittest.cc b/components/metrics/metrics_log_unittest.cc
index 8af49a8..bddc0fc 100644
--- a/components/metrics/metrics_log_unittest.cc
+++ b/components/metrics/metrics_log_unittest.cc
@@ -142,7 +142,7 @@
 #endif
   metrics::SystemProfileProto::Hardware* hardware =
       system_profile->mutable_hardware();
-#if !defined(OS_IOS)
+#if !defined(OS_IOS) && !defined(STARBOARD)
   hardware->set_cpu_architecture(base::SysInfo::OperatingSystemArchitecture());
 #endif
   hardware->set_system_ram_mb(base::SysInfo::AmountOfPhysicalMemoryMB());
@@ -229,6 +229,8 @@
   EXPECT_EQ(12, histogram_proto.bucket(4).max());
 }
 
+// TODO(b/283255893): Remove when base::CPU is Starboardized.
+#if !defined(STARBOARD)
 TEST_F(MetricsLogTest, RecordEnvironment) {
   TestMetricsServiceClient client;
   TestMetricsLog log(kClientId, kSessionId, MetricsLog::ONGOING_LOG, &client);
@@ -238,6 +240,7 @@
   // Check that the system profile on the log has the correct values set.
   CheckSystemProfile(log.system_profile());
 }
+#endif
 
 TEST_F(MetricsLogTest, RecordEnvironmentEnableDefault) {
   TestMetricsServiceClient client;
@@ -343,6 +346,8 @@
     log.RecordUserAction("BasicAction");
     EXPECT_EQ(i + 1, log.uma_proto().user_action_event_size());
   }
+// Omnibox proto removed for binary size reasons: b/290819695.
+#if !defined(USE_COBALT_CUSTOMIZATIONS)
   for (int i = 0; i < internal::kOmniboxEventLimit * 2; ++i) {
     // Add an empty omnibox event. Not fully realistic since these are normally
     // supplied by a metrics provider.
@@ -355,6 +360,7 @@
   EXPECT_EQ(internal::kUserActionEventLimit,
             log.uma_proto().user_action_event_size());
   EXPECT_EQ(internal::kOmniboxEventLimit, log.uma_proto().omnibox_event_size());
+#endif
 }
 
 }  // namespace metrics
diff --git a/components/metrics/metrics_scheduler.cc b/components/metrics/metrics_scheduler.cc
index 86d1157..65dd6a3 100644
--- a/components/metrics/metrics_scheduler.cc
+++ b/components/metrics/metrics_scheduler.cc
@@ -5,6 +5,12 @@
 #include "components/metrics/metrics_scheduler.h"
 
 #include "build/build_config.h"
+#if defined(STARBOARD)
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "base/strings/string_number_conversions.h"
+#include "components/metrics/metrics_switches.h"
+#endif
 
 namespace metrics {
 
@@ -21,11 +27,39 @@
 
 }  // namespace
 
+// In Cobalt, we need a command line argument to override the initial upload
+// interval for testing.
+#if defined(STARBOARD)
+MetricsScheduler::MetricsScheduler(const base::Closure& task_callback)
+    : task_callback_(task_callback), running_(false), callback_pending_(false) {
+  const base::CommandLine* command_line =
+      base::CommandLine::ForCurrentProcess();
+  if (command_line->HasSwitch(switches::kInitialMetricsUploadIntervalSec)) {
+    int custom_initial_upload_interval = -1;
+    if (base::StringToInt(command_line->GetSwitchValueASCII(
+                              switches::kInitialMetricsUploadIntervalSec),
+                          &custom_initial_upload_interval)) {
+      interval_ = base::TimeDelta::FromSeconds(custom_initial_upload_interval);
+      LOG(INFO) << "Initial upload interval overriden on the command line to: "
+                << custom_initial_upload_interval;
+    } else {
+      interval_ = base::TimeDelta::FromSeconds(kInitialIntervalSeconds);
+      LOG(WARNING)
+          << "Initial upload interval was set on the command line, but "
+             "converting it to an int failed. Falling back to the default: "
+          << kInitialIntervalSeconds;
+    }
+  } else {
+    interval_ = base::TimeDelta::FromSeconds(kInitialIntervalSeconds);
+  }
+}
+#else
 MetricsScheduler::MetricsScheduler(const base::Closure& task_callback)
     : task_callback_(task_callback),
       interval_(base::TimeDelta::FromSeconds(kInitialIntervalSeconds)),
       running_(false),
       callback_pending_(false) {}
+#endif
 
 MetricsScheduler::~MetricsScheduler() {}
 
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc
index bfa17fe..ba636e0 100644
--- a/components/metrics/metrics_service.cc
+++ b/components/metrics/metrics_service.cc
@@ -158,6 +158,11 @@
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "components/variations/entropy_provider.h"
+#if defined(STARBOARD)
+#include "base/logging.h"
+#include "base/strings/string_number_conversions.h"
+#include "components/metrics/metrics_switches.h"
+#endif
 
 namespace metrics {
 
@@ -605,6 +610,30 @@
     // We only need to schedule that run once.
     state_ = INIT_TASK_SCHEDULED;
 
+#if defined(STARBOARD)
+    const base::CommandLine* command_line =
+        base::CommandLine::ForCurrentProcess();
+    int initialization_delay_secs = kInitializationDelaySeconds;
+    if (command_line->HasSwitch(switches::kInitialMetricsUploadIntervalSec)) {
+      if (base::StringToInt(command_line->GetSwitchValueASCII(
+                                switches::kInitialMetricsUploadIntervalSec),
+                            &initialization_delay_secs)) {
+        LOG(INFO) << "Metrics initial delay overriden to: "
+                  << initialization_delay_secs;
+      }
+    }
+    base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
+        FROM_HERE,
+        base::BindOnce(&MetricsService::StartInitTask,
+                       self_ptr_factory_.GetWeakPtr()),
+        base::TimeDelta::FromSeconds(initialization_delay_secs));
+
+    base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
+        FROM_HERE,
+        base::BindOnce(&MetricsService::PrepareProviderMetricsTask,
+                       self_ptr_factory_.GetWeakPtr()),
+        base::TimeDelta::FromSeconds(2 * initialization_delay_secs));
+#else
     base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE,
         base::BindOnce(&MetricsService::StartInitTask,
@@ -616,6 +645,7 @@
         base::BindOnce(&MetricsService::PrepareProviderMetricsTask,
                        self_ptr_factory_.GetWeakPtr()),
         base::TimeDelta::FromSeconds(2 * kInitializationDelaySeconds));
+#endif
   }
 }
 
diff --git a/components/metrics/metrics_service_unittest.cc b/components/metrics/metrics_service_unittest.cc
index 4350238..f10b79a 100644
--- a/components/metrics/metrics_service_unittest.cc
+++ b/components/metrics/metrics_service_unittest.cc
@@ -244,7 +244,10 @@
   EXPECT_TRUE(uma_log.has_session_id());
   EXPECT_TRUE(uma_log.has_system_profile());
   EXPECT_EQ(0, uma_log.user_action_event_size());
+// Omnibox proto removed for binary size reasons: b/290819695.
+#if !defined(USE_COBALT_CUSTOMIZATIONS)
   EXPECT_EQ(0, uma_log.omnibox_event_size());
+#endif
   EXPECT_EQ(0, uma_log.perf_data_size());
   CheckForNonStabilityHistograms(uma_log);
 
@@ -311,7 +314,10 @@
   EXPECT_TRUE(uma_log.has_session_id());
   EXPECT_TRUE(uma_log.has_system_profile());
   EXPECT_EQ(0, uma_log.user_action_event_size());
+// Omnibox proto removed for binary size reasons: b/290819695.
+#if !defined(USE_COBALT_CUSTOMIZATIONS)
   EXPECT_EQ(0, uma_log.omnibox_event_size());
+#endif
   EXPECT_EQ(0, uma_log.perf_data_size());
   CheckForNonStabilityHistograms(uma_log);
 
diff --git a/components/metrics/metrics_switches.cc b/components/metrics/metrics_switches.cc
index 38f65ae..8a5e891 100644
--- a/components/metrics/metrics_switches.cc
+++ b/components/metrics/metrics_switches.cc
@@ -21,5 +21,14 @@
 // Forces metrics reporting to be enabled.
 const char kForceEnableMetricsReporting[] = "force-enable-metrics-reporting";
 
+#if defined(STARBOARD)
+// Override the initial time interval for sending the first startup metrics log.
+// After the initial startup, it starts to use the "standard" upload interval.
+// In Cobalt, this is configured via SetUploadInterval() calls in C++ or
+// "SetMetricEventInterval()" via an H5vccMetrics JavaScript API.
+const char kInitialMetricsUploadIntervalSec[] =
+    "initial-metrics-upload-interval";
+#endif
+
 }  // namespace switches
 }  // namespace metrics
diff --git a/components/metrics/metrics_switches.h b/components/metrics/metrics_switches.h
index 10e41e9..7e1ae2d 100644
--- a/components/metrics/metrics_switches.h
+++ b/components/metrics/metrics_switches.h
@@ -11,6 +11,9 @@
 // Alphabetical list of switches specific to the metrics component. Document
 // each in the .cc file.
 
+#if defined(STARBOARD)
+extern const char kInitialMetricsUploadIntervalSec[];
+#endif
 extern const char kMetricsRecordingOnly[];
 extern const char kResetVariationState[];
 extern const char kForceEnableMetricsReporting[];
diff --git a/components/update_client/BUILD.gn b/components/update_client/BUILD.gn
index d83b2e6..8c3ab20 100644
--- a/components/update_client/BUILD.gn
+++ b/components/update_client/BUILD.gn
@@ -246,10 +246,6 @@
     "//starboard/loader_app:installation_manager",
     "//testing/gmock",
     "//testing/gtest",
+    "//starboard/loader_app"
   ]
-  if (build_with_separate_cobalt_toolchain) {
-    data_deps = [ "//starboard/loader_app($starboard_toolchain)" ]
-  } else {
-    deps += [ "//starboard/loader_app" ]
-  }
 }
diff --git a/components/update_client/action_runner.cc b/components/update_client/action_runner.cc
index 11d5dc0..2df16f5 100644
--- a/components/update_client/action_runner.cc
+++ b/components/update_client/action_runner.cc
@@ -91,11 +91,17 @@
   }
 
   const auto config = component_.config();
+
+#if defined(IN_MEMORY_UPDATES)
+  // TODO(hwarriner): see if we need to support this code path in Cobalt.
+  CHECK(false);
+#else
   auto unpacker = base::MakeRefCounted<ComponentUnpacker>(
       config->GetRunActionKeyHash(), crx_path, installer, std::move(unzip),
       std::move(patch), component_.crx_component()->crx_format_requirement);
   unpacker->Unpack(
       base::BindOnce(&ActionRunner::UnpackComplete, base::Unretained(this)));
+#endif
 }
 
 void ActionRunner::UnpackComplete(const ComponentUnpacker::Result& result) {
diff --git a/components/update_client/component.cc b/components/update_client/component.cc
index a683d29..78fa4cd 100644
--- a/components/update_client/component.cc
+++ b/components/update_client/component.cc
@@ -196,7 +196,11 @@
 
 void UnpackCompleteOnBlockingTaskRunner(
     scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
+#if defined(IN_MEMORY_UPDATES)
+    const base::FilePath& installation_dir,
+#else
     const base::FilePath& crx_path,
+#endif
 #if defined(STARBOARD)
     const int installation_index,
     PersistedData* metadata,
@@ -209,16 +213,22 @@
     const ComponentUnpacker::Result& result) {
 #if defined(STARBOARD)
   LOG(INFO) << "UnpackCompleteOnBlockingTaskRunner";
+#if !defined(IN_MEMORY_UPDATES)
   base::DeleteFile(crx_path, false);
-#else
+#endif  // !defined(IN_MEMORY_UPDATES)
+#else  // defined(STARBOARD)
   update_client::DeleteFileAndEmptyParentDirectory(crx_path);
-#endif
+#endif  // defined(STARBOARD)
 
   if (result.error != UnpackerError::kNone) {
 #if defined(STARBOARD)
     // When there is an error unpacking the downloaded CRX, such as a failure to
     // verify the package, we should remember to clear out any drain files.
+#if defined(IN_MEMORY_UPDATES)
+    if (base::DirectoryExists(installation_dir)) {
+#else  // defined(IN_MEMORY_UPDATES)
     if (base::DirectoryExists(crx_path.DirName())) {
+#endif  // defined(IN_MEMORY_UPDATES)
       const auto installation_api =
         static_cast<const CobaltExtensionInstallationManagerApi*>(
           SbSystemGetExtension(kCobaltExtensionInstallationManagerName));
@@ -229,7 +239,7 @@
         }
       }
     }
-#endif
+#endif  // #if defined(STARBOARD)
     main_task_runner->PostTask(
         FROM_HERE,
         base::BindOnce(std::move(callback), ErrorCategory::kUnpack,
@@ -253,7 +263,12 @@
 void StartInstallOnBlockingTaskRunner(
     scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
     const std::vector<uint8_t>& pk_hash,
+#if defined(IN_MEMORY_UPDATES)
+    const base::FilePath& installation_dir,
+    const std::string* crx_str,
+#else
     const base::FilePath& crx_path,
+#endif
 #if defined(STARBOARD)
     const int installation_index,
     PersistedData* metadata,
@@ -270,11 +285,23 @@
   LOG(INFO) << "StartInstallOnBlockingTaskRunner";
 #endif
   auto unpacker = base::MakeRefCounted<ComponentUnpacker>(
-      pk_hash, crx_path, installer, std::move(unzipper_), std::move(patcher_),
+      pk_hash,
+#if defined(IN_MEMORY_UPDATES)
+      crx_str,
+      installation_dir,
+#else
+      crx_path,
+#endif
+      installer, std::move(unzipper_), std::move(patcher_),
       crx_format);
 
   unpacker->Unpack(base::BindOnce(&UnpackCompleteOnBlockingTaskRunner,
-                                  main_task_runner, crx_path,
+                                  main_task_runner,
+#if defined(IN_MEMORY_UPDATES)
+                                  installation_dir,
+#else
+                                  crx_path,
+#endif
 #if defined(STARBOARD)
                                   installation_index, metadata, id, version,
 #endif
@@ -682,6 +709,10 @@
         FROM_HERE, base::BindOnce(&PersistedData::SetUpdaterChannel,
                                   base::Unretained(metadata), component.id_,
                                   config->GetChannel()));
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(&PersistedData::SetLatestChannel,
+                                  base::Unretained(metadata),
+                                  config->GetChannel()));
   } else {
     LOG(WARNING) << "Failed to get the persisted data store to write the "
                        "updater channel.";
@@ -813,7 +844,11 @@
 void Component::StateDownloadingDiff::DoHandle() {
   DCHECK(thread_checker_.CalledOnValidThread());
 
+#if defined(IN_MEMORY_UPDATES)
+  auto& component = Component::State::component();
+#else
   const auto& component = Component::State::component();
+#endif
   const auto& update_context = component.update_context_;
 
   DCHECK(component.crx_component());
@@ -833,6 +868,9 @@
                  base::Unretained(this), id));
   crx_downloader_->StartDownload(
       component.crx_diffurls_, component.hashdiff_sha256_,
+#if defined(IN_MEMORY_UPDATES)
+      &component.crx_str_,
+#endif
       base::BindOnce(&Component::StateDownloadingDiff::DownloadComplete,
                      base::Unretained(this), id));
 
@@ -860,7 +898,9 @@
   crx_downloader_.reset();
 
   if (download_result.error) {
+#if !defined(IN_MEMORY_UPDATES)
     DCHECK(download_result.response.empty());
+#endif
     component.diff_error_category_ = ErrorCategory::kDownload;
     component.diff_error_code_ = download_result.error;
 
@@ -868,7 +908,11 @@
     return;
   }
 
+#if defined(IN_MEMORY_UPDATES)
+  component.installation_dir_ = download_result.installation_dir;
+#else
   component.crx_path_ = download_result.response;
+#endif
 
 #if defined(STARBOARD)
   component.installation_index_ = download_result.installation_index;
@@ -894,7 +938,11 @@
 void Component::StateDownloading::DoHandle() {
   DCHECK(thread_checker_.CalledOnValidThread());
 
+#if defined(IN_MEMORY_UPDATES)
+  auto& component = Component::State::component();
+#else
   const auto& component = Component::State::component();
+#endif
   const auto& update_context = component.update_context_;
 
   DCHECK(component.crx_component());
@@ -914,6 +962,9 @@
                  base::Unretained(this), id));
   crx_downloader_->StartDownload(
       component.crx_urls_, component.hash_sha256_,
+#if defined(IN_MEMORY_UPDATES)
+      &component.crx_str_,
+#endif
       base::BindOnce(&Component::StateDownloading::DownloadComplete,
                      base::Unretained(this), id));
 
@@ -942,7 +993,9 @@
   crx_downloader_.reset();
 
   if (download_result.error) {
+#if !defined(IN_MEMORY_UPDATES)
     DCHECK(download_result.response.empty());
+#endif
     component.error_category_ = ErrorCategory::kDownload;
     component.error_code_ = download_result.error;
 
@@ -950,7 +1003,11 @@
     return;
   }
 
+#if defined(IN_MEMORY_UPDATES)
+  component.installation_dir_ = download_result.installation_dir;
+#else
   component.crx_path_ = download_result.response;
+#endif
 
 #if defined(STARBOARD)
   component.installation_index_ = download_result.installation_index;
@@ -969,7 +1026,11 @@
 void Component::StateUpdatingDiff::DoHandle() {
   DCHECK(thread_checker_.CalledOnValidThread());
 
+#if defined(IN_MEMORY_UPDATES)
+  auto& component = Component::State::component();
+#else
   const auto& component = Component::State::component();
+#endif
   const auto& update_context = component.update_context_;
 
   DCHECK(component.crx_component());
@@ -982,7 +1043,13 @@
           base::BindOnce(
               &update_client::StartInstallOnBlockingTaskRunner,
               base::ThreadTaskRunnerHandle::Get(),
-              component.crx_component()->pk_hash, component.crx_path_,
+              component.crx_component()->pk_hash,
+#if defined(IN_MEMORY_UPDATES)
+              component.installation_dir_,
+              &component.crx_str_,
+#else
+              component.crx_path_,
+#endif
 #if defined(STARBOARD)
               component.installation_index_,
               update_context.update_checker->GetPersistedData(), component.id_,
@@ -1039,7 +1106,11 @@
 #endif
   DCHECK(thread_checker_.CalledOnValidThread());
 
+#if defined(IN_MEMORY_UPDATES)
+  auto& component = Component::State::component();
+#else
   const auto& component = Component::State::component();
+#endif
   const auto& update_context = component.update_context_;
 
   DCHECK(component.crx_component());
@@ -1050,7 +1121,13 @@
                  base::BindOnce(
                      &update_client::StartInstallOnBlockingTaskRunner,
                      base::ThreadTaskRunnerHandle::Get(),
-                     component.crx_component()->pk_hash, component.crx_path_,
+                     component.crx_component()->pk_hash,
+#if defined(IN_MEMORY_UPDATES)
+                     component.installation_dir_,
+                     &component.crx_str_,
+#else
+                     component.crx_path_,
+#endif
 #if defined(STARBOARD)
                      component.installation_index_,
                      update_context.update_checker->GetPersistedData(),
diff --git a/components/update_client/component.h b/components/update_client/component.h
index ddefa13..d5d9e43 100644
--- a/components/update_client/component.h
+++ b/components/update_client/component.h
@@ -481,7 +481,19 @@
   // The error reported by the update checker.
   int update_check_error_ = 0;
 
+#if defined(IN_MEMORY_UPDATES)
+  // To hold the CRX package in memory. The component owns this string
+  // throughout the entire update.
+  std::string crx_str_;
+
+  // With in-memory updates the installation directory is still determined in
+  // the download flow even though it isn't needed until the unpack flow. Since
+  // there is no crx_path_ that the installation directory can be derived from,
+  // a dedicated installation_dir_ data member is added.
+  base::FilePath installation_dir_;
+#else
   base::FilePath crx_path_;
+#endif
 
 #if defined(STARBOARD)
   int installation_index_ = IM_EXT_INVALID_INDEX;
diff --git a/components/update_client/component_patcher_operation.cc b/components/update_client/component_patcher_operation.cc
index 01ec312..0d957e2 100644
--- a/components/update_client/component_patcher_operation.cc
+++ b/components/update_client/component_patcher_operation.cc
@@ -101,9 +101,15 @@
 // Uses the hash as a checksum to confirm that the file now residing in the
 // output directory probably has the contents it should.
 UnpackerError DeltaUpdateOp::CheckHash() {
+#if defined(IN_MEMORY_UPDATES)
+  CHECK(false) << "Delta updates not supported for in-memory updates, or "
+               << "for that matter Cobalt";
+  return UnpackerError::kDeltaUnsupportedCommand;
+#else
   return VerifyFileHash256(output_abs_path_, output_sha256_)
              ? UnpackerError::kNone
              : UnpackerError::kDeltaVerificationFailure;
+#endif
 }
 
 DeltaUpdateOpCopy::DeltaUpdateOpCopy() {}
diff --git a/components/update_client/component_unpacker.cc b/components/update_client/component_unpacker.cc
index f76cb6a..6a1db54 100644
--- a/components/update_client/component_unpacker.cc
+++ b/components/update_client/component_unpacker.cc
@@ -32,13 +32,23 @@
 ComponentUnpacker::Result::Result() {}
 
 ComponentUnpacker::ComponentUnpacker(const std::vector<uint8_t>& pk_hash,
+#if defined(IN_MEMORY_UPDATES)
+                                     const std::string* crx_str,
+                                     const base::FilePath& installation_dir,
+#else
                                      const base::FilePath& path,
+#endif
                                      scoped_refptr<CrxInstaller> installer,
                                      std::unique_ptr<Unzipper> unzipper,
                                      scoped_refptr<Patcher> patcher,
                                      crx_file::VerifierFormat crx_format)
     : pk_hash_(pk_hash),
+#if defined(IN_MEMORY_UPDATES)
+      crx_str_(*crx_str),
+      installation_dir_(installation_dir),
+#else
       path_(path),
+#endif
       is_delta_(false),
       installer_(installer),
       unzipper_(std::move(unzipper)),
@@ -56,17 +66,29 @@
 }
 
 bool ComponentUnpacker::Verify() {
+#if defined(IN_MEMORY_UPDATES)
+  VLOG(1) << "Verifying component";
+#else
   VLOG(1) << "Verifying component: " << path_.value();
+#endif
 
+#if !defined(IN_MEMORY_UPDATES)
   if (path_.empty()) {
     error_ = UnpackerError::kInvalidParams;
     return false;
   }
+#endif
   std::vector<std::vector<uint8_t>> required_keys;
   if (!pk_hash_.empty())
     required_keys.push_back(pk_hash_);
   const crx_file::VerifierResult result =
-      crx_file::Verify(path_, crx_format_, required_keys,
+      crx_file::Verify(
+#if defined(IN_MEMORY_UPDATES)
+                       crx_str_,
+#else
+                       path_,
+#endif
+                       crx_format_, required_keys,
                        std::vector<uint8_t>(), &public_key_, nullptr);
   if (result != crx_file::VerifierResult::OK_FULL &&
       result != crx_file::VerifierResult::OK_DELTA) {
@@ -76,7 +98,11 @@
     return false;
   }
   is_delta_ = result == crx_file::VerifierResult::OK_DELTA;
+#if defined(IN_MEMORY_UPDATES)
+  VLOG(1) << "Verification successful";
+#else
   VLOG(1) << "Verification successful: " << path_.value();
+#endif
   return true;
 }
 
@@ -91,14 +117,23 @@
     error_ = UnpackerError::kUnzipPathError;
     return false;
   }
-#else
+#else  // !defined(STARBOARD)
+#if defined(IN_MEMORY_UPDATES)
+  destination = installation_dir_;
+#else  // defined(IN_MEMORY_UPDATES)
   // The directory of path_ is the installation slot.
   destination = path_.DirName();
+#endif  // defined(IN_MEMORY_UPDATES)
+#endif  // !defined(STARBOARD)
 
-#endif
   VLOG(1) << "Unpacking in: " << destination.value();
+#if defined(IN_MEMORY_UPDATES)
+  unzipper_->Unzip(crx_str_, destination,
+                   base::BindOnce(&ComponentUnpacker::EndUnzipping, this));
+#else
   unzipper_->Unzip(path_, destination,
                    base::BindOnce(&ComponentUnpacker::EndUnzipping, this));
+#endif
 
   return true;
 }
diff --git a/components/update_client/component_unpacker.h b/components/update_client/component_unpacker.h
index fccf44b..bb979ae 100644
--- a/components/update_client/component_unpacker.h
+++ b/components/update_client/component_unpacker.h
@@ -88,6 +88,7 @@
   // |pk_hash| is the expected public developer key's SHA256 hash. If empty,
   // the unpacker accepts any developer key. |path| is the current location
   // of the CRX.
+#if !defined(IN_MEMORY_UPDATES)
   ComponentUnpacker(const std::vector<uint8_t>& pk_hash,
                     const base::FilePath& path,
                     scoped_refptr<CrxInstaller> installer,
@@ -95,6 +96,20 @@
                     scoped_refptr<Patcher> patcher,
                     crx_file::VerifierFormat crx_format);
 
+#else
+  // An overload where |crx_str| currently holds the CRX in memory and
+  // |installation_dir| is the location where the CRX should be unpacked to.
+  // Does not take ownership of |crx_str|, which must refer to a valid string
+  // that outlives this object.
+  ComponentUnpacker(const std::vector<uint8_t>& pk_hash,
+                    const std::string* crx_str,
+                    const base::FilePath& installation_dir,
+                    scoped_refptr<CrxInstaller> installer,
+                    std::unique_ptr<Unzipper> unzipper,
+                    scoped_refptr<Patcher> patcher,
+                    crx_file::VerifierFormat crx_format);
+#endif
+
   // Begins the actual unpacking of the files. May invoke a patcher and the
   // component installer if the package is a differential update.
   // Calls |callback| with the result.
@@ -128,7 +143,12 @@
   void EndUnpacking();
 
   std::vector<uint8_t> pk_hash_;
+#if defined(IN_MEMORY_UPDATES)
+  const std::string& crx_str_;
+  base::FilePath installation_dir_;
+#else
   base::FilePath path_;
+#endif
   base::FilePath unpack_path_;
   base::FilePath unpack_diff_path_;
   bool is_delta_;
diff --git a/components/update_client/component_unpacker_unittest.cc b/components/update_client/component_unpacker_unittest.cc
index 617abcb..19778ea 100644
--- a/components/update_client/component_unpacker_unittest.cc
+++ b/components/update_client/component_unpacker_unittest.cc
@@ -101,6 +101,7 @@
   main_thread_task_runner_->PostTask(FROM_HERE, std::move(quit_closure_));
 }
 
+#if !defined(IN_MEMORY_UPDATES)
 TEST_F(ComponentUnpackerTest, UnpackFullCrx) {
   auto config = base::MakeRefCounted<TestConfigurator>();
   scoped_refptr<ComponentUnpacker> component_unpacker =
@@ -171,5 +172,8 @@
 
   EXPECT_TRUE(result_.unpack_path.empty());
 }
+// TODO(b/290410288): write tests targeting the version of ComponentUnpacker
+// that unpacks a Crx from memory.
+#endif
 
 }  // namespace update_client
diff --git a/components/update_client/crx_downloader.cc b/components/update_client/crx_downloader.cc
index 4a7c36d..133f4ab 100644
--- a/components/update_client/crx_downloader.cc
+++ b/components/update_client/crx_downloader.cc
@@ -94,19 +94,34 @@
 
 void CrxDownloader::StartDownloadFromUrl(const GURL& url,
                                          const std::string& expected_hash,
+#if defined(IN_MEMORY_UPDATES)
+                                         std::string* dst,
+#endif
                                          DownloadCallback download_callback) {
 #if defined(STARBOARD)
   LOG(INFO) << "CrxDownloader::StartDownloadFromUrl: url=" << url;
 #endif
+
   std::vector<GURL> urls;
   urls.push_back(url);
+#if defined(IN_MEMORY_UPDATES)
+  CHECK(dst != nullptr);
+  StartDownload(urls, expected_hash, dst, std::move(download_callback));
+#else
   StartDownload(urls, expected_hash, std::move(download_callback));
+#endif
 }
 
 void CrxDownloader::StartDownload(const std::vector<GURL>& urls,
                                   const std::string& expected_hash,
+#if defined(IN_MEMORY_UPDATES)
+                                  std::string* dst,
+#endif
                                   DownloadCallback download_callback) {
   DCHECK(thread_checker_.CalledOnValidThread());
+#if defined(IN_MEMORY_UPDATES)
+  CHECK(dst != nullptr);
+#endif
 
   auto error = CrxDownloaderError::NONE;
   if (urls.empty()) {
@@ -123,12 +138,20 @@
     return;
   }
 
+#if defined(IN_MEMORY_UPDATES)
+  dst_str_ = dst;
+#endif
+
   urls_ = urls;
   expected_hash_ = expected_hash;
   current_url_ = urls_.begin();
   download_callback_ = std::move(download_callback);
 
+#if defined(IN_MEMORY_UPDATES)
+  DoStartDownload(*current_url_, dst);
+#else
   DoStartDownload(*current_url_);
+#endif
 }
 
 #if defined(STARBOARD)
@@ -178,7 +201,12 @@
 #if defined(STARBOARD)
   LOG(INFO) << "CrxDownloader::VerifyResponse";
 #endif
+
+#if defined(IN_MEMORY_UPDATES)
+  if (VerifyHash256(dst_str_, expected_hash_)) {
+#else
   if (VerifyFileHash256(result.response, expected_hash_)) {
+#endif
     download_metrics_.push_back(download_metrics);
     main_task_runner()->PostTask(
         FROM_HERE, base::BindOnce(std::move(download_callback_), result));
@@ -191,11 +219,16 @@
   result.error = static_cast<int>(CrxDownloaderError::BAD_HASH);
   download_metrics.error = result.error;
 #if defined(STARBOARD)
+#if !defined(IN_MEMORY_UPDATES)
   base::DeleteFile(result.response, false);
-#else
+#endif  // !defined(IN_MEMORY_UPDATES)
+#else  // defined(STARBOARD)
   DeleteFileAndEmptyParentDirectory(result.response);
-#endif
+#endif  // defined(STARBOARD)
+
+#if !defined(IN_MEMORY_UPDATES)
   result.response.clear();
+#endif
 
   main_task_runner()->PostTask(
       FROM_HERE, base::BindOnce(&CrxDownloader::HandleDownloadError,
@@ -209,7 +242,9 @@
     const DownloadMetrics& download_metrics) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK_NE(0, result.error);
+#if !defined(IN_MEMORY_UPDATES)
   DCHECK(result.response.empty());
+#endif
   DCHECK_NE(0, download_metrics.error);
 
 #if defined(STARBOARD)
@@ -235,14 +270,27 @@
 
     // Try downloading from another url from the list.
     if (current_url_ != urls_.end()) {
+#if defined(IN_MEMORY_UPDATES)
+      // TODO(b/158043520): manually test that Cobalt can update using a
+      // successor URL when an error occurs on the first URL, and/or consider
+      // adding an Evergreen end-to-end test case for this behavior. This is
+      // important since the unit tests are currently disabled (b/290410288).
+      DoStartDownload(*current_url_, dst_str_);
+#else
       DoStartDownload(*current_url_);
+#endif
       return;
     }
 
     // Try downloading using the next downloader.
     if (successor_ && !urls_.empty()) {
+#if defined(IN_MEMORY_UPDATES)
+      successor_->StartDownload(urls_, expected_hash_, dst_str_,
+                                std::move(download_callback_));
+#else
       successor_->StartDownload(urls_, expected_hash_,
                                 std::move(download_callback_));
+#endif
       return;
     }
 
diff --git a/components/update_client/crx_downloader.h b/components/update_client/crx_downloader.h
index 76c2e6a..03da88a 100644
--- a/components/update_client/crx_downloader.h
+++ b/components/update_client/crx_downloader.h
@@ -66,8 +66,13 @@
     int installation_index = IM_EXT_INVALID_INDEX;
 #endif
 
+#if defined(IN_MEMORY_UPDATES)
+    // Path where the contents of the downloaded Crx should later be installed.
+    base::FilePath installation_dir;
+#else
     // Path of the downloaded file if the download was successful.
     base::FilePath response;
+#endif
   };
 
   // The callback fires only once, regardless of how many urls are tried, and
@@ -115,6 +120,7 @@
   // behavior is undefined. The callback gets invoked if the download can't
   // be started. |expected_hash| represents the SHA256 cryptographic hash of
   // the download payload, represented as a hexadecimal string.
+#if !defined(IN_MEMORY_UPDATES)
   void StartDownloadFromUrl(const GURL& url,
                             const std::string& expected_hash,
                             DownloadCallback download_callback);
@@ -122,6 +128,21 @@
                      const std::string& expected_hash,
                      DownloadCallback download_callback);
 
+#else
+  // Overloads where |dst| points to a string that the Crx package should be
+  // downloaded to.
+  // These functions do not take ownership of |dst|, which must refer to a valid
+  // string that outlives this object.
+  void StartDownloadFromUrl(const GURL& url,
+                            const std::string& expected_hash,
+                            std::string* dst,
+                            DownloadCallback download_callback);
+  void StartDownload(const std::vector<GURL>& urls,
+                     const std::string& expected_hash,
+                     std::string* dst,
+                     DownloadCallback download_callback);
+#endif
+
 #if defined(STARBOARD)
   void CancelDownload();
 #endif
@@ -154,7 +175,11 @@
   }
 
  private:
+#if defined(IN_MEMORY_UPDATES)
+  virtual void DoStartDownload(const GURL& url, std::string* dst) = 0;
+#else
   virtual void DoStartDownload(const GURL& url) = 0;
+#endif
 #if defined(STARBOARD)
   virtual void DoCancelDownload() = 0;
 #endif
@@ -184,6 +209,10 @@
 
   std::vector<DownloadMetrics> download_metrics_;
 
+#if defined(IN_MEMORY_UPDATES)
+  std::string* dst_str_;  // not owned, can't be null
+#endif
+
   DISALLOW_COPY_AND_ASSIGN(CrxDownloader);
 };
 
diff --git a/components/update_client/crx_downloader_unittest.cc b/components/update_client/crx_downloader_unittest.cc
index 1ff4634..22f29a2 100644
--- a/components/update_client/crx_downloader_unittest.cc
+++ b/components/update_client/crx_downloader_unittest.cc
@@ -233,6 +233,7 @@
   base::RunLoop().RunUntilIdle();
 }
 
+#if !defined(IN_MEMORY_UPDATES)
 // Tests that starting a download without a url results in an error.
 TEST_F(CrxDownloaderTest, NoUrl) {
   std::vector<GURL> urls;
@@ -498,5 +499,8 @@
   EXPECT_EQ(-1, download_metrics[1].downloaded_bytes);
   EXPECT_EQ(-1, download_metrics[1].total_bytes);
 }
+// TODO(b/290410288): write tests targeting the overload of StartDownload() that
+// downloads to a string.
+#endif
 
 }  // namespace update_client
diff --git a/components/update_client/net/network_impl_cobalt.cc b/components/update_client/net/network_impl_cobalt.cc
index feada05..853d2de 100644
--- a/components/update_client/net/network_impl_cobalt.cc
+++ b/components/update_client/net/network_impl_cobalt.cc
@@ -106,6 +106,36 @@
   url_fetcher_->Start();
 }
 
+#if defined(IN_MEMORY_UPDATES)
+void NetworkFetcherCobaltImpl::DownloadToString(
+    const GURL& url,
+    std::string* dst,
+    ResponseStartedCallback response_started_callback,
+    ProgressCallback progress_callback,
+    DownloadToStringCompleteCallback download_to_string_complete_callback) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  LOG(INFO) << "cobalt::updater::NetworkFetcher::DownloadToString";
+  LOG(INFO) << "DownloadToString url = " << url;
+
+  CHECK(dst != nullptr);
+  dst_str_ = dst;
+
+  response_started_callback_ = std::move(response_started_callback);
+  progress_callback_ = std::move(progress_callback);
+  download_to_string_complete_callback_ =
+      std::move(download_to_string_complete_callback);
+
+  CreateUrlFetcher(url, net::URLFetcher::GET);
+
+  url_fetcher_->SaveResponseToLargeString();
+
+  url_fetcher_type_ = kUrlFetcherTypeDownloadToString;
+
+  url_fetcher_->Start();
+}
+
+#else
 void NetworkFetcherCobaltImpl::DownloadToFile(
     const GURL& url,
     const base::FilePath& file_path,
@@ -131,6 +161,7 @@
 
   url_fetcher_->Start();
 }
+#endif
 
 void NetworkFetcherCobaltImpl::Cancel() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -156,9 +187,15 @@
   const int response_code = source->GetResponseCode();
   if (url_fetcher_type_ == kUrlFetcherTypePostRequest) {
     OnPostRequestComplete(source, status.error());
+#if defined(IN_MEMORY_UPDATES)
+  } else if (url_fetcher_type_ == kUrlFetcherTypeDownloadToString) {
+    OnDownloadToStringComplete(source, status.error());
+  }
+#else
   } else if (url_fetcher_type_ == kUrlFetcherTypeDownloadToFile) {
     OnDownloadToFileComplete(source, status.error());
   }
+#endif
 
   if (!status.is_success() || !IsResponseCodeSuccess(response_code)) {
     std::string msg(base::StringPrintf(
@@ -227,6 +264,21 @@
                           update_client::NetworkFetcher::kHeaderXRetryAfter));
 }
 
+#if defined(IN_MEMORY_UPDATES)
+void NetworkFetcherCobaltImpl::OnDownloadToStringComplete(
+    const net::URLFetcher* source,
+    const int status_error) {
+  if (!source->GetResponseAsLargeString(dst_str_)) {
+    LOG(ERROR) << "DownloadToString failed to get response from a string";
+  }
+
+  std::move(download_to_string_complete_callback_)
+      .Run(dst_str_, status_error,
+           source->GetResponseHeaders()
+               ? source->GetResponseHeaders()->GetContentLength()
+               : -1);
+}
+#else
 void NetworkFetcherCobaltImpl::OnDownloadToFileComplete(
     const net::URLFetcher* source,
     const int status_error) {
@@ -242,6 +294,7 @@
                ? source->GetResponseHeaders()->GetContentLength()
                : -1);
 }
+#endif
 
 NetworkFetcherCobaltImpl::ReturnWrapper NetworkFetcherCobaltImpl::HandleError(
     const std::string& message) {
diff --git a/components/update_client/net/network_impl_cobalt.h b/components/update_client/net/network_impl_cobalt.h
index 742e8ea..d6181ad 100644
--- a/components/update_client/net/network_impl_cobalt.h
+++ b/components/update_client/net/network_impl_cobalt.h
@@ -39,7 +39,11 @@
 
 typedef enum UrlFetcherType {
   kUrlFetcherTypePostRequest,
+#if defined(IN_MEMORY_UPDATES)
+  kUrlFetcherTypeDownloadToString,
+#else
   kUrlFetcherTypeDownloadToFile,
+#endif
 } UrlFetcherType;
 
 class NetworkFetcherCobaltImpl : public NetworkFetcher,
@@ -50,8 +54,13 @@
   using ProgressCallback = update_client::NetworkFetcher::ProgressCallback;
   using PostRequestCompleteCallback =
       update_client::NetworkFetcher::PostRequestCompleteCallback;
+#if defined(IN_MEMORY_UPDATES)
+  using DownloadToStringCompleteCallback =
+      update_client::NetworkFetcher::DownloadToStringCompleteCallback;
+#else
   using DownloadToFileCompleteCallback =
       update_client::NetworkFetcher::DownloadToFileCompleteCallback;
+#endif
 
   explicit NetworkFetcherCobaltImpl(
       const cobalt::network::NetworkModule* network_module);
@@ -65,12 +74,23 @@
       ResponseStartedCallback response_started_callback,
       ProgressCallback progress_callback,
       PostRequestCompleteCallback post_request_complete_callback) override;
+#if defined(IN_MEMORY_UPDATES)
+  // Does not take ownership of |dst|, which must refer to a valid string that
+  // outlives this object.
+  void DownloadToString(const GURL& url,
+                        std::string* dst,
+                        ResponseStartedCallback response_started_callback,
+                        ProgressCallback progress_callback,
+                        DownloadToStringCompleteCallback
+                            download_to_string_complete_callback) override;
+#else
   void DownloadToFile(const GURL& url,
                       const base::FilePath& file_path,
                       ResponseStartedCallback response_started_callback,
                       ProgressCallback progress_callback,
                       DownloadToFileCompleteCallback
                           download_to_file_complete_callback) override;
+#endif
   void Cancel() override;
 
   // net::URLFetcherDelegate interface.
@@ -100,8 +120,14 @@
 
   void OnPostRequestComplete(const net::URLFetcher* source,
                              const int status_error);
+
+#if defined(IN_MEMORY_UPDATES)
+  void OnDownloadToStringComplete(const net::URLFetcher* source,
+                                  const int status_error);
+#else
   void OnDownloadToFileComplete(const net::URLFetcher* source,
                                 const int status_error);
+#endif
 
   static constexpr int kMaxRetriesOnNetworkChange = 3;
 
@@ -114,7 +140,12 @@
   ResponseStartedCallback response_started_callback_;
   ProgressCallback progress_callback_;
   PostRequestCompleteCallback post_request_complete_callback_;
+#if defined(IN_MEMORY_UPDATES)
+  DownloadToStringCompleteCallback download_to_string_complete_callback_;
+  std::string* dst_str_;  // not owned, can't be null
+#else
   DownloadToFileCompleteCallback download_to_file_complete_callback_;
+#endif
 
   const cobalt::network::NetworkModule* network_module_;
 
diff --git a/components/update_client/network.h b/components/update_client/network.h
index cf884b5..b6b179d 100644
--- a/components/update_client/network.h
+++ b/components/update_client/network.h
@@ -30,8 +30,13 @@
                               int net_error,
                               const std::string& header_etag,
                               int64_t xheader_retry_after_sec)>;
+#if defined(IN_MEMORY_UPDATES)
+  using DownloadToStringCompleteCallback = base::OnceCallback<
+      void(std::string* dst, int net_error, int64_t content_size)>;
+#else
   using DownloadToFileCompleteCallback = base::OnceCallback<
       void(base::FilePath path, int net_error, int64_t content_size)>;
+#endif
   using ResponseStartedCallback = base::OnceCallback<
       void(const GURL& final_url, int response_code, int64_t content_length)>;
   using ProgressCallback = base::RepeatingCallback<void(int64_t current)>;
@@ -57,12 +62,24 @@
       ResponseStartedCallback response_started_callback,
       ProgressCallback progress_callback,
       PostRequestCompleteCallback post_request_complete_callback) = 0;
+#if defined(IN_MEMORY_UPDATES)
+  // Does not take ownership of |dst|, which must refer to a valid string that
+  // outlives this object.
+  virtual void DownloadToString(
+      const GURL& url,
+      std::string* dst,
+      ResponseStartedCallback response_started_callback,
+      ProgressCallback progress_callback,
+      DownloadToStringCompleteCallback download_to_string_complete_callback) = 0;
+#else
   virtual void DownloadToFile(
       const GURL& url,
       const base::FilePath& file_path,
       ResponseStartedCallback response_started_callback,
       ProgressCallback progress_callback,
       DownloadToFileCompleteCallback download_to_file_complete_callback) = 0;
+#endif
+
 #if defined(STARBOARD)
   virtual void Cancel() = 0;
 #endif
diff --git a/components/update_client/persisted_data.cc b/components/update_client/persisted_data.cc
index 0e80750..bf922fd 100644
--- a/components/update_client/persisted_data.cc
+++ b/components/update_client/persisted_data.cc
@@ -87,6 +87,16 @@
 std::string PersistedData::GetUpdaterChannel(const std::string& id) const {
   return GetString(id, "updaterchannel");
 }
+std::string PersistedData::GetLatestChannel() const {
+  const base::DictionaryValue* dict =
+      pref_service_->GetDictionary(kPersistedDataPreference);
+  if (!dict)
+    return std::string();
+  std::string result;
+  return dict->GetString("latestchannel", &result)
+             ? result
+             : std::string();
+}
 #endif
 
 std::string PersistedData::GetCohort(const std::string& id) const {
@@ -153,6 +163,13 @@
                                       const std::string& channel) {
   SetString(id, "updaterchannel", channel);
 }
+void PersistedData::SetLatestChannel(const std::string& channel) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  if (!pref_service_)
+    return;
+  DictionaryPrefUpdate update(pref_service_, kPersistedDataPreference);
+  update->SetString("latestchannel", channel);
+}
 #endif
 
 void PersistedData::SetCohort(const std::string& id,
diff --git a/components/update_client/persisted_data.h b/components/update_client/persisted_data.h
index a59b92c..6a35594 100644
--- a/components/update_client/persisted_data.h
+++ b/components/update_client/persisted_data.h
@@ -59,6 +59,9 @@
   // Returns the updater channel that is set for the specified |id|. ""
   // indicates that there is no recorded updater channel value for the |id|.
   std::string GetUpdaterChannel(const std::string& id) const;
+
+  // Returns the updater channel for the previous app startup.
+  std::string GetLatestChannel() const;
 #endif
 
   // Returns the PingFreshness (a random token that is written into the profile
@@ -89,6 +92,9 @@
 
   // Records the updater channel that is set for the specified |id|.
   void SetUpdaterChannel(const std::string& id, const std::string& channel);
+
+  // Records the latest channel the app is on.
+  void SetLatestChannel(const std::string& channel);
 #endif
 
   // This is called only via update_client's RegisterUpdateClientPreferences.
diff --git a/components/update_client/url_fetcher_downloader.cc b/components/update_client/url_fetcher_downloader.cc
index 1ae692c..1607967 100644
--- a/components/update_client/url_fetcher_downloader.cc
+++ b/components/update_client/url_fetcher_downloader.cc
@@ -85,36 +85,56 @@
 UrlFetcherDownloader::~UrlFetcherDownloader() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 #if defined(STARBOARD)
-  LOG(INFO) << "UrlFetcherDownloader::UrlFetcherDownloader";
+  LOG(INFO) << "UrlFetcherDownloader::~UrlFetcherDownloader";
 #endif
 }
 
 #if defined(STARBOARD)
+#if defined(IN_MEMORY_UPDATES)
+void UrlFetcherDownloader::ConfirmSlot(const GURL& url, std::string* dst) {
+#else  // defined(IN_MEMORY_UPDATES)
 void UrlFetcherDownloader::ConfirmSlot(const GURL& url) {
+#endif  // defined(IN_MEMORY_UPDATES)
   LOG(INFO) << "UrlFetcherDownloader::ConfirmSlot: url=" << url;
   if (is_cancelled_) {
     LOG(ERROR) << "UrlFetcherDownloader::ConfirmSlot: Download already cancelled";
     ReportDownloadFailure(url);
     return;
   }
+#if defined(IN_MEMORY_UPDATES)
+  if (!cobalt_slot_management_.ConfirmSlot(installation_dir_)) {
+#else  // defined(IN_MEMORY_UPDATES)
   if (!cobalt_slot_management_.ConfirmSlot(download_dir_)) {
+#endif  // defined(IN_MEMORY_UPDATES)
     ReportDownloadFailure(url, CrxDownloaderError::SLOT_UNAVAILABLE);
     return;
   }
 
   base::SequencedTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(&UrlFetcherDownloader::StartURLFetch,
+#if defined(IN_MEMORY_UPDATES)
+                                base::Unretained(this), url, dst));
+#else  // defined(IN_MEMORY_UPDATES)
                                 base::Unretained(this), url));
+#endif  // defined(IN_MEMORY_UPDATES)
 }
 
+#if defined(IN_MEMORY_UPDATES)
+void UrlFetcherDownloader::SelectSlot(const GURL& url, std::string* dst) {
+#else  // defined(IN_MEMORY_UPDATES)
 void UrlFetcherDownloader::SelectSlot(const GURL& url) {
+#endif  // defined(IN_MEMORY_UPDATES)
   LOG(INFO) << "UrlFetcherDownloader::SelectSlot: url=" << url;
   if (is_cancelled_) {
     LOG(ERROR) << "UrlFetcherDownloader::SelectSlot: Download already cancelled";
     ReportDownloadFailure(url);
     return;
   }
+#if defined(IN_MEMORY_UPDATES)
+  if (!cobalt_slot_management_.SelectSlot(&installation_dir_)) {
+#else  // defined(IN_MEMORY_UPDATES)
   if (!cobalt_slot_management_.SelectSlot(&download_dir_)) {
+#endif  // defined(IN_MEMORY_UPDATES)
     ReportDownloadFailure(url, CrxDownloaderError::SLOT_UNAVAILABLE);
     return;
   }
@@ -125,12 +145,20 @@
   base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE,
       base::BindOnce(&UrlFetcherDownloader::ConfirmSlot, base::Unretained(this),
+#if defined(IN_MEMORY_UPDATES)
+                     url, dst),
+#else  // defined(IN_MEMORY_UPDATES)
                      url),
+#endif  // defined(IN_MEMORY_UPDATES)
       base::TimeDelta::FromSeconds(15));
 }
-#endif
+#endif  // defined(STARBOARD)
 
+#if defined(IN_MEMORY_UPDATES)
+void UrlFetcherDownloader::DoStartDownload(const GURL& url, std::string* dst) {
+#else  // defined(IN_MEMORY_UPDATES)
 void UrlFetcherDownloader::DoStartDownload(const GURL& url) {
+#endif  // defined(IN_MEMORY_UPDATES)
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
 #if defined(STARBOARD)
@@ -154,15 +182,19 @@
   }
   base::SequencedTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(&UrlFetcherDownloader::SelectSlot,
+#if defined(IN_MEMORY_UPDATES)
+                                base::Unretained(this), url, dst));
+#else  // defined(IN_MEMORY_UPDATES)
                                 base::Unretained(this), url));
-#else
+#endif  // defined(IN_MEMORY_UPDATES)
+#else  // defined(STARBOARD)
   base::PostTaskWithTraitsAndReply(
       FROM_HERE, kTaskTraits,
       base::BindOnce(&UrlFetcherDownloader::CreateDownloadDir,
                      base::Unretained(this)),
       base::BindOnce(&UrlFetcherDownloader::StartURLFetch,
                      base::Unretained(this), url));
-#endif
+#endif  // defined(STARBOARD)
 }
 
 #if defined(STARBOARD)
@@ -176,10 +208,12 @@
 }
 #endif
 
+#if !defined(IN_MEMORY_UPDATES)
 void UrlFetcherDownloader::CreateDownloadDir() {
   base::CreateNewTempDirectory(FILE_PATH_LITERAL("chrome_url_fetcher_"),
                                &download_dir_);
 }
+#endif
 
 #if defined(STARBOARD)
 void UrlFetcherDownloader::ReportDownloadFailure(const GURL& url) {
@@ -217,30 +251,60 @@
                      base::Unretained(this), false, result, download_metrics));
 }
 
+#if defined(IN_MEMORY_UPDATES)
+void UrlFetcherDownloader::StartURLFetch(const GURL& url, std::string* dst) {
+#else
 void UrlFetcherDownloader::StartURLFetch(const GURL& url) {
+#endif
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+#if defined(IN_MEMORY_UPDATES)
+  CHECK(dst != nullptr);
+#endif
 
 #if defined(STARBOARD)
   LOG(INFO) << "UrlFetcherDownloader::StartURLFetch: url" << url
+#if defined(IN_MEMORY_UPDATES)
+               << " installation_dir=" << installation_dir_;
+#else  // defined(IN_MEMORY_UPDATES)
                << " download_dir=" << download_dir_;
+#endif  // defined(IN_MEMORY_UPDATES)
   if (is_cancelled_) {
     LOG(ERROR) << "UrlFetcherDownloader::StartURLFetch: Download already cancelled";
     ReportDownloadFailure(url);
     return;
   }
-#endif
+#endif  // defined(STARBOARD)
 
+#if defined(IN_MEMORY_UPDATES)
+  if (installation_dir_.empty()) {
+#else
   if (download_dir_.empty()) {
+#endif
 #if defined(STARBOARD)
     LOG(ERROR) << "UrlFetcherDownloader::StartURLFetch: failed with empty "
-                     "download_dir";
-#endif
+#if defined(IN_MEMORY_UPDATES)
+               << "installation_dir";
+#else  // defined(IN_MEMORY_UPDATES)
+               << "download_dir";
+#endif  // defined(IN_MEMORY_UPDATES)
+#endif  // defined(STARBOARD)
     ReportDownloadFailure(url);
     return;
   }
 
-  const auto file_path = download_dir_.AppendASCII(url.ExtractFileName());
   network_fetcher_ = network_fetcher_factory_->Create();
+#if defined(IN_MEMORY_UPDATES)
+  network_fetcher_->DownloadToString(
+      url,
+      dst,
+      base::BindOnce(&UrlFetcherDownloader::OnResponseStarted,
+                     base::Unretained(this)),
+      base::BindRepeating(&UrlFetcherDownloader::OnDownloadProgress,
+                          base::Unretained(this)),
+      base::BindOnce(&UrlFetcherDownloader::OnNetworkFetcherComplete,
+                     base::Unretained(this)));
+#else
+  const auto file_path = download_dir_.AppendASCII(url.ExtractFileName());
   network_fetcher_->DownloadToFile(
       url, file_path,
       base::BindOnce(&UrlFetcherDownloader::OnResponseStarted,
@@ -249,13 +313,19 @@
                           base::Unretained(this)),
       base::BindOnce(&UrlFetcherDownloader::OnNetworkFetcherComplete,
                      base::Unretained(this)));
+#endif
 
   download_start_time_ = base::TimeTicks::Now();
 }
 
-void UrlFetcherDownloader::OnNetworkFetcherComplete(base::FilePath file_path,
-                                                    int net_error,
-                                                    int64_t content_size) {
+void UrlFetcherDownloader::OnNetworkFetcherComplete(
+#if defined(IN_MEMORY_UPDATES)
+    std::string* dst,
+#else
+    base::FilePath file_path,
+#endif
+    int net_error,
+    int64_t content_size) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
 #if defined(STARBOARD)
@@ -273,8 +343,12 @@
   // is not accepting requests for the moment.
   int error = -1;
 #if defined(STARBOARD)
+#if defined(IN_MEMORY_UPDATES)
+  if (response_code_ == 200 && net_error == 0) {
+#else  // defined(IN_MEMORY_UPDATES)
   if (!file_path.empty() && response_code_ == 200 && net_error == 0) {
-#else
+#endif  // defined(IN_MEMORY_UPDATES)
+#else  // defined(STARBOARD)
   if (!file_path.empty() && response_code_ == 200) {
 #endif
     DCHECK_EQ(0, net_error);
@@ -290,7 +364,11 @@
   Result result;
   result.error = error;
   if (!error) {
+#if defined(IN_MEMORY_UPDATES)
+    result.installation_dir = installation_dir_;
+#else
     result.response = file_path;
+#endif
 #if defined(STARBOARD)
     result.installation_index = cobalt_slot_management_.GetInstallationIndex();
 #endif
@@ -307,20 +385,26 @@
 
   VLOG(1) << "Downloaded " << content_size << " bytes in "
           << download_time.InMilliseconds() << "ms from " << final_url_.spec()
+#if defined(IN_MEMORY_UPDATES)
+          << " to string";
+#else
           << " to " << result.response.value();
+#endif
 
+#if !defined(IN_MEMORY_UPDATES)
 #if !defined(STARBOARD)
   // Delete the download directory in the error cases.
   if (error && !download_dir_.empty())
     base::PostTaskWithTraits(
         FROM_HERE, kTaskTraits,
         base::BindOnce(IgnoreResult(&base::DeleteFile), download_dir_, true));
-#else
+#else  // defined(STARBOARD)
   if (error && !download_dir_.empty()) {
     // Cleanup the download dir.
     CleanupDirectory(download_dir_);
   }
-#endif
+#endif  // defined(STARBOARD)
+#endif  // !defined(IN_MEMORY_UPDATES)
 
   main_task_runner()->PostTask(
       FROM_HERE, base::BindOnce(&UrlFetcherDownloader::OnDownloadComplete,
diff --git a/components/update_client/url_fetcher_downloader.h b/components/update_client/url_fetcher_downloader.h
index 3adc4c2..f593e63 100644
--- a/components/update_client/url_fetcher_downloader.h
+++ b/components/update_client/url_fetcher_downloader.h
@@ -41,21 +41,60 @@
 
  private:
   // Overrides for CrxDownloader.
+#if defined(IN_MEMORY_UPDATES)
+  void DoStartDownload(const GURL& url, std::string* dst) override;
+#else
   void DoStartDownload(const GURL& url) override;
+#endif
 #if defined(STARBOARD)
   void DoCancelDownload() override;
 #endif
 
+#if !defined(IN_MEMORY_UPDATES)
   void CreateDownloadDir();
+#endif
+#if defined(IN_MEMORY_UPDATES)
+  // Does not take ownership of |dst|, which must refer to a valid string that
+  // outlives this object.
+  void StartURLFetch(const GURL& url, std::string* dst);
+#else
   void StartURLFetch(const GURL& url);
+#endif
 
 #if defined(STARBOARD)
+#if defined(IN_MEMORY_UPDATES)
+  // With in-memory updates it's no longer necessary to select and confirm the
+  // installation slot at download time, and it would likely be more clear to
+  // move this responsibility to the unpack flow. That said, yavor@ requested
+  // that we keep it here for now since there are a number of edge cases to
+  // consider and data races to avoid in this space (e.g., racing updaters). To
+  // limit the scope and risk of the in-memory updates changes we can leave it
+  // here for now and continue passing the installation dir on to the unpack
+  // flow, and consider changing this in a future refactoring.
+
+  // Does not take ownership of |dst|, which must refer to a valid string that
+  // outlives this object.
+  void SelectSlot(const GURL& url, std::string* dst);
+
+  // Does not take ownership of |dst|, which must refer to a valid string that
+  // outlives this object.
+  void ConfirmSlot(const GURL& url, std::string* dst);
+#else  // defined(IN_MEMORY_UPDATES)
   void SelectSlot(const GURL& url);
   void ConfirmSlot(const GURL& url);
-#endif
+#endif  // defined(IN_MEMORY_UPDATES)
+#endif  // defined(STARBOARD)
+#if defined(IN_MEMORY_UPDATES)
+  // Does not take ownership of |dst|, which must refer to a valid string that
+  // outlives this object.
+  void OnNetworkFetcherComplete(std::string* dst,
+                                int net_error,
+                                int64_t content_size);
+#else
   void OnNetworkFetcherComplete(base::FilePath file_path,
                                 int net_error,
                                 int64_t content_size);
+#endif
   void OnResponseStarted(const GURL& final_url,
                          int response_code,
                          int64_t content_length);
@@ -70,8 +109,15 @@
   scoped_refptr<NetworkFetcherFactory> network_fetcher_factory_;
   std::unique_ptr<NetworkFetcher> network_fetcher_;
 
+#if !defined(IN_MEMORY_UPDATES)
   // Contains a temporary download directory for the downloaded file.
   base::FilePath download_dir_;
+#else
+  // For legacy, file-system based updates the download_dir_ doubles as the
+  // installation dir. But for in-memory updates this directory only serves as
+  // the installation directory and should be named accordingly.
+  base::FilePath installation_dir_;
+#endif
 
   base::TimeTicks download_start_time_;
 
diff --git a/components/update_client/utils.cc b/components/update_client/utils.cc
index 2a9b45a..d0c49f2 100644
--- a/components/update_client/utils.cc
+++ b/components/update_client/utils.cc
@@ -64,6 +64,25 @@
 }
 
 #if defined(STARBOARD)
+#if defined(IN_MEMORY_UPDATES)
+bool VerifyHash256(const std::string* content,
+                   const std::string& expected_hash_str) {
+  std::vector<uint8_t> expected_hash;
+  if (!base::HexStringToBytes(expected_hash_str, &expected_hash) ||
+      expected_hash.size() != crypto::kSHA256Length) {
+    return false;
+  }
+
+  uint8_t actual_hash[crypto::kSHA256Length] = {0};
+  std::unique_ptr<crypto::SecureHash> hasher(
+      crypto::SecureHash::Create(crypto::SecureHash::SHA256));
+
+  hasher->Update(content->c_str(), content->size());
+  hasher->Finish(actual_hash, sizeof(actual_hash));
+
+  return memcmp(actual_hash, &expected_hash[0], sizeof(actual_hash)) == 0;
+}
+#else  // defined(IN_MEMORY_UPDATES)
 bool VerifyFileHash256(const base::FilePath& filepath,
                        const std::string& expected_hash_str) {
   std::vector<uint8_t> expected_hash;
@@ -106,7 +125,8 @@
 
   return memcmp(actual_hash, &expected_hash[0], sizeof(actual_hash)) == 0;
 }
-#else
+#endif  // defined(IN_MEMORY_UPDATES)
+#else  // defined(STARBOARD)
 bool VerifyFileHash256(const base::FilePath& filepath,
                        const std::string& expected_hash_str) {
   std::vector<uint8_t> expected_hash;
diff --git a/components/update_client/utils.h b/components/update_client/utils.h
index 8beebe8..b50839f 100644
--- a/components/update_client/utils.h
+++ b/components/update_client/utils.h
@@ -49,10 +49,18 @@
 // Returns a CRX id from a public key hash.
 std::string GetCrxIdFromPublicKeyHash(const std::vector<uint8_t>& pk_hash);
 
+#if defined(IN_MEMORY_UPDATES)
+// Returns true if the actual SHA-256 hash of |content| matches the
+// |expected_hash|.
+// |content| must refer to a valid string.
+bool VerifyHash256(const std::string* content,
+                   const std::string& expected_hash);
+#else
 // Returns true if the actual SHA-256 hash of the |filepath| matches the
 // |expected_hash|.
 bool VerifyFileHash256(const base::FilePath& filepath,
                        const std::string& expected_hash);
+#endif
 
 // Returns true if the |brand| parameter matches ^[a-zA-Z]{4}?$ .
 bool IsValidBrand(const std::string& brand);
diff --git a/components/update_client/utils_unittest.cc b/components/update_client/utils_unittest.cc
index 71a8b88..a022032 100644
--- a/components/update_client/utils_unittest.cc
+++ b/components/update_client/utils_unittest.cc
@@ -27,6 +27,7 @@
 
 namespace update_client {
 
+#if !defined(IN_MEMORY_UPDATES)
 TEST(UpdateClientUtils, VerifyFileHash256) {
   EXPECT_TRUE(VerifyFileHash256(
       MakeTestFilePath("jebgalgnebhfojomionfpkfelancnnkf.crx"),
@@ -46,6 +47,9 @@
       std::string(
           "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")));
 }
+// TODO(b/290410288): write a test targeting the string-based API,
+// VerifyHash256().
+#endif
 
 // Tests that the brand matches ^[a-zA-Z]{4}?$
 TEST(UpdateClientUtils, IsValidBrand) {
diff --git a/components/variations/BUILD.gn b/components/variations/BUILD.gn
index ad64baf..46eba0c 100644
--- a/components/variations/BUILD.gn
+++ b/components/variations/BUILD.gn
@@ -87,6 +87,17 @@
     ]
   }
 
+  if (use_cobalt_customizations) {
+      # Files with unused symbols. ex: base::FeatureList::RegisterFieldTrialOverride
+      # These files give linker errors about undefined symbols during modualr builds.   
+    sources -= [
+      "variations_seed_processor.cc",
+      "variations_seed_processor.h",
+      "variations_seed_simulator.cc",
+      "variations_seed_simulator.h",
+    ]
+  }
+
   if (!use_cobalt_customizations && (is_android || is_ios)) {
     sources += [
       "variations_request_scheduler_mobile.cc",
@@ -128,7 +139,6 @@
   }
 }
 
-# TODO(b/283258321): Re-enable as many tests as posible.
 if (!use_cobalt_customizations) {
   static_library("test_support") {
     testonly = true
diff --git a/content/browser/speech/audio_buffer.cc b/content/browser/speech/audio_buffer.cc
index 1038ac9..b109523 100644
--- a/content/browser/speech/audio_buffer.cc
+++ b/content/browser/speech/audio_buffer.cc
@@ -9,8 +9,7 @@
 namespace content {
 
 AudioChunk::AudioChunk(int bytes_per_sample)
-    : bytes_per_sample_(bytes_per_sample) {
-}
+    : bytes_per_sample_(bytes_per_sample) {}
 
 AudioChunk::AudioChunk(size_t length, int bytes_per_sample)
     : data_string_(length, '\0'), bytes_per_sample_(bytes_per_sample) {
@@ -46,8 +45,7 @@
 
 AudioBuffer::AudioBuffer(int bytes_per_sample)
     : bytes_per_sample_(bytes_per_sample) {
-  DCHECK(bytes_per_sample == 1 ||
-         bytes_per_sample == 2 ||
+  DCHECK(bytes_per_sample == 1 || bytes_per_sample == 2 ||
          bytes_per_sample == 4);
 }
 
@@ -69,7 +67,7 @@
 scoped_refptr<AudioChunk> AudioBuffer::DequeueAll() {
   size_t resulting_length = 0;
   ChunksContainer::const_iterator it;
-  // In order to improve performance, calulate in advance the total length
+  // In order to improve performance, calculate in advance the total length
   // and then copy the chunks.
   for (it = chunks_.begin(); it != chunks_.end(); ++it) {
     resulting_length += (*it)->AsString().length();
diff --git a/content/browser/speech/audio_buffer.h b/content/browser/speech/audio_buffer.h
index 1231fa4..0c43c0e 100644
--- a/content/browser/speech/audio_buffer.h
+++ b/content/browser/speech/audio_buffer.h
@@ -18,8 +18,8 @@
 namespace content {
 
 // Models a chunk derived from an AudioBuffer.
-class CONTENT_EXPORT AudioChunk :
-    public base::RefCountedThreadSafe<AudioChunk> {
+class CONTENT_EXPORT AudioChunk
+    : public base::RefCountedThreadSafe<AudioChunk> {
  public:
   explicit AudioChunk(int bytes_per_sample);
   // Creates a chunk of |length| bytes, initialized to zeros.
diff --git a/content/browser/speech/chunked_byte_buffer.cc b/content/browser/speech/chunked_byte_buffer.cc
index 5e3f70c..032d3f8 100644
--- a/content/browser/speech/chunked_byte_buffer.cc
+++ b/content/browser/speech/chunked_byte_buffer.cc
@@ -23,9 +23,7 @@
 namespace content {
 
 ChunkedByteBuffer::ChunkedByteBuffer()
-    : partial_chunk_(new Chunk()),
-      total_bytes_stored_(0) {
-}
+    : partial_chunk_(new Chunk()), total_bytes_stored_(0) {}
 
 ChunkedByteBuffer::~ChunkedByteBuffer() {
   Clear();
@@ -62,8 +60,7 @@
     DCHECK_GT(insert_length, 0U);
     DCHECK_LE(insert_length, remaining_bytes);
     DCHECK_LE(next_data + insert_length, start + length);
-    insert_target->insert(insert_target->end(),
-                          next_data,
+    insert_target->insert(insert_target->end(), next_data,
                           next_data + insert_length);
     next_data += insert_length;
     remaining_bytes -= insert_length;
@@ -117,8 +114,7 @@
 
 ChunkedByteBuffer::Chunk::Chunk() : content(new std::vector<uint8_t>()) {}
 
-ChunkedByteBuffer::Chunk::~Chunk() {
-}
+ChunkedByteBuffer::Chunk::~Chunk() {}
 
 size_t ChunkedByteBuffer::Chunk::ExpectedContentLength() const {
   DCHECK_EQ(header.size(), kHeaderLength);
diff --git a/content/browser/speech/chunked_byte_buffer.h b/content/browser/speech/chunked_byte_buffer.h
index 98bdd92..93bae9e 100644
--- a/content/browser/speech/chunked_byte_buffer.h
+++ b/content/browser/speech/chunked_byte_buffer.h
@@ -19,7 +19,7 @@
 namespace content {
 
 // Models a chunk-oriented byte buffer. The term chunk is herein defined as an
-// arbitrary sequence of bytes that is preceeded by N header bytes, indicating
+// arbitrary sequence of bytes that is preceded by N header bytes, indicating
 // its size. Data may be appended to the buffer with no particular respect of
 // chunks boundaries. However, chunks can be extracted (FIFO) only when their
 // content (according to their header) is fully available in the buffer.
@@ -72,7 +72,6 @@
   DISALLOW_COPY_AND_ASSIGN(ChunkedByteBuffer);
 };
 
-
 }  // namespace content
 
 #endif  // CONTENT_BROWSER_SPEECH_CHUNKED_BYTE_BUFFER_H_
diff --git a/content/browser/speech/endpointer/endpointer.cc b/content/browser/speech/endpointer/endpointer.cc
index 96d8e6c..f45ac12 100644
--- a/content/browser/speech/endpointer/endpointer.cc
+++ b/content/browser/speech/endpointer/endpointer.cc
@@ -10,7 +10,7 @@
 namespace {
 const int64_t kMicrosecondsPerSecond = base::Time::kMicrosecondsPerSecond;
 const int kFrameRate = 50;  // 1 frame = 20ms of audio.
-}
+}  // namespace
 
 namespace content {
 
@@ -61,7 +61,7 @@
   waiting_for_speech_complete_timeout_ = false;
   speech_previously_detected_ = false;
   speech_input_complete_ = false;
-  audio_frame_time_us_ = 0; // Reset time for packets sent to endpointer.
+  audio_frame_time_us_ = 0;  // Reset time for packets sent to endpointer.
   speech_end_time_us_ = -1;
   speech_start_time_us_ = -1;
 }
@@ -107,8 +107,7 @@
         reinterpret_cast<const int16_t*>(int16_audio_bus.interleaved_data());
   } else {
     DCHECK_EQ(audio_bus.sample_type(), AudioBus::kInt16);
-    audio_data =
-        reinterpret_cast<const int16_t*>(audio_bus.interleaved_data());
+    audio_data = reinterpret_cast<const int16_t*>(audio_bus.interleaved_data());
   }
 #else
 EpStatus Endpointer::ProcessAudio(const AudioChunk& raw_audio, float* rms_out) {
@@ -123,10 +122,8 @@
   int sample_index = 0;
   while (sample_index + frame_size_ <= num_samples) {
     // Have the endpointer process the frame.
-    energy_endpointer_.ProcessAudioFrame(audio_frame_time_us_,
-                                         audio_data + sample_index,
-                                         frame_size_,
-                                         rms_out);
+    energy_endpointer_.ProcessAudioFrame(
+        audio_frame_time_us_, audio_data + sample_index, frame_size_, rms_out);
     sample_index += frame_size_;
     audio_frame_time_us_ +=
         (frame_size_ * kMicrosecondsPerSecond) / sample_rate_;
@@ -157,7 +154,7 @@
       // Speech possibly complete timeout.
       if ((waiting_for_speech_possibly_complete_timeout_) &&
           (ep_time - speech_end_time_us_ >
-              speech_input_possibly_complete_silence_length_us_)) {
+           speech_input_possibly_complete_silence_length_us_)) {
         waiting_for_speech_possibly_complete_timeout_ = false;
       }
       if (waiting_for_speech_complete_timeout_) {
@@ -173,8 +170,7 @@
           requested_silence_length =
               long_speech_input_complete_silence_length_us_;
         } else {
-          requested_silence_length =
-              speech_input_complete_silence_length_us_;
+          requested_silence_length = speech_input_complete_silence_length_us_;
         }
 
         // Speech complete timeout.
diff --git a/content/browser/speech/endpointer/endpointer.h b/content/browser/speech/endpointer/endpointer.h
index 2264842..a0d450b 100644
--- a/content/browser/speech/endpointer/endpointer.h
+++ b/content/browser/speech/endpointer/endpointer.h
@@ -78,9 +78,7 @@
 
   // Returns true if the endpointer detected reasonable audio levels above
   // background noise which could be user speech, false if not.
-  bool DidStartReceivingSpeech() const {
-    return speech_previously_detected_;
-  }
+  bool DidStartReceivingSpeech() const { return speech_previously_detected_; }
 
   bool IsEstimatingEnvironment() const {
     return energy_endpointer_.estimating_environment();
@@ -102,9 +100,7 @@
     long_speech_length_us_ = time_us;
   }
 
-  bool speech_input_complete() const {
-    return speech_input_complete_;
-  }
+  bool speech_input_complete() const { return speech_input_complete_; }
 
 #if defined(STARBOARD)
   int sample_rate() const { return sample_rate_; }
@@ -123,7 +119,7 @@
 
   // The speechInputPossiblyComplete event signals that silence/noise has been
   // detected for a *short* amount of time after some speech has been detected.
-  // This proporty specifies the time period.
+  // This property specifies the time period.
   int64_t speech_input_possibly_complete_silence_length_us_;
 
   // The speechInputComplete event signals that silence/noise has been
diff --git a/content/browser/speech/endpointer/endpointer_unittest.cc b/content/browser/speech/endpointer/endpointer_unittest.cc
index 4b3cbb5..5578202 100644
--- a/content/browser/speech/endpointer/endpointer_unittest.cc
+++ b/content/browser/speech/endpointer/endpointer_unittest.cc
@@ -3,20 +3,22 @@
 // found in the LICENSE file.
 
 #include <stdint.h>
+#include <memory>
+#include <utility>
 
 #include "content/browser/speech/audio_buffer.h"
 #include "content/browser/speech/endpointer/endpointer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
-const int kFrameRate = 50;  // 20 ms long frames for AMR encoding.
+const int kFrameRate = 50;     // 20 ms long frames for AMR encoding.
 const int kSampleRate = 8000;  // 8 k samples per second for AMR encoding.
 
-// At 8 sample per second a 20 ms frame is 160 samples, which corrsponds
+// At 8 sample per second a 20 ms frame is 160 samples, which corresponds
 // to the AMR codec.
 const int kFrameSize = kSampleRate / kFrameRate;  // 160 samples.
 static_assert(kFrameSize == 160, "invalid frame size");
-}
+}  // namespace
 
 namespace content {
 
@@ -50,7 +52,7 @@
     // Create random samples.
     for (int i = 0; i < kFrameSize; ++i) {
       float randNum = static_cast<float>(rand() - (RAND_MAX / 2)) /
-          static_cast<float>(RAND_MAX);
+                      static_cast<float>(RAND_MAX);
       samples[i] = static_cast<int16_t>(gain * randNum);
     }
 
@@ -91,7 +93,7 @@
 
 TEST(EndpointerTest, TestEnergyEndpointerEvents) {
   // Initialize endpointer and configure it. We specify the parameters
-  // here for a 20ms window, and a 20ms step size, which corrsponds to
+  // here for a 20ms window, and a 20ms step size, which corresponds to
   // the narrow band AMR codec.
   EnergyEndpointerParams ep_config;
   ep_config.set_frame_period(1.0f / static_cast<float>(kFrameRate));
@@ -114,7 +116,7 @@
   RunEndpointerEventsTest(&frame_processor);
 
   endpointer.EndSession();
-};
+}
 
 // Test endpointer wrapper class.
 class EndpointerFrameProcessor : public FrameProcessor {
diff --git a/content/browser/speech/endpointer/energy_endpointer.cc b/content/browser/speech/endpointer/energy_endpointer.cc
index eb0b565..79be5d5 100644
--- a/content/browser/speech/endpointer/energy_endpointer.cc
+++ b/content/browser/speech/endpointer/energy_endpointer.cc
@@ -76,7 +76,7 @@
 void EnergyEndpointer::HistoryRing::SetRing(int size, bool initial_state) {
   insertion_index_ = 0;
   decision_points_.clear();
-  DecisionPoint init = { -1, initial_state };
+  DecisionPoint init = {-1, initial_state};
   decision_points_.resize(size, init);
 }
 
@@ -138,11 +138,9 @@
       rms_adapt_(0),
       start_lag_(0),
       end_lag_(0),
-      user_input_start_time_us_(0) {
-}
+      user_input_start_time_us_(0) {}
 
-EnergyEndpointer::~EnergyEndpointer() {
-}
+EnergyEndpointer::~EnergyEndpointer() {}
 
 int EnergyEndpointer::TimeToFrame(float time) const {
   return static_cast<int32_t>(0.5 + (time / params_.frame_period()));
@@ -183,8 +181,8 @@
     max_window_dur_ = params_.offset_window();
   Restart(true);
 
-  offset_confirm_dur_sec_ = params_.offset_window() -
-                            params_.offset_confirm_dur();
+  offset_confirm_dur_sec_ =
+      params_.offset_window() - params_.offset_confirm_dur();
   if (offset_confirm_dur_sec_ < 0.0)
     offset_confirm_dur_sec_ = 0.0;
 
@@ -204,10 +202,10 @@
   frame_counter_ = 0;  // Used for rapid initial update of levels.
 
   sample_rate_ = params_.sample_rate();
-  start_lag_ = static_cast<int>(sample_rate_ /
-                                params_.max_fundamental_frequency());
-  end_lag_ = static_cast<int>(sample_rate_ /
-                              params_.min_fundamental_frequency());
+  start_lag_ =
+      static_cast<int>(sample_rate_ / params_.max_fundamental_frequency());
+  end_lag_ =
+      static_cast<int>(sample_rate_ / params_.min_fundamental_frequency());
 }
 
 void EnergyEndpointer::StartSession() {
@@ -316,9 +314,9 @@
         } else {
           rms_adapt_ = (0.95f * rms_adapt_) + (0.05f * rms);
         }
-        float target_threshold = 0.3f * rms_adapt_ +  noise_level_;
-        decision_threshold_ = (.90f * decision_threshold_) +
-                              (0.10f * target_threshold);
+        float target_threshold = 0.3f * rms_adapt_ + noise_level_;
+        decision_threshold_ =
+            (.90f * decision_threshold_) + (0.10f * target_threshold);
       }
     }
 
@@ -346,7 +344,7 @@
     // Alpha increases from 0 to (k-1)/k where k is the number of time
     // steps in the initial adaptation period.
     float alpha = static_cast<float>(frame_counter_) /
-        static_cast<float>(fast_update_frames_);
+                  static_cast<float>(fast_update_frames_);
     noise_level_ = (alpha * noise_level_) + ((1 - alpha) * rms);
     DVLOG(1) << "FAST UPDATE, frame_counter_ " << frame_counter_
              << ", fast_update_frames_ " << fast_update_frames_;
@@ -360,7 +358,7 @@
       noise_level_ = (0.95f * noise_level_) + (0.05f * rms);
   }
   if (estimating_environment_ || (frame_counter_ < fast_update_frames_)) {
-    decision_threshold_ = noise_level_ * 2; // 6dB above noise level.
+    decision_threshold_ = noise_level_ * 2;  // 6dB above noise level.
     // Set a floor
     if (decision_threshold_ < params_.min_decision_threshold())
       decision_threshold_ = params_.min_decision_threshold();
diff --git a/content/browser/speech/endpointer/energy_endpointer.h b/content/browser/speech/endpointer/energy_endpointer.h
index 7b0b292..bf880e6 100644
--- a/content/browser/speech/endpointer/energy_endpointer.h
+++ b/content/browser/speech/endpointer/energy_endpointer.h
@@ -13,7 +13,7 @@
 // defers decisions re onset and offset times until these
 // specifications have been met.  Three basic intervals are tested: an
 // onset window, a speech-on window, and an offset window.  We require
-// super-threshold to exceed some mimimum total durations in the onset
+// super-threshold to exceed some minimum total durations in the onset
 // and speech-on windows before declaring the speech onset time, and
 // we specify a required sub-threshold residency in the offset window
 // before declaring speech offset. As the various residency requirements are
@@ -24,7 +24,7 @@
 // important that the background noise level be estimated initially for
 // robustness in noisy conditions. The first frames are assumed to be background
 // noise and a fast update rate is used for the noise level. The duration for
-// fast update is controlled by the fast_update_dur_ paramter.
+// fast update is controlled by the fast_update_dur_ parameter.
 //
 // If used in noisy conditions, the endpointer should be started and run in the
 // EnvironmentEstimation mode, for at least 200ms, before switching to
@@ -91,9 +91,7 @@
   // corresponding to the most recently computed frame.
   EpStatus Status(int64_t* status_time_us) const;
 
-  bool estimating_environment() const {
-    return estimating_environment_;
-  }
+  bool estimating_environment() const { return estimating_environment_; }
 
   // Returns estimated noise level in dB.
   float GetNoiseLevelDb() const;
@@ -113,7 +111,7 @@
   // the 'time' (in seconds).
   int TimeToFrame(float time) const;
 
-  EpStatus status_;  // The current state of this instance.
+  EpStatus status_;               // The current state of this instance.
   float offset_confirm_dur_sec_;  // max on time allowed to confirm POST_SPEECH
   int64_t
       endpointer_time_us_;  // Time of the most recently received audio frame.
@@ -122,7 +120,7 @@
   int64_t
       frame_counter_;     // Number of frames seen. Used for initial adaptation.
   float max_window_dur_;  // Largest search window size (seconds)
-  float sample_rate_;  // Sampling rate.
+  float sample_rate_;     // Sampling rate.
 
   // Ring buffers to hold the speech activity history.
   std::unique_ptr<HistoryRing> history_;
diff --git a/content/browser/speech/endpointer/energy_endpointer_params.h b/content/browser/speech/endpointer/energy_endpointer_params.h
index 1510435..1ce3bb6 100644
--- a/content/browser/speech/endpointer/energy_endpointer_params.h
+++ b/content/browser/speech/endpointer/energy_endpointer_params.h
@@ -20,9 +20,7 @@
 
   // Accessors and mutators
   float frame_period() const { return frame_period_; }
-  void set_frame_period(float frame_period) {
-    frame_period_ = frame_period;
-  }
+  void set_frame_period(float frame_period) { frame_period_ = frame_period; }
 
   float frame_duration() const { return frame_duration_; }
   void set_frame_duration(float frame_duration) {
@@ -104,16 +102,16 @@
   }
 
  private:
-  float frame_period_;  // Frame period
-  float frame_duration_;  // Window size
-  float onset_window_;  // Interval scanned for onset activity
-  float speech_on_window_;  // Inverval scanned for ongoing speech
-  float offset_window_;  // Interval scanned for offset evidence
-  float offset_confirm_dur_;  // Silence duration required to confirm offset
-  float decision_threshold_;  // Initial rms detection threshold
+  float frame_period_;            // Frame period
+  float frame_duration_;          // Window size
+  float onset_window_;            // Interval scanned for onset activity
+  float speech_on_window_;        // Interval scanned for ongoing speech
+  float offset_window_;           // Interval scanned for offset evidence
+  float offset_confirm_dur_;      // Silence duration required to confirm offset
+  float decision_threshold_;      // Initial rms detection threshold
   float min_decision_threshold_;  // Minimum rms detection threshold
-  float fast_update_dur_;  // Period for initial estimation of levels.
-  float sample_rate_;  // Expected sample rate.
+  float fast_update_dur_;         // Period for initial estimation of levels.
+  float sample_rate_;             // Expected sample rate.
 
   // Time to add on either side of endpoint threshold crossings
   float endpoint_margin_;
diff --git a/content/common/content_export.h b/content/common/content_export.h
index 20d647a..5368e49 100644
--- a/content/common/content_export.h
+++ b/content/common/content_export.h
@@ -14,7 +14,7 @@
 #define CONTENT_EXPORT __declspec(dllimport)
 #endif  // defined(CONTENT_IMPLEMENTATION)
 
-#else // defined(WIN32)
+#else  // defined(WIN32)
 #if defined(CONTENT_IMPLEMENTATION)
 #define CONTENT_EXPORT __attribute__((visibility("default")))
 #else
@@ -22,7 +22,7 @@
 #endif
 #endif
 
-#else // defined(COMPONENT_BUILD)
+#else  // defined(COMPONENT_BUILD)
 #define CONTENT_EXPORT
 #endif
 
diff --git a/crypto/codereview.settings b/crypto/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/crypto/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/docker-compose-windows-internal.yml b/docker-compose-windows-internal.yml
index 5bf059a..a18ed0d 100644
--- a/docker-compose-windows-internal.yml
+++ b/docker-compose-windows-internal.yml
@@ -114,86 +114,3 @@
     image: cobalt-build-nxswitch
     depends_on:
       - cobalt-build-win-internal
-
-  # --------------------------------------------
-  # VS 2022 Upgrade Images for Console Platforms
-  # --------------------------------------------
-
-  cobalt-build-vs2022-win-internal:
-    <<: *common-definitions
-    build:
-      context: ./internal/docker/windows/internal
-      args:
-        - encoded_keyfile=${ENCODED_GS_SERVICE_KEY_FILE}
-        - FROM_IMAGE=cobalt-build-vs2022-win-base
-    image: cobalt-build-vs2022-win-internal
-    scale: 0
-    depends_on:
-      - cobalt-build-vs2022-win-base
-
-  ps4-vs2022:
-    <<: *common-definitions
-    build:
-      context: ./internal/docker/windows/
-      dockerfile: ps4/Dockerfile
-      args:
-        - encoded_keyfile=${ENCODED_GS_SERVICE_KEY_FILE}
-        - FROM_IMAGE=cobalt-build-vs2022-win-internal
-    environment:
-      <<: *shared-build-env
-      PLATFORM: ps4
-      VISUAL_STUDIO_VERSION: "2022"
-    image: cobalt-build-ps4-vs2022
-    depends_on:
-      - cobalt-build-vs2022-win-internal
-
-  ps5-vs2022:
-    <<: *common-definitions
-    build:
-      context: ./internal/docker/windows/
-      dockerfile: ps5/Dockerfile
-      args:
-        - encoded_keyfile=${ENCODED_GS_SERVICE_KEY_FILE}
-        - FROM_IMAGE=cobalt-build-vs2022-win-internal
-    environment:
-      <<: *shared-build-env
-      PLATFORM: ps5
-      VISUAL_STUDIO_VERSION: "2022"
-    image: cobalt-build-ps5-vs2022
-    depends_on:
-      - cobalt-build-vs2022-win-internal
-
-  xb1-vs2022:
-    <<: *common-definitions
-    build:
-      context: ./internal/docker/windows/
-      dockerfile: xb1/Dockerfile
-      args:
-        - encoded_keyfile=${ENCODED_GS_SERVICE_KEY_FILE}
-        - FROM_IMAGE=cobalt-build-vs2022-win-internal
-        - vs_buildtools_version=17
-        - windows_11_sdk_version=22621
-    environment:
-      <<: *shared-build-env
-      PLATFORM: xb1
-      COBALT_CONCURRENT_LINKS: ${COBALT_CONCURRENT_LINKS:-1}
-      VISUAL_STUDIO_VERSION: "2022"
-    image: cobalt-build-xb1-vs2022
-    depends_on:
-      - cobalt-build-vs2022-win-internal
-
-  nxswitch-vs2022:
-    <<: *common-definitions
-    build:
-      context: ./internal/docker/windows/
-      dockerfile: nxswitch/Dockerfile
-      args:
-        - encoded_keyfile=${ENCODED_GS_SERVICE_KEY_FILE}
-        - FROM_IMAGE=cobalt-build-vs2022-win-internal
-    environment:
-      <<: *shared-build-env
-      PLATFORM: nxswitch
-      VISUAL_STUDIO_VERSION: "2022"
-    image: cobalt-build-nxswitch-vs2022
-    depends_on:
-      - cobalt-build-vs2022-win-internal
diff --git a/docker-compose-windows.yml b/docker-compose-windows.yml
index 15779c7..9c6aa27 100644
--- a/docker-compose-windows.yml
+++ b/docker-compose-windows.yml
@@ -45,40 +45,21 @@
 
   visual-studio-base:
     build:
-      context: ./docker/windows/base/visualstudio2017
+      context: ./docker/windows/base/visualstudio2022
       dockerfile: ./Dockerfile
       args:
         - FROM_IMAGE=mcr.microsoft.com/windows/servercore:ltsc2019
     image: visual-studio-base
     scale: 0
 
-  visual-studio-2022-base:
-    build:
-      context: ./docker/windows/base/visualstudio2022
-      dockerfile: ./Dockerfile
-      args:
-        - FROM_IMAGE=mcr.microsoft.com/windows/servercore:ltsc2019
-    image: visual-studio-2022-base
-    scale: 0
-
   visual-studio-win32-base:
     build:
-      context: ./docker/windows/base/visualstudio2017
+      context: ./docker/windows/base/visualstudio2022
       dockerfile: ./Dockerfile
       args:
         - FROM_IMAGE=mcr.microsoft.com/windows:1809
     image: visual-studio-win32-base
     scale: 0
-
-  visual-studio-2022-win32-base:
-    build:
-      context: ./docker/windows/base/visualstudio2022
-      dockerfile: ./Dockerfile
-      args:
-        - FROM_IMAGE=mcr.microsoft.com/windows:1809
-    image: visual-studio-2022-win32-base
-    scale: 0
-
   # -----------------------------------------------
   # Cobalt-Build images for windows-based platforms
   # -----------------------------------------------
@@ -94,17 +75,6 @@
     depends_on:
       - visual-studio-base
 
-  cobalt-build-vs2022-win-base:
-    build:
-      context: ./docker/windows/base/build
-      dockerfile: ./Dockerfile
-      args:
-        - FROM_IMAGE=visual-studio-2022-base
-    image: cobalt-build-vs2022-win-base
-    scale: 0
-    depends_on:
-      - visual-studio-2022-base
-
   cobalt-build-win32-base:
     build:
       context: ./docker/windows/base/build
@@ -116,17 +86,6 @@
     depends_on:
       - visual-studio-win32-base
 
-  cobalt-build-vs2022-win32-base:
-    build:
-      context: ./docker/windows/base/build
-      dockerfile: ./Dockerfile
-      args:
-        - FROM_IMAGE=visual-studio-2022-win32-base
-    depends_on:
-      - visual-studio-2022-win32-base
-    image: cobalt-build-vs2022-win32-base
-    scale: 0
-
   build-win-win32:
     <<: *common-definitions
     build:
@@ -156,21 +115,6 @@
       PLATFORM: win-win32
     image: cobalt-build-win32
 
-  win-win32-vs2022:
-    <<: *common-definitions
-    build:
-      context: ./docker/windows/win32
-      dockerfile: ./Dockerfile
-      args:
-        - FROM_IMAGE=cobalt-build-vs2022-win32-base
-    depends_on:
-      - cobalt-build-vs2022-win32-base
-    environment:
-      <<: *shared-build-env
-      PLATFORM: win-win32
-      VISUAL_STUDIO_VERSION: "2022"
-    image: cobalt-build-win32-vs2022
-
   runner-win-win32:
     <<: *common-definitions
     build:
diff --git a/docker/docsite/Dockerfile b/docker/docsite/Dockerfile
index f4e1592..6b1bd9d 100644
--- a/docker/docsite/Dockerfile
+++ b/docker/docsite/Dockerfile
@@ -33,7 +33,6 @@
     && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
     && rm -rf /var/lib/{apt,dpkg,cache,log}
 
-
 # We create and use a non-root user explicitly so that the generated and
 # modified files maintain the same permissions as the user that launched the
 # Docker container.
@@ -47,6 +46,7 @@
 RUN mkdir /project_out_dir \
     && chown ${USER:-defaultuser}:defaultgroup /project_out_dir
 
+RUN git config --global --add safe.directory /code
 
 COPY Gemfile /app/Gemfile
 # Note: This file was generated by running a working version of this Docker
diff --git a/docker/docsite/Gemfile b/docker/docsite/Gemfile
index f26eb4c..113ad9c 100644
--- a/docker/docsite/Gemfile
+++ b/docker/docsite/Gemfile
@@ -17,5 +17,5 @@
 gem 'jekyll-feed', '0.3.1'
 
 gem 'bourbon'
-gem 'i18n'
+gem 'i18n', '1.14.1'
 gem 'neat'
diff --git a/docker/docsite/Gemfile.lock b/docker/docsite/Gemfile.lock
index 96ec167..1a3e470 100644
--- a/docker/docsite/Gemfile.lock
+++ b/docker/docsite/Gemfile.lock
@@ -2,13 +2,13 @@
   remote: https://rubygems.org/
   specs:
     RedCloth (4.2.9)
-    activesupport (6.1.7.3)
+    activesupport (6.1.7.2)
       concurrent-ruby (~> 1.0, >= 1.0.2)
       i18n (>= 1.6, < 2)
       minitest (>= 5.1)
       tzinfo (~> 2.0)
       zeitwerk (~> 2.3)
-    addressable (2.8.4)
+    addressable (2.8.1)
       public_suffix (>= 2.0.2, < 6.0)
     blankslate (2.1.2.4)
     bourbon (7.3.0)
@@ -116,7 +116,7 @@
     pygments.rb (0.6.3)
       posix-spawn (~> 0.3.6)
       yajl-ruby (~> 1.2.0)
-    racc (1.7.0)
+    racc (1.6.2)
     rb-fsevent (0.11.2)
     rb-inotify (0.10.1)
       ffi (~> 1.0)
@@ -132,13 +132,13 @@
     sawyer (0.9.2)
       addressable (>= 2.3.5)
       faraday (>= 0.17.3, < 3)
-    thor (1.2.2)
+    thor (1.2.1)
     toml (0.1.2)
       parslet (~> 1.5.0)
     tzinfo (2.0.6)
       concurrent-ruby (~> 1.0)
     yajl-ruby (1.2.3)
-    zeitwerk (2.6.8)
+    zeitwerk (2.6.7)
 
 PLATFORMS
   ruby
@@ -146,7 +146,7 @@
 DEPENDENCIES
   RedCloth (= 4.2.9)
   bourbon
-  i18n
+  i18n (= 1.14.1)
   jekyll (= 2.4.0)
   jekyll-coffeescript (= 1.0.1)
   jekyll-feed (= 0.3.1)
diff --git a/docker/precommit_hooks/Dockerfile b/docker/precommit_hooks/Dockerfile
index f263390..ede3f4f 100644
--- a/docker/precommit_hooks/Dockerfile
+++ b/docker/precommit_hooks/Dockerfile
@@ -19,6 +19,7 @@
         git python2 python3 python3-pip \
         python3-setuptools python3-wheel \
         libncurses5 curl unzip \
+        gcc python3-dev \
     && apt-get clean autoclean \
     && apt-get autoremove -y --purge \
     && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
@@ -42,6 +43,8 @@
 ENV PRE_COMMIT_COLOR=always
 ENV SKIP=test-download-from-gcs-helper,check-bug-in-commit-message,run-py2-tests,check-if-starboard-interface-changed
 
+RUN git config --global --add safe.directory /code
+
 CMD pre-commit install -t pre-push -t pre-commit && \
     (pre-commit run --from-ref ${FROM_REF} --to-ref ${TO_REF} --hook-stage commit; \
      ret=$?; \
diff --git a/docker/precommit_hooks/requirements.txt b/docker/precommit_hooks/requirements.txt
index 2354279..affce6b 100644
--- a/docker/precommit_hooks/requirements.txt
+++ b/docker/precommit_hooks/requirements.txt
@@ -4,9 +4,9 @@
 #
 #    pip-compile --allow-unsafe --generate-hashes requirements.in
 #
-astroid==2.11.7 \
-    --hash=sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b \
-    --hash=sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946
+astroid==2.15.6 \
+    --hash=sha256:389656ca57b6108f939cf5d2f9a2a825a3be50ba9d589670f393236e0a03b91c \
+    --hash=sha256:903f024859b7c7687d7a7f3a3f73b17301f8e42dfd9cc9df9d4418172d3e2dbd
     # via pylint
 cfgv==3.3.1 \
     --hash=sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426 \
@@ -16,246 +16,281 @@
     --hash=sha256:00ddc86d6e4de2a9dcfa272402dcbe21593363a93b7c475bc391e335062f34b1 \
     --hash=sha256:d430ce8f67afc1839340e60daa89e90de08b874bc27149833077bba726dfc13a
     # via -r requirements.in
-dill==0.3.5.1 \
-    --hash=sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302 \
-    --hash=sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86
+dill==0.3.7 \
+    --hash=sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e \
+    --hash=sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03
     # via pylint
-distlib==0.3.5 \
-    --hash=sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe \
-    --hash=sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c
+distlib==0.3.7 \
+    --hash=sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057 \
+    --hash=sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8
     # via virtualenv
-filelock==3.8.0 \
-    --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \
-    --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4
+filelock==3.12.2 \
+    --hash=sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81 \
+    --hash=sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec
     # via virtualenv
-identify==2.5.3 \
-    --hash=sha256:25851c8c1370effb22aaa3c987b30449e9ff0cece408f810ae6ce408fdd20893 \
-    --hash=sha256:887e7b91a1be152b0d46bbf072130235a8117392b9f1828446079a816a05ef44
+identify==2.5.24 \
+    --hash=sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4 \
+    --hash=sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d
     # via pre-commit
-importlib-metadata==6.6.0 \
-    --hash=sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed \
-    --hash=sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705
+importlib-metadata==6.7.0 \
+    --hash=sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4 \
+    --hash=sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5
     # via
     #   pre-commit
     #   virtualenv
-isort==5.10.1 \
-    --hash=sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7 \
-    --hash=sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951
+    #   yapf
+isort==5.11.5 \
+    --hash=sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db \
+    --hash=sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746
     # via pylint
-lazy-object-proxy==1.7.1 \
-    --hash=sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7 \
-    --hash=sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a \
-    --hash=sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c \
-    --hash=sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc \
-    --hash=sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f \
-    --hash=sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09 \
-    --hash=sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442 \
-    --hash=sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e \
-    --hash=sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029 \
-    --hash=sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61 \
-    --hash=sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb \
-    --hash=sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0 \
-    --hash=sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35 \
-    --hash=sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42 \
-    --hash=sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1 \
-    --hash=sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad \
-    --hash=sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443 \
-    --hash=sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd \
-    --hash=sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9 \
-    --hash=sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148 \
-    --hash=sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38 \
-    --hash=sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55 \
-    --hash=sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36 \
-    --hash=sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a \
-    --hash=sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b \
-    --hash=sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44 \
-    --hash=sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6 \
-    --hash=sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69 \
-    --hash=sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4 \
-    --hash=sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84 \
-    --hash=sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de \
-    --hash=sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28 \
-    --hash=sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c \
-    --hash=sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1 \
-    --hash=sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8 \
-    --hash=sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b \
-    --hash=sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb
+lazy-object-proxy==1.9.0 \
+    --hash=sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382 \
+    --hash=sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82 \
+    --hash=sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9 \
+    --hash=sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494 \
+    --hash=sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46 \
+    --hash=sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30 \
+    --hash=sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63 \
+    --hash=sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4 \
+    --hash=sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae \
+    --hash=sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be \
+    --hash=sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701 \
+    --hash=sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd \
+    --hash=sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006 \
+    --hash=sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a \
+    --hash=sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586 \
+    --hash=sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8 \
+    --hash=sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821 \
+    --hash=sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07 \
+    --hash=sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b \
+    --hash=sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171 \
+    --hash=sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b \
+    --hash=sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2 \
+    --hash=sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7 \
+    --hash=sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4 \
+    --hash=sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8 \
+    --hash=sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e \
+    --hash=sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f \
+    --hash=sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda \
+    --hash=sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4 \
+    --hash=sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e \
+    --hash=sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671 \
+    --hash=sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11 \
+    --hash=sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455 \
+    --hash=sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734 \
+    --hash=sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb \
+    --hash=sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59
     # via astroid
 mccabe==0.7.0 \
     --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \
     --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e
     # via pylint
-nodeenv==1.7.0 \
-    --hash=sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e \
-    --hash=sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b
+nodeenv==1.8.0 \
+    --hash=sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2 \
+    --hash=sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec
     # via pre-commit
-platformdirs==2.5.2 \
-    --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \
-    --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19
+platformdirs==3.10.0 \
+    --hash=sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d \
+    --hash=sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d
     # via
     #   pylint
     #   virtualenv
-pre-commit==2.20.0 \
-    --hash=sha256:51a5ba7c480ae8072ecdb6933df22d2f812dc897d5fe848778116129a681aac7 \
-    --hash=sha256:a978dac7bc9ec0bcee55c18a277d553b0f419d259dadb4b9418ff2d00eb43959
+    #   yapf
+pre-commit==2.21.0 \
+    --hash=sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658 \
+    --hash=sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad
     # via -r requirements.in
-pylint==2.14.5 \
-    --hash=sha256:487ce2192eee48211269a0e976421f334cf94de1806ca9d0a99449adcdf0285e \
-    --hash=sha256:fabe30000de7d07636d2e82c9a518ad5ad7908590fe135ace169b44839c15f90
+pylint==2.17.5 \
+    --hash=sha256:73995fb8216d3bed149c8d51bba25b2c52a8251a2c8ac846ec668ce38fab5413 \
+    --hash=sha256:f7b601cbc06fef7e62a754e2b41294c2aa31f1cb659624b9a85bcba29eaf8252
     # via -r requirements.in
-pyyaml==6.0 \
-    --hash=sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293 \
-    --hash=sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b \
-    --hash=sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57 \
-    --hash=sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b \
-    --hash=sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4 \
-    --hash=sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07 \
-    --hash=sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba \
-    --hash=sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9 \
-    --hash=sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287 \
-    --hash=sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513 \
-    --hash=sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0 \
-    --hash=sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0 \
-    --hash=sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92 \
-    --hash=sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f \
-    --hash=sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2 \
-    --hash=sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc \
-    --hash=sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c \
-    --hash=sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86 \
-    --hash=sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4 \
-    --hash=sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c \
-    --hash=sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34 \
-    --hash=sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b \
-    --hash=sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c \
-    --hash=sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb \
-    --hash=sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737 \
-    --hash=sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3 \
-    --hash=sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d \
-    --hash=sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53 \
-    --hash=sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78 \
-    --hash=sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803 \
-    --hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \
-    --hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \
-    --hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5
-    # via pre-commit
-toml==0.10.2 \
-    --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \
-    --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f
+pyyaml==6.0.1 \
+    --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \
+    --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \
+    --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \
+    --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \
+    --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \
+    --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \
+    --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \
+    --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \
+    --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \
+    --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \
+    --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \
+    --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \
+    --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \
+    --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \
+    --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \
+    --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \
+    --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \
+    --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \
+    --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \
+    --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \
+    --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \
+    --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \
+    --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \
+    --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \
+    --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \
+    --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \
+    --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \
+    --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \
+    --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \
+    --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \
+    --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \
+    --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \
+    --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \
+    --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \
+    --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \
+    --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \
+    --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \
+    --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \
+    --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \
+    --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f
     # via pre-commit
 tomli==2.0.1 \
     --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \
     --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f
+    # via
+    #   pylint
+    #   yapf
+tomlkit==0.12.1 \
+    --hash=sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86 \
+    --hash=sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899
     # via pylint
-tomlkit==0.11.4 \
-    --hash=sha256:25d4e2e446c453be6360c67ddfb88838cfc42026322770ba13d1fbd403a93a5c \
-    --hash=sha256:3235a9010fae54323e727c3ac06fb720752fe6635b3426e379daec60fbd44a83
-    # via pylint
-typed-ast==1.5.4 \
-    --hash=sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2 \
-    --hash=sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1 \
-    --hash=sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6 \
-    --hash=sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62 \
-    --hash=sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac \
-    --hash=sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d \
-    --hash=sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc \
-    --hash=sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2 \
-    --hash=sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97 \
-    --hash=sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35 \
-    --hash=sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6 \
-    --hash=sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1 \
-    --hash=sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4 \
-    --hash=sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c \
-    --hash=sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e \
-    --hash=sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec \
-    --hash=sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f \
-    --hash=sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72 \
-    --hash=sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47 \
-    --hash=sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72 \
-    --hash=sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe \
-    --hash=sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6 \
-    --hash=sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3 \
-    --hash=sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66
+typed-ast==1.5.5 \
+    --hash=sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10 \
+    --hash=sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede \
+    --hash=sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e \
+    --hash=sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c \
+    --hash=sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d \
+    --hash=sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8 \
+    --hash=sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e \
+    --hash=sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5 \
+    --hash=sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155 \
+    --hash=sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4 \
+    --hash=sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba \
+    --hash=sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5 \
+    --hash=sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a \
+    --hash=sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b \
+    --hash=sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311 \
+    --hash=sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769 \
+    --hash=sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686 \
+    --hash=sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d \
+    --hash=sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2 \
+    --hash=sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814 \
+    --hash=sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9 \
+    --hash=sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b \
+    --hash=sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b \
+    --hash=sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4 \
+    --hash=sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd \
+    --hash=sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18 \
+    --hash=sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa \
+    --hash=sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6 \
+    --hash=sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee \
+    --hash=sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88 \
+    --hash=sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4 \
+    --hash=sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431 \
+    --hash=sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04 \
+    --hash=sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d \
+    --hash=sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02 \
+    --hash=sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8 \
+    --hash=sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437 \
+    --hash=sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274 \
+    --hash=sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f \
+    --hash=sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a \
+    --hash=sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2
     # via astroid
-typing-extensions==4.5.0 \
-    --hash=sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb \
-    --hash=sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4
+typing-extensions==4.7.1 \
+    --hash=sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36 \
+    --hash=sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2
     # via
     #   astroid
     #   importlib-metadata
+    #   platformdirs
     #   pylint
-virtualenv==20.16.3 \
-    --hash=sha256:4193b7bc8a6cd23e4eb251ac64f29b4398ab2c233531e66e40b19a6b7b0d30c1 \
-    --hash=sha256:d86ea0bb50e06252d79e6c241507cb904fcd66090c3271381372d6221a3970f9
+virtualenv==20.24.2 \
+    --hash=sha256:43a3052be36080548bdee0b42919c88072037d50d56c28bd3f853cbe92b953ff \
+    --hash=sha256:fd8a78f46f6b99a67b7ec5cf73f92357891a7b3a40fd97637c27f854aae3b9e0
     # via pre-commit
-wrapt==1.14.1 \
-    --hash=sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3 \
-    --hash=sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b \
-    --hash=sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4 \
-    --hash=sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2 \
-    --hash=sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656 \
-    --hash=sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3 \
-    --hash=sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff \
-    --hash=sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310 \
-    --hash=sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a \
-    --hash=sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57 \
-    --hash=sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069 \
-    --hash=sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383 \
-    --hash=sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe \
-    --hash=sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87 \
-    --hash=sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d \
-    --hash=sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b \
-    --hash=sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907 \
-    --hash=sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f \
-    --hash=sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0 \
-    --hash=sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28 \
-    --hash=sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1 \
-    --hash=sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853 \
-    --hash=sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc \
-    --hash=sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3 \
-    --hash=sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3 \
-    --hash=sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164 \
-    --hash=sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1 \
-    --hash=sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c \
-    --hash=sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1 \
-    --hash=sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7 \
-    --hash=sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1 \
-    --hash=sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320 \
-    --hash=sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed \
-    --hash=sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1 \
-    --hash=sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248 \
-    --hash=sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c \
-    --hash=sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456 \
-    --hash=sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77 \
-    --hash=sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef \
-    --hash=sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1 \
-    --hash=sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7 \
-    --hash=sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86 \
-    --hash=sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4 \
-    --hash=sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d \
-    --hash=sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d \
-    --hash=sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8 \
-    --hash=sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5 \
-    --hash=sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471 \
-    --hash=sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00 \
-    --hash=sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68 \
-    --hash=sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3 \
-    --hash=sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d \
-    --hash=sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735 \
-    --hash=sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d \
-    --hash=sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569 \
-    --hash=sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7 \
-    --hash=sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59 \
-    --hash=sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5 \
-    --hash=sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb \
-    --hash=sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b \
-    --hash=sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f \
-    --hash=sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462 \
-    --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \
-    --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af
+wrapt==1.15.0 \
+    --hash=sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0 \
+    --hash=sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420 \
+    --hash=sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a \
+    --hash=sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c \
+    --hash=sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079 \
+    --hash=sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923 \
+    --hash=sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f \
+    --hash=sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1 \
+    --hash=sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8 \
+    --hash=sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86 \
+    --hash=sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0 \
+    --hash=sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364 \
+    --hash=sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e \
+    --hash=sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c \
+    --hash=sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e \
+    --hash=sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c \
+    --hash=sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727 \
+    --hash=sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff \
+    --hash=sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e \
+    --hash=sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29 \
+    --hash=sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7 \
+    --hash=sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72 \
+    --hash=sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475 \
+    --hash=sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a \
+    --hash=sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317 \
+    --hash=sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2 \
+    --hash=sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd \
+    --hash=sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640 \
+    --hash=sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98 \
+    --hash=sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248 \
+    --hash=sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e \
+    --hash=sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d \
+    --hash=sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec \
+    --hash=sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1 \
+    --hash=sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e \
+    --hash=sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9 \
+    --hash=sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92 \
+    --hash=sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb \
+    --hash=sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094 \
+    --hash=sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46 \
+    --hash=sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29 \
+    --hash=sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd \
+    --hash=sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705 \
+    --hash=sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8 \
+    --hash=sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975 \
+    --hash=sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb \
+    --hash=sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e \
+    --hash=sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b \
+    --hash=sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418 \
+    --hash=sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019 \
+    --hash=sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1 \
+    --hash=sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba \
+    --hash=sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6 \
+    --hash=sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2 \
+    --hash=sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3 \
+    --hash=sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7 \
+    --hash=sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752 \
+    --hash=sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416 \
+    --hash=sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f \
+    --hash=sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1 \
+    --hash=sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc \
+    --hash=sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145 \
+    --hash=sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee \
+    --hash=sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a \
+    --hash=sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7 \
+    --hash=sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b \
+    --hash=sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653 \
+    --hash=sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0 \
+    --hash=sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90 \
+    --hash=sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29 \
+    --hash=sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6 \
+    --hash=sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034 \
+    --hash=sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09 \
+    --hash=sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559 \
+    --hash=sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639
     # via astroid
-yapf==0.32.0 \
-    --hash=sha256:8fea849025584e486fd06d6ba2bed717f396080fd3cc236ba10cb97c4c51cf32 \
-    --hash=sha256:a3f5085d37ef7e3e004c4ba9f9b3e40c54ff1901cd111f05145ae313a7c67d1b
+yapf==0.40.1 \
+    --hash=sha256:958587eb5c8ec6c860119a9c25d02addf30a44f75aa152a4220d30e56a98037c \
+    --hash=sha256:b8bfc1f280949153e795181768ca14ef43d7312629a06c43e7abd279323af313
     # via -r requirements.in
 zipp==3.15.0 \
     --hash=sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b \
@@ -263,9 +298,7 @@
     # via importlib-metadata
 
 # The following packages are considered to be unsafe in a requirements file:
-setuptools==67.7.2 \
-    --hash=sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b \
-    --hash=sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990
-    # via
-    #   astroid
-    #   nodeenv
+setuptools==68.0.0 \
+    --hash=sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f \
+    --hash=sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235
+    # via nodeenv
diff --git a/docker/pytest/requirements.in b/docker/pytest/requirements.in
index fffb347..5c102f4 100644
--- a/docker/pytest/requirements.in
+++ b/docker/pytest/requirements.in
@@ -1,6 +1,6 @@
-pytest<8
+pytest>=7.2.0
 coverage<7
-requests==2.25.1
+requests>=2.31.0
 jsonschema<5
 junitparser==2.8.0
 pexpect==4.8.0
diff --git a/docker/pytest/requirements.txt b/docker/pytest/requirements.txt
index 3dcbe0f..848a024 100644
--- a/docker/pytest/requirements.txt
+++ b/docker/pytest/requirements.txt
@@ -6,75 +6,160 @@
 #
 atomicwrites==1.4.1 \
     --hash=sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11
-    # via -r docker/pytest/requirements.in
-attrs==21.4.0 \
-    --hash=sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4 \
-    --hash=sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd
-    # via
-    #   jsonschema
-    #   pytest
-certifi==2021.10.8 \
-    --hash=sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872 \
-    --hash=sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569
-    # via requests
-chardet==4.0.0 \
-    --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa \
-    --hash=sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5
-    # via requests
-coverage==6.3.2 \
-    --hash=sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9 \
-    --hash=sha256:07e6db90cd9686c767dcc593dff16c8c09f9814f5e9c51034066cad3373b914d \
-    --hash=sha256:18d520c6860515a771708937d2f78f63cc47ab3b80cb78e86573b0a760161faf \
-    --hash=sha256:1ebf730d2381158ecf3dfd4453fbca0613e16eaa547b4170e2450c9707665ce7 \
-    --hash=sha256:21b7745788866028adeb1e0eca3bf1101109e2dc58456cb49d2d9b99a8c516e6 \
-    --hash=sha256:26e2deacd414fc2f97dd9f7676ee3eaecd299ca751412d89f40bc01557a6b1b4 \
-    --hash=sha256:2c6dbb42f3ad25760010c45191e9757e7dce981cbfb90e42feef301d71540059 \
-    --hash=sha256:2fea046bfb455510e05be95e879f0e768d45c10c11509e20e06d8fcaa31d9e39 \
-    --hash=sha256:34626a7eee2a3da12af0507780bb51eb52dca0e1751fd1471d0810539cefb536 \
-    --hash=sha256:37d1141ad6b2466a7b53a22e08fe76994c2d35a5b6b469590424a9953155afac \
-    --hash=sha256:46191097ebc381fbf89bdce207a6c107ac4ec0890d8d20f3360345ff5976155c \
-    --hash=sha256:4dd8bafa458b5c7d061540f1ee9f18025a68e2d8471b3e858a9dad47c8d41903 \
-    --hash=sha256:4e21876082ed887baed0146fe222f861b5815455ada3b33b890f4105d806128d \
-    --hash=sha256:58303469e9a272b4abdb9e302a780072c0633cdcc0165db7eec0f9e32f901e05 \
-    --hash=sha256:5ca5aeb4344b30d0bec47481536b8ba1181d50dbe783b0e4ad03c95dc1296684 \
-    --hash=sha256:68353fe7cdf91f109fc7d474461b46e7f1f14e533e911a2a2cbb8b0fc8613cf1 \
-    --hash=sha256:6f89d05e028d274ce4fa1a86887b071ae1755082ef94a6740238cd7a8178804f \
-    --hash=sha256:7a15dc0a14008f1da3d1ebd44bdda3e357dbabdf5a0b5034d38fcde0b5c234b7 \
-    --hash=sha256:8bdde1177f2311ee552f47ae6e5aa7750c0e3291ca6b75f71f7ffe1f1dab3dca \
-    --hash=sha256:8ce257cac556cb03be4a248d92ed36904a59a4a5ff55a994e92214cde15c5bad \
-    --hash=sha256:8cf5cfcb1521dc3255d845d9dca3ff204b3229401994ef8d1984b32746bb45ca \
-    --hash=sha256:8fbbdc8d55990eac1b0919ca69eb5a988a802b854488c34b8f37f3e2025fa90d \
-    --hash=sha256:9548f10d8be799551eb3a9c74bbf2b4934ddb330e08a73320123c07f95cc2d92 \
-    --hash=sha256:96f8a1cb43ca1422f36492bebe63312d396491a9165ed3b9231e778d43a7fca4 \
-    --hash=sha256:9b27d894748475fa858f9597c0ee1d4829f44683f3813633aaf94b19cb5453cf \
-    --hash=sha256:9baff2a45ae1f17c8078452e9e5962e518eab705e50a0aa8083733ea7d45f3a6 \
-    --hash=sha256:a2a8b8bcc399edb4347a5ca8b9b87e7524c0967b335fbb08a83c8421489ddee1 \
-    --hash=sha256:acf53bc2cf7282ab9b8ba346746afe703474004d9e566ad164c91a7a59f188a4 \
-    --hash=sha256:b0be84e5a6209858a1d3e8d1806c46214e867ce1b0fd32e4ea03f4bd8b2e3359 \
-    --hash=sha256:b31651d018b23ec463e95cf10070d0b2c548aa950a03d0b559eaa11c7e5a6fa3 \
-    --hash=sha256:b78e5afb39941572209f71866aa0b206c12f0109835aa0d601e41552f9b3e620 \
-    --hash=sha256:c76aeef1b95aff3905fb2ae2d96e319caca5b76fa41d3470b19d4e4a3a313512 \
-    --hash=sha256:dd035edafefee4d573140a76fdc785dc38829fe5a455c4bb12bac8c20cfc3d69 \
-    --hash=sha256:dd6fe30bd519694b356cbfcaca9bd5c1737cddd20778c6a581ae20dc8c04def2 \
-    --hash=sha256:e5f4e1edcf57ce94e5475fe09e5afa3e3145081318e5fd1a43a6b4539a97e518 \
-    --hash=sha256:ec6bc7fe73a938933d4178c9b23c4e0568e43e220aef9472c4f6044bfc6dd0f0 \
-    --hash=sha256:f1555ea6d6da108e1999b2463ea1003fe03f29213e459145e70edbaf3e004aaa \
-    --hash=sha256:f5fa5803f47e095d7ad8443d28b01d48c0359484fec1b9d8606d0e3282084bc4 \
-    --hash=sha256:f7331dbf301b7289013175087636bbaf5b2405e57259dd2c42fdcc9fcc47325e \
-    --hash=sha256:f9987b0354b06d4df0f4d3e0ec1ae76d7ce7cbca9a2f98c25041eb79eec766f1 \
-    --hash=sha256:fd9e830e9d8d89b20ab1e5af09b32d33e1a08ef4c4e14411e559556fd788e6b2
     # via -r requirements.in
+attrs==23.1.0 \
+    --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \
+    --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015
+    # via jsonschema
+certifi==2023.5.7 \
+    --hash=sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7 \
+    --hash=sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716
+    # via requests
+charset-normalizer==3.2.0 \
+    --hash=sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96 \
+    --hash=sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c \
+    --hash=sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710 \
+    --hash=sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706 \
+    --hash=sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020 \
+    --hash=sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252 \
+    --hash=sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad \
+    --hash=sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329 \
+    --hash=sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a \
+    --hash=sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f \
+    --hash=sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6 \
+    --hash=sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4 \
+    --hash=sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a \
+    --hash=sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46 \
+    --hash=sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2 \
+    --hash=sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23 \
+    --hash=sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace \
+    --hash=sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd \
+    --hash=sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982 \
+    --hash=sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10 \
+    --hash=sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2 \
+    --hash=sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea \
+    --hash=sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09 \
+    --hash=sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5 \
+    --hash=sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149 \
+    --hash=sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489 \
+    --hash=sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9 \
+    --hash=sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80 \
+    --hash=sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592 \
+    --hash=sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3 \
+    --hash=sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6 \
+    --hash=sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed \
+    --hash=sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c \
+    --hash=sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200 \
+    --hash=sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a \
+    --hash=sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e \
+    --hash=sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d \
+    --hash=sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6 \
+    --hash=sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623 \
+    --hash=sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669 \
+    --hash=sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3 \
+    --hash=sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa \
+    --hash=sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9 \
+    --hash=sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2 \
+    --hash=sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f \
+    --hash=sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1 \
+    --hash=sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4 \
+    --hash=sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a \
+    --hash=sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8 \
+    --hash=sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3 \
+    --hash=sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029 \
+    --hash=sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f \
+    --hash=sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959 \
+    --hash=sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22 \
+    --hash=sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7 \
+    --hash=sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952 \
+    --hash=sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346 \
+    --hash=sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e \
+    --hash=sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d \
+    --hash=sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299 \
+    --hash=sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd \
+    --hash=sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a \
+    --hash=sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3 \
+    --hash=sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037 \
+    --hash=sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94 \
+    --hash=sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c \
+    --hash=sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858 \
+    --hash=sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a \
+    --hash=sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449 \
+    --hash=sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c \
+    --hash=sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918 \
+    --hash=sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1 \
+    --hash=sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c \
+    --hash=sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac \
+    --hash=sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa
+    # via requests
+coverage==6.5.0 \
+    --hash=sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79 \
+    --hash=sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a \
+    --hash=sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f \
+    --hash=sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a \
+    --hash=sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa \
+    --hash=sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398 \
+    --hash=sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba \
+    --hash=sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d \
+    --hash=sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf \
+    --hash=sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b \
+    --hash=sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518 \
+    --hash=sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d \
+    --hash=sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795 \
+    --hash=sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2 \
+    --hash=sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e \
+    --hash=sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32 \
+    --hash=sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745 \
+    --hash=sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b \
+    --hash=sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e \
+    --hash=sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d \
+    --hash=sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f \
+    --hash=sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660 \
+    --hash=sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62 \
+    --hash=sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6 \
+    --hash=sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04 \
+    --hash=sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c \
+    --hash=sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5 \
+    --hash=sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef \
+    --hash=sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc \
+    --hash=sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae \
+    --hash=sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578 \
+    --hash=sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466 \
+    --hash=sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4 \
+    --hash=sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91 \
+    --hash=sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0 \
+    --hash=sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4 \
+    --hash=sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b \
+    --hash=sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe \
+    --hash=sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b \
+    --hash=sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75 \
+    --hash=sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b \
+    --hash=sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c \
+    --hash=sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72 \
+    --hash=sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b \
+    --hash=sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f \
+    --hash=sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e \
+    --hash=sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53 \
+    --hash=sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3 \
+    --hash=sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84 \
+    --hash=sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987
+    # via -r requirements.in
+exceptiongroup==1.1.2 \
+    --hash=sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5 \
+    --hash=sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f
+    # via pytest
 future==0.18.3 \
     --hash=sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307
     # via junitparser
-idna==2.10 \
-    --hash=sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6 \
-    --hash=sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0
+idna==3.4 \
+    --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \
+    --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2
     # via requests
-importlib-metadata==6.6.0 \
-    --hash=sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed \
-    --hash=sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705
+importlib-metadata==6.7.0 \
+    --hash=sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4 \
+    --hash=sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5
     # via
+    #   attrs
     #   jsonschema
     #   pluggy
     #   pytest
@@ -82,72 +167,74 @@
     --hash=sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6 \
     --hash=sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a
     # via jsonschema
-iniconfig==1.1.1 \
-    --hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \
-    --hash=sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32
+iniconfig==2.0.0 \
+    --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
+    --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
     # via pytest
-jsonschema==4.4.0 \
-    --hash=sha256:636694eb41b3535ed608fe04129f26542b59ed99808b4f688aa32dcf55317a83 \
-    --hash=sha256:77281a1f71684953ee8b3d488371b162419767973789272434bbc3f29d9c8823
+jsonschema==4.17.3 \
+    --hash=sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d \
+    --hash=sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6
     # via -r requirements.in
 junitparser==2.8.0 \
     --hash=sha256:a8d4290ab9fb93f2015e0dbef61ef93b7ea110e99099087a453f55c8e1481adf \
     --hash=sha256:e1a7d41e0c92ca032c46eed07a6268c478f90ec1f411ea8a76b69f245e57cfb6
     # via -r requirements.in
-packaging==21.3 \
-    --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \
-    --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522
+packaging==23.1 \
+    --hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \
+    --hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f
     # via pytest
 pexpect==4.8.0 \
     --hash=sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937 \
     --hash=sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c
     # via -r requirements.in
-pluggy==1.0.0 \
-    --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \
-    --hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3
+pkgutil-resolve-name==1.3.10 \
+    --hash=sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174 \
+    --hash=sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e
+    # via jsonschema
+pluggy==1.2.0 \
+    --hash=sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849 \
+    --hash=sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3
     # via pytest
 ptyprocess==0.7.0 \
     --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \
     --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220
     # via pexpect
-py==1.11.0 \
-    --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \
-    --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378
-    # via pytest
-pyparsing==3.0.7 \
-    --hash=sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea \
-    --hash=sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484
-    # via packaging
-pyrsistent==0.18.1 \
-    --hash=sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c \
-    --hash=sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc \
-    --hash=sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e \
-    --hash=sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26 \
-    --hash=sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec \
-    --hash=sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286 \
-    --hash=sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045 \
-    --hash=sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec \
-    --hash=sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8 \
-    --hash=sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c \
-    --hash=sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca \
-    --hash=sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22 \
-    --hash=sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a \
-    --hash=sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96 \
-    --hash=sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc \
-    --hash=sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1 \
-    --hash=sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07 \
-    --hash=sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6 \
-    --hash=sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b \
-    --hash=sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5 \
-    --hash=sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6
+pyrsistent==0.19.3 \
+    --hash=sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8 \
+    --hash=sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440 \
+    --hash=sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a \
+    --hash=sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c \
+    --hash=sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3 \
+    --hash=sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393 \
+    --hash=sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9 \
+    --hash=sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da \
+    --hash=sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf \
+    --hash=sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64 \
+    --hash=sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a \
+    --hash=sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3 \
+    --hash=sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98 \
+    --hash=sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2 \
+    --hash=sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8 \
+    --hash=sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf \
+    --hash=sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc \
+    --hash=sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7 \
+    --hash=sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28 \
+    --hash=sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2 \
+    --hash=sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b \
+    --hash=sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a \
+    --hash=sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64 \
+    --hash=sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19 \
+    --hash=sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1 \
+    --hash=sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9 \
+    --hash=sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c
     # via jsonschema
-pytest==7.1.1 \
-    --hash=sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63 \
-    --hash=sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea
+pytest==7.4.0 \
+    --hash=sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32 \
+    --hash=sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a
     # via -r requirements.in
-requests==2.25.1 \
-    --hash=sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804 \
-    --hash=sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e
+requests==2.31.0 \
+    --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \
+    --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1
     # via -r requirements.in
 six==1.12.0 \
     --hash=sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c \
@@ -157,15 +244,15 @@
     --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \
     --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f
     # via pytest
-typing-extensions==4.5.0 \
-    --hash=sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb \
-    --hash=sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4
+typing-extensions==4.7.1 \
+    --hash=sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36 \
+    --hash=sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2
     # via
     #   importlib-metadata
     #   jsonschema
-urllib3==1.26.9 \
-    --hash=sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14 \
-    --hash=sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e
+urllib3==2.0.3 \
+    --hash=sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1 \
+    --hash=sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825
     # via requests
 zipp==3.15.0 \
     --hash=sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b \
diff --git a/docker/windows/base/build/Dockerfile b/docker/windows/base/build/Dockerfile
index 1952773..5484781 100644
--- a/docker/windows/base/build/Dockerfile
+++ b/docker/windows/base/build/Dockerfile
@@ -21,14 +21,6 @@
 # Helper script for quick delete operations in windows
 COPY ./fast-win-rmdir.cmd /fast-win-rmdir.cmd
 
-# Helper script to run an looping command to persist the container instead of
-# running the main command.
-COPY ./spin.ps1 /spin.ps1
-
-# Helper script to output all the running python processes showing the details
-# of the execution, i.e. the full invocation string.
-COPY ./list_python_processes.py /list_python_processes.py
-
 # Pin Choco to 1.4.0 to avoid required reboot in 2.0.0
 ENV chocolateyVersion '1.4.0'
 # Install deps via chocolatey.
diff --git a/docker/windows/base/build/list_python_processes.py b/docker/windows/base/build/list_python_processes.py
deleted file mode 100644
index ea3cf48..0000000
--- a/docker/windows/base/build/list_python_processes.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-"""
-Convenience script to debug the list of running python processes on windows
-without relying on 3rd party GUI programs such as Process Explorer.
-"""
-
-import subprocess
-
-wmic_cmd = """wmic process where "name='python.exe' or name='pythonw.exe'" get commandline,processid"""  #pylint: disable=line-too-long
-wmic_prc = subprocess.Popen(  # pylint: disable=consider-using-with
-    wmic_cmd,
-    stdout=subprocess.PIPE,
-    stderr=subprocess.PIPE,
-    shell=True)
-wmic_out, _ = wmic_prc.communicate()
-
-py_processes = [item.rsplit(None, 1) for item in wmic_out.splitlines() if item
-               ][1:]
-py_processes = [[cmdline, int(pid)] for [cmdline, pid] in py_processes]
-
-print('Running python processes:')
-for p in py_processes:
-  print(p[1])  # Prints the full python invocation.
-  print(p[0])  # Prints the pid of the process.
-  print()
diff --git a/docker/windows/base/build/spin.ps1 b/docker/windows/base/build/spin.ps1
deleted file mode 100644
index 339c0df..0000000
--- a/docker/windows/base/build/spin.ps1
+++ /dev/null
@@ -1,8 +0,0 @@
-# Helper script to run an placeholder process on windows.
-# This serves to keep windows containers running, so we can shell into it to
-# administer it.
-
-while ($true) {
-  test-connection google.com -Count 1;
-  sleep 120;
-}
diff --git a/docker/windows/base/visualstudio2017/Dockerfile b/docker/windows/base/visualstudio2017/Dockerfile
deleted file mode 100644
index a131816..0000000
--- a/docker/windows/base/visualstudio2017/Dockerfile
+++ /dev/null
@@ -1,51 +0,0 @@
-# escape=`
-
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-ARG FROM_IMAGE
-FROM ${FROM_IMAGE}
-
-# Dockerfile for image used to install Visual Studio.
-# WARNING: Changes to this file will result in an extremely long image rebuild.
-
-SHELL ["powershell", "-ExecutionPolicy", "unrestricted", "-Command"]
-
-RUN mkdir C:\TEMP;`
-    Write-Host ('Downloading vs_buildtools.exe');`
-    Invoke-WebRequest -Uri https://aka.ms/vs/15/release/vs_buildtools.exe -OutFile C:\TEMP\vs_buildtools.exe;`
-    Write-Host ('Installing vs_buildtools.exe');`
-    Start-Process C:\TEMP\vs_buildtools.exe -Wait -NoNewWindow`
-        -ArgumentList '--quiet --wait --norestart --nocache`
-        --installPath C:\BuildTools `
-        --add Microsoft.VisualStudio.Component.VC.CoreIde `
-        --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 `
-        --add Microsoft.VisualStudio.Component.Windows10SDK.17763 `
-        --add Microsoft.VisualStudio.Component.VC.Tools.14.15';`
-    Write-Host ('Cleaning up vs_buildtools.exe');`
-    Remove-Item -Force -Recurse ${env:ProgramFiles(x86)}\'Microsoft Visual Studio'\Installer;`
-    Remove-Item -Force -Recurse $env:TEMP\*;`
-    Remove-Item -Force -Recurse $env:ProgramData\'Package Cache'\;`
-    Remove-Item -Force -Recurse C:\BuildTools\Common7\IDE\CommonExtensions\Microsoft\TextMate\Starterkit\Extensions;`
-    Remove-Item -Force -Recurse C:\BuildTools\VC\Tools\MSVC\14.15.26726\atlmfc;`
-    Remove-Item -Force -Recurse C:\BuildTools\VC\Tools\MSVC\14.15.26726\lib\spectre;`
-    Remove-Item C:\TEMP\vs_buildtools.exe
-
-ENV VSINSTALLDIR "C:\BuildTools"
-ENV MSVC_TOOLS_VERSION "14.16.27023"
-ENV MSVC_REDIST_VERSION "14.16.27012"
-
-# TODO: remove this environment variable setting, since it is only needed for
-# manually deploying debug versions of DLLs. This can be removed in favor of a
-# dedicated deployment through gyp/ninja.
-ENV MS_WIN_VERSION="10.0.17763.0"
diff --git a/docker/windows/base/visualstudio2022/Dockerfile b/docker/windows/base/visualstudio2022/Dockerfile
index 780d9bf..a2722ff 100644
--- a/docker/windows/base/visualstudio2022/Dockerfile
+++ b/docker/windows/base/visualstudio2022/Dockerfile
@@ -31,13 +31,16 @@
         -ArgumentList '--quiet --wait --norestart --nocache`
         --installPath C:\BuildTools `
         --add Microsoft.VisualStudio.Component.VC.CoreIde `
-        --add Microsoft.VisualStudio.Component.VC.14.34.17.4.x86.x64 `
-        --add Microsoft.VisualStudio.Component.VC.Llvm.Clang `
-        --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset `
-        --add Microsoft.VisualStudio.Component.Windows10SDK.18362';`
+        --add Microsoft.VisualStudio.Component.VC.14.34.17.4.x86.x64  `
+        --add Microsoft.VisualStudio.Component.VC.Llvm.Clang          `
+        --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset   `
+        --add Microsoft.VisualStudio.Component.Windows10SDK.18362';   `
     Write-Host ('Cleaning up vs_buildtools.exe');`
     Remove-Item -Force -Recurse ${env:ProgramFiles(x86)}\'Microsoft Visual Studio'\Installer;`
     Remove-Item -Force -Recurse $env:TEMP\*;`
+    Remove-Item -Force -Recurse $env:ProgramData\'Package Cache'\;`
+    Remove-Item -Force -Recurse C:\BuildTools\VC\Tools\Llvm\ARM64;`
+    Remove-Item -Force -Recurse C:\BuildTools\Common7\IDE;`
     Remove-Item C:\TEMP\vs_buildtools.exe
 
 ENV VSINSTALLDIR "C:\BuildTools"
diff --git a/docker/windows/runner/runner.ps1 b/docker/windows/runner/runner.ps1
index 1d30fd3..9e96a5e 100644
--- a/docker/windows/runner/runner.ps1
+++ b/docker/windows/runner/runner.ps1
@@ -1,2 +1,2 @@
-.\actions-runner\config.cmd --unattended --replace --url https://github.com/${env:RUNNER_REPO} --token $env:RUNNER_TOKEN --name $env:RUNNER_NAME --work $env:RUNNER_WORKDIR;
+.\actions-runner\config.cmd --unattended --replace --url https://github.com/${env:RUNNER_REPO} --token $env:RUNNER_TOKEN --name $env:RUNNER_NAME --work $env:RUNNER_WORKDIR --labels $env:RUNNER_LABELS;
 .\actions-runner\run.cmd;
diff --git a/glimp/BUILD.gn b/glimp/BUILD.gn
index 6f92438..5253021 100644
--- a/glimp/BUILD.gn
+++ b/glimp/BUILD.gn
@@ -102,9 +102,15 @@
     "gles/unique_id_generator.cc",
     "gles/unique_id_generator.h",
     "gles/vertex_attribute.h",
+    "polymorphic_downcast.h",
+    "rect.h",
+    "ref_counted.cc",
+    "ref_counted.h",
     "shaders/glsl_shader_map_helpers.h",
     "shaders/hash_glsl_source.cc",
     "shaders/hash_glsl_source.h",
+    "thread_collision_warner.cc",
+    "thread_collision_warner.h",
   ]
   public_configs = [ ":glimp_common_sources_public_config" ]
   deps = [
diff --git a/glimp/codereview.settings b/glimp/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/glimp/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/glimp/egl/display.cc b/glimp/egl/display.cc
index 8cfac3c..a7a4464 100644
--- a/glimp/egl/display.cc
+++ b/glimp/egl/display.cc
@@ -17,6 +17,7 @@
 #include "glimp/egl/display.h"
 
 #include <algorithm>
+#include <utility>
 #include <vector>
 
 #include "glimp/egl/config.h"
@@ -56,8 +57,8 @@
   }
 }
 
-Display::Display(nb::scoped_ptr<DisplayImpl> display_impl)
-    : impl_(display_impl.Pass()) {}
+Display::Display(std::unique_ptr<DisplayImpl> display_impl)
+    : impl_(std::move(display_impl)) {}
 
 Display::~Display() {
   SB_DCHECK(active_surfaces_.empty());
@@ -134,13 +135,13 @@
     return EGL_NO_SURFACE;
   }
 
-  nb::scoped_ptr<SurfaceImpl> surface_impl = impl_->CreateWindowSurface(
+  std::unique_ptr<SurfaceImpl> surface_impl = impl_->CreateWindowSurface(
       reinterpret_cast<Config*>(config), win, attribs);
   if (!surface_impl) {
     return EGL_NO_SURFACE;
   }
 
-  Surface* surface = new Surface(surface_impl.Pass());
+  Surface* surface = new Surface(std::move(surface_impl));
   active_surfaces_.insert(surface);
 
   return ToEGLSurface(surface);
@@ -167,13 +168,13 @@
     return EGL_NO_SURFACE;
   }
 
-  nb::scoped_ptr<SurfaceImpl> surface_impl =
+  std::unique_ptr<SurfaceImpl> surface_impl =
       impl_->CreatePbufferSurface(reinterpret_cast<Config*>(config), attribs);
   if (!surface_impl) {
     return EGL_NO_SURFACE;
   }
 
-  Surface* surface = new Surface(surface_impl.Pass());
+  Surface* surface = new Surface(std::move(surface_impl));
   active_surfaces_.insert(surface);
 
   return ToEGLSurface(surface);
@@ -245,13 +246,13 @@
     share = reinterpret_cast<gles::Context*>(share_context);
   }
 
-  nb::scoped_ptr<gles::ContextImpl> context_impl =
+  std::unique_ptr<gles::ContextImpl> context_impl =
       impl_->CreateContext(reinterpret_cast<Config*>(config), context_version);
   if (!context_impl) {
     return EGL_NO_CONTEXT;
   }
 
-  gles::Context* context = new gles::Context(context_impl.Pass(), share);
+  gles::Context* context = new gles::Context(std::move(context_impl), share);
   active_contexts_.insert(context);
 
   return reinterpret_cast<EGLContext>(context);
diff --git a/glimp/egl/display.h b/glimp/egl/display.h
index b9333d6..090806f 100644
--- a/glimp/egl/display.h
+++ b/glimp/egl/display.h
@@ -19,10 +19,10 @@
 
 #include <set>
 
+#include <memory>
 #include "glimp/egl/config.h"
 #include "glimp/egl/display_impl.h"
 #include "glimp/gles/context.h"
-#include "nb/scoped_ptr.h"
 
 namespace glimp {
 namespace egl {
@@ -40,7 +40,7 @@
 
   // In order to create a display, it must have a platform-specific
   // implementation injected into it, where many methods will forward to.
-  explicit Display(nb::scoped_ptr<DisplayImpl> display_impl);
+  explicit Display(std::unique_ptr<DisplayImpl> display_impl);
   ~Display();
 
   void GetVersionInfo(EGLint* major, EGLint* minor);
@@ -72,7 +72,7 @@
   DisplayImpl* impl() const { return impl_.get(); }
 
  private:
-  nb::scoped_ptr<DisplayImpl> impl_;
+  std::unique_ptr<DisplayImpl> impl_;
 
   // Keeps track of all created but not destroyed surfaces.
   std::set<Surface*> active_surfaces_;
diff --git a/glimp/egl/display_impl.h b/glimp/egl/display_impl.h
index 71ac0d1..9583859 100644
--- a/glimp/egl/display_impl.h
+++ b/glimp/egl/display_impl.h
@@ -21,11 +21,11 @@
 
 #include <set>
 
+#include <memory>
 #include "glimp/egl/attrib_map.h"
 #include "glimp/egl/config.h"
 #include "glimp/egl/surface.h"
 #include "glimp/gles/context_impl.h"
-#include "nb/scoped_ptr.h"
 
 namespace glimp {
 namespace egl {
@@ -52,7 +52,7 @@
   static bool IsValidNativeDisplayType(EGLNativeDisplayType display_id);
   // Creates and returns a new DisplayImpl object.
   // To be implemented by each implementing platform.
-  static nb::scoped_ptr<DisplayImpl> Create(EGLNativeDisplayType display_id);
+  static std::unique_ptr<DisplayImpl> Create(EGLNativeDisplayType display_id);
   // Submit done call.
   static void CallSubmitDone();
 
@@ -70,7 +70,7 @@
   // window and is compatible with this DisplayImpl object.  This will be called
   // when eglCreateWindowSurface() is called.
   //   https://www.khronos.org/registry/egl/sdk/docs/man/html/eglCreateWindowSurface.xhtml
-  virtual nb::scoped_ptr<SurfaceImpl> CreateWindowSurface(
+  virtual std::unique_ptr<SurfaceImpl> CreateWindowSurface(
       const Config* config,
       EGLNativeWindowType win,
       const AttribMap& attributes) = 0;
@@ -79,15 +79,16 @@
   // Pbuffer and is compatible with this DisplayImpl object.  This will be
   // called when eglCreatePbufferSurface() is called.
   //   https://www.khronos.org/registry/egl/sdk/docs/man/html/eglCreatePbufferSurface.xhtml
-  virtual nb::scoped_ptr<SurfaceImpl> CreatePbufferSurface(
+  virtual std::unique_ptr<SurfaceImpl> CreatePbufferSurface(
       const Config* config,
       const AttribMap& attributes) = 0;
 
   // Creates and returns a gles::ContextImpl object that contains the platform
   // specific implementation of a GL ES Context, of the specified version that
   // is compatible with the specified config.
-  virtual nb::scoped_ptr<gles::ContextImpl> CreateContext(const Config* config,
-                                                          int gles_version) = 0;
+  virtual std::unique_ptr<gles::ContextImpl> CreateContext(
+      const Config* config,
+      int gles_version) = 0;
 
   // Sets the swap behavior for this display.  This will be called when
   // eglSwapInterval() is called.  Returns true on success and false on failure.
diff --git a/glimp/egl/display_registry.cc b/glimp/egl/display_registry.cc
index c2f1d2d..88bc338 100644
--- a/glimp/egl/display_registry.cc
+++ b/glimp/egl/display_registry.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +17,9 @@
 
 #include "glimp/egl/display_registry.h"
 
+#include <memory>
+#include <utility>
+
 #include "glimp/egl/display_impl.h"
 #include "glimp/egl/error.h"
 
@@ -54,7 +58,7 @@
   SB_DCHECK(Valid(display));
   Connection* connection = reinterpret_cast<Connection*>(display);
   if (!connection->display) {
-    nb::scoped_ptr<DisplayImpl> display_impl =
+    std::unique_ptr<DisplayImpl> display_impl =
         DisplayImpl::Create(connection->native_display);
     // If the platform-specific glimp implementation rejected the native
     // display, then we return false to indicate failure.
@@ -62,7 +66,7 @@
       return false;
     }
 
-    connection->display = new Display(display_impl.Pass());
+    connection->display = new Display(std::move(display_impl));
   }
 
   return true;
diff --git a/glimp/egl/surface.cc b/glimp/egl/surface.cc
index faff7e9..4a33437 100644
--- a/glimp/egl/surface.cc
+++ b/glimp/egl/surface.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +17,8 @@
 
 #include "glimp/egl/surface.h"
 
+#include <utility>
+
 #include "glimp/egl/error.h"
 #include "glimp/gles/context.h"
 #include "starboard/common/log.h"
@@ -23,8 +26,8 @@
 namespace glimp {
 namespace egl {
 
-Surface::Surface(nb::scoped_ptr<SurfaceImpl> surface_impl)
-    : surface_impl_(surface_impl.Pass()), is_bound_to_texture_(false) {}
+Surface::Surface(std::unique_ptr<SurfaceImpl> surface_impl)
+    : surface_impl_(std::move(surface_impl)), is_bound_to_texture_(false) {}
 
 int Surface::GetWidth() const {
   return surface_impl_->GetWidth();
diff --git a/glimp/egl/surface.h b/glimp/egl/surface.h
index dd26f2d..1139796 100644
--- a/glimp/egl/surface.h
+++ b/glimp/egl/surface.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,16 +22,16 @@
 
 #include <map>
 
+#include <memory>
 #include "glimp/egl/attrib_map.h"
 #include "glimp/egl/surface_impl.h"
-#include "nb/scoped_ptr.h"
 
 namespace glimp {
 namespace egl {
 
 class Surface {
  public:
-  explicit Surface(nb::scoped_ptr<SurfaceImpl> surface_impl);
+  explicit Surface(std::unique_ptr<SurfaceImpl> surface_impl);
 
   int GetWidth() const;
   int GetHeight() const;
@@ -47,7 +48,7 @@
   SurfaceImpl* impl() const { return surface_impl_.get(); }
 
  private:
-  nb::scoped_ptr<SurfaceImpl> surface_impl_;
+  std::unique_ptr<SurfaceImpl> surface_impl_;
 
   // True if this surface is currently bound to a GL ES texture via
   // eglBindTexImage().
diff --git a/glimp/gles/buffer.cc b/glimp/gles/buffer.cc
index b2be59d..eabd4ae 100644
--- a/glimp/gles/buffer.cc
+++ b/glimp/gles/buffer.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +17,8 @@
 
 #include "glimp/gles/buffer.h"
 
+#include <utility>
+
 namespace glimp {
 namespace gles {
 
@@ -37,8 +40,8 @@
 
 }  // namespace
 
-Buffer::Buffer(nb::scoped_ptr<BufferImpl> impl)
-    : impl_(impl.Pass()), size_in_bytes_(0) {}
+Buffer::Buffer(std::unique_ptr<BufferImpl> impl)
+    : impl_(std::move(impl)), size_in_bytes_(0) {}
 
 bool Buffer::Allocate(GLenum usage, size_t size) {
   size_in_bytes_ = size;
diff --git a/glimp/gles/buffer.h b/glimp/gles/buffer.h
index cd6c491..8391442 100644
--- a/glimp/gles/buffer.h
+++ b/glimp/gles/buffer.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,16 +20,16 @@
 
 #include <GLES3/gl3.h>
 
+#include <memory>
 #include "glimp/gles/buffer_impl.h"
-#include "nb/ref_counted.h"
-#include "nb/scoped_ptr.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
 
 class Buffer : public nb::RefCountedThreadSafe<Buffer> {
  public:
-  explicit Buffer(nb::scoped_ptr<BufferImpl> impl);
+  explicit Buffer(std::unique_ptr<BufferImpl> impl);
 
   // Allocates memory within this Buffer object.  Returns false if there
   // was an allocation failure.
@@ -54,7 +55,7 @@
   friend class nb::RefCountedThreadSafe<Buffer>;
   ~Buffer() {}
 
-  nb::scoped_ptr<BufferImpl> impl_;
+  std::unique_ptr<BufferImpl> impl_;
 
   // The size of the allocated memory used by this buffer.
   GLsizeiptr size_in_bytes_;
diff --git a/glimp/gles/context.cc b/glimp/gles/context.cc
index 84a7ef6..5b81e89 100644
--- a/glimp/gles/context.cc
+++ b/glimp/gles/context.cc
@@ -52,9 +52,9 @@
 
 }  // namespace
 
-Context::Context(nb::scoped_ptr<ContextImpl> context_impl,
+Context::Context(std::unique_ptr<ContextImpl> context_impl,
                  Context* share_context)
-    : impl_(context_impl.Pass()),
+    : impl_(std::move(context_impl)),
       context_id_(s_context_id_counter_++),
       current_thread_(kSbThreadInvalid),
       has_been_current_(false),
@@ -498,10 +498,10 @@
 
 GLuint Context::CreateProgram() {
   GLIMP_TRACE_EVENT0(__FUNCTION__);
-  nb::scoped_ptr<ProgramImpl> program_impl = impl_->CreateProgram();
+  std::unique_ptr<ProgramImpl> program_impl = impl_->CreateProgram();
   SB_DCHECK(program_impl);
 
-  nb::scoped_refptr<Program> program(new Program(program_impl.Pass()));
+  nb::scoped_refptr<Program> program(new Program(std::move(program_impl)));
 
   return resource_manager_->RegisterProgram(program);
 }
@@ -618,7 +618,7 @@
 
 GLuint Context::CreateShader(GLenum type) {
   GLIMP_TRACE_EVENT0(__FUNCTION__);
-  nb::scoped_ptr<ShaderImpl> shader_impl;
+  std::unique_ptr<ShaderImpl> shader_impl;
   if (type == GL_VERTEX_SHADER) {
     shader_impl = impl_->CreateVertexShader();
   } else if (type == GL_FRAGMENT_SHADER) {
@@ -629,7 +629,7 @@
   }
   SB_DCHECK(shader_impl);
 
-  nb::scoped_refptr<Shader> shader(new Shader(shader_impl.Pass(), type));
+  nb::scoped_refptr<Shader> shader(new Shader(std::move(shader_impl), type));
 
   return resource_manager_->RegisterShader(shader);
 }
@@ -693,10 +693,10 @@
   }
 
   for (GLsizei i = 0; i < n; ++i) {
-    nb::scoped_ptr<BufferImpl> buffer_impl = impl_->CreateBuffer();
+    std::unique_ptr<BufferImpl> buffer_impl = impl_->CreateBuffer();
     SB_DCHECK(buffer_impl);
 
-    nb::scoped_refptr<Buffer> buffer(new Buffer(buffer_impl.Pass()));
+    nb::scoped_refptr<Buffer> buffer(new Buffer(std::move(buffer_impl)));
 
     buffers[i] = resource_manager_->RegisterBuffer(buffer);
   }
@@ -710,11 +710,12 @@
   }
 
   for (GLsizei i = 0; i < n; ++i) {
-    nb::scoped_ptr<BufferImpl> buffer_impl = impl_->CreateBufferForVideoFrame();
+    std::unique_ptr<BufferImpl> buffer_impl =
+        impl_->CreateBufferForVideoFrame();
     SB_DCHECK(buffer_impl);
 
     buffers[i] = resource_manager_->RegisterBuffer(
-        nb::make_scoped_refptr(new Buffer(buffer_impl.Pass())));
+        nb::make_scoped_refptr(new Buffer(std::move(buffer_impl))));
   }
 }
 
@@ -1134,10 +1135,10 @@
   }
 
   for (GLsizei i = 0; i < n; ++i) {
-    nb::scoped_ptr<TextureImpl> texture_impl = impl_->CreateTexture();
+    std::unique_ptr<TextureImpl> texture_impl = impl_->CreateTexture();
     SB_DCHECK(texture_impl);
 
-    nb::scoped_refptr<Texture> texture(new Texture(texture_impl.Pass()));
+    nb::scoped_refptr<Texture> texture(new Texture(std::move(texture_impl)));
 
     textures[i] = resource_manager_->RegisterTexture(texture);
   }
@@ -1823,7 +1824,7 @@
     return;
   }
 
-  nb::scoped_refptr<Renderbuffer> renderbuffer_object = NULL;
+  nb::scoped_refptr<Renderbuffer> renderbuffer_object = nullptr;
 
   // Resolve the actual render buffer object to bind if we are not binding
   // render buffer 0, in which case we leave the value to set as NULL.
diff --git a/glimp/gles/context.h b/glimp/gles/context.h
index 73fb524..66f5fb5 100644
--- a/glimp/gles/context.h
+++ b/glimp/gles/context.h
@@ -25,6 +25,7 @@
 #include <string>
 #include <utility>
 
+#include <memory>
 #include "glimp/egl/surface.h"
 #include "glimp/gles/context_impl.h"
 #include "glimp/gles/draw_state.h"
@@ -32,8 +33,7 @@
 #include "glimp/gles/resource_manager.h"
 #include "glimp/gles/sampler.h"
 #include "glimp/gles/vertex_attribute.h"
-#include "nb/ref_counted.h"
-#include "nb/scoped_ptr.h"
+#include "glimp/ref_counted.h"
 #include "starboard/atomic.h"
 #include "starboard/thread.h"
 
@@ -42,7 +42,7 @@
 
 class Context {
  public:
-  Context(nb::scoped_ptr<ContextImpl> context_impl, Context* share_context);
+  Context(std::unique_ptr<ContextImpl> context_impl, Context* share_context);
 
   ~Context() { SbAtomicRelease_Store(&has_swapped_buffers_, 0); }
 
@@ -304,7 +304,7 @@
   int GetPitchForTextureData(int width, PixelFormat pixel_format) const;
 
   // A reference to the platform-specific implementation aspects of the context.
-  nb::scoped_ptr<ContextImpl> impl_;
+  std::unique_ptr<ContextImpl> impl_;
 
   // The unique id of context instance. It might be queried from different
   // threads.
@@ -327,7 +327,7 @@
   GLenum active_texture_;
 
   // The set of sampler units, of which |active_texture_| indexes.
-  nb::scoped_array<nb::scoped_refptr<Texture> > texture_units_;
+  std::unique_ptr<nb::scoped_refptr<Texture>[]> texture_units_;
   bool enabled_textures_dirty_;
 
   // A mapping from an integer index (specified by the index parameter of
diff --git a/glimp/gles/context_impl.h b/glimp/gles/context_impl.h
index 2eab9e5..4c9792a 100644
--- a/glimp/gles/context_impl.h
+++ b/glimp/gles/context_impl.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,6 +22,7 @@
 #include <utility>
 #include <vector>
 
+#include <memory>
 #include "glimp/egl/surface.h"
 #include "glimp/gles/buffer.h"
 #include "glimp/gles/buffer_impl.h"
@@ -33,7 +35,6 @@
 #include "glimp/gles/shader_impl.h"
 #include "glimp/gles/texture_impl.h"
 #include "glimp/gles/vertex_attribute.h"
-#include "nb/scoped_ptr.h"
 
 namespace glimp {
 namespace gles {
@@ -98,31 +99,31 @@
   // ProgramImpl implementation.  If a NULL scoped_ptr is returned, it is
   // treated as an error.
   //   https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCreateProgram.xml
-  virtual nb::scoped_ptr<ProgramImpl> CreateProgram() = 0;
+  virtual std::unique_ptr<ProgramImpl> CreateProgram() = 0;
 
   // Called via glCreateShader(GL_VERTEX_SHADER).  Must create a
   // platform-specific ShaderImpl object representing a vertex shader.
   //   https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCreateShader.xml
-  virtual nb::scoped_ptr<ShaderImpl> CreateVertexShader() = 0;
+  virtual std::unique_ptr<ShaderImpl> CreateVertexShader() = 0;
 
   // Called via glCreateShader(GL_FRAGMENT_SHADER).  Must create a
   // platform-specific ShaderImpl object representing a fragment shader.
   //   https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCreateShader.xml
-  virtual nb::scoped_ptr<ShaderImpl> CreateFragmentShader() = 0;
+  virtual std::unique_ptr<ShaderImpl> CreateFragmentShader() = 0;
 
   // Called via glGenBuffers().  Must create a platform-specific BufferImpl
   // object representing a buffer.
   //   https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenBuffers.xml
-  virtual nb::scoped_ptr<BufferImpl> CreateBuffer() = 0;
+  virtual std::unique_ptr<BufferImpl> CreateBuffer() = 0;
 
   // Called via glGenBuffersForVideoFrame(). Must create a platform-specific
   // BufferImpl object representing a buffer for compressed textures.
-  virtual nb::scoped_ptr<BufferImpl> CreateBufferForVideoFrame() = 0;
+  virtual std::unique_ptr<BufferImpl> CreateBufferForVideoFrame() = 0;
 
   // Called via glGenTextures().  Must create a platform-specific TextureImpl
   // object representing a texture.
   //   https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenTextures.xml
-  virtual nb::scoped_ptr<TextureImpl> CreateTexture() = 0;
+  virtual std::unique_ptr<TextureImpl> CreateTexture() = 0;
 
   // Called when glFlush() is called.  After this method is called, client
   // code may assume that all previously issued graphics commands will
diff --git a/glimp/gles/convert_pixel_data.cc b/glimp/gles/convert_pixel_data.cc
index dfa4ef1..ca59f8f 100644
--- a/glimp/gles/convert_pixel_data.cc
+++ b/glimp/gles/convert_pixel_data.cc
@@ -38,8 +38,8 @@
   } else {
     // If the pitches are not equal, we must memcpy each row separately.
     for (int i = 0; i < num_rows; ++i) {
-      memcpy(destination + i * destination_pitch,
-                   source + i * source_pitch, bytes_per_row);
+      memcpy(destination + i * destination_pitch, source + i * source_pitch,
+             bytes_per_row);
     }
   }
 }
diff --git a/glimp/gles/draw_state.cc b/glimp/gles/draw_state.cc
index 601151f..b1fa91d 100644
--- a/glimp/gles/draw_state.cc
+++ b/glimp/gles/draw_state.cc
@@ -22,9 +22,8 @@
 DirtyUniforms::DirtyUniforms() : all_dirty_(true) {}
 
 bool DirtyUniforms::IsDirty(int location) const {
-  return all_dirty_ ||
-         std::find(uniforms_dirty_.begin(), uniforms_dirty_.end(), location) !=
-             uniforms_dirty_.end();
+  return all_dirty_ || std::find(uniforms_dirty_.begin(), uniforms_dirty_.end(),
+                                 location) != uniforms_dirty_.end();
 }
 
 bool DirtyUniforms::AnyDirty() const {
diff --git a/glimp/gles/draw_state.h b/glimp/gles/draw_state.h
index 99ddcb3..2af6c71 100644
--- a/glimp/gles/draw_state.h
+++ b/glimp/gles/draw_state.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,8 +30,8 @@
 #include "glimp/gles/program.h"
 #include "glimp/gles/sampler.h"
 #include "glimp/gles/vertex_attribute.h"
-#include "nb/rect.h"
-#include "nb/ref_counted.h"
+#include "glimp/rect.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
diff --git a/glimp/gles/framebuffer.h b/glimp/gles/framebuffer.h
index 04f6ef9..b59301c 100644
--- a/glimp/gles/framebuffer.h
+++ b/glimp/gles/framebuffer.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,7 +21,7 @@
 #include "glimp/egl/surface.h"
 #include "glimp/gles/renderbuffer.h"
 #include "glimp/gles/texture.h"
-#include "nb/ref_counted.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
diff --git a/glimp/gles/pixel_format.h b/glimp/gles/pixel_format.h
index 63ffbdd..0a78148 100644
--- a/glimp/gles/pixel_format.h
+++ b/glimp/gles/pixel_format.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,9 +18,9 @@
 #ifndef GLIMP_GLES_PIXEL_FORMAT_H_
 #define GLIMP_GLES_PIXEL_FORMAT_H_
 
+#include <memory>
 #include "glimp/gles/buffer_impl.h"
-#include "nb/ref_counted.h"
-#include "nb/scoped_ptr.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
diff --git a/glimp/gles/program.cc b/glimp/gles/program.cc
index d258120..eea1976 100644
--- a/glimp/gles/program.cc
+++ b/glimp/gles/program.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,14 +16,17 @@
  */
 
 #include "glimp/gles/program.h"
+
+#include <utility>
+
 #include "starboard/common/string.h"
 #include "starboard/memory.h"
 
 namespace glimp {
 namespace gles {
 
-Program::Program(nb::scoped_ptr<ProgramImpl> impl)
-    : impl_(impl.Pass()), link_results_(false) {}
+Program::Program(std::unique_ptr<ProgramImpl> impl)
+    : impl_(std::move(impl)), link_results_(false) {}
 
 bool Program::AttachShader(const nb::scoped_refptr<Shader>& shader) {
   if (shader->type() == GL_VERTEX_SHADER) {
@@ -104,8 +108,8 @@
 void Program::GetProgramInfoLog(GLsizei bufsize,
                                 GLsizei* length,
                                 GLchar* infolog) {
-  *length = starboard::strlcpy(infolog, link_results_.info_log.c_str(),
-                               bufsize);
+  *length =
+      starboard::strlcpy(infolog, link_results_.info_log.c_str(), bufsize);
 }
 
 GLint Program::GetUniformLocation(const GLchar* name) {
diff --git a/glimp/gles/program.h b/glimp/gles/program.h
index f87e789..c643620 100644
--- a/glimp/gles/program.h
+++ b/glimp/gles/program.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,11 +24,11 @@
 #include <string>
 #include <vector>
 
+#include <memory>
 #include "glimp/gles/program_impl.h"
 #include "glimp/gles/shader.h"
 #include "glimp/gles/uniform_info.h"
-#include "nb/ref_counted.h"
-#include "nb/scoped_ptr.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
@@ -45,7 +46,7 @@
     void* data;
   };
 
-  explicit Program(nb::scoped_ptr<ProgramImpl> impl);
+  explicit Program(std::unique_ptr<ProgramImpl> impl);
 
   // Attaches the specified shader to either this program's vertex or fragment
   // shader slot, depending on the shader type.  If a shader of the given
@@ -97,7 +98,7 @@
                        const void* v,
                        UniformInfo::Type type);
 
-  nb::scoped_ptr<ProgramImpl> impl_;
+  std::unique_ptr<ProgramImpl> impl_;
 
   nb::scoped_refptr<Shader> vertex_shader_;
   nb::scoped_refptr<Shader> fragment_shader_;
diff --git a/glimp/gles/program_impl.h b/glimp/gles/program_impl.h
index 8718317..2cdad92 100644
--- a/glimp/gles/program_impl.h
+++ b/glimp/gles/program_impl.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,7 +21,7 @@
 #include <string>
 
 #include "glimp/gles/shader.h"
-#include "nb/ref_counted.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
diff --git a/glimp/gles/ref_counted_resource_map.h b/glimp/gles/ref_counted_resource_map.h
index 08b5e84..f08be9d 100644
--- a/glimp/gles/ref_counted_resource_map.h
+++ b/glimp/gles/ref_counted_resource_map.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,9 +19,10 @@
 #define GLIMP_GLES_REF_COUNTED_RESOURCE_MAP_H_
 
 #include <map>
+#include <utility>
 
 #include "glimp/gles/unique_id_generator.h"
-#include "nb/ref_counted.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
diff --git a/glimp/gles/renderbuffer.h b/glimp/gles/renderbuffer.h
index 24504e7..aed999b 100644
--- a/glimp/gles/renderbuffer.h
+++ b/glimp/gles/renderbuffer.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,7 +20,7 @@
 
 #include <GLES3/gl3.h>
 
-#include "nb/ref_counted.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
diff --git a/glimp/gles/resource_manager.h b/glimp/gles/resource_manager.h
index c2be6fd..fa72e47 100644
--- a/glimp/gles/resource_manager.h
+++ b/glimp/gles/resource_manager.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,7 +25,7 @@
 #include "glimp/gles/renderbuffer.h"
 #include "glimp/gles/shader.h"
 #include "glimp/gles/texture.h"
-#include "nb/ref_counted.h"
+#include "glimp/ref_counted.h"
 #include "starboard/common/mutex.h"
 
 namespace glimp {
diff --git a/glimp/gles/sampler.h b/glimp/gles/sampler.h
index 6353abe..f0faf7a 100644
--- a/glimp/gles/sampler.h
+++ b/glimp/gles/sampler.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,7 +18,7 @@
 #ifndef GLIMP_GLES_SAMPLER_H_
 #define GLIMP_GLES_SAMPLER_H_
 
-#include "nb/ref_counted.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
diff --git a/glimp/gles/shader.cc b/glimp/gles/shader.cc
index fbb56fc..34d70ca 100644
--- a/glimp/gles/shader.cc
+++ b/glimp/gles/shader.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,13 +16,16 @@
  */
 
 #include "glimp/gles/shader.h"
+
+#include <utility>
+
 #include "starboard/common/string.h"
 
 namespace glimp {
 namespace gles {
 
-Shader::Shader(nb::scoped_ptr<ShaderImpl> impl, GLenum type)
-    : impl_(impl.Pass()), type_(type), compile_results_(false) {}
+Shader::Shader(std::unique_ptr<ShaderImpl> impl, GLenum type)
+    : impl_(std::move(impl)), type_(type), compile_results_(false) {}
 
 void Shader::ShaderSource(GLsizei count,
                           const GLchar* const* string,
@@ -70,8 +74,8 @@
 void Shader::GetShaderInfoLog(GLsizei bufsize,
                               GLsizei* length,
                               GLchar* infolog) {
-  *length = starboard::strlcpy(infolog, compile_results_.info_log.c_str(),
-                               bufsize);
+  *length =
+      starboard::strlcpy(infolog, compile_results_.info_log.c_str(), bufsize);
 }
 
 }  // namespace gles
diff --git a/glimp/gles/shader.h b/glimp/gles/shader.h
index e378a84..150c653 100644
--- a/glimp/gles/shader.h
+++ b/glimp/gles/shader.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,16 +22,16 @@
 
 #include <string>
 
+#include <memory>
 #include "glimp/gles/shader_impl.h"
-#include "nb/ref_counted.h"
-#include "nb/scoped_ptr.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
 
 class Shader : public nb::RefCountedThreadSafe<Shader> {
  public:
-  Shader(nb::scoped_ptr<ShaderImpl> impl, GLenum type);
+  Shader(std::unique_ptr<ShaderImpl> impl, GLenum type);
 
   GLenum type() const { return type_; }
 
@@ -58,7 +59,7 @@
   friend class nb::RefCountedThreadSafe<Shader>;
   ~Shader() {}
 
-  nb::scoped_ptr<ShaderImpl> impl_;
+  std::unique_ptr<ShaderImpl> impl_;
 
   GLenum type_;
 
diff --git a/glimp/gles/texture.cc b/glimp/gles/texture.cc
index 0e981c3..04cffd9 100644
--- a/glimp/gles/texture.cc
+++ b/glimp/gles/texture.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,14 +17,18 @@
 
 #include "glimp/gles/texture.h"
 
+#include <utility>
+
+#include "glimp/rect.h"
 #include "nb/pointer_arithmetic.h"
-#include "nb/rect.h"
 
 namespace glimp {
 namespace gles {
 
-Texture::Texture(nb::scoped_ptr<TextureImpl> impl)
-    : impl_(impl.Pass()), texture_allocated_(false), bound_to_surface_(NULL) {}
+Texture::Texture(std::unique_ptr<TextureImpl> impl)
+    : impl_(std::move(impl)),
+      texture_allocated_(false),
+      bound_to_surface_(NULL) {}
 
 void Texture::Initialize(GLint level,
                          PixelFormat pixel_format,
diff --git a/glimp/gles/texture.h b/glimp/gles/texture.h
index 6b18929..e2a2034 100644
--- a/glimp/gles/texture.h
+++ b/glimp/gles/texture.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,20 +20,20 @@
 
 #include <GLES3/gl3.h>
 
+#include <memory>
 #include "glimp/egl/surface.h"
 #include "glimp/gles/buffer.h"
 #include "glimp/gles/pixel_format.h"
 #include "glimp/gles/sampler.h"
 #include "glimp/gles/texture_impl.h"
-#include "nb/ref_counted.h"
-#include "nb/scoped_ptr.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
 
 class Texture : public nb::RefCountedThreadSafe<Texture> {
  public:
-  explicit Texture(nb::scoped_ptr<TextureImpl> impl);
+  explicit Texture(std::unique_ptr<TextureImpl> impl);
 
   void Initialize(GLint level,
                   PixelFormat pixel_format,
@@ -108,7 +109,7 @@
   friend class nb::RefCountedThreadSafe<Texture>;
   ~Texture() {}
 
-  nb::scoped_ptr<TextureImpl> impl_;
+  std::unique_ptr<TextureImpl> impl_;
 
   // True if underlying texture data has been allocated yet or not (e.g.
   // will be true after glTexImage2D() is called.)
diff --git a/glimp/gles/texture_impl.h b/glimp/gles/texture_impl.h
index 60534f7..cdf654e 100644
--- a/glimp/gles/texture_impl.h
+++ b/glimp/gles/texture_impl.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2015 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,8 +22,8 @@
 #include "glimp/gles/buffer.h"
 #include "glimp/gles/pixel_format.h"
 #include "glimp/gles/shader.h"
-#include "nb/rect.h"
-#include "nb/ref_counted.h"
+#include "glimp/rect.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
diff --git a/nb/polymorphic_downcast.h b/glimp/polymorphic_downcast.h
similarity index 85%
rename from nb/polymorphic_downcast.h
rename to glimp/polymorphic_downcast.h
index ae4fe67..56dae89 100644
--- a/nb/polymorphic_downcast.h
+++ b/glimp/polymorphic_downcast.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2014 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,8 +15,8 @@
  * limitations under the License.
  */
 
-#ifndef NB_POLYMORPHIC_DOWNCAST_H_
-#define NB_POLYMORPHIC_DOWNCAST_H_
+#ifndef GLIMP_POLYMORPHIC_DOWNCAST_H_
+#define GLIMP_POLYMORPHIC_DOWNCAST_H_
 
 #include "starboard/common/log.h"
 
@@ -34,4 +35,4 @@
 
 }  // namespace nb
 
-#endif  // NB_POLYMORPHIC_DOWNCAST_H_
+#endif  // GLIMP_POLYMORPHIC_DOWNCAST_H_
diff --git a/nb/rect.h b/glimp/rect.h
similarity index 89%
rename from nb/rect.h
rename to glimp/rect.h
index 73a3767..9d2e47d 100644
--- a/nb/rect.h
+++ b/glimp/rect.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,8 +15,8 @@
  * limitations under the License.
  */
 
-#ifndef NB_RECT_H_
-#define NB_RECT_H_
+#ifndef GLIMP_RECT_H_
+#define GLIMP_RECT_H_
 
 namespace nb {
 
@@ -41,4 +42,4 @@
 
 }  // namespace nb
 
-#endif  // NB_RECT_H_
+#endif  // GLIMP_RECT_H_
diff --git a/glimp/ref_counted.cc b/glimp/ref_counted.cc
new file mode 100644
index 0000000..00b739e
--- /dev/null
+++ b/glimp/ref_counted.cc
@@ -0,0 +1,120 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "glimp/ref_counted.h"
+
+#include "starboard/common/log.h"
+
+namespace nb {
+
+namespace subtle {
+
+RefCountedBase::RefCountedBase()
+    : ref_count_(0)
+#ifndef NDEBUG
+      ,
+      in_dtor_(false)
+#endif
+{
+}
+
+RefCountedBase::~RefCountedBase() {
+#ifndef NDEBUG
+  SB_DCHECK(in_dtor_) << "RefCounted object deleted without calling Release()";
+#endif
+}
+
+void RefCountedBase::AddRef() const {
+// TODO(maruel): Add back once it doesn't assert 500 times/sec.
+// Current thread books the critical section "AddRelease" without release it.
+// DFAKE_SCOPED_LOCK_THREAD_LOCKED(add_release_);
+#ifndef NDEBUG
+  SB_DCHECK(!in_dtor_);
+#endif
+  ++ref_count_;
+}
+
+bool RefCountedBase::Release() const {
+// TODO(maruel): Add back once it doesn't assert 500 times/sec.
+// Current thread books the critical section "AddRelease" without release it.
+// DFAKE_SCOPED_LOCK_THREAD_LOCKED(add_release_);
+#ifndef NDEBUG
+  SB_DCHECK(!in_dtor_);
+#endif
+  if (--ref_count_ == 0) {
+#ifndef NDEBUG
+    in_dtor_ = true;
+#endif
+    return true;
+  }
+  return false;
+}
+
+bool RefCountedThreadSafeBase::HasOneRef() const {
+  return (SbAtomicAcquire_Load(
+              &const_cast<RefCountedThreadSafeBase*>(this)->ref_count_) == 1);
+}
+
+RefCountedThreadSafeBase::RefCountedThreadSafeBase() : ref_count_(0) {
+#ifndef NDEBUG
+  in_dtor_ = false;
+#endif
+}
+
+RefCountedThreadSafeBase::~RefCountedThreadSafeBase() {
+#ifndef NDEBUG
+  SB_DCHECK(in_dtor_) << "RefCountedThreadSafe object deleted without "
+                         "calling Release()";
+#endif
+}
+
+void RefCountedThreadSafeBase::AddRef() const {
+#ifndef NDEBUG
+  SB_DCHECK(!in_dtor_);
+#endif
+  SbAtomicNoBarrier_Increment(&ref_count_, 1);
+}
+
+bool RefCountedThreadSafeBase::Release() const {
+#ifndef NDEBUG
+  SB_DCHECK(!in_dtor_);
+  SB_DCHECK(!(SbAtomicAcquire_Load(&ref_count_) == 0));
+#endif
+  if (SbAtomicBarrier_Increment(&ref_count_, -1) == 0) {
+#ifndef NDEBUG
+    in_dtor_ = true;
+#endif
+    return true;
+  }
+  return false;
+}
+
+}  // namespace subtle
+
+}  // namespace nb
diff --git a/nb/ref_counted.h b/glimp/ref_counted.h
similarity index 76%
rename from nb/ref_counted.h
rename to glimp/ref_counted.h
index 90b4344..52ff767 100644
--- a/nb/ref_counted.h
+++ b/glimp/ref_counted.h
@@ -1,11 +1,38 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#ifndef NB_REF_COUNTED_H_
-#define NB_REF_COUNTED_H_
+#ifndef GLIMP_REF_COUNTED_H_
+#define GLIMP_REF_COUNTED_H_
 
-#include "nb/thread_collision_warner.h"
+#include <utility>
+
+#include "glimp/thread_collision_warner.h"
 #include "starboard/atomic.h"
 #include "starboard/common/log.h"
 
@@ -146,7 +173,8 @@
 class RefCountedData : public nb::RefCountedThreadSafe<nb::RefCountedData<T> > {
  public:
   RefCountedData() : data() {}
-  RefCountedData(const T& in_value) : data(in_value) {}
+  RefCountedData(const T& in_value)  // NOLINT(runtime/explicit)
+      : data(in_value) {}
 
   T data;
 
@@ -210,7 +238,7 @@
 
   scoped_refptr() : ptr_(NULL) {}
 
-  scoped_refptr(T* p) : ptr_(p) {
+  scoped_refptr(T* p) : ptr_(p) {  // NOLINT(runtime/explicit)
     if (ptr_)
       ptr_->AddRef();
   }
@@ -279,4 +307,4 @@
 
 }  // namespace nb
 
-#endif  // NB_REF_COUNTED_H_
+#endif  // GLIMP_REF_COUNTED_H_
diff --git a/glimp/shaders/generate_glsl_shader_map.py b/glimp/shaders/generate_glsl_shader_map.py
index 1705182..a601e1d 100644
--- a/glimp/shaders/generate_glsl_shader_map.py
+++ b/glimp/shaders/generate_glsl_shader_map.py
@@ -213,8 +213,8 @@
     if IsGLSL(item):
       basename = GetBasename(item)
       if basename in basename_to_glsl_file:
-        raise Exception('Multiple GLSL files match the same basename (' +
-                        basename + ')')
+        raise RuntimeError('Multiple GLSL files match the same basename (' +
+                           basename + ')')
       basename_to_glsl_file[basename] = item
 
   # Now iterate through again linking keys to values to create the map that we
@@ -224,11 +224,11 @@
     if not IsGLSL(item):
       basename = GetBasename(item)
       if not basename in basename_to_glsl_file:
-        raise Exception('Platform-specific file ' + item +
-                        ' has no GLSL match.')
+        raise RuntimeError('Platform-specific file ' + item +
+                           ' has no GLSL match.')
       glsl_file = basename_to_glsl_file[basename]
       if glsl_file in mapped_files:
-        raise Exception(
+        raise RuntimeError(
             'Multiple platform-specific files match the same GLSL ' +
             'file with basename ' + basename)
       mapped_files[glsl_file] = item
@@ -288,8 +288,8 @@
   for k, v in glsl_to_shader_map.items():
     hashed_glsl = HashGLSLShaderFile(k)
     if hashed_glsl in hash_shader_map:
-      raise Exception('Hash collision between GLSL files ' + k + ' and ' +
-                      hash_to_glsl_map[hashed_glsl] + '.')
+      raise RuntimeError('Hash collision between GLSL files ' + k + ' and ' +
+                         hash_to_glsl_map[hashed_glsl] + '.')
     hash_to_glsl_map[hashed_glsl] = k
     hash_shader_map[hashed_glsl] = v
   return hash_shader_map
diff --git a/glimp/stub/egl/display_impl.cc b/glimp/stub/egl/display_impl.cc
index 5b20e47..f410fec 100644
--- a/glimp/stub/egl/display_impl.cc
+++ b/glimp/stub/egl/display_impl.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,10 +17,10 @@
 
 #include "glimp/stub/egl/display_impl.h"
 
+#include <memory>
 #include "glimp/stub/egl/pbuffer_surface_impl.h"
 #include "glimp/stub/egl/window_surface_impl.h"
 #include "glimp/stub/gles/context_impl.h"
-#include "nb/scoped_ptr.h"
 #include "starboard/common/log.h"
 #include "starboard/once.h"
 #include "starboard/types.h"
@@ -43,10 +44,10 @@
   return native_display == EGL_DEFAULT_DISPLAY;
 }
 
-nb::scoped_ptr<DisplayImpl> DisplayImpl::Create(
+std::unique_ptr<DisplayImpl> DisplayImpl::Create(
     EGLNativeDisplayType native_display) {
   SB_CHECK(IsValidNativeDisplayType(native_display));
-  return nb::scoped_ptr<DisplayImpl>(new DisplayImplStub());
+  return std::unique_ptr<DisplayImpl>(new DisplayImplStub());
 }
 
 DisplayImpl::VersionInfo DisplayImplStub::GetVersionInfo() {
@@ -74,13 +75,13 @@
   supported_configs_.insert(config);
 }
 
-nb::scoped_ptr<gles::ContextImpl> DisplayImplStub::CreateContext(
+std::unique_ptr<gles::ContextImpl> DisplayImplStub::CreateContext(
     const Config* config,
     int gles_version) {
   if (gles_version == 2 || gles_version == 3) {
-    return nb::scoped_ptr<gles::ContextImpl>(new gles::ContextImplStub());
+    return std::unique_ptr<gles::ContextImpl>(new gles::ContextImplStub());
   } else {
-    return nb::scoped_ptr<gles::ContextImpl>();
+    return std::unique_ptr<gles::ContextImpl>();
   }
 }
 
diff --git a/glimp/stub/egl/display_impl.h b/glimp/stub/egl/display_impl.h
index 4d67036..497e97f 100644
--- a/glimp/stub/egl/display_impl.h
+++ b/glimp/stub/egl/display_impl.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,9 +21,9 @@
 #include <map>
 #include <set>
 
+#include <memory>
 #include "glimp/egl/config.h"
 #include "glimp/egl/display_impl.h"
-#include "nb/scoped_ptr.h"
 
 namespace glimp {
 namespace egl {
@@ -38,17 +39,17 @@
     return supported_configs_;
   }
 
-  nb::scoped_ptr<SurfaceImpl> CreateWindowSurface(
+  std::unique_ptr<SurfaceImpl> CreateWindowSurface(
       const Config* config,
       EGLNativeWindowType win,
       const AttribMap& attributes) override;
 
-  nb::scoped_ptr<SurfaceImpl> CreatePbufferSurface(
+  std::unique_ptr<SurfaceImpl> CreatePbufferSurface(
       const Config* config,
       const AttribMap& attributes) override;
 
-  nb::scoped_ptr<gles::ContextImpl> CreateContext(const Config* config,
-                                                  int gles_version) override;
+  std::unique_ptr<gles::ContextImpl> CreateContext(const Config* config,
+                                                   int gles_version) override;
 
   bool SetSwapInterval(int interval) override { return true; }
 
diff --git a/glimp/stub/egl/get_proc_address_impl.cc b/glimp/stub/egl/get_proc_address_impl.cc
index dc17f70..7a768699 100644
--- a/glimp/stub/egl/get_proc_address_impl.cc
+++ b/glimp/stub/egl/get_proc_address_impl.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,8 +19,8 @@
 
 #include "glimp/egl/display_registry.h"
 #include "glimp/egl/scoped_egl_lock.h"
+#include "glimp/polymorphic_downcast.h"
 #include "glimp/stub/egl/display_impl.h"
-#include "nb/polymorphic_downcast.h"
 #include "starboard/common/string.h"
 
 namespace glimp {
diff --git a/glimp/stub/egl/pbuffer_surface_impl.h b/glimp/stub/egl/pbuffer_surface_impl.h
index b24d364..0932668 100644
--- a/glimp/stub/egl/pbuffer_surface_impl.h
+++ b/glimp/stub/egl/pbuffer_surface_impl.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,8 +20,8 @@
 
 #include <KHR/khrplatform.h>
 
+#include "glimp/ref_counted.h"
 #include "glimp/stub/egl/surface_impl.h"
-#include "nb/ref_counted.h"
 
 namespace glimp {
 namespace egl {
diff --git a/glimp/stub/gles/buffer_impl.h b/glimp/stub/gles/buffer_impl.h
index d166561..17e0c63 100644
--- a/glimp/stub/gles/buffer_impl.h
+++ b/glimp/stub/gles/buffer_impl.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,7 +19,7 @@
 #define GLIMP_STUB_GLES_BUFFER_IMPL_H_
 
 #include "glimp/gles/buffer_impl.h"
-#include "nb/ref_counted.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
diff --git a/glimp/stub/gles/context_impl.cc b/glimp/stub/gles/context_impl.cc
index 5e579ef..dc882ca 100644
--- a/glimp/stub/gles/context_impl.cc
+++ b/glimp/stub/gles/context_impl.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,14 +20,14 @@
 #include <algorithm>
 #include <vector>
 
+#include "glimp/polymorphic_downcast.h"
+#include "glimp/rect.h"
 #include "glimp/stub/egl/surface_impl.h"
 #include "glimp/stub/gles/buffer_impl.h"
 #include "glimp/stub/gles/program_impl.h"
 #include "glimp/stub/gles/shader_impl.h"
 #include "glimp/stub/gles/texture_impl.h"
 #include "glimp/tracing/tracing.h"
-#include "nb/polymorphic_downcast.h"
-#include "nb/rect.h"
 
 namespace glimp {
 namespace gles {
@@ -67,30 +68,30 @@
 }
 
 int ContextImplStub::GetMaxFragmentUniformVectors() const {
-  // GL ES rquires that it is at least 16, so we will return that.
+  // GL ES requires that it is at least 16, so we will return that.
   return ProgramImplStub::kMaxUniformsPerShader;
 }
 
-nb::scoped_ptr<ProgramImpl> ContextImplStub::CreateProgram() {
-  return nb::scoped_ptr<ProgramImpl>(new ProgramImplStub());
+std::unique_ptr<ProgramImpl> ContextImplStub::CreateProgram() {
+  return std::unique_ptr<ProgramImpl>(new ProgramImplStub());
 }
 
-nb::scoped_ptr<ShaderImpl> ContextImplStub::CreateVertexShader() {
-  return nb::scoped_ptr<ShaderImpl>(
+std::unique_ptr<ShaderImpl> ContextImplStub::CreateVertexShader() {
+  return std::unique_ptr<ShaderImpl>(
       new ShaderImplStub(ShaderImplStub::kVertex));
 }
 
-nb::scoped_ptr<ShaderImpl> ContextImplStub::CreateFragmentShader() {
-  return nb::scoped_ptr<ShaderImpl>(
+std::unique_ptr<ShaderImpl> ContextImplStub::CreateFragmentShader() {
+  return std::unique_ptr<ShaderImpl>(
       new ShaderImplStub(ShaderImplStub::kFragment));
 }
 
-nb::scoped_ptr<BufferImpl> ContextImplStub::CreateBuffer() {
-  return nb::scoped_ptr<BufferImpl>(new BufferImplStub());
+std::unique_ptr<BufferImpl> ContextImplStub::CreateBuffer() {
+  return std::unique_ptr<BufferImpl>(new BufferImplStub());
 }
 
-nb::scoped_ptr<TextureImpl> ContextImplStub::CreateTexture() {
-  return nb::scoped_ptr<TextureImpl>(new TextureImplStub());
+std::unique_ptr<TextureImpl> ContextImplStub::CreateTexture() {
+  return std::unique_ptr<TextureImpl>(new TextureImplStub());
 }
 
 void ContextImplStub::Flush() {
diff --git a/glimp/stub/gles/context_impl.h b/glimp/stub/gles/context_impl.h
index ef8bd77..6ed9626 100644
--- a/glimp/stub/gles/context_impl.h
+++ b/glimp/stub/gles/context_impl.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,12 +18,12 @@
 #ifndef GLIMP_STUB_GLES_CONTEXT_IMPL_H_
 #define GLIMP_STUB_GLES_CONTEXT_IMPL_H_
 
+#include <memory>
 #include "glimp/egl/surface.h"
 #include "glimp/gles/context_impl.h"
 #include "glimp/gles/draw_state.h"
 #include "glimp/gles/index_data_type.h"
 #include "glimp/shaders/glsl_shader_map_helpers.h"
-#include "nb/scoped_ptr.h"
 
 namespace glimp {
 namespace gles {
@@ -41,14 +42,14 @@
   int GetMaxFragmentUniformVectors() const override;
   int GetMaxVertexTextureImageUnits() const override { return 0; }
 
-  nb::scoped_ptr<ProgramImpl> CreateProgram() override;
+  std::unique_ptr<ProgramImpl> CreateProgram() override;
 
-  nb::scoped_ptr<ShaderImpl> CreateVertexShader() override;
-  nb::scoped_ptr<ShaderImpl> CreateFragmentShader() override;
+  std::unique_ptr<ShaderImpl> CreateVertexShader() override;
+  std::unique_ptr<ShaderImpl> CreateFragmentShader() override;
 
-  nb::scoped_ptr<BufferImpl> CreateBuffer() override;
+  std::unique_ptr<BufferImpl> CreateBuffer() override;
 
-  nb::scoped_ptr<TextureImpl> CreateTexture() override;
+  std::unique_ptr<TextureImpl> CreateTexture() override;
 
   void Flush() override;
   void Finish() override;
diff --git a/glimp/stub/gles/program_impl.cc b/glimp/stub/gles/program_impl.cc
index c9125db..ae6afe8 100644
--- a/glimp/stub/gles/program_impl.cc
+++ b/glimp/stub/gles/program_impl.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,8 +17,8 @@
 
 #include "glimp/stub/gles/program_impl.h"
 
+#include "glimp/polymorphic_downcast.h"
 #include "glimp/stub/gles/shader_impl.h"
-#include "nb/polymorphic_downcast.h"
 #include "starboard/common/log.h"
 
 namespace glimp {
diff --git a/glimp/stub/gles/program_impl.h b/glimp/stub/gles/program_impl.h
index 64d5aba..5825766 100644
--- a/glimp/stub/gles/program_impl.h
+++ b/glimp/stub/gles/program_impl.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,8 +23,8 @@
 #include "glimp/gles/program_impl.h"
 #include "glimp/gles/shader.h"
 #include "glimp/gles/uniform_info.h"
+#include "glimp/ref_counted.h"
 #include "glimp/stub/gles/shader_impl.h"
-#include "nb/ref_counted.h"
 
 namespace glimp {
 namespace gles {
diff --git a/glimp/stub/gles/shader_impl.h b/glimp/stub/gles/shader_impl.h
index 9976834..862aa2e 100644
--- a/glimp/stub/gles/shader_impl.h
+++ b/glimp/stub/gles/shader_impl.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,8 +22,8 @@
 
 #include "glimp/gles/shader_impl.h"
 #include "glimp/gles/uniform_info.h"
+#include "glimp/ref_counted.h"
 #include "glimp/shaders/glsl_shader_map_helpers.h"
-#include "nb/ref_counted.h"
 #include "starboard/common/log.h"
 
 namespace glimp {
diff --git a/glimp/stub/gles/texture_impl.cc b/glimp/stub/gles/texture_impl.cc
index 56dd7c2..b7ed24a 100644
--- a/glimp/stub/gles/texture_impl.cc
+++ b/glimp/stub/gles/texture_impl.cc
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,9 +20,9 @@
 #include <algorithm>
 
 #include "glimp/gles/convert_pixel_data.h"
+#include "glimp/polymorphic_downcast.h"
 #include "glimp/stub/egl/pbuffer_surface_impl.h"
 #include "glimp/stub/gles/buffer_impl.h"
-#include "nb/polymorphic_downcast.h"
 #include "starboard/memory.h"
 
 namespace glimp {
diff --git a/glimp/stub/gles/texture_impl.h b/glimp/stub/gles/texture_impl.h
index e37a82b..30a1fe9 100644
--- a/glimp/stub/gles/texture_impl.h
+++ b/glimp/stub/gles/texture_impl.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright 2023 The Cobalt Authors. All Rights Reserved.
  * Copyright 2016 Google Inc. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,8 +23,8 @@
 #include "glimp/gles/buffer.h"
 #include "glimp/gles/pixel_format.h"
 #include "glimp/gles/texture_impl.h"
-#include "nb/rect.h"
-#include "nb/ref_counted.h"
+#include "glimp/rect.h"
+#include "glimp/ref_counted.h"
 
 namespace glimp {
 namespace gles {
diff --git a/glimp/thread_collision_warner.cc b/glimp/thread_collision_warner.cc
new file mode 100644
index 0000000..31e62da
--- /dev/null
+++ b/glimp/thread_collision_warner.cc
@@ -0,0 +1,88 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "glimp/thread_collision_warner.h"
+
+#include "starboard/atomic.h"
+#include "starboard/common/log.h"
+#include "starboard/thread.h"
+#include "starboard/types.h"
+
+namespace nb {
+
+void DCheckAsserter::warn() {
+  SB_NOTREACHED() << "Thread Collision";
+}
+
+static SbAtomic32 CurrentThread() {
+  const SbThreadId current_thread_id = SbThreadGetId();
+  // We need to get the thread id into an atomic data type. This might be a
+  // truncating conversion, but any loss-of-information just increases the
+  // chance of a false negative, not a false positive.
+  const SbAtomic32 atomic_thread_id =
+      static_cast<SbAtomic32>(current_thread_id);
+  return atomic_thread_id;
+}
+
+void ThreadCollisionWarner::EnterSelf() {
+  // If the active thread is 0 then I'll write the current thread ID
+  // if two or more threads arrive here only one will succeed to
+  // write on valid_thread_id_ the current thread ID.
+  SbAtomic32 current_thread_id = CurrentThread();
+
+  int previous_value =
+      SbAtomicNoBarrier_CompareAndSwap(&valid_thread_id_, 0, current_thread_id);
+  if (previous_value != 0 && previous_value != current_thread_id) {
+    // gotcha! a thread is trying to use the same class and that is
+    // not current thread.
+    asserter_->warn();
+  }
+
+  SbAtomicNoBarrier_Increment(&counter_, 1);
+}
+
+void ThreadCollisionWarner::Enter() {
+  SbAtomic32 current_thread_id = CurrentThread();
+
+  if (SbAtomicNoBarrier_CompareAndSwap(&valid_thread_id_, 0,
+                                       current_thread_id) != 0) {
+    // gotcha! another thread is trying to use the same class.
+    asserter_->warn();
+  }
+
+  SbAtomicNoBarrier_Increment(&counter_, 1);
+}
+
+void ThreadCollisionWarner::Leave() {
+  if (SbAtomicBarrier_Increment(&counter_, -1) == 0) {
+    SbAtomicNoBarrier_Store(&valid_thread_id_, 0);
+  }
+}
+
+}  // namespace nb
diff --git a/nb/thread_collision_warner.h b/glimp/thread_collision_warner.h
similarity index 79%
rename from nb/thread_collision_warner.h
rename to glimp/thread_collision_warner.h
index e0f1e34..ca30a04 100644
--- a/nb/thread_collision_warner.h
+++ b/glimp/thread_collision_warner.h
@@ -1,9 +1,34 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#ifndef NB_THREAD_COLLISION_WARNER_H_
-#define NB_THREAD_COLLISION_WARNER_H_
+#ifndef GLIMP_THREAD_COLLISION_WARNER_H_
+#define GLIMP_THREAD_COLLISION_WARNER_H_
 
 #include "starboard/atomic.h"
 
@@ -217,4 +242,4 @@
 
 }  // namespace nb
 
-#endif  // NB_THREAD_COLLISION_WARNER_H_
+#endif  // GLIMP_THREAD_COLLISION_WARNER_H_
diff --git a/nb/BUILD.gn b/nb/BUILD.gn
index c4a7b41..5189305 100644
--- a/nb/BUILD.gn
+++ b/nb/BUILD.gn
@@ -19,51 +19,13 @@
     sources = [
       "allocator.cc",
       "allocator.h",
-      "analytics/memory_tracker.cc",
-      "analytics/memory_tracker.h",
-      "analytics/memory_tracker_helpers.cc",
-      "analytics/memory_tracker_helpers.h",
-      "analytics/memory_tracker_impl.cc",
-      "analytics/memory_tracker_impl.h",
-      "bidirectional_fit_reuse_allocator.cc",
-      "bidirectional_fit_reuse_allocator.h",
-      "bit_cast.h",
-      "concurrent_map.h",
-      "concurrent_ptr.h",
       "first_fit_reuse_allocator.cc",
       "first_fit_reuse_allocator.h",
       "fixed_no_free_allocator.cc",
       "fixed_no_free_allocator.h",
-      "hash.cc",
-      "hash.h",
-      "memory_pool.h",
-      "memory_scope.cc",
-      "memory_scope.h",
-      "move.h",
-      "multipart_allocator.cc",
-      "multipart_allocator.h",
       "pointer_arithmetic.h",
-      "rect.h",
-      "ref_counted.cc",
-      "ref_counted.h",
       "reuse_allocator_base.cc",
       "reuse_allocator_base.h",
-      "rewindable_vector.h",
-      "scoped_ptr.h",
-      "simple_profiler.cc",
-      "simple_profiler.h",
-      "simple_thread.cc",
-      "simple_thread.h",
-      "starboard_aligned_memory_deleter.h",
-      "starboard_memory_allocator.h",
-      "std_allocator.h",
-      "string_interner.cc",
-      "string_interner.h",
-      "thread_collision_warner.cc",
-      "thread_collision_warner.h",
-      "thread_local_boolean.h",
-      "thread_local_object.h",
-      "thread_local_pointer.h",
     ]
 
     deps = [
@@ -71,7 +33,9 @@
       "//starboard/common",
     ]
 
-    if (defined(has_nb_platform) && has_nb_platform) {
+    # TODO: b/295615064 Remove nb platform specific dependency.
+    if (defined(has_nb_platform) && has_nb_platform &&
+        current_toolchain == starboard_toolchain) {
       deps += [ "//$starboard_path/nb:nb_platform" ]
     }
   }
@@ -82,23 +46,9 @@
 
   if (is_starboard) {
     sources = [
-      "analytics/memory_tracker_helpers_test.cc",
-      "analytics/memory_tracker_impl_test.cc",
-      "analytics/memory_tracker_test.cc",
-      "bidirectional_fit_reuse_allocator_test.cc",
-      "concurrent_map_test.cc",
-      "concurrent_ptr_test.cc",
       "first_fit_reuse_allocator_test.cc",
       "fixed_no_free_allocator_test.cc",
-      "memory_scope_test.cc",
-      "multipart_allocator_test.cc",
-      "rewindable_vector_test.cc",
       "run_all_unittests.cc",
-      "simple_profiler_test.cc",
-      "std_allocator_test.cc",
-      "string_interner_test.cc",
-      "test_thread.h",
-      "thread_local_object_test.cc",
     ]
 
     deps = [
diff --git a/nb/allocator.h b/nb/allocator.h
index 028e25d..39bb93b 100644
--- a/nb/allocator.h
+++ b/nb/allocator.h
@@ -52,7 +52,7 @@
   // as a free block. |size| will be set to the actual size allocated on
   // successful allocations. Will return NULL if the allocation fails. In the
   // case that the underlying block size is inconvenient or impossible to be
-  // retreived, the |size| can remain unchanged for a successful allocation. The
+  // retrieved, the |size| can remain unchanged for a successful allocation. The
   // user may lose the ability to combine two adjacent allocations in this case.
   // Note that the coding style recommends that in/out parameters to be placed
   // after input parameters but |size| is kept in the left for consistency.
diff --git a/nb/analytics/memory_tracker.cc b/nb/analytics/memory_tracker.cc
deleted file mode 100644
index e3d3d33..0000000
--- a/nb/analytics/memory_tracker.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/analytics/memory_tracker.h"
-
-#include "nb/analytics/memory_tracker_impl.h"
-#include "nb/scoped_ptr.h"
-#include "starboard/once.h"
-
-namespace nb {
-namespace analytics {
-namespace {
-SB_ONCE_INITIALIZE_FUNCTION(MemoryTrackerImpl, GetMemoryTrackerImplSingleton);
-}  // namespace
-
-MemoryTracker* MemoryTracker::Get() {
-  MemoryTracker* t = GetMemoryTrackerImplSingleton();
-  return t;
-}
-
-
-MemoryStats GetProcessMemoryStats() {
-  MemoryStats memory_stats;
-
-  memory_stats.total_cpu_memory = SbSystemGetTotalCPUMemory();
-  memory_stats.used_cpu_memory = SbSystemGetUsedCPUMemory();
-
-  if (SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats)) {
-    int64_t used_gpu_memory = SbSystemGetUsedGPUMemory();
-    memory_stats.total_gpu_memory = SbSystemGetTotalGPUMemory();
-    memory_stats.used_gpu_memory = SbSystemGetUsedGPUMemory();
-  }
-  return memory_stats;
-}
-
-}  // namespace analytics
-}  // namespace nb
diff --git a/nb/analytics/memory_tracker.h b/nb/analytics/memory_tracker.h
deleted file mode 100644
index cf6e0eb..0000000
--- a/nb/analytics/memory_tracker.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NB_MEMORY_TRACKER_H_
-#define NB_MEMORY_TRACKER_H_
-
-#include <vector>
-#include "starboard/configuration.h"
-#include "starboard/types.h"
-
-struct NbMemoryScopeInfo;
-
-namespace nb {
-namespace analytics {
-
-class MemoryTracker;
-class MemoryTrackerDebugCallback;
-class AllocationVisitor;
-class AllocationGroup;
-
-struct MemoryStats {
-  MemoryStats()
-      : total_cpu_memory(0),
-        used_cpu_memory(0),
-        total_gpu_memory(0),
-        used_gpu_memory(0) {}
-  int64_t total_cpu_memory;
-  int64_t used_cpu_memory;
-  int64_t total_gpu_memory;
-  int64_t used_gpu_memory;
-};
-
-MemoryStats GetProcessMemoryStats();
-
-typedef std::vector<AllocationGroup*> AllocationGroupPtrVec;
-typedef std::vector<const NbMemoryScopeInfo*> CallStack;
-
-// Contains an allocation record for a pointer including it's size and what
-// AllocationGroup it was constructed under.
-class AllocationRecord {
- public:
-  AllocationRecord() : size(0), allocation_group(NULL) {}
-  AllocationRecord(size_t sz, AllocationGroup* group)
-      : size(sz), allocation_group(group) {}
-
-  static AllocationRecord Empty() { return AllocationRecord(); }
-  bool IsEmpty() const { return !size && !allocation_group; }
-  size_t size;
-  AllocationGroup* allocation_group;
-};
-
-// Creates a MemoryTracker instance that implements the
-//  MemoryTracker. Once the instance is created it can begin tracking
-//  system allocations by calling InstallGlobalTrackingHooks().
-//  Deleting the MemoryTracker is forbidden.
-//
-// Example, Creation and Hooking:
-//   static MemoryTracker* s_global_tracker =
-//       GetOrCreateMemoryTracker();
-//   s_global_tracker->InstallGlobalTrackingHooks();  // now tracking memory.
-//
-// Data about the allocations are aggregated under AllocationGroups and it's
-//  recommended that GetAllocationGroups(...) is used to get simple allocation
-//  statistics.
-//
-// Deeper analytics are possible by creating an AllocationVisitor subclass and
-//  traversing through the internal allocations of the tracker. In this way all
-//  known information about allocation state of the program is made accessible.
-//  The visitor does not need to perform any locking as this is guaranteed by
-//  the MemoryTracker.
-//
-// Example (AllocationVisitor):
-//  MyAllocation visitor = ...;
-//  s_global_tracker->Accept(&visitor);
-//  visitor.PrintAllocations();
-//
-// Performance:
-//  1) Gold builds disallow memory tracking and therefore have zero-cost
-//     for this feature.
-//  2) All other builds that allow memory tracking have minimal cost as long
-//     as memory tracking has not been activated. This is facilitated by NOT
-//     using locks, at the expense of thread safety during teardown (hence the
-//     reason why you should NOT delete a memory tracker with hooks installed).
-//  3) When the memory tracking has been activated then there is a non-trivial
-//     performance cost in terms of CPU and memory for the feature.
-class MemoryTracker {
- public:
-  // Gets the singleton instance of the default MemoryTracker. This
-  // is created the first time it is used.
-  static MemoryTracker* Get();
-
-  MemoryTracker() {}
-  virtual bool InstallGlobalTrackingHooks() = 0;
-
-  // It's recommended the MemoryTracker is never removed or deleted during the
-  // runtime.
-  virtual void RemoveGlobalTrackingHooks() = 0;
-
-  // Returns the total amount of bytes that are tracked.
-  virtual int64_t GetTotalAllocationBytes() = 0;
-  virtual int64_t GetTotalNumberOfAllocations() = 0;
-
-  // Allows probing of all memory allocations. The visitor does not need to
-  // perform any locking and can allocate memory during it's operation.
-  virtual void Accept(AllocationVisitor* visitor) = 0;
-
-  // Collects all memory groups that exist. The AllocationGroups lifetime
-  // exists for as long as the MemoryTracker instance is alive.
-  virtual void GetAllocationGroups(
-      std::vector<const AllocationGroup*>* output) = 0;
-
-  // Enabled/disables memory tracking in the current thread.
-  virtual void SetMemoryTrackingEnabled(bool on) = 0;
-  // Returns the memory tracking state in the current thread.
-  virtual bool IsMemoryTrackingEnabled() const = 0;
-
-  // Returns true if the memory was successfully tracked.
-  virtual bool AddMemoryTracking(const void* memory, size_t size) = 0;
-  // Returns a non-zero size if the memory was successfully removed.
-  virtual size_t RemoveMemoryTracking(const void* memory) = 0;
-  // Returns true if the memory has tracking. When true is returned then the
-  // supplied AllocRecord is written.
-  virtual bool GetMemoryTracking(const void* memory,
-                                 AllocationRecord* record) const = 0;
-  // Attaches a debug callback which fires on every new allocation that becomes
-  // visible. The intended use case is to allow the developer to inspect
-  // allocations that meet certain criteria. For example all allocations that
-  // are of a certain size range and are allocated under a particular memory
-  // scope.
-  virtual void SetMemoryTrackerDebugCallback(
-      MemoryTrackerDebugCallback* cb) = 0;
-
- protected:
-  virtual ~MemoryTracker() {}
-
-  MemoryTracker(const MemoryTracker&) = delete;
-  void operator=(const MemoryTracker&) = delete;
-};
-
-// A visitor class which is useful for inspecting data.
-class AllocationVisitor {
- public:
-  // Returns true to keep visiting, otherwise abort.
-  virtual bool Visit(const void* memory,
-                     const AllocationRecord& alloc_record) = 0;
-  virtual ~AllocationVisitor() {}
-};
-
-// See also MemoryTracker::SetMemoryTrackerDebugCallback(...)
-// The intended use case is to allow the developer to inspect
-// allocations that meet certain criteria. For example all allocations that
-// are of a certain size range and are allocated under a particular memory
-// scope.
-class MemoryTrackerDebugCallback {
- public:
-  virtual ~MemoryTrackerDebugCallback() {}
-
-  virtual void OnMemoryAllocation(const void* memory_block,
-                                  const AllocationRecord& record,
-                                  const CallStack& callstack) = 0;
-
-  virtual void OnMemoryDeallocation(const void* memory_block,
-                                    const AllocationRecord& record,
-                                    const CallStack& callstack) = 0;
-};
-
-}  // namespace analytics
-}  // namespace nb
-
-#endif  // NB_MEMORY_TRACKER_H_
diff --git a/nb/analytics/memory_tracker_helpers.cc b/nb/analytics/memory_tracker_helpers.cc
deleted file mode 100644
index 96c3ad5..0000000
--- a/nb/analytics/memory_tracker_helpers.cc
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/analytics/memory_tracker_helpers.h"
-
-#include <stdint.h>
-#include <vector>
-
-#include "nb/hash.h"
-#include "starboard/common/log.h"
-#include "starboard/configuration.h"
-
-namespace nb {
-namespace analytics {
-
-AllocationGroup::AllocationGroup(const std::string& name)
-    : name_(name), allocation_bytes_(0), num_allocations_(0) {
-}
-
-AllocationGroup::~AllocationGroup() {}
-
-void AllocationGroup::AddAllocation(int64_t num_bytes) {
-  if (num_bytes == 0)
-    return;
-  int num_alloc_diff = num_bytes > 0 ? 1 : -1;
-  allocation_bytes_.fetch_add(num_bytes);
-  num_allocations_.fetch_add(num_alloc_diff);
-}
-
-void AllocationGroup::GetAggregateStats(int32_t* num_allocs,
-                                        int64_t* allocation_bytes) const {
-  *num_allocs = num_allocations_.load();
-  *allocation_bytes = allocation_bytes_.load();
-}
-
-int64_t AllocationGroup::allocation_bytes() const {
-  return allocation_bytes_.load();
-}
-
-int32_t AllocationGroup::num_allocations() const {
-  return num_allocations_.load();
-}
-
-AtomicStringAllocationGroupMap::AtomicStringAllocationGroupMap() {
-  unaccounted_group_ = Ensure("Unaccounted");
-}
-
-AtomicStringAllocationGroupMap::~AtomicStringAllocationGroupMap() {
-  unaccounted_group_ = NULL;
-  while (!group_map_.empty()) {
-    Map::iterator it = group_map_.begin();
-    delete it->second;
-    group_map_.erase(it);
-  }
-}
-
-AllocationGroup* AtomicStringAllocationGroupMap::Ensure(
-    const std::string& name) {
-  starboard::ScopedLock lock(mutex_);
-  Map::const_iterator found_it = group_map_.find(name);
-  if (found_it != group_map_.end()) {
-    return found_it->second;
-  }
-  AllocationGroup* group = new AllocationGroup(name);
-  group_map_[name] = group;
-  return group;
-}
-
-AllocationGroup* AtomicStringAllocationGroupMap::GetDefaultUnaccounted() {
-  return unaccounted_group_;
-}
-
-bool AtomicStringAllocationGroupMap::Erase(const std::string& name) {
-  starboard::ScopedLock lock(mutex_);
-  Map::iterator found_it = group_map_.find(name);
-  if (found_it == group_map_.end()) {
-    // Didn't find it.
-    return false;
-  }
-  group_map_.erase(found_it);
-  return true;
-}
-
-void AtomicStringAllocationGroupMap::GetAll(
-    std::vector<const AllocationGroup*>* output) const {
-  starboard::ScopedLock lock(mutex_);
-  for (Map::const_iterator it = group_map_.begin(); it != group_map_.end();
-       ++it) {
-    output->push_back(it->second);
-  }
-}
-
-void AllocationGroupStack::Push(AllocationGroup* group) {
-  alloc_group_stack_.push_back(group);
-}
-
-void AllocationGroupStack::Pop() {
-  alloc_group_stack_.pop_back();
-}
-
-AllocationGroup* AllocationGroupStack::Peek() {
-  if (alloc_group_stack_.empty()) {
-    return NULL;
-  }
-  return alloc_group_stack_.back();
-}
-
-const AllocationGroup* AllocationGroupStack::Peek() const {
-  if (alloc_group_stack_.empty()) {
-    return NULL;
-  }
-  return alloc_group_stack_.back();
-}
-
-AtomicAllocationMap::AtomicAllocationMap() {}
-
-AtomicAllocationMap::~AtomicAllocationMap() {}
-
-bool AtomicAllocationMap::Add(const void* memory,
-                              const AllocationRecord& alloc_record) {
-  starboard::ScopedLock lock(mutex_);
-  const bool inserted =
-      pointer_map_.insert(std::make_pair(memory, alloc_record)).second;
-  return inserted;
-}
-
-bool AtomicAllocationMap::Get(const void* memory,
-                              AllocationRecord* alloc_record) const {
-  starboard::ScopedLock lock(mutex_);
-  PointerMap::const_iterator found_it = pointer_map_.find(memory);
-  if (found_it == pointer_map_.end()) {
-    if (alloc_record) {
-      *alloc_record = AllocationRecord::Empty();
-    }
-    return false;
-  }
-  if (alloc_record) {
-    *alloc_record = found_it->second;
-  }
-  return true;
-}
-
-bool AtomicAllocationMap::Remove(const void* memory,
-                                 AllocationRecord* alloc_record) {
-  starboard::ScopedLock lock(mutex_);
-  PointerMap::iterator found_it = pointer_map_.find(memory);
-
-  if (found_it == pointer_map_.end()) {
-    if (alloc_record) {
-      *alloc_record = AllocationRecord::Empty();
-    }
-    return false;
-  }
-  if (alloc_record) {
-    *alloc_record = found_it->second;
-  }
-  pointer_map_.erase(found_it);
-  return true;
-}
-
-bool AtomicAllocationMap::Accept(AllocationVisitor* visitor) const {
-  starboard::ScopedLock lock(mutex_);
-  for (PointerMap::const_iterator it = pointer_map_.begin();
-       it != pointer_map_.end(); ++it) {
-    const void* memory = it->first;
-    const AllocationRecord& alloc_rec = it->second;
-    if (!visitor->Visit(memory, alloc_rec)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-size_t AtomicAllocationMap::Size() const {
-  starboard::ScopedLock lock(mutex_);
-  return pointer_map_.size();
-}
-
-bool AtomicAllocationMap::Empty() const {
-  starboard::ScopedLock lock(mutex_);
-  return pointer_map_.empty();
-}
-
-void AtomicAllocationMap::Clear() {
-  starboard::ScopedLock lock(mutex_);
-  for (PointerMap::iterator it = pointer_map_.begin();
-       it != pointer_map_.end(); ++it) {
-    const AllocationRecord& rec = it->second;
-    AllocationGroup* group = rec.allocation_group;
-    const int64_t size = static_cast<int64_t>(rec.size);
-    group->AddAllocation(-size);
-  }
-  return pointer_map_.clear();
-}
-
-ConcurrentAllocationMap::ConcurrentAllocationMap() : pointer_map_array_() {}
-
-ConcurrentAllocationMap::~ConcurrentAllocationMap() {
-  Clear();
-}
-
-bool ConcurrentAllocationMap::Add(const void* memory,
-                                  const AllocationRecord& alloc_record) {
-  AtomicAllocationMap& map = GetMapForPointer(memory);
-  return map.Add(memory, alloc_record);
-}
-
-bool ConcurrentAllocationMap::Get(const void* memory,
-                                  AllocationRecord* alloc_record) const {
-  const AtomicAllocationMap& map = GetMapForPointer(memory);
-  return map.Get(memory, alloc_record);
-}
-
-bool ConcurrentAllocationMap::Remove(const void* memory,
-                                     AllocationRecord* alloc_record) {
-  AtomicAllocationMap& map = GetMapForPointer(memory);
-  bool output = map.Remove(memory, alloc_record);
-  return output;
-}
-
-size_t ConcurrentAllocationMap::Size() const {
-  size_t size = 0;
-  for (int i = 0; i < kNumElements; ++i) {
-    const AtomicAllocationMap& map = pointer_map_array_[i];
-    size += map.Size();
-  }
-  return size;
-}
-
-bool ConcurrentAllocationMap::Empty() const {
-  return 0 == Size();
-}
-
-void ConcurrentAllocationMap::Clear() {
-  for (int i = 0; i < kNumElements; ++i) {
-    AtomicAllocationMap& map = pointer_map_array_[i];
-    map.Clear();
-  }
-}
-
-bool ConcurrentAllocationMap::Accept(AllocationVisitor* visitor) const {
-  for (int i = 0; i < kNumElements; ++i) {
-    const AtomicAllocationMap& map = pointer_map_array_[i];
-    if (!map.Accept(visitor)) {
-      return false;  // Early out.
-    }
-  }
-  return true;
-}
-
-uint32_t ConcurrentAllocationMap::hash_ptr(const void* ptr) {
-  uintptr_t val = reinterpret_cast<uintptr_t>(ptr);
-  return RuntimeHash32(reinterpret_cast<const char*>(&val), sizeof(val));
-}
-
-int ConcurrentAllocationMap::ToIndex(const void* ptr) const {
-  SB_DCHECK(0 != kNumElements);
-  uint32_t hash_val = hash_ptr(ptr);
-  int index = hash_val % kNumElements;
-  return index;
-}
-
-AtomicAllocationMap& ConcurrentAllocationMap::GetMapForPointer(
-    const void* ptr) {
-  return pointer_map_array_[ToIndex(ptr)];
-}
-
-const AtomicAllocationMap& ConcurrentAllocationMap::GetMapForPointer(
-    const void* ptr) const {
-  return pointer_map_array_[ToIndex(ptr)];
-}
-
-}  // namespace analytics
-}  // namespace nb
diff --git a/nb/analytics/memory_tracker_helpers.h b/nb/analytics/memory_tracker_helpers.h
deleted file mode 100644
index 26bcfd7..0000000
--- a/nb/analytics/memory_tracker_helpers.h
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NB_ANALYTICS_MEMORY_TRACKER_HELPERS_H_
-#define NB_ANALYTICS_MEMORY_TRACKER_HELPERS_H_
-
-#include <functional>
-#include <map>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "nb/analytics/memory_tracker.h"
-#include "nb/simple_thread.h"
-#include "nb/std_allocator.h"
-#include "nb/thread_local_boolean.h"
-#include "nb/thread_local_pointer.h"
-#include "starboard/common/atomic.h"
-#include "starboard/common/log.h"
-#include "starboard/common/mutex.h"
-#include "starboard/memory.h"
-#include "starboard/thread.h"
-#include "starboard/types.h"
-
-namespace nb {
-namespace analytics {
-
-// This is used to build the std allocators for the internal data structures so
-// that they don't attempt to report memory allocations, while reporting
-// memory allocations.
-class NoReportAllocator {
- public:
-  NoReportAllocator() {}
-  NoReportAllocator(const NoReportAllocator&) {}
-  static void* Allocate(size_t n) { return SbMemoryAllocateNoReport(n); }
-  // Second argument can be used for accounting, but is otherwise optional.
-  static void Deallocate(void* ptr, size_t /* not used*/) {
-    SbMemoryDeallocateNoReport(ptr);
-  }
-};
-
-class AllocationGroup;
-class AllocationRecord;
-
-// An AllocationGroup is a collection of allocations that are logically lumped
-// together, such as "Javascript" or "Graphics".
-class AllocationGroup {
- public:
-  explicit AllocationGroup(const std::string& name);
-  ~AllocationGroup();
-  const std::string& name() const { return name_; }
-
-  void AddAllocation(int64_t num_bytes);
-  void GetAggregateStats(int32_t* num_allocs, int64_t* allocation_bytes) const;
-
-  int64_t allocation_bytes() const;
-  int32_t num_allocations() const;
-
- private:
-  const std::string name_;
-  starboard::atomic_int64_t allocation_bytes_;
-  starboard::atomic_int32_t num_allocations_;
-
-  AllocationGroup(const AllocationGroup&) = delete;
-  void operator=(const AllocationGroup&) = delete;
-};
-
-// A self locking data structure that maps strings -> AllocationGroups. This is
-// used to resolve MemoryGroup names (e.g. "Javascript") to an AllocationGroup
-// which can be used to group allocations together.
-class AtomicStringAllocationGroupMap {
- public:
-  AtomicStringAllocationGroupMap();
-  ~AtomicStringAllocationGroupMap();
-
-  AllocationGroup* Ensure(const std::string& name);
-  AllocationGroup* GetDefaultUnaccounted();
-
-  bool Erase(const std::string& key);
-  void GetAll(std::vector<const AllocationGroup*>* output) const;
-
- private:
-  // This map bypasses memory reporting of internal memory structures.
-  typedef std::map<
-      std::string,
-      AllocationGroup*,
-      std::less<std::string>,
-      nb::StdAllocator<std::pair<const std::string, AllocationGroup*>,
-                       NoReportAllocator> >
-      Map;
-  Map group_map_;
-  AllocationGroup* unaccounted_group_;
-  mutable starboard::Mutex mutex_;
-
-  AtomicStringAllocationGroupMap(const AtomicStringAllocationGroupMap&) =
-      delete;
-  void operator=(const AtomicStringAllocationGroupMap&) = delete;
-};
-
-class AllocationGroupStack {
- public:
-  AllocationGroupStack() { Push_DebugBreak(NULL); }
-  ~AllocationGroupStack() {}
-
-  void Push(AllocationGroup* group);
-  void Pop();
-  AllocationGroup* Peek();
-  const AllocationGroup* Peek() const;
-
-  void Push_DebugBreak(AllocationGroup* ag) { debug_stack_.push_back(ag); }
-  void Pop_DebugBreak() { debug_stack_.pop_back(); }
-  AllocationGroup* Peek_DebugBreak() {
-    if (debug_stack_.empty()) {
-      return NULL;
-    }
-    return debug_stack_.back();
-  }
-  const AllocationGroupPtrVec& data() const { return alloc_group_stack_; }
-
- private:
-  AllocationGroupStack(const AllocationGroupStack&) = delete;
-  void operator=(const AllocationGroupStack&) = delete;
-
-  AllocationGroupPtrVec alloc_group_stack_, debug_stack_;
-};
-
-// A per-pointer map of allocations to AllocRecords. This map is thread safe.
-class AtomicAllocationMap {
- public:
-  AtomicAllocationMap();
-  ~AtomicAllocationMap();
-
-  // Returns true if Added. Otherwise false means that the pointer
-  // already existed.
-  bool Add(const void* memory, const AllocationRecord& alloc_record);
-
-  // Returns true if the memory exists in this set.
-  bool Get(const void* memory, AllocationRecord* alloc_record) const;
-
-  // Return true if the memory existed in this set. If true
-  // then output alloc_record is written with record that was found.
-  // otherwise the record is written as 0 bytes and null key.
-  bool Remove(const void* memory, AllocationRecord* alloc_record);
-
-  bool Accept(AllocationVisitor* visitor) const;
-
-  size_t Size() const;
-  bool Empty() const;
-  void Clear();
-
- private:
-  // This map bypasses memory reporting of internal memory structures.
-  typedef std::map<
-      const void*,
-      AllocationRecord,
-      std::less<const void*>,  // required, when specifying allocator.
-      nb::StdAllocator<std::pair<const void* const, AllocationRecord>,
-                       NoReportAllocator> >
-      PointerMap;
-
-  PointerMap pointer_map_;
-  mutable starboard::Mutex mutex_;
-
-  AtomicAllocationMap(const AtomicAllocationMap&) = delete;
-  void operator=(const AtomicAllocationMap&) = delete;
-};
-
-// A per-pointer map of allocations to AllocRecords. This is a hybrid data
-// structure consisting of a hashtable of maps. Each pointer that is
-// stored or retrieved is hashed to a random bucket. Each bucket has it's own
-// lock. This distributed pattern increases performance significantly by
-// reducing contention. The top-level hashtable is of constant size and does
-// not resize. Each bucket is implemented as it's own map of elements.
-class ConcurrentAllocationMap {
- public:
-  static const int kNumElements = 511;
-  ConcurrentAllocationMap();
-  ~ConcurrentAllocationMap();
-
-  // Returns true if Added. Otherwise false means that the pointer
-  // already existed.
-  bool Add(const void* memory, const AllocationRecord& alloc_record);
-  // Returns true if the memory exists in this set.
-  bool Get(const void* memory, AllocationRecord* alloc_record) const;
-  // Return true if the memory existed in this set. If true
-  // then output alloc_record is written with record that was found.
-  // otherwise the record is written as 0 bytes and null key.
-  bool Remove(const void* memory, AllocationRecord* alloc_record);
-  size_t Size() const;
-  bool Empty() const;
-  void Clear();
-
-  // Provides access to all the allocations within in a thread safe manner.
-  bool Accept(AllocationVisitor* visitor) const;
-
-  AtomicAllocationMap& GetMapForPointer(const void* ptr);
-  const AtomicAllocationMap& GetMapForPointer(const void* ptr) const;
-
- private:
-  ConcurrentAllocationMap(const ConcurrentAllocationMap&) = delete;
-  void operator=(const ConcurrentAllocationMap&) = delete;
-
-  // Takes a pointer and generates a hash.
-  static uint32_t hash_ptr(const void* ptr);
-
-  int ToIndex(const void* ptr) const;
-  AtomicAllocationMap pointer_map_array_[kNumElements];
-};
-
-}  // namespace analytics
-}  // namespace nb
-
-#endif  // NB_ANALYTICS_MEMORY_TRACKER_HELPERS_H_
diff --git a/nb/analytics/memory_tracker_helpers_test.cc b/nb/analytics/memory_tracker_helpers_test.cc
deleted file mode 100644
index ebef340..0000000
--- a/nb/analytics/memory_tracker_helpers_test.cc
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/analytics/memory_tracker_helpers.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace nb {
-namespace analytics {
-namespace {
-
-///////////////////////////////////////////////////////////////////////////////
-TEST(AtomicStringAllocationGroupMap, Use) {
-  AtomicStringAllocationGroupMap map;
-  AllocationGroup* tag = map.Ensure("MemoryRegion");
-  EXPECT_TRUE(tag != NULL);
-  EXPECT_EQ(std::string("MemoryRegion"), tag->name());
-  AllocationGroup* tag2 = map.Ensure("MemoryRegion");
-  EXPECT_EQ(tag, tag2);
-}
-
-TEST(AtomicAllocationMap, AddHasRemove) {
-  AtomicAllocationMap atomic_pointer_map;
-  int32_t int_a = 0;
-  int32_t int_b = 1;
-
-  // Initially empty.
-  EXPECT_TRUE(atomic_pointer_map.Empty());
-
-  const AllocationRecord int32_alloc_record =
-      AllocationRecord(sizeof(int32_t), NULL);
-  AllocationRecord alloc_output;
-
-  EXPECT_TRUE(atomic_pointer_map.Add(&int_a, int32_alloc_record));
-  EXPECT_FALSE(atomic_pointer_map.Add(&int_a, int32_alloc_record));
-  EXPECT_TRUE(atomic_pointer_map.Get(&int_a, &alloc_output));
-  EXPECT_EQ(alloc_output.size, sizeof(int32_t));
-
-  EXPECT_FALSE(atomic_pointer_map.Get(&int_b, &alloc_output));
-  EXPECT_EQ(0, alloc_output.size);
-  // Adding pointer to int_a increases set to 1 element.
-  EXPECT_EQ(atomic_pointer_map.Size(), 1);
-  EXPECT_FALSE(atomic_pointer_map.Empty());
-
-  // Adds pointer to int_b.
-  EXPECT_TRUE(atomic_pointer_map.Add(&int_b, int32_alloc_record));
-  EXPECT_TRUE(atomic_pointer_map.Get(&int_b, &alloc_output));
-  EXPECT_EQ(sizeof(int32_t), alloc_output.size);
-  // Expect that the second pointer added will increase the number of elements.
-  EXPECT_EQ(atomic_pointer_map.Size(), 2);
-  EXPECT_FALSE(atomic_pointer_map.Empty());
-
-  // Now remove the elements and ensure that they no longer found and that
-  // the size of the table shrinks to empty.
-  EXPECT_TRUE(atomic_pointer_map.Remove(&int_a, &alloc_output));
-  EXPECT_EQ(sizeof(int32_t), alloc_output.size);
-  EXPECT_EQ(atomic_pointer_map.Size(), 1);
-  EXPECT_FALSE(atomic_pointer_map.Remove(&int_a, &alloc_output));
-  EXPECT_EQ(0, alloc_output.size);
-  EXPECT_TRUE(atomic_pointer_map.Remove(&int_b, &alloc_output));
-  EXPECT_EQ(atomic_pointer_map.Size(), 0);
-
-  EXPECT_TRUE(atomic_pointer_map.Empty());
-}
-
-TEST(ConcurrentAllocationMap, AddHasRemove) {
-  ConcurrentAllocationMap alloc_map;
-  int32_t int_a = 0;
-  int32_t int_b = 1;
-
-  // Initially empty.
-  EXPECT_TRUE(alloc_map.Empty());
-
-  const AllocationRecord int32_alloc_record =
-      AllocationRecord(sizeof(int32_t), NULL);
-  AllocationRecord alloc_output;
-
-  EXPECT_TRUE(alloc_map.Add(&int_a, int32_alloc_record));
-  EXPECT_FALSE(alloc_map.Add(&int_a, int32_alloc_record));
-  EXPECT_TRUE(alloc_map.Get(&int_a, &alloc_output));
-  EXPECT_EQ(alloc_output.size, sizeof(int32_t));
-
-  EXPECT_FALSE(alloc_map.Get(&int_b, &alloc_output));
-  EXPECT_EQ(0, alloc_output.size);
-  // Adding pointer to int_a increases set to 1 element.
-  EXPECT_EQ(alloc_map.Size(), 1);
-  EXPECT_FALSE(alloc_map.Empty());
-
-  // Adds pointer to int_b.
-  EXPECT_TRUE(alloc_map.Add(&int_b, int32_alloc_record));
-  EXPECT_TRUE(alloc_map.Get(&int_b, &alloc_output));
-  EXPECT_EQ(sizeof(int32_t), alloc_output.size);
-  // Expect that the second pointer added will increase the number of elements.
-  EXPECT_EQ(alloc_map.Size(), 2);
-  EXPECT_FALSE(alloc_map.Empty());
-
-  // Now remove the elements and ensure that they no longer found and that
-  // the size of the table shrinks to empty.
-  EXPECT_TRUE(alloc_map.Remove(&int_a, &alloc_output));
-  EXPECT_EQ(sizeof(int32_t), alloc_output.size);
-  EXPECT_EQ(alloc_map.Size(), 1);
-  EXPECT_FALSE(alloc_map.Remove(&int_a, &alloc_output));
-  EXPECT_EQ(0, alloc_output.size);
-  EXPECT_TRUE(alloc_map.Remove(&int_b, &alloc_output));
-  EXPECT_EQ(alloc_map.Size(), 0);
-
-  EXPECT_TRUE(alloc_map.Empty());
-}
-
-}  // namespace
-}  // namespace analytics
-}  // namespace nb
diff --git a/nb/analytics/memory_tracker_impl.cc b/nb/analytics/memory_tracker_impl.cc
deleted file mode 100644
index 099663d..0000000
--- a/nb/analytics/memory_tracker_impl.cc
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/analytics/memory_tracker_impl.h"
-
-#include <algorithm>
-#include <cstring>
-#include <functional>
-#include <iomanip>
-#include <iterator>
-#include <sstream>
-
-#include "nb/concurrent_map.h"
-#include "starboard/atomic.h"
-#include "starboard/common/flat_map.h"
-#include "starboard/common/log.h"
-#include "starboard/time.h"
-
-namespace nb {
-namespace analytics {
-namespace {
-
-// This class allows std containers to bypass memory reporting.
-template <typename T>
-class RawAllocator : public std::allocator<T> {
- public:
-  typedef typename std::allocator<T>::pointer pointer;
-  typedef typename std::allocator<T>::const_pointer const_pointer;
-  typedef typename std::allocator<T>::reference reference;
-  typedef typename std::allocator<T>::const_reference const_reference;
-  typedef typename std::allocator<T>::size_type size_type;
-  typedef typename std::allocator<T>::value_type value_type;
-  typedef typename std::allocator<T>::difference_type difference_type;
-
-  RawAllocator() {}
-
-  // Constructor used for rebinding
-  template <typename U>
-  RawAllocator(const RawAllocator<U>& x) {}
-
-  pointer allocate(size_type n,
-                   std::allocator<void>::const_pointer hint = NULL) {
-    void* ptr = SbMemoryAllocateNoReport(n * sizeof(value_type));
-    return static_cast<pointer>(ptr);
-  }
-
-  void deallocate(pointer p, size_type n) { SbMemoryDeallocateNoReport(p); }
-  template <typename U>
-  struct rebind {
-    typedef RawAllocator<U> other;
-  };
-};
-}  // namespace.
-
-// ThreadLocalBool_NoReport class guarantees that any memory allocated will NOT
-// go through any memory reporting mechanism. Otherwise certain platforms will
-// encounter a stack overflow condition as execution re-enters the allocation
-// function.
-class MemoryTrackerImpl::ThreadLocalBool_NoReport {
- public:
-  void Set(bool val) {
-    if (val) {
-      thread_map_.Set(SbThreadGetId(), val);
-    } else {
-      // Rather than set to false, remove the element.
-      thread_map_.Remove(SbThreadGetId());
-    }
-  }
-
-  bool Get() {
-    ThreadMap::EntryHandle entry;
-    bool has_key = thread_map_.Get(SbThreadGetId(), &entry);
-    if (!has_key) {
-      return false;
-    }
-    return entry.Value();
-  }
-
- private:
-  // Create a concurrent map that supports fast deletion of elements
-  // (no memory release).
-  //
-  using PairType = std::vector<std::pair<SbThreadId, bool>>::value_type;
-  // This vector bypasses reporting allocators.
-  using VectorPair = std::vector<PairType, RawAllocator<PairType>>;
-  // The InnerMap is backed by the vector. The FlatMap transforms the vector
-  // into a map interface.
-  using InnerMap =
-      starboard::FlatMap<SbThreadId, bool, std::less<SbThreadId>, VectorPair>;
-  // Concurrent map uses distributed locking to achieve a highly concurrent
-  // unsorted map.
-  using ThreadMap =
-      ConcurrentMap<SbThreadId, bool, std::hash<SbThreadId>, InnerMap>;
-
-  ThreadMap thread_map_;
-};
-
-SbMemoryReporter* MemoryTrackerImpl::GetMemoryReporter() {
-  return &sb_memory_tracker_;
-}
-
-NbMemoryScopeReporter* MemoryTrackerImpl::GetMemoryScopeReporter() {
-  return &nb_memory_scope_reporter_;
-}
-
-int64_t MemoryTrackerImpl::GetTotalAllocationBytes() {
-  return total_bytes_allocated_.load();
-}
-
-AllocationGroup* MemoryTrackerImpl::GetAllocationGroup(const char* name) {
-  DisableMemoryTrackingInScope no_tracking(this);
-  AllocationGroup* alloc_group = alloc_group_map_.Ensure(name);
-  return alloc_group;
-}
-
-void MemoryTrackerImpl::PushAllocationGroupByName(const char* group_name) {
-  AllocationGroup* group = GetAllocationGroup(group_name);
-  PushAllocationGroup(group);
-}
-
-void MemoryTrackerImpl::PushAllocationGroup(AllocationGroup* alloc_group) {
-  if (alloc_group == NULL) {
-    alloc_group = alloc_group_map_.GetDefaultUnaccounted();
-  }
-  DisableMemoryTrackingInScope no_tracking(this);
-  allocation_group_stack_tls_.GetOrCreate()->Push(alloc_group);
-}
-
-AllocationGroup* MemoryTrackerImpl::PeekAllocationGroup() {
-  DisableMemoryTrackingInScope no_tracking(this);
-  AllocationGroup* out = allocation_group_stack_tls_.GetOrCreate()->Peek();
-  if (out == NULL) {
-    out = alloc_group_map_.GetDefaultUnaccounted();
-  }
-  return out;
-}
-
-void MemoryTrackerImpl::PopAllocationGroup() {
-  DisableMemoryTrackingInScope no_tracking(this);
-  AllocationGroupStack* alloc_tls = allocation_group_stack_tls_.GetIfExists();
-  if (!alloc_tls) {
-    return;
-  }
-  alloc_tls->Pop();
-  AllocationGroup* group = alloc_tls->Peek();
-  // We don't allow null, so if this is encountered then push the
-  // "default unaccounted" alloc group.
-  if (group == NULL) {
-    alloc_tls->Push(alloc_group_map_.GetDefaultUnaccounted());
-  }
-}
-
-void MemoryTrackerImpl::GetAllocationGroups(
-    std::vector<const AllocationGroup*>* output) {
-  DisableMemoryTrackingInScope no_allocation_tracking(this);
-  output->reserve(100);
-  alloc_group_map_.GetAll(output);
-}
-
-void MemoryTrackerImpl::GetAllocationGroups(
-    std::map<std::string, const AllocationGroup*>* output) {
-  output->clear();
-  DisableMemoryTrackingInScope no_tracking(this);
-  std::vector<const AllocationGroup*> tmp;
-  GetAllocationGroups(&tmp);
-  for (size_t i = 0; i < tmp.size(); ++i) {
-    output->insert(std::make_pair(tmp[i]->name(), tmp[i]));
-  }
-}
-
-void MemoryTrackerImpl::Accept(AllocationVisitor* visitor) {
-  DisableMemoryTrackingInScope no_mem_allocation_reporting(this);
-  DisableDeletionInScope no_mem_deletion_reporting(this);
-  atomic_allocation_map_.Accept(visitor);
-}
-
-void MemoryTrackerImpl::Clear() {
-  // Prevent clearing of the tree from triggering a re-entrant
-  // memory deallocation.
-  atomic_allocation_map_.Clear();
-  total_bytes_allocated_.store(0);
-}
-
-void MemoryTrackerImpl::Debug_PushAllocationGroupBreakPointByName(
-    const char* group_name) {
-  DisableMemoryTrackingInScope no_tracking(this);
-  SB_DCHECK(group_name != NULL);
-  AllocationGroup* group = alloc_group_map_.Ensure(group_name);
-  Debug_PushAllocationGroupBreakPoint(group);
-}
-
-void MemoryTrackerImpl::Debug_PushAllocationGroupBreakPoint(
-    AllocationGroup* alloc_group) {
-  DisableMemoryTrackingInScope no_tracking(this);
-  allocation_group_stack_tls_.GetOrCreate()->Push_DebugBreak(alloc_group);
-}
-
-void MemoryTrackerImpl::Debug_PopAllocationGroupBreakPoint() {
-  DisableMemoryTrackingInScope no_tracking(this);
-  allocation_group_stack_tls_.GetOrCreate()->Pop_DebugBreak();
-}
-
-void MemoryTrackerImpl::OnMalloc(void* context,
-                                 const void* memory,
-                                 size_t size) {
-  MemoryTrackerImpl* t = static_cast<MemoryTrackerImpl*>(context);
-  t->AddMemoryTracking(memory, size);
-}
-
-void MemoryTrackerImpl::OnDealloc(void* context, const void* memory) {
-  MemoryTrackerImpl* t = static_cast<MemoryTrackerImpl*>(context);
-  t->RemoveMemoryTracking(memory);
-}
-
-void MemoryTrackerImpl::OnMapMem(void* context,
-                                 const void* memory,
-                                 size_t size) {
-  // We might do something more interesting with MapMemory calls later.
-  MemoryTrackerImpl* t = static_cast<MemoryTrackerImpl*>(context);
-  t->PushAllocationGroupByName("Mapped Memory");
-  OnMalloc(context, memory, size);
-  t->PopAllocationGroup();
-}
-
-void MemoryTrackerImpl::OnUnMapMem(void* context,
-                                   const void* memory,
-                                   size_t size) {
-  // We might do something more interesting with UnMapMemory calls later.
-  OnDealloc(context, memory);
-}
-
-void MemoryTrackerImpl::OnPushAllocationGroup(
-    void* context,
-    NbMemoryScopeInfo* memory_scope_info) {
-  MemoryTrackerImpl* t = static_cast<MemoryTrackerImpl*>(context);
-  void** cached_handle = &(memory_scope_info->cached_handle_);
-  const bool allows_caching = memory_scope_info->allows_caching_;
-  const char* group_name = memory_scope_info->memory_scope_name_;
-
-  AllocationGroup* group = NULL;
-  if (allows_caching && *cached_handle != NULL) {
-    group = static_cast<AllocationGroup*>(*cached_handle);
-  } else {
-    group = t->GetAllocationGroup(group_name);
-    if (allows_caching) {
-      // Flush all pending writes so that the the pointee is well formed
-      // by the time the pointer becomes visible to other threads.
-      SbAtomicMemoryBarrier();
-      *cached_handle = static_cast<void*>(group);
-    }
-  }
-
-  DisableMemoryTrackingInScope no_memory_tracking_in_scope(t);
-  t->PushAllocationGroup(group);
-  CallStack* callstack = t->callstack_tls_.GetOrCreate();
-  callstack->push_back(memory_scope_info);
-}
-
-void MemoryTrackerImpl::OnPopAllocationGroup(void* context) {
-  MemoryTrackerImpl* t = static_cast<MemoryTrackerImpl*>(context);
-  t->PopAllocationGroup();
-  CallStack* callstack = t->callstack_tls_.GetOrCreate();
-  // Callstack can be empty when the memory tracker binds to the callback
-  // system while the program is in the middle of the execution.
-  if (!callstack->empty()) {
-    callstack->pop_back();
-  }
-}
-
-void MemoryTrackerImpl::Initialize(
-    SbMemoryReporter* sb_memory_reporter,
-    NbMemoryScopeReporter* memory_scope_reporter) {
-  SbMemoryReporter mem_reporter = {
-      MemoryTrackerImpl::OnMalloc, MemoryTrackerImpl::OnDealloc,
-      MemoryTrackerImpl::OnMapMem, MemoryTrackerImpl::OnUnMapMem, this};
-
-  NbMemoryScopeReporter mem_scope_reporter = {
-      MemoryTrackerImpl::OnPushAllocationGroup,
-      MemoryTrackerImpl::OnPopAllocationGroup,
-      this,
-  };
-
-  *sb_memory_reporter = mem_reporter;
-  *memory_scope_reporter = mem_scope_reporter;
-}
-
-void MemoryTrackerImpl::SetThreadFilter(SbThreadId tid) {
-  thread_filter_id_ = tid;
-}
-
-bool MemoryTrackerImpl::IsCurrentThreadAllowedToReport() const {
-  if (thread_filter_id_ == kSbThreadInvalidId) {
-    return true;
-  }
-  return SbThreadGetId() == thread_filter_id_;
-}
-
-void MemoryTrackerImpl::SetMemoryTrackerDebugCallback(
-    MemoryTrackerDebugCallback* cb) {
-  debug_callback_.swap(cb);
-}
-
-MemoryTrackerImpl::DisableDeletionInScope::DisableDeletionInScope(
-    MemoryTrackerImpl* owner)
-    : owner_(owner) {
-  prev_state_ = owner->MemoryDeletionEnabled();
-  owner_->SetMemoryDeletionEnabled(false);
-}
-
-MemoryTrackerImpl::DisableDeletionInScope::~DisableDeletionInScope() {
-  owner_->SetMemoryDeletionEnabled(prev_state_);
-}
-
-MemoryTrackerImpl::MemoryTrackerImpl()
-    : thread_filter_id_(kSbThreadInvalidId), debug_callback_(nullptr) {
-  memory_deletion_enabled_tls_.reset(new ThreadLocalBool_NoReport);
-  memory_tracking_disabled_tls_.reset(new ThreadLocalBool_NoReport);
-  total_bytes_allocated_.store(0);
-  global_hooks_installed_ = false;
-  Initialize(&sb_memory_tracker_, &nb_memory_scope_reporter_);
-  // Push the default region so that stats can be accounted for.
-  PushAllocationGroup(alloc_group_map_.GetDefaultUnaccounted());
-}
-
-MemoryTrackerImpl::~MemoryTrackerImpl() {
-  // If we are currently hooked into allocation tracking...
-  if (global_hooks_installed_) {
-    RemoveGlobalTrackingHooks();
-    // For performance reasons no locking is used on the tracker.
-    // Therefore give enough time for other threads to exit this tracker
-    // before fully destroying this object.
-    SbThreadSleep(250 * kSbTimeMillisecond);  // 250 millisecond wait.
-  }
-}
-
-bool MemoryTrackerImpl::AddMemoryTracking(const void* memory, size_t size) {
-  // Vars are stored to assist in debugging.
-  const bool thread_allowed_to_report = IsCurrentThreadAllowedToReport();
-  const bool valid_memory_request = (memory != NULL) && (size != 0);
-  const bool mem_track_enabled = IsMemoryTrackingEnabled();
-
-  const bool tracking_enabled =
-      mem_track_enabled && valid_memory_request && thread_allowed_to_report;
-
-  if (!tracking_enabled) {
-    return false;
-  }
-
-  // End all memory tracking in subsequent data structures.
-  DisableMemoryTrackingInScope no_memory_tracking(this);
-  AllocationGroupStack* alloc_stack = allocation_group_stack_tls_.GetOrCreate();
-  AllocationGroup* group = alloc_stack->Peek();
-  if (!group) {
-    group = alloc_group_map_.GetDefaultUnaccounted();
-  }
-
-#ifndef NDEBUG
-  // This section of the code is designed to allow a developer to break
-  // execution whenever the debug allocation stack is in scope, so that the
-  // allocations can be stepped through. This is a THREAD LOCAL operation.
-  // Example:
-  //   Debug_PushAllocationGroupBreakPointByName("Javascript");
-  //  ...now set a break point below at "static int i = 0"
-  if (group && (group == alloc_stack->Peek_DebugBreak()) &&
-      alloc_stack->Peek_DebugBreak()) {
-    static int i = 0;  // This static is here to allow an
-    ++i;               // easy breakpoint in the debugger
-  }
-#endif
-
-  AllocationRecord alloc_record(size, group);
-  bool added = atomic_allocation_map_.Add(memory, alloc_record);
-  if (added) {
-    AddAllocationBytes(size);
-    group->AddAllocation(size);
-    ConcurrentPtr<MemoryTrackerDebugCallback>::Access access_ptr =
-        debug_callback_.access_ptr(SbThreadId());
-
-    // If access_ptr is valid then it is guaranteed to be alive for the
-    // duration of the scope.
-    if (access_ptr) {
-      const CallStack& callstack = *(callstack_tls_.GetOrCreate());
-      DisableDeletionInScope disable_deletion_tracking(this);
-      access_ptr->OnMemoryAllocation(memory, alloc_record, callstack);
-    }
-  } else {
-    // Handles the case where the memory hasn't been properly been reported
-    // released. This is less serious than you would think because the memory
-    // allocator in the system will recycle the memory and it will come back.
-    AllocationRecord unexpected_alloc;
-    atomic_allocation_map_.Get(memory, &unexpected_alloc);
-    AllocationGroup* prev_group = unexpected_alloc.allocation_group;
-
-    std::string prev_group_name;
-    if (prev_group) {
-      prev_group_name = unexpected_alloc.allocation_group->name();
-    } else {
-      prev_group_name = "none";
-    }
-
-    if (!added) {
-      std::stringstream ss;
-      ss << "\nUnexpected condition, previous allocation was not removed:\n"
-         << "\tprevious alloc group: " << prev_group_name << "\n"
-         << "\tnew alloc group: " << group->name() << "\n"
-         << "\tprevious size: " << unexpected_alloc.size << "\n"
-         << "\tnew size: " << size << "\n";
-
-      SbLogRaw(ss.str().c_str());
-    }
-  }
-  return added;
-}
-
-size_t MemoryTrackerImpl::RemoveMemoryTracking(const void* memory) {
-  const bool do_remove = memory && MemoryDeletionEnabled();
-  if (!do_remove) {
-    return 0;
-  }
-
-  AllocationRecord alloc_record;
-  bool removed = false;
-
-  ConcurrentPtr<MemoryTrackerDebugCallback>::Access access_ptr =
-      debug_callback_.access_ptr(SbThreadId());
-
-  if (access_ptr) {
-    if (atomic_allocation_map_.Get(memory, &alloc_record)) {
-      DisableMemoryTrackingInScope no_memory_tracking(this);
-      const CallStack& callstack = (*callstack_tls_.GetOrCreate());
-      access_ptr->OnMemoryDeallocation(memory, alloc_record, callstack);
-    }
-  }
-
-  // Prevent a map::erase() from causing an endless stack overflow by
-  // disabling memory deletion for the very limited scope.
-  {
-    DisableDeletionInScope no_memory_deletion(this);
-    removed = atomic_allocation_map_.Remove(memory, &alloc_record);
-  }
-
-  if (!removed) {
-    return 0;
-  } else {
-    const int64_t alloc_size = (static_cast<int64_t>(alloc_record.size));
-    AllocationGroup* group = alloc_record.allocation_group;
-    if (group) {
-      group->AddAllocation(-alloc_size);
-    }
-    AddAllocationBytes(-alloc_size);
-    return alloc_record.size;
-  }
-}
-
-bool MemoryTrackerImpl::GetMemoryTracking(const void* memory,
-                                          AllocationRecord* record) const {
-  const bool exists = atomic_allocation_map_.Get(memory, record);
-  return exists;
-}
-
-void MemoryTrackerImpl::SetMemoryTrackingEnabled(bool on) {
-  memory_tracking_disabled_tls_->Set(!on);
-}
-
-bool MemoryTrackerImpl::IsMemoryTrackingEnabled() const {
-  const bool enabled = !memory_tracking_disabled_tls_->Get();
-  return enabled;
-}
-
-void MemoryTrackerImpl::AddAllocationBytes(int64_t val) {
-  total_bytes_allocated_.fetch_add(val);
-}
-
-bool MemoryTrackerImpl::MemoryDeletionEnabled() const {
-  return !memory_deletion_enabled_tls_->Get();
-}
-
-void MemoryTrackerImpl::SetMemoryDeletionEnabled(bool on) {
-  memory_deletion_enabled_tls_->Set(!on);
-}
-
-MemoryTrackerImpl::DisableMemoryTrackingInScope::DisableMemoryTrackingInScope(
-    MemoryTrackerImpl* t)
-    : owner_(t) {
-  prev_value_ = owner_->IsMemoryTrackingEnabled();
-  owner_->SetMemoryTrackingEnabled(false);
-}
-
-MemoryTrackerImpl::DisableMemoryTrackingInScope::
-    ~DisableMemoryTrackingInScope() {
-  owner_->SetMemoryTrackingEnabled(prev_value_);
-}
-
-}  // namespace analytics
-}  // namespace nb
diff --git a/nb/analytics/memory_tracker_impl.h b/nb/analytics/memory_tracker_impl.h
deleted file mode 100644
index a231357..0000000
--- a/nb/analytics/memory_tracker_impl.h
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NB_MEMORY_TRACKER_IMPL_H_
-#define NB_MEMORY_TRACKER_IMPL_H_
-
-#include "nb/analytics/memory_tracker.h"
-#include "nb/analytics/memory_tracker_helpers.h"
-#include "nb/concurrent_ptr.h"
-#include "nb/memory_scope.h"
-#include "nb/scoped_ptr.h"
-#include "nb/thread_local_object.h"
-#include "starboard/common/mutex.h"
-#include "starboard/common/scoped_ptr.h"
-#include "starboard/configuration.h"
-#include "starboard/memory.h"
-#include "starboard/memory_reporter.h"
-#include "starboard/time.h"
-
-namespace nb {
-namespace analytics {
-
-class MemoryTrackerImpl : public MemoryTracker {
- public:
-  typedef ConcurrentAllocationMap AllocationMapType;
-
-  MemoryTrackerImpl();
-  virtual ~MemoryTrackerImpl();
-
-  // MemoryTracker adapter which is compatible with the SbMemoryReporter
-  // interface.
-  SbMemoryReporter* GetMemoryReporter();
-  NbMemoryScopeReporter* GetMemoryScopeReporter();
-
-  AllocationGroup* GetAllocationGroup(const char* name);
-  // Declares the start of a memory region. After this call, all
-  // memory regions will be tagged with this allocation group.
-  // Note that AllocationGroup is a tracking characteristic and
-  // does not imply any sort of special allocation pool.
-  void PushAllocationGroupByName(const char* group_name);
-  void PushAllocationGroup(AllocationGroup* alloc_group);
-  AllocationGroup* PeekAllocationGroup();
-  // Ends the current memory region and the previous memory region
-  // is restored.
-  void PopAllocationGroup();
-
-  // CONTROL
-  //
-  // Adds tracking to the supplied memory pointer. An AllocationRecord is
-  // generated for the supplied allocation which can be queried immediately
-  // with GetMemoryTracking(...).
-  bool InstallGlobalTrackingHooks() override {
-    if (global_hooks_installed_)
-      return true;
-    global_hooks_installed_ = true;
-    bool ok = SbMemorySetReporter(GetMemoryReporter());
-    ok &= NbSetMemoryScopeReporter(GetMemoryScopeReporter());
-    return ok;
-  }
-  void RemoveGlobalTrackingHooks() override {
-    SbMemorySetReporter(NULL);
-    NbSetMemoryScopeReporter(NULL);
-    global_hooks_installed_ = false;
-  }
-
-  bool AddMemoryTracking(const void* memory, size_t size) override;
-  size_t RemoveMemoryTracking(const void* memory) override;
-  // Returns true if the allocation record was successfully found.
-  // If true then the output will be written to with the values.
-  // Otherwise the output is reset to the empty AllocationRecord.
-  bool GetMemoryTracking(const void* memory,
-                         AllocationRecord* record) const override;
-  // Thread local function to get and set the memory tracking state. When set
-  // to disabled then memory allocations are not recorded. However memory
-  // deletions are still recorded.
-  void SetMemoryTrackingEnabled(bool on) override;
-  bool IsMemoryTrackingEnabled() const override;
-
-  // REPORTING
-  //
-  // Total allocation bytes that have been allocated by this
-  // MemoryTrackerImpl.
-  int64_t GetTotalAllocationBytes() override;
-  // Retrieves a collection of all known allocation groups. Locking is done
-  // internally.
-  void GetAllocationGroups(
-      std::vector<const AllocationGroup*>* output) override;
-  // Retrieves a collection of all known allocation groups. Locking is done
-  // internally. The output is a map of names to AllocationGroups.
-  void GetAllocationGroups(
-      std::map<std::string, const AllocationGroup*>* output);
-
-  // Provides access to the internal allocations in a thread safe way.
-  // Allocation tracking is disabled in the current thread for the duration
-  // of the visitation.
-  void Accept(AllocationVisitor* visitor) override;
-
-  int64_t GetTotalNumberOfAllocations() override {
-    return pointer_map()->Size();
-  }
-
-  // TESTING.
-  AllocationMapType* pointer_map() { return &atomic_allocation_map_; }
-  void Clear();
-
-  // This is useful for debugging. Allows the developer to set a breakpoint
-  // and see only allocations that are in the defined allocation group. This
-  // is only active in the current thread.
-  void Debug_PushAllocationGroupBreakPointByName(const char* group_name);
-  void Debug_PushAllocationGroupBreakPoint(AllocationGroup* alloc_group);
-  void Debug_PopAllocationGroupBreakPoint();
-
-  // This is useful for testing, setting this to a thread will allow ONLY
-  // those allocations from the set thread.
-  // Setting this to kSbThreadInvalidId (default) allows all threads to report
-  // allocations.
-  void SetThreadFilter(SbThreadId tid);
-  bool IsCurrentThreadAllowedToReport() const;
-
-  void SetMemoryTrackerDebugCallback(MemoryTrackerDebugCallback* cb) override;
-
- private:
-  class ThreadLocalBool_NoReport;
-  struct DisableMemoryTrackingInScope {
-    DisableMemoryTrackingInScope(MemoryTrackerImpl* t);
-    ~DisableMemoryTrackingInScope();
-    MemoryTrackerImpl* owner_;
-    bool prev_value_;
-  };
-
-  // Disables all memory deletion in the current scope. This is used in one
-  // location.
-  struct DisableDeletionInScope {
-    DisableDeletionInScope(MemoryTrackerImpl* owner);
-    ~DisableDeletionInScope();
-    MemoryTrackerImpl* owner_;
-    bool prev_state_;
-  };
-
-  // These are functions that are used specifically SbMemoryReporter.
-  static void OnMalloc(void* context, const void* memory, size_t size);
-  static void OnDealloc(void* context, const void* memory);
-  static void OnMapMem(void* context, const void* memory, size_t size);
-  static void OnUnMapMem(void* context, const void* memory, size_t size);
-  static void OnPushAllocationGroup(void* context,
-                                    NbMemoryScopeInfo* memory_scope_info);
-  static void OnPopAllocationGroup(void* context);
-
-  void Initialize(SbMemoryReporter* memory_reporter,
-                  NbMemoryScopeReporter* nb_memory_scope_reporter);
-  void AddAllocationBytes(int64_t val);
-  bool MemoryDeletionEnabled() const;
-
-  void SetMemoryDeletionEnabled(bool on);
-
-  SbMemoryReporter sb_memory_tracker_;
-  NbMemoryScopeReporter nb_memory_scope_reporter_;
-  SbThreadId thread_filter_id_;
-
-  AllocationMapType atomic_allocation_map_;
-  AtomicStringAllocationGroupMap alloc_group_map_;
-
-  starboard::atomic_int64_t total_bytes_allocated_;
-  ConcurrentPtr<MemoryTrackerDebugCallback> debug_callback_;
-
-  // THREAD LOCAL SECTION.
-  ThreadLocalObject<AllocationGroupStack> allocation_group_stack_tls_;
-  ThreadLocalObject<CallStack> callstack_tls_;
-  starboard::scoped_ptr<ThreadLocalBool_NoReport> memory_deletion_enabled_tls_;
-  starboard::scoped_ptr<ThreadLocalBool_NoReport> memory_tracking_disabled_tls_;
-
-  bool global_hooks_installed_;
-};
-
-}  // namespace analytics
-}  // namespace nb
-
-#endif  // NB_MEMORY_TRACKER_IMPL_H_
diff --git a/nb/analytics/memory_tracker_impl_test.cc b/nb/analytics/memory_tracker_impl_test.cc
deleted file mode 100644
index 4eb5009..0000000
--- a/nb/analytics/memory_tracker_impl_test.cc
+++ /dev/null
@@ -1,913 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/analytics/memory_tracker_impl.h"
-#include "nb/memory_scope.h"
-#include "nb/scoped_ptr.h"
-#include "nb/test_thread.h"
-#include "starboard/configuration.h"
-#include "starboard/system.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#define STRESS_TEST_DURATION_SECONDS 1
-#define NUM_STRESS_TEST_THREADS 3
-
-// The following is necessary to prevent operator new from being optimized
-// out using some compilers. This is required because we rely on operator new
-// to report memory usage. Overly aggressive optimizing compilers will
-// eliminate the call to operator new, even though it causes a lost of side
-// effects. This will therefore break the memory reporting mechanism. This is
-// a bug in the compiler.
-//
-// The solution here is to use macro-replacement to substitute calls to global
-// new to instead be delegated to our custom new, which prevents elimination
-// by using a temporay volatile.
-namespace {
-struct CustomObject {
-  static CustomObject Make() {
-    CustomObject o;
-    return o;
-  }
-};
-}  // namespace
-
-void* operator new(std::size_t size, CustomObject ignored) {
-  // Volatile prevents optimization and elimination of operator new by the
-  // optimizing compiler.
-  volatile void* ptr = ::operator new(size);
-  return const_cast<void*>(ptr);
-}
-
-#define NEW_NO_OPTIMIZER_ELIMINATION new (CustomObject::Make())
-#define new NEW_NO_OPTIMIZER_ELIMINATION
-
-namespace nb {
-namespace analytics {
-namespace {
-
-class NoReportAllocator {
- public:
-  NoReportAllocator() {}
-  NoReportAllocator(const NoReportAllocator&) {}
-  static void* Allocate(size_t n) { return SbMemoryAllocateNoReport(n); }
-  // Second argument can be used for accounting, but is otherwise optional.
-  static void Deallocate(void* ptr, size_t /* not used*/) {
-    SbMemoryDeallocateNoReport(ptr);
-  }
-};
-
-// Some platforms will allocate memory for empty vectors. Therefore
-// use MyVector to prevent empty vectors from reporting memory.
-template <typename T>
-using MyVector = std::vector<T, StdAllocator<T, NoReportAllocator>>;
-
-MemoryTrackerImpl* s_memory_tracker_ = NULL;
-
-struct NoMemTracking {
-  bool prev_val;
-  NoMemTracking() : prev_val(false) {
-    if (s_memory_tracker_) {
-      prev_val = s_memory_tracker_->IsMemoryTrackingEnabled();
-      s_memory_tracker_->SetMemoryTrackingEnabled(false);
-    }
-  }
-  ~NoMemTracking() {
-    if (s_memory_tracker_) {
-      s_memory_tracker_->SetMemoryTrackingEnabled(prev_val);
-    }
-  }
-};
-
-// EXPECT_XXX and ASSERT_XXX allocate memory, a big no-no when
-// for unit testing allocations. These overrides disable memory
-// tracking for the duration of the EXPECT and ASSERT operations.
-#define EXPECT_EQ_NO_TRACKING(A, B)                 \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    EXPECT_EQ(A, B);                                \
-  }
-
-#define EXPECT_TRUE_NO_TRACKING(A)                  \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    EXPECT_TRUE(A);                                 \
-  }
-
-#define EXPECT_FALSE_NO_TRACKING(A)                 \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    EXPECT_FALSE(A);                                \
-  }
-
-#define ASSERT_EQ_NO_TRACKING(A, B)                 \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    ASSERT_EQ(A, B);                                \
-  }
-
-#define ASSERT_TRUE_NO_TRACKING(A)                  \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    ASSERT_TRUE(A);                                 \
-  }
-
-// !! converts int -> bool.
-bool FlipCoin() {
-  return !!(SbSystemGetRandomUInt64() & 0x1);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Stress testing the Allocation Tracker.
-class MemoryScopeThread : public nb::TestThread {
- public:
-  typedef nb::TestThread Super;
-
-  explicit MemoryScopeThread(MemoryTrackerImpl* memory_tracker)
-      : memory_tracker_(memory_tracker) {
-    static int s_counter = 0;
-
-    std::stringstream ss;
-    ss << "MemoryScopeThread_" << s_counter++;
-    unique_name_ = ss.str();
-  }
-  virtual ~MemoryScopeThread() {}
-
-  // Overridden so that the thread can exit gracefully.
-  virtual void Join() {
-    finished_ = true;
-    Super::Join();
-  }
-  virtual void Run() {
-    while (!finished_) {
-      TRACK_MEMORY_SCOPE_DYNAMIC(unique_name_.c_str());
-      AllocationGroup* group = memory_tracker_->PeekAllocationGroup();
-
-      const int cmp_result = group->name().compare(unique_name_);
-      if (cmp_result != 0) {
-        GTEST_FAIL() << "unique name mismatch";
-        return;
-      }
-    }
-  }
-
- private:
-  MemoryTrackerImpl* memory_tracker_;
-  bool finished_;
-  std::string unique_name_;
-  int do_delete_counter_;
-  int do_malloc_counter_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Stress testing the Allocation Tracker.
-class AllocationStressThread : public nb::TestThread {
- public:
-  explicit AllocationStressThread(MemoryTrackerImpl* memory_tracker);
-  virtual ~AllocationStressThread();
-
-  // Overridden so that the thread can exit gracefully.
-  virtual void Join();
-  virtual void Run();
-
- private:
-  typedef std::map<const void*, AllocationRecord> AllocMap;
-
-  void CheckPointers();
-  bool RemoveRandomAllocation(std::pair<const void*, AllocationRecord>* output);
-  bool DoDelete();
-  void DoMalloc();
-
-  MemoryTrackerImpl* memory_tracker_;
-  bool finished_;
-  std::map<const void*, AllocationRecord> allocated_pts_;
-  std::string unique_name_;
-  int do_delete_counter_;
-  int do_malloc_counter_;
-};
-
-class AddAllocationStressThread : public nb::TestThread {
- public:
-  typedef std::map<const void*, AllocationRecord> AllocMap;
-
-  AddAllocationStressThread(MemoryTracker* memory_tracker,
-                            int num_elements_add,
-                            AllocMap* destination_map,
-                            starboard::Mutex* destination_map_mutex)
-      : memory_tracker_(memory_tracker),
-        num_elements_to_add_(num_elements_add),
-        destination_map_(destination_map),
-        destination_map_mutex_(destination_map_mutex) {}
-
-  virtual void Run() {
-    for (int i = 0; i < num_elements_to_add_; ++i) {
-      const int alloc_size = std::rand() % 100 + 8;
-      void* ptr = SbMemoryAllocate(alloc_size);
-
-      AllocationRecord record;
-      if (memory_tracker_->GetMemoryTracking(ptr, &record)) {
-        NoMemTracking no_mem_tracking;  // simplifies test.
-
-        starboard::ScopedLock lock(*destination_map_mutex_);
-        destination_map_->insert(std::make_pair(ptr, record));
-      } else {
-        ADD_FAILURE_AT(__FILE__, __LINE__) << "Could not add pointer.";
-      }
-      if (FlipCoin()) {
-        SbThreadYield();  // Give other threads a chance to run.
-      }
-    }
-  }
-
- private:
-  MemoryTracker* memory_tracker_;
-  AllocMap* destination_map_;
-  starboard::Mutex* destination_map_mutex_;
-  int num_elements_to_add_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Framework which initializes the MemoryTracker once and installs it
-// for the first test and the removes the MemoryTracker after the
-// the last test finishes.
-class MemoryTrackerImplTest : public ::testing::Test {
- public:
-  typedef MemoryTrackerImpl::AllocationMapType AllocationMapType;
-  MemoryTrackerImplTest() {}
-
-  MemoryTrackerImpl* memory_tracker() { return s_memory_tracker_; }
-
-  bool GetAllocRecord(void* alloc_memory, AllocationRecord* output) {
-    return memory_tracker()->GetMemoryTracking(alloc_memory, output);
-  }
-
-  AllocationMapType* pointer_map() { return memory_tracker()->pointer_map(); }
-
-  size_t NumberOfAllocations() {
-    AllocationMapType* map = pointer_map();
-    return map->Size();
-  }
-
-  int64_t TotalAllocationBytes() {
-    return memory_tracker()->GetTotalAllocationBytes();
-  }
-
-  bool MemoryTrackerEnabled() const { return s_memory_tracker_enabled_; }
-
- protected:
-  static void SetUpTestCase() {
-    if (!s_memory_tracker_) {
-      s_memory_tracker_ = new MemoryTrackerImpl;
-    }
-    // There are obligatory background threads for nb_test suite. This filter
-    // makes sure that they don't intercept this test.
-    s_memory_tracker_->SetThreadFilter(SbThreadGetId());
-    s_memory_tracker_enabled_ = s_memory_tracker_->InstallGlobalTrackingHooks();
-  }
-  static void TearDownTestCase() {
-    s_memory_tracker_->RemoveGlobalTrackingHooks();
-    // Give time for threads to sync. We don't use locks on the reporter
-    // for performance reasons.
-    SbThreadSleep(250 * kSbTimeMillisecond);
-  }
-
-  virtual void SetUp() { memory_tracker()->Clear(); }
-
-  virtual void TearDown() { memory_tracker()->Clear(); }
-  static bool s_memory_tracker_enabled_;
-};
-bool MemoryTrackerImplTest::s_memory_tracker_enabled_ = false;
-
-///////////////////////////////////////////////////////////////////////////////
-// MemoryTrackerImplTest
-TEST_F(MemoryTrackerImplTest, NoMemTracking) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-  ASSERT_EQ_NO_TRACKING(0, NumberOfAllocations());
-  scoped_ptr<int> dummy(new int());
-  EXPECT_EQ_NO_TRACKING(1, NumberOfAllocations());
-  {
-    // Now that memory allocation is disabled, no more allocations should
-    // be recorded.
-    NoMemTracking no_memory_tracking_in_this_scope;
-    int* dummy2 = new int();
-    EXPECT_EQ_NO_TRACKING(1, NumberOfAllocations());
-    delete dummy2;
-    EXPECT_EQ_NO_TRACKING(1, NumberOfAllocations());
-  }
-  scoped_ptr<int> dummy2(new int());
-  EXPECT_EQ_NO_TRACKING(2, NumberOfAllocations());
-  dummy.reset(NULL);
-  EXPECT_EQ_NO_TRACKING(1, NumberOfAllocations());
-  dummy2.reset(NULL);
-  EXPECT_EQ_NO_TRACKING(0, NumberOfAllocations());
-}
-
-TEST_F(MemoryTrackerImplTest, RemovePointerOnNoMemoryTracking) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-
-  int* int_ptr = new int();
-  {
-    NoMemTracking no_memory_tracking_in_this_scope;
-    delete int_ptr;
-  }
-  EXPECT_FALSE_NO_TRACKING(pointer_map()->Get(int_ptr, NULL));
-}
-
-TEST_F(MemoryTrackerImplTest, NewDeleteOverriddenTest) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-  EXPECT_EQ_NO_TRACKING(0, NumberOfAllocations());
-  int* int_a = new int(0);
-  EXPECT_EQ_NO_TRACKING(1, NumberOfAllocations());
-  delete int_a;
-  EXPECT_EQ_NO_TRACKING(0, NumberOfAllocations());
-}
-
-TEST_F(MemoryTrackerImplTest, TotalAllocationBytes) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-  int32_t* int_a = new int32_t(0);
-  EXPECT_EQ_NO_TRACKING(1, NumberOfAllocations());
-  EXPECT_EQ_NO_TRACKING(4, TotalAllocationBytes());
-  delete int_a;
-  EXPECT_EQ_NO_TRACKING(0, NumberOfAllocations());
-}
-
-// Tests the expectation that a lot of allocations can be executed and that
-// internal data structures won't overflow.
-TEST_F(MemoryTrackerImplTest, NoStackOverflow) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-  static const int kNumAllocations = 1000;
-  MyVector<int*> allocations;
-
-  // Also it turns out that this test is great for catching
-  // background threads pushing allocations through the allocator.
-  // This is supposed to be filtered, but if it's not then this test will
-  // fail.
-  // SbThreadYield() is used to give other threads a chance to enter into our
-  // allocator and catch a test failure.
-  SbThreadSleep(1);
-  size_t previously_existing_allocs = NumberOfAllocations();
-  ASSERT_EQ_NO_TRACKING(0, previously_existing_allocs);
-
-  for (int i = 0; i < kNumAllocations; ++i) {
-    SbThreadYield();
-    EXPECT_EQ_NO_TRACKING(i, NumberOfAllocations());
-    int* val = new int(0);
-    NoMemTracking no_tracking_in_scope;
-    allocations.push_back(val);
-  }
-
-  EXPECT_EQ_NO_TRACKING(kNumAllocations, NumberOfAllocations());
-
-  for (int i = 0; i < kNumAllocations; ++i) {
-    SbThreadYield();
-    EXPECT_EQ_NO_TRACKING(kNumAllocations - i, NumberOfAllocations());
-    delete allocations[i];
-  }
-
-  EXPECT_EQ_NO_TRACKING(0, NumberOfAllocations());
-}
-
-// Tests the expectation that the macros will push/pop the memory scope.
-TEST_F(MemoryTrackerImplTest, MacrosPushPop) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-  scoped_ptr<int> dummy;
-  {
-    TRACK_MEMORY_SCOPE("TestAllocations");
-    dummy.reset(new int());
-  }
-
-  scoped_ptr<int> dummy2(new int());
-
-  AllocationRecord alloc_rec;
-  pointer_map()->Get(dummy.get(), &alloc_rec);
-
-  ASSERT_TRUE_NO_TRACKING(alloc_rec.allocation_group);
-  EXPECT_EQ_NO_TRACKING(std::string("TestAllocations"),
-                        alloc_rec.allocation_group->name());
-
-  pointer_map()->Get(dummy2.get(), &alloc_rec);
-
-  ASSERT_TRUE_NO_TRACKING(alloc_rec.allocation_group);
-  EXPECT_EQ_NO_TRACKING(std::string("Unaccounted"),
-                        alloc_rec.allocation_group->name());
-}
-
-// Tests the expectation that if the cached flag on the NbMemoryScopeInfo is
-// set to false that the caching of the handle is not performed.
-TEST_F(MemoryTrackerImplTest, RespectsNonCachedHandle) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-  const bool kCaching = false;
-  NbMemoryScopeInfo memory_scope = {
-      NULL,     "MyName",     __FILE__,
-      __LINE__, __FUNCTION__, false};  // false to disallow caching.
-
-  // Pushing the memory scope should trigger the caching operation to be
-  // attempted. However, because caching was explicitly disabled this handle
-  // should retain the value of 0.
-  NbPushMemoryScope(&memory_scope);
-  EXPECT_TRUE_NO_TRACKING(memory_scope.cached_handle_ == NULL);
-
-  // ... and still assert that the group was created with the expected name.
-  AllocationGroup* group = memory_tracker()->GetAllocationGroup("MyName");
-  // Equality check.
-  EXPECT_EQ_NO_TRACKING(0, group->name().compare("MyName"));
-  NbPopMemoryScope();
-}
-
-// Tests the expectation that if the cached flag on the NbMemoryScopeInfo is
-// set to true that the caching will be applied for the cached_handle of the
-// memory scope.
-TEST_F(MemoryTrackerImplTest, PushAllocGroupCachedHandle) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-  NbMemoryScopeInfo memory_scope = {
-      NULL,      // Cached handle.
-      "MyName",  // Memory scope name.
-      __FILE__, __LINE__, __FUNCTION__,
-      true  // Allows caching.
-  };
-
-  NbPushMemoryScope(&memory_scope);
-  EXPECT_TRUE_NO_TRACKING(memory_scope.cached_handle_ != NULL);
-  AllocationGroup* group = memory_tracker()->GetAllocationGroup("MyName");
-
-  EXPECT_EQ_NO_TRACKING(memory_scope.cached_handle_, static_cast<void*>(group));
-  NbPopMemoryScope();
-}
-
-// Tests the expectation that the macro TRACK_MEMORY_SCOPE will capture the
-// allocation in the MemoryTrackerImpl.
-TEST_F(MemoryTrackerImplTest, MacrosGroupAccounting) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-  MemoryTrackerImpl* track_alloc = memory_tracker();  // Debugging.
-  track_alloc->Clear();
-
-  memory_tracker()->Clear();
-  const AllocationGroup* group_a =
-      memory_tracker()->GetAllocationGroup("MemoryTrackerTest-ScopeA");
-
-  const AllocationGroup* group_b =
-      memory_tracker()->GetAllocationGroup("MemoryTrackerTest-ScopeB");
-
-  ASSERT_TRUE_NO_TRACKING(group_a);
-  ASSERT_TRUE_NO_TRACKING(group_b);
-
-  int32_t num_allocations = -1;
-  int64_t allocation_bytes = -1;
-
-  // Expect that both groups have no allocations in them.
-  group_a->GetAggregateStats(&num_allocations, &allocation_bytes);
-  EXPECT_EQ_NO_TRACKING(0, num_allocations);
-  EXPECT_EQ_NO_TRACKING(0, allocation_bytes);
-
-  group_b->GetAggregateStats(&num_allocations, &allocation_bytes);
-  EXPECT_EQ_NO_TRACKING(0, num_allocations);
-  EXPECT_EQ_NO_TRACKING(0, allocation_bytes);
-
-  scoped_ptr<int> alloc_a, alloc_b, alloc_b2;
-  {
-    TRACK_MEMORY_SCOPE("MemoryTrackerTest-ScopeA");
-    alloc_a.reset(new int());
-    {
-      TRACK_MEMORY_SCOPE("MemoryTrackerTest-ScopeB");
-      alloc_b.reset(new int());
-      alloc_b2.reset(new int());
-
-      group_a->GetAggregateStats(&num_allocations, &allocation_bytes);
-      EXPECT_EQ_NO_TRACKING(1, num_allocations);
-      EXPECT_EQ_NO_TRACKING(4, allocation_bytes);
-      alloc_a.reset(NULL);
-      group_a->GetAggregateStats(&num_allocations, &allocation_bytes);
-      EXPECT_EQ_NO_TRACKING(0, num_allocations);
-      EXPECT_EQ_NO_TRACKING(0, allocation_bytes);
-
-      allocation_bytes = num_allocations = -1;
-      group_b->GetAggregateStats(&num_allocations, &allocation_bytes);
-      EXPECT_EQ_NO_TRACKING(2, num_allocations);
-      EXPECT_EQ_NO_TRACKING(8, allocation_bytes);
-
-      alloc_b2.reset(NULL);
-      group_b->GetAggregateStats(&num_allocations, &allocation_bytes);
-      EXPECT_EQ_NO_TRACKING(1, num_allocations);
-      EXPECT_EQ_NO_TRACKING(4, allocation_bytes);
-
-      alloc_b.reset(NULL);
-      group_b->GetAggregateStats(&num_allocations, &allocation_bytes);
-      EXPECT_EQ_NO_TRACKING(0, num_allocations);
-      EXPECT_EQ_NO_TRACKING(0, allocation_bytes);
-    }
-  }
-}
-
-// Tests the expectation that the MemoryTrackerDebugCallback works as expected
-// to notify of incoming allocations.
-TEST_F(MemoryTrackerImplTest, MemoryTrackerDebugCallback) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-
-  // Impl of the callback. Copies the allocation information so that we can
-  // ensure it produces expected values.
-  class MemoryTrackerDebugCallbackTest : public MemoryTrackerDebugCallback {
-   public:
-    MemoryTrackerDebugCallbackTest() { Reset(); }
-    void OnMemoryAllocation(const void* memory_block,
-                            const AllocationRecord& record,
-                            const CallStack& callstack) override {
-      last_memory_block_allocated_ = memory_block;
-      last_allocation_record_allocated_ = record;
-    }
-    void OnMemoryDeallocation(const void* memory_block,
-                              const AllocationRecord& record,
-                              const CallStack& callstack) override {
-      last_memory_block_deallocated_ = memory_block;
-      last_allocation_record_deallocated_ = record;
-    }
-    void Reset() {
-      last_memory_block_allocated_ = NULL;
-      last_memory_block_deallocated_ = NULL;
-      last_allocation_record_allocated_ = AllocationRecord::Empty();
-      last_allocation_record_deallocated_ = AllocationRecord::Empty();
-    }
-    const void* last_memory_block_allocated_;
-    const void* last_memory_block_deallocated_;
-    AllocationRecord last_allocation_record_allocated_;
-    AllocationRecord last_allocation_record_deallocated_;
-  };
-
-  // Needs to be static due to concurrent and lockless nature of object.
-  static MemoryTrackerDebugCallbackTest s_debug_callback;
-  s_debug_callback.Reset();
-
-  memory_tracker()->SetMemoryTrackerDebugCallback(&s_debug_callback);
-  void* memory_block = SbMemoryAllocate(8);
-  EXPECT_EQ_NO_TRACKING(memory_block,
-                        s_debug_callback.last_memory_block_allocated_);
-  EXPECT_EQ_NO_TRACKING(
-      8, s_debug_callback.last_allocation_record_allocated_.size);
-  // ... and no memory should have been deallocated.
-  EXPECT_TRUE_NO_TRACKING(s_debug_callback.last_memory_block_deallocated_ ==
-                          NULL);
-
-  // After this call we check that the callback for deallocation was used.
-  SbMemoryDeallocate(memory_block);
-  EXPECT_EQ_NO_TRACKING(memory_block,
-                        s_debug_callback.last_memory_block_deallocated_);
-
-  EXPECT_EQ_NO_TRACKING(
-      s_debug_callback.last_allocation_record_deallocated_.size, 8);
-}
-
-// Tests the expectation that the visitor can access the allocations.
-TEST_F(MemoryTrackerImplTest, VisitorAccess) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-  class SimpleVisitor : public AllocationVisitor {
-   public:
-    SimpleVisitor() : num_memory_allocs_(0) {}
-    virtual bool Visit(const void* memory,
-                       const AllocationRecord& alloc_record) {
-      num_memory_allocs_++;
-      return true;  // Keep traversing.
-    }
-
-    size_t num_memory_allocs_;
-  };
-
-  SimpleVisitor visitor;
-  scoped_ptr<int> int_ptr(new int);
-
-  // Should see the int_ptr allocation.
-  memory_tracker()->Accept(&visitor);
-  EXPECT_EQ_NO_TRACKING(1, visitor.num_memory_allocs_);
-  visitor.num_memory_allocs_ = 0;
-
-  int_ptr.reset(NULL);
-  // Now no allocations should be available.
-  memory_tracker()->Accept(&visitor);
-  EXPECT_EQ_NO_TRACKING(0, visitor.num_memory_allocs_);
-}
-
-// A stress test that rapidly adds allocations, but saves all deletions
-// for the main thread. This test will catch concurrency errors related
-// to reporting new allocations.
-TEST_F(MemoryTrackerImplTest, MultiThreadedStressAddTest) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-  // Disable allocation filtering.
-  memory_tracker()->SetThreadFilter(kSbThreadInvalidId);
-
-  MyVector<nb::TestThread*> threads;
-
-  const int kNumObjectsToAdd = 10000 / NUM_STRESS_TEST_THREADS;
-  AddAllocationStressThread::AllocMap map;
-  starboard::Mutex map_mutex;
-
-  for (int i = 0; i < NUM_STRESS_TEST_THREADS; ++i) {
-    nb::TestThread* thread = new AddAllocationStressThread(
-        memory_tracker(), kNumObjectsToAdd, &map, &map_mutex);
-
-    threads.push_back(thread);
-  }
-
-  for (int i = 0; i < NUM_STRESS_TEST_THREADS; ++i) {
-    threads[i]->Start();
-  }
-
-  for (int i = 0; i < NUM_STRESS_TEST_THREADS; ++i) {
-    threads[i]->Join();
-  }
-  for (int i = 0; i < NUM_STRESS_TEST_THREADS; ++i) {
-    delete threads[i];
-  }
-
-  while (!map.empty()) {
-    const void* ptr = map.begin()->first;
-    map.erase(map.begin());
-
-    if (!memory_tracker()->GetMemoryTracking(ptr, NULL)) {
-      ADD_FAILURE_AT(__FILE__, __LINE__) << "No tracking?!";
-    }
-
-    SbMemoryDeallocate(const_cast<void*>(ptr));
-    if (memory_tracker()->GetMemoryTracking(ptr, NULL)) {
-      ADD_FAILURE_AT(__FILE__, __LINE__) << "Tracking?!";
-    }
-  }
-}
-
-// Tests the expectation that memory scopes are multi-threaded safe.
-TEST_F(MemoryTrackerImplTest, MultiThreadedMemoryScope) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-  memory_tracker()->SetThreadFilter(kSbThreadInvalidId);
-  TRACK_MEMORY_SCOPE("MultiThreadedStressUseTest");
-
-  MyVector<MemoryScopeThread*> threads;
-
-  for (int i = 0; i < NUM_STRESS_TEST_THREADS; ++i) {
-    threads.push_back(new MemoryScopeThread(memory_tracker()));
-  }
-
-  for (int i = 0; i < threads.size(); ++i) {
-    threads[i]->Start();
-  }
-
-  SbThreadSleep(STRESS_TEST_DURATION_SECONDS * 1000 * 1000);
-
-  for (int i = 0; i < threads.size(); ++i) {
-    threads[i]->Join();
-  }
-
-  for (int i = 0; i < threads.size(); ++i) {
-    delete threads[i];
-  }
-
-  threads.clear();
-}
-
-// Tests the expectation that new/delete can be done by different threads.
-TEST_F(MemoryTrackerImplTest, MultiThreadedStressUseTest) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-  // Disable allocation filtering.
-  memory_tracker()->SetThreadFilter(kSbThreadInvalidId);
-  TRACK_MEMORY_SCOPE("MultiThreadedStressUseTest");
-
-  MyVector<AllocationStressThread*> threads;
-
-  for (int i = 0; i < NUM_STRESS_TEST_THREADS; ++i) {
-    threads.push_back(new AllocationStressThread(memory_tracker()));
-  }
-
-  for (int i = 0; i < threads.size(); ++i) {
-    threads[i]->Start();
-  }
-
-  SbThreadSleep(STRESS_TEST_DURATION_SECONDS * 1000 * 1000);
-
-  for (int i = 0; i < threads.size(); ++i) {
-    threads[i]->Join();
-  }
-
-  for (int i = 0; i < threads.size(); ++i) {
-    delete threads[i];
-  }
-
-  threads.clear();
-}
-
-//////////////////////////// Implementation ///////////////////////////////////
-/// Impl of AllocationStressThread
-AllocationStressThread::AllocationStressThread(MemoryTrackerImpl* tracker)
-    : memory_tracker_(tracker), finished_(false) {
-  static int counter = 0;
-  std::stringstream ss;
-  ss << "AllocStressThread-" << counter++;
-  unique_name_ = ss.str();
-}
-
-AllocationStressThread::~AllocationStressThread() {
-  if (!allocated_pts_.empty()) {
-    ADD_FAILURE_AT(__FILE__, __LINE__) << "allocated pointers still exist";
-  }
-}
-
-void AllocationStressThread::Join() {
-  finished_ = true;
-  nb::TestThread::Join();
-}
-
-void AllocationStressThread::CheckPointers() {
-  typedef AllocMap::iterator Iter;
-
-  for (Iter it = allocated_pts_.begin(); it != allocated_pts_.end(); ++it) {
-    const void* ptr = it->first;
-    const bool found = memory_tracker_->GetMemoryTracking(ptr, NULL);
-    if (!found) {
-      NoMemTracking no_tracking_in_scope;
-      ADD_FAILURE_AT(__FILE__, __LINE__) << "Not found";
-    }
-  }
-}
-
-void AllocationStressThread::Run() {
-  while (!finished_) {
-    const bool do_delete = FlipCoin();
-    if (FlipCoin()) {
-      DoDelete();
-    } else {
-      DoMalloc();
-    }
-    CheckPointers();
-
-    // Randomly give other threads the opportunity run.
-    if (FlipCoin()) {
-      SbThreadYield();
-    }
-  }
-
-  // Clear out all memory.
-  while (DoDelete()) {
-    ;
-  }
-}
-
-bool AllocationStressThread::RemoveRandomAllocation(
-    std::pair<const void*, AllocationRecord>* output) {
-  if (allocated_pts_.empty()) {
-    return false;
-  }
-
-  // Select a random pointer to delete.
-  int idx = std::rand() % allocated_pts_.size();
-  AllocMap::iterator iter = allocated_pts_.begin();
-  while (idx > 0) {
-    idx--;
-    iter++;
-  }
-  output->first = iter->first;
-  output->second = iter->second;
-  allocated_pts_.erase(iter);
-  return true;
-}
-
-bool AllocationStressThread::DoDelete() {
-  NoMemTracking no_memory_tracking_in_this_scope;
-  ++do_delete_counter_;
-
-  std::pair<const void*, AllocationRecord> alloc;
-  if (!RemoveRandomAllocation(&alloc)) {
-    return false;
-  }
-
-  const void* ptr = alloc.first;
-  const AllocationRecord expected_alloc_record = alloc.second;
-
-  TRACK_MEMORY_SCOPE_DYNAMIC(unique_name_.c_str());
-  AllocationGroup* current_group = memory_tracker_->PeekAllocationGroup();
-
-  // Expect that the name of the current allocation group name is the same as
-  // what we expect.
-  if (current_group->name() != unique_name_) {
-    NoMemTracking no_memory_tracking_in_this_scope;
-    ADD_FAILURE_AT(__FILE__, __LINE__)
-        << " " << current_group->name() << " != " << unique_name_;
-  }
-
-  MemoryTrackerImpl::AllocationMapType* internal_alloc_map =
-      memory_tracker_->pointer_map();
-
-  AllocationRecord existing_alloc_record;
-
-  const bool found_existing_record =
-      memory_tracker_->GetMemoryTracking(ptr, &existing_alloc_record);
-
-  if (!found_existing_record) {
-    ADD_FAILURE_AT(__FILE__, __LINE__)
-        << "expected to find existing record, but did not";
-  } else if (current_group != existing_alloc_record.allocation_group) {
-    ADD_FAILURE_AT(__FILE__, __LINE__)
-        << "group allocation mismatch: " << current_group->name()
-        << " != " << existing_alloc_record.allocation_group->name() << "\n";
-  }
-  SbMemoryDeallocate(const_cast<void*>(ptr));
-  return true;
-}
-
-void AllocationStressThread::DoMalloc() {
-  ++do_malloc_counter_;
-  if (allocated_pts_.size() > 10000) {
-    return;
-  }
-
-  TRACK_MEMORY_SCOPE_DYNAMIC(unique_name_.c_str());
-  AllocationGroup* current_group = memory_tracker_->PeekAllocationGroup();
-
-  // Sanity check, make sure that the current_group name is the same as
-  // our unique name.
-  if (current_group->name() != unique_name_) {
-    NoMemTracking no_tracking_in_scope;
-    ADD_FAILURE_AT(__FILE__, __LINE__)
-        << " " << current_group->name() << " != " << unique_name_;
-  }
-
-  if (!memory_tracker_->IsMemoryTrackingEnabled()) {
-    NoMemTracking no_tracking_in_scope;
-    ADD_FAILURE_AT(__FILE__, __LINE__)
-        << " memory tracking state was disabled.";
-  }
-
-  const int alloc_size = std::rand() % 100 + 8;
-
-  void* memory = SbMemoryAllocate(alloc_size);
-
-  AllocationRecord record;
-  bool found = memory_tracker_->GetMemoryTracking(memory, &record);
-  if (!found) {
-    NoMemTracking no_tracking_in_scope;
-    ADD_FAILURE_AT(__FILE__, __LINE__)
-        << "Violated expectation, malloc counter: " << do_malloc_counter_;
-  }
-  AllocMap::iterator found_it = allocated_pts_.find(memory);
-
-  if (found_it != allocated_pts_.end()) {
-    NoMemTracking no_tracking_in_scope;
-    ADD_FAILURE_AT(__FILE__, __LINE__)
-        << "This pointer should not be in the map.";
-  }
-
-  NoMemTracking no_tracking_in_scope;
-  allocated_pts_[memory] = AllocationRecord(alloc_size, current_group);
-}
-
-}  // namespace
-}  // namespace analytics
-}  // namespace nb
diff --git a/nb/analytics/memory_tracker_test.cc b/nb/analytics/memory_tracker_test.cc
deleted file mode 100644
index 8005802..0000000
--- a/nb/analytics/memory_tracker_test.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/analytics/memory_tracker.h"
-#include "nb/analytics/memory_tracker_helpers.h"
-#include "nb/memory_scope.h"
-#include "nb/scoped_ptr.h"
-#include "starboard/memory.h"
-#include "starboard/memory_reporter.h"
-#include "starboard/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace nb {
-namespace analytics {
-namespace {
-
-MemoryTracker* s_memory_tracker_ = NULL;
-
-struct NoMemTracking {
-  bool prev_val;
-  NoMemTracking() : prev_val(false) {
-    if (s_memory_tracker_) {
-      prev_val = s_memory_tracker_->IsMemoryTrackingEnabled();
-      s_memory_tracker_->SetMemoryTrackingEnabled(false);
-    }
-  }
-  ~NoMemTracking() {
-    if (s_memory_tracker_) {
-      s_memory_tracker_->SetMemoryTrackingEnabled(prev_val);
-    }
-  }
-};
-
-// EXPECT_XXX and ASSERT_XXX allocate memory, a big no-no when
-// for unit testing allocations. These overrides disable memory
-// tracking for the duration of the EXPECT and ASSERT operations.
-#define EXPECT_EQ_NO_TRACKING(A, B)                 \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    EXPECT_EQ(A, B);                                \
-  }
-
-#define EXPECT_TRUE_NO_TRACKING(A)                  \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    EXPECT_TRUE(A);                                 \
-  }
-
-#define EXPECT_FALSE_NO_TRACKING(A)                 \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    EXPECT_FALSE(A);                                \
-  }
-
-#define ASSERT_TRUE_NO_TRACKING(A)                  \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    ASSERT_TRUE(A);                                 \
-  }
-
-///////////////////////////////////////////////////////////////////////////////
-// Framework which initializes the MemoryTracker once and installs it
-// for the first test and the removes the MemoryTracker after the
-// the last test finishes.
-class MemoryTrackerTest : public ::testing::Test {
- public:
-  MemoryTrackerTest() {}
-
-  MemoryTracker* memory_tracker() { return s_memory_tracker_; }
-
-  bool GetAllocRecord(void* alloc_memory, AllocationRecord* output) {
-    return memory_tracker()->GetMemoryTracking(alloc_memory, output);
-  }
-
-  int64_t TotalNumberOfAllocations() {
-    return memory_tracker()->GetTotalNumberOfAllocations();
-  }
-
-  int64_t TotalAllocationBytes() {
-    return memory_tracker()->GetTotalAllocationBytes();
-  }
-
-  bool MemoryTrackerEnabled() const { return s_memory_tracker_enabled_; }
-
- protected:
-  static void SetUpTestCase() {
-    s_memory_tracker_ = MemoryTracker::Get();
-    s_memory_tracker_enabled_ = s_memory_tracker_->InstallGlobalTrackingHooks();
-  }
-  static void TearDownTestCase() {
-    s_memory_tracker_->RemoveGlobalTrackingHooks();
-    // Give time for all threads to sync up to the fact that the memory tracker
-    // has been removed.
-    SbThreadSleep(50 * kSbTimeMillisecond);
-  }
-  static bool s_memory_tracker_enabled_;
-};
-bool MemoryTrackerTest::s_memory_tracker_enabled_ = false;
-
-///////////////////////////////////////////////////////////////////////////////
-class FindAllocationVisitor : public AllocationVisitor {
- public:
-  FindAllocationVisitor() : found_(false), memory_to_find_(NULL) {}
-
-  bool found() const { return found_; }
-  void set_found(bool val) { found_ = val; }
-  void set_memory_to_find(const void* memory) {
-    memory_to_find_ = memory;
-    found_ = false;
-  }
-
-  virtual bool Visit(const void* memory, const AllocationRecord& alloc_record) {
-    if (memory_to_find_ == memory) {
-      found_ = true;
-      return false;
-    }
-    return true;
-  }
-
- private:
-  bool found_;
-  const void* memory_to_find_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-TEST_F(MemoryTrackerTest, MacrosScopedObject) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-
-  scoped_ptr<int> alloc_a, alloc_b;
-  {
-    TRACK_MEMORY_SCOPE("MemoryTrackerTest-ScopeA");
-    alloc_a.reset(new int());
-    {
-      TRACK_MEMORY_SCOPE("MemoryTrackerTest-ScopeB");
-      alloc_b.reset(new int());
-    }
-  }
-
-  // Now test that the allocations now exist in the memory tracker.
-  AllocationRecord alloc_record_a, alloc_record_b;
-  // Expect that the allocations exist and that the AllocRecords are written
-  // with the allocation information.
-  EXPECT_TRUE_NO_TRACKING(
-      memory_tracker()->GetMemoryTracking(alloc_a.get(), &alloc_record_a));
-  EXPECT_TRUE_NO_TRACKING(
-      memory_tracker()->GetMemoryTracking(alloc_b.get(), &alloc_record_b));
-
-  // Sanity test that the allocations are non-null.
-
-  const AllocationGroup* group_a = alloc_record_a.allocation_group;
-  const AllocationGroup* group_b = alloc_record_b.allocation_group;
-  ASSERT_TRUE_NO_TRACKING(group_a);
-  ASSERT_TRUE_NO_TRACKING(group_b);
-
-  EXPECT_EQ_NO_TRACKING(group_a->name(),
-                        std::string("MemoryTrackerTest-ScopeA"));
-  EXPECT_EQ_NO_TRACKING(group_b->name(),
-                        std::string("MemoryTrackerTest-ScopeB"));
-
-  // When the allocation is returned to the free store then it's expected that
-  // the memory tracker will indicate that the allocation no longer exists.
-  alloc_a.reset();
-  alloc_b.reset();
-
-  EXPECT_FALSE_NO_TRACKING(
-      memory_tracker()->GetMemoryTracking(alloc_a.get(), &alloc_record_a));
-  EXPECT_FALSE_NO_TRACKING(
-      memory_tracker()->GetMemoryTracking(alloc_b.get(), &alloc_record_b));
-
-  int32_t num_allocations = -1;
-  int64_t allocation_bytes = -1;
-
-  group_a->GetAggregateStats(&num_allocations, &allocation_bytes);
-  EXPECT_EQ_NO_TRACKING(0, num_allocations);
-  EXPECT_EQ_NO_TRACKING(0, allocation_bytes);
-
-  group_b->GetAggregateStats(&num_allocations, &allocation_bytes);
-  EXPECT_EQ_NO_TRACKING(0, num_allocations);
-  EXPECT_EQ_NO_TRACKING(0, allocation_bytes);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-TEST_F(MemoryTrackerTest, Visitor) {
-  // Memory tracker is not enabled for this build.
-  if (!MemoryTrackerEnabled()) {
-    return;
-  }
-
-  FindAllocationVisitor visitor;
-
-  scoped_ptr<int> alloc_a;
-  {
-    TRACK_MEMORY_SCOPE("MemoryTrackerTest-ScopeA");
-
-    alloc_a.reset(new int());
-    visitor.set_memory_to_find(alloc_a.get());
-    memory_tracker()->Accept(&visitor);
-    EXPECT_TRUE_NO_TRACKING(visitor.found());
-
-    alloc_a.reset(NULL);
-    visitor.set_found(false);
-    memory_tracker()->Accept(&visitor);
-    EXPECT_FALSE_NO_TRACKING(visitor.found());
-  }
-}
-
-}  // namespace
-}  // namespace analytics
-}  // namespace nb
diff --git a/nb/bit_cast.h b/nb/bit_cast.h
deleted file mode 100644
index af8cebe..0000000
--- a/nb/bit_cast.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/*
-* Modifications Copyright 2017 Google Inc. All Rights Reserved.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#ifndef NB_BIT_CAST_H_
-#define NB_BIT_CAST_H_
-
-#include "starboard/configuration.h"
-#include "starboard/memory.h"
-
-namespace nb {
-
-// bit_cast<Dest,Source> is a template function that implements the
-// equivalent of "*reinterpret_cast<Dest*>(&source)".  We need this in
-// very low-level functions like hashing pod data, where the pod data is
-// reinterpreted to a const char*.
-//
-// The classical address-casting method is:
-//
-//   // WRONG
-//   float f = 3.14159265358979;            // WRONG
-//   int i = * reinterpret_cast<int*>(&f);  // WRONG
-//
-// The address-casting method actually produces undefined behavior
-// according to ISO C++ specification section 3.10 -15 -.  Roughly, this
-// section says: if an object in memory has one type, and a program
-// accesses it with a different type, then the result is undefined
-// behavior for most values of "different type".
-//
-// This is true for any cast syntax, either *(int*)&f or
-// *reinterpret_cast<int*>(&f).  And it is particularly true for
-// conversions between integral lvalues and floating-point lvalues.
-//
-// The purpose of 3.10 -15- is to allow optimizing compilers to assume
-// that expressions with different types refer to different memory.  gcc
-// 4.0.1 has an optimizer that takes advantage of this.  So a
-// non-conforming program quietly produces wildly incorrect output.
-//
-// The problem is not the use of reinterpret_cast.  The problem is type
-// punning: holding an object in memory of one type and reading its bits
-// back using a different type.
-//
-// The C++ standard is more subtle and complex than this, but that
-// is the basic idea.
-//
-// Anyways ...
-//
-// bit_cast<> calls memcpy() which is blessed by the standard,
-// especially by the example in section 3.9 .  Also, of course,
-// bit_cast<> wraps up the nasty logic in one place.
-template <class Dest, class Source>
-inline Dest bit_cast(const Source& source) {
-  SB_COMPILE_ASSERT(sizeof(Dest) == sizeof(source),
-                    Source_and_destination_types_should_have_equal_sizes);
-  Dest dest;
-  memcpy(&dest, &source, sizeof(dest));
-  return dest;
-}
-
-}  // namespace nb
-
-#endif  // NB_CONCURRENT_MAP_H_
diff --git a/nb/codereview.settings b/nb/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/nb/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/nb/concurrent_map.h b/nb/concurrent_map.h
deleted file mode 100644
index c066872..0000000
--- a/nb/concurrent_map.h
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NB_CONCURRENT_MAP_H_
-#define NB_CONCURRENT_MAP_H_
-
-#include <iterator>
-#include <map>
-#include <vector>
-
-#include "nb/hash.h"
-#include "starboard/common/log.h"
-#include "starboard/common/mutex.h"
-
-namespace nb {
-
-template <typename KeyT,
-          typename ValueT,
-          typename HashFunction,
-          typename InnerMap = std::map<KeyT, ValueT> >
-class ConcurrentMap;
-
-// Map of int -> int
-typedef ConcurrentMap<int, int, PODHasher<int> > IntToIntConcurrentMap;
-
-// Map of void* -> void*
-typedef ConcurrentMap<const void*, void*, PODHasher<const void*> >
-    PtrToPtrConcurrentMap;
-
-// ConcurrentMap<> is a well performing map which maintains better performance
-// for multiple thread access than an std::map with a single mutex.
-//
-// Concurrent access is achieved by partitioning the key-space into k buckets.
-// An input key is randomly assigned to one of the buckets by a hash function.
-// The selected bucket then contains it's own mutex and map, which is then
-// accessed.
-//
-// Contention:
-//  Example:
-//    If there are 32 buckets, then two threads both executing
-//    Set(key,value) will have a ~3% chance of contention (1/32).
-//    For four threads the chances are ~40%.
-template <typename KeyT,
-          typename ValueT,
-          typename HashFunction,
-          typename InnerMap>
-class ConcurrentMap {
- public:
-  // EntryHandle and ConstEntryHandle provides mutually exclusive access to
-  // key-values access in this map. These handles will lock the entire bucket
-  // and it's recommended that these handles are released as soon as possible.
-  // The handles are automatically released when the object goes out of scope
-  // or is deleted.
-  class EntryHandle;
-  class ConstEntryHandle;
-  struct Bucket;
-
-  // |num_concurrency_buckets| specifies the number of concurrency buckets
-  // that will be created. The higher the number of buckets, the lower the
-  // probability of thread contention. 511 was experimentally found to be a
-  // good value maximizing performance on a highly contended pointer map.
-  // Lowering the number of buckets will reduce memory consumption.
-  ConcurrentMap(size_t num_concurrency_buckets = 511) {
-    if (num_concurrency_buckets < 1) {
-      SB_DCHECK(false);  // Should reach here.
-      num_concurrency_buckets = 1;
-    }
-    bucket_table_.resize(num_concurrency_buckets);
-  }
-
-  // Returns true if object was set to the new value. Otherwise false means
-  // that the object already existed.
-  bool SetIfMissing(const KeyT& key, const ValueT& value) {
-    Bucket& bucket = GetBucketForKey(key);
-    starboard::ScopedLock lock(bucket.mutex_);
-    bool inserted = bucket.map_.insert(std::make_pair(key, value)).second;
-    return inserted;
-  }
-
-  // Sets the object. Whatever value was previously there is replaced.
-  void Set(const KeyT& key, const ValueT& value) {
-    EntryHandle entry_handle;
-    GetOrCreate(key, &entry_handle);
-    entry_handle.ValueMutable() = value;
-  }
-
-  // Gets the value using the key. If the value does not already exist then
-  // a default value is created. The resulting value is stored in the
-  // EntryHandle.
-  void GetOrCreate(const KeyT& key, EntryHandle* entry_handle) {
-    ValueT default_val = ValueT();
-    Bucket& bucket = GetBucketForKey(key);
-    entry_handle->AcquireLock(&bucket);
-    typename InnerMap::iterator it =
-        bucket.map_.insert(std::make_pair(key, default_val)).first;
-    entry_handle->ValidateIterator(it);
-  }
-
-  // Returns true if a value exists for the input key.
-  bool Has(const KeyT& key) const {
-    const Bucket& bucket = GetBucketForKey(key);
-    starboard::ScopedLock lock(bucket.mutex_);
-
-    typename InnerMap::const_iterator found_it = bucket.map_.find(key);
-    return found_it != bucket.map_.end();
-  }
-
-  // Gets the value from the key. The value in the map can be accessed from the
-  // EntryHandle. The EntryHandle will hold onto an internal lock for the
-  // bucket which contains the key-value pair. It's recommended that Release()
-  // is invoked on the entry_handle as soon as caller is done accessing the
-  // value to release the lock and reduce potential contention.
-  // Returns |true| if a key-value pair existed in the map and |false|
-  // otherwise. When returning |true| |entry_handle| will be set to a valid
-  // value will maintain a lock on the bucket until Release() is invoked or the
-  // object goes out of scope. If |false| is returned then the entry_handle
-  // be released() and no lock will maintain after the call completes.
-  bool Get(const KeyT& key, EntryHandle* entry_handle) {
-    Bucket& bucket = GetBucketForKey(key);
-    entry_handle->AcquireLock(&bucket);
-
-    typename InnerMap::iterator found_it = bucket.map_.find(key);
-    if (found_it == bucket.map_.end()) {
-      entry_handle->ReleaseLockAndInvalidate();
-      return false;
-    }
-    entry_handle->ValidateIterator(found_it);
-    return true;
-  }
-
-  // See mutable version of Get().
-  bool Get(const KeyT& key, ConstEntryHandle* entry_handle) const {
-    const Bucket& bucket = GetBucketForKey(key);
-    entry_handle->AcquireLock(&bucket);
-
-    typename InnerMap::const_iterator found_it = bucket.map_.find(key);
-    if (found_it == bucket.map_.end()) {
-      entry_handle->ReleaseLockAndInvalidate();
-      return false;
-    }
-    entry_handle->ValidateIterator(found_it);
-    return true;
-  }
-
-  // Removes the key-value mapping from this map. Returns |true| if the mapping
-  // existed, else |false|.
-  bool Remove(const KeyT& key) {
-    Bucket& bucket = GetBucketForKey(key);
-    starboard::ScopedLock lock(bucket.mutex_);
-    typename InnerMap::iterator found_it = bucket.map_.find(key);
-    const bool exists = (found_it != bucket.map_.end());
-    if (exists) {
-      bucket.map_.erase(found_it);
-    }
-    return exists;
-  }
-
-  bool Remove(EntryHandle* entry_handle) {
-    if (!entry_handle->Valid()) {
-      SB_DCHECK(false);  // Can't remove an invalid entry_handle!
-      return false;
-    }
-
-    Bucket* bucket = entry_handle->bucket_;
-    bucket->map_.erase(entry_handle->iterator_);
-    entry_handle->ReleaseLockAndInvalidate();
-    return true;
-  }
-
-  size_t GetSize() const {
-    typedef typename std::vector<Bucket>::const_iterator table_iterator;
-
-    size_t sum = 0;
-    for (table_iterator it = bucket_table_.begin(); it != bucket_table_.end();
-         ++it) {
-      const Bucket& bucket = *it;
-      bucket.mutex_.Acquire();
-      sum += bucket.map_.size();
-      bucket.mutex_.Release();
-    }
-    return sum;
-  }
-
-  size_t IsEmpty() const { return !GetSize(); }
-
-  void Clear() {
-    typedef typename std::vector<Bucket>::iterator table_iterator;
-
-    for (table_iterator it = bucket_table_.begin(); it != bucket_table_.end();
-         ++it) {
-      Bucket& bucket = *it;
-      bucket.mutex_.Acquire();
-      bucket.map_.clear();
-      bucket.mutex_.Release();
-    }
-  }
-
-  // The supplied visitor will accept every key-value pair in the concurrent
-  // map. This traversal will visit the elements in an undefined order. A
-  // warning about performance: while traversing elements, a bucket lock will
-  // be maintained and if the visitor is expensive then it's possible that this
-  // could cause other threads to block.
-  template <typename KeyValueVisitorT>
-  void ForEach(KeyValueVisitorT* visitor) {
-    typedef typename std::vector<Bucket>::iterator bucket_iterator;
-    typedef typename InnerMap::iterator map_iterator;
-
-    for (bucket_iterator it = bucket_table_.begin(); it != bucket_table_.end();
-         ++it) {
-      Bucket& bucket = *it;
-      bucket.mutex_.Acquire();
-      for (map_iterator it = bucket.map_.begin(); it != bucket.map_.end();
-           ++it) {
-        visitor->Visit(it->first, it->second);
-      }
-      bucket.mutex_.Release();
-    }
-  }
-
-  // Under the circumstances that an operation can be applied to a copy of
-  // the internal data, then it's advised to copy this data to an std::vector
-  // and then apply the operation to the data.
-  void CopyToStdVector(std::vector<std::pair<KeyT, ValueT> >* destination) {
-    typedef typename std::vector<Bucket>::iterator bucket_iterator;
-    typedef typename InnerMap::iterator map_iterator;
-
-    for (bucket_iterator it = bucket_table_.begin(); it != bucket_table_.end();
-         ++it) {
-      Bucket& bucket = *it;
-      bucket.mutex_.Acquire();
-      destination->insert(destination->end(), bucket.map_.begin(),
-                          bucket.map_.end());
-      bucket.mutex_.Release();
-    }
-  }
-
-  class EntryHandle {
-   public:
-    friend class ConcurrentMap;
-
-    EntryHandle() : bucket_(NULL), iterator_(), iterator_valid_(false) {}
-    ~EntryHandle() { ReleaseLockAndInvalidate(); }
-
-    const ValueT& Value() {
-      SB_DCHECK(iterator_valid_);
-      return iterator_->second;
-    }
-
-    ValueT& ValueMutable() {
-      SB_DCHECK(iterator_valid_);
-      return iterator_->second;
-    }
-
-    const KeyT& Key() {
-      SB_DCHECK(iterator_valid_);
-      return iterator_->first;
-    }
-
-    bool Valid() const { return iterator_valid_; }
-
-    void ReleaseLockAndInvalidate() {
-      ReleaseLockIfNecessary();
-      iterator_valid_ = false;
-    }
-
-   private:
-    void ValidateIterator(typename InnerMap::iterator it) {
-      iterator_ = it;
-      iterator_valid_ = true;
-    }
-
-    void AcquireLock(Bucket* bucket) {
-      ReleaseLockIfNecessary();
-      bucket_ = bucket;
-      bucket_->mutex_.Acquire();
-    }
-
-    void ReleaseLockIfNecessary() {
-      if (bucket_) {
-        bucket_->mutex_.Release();
-      }
-      bucket_ = NULL;
-    }
-
-    Bucket* bucket_;
-    typename InnerMap::iterator iterator_;
-    bool iterator_valid_;
-
-    EntryHandle(const EntryHandle&) = delete;
-    void operator=(const EntryHandle&) = delete;
-  };
-
-  class ConstEntryHandle {
-   public:
-    friend class ConcurrentMap;
-
-    ConstEntryHandle() : bucket_(NULL), iterator_(), iterator_valid_(false) {}
-    ~ConstEntryHandle() { ReleaseLockAndInvalidate(); }
-
-    const ValueT& Value() {
-      SB_DCHECK(iterator_valid_);
-      return iterator_->second;
-    }
-
-    const KeyT& Key() {
-      SB_DCHECK(iterator_valid_);
-      return iterator_->first;
-    }
-
-    bool Valid() const { return iterator_valid_; }
-
-    void ReleaseLockAndInvalidate() {
-      ReleaseLockIfNecessary();
-      iterator_valid_ = false;
-    }
-
-   private:
-    void ValidateIterator(typename InnerMap::const_iterator it) {
-      iterator_ = it;
-      iterator_valid_ = true;
-    }
-
-    void AcquireLock(const Bucket* bucket) {
-      ReleaseLockIfNecessary();
-      bucket_ = bucket;
-      bucket_->mutex_.Acquire();
-    }
-
-    void ReleaseLockIfNecessary() {
-      if (bucket_) {
-        bucket_->mutex_.Release();
-      }
-      bucket_ = NULL;
-    }
-
-    const Bucket* bucket_;
-    typename InnerMap::const_iterator iterator_;
-    bool iterator_valid_;
-
-    ConstEntryHandle(const ConstEntryHandle&) = delete;
-    void operator=(const ConstEntryHandle&) = delete;
-  };
-
-  struct Bucket {
-    Bucket() {}
-    Bucket(const Bucket& b) { map_ = b.map_; }
-    void operator=(const Bucket& b) { map_ = b.map_; }
-    InnerMap map_;
-    mutable starboard::Mutex mutex_;
-  };
-
- private:
-  Bucket& GetBucketForKey(const KeyT& key) {
-    size_t table_index = hasher_(key) % bucket_table_.size();
-    return bucket_table_[table_index];
-  }
-
-  const Bucket& GetBucketForKey(const KeyT& key) const {
-    size_t table_index = hasher_(key) % bucket_table_.size();
-    return bucket_table_[table_index];
-  }
-
-  std::vector<Bucket> bucket_table_;
-  HashFunction hasher_;
-};
-
-}  // namespace nb
-
-#endif  // NB_CONCURRENT_MAP_H_
diff --git a/nb/concurrent_map_test.cc b/nb/concurrent_map_test.cc
deleted file mode 100644
index 518634d..0000000
--- a/nb/concurrent_map_test.cc
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/concurrent_map.h"
-#include "nb/hash.h"
-#include "nb/simple_thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace nb {
-namespace {
-
-class CapturesIntValues {
- public:
-  virtual void Visit(const int& key, const int& val) {
-    visited_values_.push_back(std::make_pair(key, val));
-  }
-
-  std::map<int, int> ToMap() const {
-    std::map<int, int> output;
-    output.insert(visited_values_.begin(), visited_values_.end());
-    return output;
-  }
-  std::vector<std::pair<int, int> > visited_values_;
-};
-
-TEST(ConcurrentMap, SetIfMissing) {
-  IntToIntConcurrentMap int_map;
-  ASSERT_FALSE(int_map.Has(1));
-  ASSERT_TRUE(int_map.SetIfMissing(1, -1));
-  ASSERT_TRUE(int_map.Has(1));
-  ASSERT_FALSE(int_map.SetIfMissing(1, -2));  // False because exists.
-
-  IntToIntConcurrentMap::EntryHandle entry_handle;
-
-  ASSERT_TRUE(int_map.Get(1, &entry_handle));
-  ASSERT_TRUE(entry_handle.Valid());
-  ASSERT_EQ(-1, entry_handle.Value());
-
-  // 2 is a missing key and doesn't exist.
-  ASSERT_FALSE(int_map.Get(2, &entry_handle));
-  ASSERT_FALSE(entry_handle.Valid());
-}
-
-TEST(ConcurrentMap, Set) {
-  IntToIntConcurrentMap int_map;
-  ASSERT_FALSE(int_map.Has(1));
-  int_map.Set(1, -1);
-  ASSERT_TRUE(int_map.Has(1));
-  int_map.Set(1, -2);
-
-  IntToIntConcurrentMap::EntryHandle entry_handle;
-
-  ASSERT_TRUE(int_map.Get(1, &entry_handle));
-  ASSERT_TRUE(entry_handle.Valid());
-  ASSERT_EQ(-2, entry_handle.Value());  // Value was replaced.
-}
-
-TEST(ConcurrentMap, GetOrCreate) {
-  IntToIntConcurrentMap int_map;
-
-  // Create a default mapping 1=>0, then reset the value to -2.
-  {
-    IntToIntConcurrentMap::EntryHandle entry_handle;
-
-    int_map.GetOrCreate(1, &entry_handle);  // Does not exist prior.
-
-    ASSERT_TRUE(entry_handle.Valid());  // Value default created.
-    EXPECT_EQ(0, entry_handle.Value());
-    entry_handle.ValueMutable() = -2;
-  }
-
-  // Get the value again, expect it to be -2.
-  {
-    IntToIntConcurrentMap::EntryHandle entry_handle;
-
-    EXPECT_TRUE(int_map.Get(1, &entry_handle));
-    ASSERT_TRUE(entry_handle.Valid());
-    EXPECT_EQ(-2, entry_handle.Value());
-  }
-}
-
-TEST(ConcurrentMap, GetConst) {
-  IntToIntConcurrentMap int_map;
-  IntToIntConcurrentMap::ConstEntryHandle const_entry_handle;
-
-  EXPECT_FALSE(int_map.Get(1, &const_entry_handle));
-  EXPECT_FALSE(const_entry_handle.Valid());
-
-  EXPECT_TRUE(int_map.SetIfMissing(1, -1));
-
-  EXPECT_TRUE(int_map.Get(1, &const_entry_handle));
-  EXPECT_TRUE(const_entry_handle.Valid());
-  EXPECT_EQ(-1, const_entry_handle.Value());
-}
-
-TEST(ConcurrentMap, Remove) {
-  IntToIntConcurrentMap int_map;
-  int_map.Set(1, -1);
-  EXPECT_EQ(1, int_map.GetSize());
-
-  EXPECT_FALSE(int_map.Remove(2));  // Doesn't exist.
-  EXPECT_TRUE(int_map.Remove(1));
-  EXPECT_EQ(0, int_map.GetSize());
-  EXPECT_TRUE(int_map.IsEmpty());
-}
-
-TEST(ConcurrentMap, RemoveUsingHandle) {
-  IntToIntConcurrentMap int_map;
-  int_map.Set(1, -1);
-  int_map.Set(2, -2);
-  EXPECT_EQ(2, int_map.GetSize());
-
-  IntToIntConcurrentMap::EntryHandle entry_handle;
-  int_map.Get(2, &entry_handle);
-
-  int_map.Remove(&entry_handle);
-  EXPECT_EQ(1, int_map.GetSize());
-  EXPECT_TRUE(int_map.Has(1));
-  EXPECT_FALSE(int_map.Has(2));
-
-  int_map.Get(1, &entry_handle);
-  int_map.Remove(&entry_handle);
-  EXPECT_EQ(0, int_map.GetSize());
-}
-
-TEST(ConcurrentMap, Clear) {
-  IntToIntConcurrentMap int_map;
-  int_map.Set(1, -1);
-  int_map.Set(2, -2);
-
-  EXPECT_EQ(2, int_map.GetSize());
-  EXPECT_EQ(2, int_map.GetSize());
-
-  int_map.Clear();
-  EXPECT_TRUE(int_map.IsEmpty());
-  EXPECT_EQ(0, int_map.GetSize());
-}
-
-TEST(ConcurrentMap, ForEach) {
-  IntToIntConcurrentMap int_map;
-  int_map.Set(1, -1);
-  int_map.Set(2, -2);
-
-  CapturesIntValues captures_int_values;
-
-  int_map.ForEach(&captures_int_values);
-
-  std::map<int, int> std_int_map = captures_int_values.ToMap();
-  EXPECT_EQ(std_int_map[1], -1);
-  EXPECT_EQ(std_int_map[2], -2);
-}
-
-class InsertThread : public SimpleThread {
- public:
-  InsertThread(int start_val, int end_val, IntToIntConcurrentMap* output)
-      : SimpleThread("InsertThread"),
-        test_ok_(true),
-        start_value_(start_val),
-        end_value_(end_val),
-        concurrent_map_(output) {}
-
-  virtual void Run() {
-    for (int i = start_value_; i < end_value_; ++i) {
-      if (!concurrent_map_->SetIfMissing(i, i)) {
-        test_ok_ = false;
-      }
-    }
-  }
-
-  bool test_ok_;
-  int start_value_;
-  int end_value_;
-  IntToIntConcurrentMap* concurrent_map_;
-};
-
-TEST(ConcurrentMap, MultiThreadTest) {
-  IntToIntConcurrentMap shared_int_map;
-  std::vector<InsertThread*> threads;
-
-  threads.push_back(new InsertThread(0, 5000, &shared_int_map));
-  threads.push_back(new InsertThread(5000, 10000, &shared_int_map));
-
-  for (int i = 0; i < threads.size(); ++i) {
-    threads[i]->Start();
-  }
-
-  for (int i = 0; i < threads.size(); ++i) {
-    threads[i]->Join();
-    EXPECT_TRUE(threads[i]->test_ok_);
-    delete threads[i];
-  }
-
-  threads.clear();
-
-  ASSERT_EQ(shared_int_map.GetSize(), 10000);
-
-  CapturesIntValues captures_int_values;
-
-  shared_int_map.ForEach(&captures_int_values);
-
-  std::map<int, int> std_int_map = captures_int_values.ToMap();
-
-  for (int i = 0; i < 10000; ++i) {
-    ASSERT_EQ(std_int_map[i], i);
-
-    IntToIntConcurrentMap::ConstEntryHandle const_entry_handle;
-    ASSERT_TRUE(shared_int_map.Get(i, &const_entry_handle));
-    ASSERT_TRUE(const_entry_handle.Valid());
-    ASSERT_EQ(i, const_entry_handle.Value());
-  }
-}
-
-}  // namespace
-}  // namespace nb
diff --git a/nb/concurrent_ptr.h b/nb/concurrent_ptr.h
deleted file mode 100644
index 358f106..0000000
--- a/nb/concurrent_ptr.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NB_CONCURRENT_PTR_H_
-#define NB_CONCURRENT_PTR_H_
-
-#include <algorithm>
-#include <atomic>
-#include <functional>
-#include <iostream>
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "starboard/common/atomic.h"
-#include "starboard/common/log.h"
-#include "starboard/common/mutex.h"
-#include "starboard/memory.h"
-#include "starboard/thread.h"
-#include "starboard/types.h"
-
-namespace nb {
-namespace detail {
-class AtomicPointerBase;
-
-template <typename T>
-class AtomicPointer;
-
-template <typename T>
-class Access;
-}  // namespace detail
-
-// ConcurrentPtr is similar to a scoped_ptr<> but with additional thread safe
-//  guarantees on the lifespan of the owned pointer. Threads can get access
-//  to the owned pointer using class ConcurrentPtr<T>::Access, which will lock
-//  the lifetime of the pointer for the duration that ConcurrentPtr<T>::Access
-//  object will remain in scope. Operations on the object pointed to by the
-//  owned pointer has no additional thread safety guarantees.
-//
-//
-// ConcurrentPtr<T>::access_ptr(...) will take in an arbitrary id value and
-//  will hash this id value to select one of the buckets. Good id's to pass in
-//  include input from SbThreadGetId() or random numbers (std::rand() is known
-//  to use internal locks on some implementations!).
-//
-// Performance:
-//  To increase performance, the lifespan of ConcurrentPtr<T>::Access instance
-//  should be as short as possible.
-//
-//  The number of buckets has a large effect on performance. More buckets will
-//  result in lower contention.
-//
-//  A hashing function with good distribution will produce less contention.
-//
-// Example:
-//  class MyClass { void Run(); };
-//  ConcurrentPtr<MyClass> shared_concurrent_ptr_(new MyClass);
-//
-//  // From all other threads.
-//  ConcurrentPtr<MyClass>::Access access_ptr =
-//      shared_concurrent_ptr_.access_ptr(SbThreadGetId());
-//  // access_ptr now either holds a valid object pointer or either nullptr.
-//  if (access_ptr) {
-//    access_ptr->Run();
-//  }
-template <typename T, typename KeyT = int64_t, typename HashT = std::hash<KeyT>>
-class ConcurrentPtr {
- public:
-  explicit ConcurrentPtr(T* ptr, size_t number_locks = 31) : ptr_(NULL) {
-    internal_construct(ptr, number_locks);
-  }
-  ~ConcurrentPtr() { internal_destruct(); }
-
-  // Used to access the underlying pointer to perform operations. The lifetime
-  //  of the accessed pointer is guaranteed to be alive for the duration of the
-  //  lifetime of this access object.
-  //
-  // Example
-  //  ConcurrentPtr<MyClass>::Access access_ptr =
-  //      shared_concurrent_ptr_.access_ptr(SbThreadGetId());
-  //  if (access_ptr) {
-  //    access_ptr->Run();
-  //  }
-  using Access = nb::detail::Access<T>;
-
-  // Provides read access to the underlying pointer in a thread safe way.
-  inline Access access_ptr(const KeyT& seed) {
-    const size_t index = hasher_(seed) % table_.size();
-    AtomicPointer* atomic_ptr = table_[index];
-    return atomic_ptr->access_ptr();
-  }
-
-  void reset(T* value) { delete SetAllThenSwap(value); }
-  T* release() { return SetAllThenSwap(nullptr); }
-  T* swap(T* new_value) { return SetAllThenSwap(new_value); }
-
- private:
-  using Mutex = starboard::Mutex;
-  using ScopedLock = starboard::ScopedLock;
-  using AtomicPointer = nb::detail::AtomicPointer<T>;
-
-  // Change all buckets to the new pointer. The old pointer is returned.
-  T* SetAllThenSwap(T* new_ptr) {
-    ScopedLock write_lock(pointer_write_mutex_);
-    for (auto it = table_.begin(); it != table_.end(); ++it) {
-      AtomicPointer* atomic_ptr = *it;
-      atomic_ptr->swap(new_ptr);
-    }
-    T* old_ptr = ptr_;
-    ptr_ = new_ptr;
-    return old_ptr;
-  }
-
-  void internal_construct(T* ptr, size_t number_locks) {
-    table_.resize(number_locks);
-    for (auto it = table_.begin(); it != table_.end(); ++it) {
-      *it = new AtomicPointer;
-    }
-    reset(ptr);
-  }
-
-  void internal_destruct() {
-    reset(nullptr);
-    for (auto it = table_.begin(); it != table_.end(); ++it) {
-      delete *it;
-    }
-    table_.clear();
-  }
-  HashT hasher_;
-  Mutex pointer_write_mutex_;
-  std::vector<AtomicPointer*> table_;
-  T* ptr_;
-};
-
-/////////////////////////// Implementation Details ////////////////////////////
-namespace detail {
-
-// Access is a smart pointer type which holds a lock to the underlying pointer
-// returned by ConcurrentPtr and AtomicPointer.
-template <typename T>
-class Access {
- public:
-  Access() = delete;
-  // It's assumed that ref_count is incremented before being passed
-  // to this constructor.
-  inline Access(T* ptr, starboard::atomic_int32_t* ref_count)
-      : ref_count_(ref_count), ptr_(ptr) {}
-
-  Access(const Access& other) = delete;
-  // Allow move construction.
-  Access(Access&& other) = default;
-
-  inline ~Access() { release(); }
-
-  inline operator bool() const { return valid(); }
-  inline operator T*() const { return get(); }
-  inline T* operator->() { return get(); }
-  inline T* get() const { return ptr_; }
-  inline bool valid() const { return !!get(); }
-  inline void release() { internal_release(); }
-
- private:
-  inline void internal_release() {
-    if (ref_count_) {
-      ref_count_->decrement();
-      ref_count_ = nullptr;
-    }
-    ptr_ = nullptr;
-  }
-  starboard::atomic_int32_t* ref_count_;
-  T* ptr_;
-};
-
-// AtomicPointer allows read access to a pointer through access_ptr()
-// and a form of atomic swap.
-template <typename T>
-class AtomicPointer {
- public:
-  // Customer new/delete operators align AtomicPointers to cache
-  // lines for improved performance.
-  static void* operator new(std::size_t count) {
-    const int kCacheLineSize = 64;
-    return SbMemoryAllocateAligned(kCacheLineSize, count);
-  }
-  static void operator delete(void* ptr) { SbMemoryDeallocateAligned(ptr); }
-
-  AtomicPointer() : ptr_(nullptr), counter_(0) {}
-  ~AtomicPointer() { delete get(); }
-  inline T* swap(T* new_ptr) {
-    AcquireWriteLock();
-    T* old_ptr = get();
-    ptr_.store(new_ptr);
-    WaitForReadersToDrain();
-    ReleaseWriteLock();
-    return old_ptr;
-  }
-
-  inline void reset(T* new_ptr) { delete swap(new_ptr); }
-  inline T* get() { return ptr_.load(); }
-  inline Access<T> access_ptr() {
-    counter_.increment();
-    return Access<T>(ptr_.load(), &counter_);
-  }
-
- private:
-  inline void AcquireWriteLock() {
-    write_mutex_.Acquire();
-    counter_.increment();
-  }
-  inline void WaitForReadersToDrain() {
-    int32_t expected_value = 1;
-    while (!counter_.compare_exchange_weak(&expected_value, 0)) {
-      SbThreadYield();
-      expected_value = 1;
-    }
-  }
-  inline void ReleaseWriteLock() { write_mutex_.Release(); }
-
-  starboard::Mutex write_mutex_;
-  starboard::atomic_int32_t counter_;
-  starboard::atomic_pointer<T*> ptr_;
-};
-}  // namespace detail
-}  // namespace nb
-
-#endif  // NB_CONCURRENT_PTR_H_
diff --git a/nb/concurrent_ptr_test.cc b/nb/concurrent_ptr_test.cc
deleted file mode 100644
index b564cd1..0000000
--- a/nb/concurrent_ptr_test.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright 2014 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/concurrent_ptr.h"
-
-#include "nb/simple_thread.h"
-#include "starboard/common/atomic.h"
-#include "starboard/common/semaphore.h"
-#include "starboard/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-// Number of threads for the thread test.
-#define NUM_THREADS 8
-
-namespace nb {
-
-using atomic_int32 = starboard::atomic_int32_t;
-using atomic_int64 = starboard::atomic_int64_t;
-using Semaphore = starboard::Semaphore;
-
-struct CountLifetime {
-  explicit CountLifetime(atomic_int32* shared_int) {
-    shared_int_ = shared_int;
-    shared_int_->increment();
-  }
-
-  ~CountLifetime() { shared_int_->decrement(); }
-
-  atomic_int32* shared_int_;
-};
-
-TEST(ConcurrentPtr, nullptr) {
-  ConcurrentPtr<int> concurrent_ptr(nullptr);
-  ConcurrentPtr<int>::Access access_ptr =
-      concurrent_ptr.access_ptr(SbThreadGetId());
-  ASSERT_FALSE(access_ptr);
-  ASSERT_FALSE(access_ptr.valid());
-  ASSERT_EQ(access_ptr.get(), nullptr);
-  access_ptr.release();
-  concurrent_ptr.reset(nullptr);
-}
-
-TEST(ConcurrentPtr, UseSingleThreaded) {
-  int* int_ptr = new int(1234);
-  ConcurrentPtr<int> concurrent_ptr(int_ptr);
-  ConcurrentPtr<int>::Access access_ptr =
-      concurrent_ptr.access_ptr(SbThreadGetId());
-
-  ASSERT_TRUE(access_ptr);
-  ASSERT_TRUE(access_ptr.valid());
-  ASSERT_EQ(int_ptr, access_ptr.get());
-  ASSERT_EQ(int_ptr, &(*access_ptr));
-  access_ptr.release();
-  int* int_ptr2 = concurrent_ptr.release();
-  ASSERT_EQ(int_ptr, int_ptr2);
-  ASSERT_EQ(1234, *int_ptr);
-  delete int_ptr;
-}
-
-TEST(ConcurrentPtr, ResetDeltesInternalObject) {
-  atomic_int32 counter(0);
-
-  CountLifetime* ptr = new CountLifetime(&counter);
-  EXPECT_EQ(1, counter.load());
-
-  ConcurrentPtr<CountLifetime> concurrent_ptr(ptr);
-  concurrent_ptr.reset(nullptr);
-  EXPECT_EQ(0, counter.load());
-}
-
-TEST(ConcurrentPtr, UsePointerOperators) {
-  ConcurrentPtr<atomic_int32> concurrent_ptr(new atomic_int32());
-  ConcurrentPtr<atomic_int32>::Access access_ptr =
-      concurrent_ptr.access_ptr(SbThreadGetId());
-  ASSERT_TRUE(access_ptr.valid());
-  ASSERT_TRUE(access_ptr.get());
-
-  {
-    atomic_int32& int_ref = *access_ptr;
-    ASSERT_EQ(0, int_ref.load());
-  }
-
-  ASSERT_EQ(0, access_ptr->load());
-  access_ptr->store(2);
-  ASSERT_EQ(2, access_ptr->load());
-}
-
-class ConcurrentPtrThreadWorker : public SimpleThread {
- public:
-  ConcurrentPtrThreadWorker(Semaphore* thread_seal,
-                            ConcurrentPtr<atomic_int32>* concurrent_ptr)
-      : SimpleThread("ConcurrentPtrThreadWorker"),
-        thread_seal_(thread_seal),
-        concurrent_ptr_(concurrent_ptr),
-        finished_(false) {
-    Start();
-  }
-
-  ConcurrentPtrThreadWorker(const ConcurrentPtrThreadWorker&) = delete;
-
-  ~ConcurrentPtrThreadWorker() {
-    finished_ = true;
-    Join();
-  }
-
-  virtual void Run() {
-    thread_seal_->Take();  // Pause until the main thread unblocks us.
-    int64_t yield_counter = 0;
-    while (!finished_) {
-      if (yield_counter++ % 512 == 0) {  // Be nice to other threads.
-        SbThreadYield();
-      }
-      ConcurrentPtr<atomic_int32>::Access access_ptr =
-          concurrent_ptr_->access_ptr(SbThreadGetId());
-      if (access_ptr) {
-        access_ptr->load();
-        access_ptr->store(SbThreadGetId());
-      }
-    }
-  }
-
-  virtual void Cancel() { finished_ = true; }
-
- private:
-  Semaphore* thread_seal_;
-  ConcurrentPtr<atomic_int32>* concurrent_ptr_;
-  bool finished_;
-};
-
-// Tests the expectation that the ConcurrentPtr can have it's underlying
-// pointer repeatedly reset and that all the reading threads will be guaranteed
-// to either be able to lock the pointer for it's use or be receive nullptr.
-TEST(ConcurrentPtr, ThreadStressTest) {
-  Semaphore thread_seal;
-  ConcurrentPtr<atomic_int32> concurrent_ptr(new atomic_int32);
-
-  std::vector<ConcurrentPtrThreadWorker*> threads;
-  const int kThreads = NUM_THREADS;
-  for (int i = 0; i < kThreads; ++i) {
-    threads.push_back(
-        new ConcurrentPtrThreadWorker(&thread_seal, &concurrent_ptr));
-  }
-
-  // Launch threads.
-  for (int i = 0; i < kThreads; ++i) {
-    thread_seal.Put();
-  }
-
-  // Repeatedly reset the underlying pointer. If there is a race
-  // condition then the program will crash.
-  const SbTime start_time = SbTimeGetNow();
-  const SbTime end_time = start_time + (kSbTimeMillisecond * 100);
-  while (SbTimeGetNow() < end_time) {
-    concurrent_ptr.reset(nullptr);
-    SbThreadYield();
-    concurrent_ptr.reset(new atomic_int32);
-    concurrent_ptr.reset(new atomic_int32);
-    SbThreadYield();
-  }
-
-  for (auto it = threads.begin(); it != threads.end(); ++it) {
-    delete *it;
-  }
-  threads.clear();
-}
-
-}  // namespace nb.
diff --git a/nb/first_fit_reuse_allocator_test.cc b/nb/first_fit_reuse_allocator_test.cc
index dd70c6d..9127058 100644
--- a/nb/first_fit_reuse_allocator_test.cc
+++ b/nb/first_fit_reuse_allocator_test.cc
@@ -16,16 +16,21 @@
 
 #include "nb/first_fit_reuse_allocator.h"
 
+#include <memory>
+
 #include "nb/fixed_no_free_allocator.h"
 #include "nb/pointer_arithmetic.h"
-#include "nb/scoped_ptr.h"
-#include "nb/starboard_aligned_memory_deleter.h"
 #include "starboard/configuration.h"
+#include "starboard/memory.h"
 #include "starboard/types.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
 
+struct AlignedMemoryDeleter {
+  void operator()(uint8_t* p) { SbMemoryDeallocateAligned(p); }
+};
+
 class FirstFitReuseAllocatorTest : public ::testing::Test {
  public:
   static const int kBufferSize = 1 * 1024 * 1024;
@@ -37,7 +42,7 @@
                       std::size_t allocation_increment = 0) {
     buffer_.reset(static_cast<uint8_t*>(
         SbMemoryAllocateAligned(nb::Allocator::kMinAlignment, kBufferSize)));
-    nb::scoped_ptr<nb::FixedNoFreeAllocator> fallback_allocator(
+    std::unique_ptr<nb::FixedNoFreeAllocator> fallback_allocator(
         new nb::FixedNoFreeAllocator(buffer_.get(), kBufferSize));
     allocator_.reset(new nb::FirstFitReuseAllocator(
         fallback_allocator.get(), initial_capacity, allocation_increment));
@@ -45,9 +50,9 @@
     fallback_allocator_.swap(fallback_allocator);
   }
 
-  std::unique_ptr<uint8_t, nb::AlignedMemoryDeleter> buffer_;
-  nb::scoped_ptr<nb::FixedNoFreeAllocator> fallback_allocator_;
-  nb::scoped_ptr<nb::FirstFitReuseAllocator> allocator_;
+  std::unique_ptr<uint8_t, AlignedMemoryDeleter> buffer_;
+  std::unique_ptr<nb::FixedNoFreeAllocator> fallback_allocator_;
+  std::unique_ptr<nb::FirstFitReuseAllocator> allocator_;
 };
 
 }  // namespace
diff --git a/nb/fixed_no_free_allocator_test.cc b/nb/fixed_no_free_allocator_test.cc
index 5789fb9..fbc3313 100644
--- a/nb/fixed_no_free_allocator_test.cc
+++ b/nb/fixed_no_free_allocator_test.cc
@@ -16,10 +16,16 @@
 
 #include "nb/fixed_no_free_allocator.h"
 
+#include <memory>
+
 #include "nb/pointer_arithmetic.h"
-#include "nb/starboard_aligned_memory_deleter.h"
+#include "starboard/memory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+struct AlignedMemoryDeleter {
+  void operator()(uint8_t* p) { SbMemoryDeallocateAligned(p); }
+};
+
 class FixedNoFreeAllocatorTest : public ::testing::Test {
  public:
   FixedNoFreeAllocatorTest();
@@ -30,7 +36,7 @@
   static const std::size_t kMaxAllocations = 64;
   static const std::size_t kBufferSize = kAllocationSize * kMaxAllocations;
 
-  std::unique_ptr<uint8_t, nb::AlignedMemoryDeleter> buffer_;
+  std::unique_ptr<uint8_t, AlignedMemoryDeleter> buffer_;
   nb::FixedNoFreeAllocator allocator_;
 };
 
diff --git a/nb/hash.cc b/nb/hash.cc
deleted file mode 100644
index b04c7d5..0000000
--- a/nb/hash.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/hash.h"
-
-#include "starboard/types.h"
-
-namespace nb {
-
-namespace {
-// Injects the super fast hash into the nb namespace.
-#include "third_party/super_fast_hash/super_fast_hash.cc"
-}  // namespace
-
-uint32_t RuntimeHash32(const char* data, int length, uint32_t prev_hash) {
-  return SuperFastHash(data, length, prev_hash);
-}
-
-}  // namespace nb
diff --git a/nb/hash.h b/nb/hash.h
deleted file mode 100644
index 84453cd..0000000
--- a/nb/hash.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NB_HASH_H_
-#define NB_HASH_H_
-
-#include "nb/bit_cast.h"
-#include "starboard/types.h"
-
-namespace nb {
-
-enum { kDefaultSeed = 0x12345789 };
-
-// RuntimeHash32 is a 32 bit hash for data. The only guarantee is that this
-// hash is persistent for the lifetime of the program. This hash function
-// is not guaranteed to be consistent across platforms. The hash value should
-// never be saved to disk.
-// It's sufficient however, to use as an in-memory hashtable.
-uint32_t RuntimeHash32(const char* data,
-                       int length,
-                       uint32_t prev_hash = kDefaultSeed);
-
-// Convenience functor for hashing plain old data types like int/float etc and
-// POD structs.
-template <typename T>
-struct PODHasher {
-  uint32_t operator()(const T& value) const {
-    return RuntimeHash32(reinterpret_cast<const char*>(&value), sizeof(value));
-  }
-};
-
-// Specialization so that all pointers are PODs.
-template <typename T>
-struct PODHasher<T*> {
-  uint32_t operator()(const void* ptr) const {
-    uintptr_t ptr_value = bit_cast<uintptr_t>(ptr);
-    PODHasher<uintptr_t> pod_hasher;
-    return pod_hasher(ptr_value);
-  }
-};
-
-}  // namespace nb
-
-#endif  // NB_HASH_H_
diff --git a/nb/memory_pool.h b/nb/memory_pool.h
index 8348dbc..ed467d5 100644
--- a/nb/memory_pool.h
+++ b/nb/memory_pool.h
@@ -18,7 +18,6 @@
 #define NB_MEMORY_POOL_H_
 
 #include "nb/allocator.h"
-#include "nb/bidirectional_fit_reuse_allocator.h"
 #include "nb/first_fit_reuse_allocator.h"
 #include "nb/fixed_no_free_allocator.h"
 #include "starboard/common/log.h"
@@ -70,7 +69,6 @@
   ReuseAllocator reuse_allocator_;
 };
 
-typedef MemoryPool<BidirectionalFitReuseAllocator> BidirectionalFitMemoryPool;
 typedef MemoryPool<FirstFitReuseAllocator> FirstFitMemoryPool;
 
 }  // namespace nb
diff --git a/nb/memory_scope.cc b/nb/memory_scope.cc
deleted file mode 100644
index e1e2f94..0000000
--- a/nb/memory_scope.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/memory_scope.h"
-#include "starboard/atomic.h"
-#include "starboard/common/log.h"
-
-NbMemoryScopeReporter* s_memory_reporter_ = NULL;
-
-bool NbSetMemoryScopeReporter(NbMemoryScopeReporter* reporter) {
-  // Flush all the pending memory writes out to main memory so that
-  // other threads see a fully constructed reporter.
-  SbAtomicMemoryBarrier();
-  s_memory_reporter_ = reporter;
-#if !defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-  SbLogRaw("\nMemory Scope Reporting is disabled because this build does "
-           "not support it. Try a QA, devel or debug build.\n");
-  return false;
-#else
-  return true;
-#endif
-}
-
-void NbPushMemoryScope(NbMemoryScopeInfo* memory_scope_info) {
-#if !defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-  return;
-#else
-  if (SB_LIKELY(!s_memory_reporter_)) {
-    return;
-  }
-  s_memory_reporter_->push_memory_scope_cb(
-    s_memory_reporter_->context,
-    memory_scope_info);
-#endif
-}
-
-void NbPopMemoryScope() {
-#if !defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-  return;
-#else
-  if (SB_LIKELY(!s_memory_reporter_)) {
-    return;
-  }
-  s_memory_reporter_->pop_memory_scope_cb(s_memory_reporter_->context);
-#endif
-}
diff --git a/nb/memory_scope.h b/nb/memory_scope.h
deleted file mode 100644
index 5fd0034..0000000
--- a/nb/memory_scope.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NB_MEMORY_SCOPE_H_
-#define NB_MEMORY_SCOPE_H_
-
-///////////////////////////////////////////////////////////////////////////////
-// Macros to define the memory scope objects. These are objects that are used
-// to annotate sections of the code base as belonging to a particular memory
-// scope. Note that this is an annotation and does not memory allocation.
-///////////////////////////////////////////////////////////////////////////////
-
-// Macro to track the memory scope inside a function or block of code. The
-// memory scope is in effect until the end of the code block.
-// Example:
-//   void Foo() {
-//     TRACK_MEMORY_SCOPE("FooMemoryScope");
-//     // pops the memory scope at the end.
-//   }
-
-#if !defined(__cplusplus)
-// Disallow macro use for non-C++ builds.
-#define TRACK_MEMORY_SCOPE(STR) error_forbidden_in_non_c_plus_plus_code
-#define TRACK_MEMORY_SCOPE_DYNAMIC(STR) error_forbidden_in_non_c_plus_plus_code
-#elif defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-#define TRACK_MEMORY_SCOPE(STR) TRACK_MEMORY_STATIC_CACHED(STR)
-#define TRACK_MEMORY_SCOPE_DYNAMIC(STR) TRACK_MEMORY_STATIC_NOT_CACHED(STR)
-#else
-// No-op when starboard does not allow memory tracking.
-#define TRACK_MEMORY_SCOPE(STR)
-#define TRACK_MEMORY_SCOPE_DYNAMIC(STR)
-#endif
-
-// Preprocessor needs double expansion in order to __FILE__, __LINE__ and
-// __FUNCTION__ properly.
-#define TRACK_MEMORY_STATIC_CACHED(STR) \
-  TRACK_MEMORY_STATIC_CACHED_IMPL_2(STR, __FILE__, __LINE__, __FUNCTION__)
-
-#define TRACK_MEMORY_STATIC_NOT_CACHED(STR) \
-  TRACK_MEMORY_STATIC_NOT_CACHED_IMPL_2(STR, __FILE__, __LINE__, __FUNCTION__)
-
-// Only enable TRACK_MEMORY_STATIC_CACHED_IMPL_2 if starboard allows memory
-// tracking.
-#define TRACK_MEMORY_STATIC_CACHED_IMPL_2(Str, FileStr, LineNum, FuncStr) \
-  static NbMemoryScopeInfo memory_scope_handle_##LineNum =                \
-      { NULL, Str, FileStr, LineNum, FuncStr, true };                     \
-  NbPushMemoryScope(&memory_scope_handle_##LineNum);                      \
-  NbPopMemoryScopeOnScopeEnd pop_on_scope_end_##LineNum;                  \
-  (void)pop_on_scope_end_##LineNum;
-
-#define TRACK_MEMORY_STATIC_NOT_CACHED_IMPL_2(Str, FileStr, LineNum, FuncStr) \
-  NbMemoryScopeInfo memory_scope_handle_##LineNum = {                         \
-      NULL, Str, FileStr, LineNum, FuncStr, false};                           \
-  NbPushMemoryScope(&memory_scope_handle_##LineNum);                          \
-  NbPopMemoryScopeOnScopeEnd pop_on_scope_end_##LineNum;                      \
-  (void)pop_on_scope_end_##LineNum;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct NbMemoryScopeReporter;
-struct NbMemoryScopeInfo;
-
-// Sets the memory reporter. Returns true on success, false something
-// goes wrong.
-bool NbSetMemoryScopeReporter(NbMemoryScopeReporter* reporter);
-
-// Note that we pass by pointer because the memory scope contains a
-// variable allowing the result to be cached.
-void NbPushMemoryScope(NbMemoryScopeInfo* memory_scope);
-void NbPopMemoryScope();
-
-///////////////////////////////////////////////////////////////////////////////
-// Implementation
-///////////////////////////////////////////////////////////////////////////////
-// Interface for handling memory scopes.
-typedef void (*NbReportPushMemoryScopeCallback)(void* context,
-                                                NbMemoryScopeInfo* info);
-typedef void (*NbReportPopMemoryScopeCallback)(void* context);
-
-struct NbMemoryScopeReporter {
-  // Callback to report pushing of memory scope.
-  NbReportPushMemoryScopeCallback push_memory_scope_cb;
-
-  // Callback to report poping of the memory scope.
-  NbReportPopMemoryScopeCallback pop_memory_scope_cb;
-
-  // Optional, is passed to the callbacks as first argument.
-  void* context;
-};
-
-// This MemoryScope must remain a POD data type so that it can be statically
-// initialized.
-struct NbMemoryScopeInfo {
-  // cached_handle_ allows a cached result of the the fields represented in
-  // this struct to be generated and the handle be placed into this field.
-  // See also allows_caching_.
-  void* cached_handle_;
-
-  // Represents the name of the memory scope. I.E. "Javascript" or "Gfx".
-  const char* memory_scope_name_;
-
-  // Represents the file name that this memory scope was created at.
-  const char* file_name_;
-
-  // Represents the line number that this memory scope was created at.
-  int line_number_;
-
-  // Represents the function name that this memory scope was created at.
-  const char* function_name_;
-
-  // When true, if cached_handle_ is 0 then an object may be created that
-  // represents the fields of this object. The handle that represents this
-  // cached object is then placed in cached_hanlde_.
-  bool allows_caching_;
-};
-
-// NbPopMemoryScopeOnScopeEnd is only allowed for C++ builds.
-#ifdef __cplusplus
-// A helper that pops the memory scope at the end of the current code block.
-struct NbPopMemoryScopeOnScopeEnd {
-  ~NbPopMemoryScopeOnScopeEnd() { NbPopMemoryScope(); }
-};
-#endif
-
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // NB_MEMORY_SCOPE_H_
diff --git a/nb/memory_scope_test.cc b/nb/memory_scope_test.cc
deleted file mode 100644
index 8d2ae3e..0000000
--- a/nb/memory_scope_test.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-/*

- * Copyright 2016 Google Inc. All Rights Reserved.

- *

- * Licensed under the Apache License, Version 2.0 (the "License");

- * you may not use this file except in compliance with the License.

- * You may obtain a copy of the License at

- *

- *     http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing, software

- * distributed under the License is distributed on an "AS IS" BASIS,

- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- * See the License for the specific language governing permissions and

- * limitations under the License.

- */

-

-#include "nb/memory_scope.h"

-#include "nb/thread_local_object.h"

-#include "starboard/common/mutex.h"

-

-#include "testing/gtest/include/gtest/gtest.h"

-

-namespace nb {

-namespace {

-

-bool StarboardAllowsMemoryTracking() {

-#if defined(STARBOARD_ALLOWS_MEMORY_TRACKING)

-  return true;

-#else

-  return false;

-#endif

-}

-

-// This is a memory scope reporter that is compatible

-// with the MemoryScopeReporter.

-class TestMemoryScopeReporter {

- public:

-  typedef std::vector<NbMemoryScopeInfo*> MemoryScopeVector;

-

-  TestMemoryScopeReporter() {

-    memory_scope_reporter_ = CreateMemoryScopeReporter();

-  }

-

-  NbMemoryScopeReporter* memory_scope_reporter() {

-    return &memory_scope_reporter_;

-  }

-

-  MemoryScopeVector* stack_thread_local() { return stack_tlo_.GetOrCreate(); }

-

-  void OnPushMemoryScope(NbMemoryScopeInfo* memory_scope) {

-    stack_thread_local()->push_back(memory_scope);

-  }

-

-  void OnPopMemoryScope() {

-    MemoryScopeVector* stack = stack_thread_local();

-    if (!stack->empty()) {

-      stack->pop_back();

-    } else {

-      ADD_FAILURE_AT(__FILE__, __LINE__)

-          << " stack was empty and could not be popped.";

-    }

-  }

-

- private:

-  static void OnPushMemoryScopeCallback(void* context,

-                                        NbMemoryScopeInfo* info) {

-    TestMemoryScopeReporter* t = static_cast<TestMemoryScopeReporter*>(context);

-    t->OnPushMemoryScope(info);

-  }

-

-  static void OnPopMemoryScopeCallback(void* context) {

-    TestMemoryScopeReporter* t = static_cast<TestMemoryScopeReporter*>(context);

-    t->OnPopMemoryScope();

-  }

-

-  NbMemoryScopeReporter CreateMemoryScopeReporter() {

-    NbMemoryScopeReporter reporter = {OnPushMemoryScopeCallback,

-                                      OnPopMemoryScopeCallback, this};

-    return reporter;

-  }

-

-  NbMemoryScopeReporter memory_scope_reporter_;

-  ThreadLocalObject<MemoryScopeVector> stack_tlo_;

-};

-

-// A test framework for testing the Pushing & popping memory scopes.

-// The key feature here is that reporter is setup on the first test

-// instance and torn down after the last test has run.

-class MemoryScopeReportingTest : public ::testing::Test {

- public:

-  TestMemoryScopeReporter* test_memory_reporter() { return s_reporter_; }

-

-  bool reporting_enabled() const { return s_reporter_enabled_; }

-

- protected:

-  static void SetUpTestCase() {

-    if (!s_reporter_) {

-      s_reporter_ = new TestMemoryScopeReporter;

-    }

-    s_reporter_enabled_ =

-        NbSetMemoryScopeReporter(s_reporter_->memory_scope_reporter());

-

-    EXPECT_EQ(StarboardAllowsMemoryTracking(), s_reporter_enabled_)

-        << "Expected the memory scope reporter to be enabled whenever "

-           "starboard memory tracking is allowed.";

-  }

-

-  static void TearDownTestCase() {

-    // The reporter itself is not deleted because other threads could

-    // be traversing through it's data structures. It's better just to leave

-    // the object alive for the purposes of this unit test and set the pointer

-    // to NULL.

-    // This is done in order to make the MemoryScopeReport object lock free.

-    // This increases performance and reduces complexity of design.

-    NbSetMemoryScopeReporter(NULL);

-  }

-

-  // Per test setup.

-  virtual void SetUp() {

-    test_memory_reporter()->stack_thread_local()->clear();

-  }

-

-  static TestMemoryScopeReporter* s_reporter_;

-  static bool s_reporter_enabled_;

-};

-TestMemoryScopeReporter* MemoryScopeReportingTest::s_reporter_ = NULL;

-bool MemoryScopeReportingTest::s_reporter_enabled_;

-

-///////////////////////////////////////////////////////////////////////////////

-// TESTS.

-// There are two sets of tests: POSITIVE and NEGATIVE.

-//  The positive tests are active when STARBOARD_ALLOWS_MEMORY_TRACKING is

-//  defined and test that memory tracking is enabled.

-//  NEGATIVE tests ensure that tracking is disabled when

-//  STARBOARD_ALLOWS_MEMORY_TRACKING is not defined.

-// When adding new tests:

-//  POSITIVE tests are named normally.

-//  NEGATIVE tests are named with "No" prefixed to the beginning.

-//  Example:

-//   TEST_F(MemoryScopeReportingTest, PushPop) <--- POSITIVE test.

-//   TEST_F(MemoryScopeReportingTest, NoPushPop) <- NEGATIVE test.

-//  All positive & negative tests are grouped together.

-///////////////////////////////////////////////////////////////////////////////

-

-#if defined(STARBOARD_ALLOWS_MEMORY_TRACKING)

-// These are POSITIVE tests, which test the expectation that when the define

-// STARBOARD_ALLOWS_MEMORY_TRACKING is active that the memory scope reporter

-// will receive memory scope notifications.

-

-// Tests the assumption that the SbMemoryAllocate and SbMemoryDeallocate

-// will report memory allocations.

-TEST_F(MemoryScopeReportingTest, PushPop) {

-  ASSERT_TRUE(reporting_enabled());

-  const int line_number = __LINE__;

-  const char* file_name = __FILE__;

-  const char* function_name = __FUNCTION__;

-  NbMemoryScopeInfo info = {0,              // Cached value (null).

-                            "Javascript",   // Name of the memory scope.

-                            file_name,      // Filename that invoked this.

-                            line_number,    // Line number.

-                            function_name,  // Function name.

-                            true};          // true allows caching.

-

-  NbPushMemoryScope(&info);

-

-  ASSERT_FALSE(test_memory_reporter()->stack_thread_local()->empty());

-  NbMemoryScopeInfo* info_ptr =

-      test_memory_reporter()->stack_thread_local()->front();

-

-  EXPECT_EQ(&info, info_ptr);

-  EXPECT_STREQ(info.file_name_, file_name);

-  EXPECT_STREQ(info.function_name_, function_name);

-  EXPECT_EQ(info.line_number_, line_number);

-

-  NbPopMemoryScope();

-  EXPECT_TRUE(test_memory_reporter()->stack_thread_local()->empty());

-}

-

-// Tests the expectation that the memory reporting macros will

-// push/pop memory regions and will also correctly bind to the

-// file, linenumber and also the function name.

-TEST_F(MemoryScopeReportingTest, Macros) {

-  ASSERT_TRUE(reporting_enabled());

-  // There should be no leftover stack objects.

-  EXPECT_TRUE(test_memory_reporter()->stack_thread_local()->empty());

-  {

-    const int line_before = __LINE__;

-    TRACK_MEMORY_SCOPE("TestMemoryScope");

-    const int predicted_line = line_before + 1;

-

-    NbMemoryScopeInfo* info_ptr =

-        test_memory_reporter()->stack_thread_local()->front();

-

-    // TRACK_MEMORY_SCOPE is defined to allow caching.

-    EXPECT_EQ(true, info_ptr->allows_caching_);

-

-    // The cached_handle_ is not mutated by TestMemoryScopeReporter so

-    // therefore it should be the default value of 0.

-    EXPECT_EQ(0, info_ptr->cached_handle_);

-

-    EXPECT_STREQ("TestMemoryScope", info_ptr->memory_scope_name_);

-    EXPECT_STREQ(__FILE__, info_ptr->file_name_);

-    EXPECT_EQ(predicted_line, info_ptr->line_number_);

-    EXPECT_STREQ(__FUNCTION__, info_ptr->function_name_);

-  }

-  // Expect that the stack object is now empty again.

-  EXPECT_TRUE(test_memory_reporter()->stack_thread_local()->empty());

-}

-

-#else  // !defined(STARBOARD_ALLOWS_MEMORY_TRACKING)

-// These are NEGATIVE tests, which test the expectation that when the

-// STARBOARD_ALLOWS_MEMORY_TRACKING is undefined that the memory scope reprter

-// does not receive memory scope notifications.

-

-// Tests the expectation that push pop does not send notifications to the

-// reporter when disabled.

-TEST_F(MemoryScopeReportingTest, NoPushPop) {

-  ASSERT_FALSE(reporting_enabled());

-  const int line_number = __LINE__;

-  const char* file_name = __FILE__;

-  const char* function_name = __FUNCTION__;

-  NbMemoryScopeInfo info = {0,              // Cached value (null).

-                            "Javascript",   // Name of the memory scope.

-                            file_name,      // Filename that invoked this.

-                            line_number,    // Line number.

-                            function_name,  // Function name.

-                            true};          // true allows caching.

-

-  NbPushMemoryScope(&info);

-  ASSERT_TRUE(test_memory_reporter()->stack_thread_local()->empty());

-  NbPopMemoryScope();

-  EXPECT_TRUE(test_memory_reporter()->stack_thread_local()->empty());

-}

-

-// Tests the expectation that the memory reporting macros are disabled when

-// memory tracking is not allowed.

-TEST_F(MemoryScopeReportingTest, NoMacros) {

-  ASSERT_FALSE(reporting_enabled());

-  // Test that the macros do nothing when memory reporting has been

-  // disabled.

-  TRACK_MEMORY_SCOPE("InternalMemoryRegion");

-  ASSERT_TRUE(test_memory_reporter()->stack_thread_local()->empty())

-      << "Memory reporting received notifications when it should be disabled.";

-}

-#endif

-

-}  // namespace.

-}  // namespace nb.

diff --git a/nb/move.h b/nb/move.h
deleted file mode 100644
index 446a3da..0000000
--- a/nb/move.h
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef NB_MOVE_H_
-#define NB_MOVE_H_
-
-// Macro with the boilerplate that makes a type move-only in C++03.
-//
-// USAGE
-//
-// This macro should be used instead of DISALLOW_COPY_AND_ASSIGN to create
-// a "move-only" type.  Unlike DISALLOW_COPY_AND_ASSIGN, this macro should be
-// the first line in a class declaration.
-//
-// A class using this macro must call .Pass() (or somehow be an r-value already)
-// before it can be:
-//
-//   * Passed as a function argument
-//   * Used as the right-hand side of an assignment
-//   * Returned from a function
-//
-// Each class will still need to define their own "move constructor" and "move
-// operator=" to make this useful.  Here's an example of the macro, the move
-// constructor, and the move operator= from the scoped_ptr class:
-//
-//  template <typename T>
-//  class scoped_ptr {
-//     MOVE_ONLY_TYPE_FOR_CPP_03(scoped_ptr, RValue)
-//   public:
-//    scoped_ptr(RValue& other) : ptr_(other.release()) { }
-//    scoped_ptr& operator=(RValue& other) {
-//      swap(other);
-//      return *this;
-//    }
-//  };
-//
-// Note that the constructor must NOT be marked explicit.
-//
-// For consistency, the second parameter to the macro should always be RValue
-// unless you have a strong reason to do otherwise.  It is only exposed as a
-// macro parameter so that the move constructor and move operator= don't look
-// like they're using a phantom type.
-//
-//
-// HOW THIS WORKS
-//
-// For a thorough explanation of this technique, see:
-//
-//   http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor
-//
-// The summary is that we take advantage of 2 properties:
-//
-//   1) non-const references will not bind to r-values.
-//   2) C++ can apply one user-defined conversion when initializing a
-//      variable.
-//
-// The first lets us disable the copy constructor and assignment operator
-// by declaring private version of them with a non-const reference parameter.
-//
-// For l-values, direct initialization still fails like in
-// DISALLOW_COPY_AND_ASSIGN because the copy constructor and assignment
-// operators are private.
-//
-// For r-values, the situation is different. The copy constructor and
-// assignment operator are not viable due to (1), so we are trying to call
-// a non-existent constructor and non-existing operator= rather than a private
-// one.  Since we have not committed an error quite yet, we can provide an
-// alternate conversion sequence and a constructor.  We add
-//
-//   * a private struct named "RValue"
-//   * a user-defined conversion "operator RValue()"
-//   * a "move constructor" and "move operator=" that take the RValue& as
-//     their sole parameter.
-//
-// Only r-values will trigger this sequence and execute our "move constructor"
-// or "move operator=."  L-values will match the private copy constructor and
-// operator= first giving a "private in this context" error.  This combination
-// gives us a move-only type.
-//
-// For signaling a destructive transfer of data from an l-value, we provide a
-// method named Pass() which creates an r-value for the current instance
-// triggering the move constructor or move operator=.
-//
-// Other ways to get r-values is to use the result of an expression like a
-// function call.
-//
-// Here's an example with comments explaining what gets triggered where:
-//
-//    class Foo {
-//      MOVE_ONLY_TYPE_FOR_CPP_03(Foo, RValue);
-//
-//     public:
-//       ... API ...
-//       Foo(RValue other);           // Move constructor.
-//       Foo& operator=(RValue rhs);  // Move operator=
-//    };
-//
-//    Foo MakeFoo();  // Function that returns a Foo.
-//
-//    Foo f;
-//    Foo f_copy(f);  // ERROR: Foo(Foo&) is private in this context.
-//    Foo f_assign;
-//    f_assign = f;   // ERROR: operator=(Foo&) is private in this context.
-//
-//
-//    Foo f(MakeFoo());      // R-value so alternate conversion executed.
-//    Foo f_copy(f.Pass());  // R-value so alternate conversion executed.
-//    f = f_copy.Pass();     // R-value so alternate conversion executed.
-//
-//
-// IMPLEMENTATION SUBTLETIES WITH RValue
-//
-// The RValue struct is just a container for a pointer back to the original
-// object. It should only ever be created as a temporary, and no external
-// class should ever declare it or use it in a parameter.
-//
-// It is tempting to want to use the RValue type in function parameters, but
-// excluding the limited usage here for the move constructor and move
-// operator=, doing so would mean that the function could take both r-values
-// and l-values equally which is unexpected.  See COMPARED To Boost.Move for
-// more details.
-//
-// An alternate, and incorrect, implementation of the RValue class used by
-// Boost.Move makes RValue a fieldless child of the move-only type. RValue&
-// is then used in place of RValue in the various operators.  The RValue& is
-// "created" by doing *reinterpret_cast<RValue*>(this).  This has the appeal
-// of never creating a temporary RValue struct even with optimizations
-// disabled.  Also, by virtue of inheritance you can treat the RValue
-// reference as if it were the move-only type itself.  Unfortunately,
-// using the result of this reinterpret_cast<> is actually undefined behavior
-// due to C++98 5.2.10.7. In certain compilers (eg., NaCl) the optimizer
-// will generate non-working code.
-//
-// In optimized builds, both implementations generate the same assembly so we
-// choose the one that adheres to the standard.
-//
-//
-// COMPARED TO C++11
-//
-// In C++11, you would implement this functionality using an r-value reference
-// and our .Pass() method would be replaced with a call to std::move().
-//
-// This emulation also has a deficiency where it uses up the single
-// user-defined conversion allowed by C++ during initialization.  This can
-// cause problems in some API edge cases.  For instance, in scoped_ptr, it is
-// impossible to make an function "void Foo(scoped_ptr<Parent> p)" accept a
-// value of type scoped_ptr<Child> even if you add a constructor to
-// scoped_ptr<> that would make it look like it should work.  C++11 does not
-// have this deficiency.
-//
-//
-// COMPARED TO Boost.Move
-//
-// Our implementation similar to Boost.Move, but we keep the RValue struct
-// private to the move-only type, and we don't use the reinterpret_cast<> hack.
-//
-// In Boost.Move, RValue is the boost::rv<> template.  This type can be used
-// when writing APIs like:
-//
-//   void MyFunc(boost::rv<Foo>& f)
-//
-// that can take advantage of rv<> to avoid extra copies of a type.  However you
-// would still be able to call this version of MyFunc with an l-value:
-//
-//   Foo f;
-//   MyFunc(f);  // Uh oh, we probably just destroyed |f| w/o calling Pass().
-//
-// unless someone is very careful to also declare a parallel override like:
-//
-//   void MyFunc(const Foo& f)
-//
-// that would catch the l-values first.  This was declared unsafe in C++11 and
-// a C++11 compiler will explicitly fail MyFunc(f).  Unfortunately, we cannot
-// ensure this in C++03.
-//
-// Since we have no need for writing such APIs yet, our implementation keeps
-// RValue private and uses a .Pass() method to do the conversion instead of
-// trying to write a version of "std::move()." Writing an API like std::move()
-// would require the RValue structs to be public.
-//
-//
-// CAVEATS
-//
-// If you include a move-only type as a field inside a class that does not
-// explicitly declare a copy constructor, the containing class's implicit
-// copy constructor will change from Containing(const Containing&) to
-// Containing(Containing&).  This can cause some unexpected errors.
-//
-//   http://llvm.org/bugs/show_bug.cgi?id=11528
-//
-// The workaround is to explicitly declare your copy constructor.
-//
-#define MOVE_ONLY_TYPE_FOR_CPP_03(type, rvalue_type)   \
- private:                                              \
-  struct rvalue_type {                                 \
-    rvalue_type(type* object) : object(object) {}      \
-    type* object;                                      \
-  };                                                   \
-  type(type&);                                         \
-  void operator=(type&);                               \
-                                                       \
- public:                                               \
-  operator rvalue_type() { return rvalue_type(this); } \
-  type Pass() { return type(rvalue_type(this)); }      \
-                                                       \
- private:
-
-#endif  // NB_MOVE_H_
diff --git a/nb/multipart_allocator.cc b/nb/multipart_allocator.cc
deleted file mode 100644
index 648cac1..0000000
--- a/nb/multipart_allocator.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2017 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "nb/multipart_allocator.h"
-
-#include <algorithm>
-
-#include "starboard/common/log.h"
-#include "starboard/memory.h"
-
-namespace nb {
-
-MultipartAllocator::Allocations::Allocations(void* buffer, int buffer_size)
-    : number_of_buffers_(1),
-      buffers_(&buffer_),
-      buffer_sizes_(&buffer_size_),
-      buffer_(buffer),
-      buffer_size_(buffer_size) {
-  SB_DCHECK(buffer != NULL);
-  SB_DCHECK(buffer_size > 0);
-}
-
-MultipartAllocator::Allocations::Allocations(int number_of_buffers,
-                                             void** buffers,
-                                             const int* buffer_sizes)
-    : number_of_buffers_(0), buffers_(NULL), buffer_sizes_(NULL) {
-  SB_DCHECK(number_of_buffers > 0);
-  SB_DCHECK(buffers != NULL);
-  SB_DCHECK(buffer_sizes != NULL);
-
-  Assign(number_of_buffers, buffers, buffer_sizes);
-
-  for (int i = 0; i < number_of_buffers_; ++i) {
-    SB_DCHECK(buffers_[i] != NULL);
-    SB_DCHECK(buffer_sizes_[i] > 0);
-  }
-}
-
-MultipartAllocator::Allocations::Allocations(const Allocations& that)
-    : number_of_buffers_(0), buffers_(NULL), buffer_sizes_(NULL) {
-  Assign(that.number_of_buffers_, that.buffers_, that.buffer_sizes_);
-}
-
-MultipartAllocator::Allocations::~Allocations() {
-  Destroy();
-}
-
-MultipartAllocator::Allocations& MultipartAllocator::Allocations::operator=(
-    const Allocations& that) {
-  Destroy();
-  Assign(that.number_of_buffers_, that.buffers_, that.buffer_sizes_);
-  return *this;
-}
-
-int MultipartAllocator::Allocations::size() const {
-  int size = 0;
-
-  for (size_t i = 0; i < number_of_buffers_; ++i) {
-    size += buffer_sizes_[i];
-  }
-
-  return size;
-}
-
-void MultipartAllocator::Allocations::ShrinkTo(int size) {
-  for (size_t i = 0; i < number_of_buffers_; ++i) {
-    if (size >= buffer_sizes_[i]) {
-      size -= buffer_sizes_[i];
-    } else {
-      buffer_sizes_[i] = size;
-      size = 0;
-      ++i;
-      while (i < number_of_buffers_) {
-        buffer_sizes_[i] = 0;
-        ++i;
-      }
-      break;
-    }
-  }
-
-  SB_DCHECK(size == 0);
-}
-
-void MultipartAllocator::Allocations::Write(int destination_offset,
-                                            const void* src,
-                                            int size) {
-  size_t buffer_index = 0;
-  const uint8_t* src_in_uint8 = static_cast<const uint8_t*>(src);
-  while (size > 0) {
-    if (buffer_index >= number_of_buffers_) {
-      SB_NOTREACHED();
-      return;
-    }
-    if (buffer_sizes_[buffer_index] <= destination_offset) {
-      destination_offset -= buffer_sizes_[buffer_index];
-    } else {
-      int bytes_to_copy =
-          std::min(size, buffer_sizes_[buffer_index] - destination_offset);
-      uint8_t* destination_in_uint8 =
-          static_cast<uint8_t*>(buffers_[buffer_index]);
-      memcpy(destination_in_uint8 + destination_offset, src_in_uint8,
-                   bytes_to_copy);
-      destination_offset = 0;
-      src_in_uint8 += bytes_to_copy;
-      size -= bytes_to_copy;
-    }
-    ++buffer_index;
-  }
-}
-
-void MultipartAllocator::Allocations::Read(void* destination) const {
-  uint8_t* destination_in_uint8 = static_cast<uint8_t*>(destination);
-
-  for (size_t i = 0; i < number_of_buffers_; ++i) {
-    memcpy(destination_in_uint8, buffers_[i], buffer_sizes_[i]);
-    destination_in_uint8 += buffer_sizes_[i];
-  }
-}
-
-void MultipartAllocator::Allocations::Assign(int number_of_buffers,
-                                             void** buffers,
-                                             const int* buffer_sizes) {
-  SB_DCHECK(number_of_buffers_ == 0);
-  SB_DCHECK(buffers_ == NULL);
-  SB_DCHECK(buffer_sizes_ == NULL);
-
-  number_of_buffers_ = number_of_buffers;
-  if (number_of_buffers_ == 0) {
-    buffers_ = NULL;
-    buffer_sizes_ = NULL;
-    return;
-  }
-  if (number_of_buffers_ == 1) {
-    buffers_ = &buffer_;
-    buffer_sizes_ = &buffer_size_;
-    buffer_ = buffers[0];
-    buffer_size_ = buffer_sizes[0];
-    return;
-  }
-  buffers_ = new void*[number_of_buffers_];
-  buffer_sizes_ = new int[number_of_buffers_];
-  memcpy(buffers_, buffers, sizeof(*buffers_) * number_of_buffers_);
-  memcpy(buffer_sizes_, buffer_sizes,
-               sizeof(*buffer_sizes_) * number_of_buffers_);
-}
-
-void MultipartAllocator::Allocations::Destroy() {
-  if (number_of_buffers_ > 1) {
-    delete[] buffers_;
-    delete[] buffer_sizes_;
-  }
-  number_of_buffers_ = 0;
-  buffers_ = NULL;
-  buffer_sizes_ = NULL;
-}
-
-}  // namespace nb
diff --git a/nb/multipart_allocator.h b/nb/multipart_allocator.h
deleted file mode 100644
index b29e114..0000000
--- a/nb/multipart_allocator.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef NB_MULTIPART_ALLOCATOR_H_
-#define NB_MULTIPART_ALLOCATOR_H_
-
-#include "starboard/configuration.h"
-#include "starboard/types.h"
-
-namespace nb {
-
-// The class can fulfill allocation request by more than one blocks.  It also
-// provides a nested class to manage such allocations.
-class MultipartAllocator {
- public:
-  class Allocations {
-   public:
-    Allocations()
-        : number_of_buffers_(0), buffers_(NULL), buffer_sizes_(NULL) {}
-    Allocations(void* buffer, int buffer_size);
-    Allocations(int number_of_buffers, void** buffers, const int* buffer_sizes);
-    Allocations(const Allocations& that);
-    ~Allocations();
-
-    Allocations& operator=(const Allocations& that);
-
-    int size() const;
-
-    void* const* buffers() { return buffers_; }
-    const void* const* buffers() const { return buffers_; }
-
-    const int* buffer_sizes() const { return buffer_sizes_; }
-
-    int number_of_buffers() const { return number_of_buffers_; }
-
-    void ShrinkTo(int size);
-    // Write |size| bytes from |src| to buffers start from |destination_offset|.
-    void Write(int destination_offset, const void* src, int size);
-    // Read data from the Allocations into |destination|.  |destination| is
-    // guaranteed to have enough space to hold all data contained.
-    void Read(void* destination) const;
-
-   private:
-    void Assign(int number_of_buffers, void** buffers, const int* buffer_sizes);
-    void Destroy();
-
-    int number_of_buffers_;
-    void** buffers_;
-    int* buffer_sizes_;
-    // Store data in the class to avoid allocate memory when there is only one
-    // buffer.  In this case |buffers_| and |buffer_sizes_| will point to
-    // |buffer_| and |buffer_size_| respectively.
-    void* buffer_;
-    int buffer_size_;
-  };
-
-  virtual ~MultipartAllocator() {}
-
-  // Allocate a memory block that contains at least |size| bytes and its
-  // address is aligned to |alignment|.  It returns an empty Allocations object
-  // on failure.
-  virtual Allocations Allocate(size_t size,
-                               size_t alignment,
-                               intptr_t context) = 0;
-  // Free a memory block previously allocated by calling Allocate().
-  virtual void Free(Allocations allocations) = 0;
-};
-
-}  // namespace nb
-
-#endif  // NB_MULTIPART_ALLOCATOR_H_
diff --git a/nb/multipart_allocator_test.cc b/nb/multipart_allocator_test.cc
deleted file mode 100644
index 5fcf08e..0000000
--- a/nb/multipart_allocator_test.cc
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/multipart_allocator.h"
-
-#include <vector>
-
-#include "starboard/common/log.h"
-#include "starboard/common/memory.h"
-#include "starboard/configuration.h"
-#include "starboard/memory.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace nb {
-namespace {
-
-using starboard::common::MemoryIsZero;
-
-TEST(MultipartAllocatorAllocationsTest, DefaultCtor) {
-  MultipartAllocator::Allocations allocations;
-  EXPECT_EQ(allocations.number_of_buffers(), 0);
-  // Call these functions as a sanity check that they are still callable.
-  allocations.buffers();
-  allocations.buffer_sizes();
-}
-
-TEST(MultipartAllocatorAllocationsTest, CopyCtor) {
-  {
-    // Allocations with 0 blocks.
-    MultipartAllocator::Allocations allocations;
-    MultipartAllocator::Allocations copy(allocations);
-    EXPECT_EQ(copy.number_of_buffers(), 0);
-    // Call these functions as a sanity check that they are still callable.
-    copy.buffers();
-    copy.buffer_sizes();
-  }
-
-  {
-    // Allocations with one blocks.
-    const int kBufferSize = 128;
-    char buffer[kBufferSize];
-
-    MultipartAllocator::Allocations allocations(buffer, kBufferSize);
-    MultipartAllocator::Allocations copy(allocations);
-    EXPECT_EQ(copy.number_of_buffers(), 1);
-    EXPECT_EQ(copy.buffers()[0], buffer);
-    EXPECT_EQ(copy.buffer_sizes()[0], kBufferSize);
-  }
-
-  {
-    // Allocations with more than one blocks.
-    const int kBufferSize0 = 128;
-    const int kBufferSize1 = 16;
-    char buffer0[kBufferSize0];
-    char buffer1[kBufferSize1];
-
-    std::vector<void*> buffers = {buffer0, buffer1};
-    std::vector<int> buffer_sizes = {kBufferSize0, kBufferSize1};
-
-    MultipartAllocator::Allocations allocations(
-        static_cast<int>(buffers.size()), buffers.data(), buffer_sizes.data());
-    MultipartAllocator::Allocations copy(allocations);
-    EXPECT_EQ(copy.number_of_buffers(), 2);
-    EXPECT_EQ(copy.buffers()[0], buffer0);
-    EXPECT_EQ(copy.buffer_sizes()[0], kBufferSize0);
-    EXPECT_EQ(copy.buffers()[1], buffer1);
-    EXPECT_EQ(copy.buffer_sizes()[1], kBufferSize1);
-  }
-}
-
-TEST(MultipartAllocatorAllocationsTest, AssignmentOperator) {
-  {
-    // Allocations with 0 blocks.
-    MultipartAllocator::Allocations allocations;
-    MultipartAllocator::Allocations copy;
-    copy = allocations;
-    EXPECT_EQ(copy.number_of_buffers(), 0);
-    // Call these functions as a sanity check that they are still callable.
-    copy.buffers();
-    copy.buffer_sizes();
-  }
-
-  {
-    // Allocations with one blocks.
-    const int kBufferSize = 128;
-    char buffer[kBufferSize];
-
-    MultipartAllocator::Allocations allocations(buffer, kBufferSize);
-    MultipartAllocator::Allocations copy;
-    copy = allocations;
-    EXPECT_EQ(copy.number_of_buffers(), 1);
-    EXPECT_EQ(copy.buffers()[0], buffer);
-    EXPECT_EQ(copy.buffer_sizes()[0], kBufferSize);
-  }
-
-  {
-    // Allocations with more than one blocks.
-    const int kBufferSize0 = 128;
-    const int kBufferSize1 = 16;
-    char buffer0[kBufferSize0];
-    char buffer1[kBufferSize1];
-
-    std::vector<void*> buffers = {buffer0, buffer1};
-    std::vector<int> buffer_sizes = {kBufferSize0, kBufferSize1};
-
-    MultipartAllocator::Allocations allocations(
-        static_cast<int>(buffers.size()), buffers.data(), buffer_sizes.data());
-    MultipartAllocator::Allocations copy;
-    copy = allocations;
-    EXPECT_EQ(copy.number_of_buffers(), 2);
-    EXPECT_EQ(copy.buffers()[0], buffer0);
-    EXPECT_EQ(copy.buffer_sizes()[0], kBufferSize0);
-    EXPECT_EQ(copy.buffers()[1], buffer1);
-    EXPECT_EQ(copy.buffer_sizes()[1], kBufferSize1);
-  }
-}
-
-TEST(MultipartAllocatorAllocationsTest, SingleBuffer) {
-  const int kBufferSize = 128;
-  char buffer[kBufferSize];
-
-  MultipartAllocator::Allocations allocations(buffer, kBufferSize);
-  EXPECT_EQ(allocations.number_of_buffers(), 1);
-  EXPECT_EQ(allocations.buffers()[0], buffer);
-  EXPECT_EQ(allocations.buffer_sizes()[0], kBufferSize);
-}
-
-TEST(MultipartAllocatorAllocationsTest, SingleBufferShrunk) {
-  const int kBufferSize = 128;
-  char buffer[kBufferSize];
-
-  MultipartAllocator::Allocations allocations(buffer, kBufferSize);
-
-  allocations.ShrinkTo(kBufferSize / 2);
-  EXPECT_EQ(allocations.number_of_buffers(), 1);
-  EXPECT_EQ(allocations.buffers()[0], buffer);
-  EXPECT_EQ(allocations.buffer_sizes()[0], kBufferSize / 2);
-
-  allocations.ShrinkTo(0);
-  EXPECT_EQ(allocations.number_of_buffers(), 1);
-  EXPECT_EQ(allocations.buffers()[0], buffer);
-  EXPECT_EQ(allocations.buffer_sizes()[0], 0);
-}
-
-TEST(MultipartAllocatorAllocationsTest, SingleBufferWrite) {
-  const int kBufferSize = 128;
-  char buffer[kBufferSize * 2];  // Use extra space for boundary checking.
-  char source[kBufferSize];
-
-  MultipartAllocator::Allocations allocations(buffer, kBufferSize);
-  memset(source, 'x', kBufferSize);
-
-  memset(buffer, 0, kBufferSize * 2);
-  allocations.Write(0, source, kBufferSize);
-  EXPECT_EQ(memcmp(buffer, source, kBufferSize), 0);
-  EXPECT_TRUE(MemoryIsZero(buffer + kBufferSize, kBufferSize));
-
-  memset(buffer, 0, kBufferSize * 2);
-  allocations.Write(kBufferSize / 2, source, kBufferSize / 2);
-  EXPECT_TRUE(MemoryIsZero(buffer, kBufferSize / 2));
-  EXPECT_EQ(memcmp(buffer + kBufferSize / 2, source, kBufferSize / 2), 0);
-  EXPECT_TRUE(MemoryIsZero(buffer + kBufferSize, kBufferSize));
-
-  memset(buffer, 0, kBufferSize * 2);
-  allocations.Write(kBufferSize, source, 0);
-  EXPECT_TRUE(MemoryIsZero(buffer, kBufferSize * 2));
-  EXPECT_TRUE(MemoryIsZero(buffer + kBufferSize, kBufferSize));
-}
-
-TEST(MultipartAllocatorAllocationsTest, SingleBufferRead) {
-  const int kBufferSize = 128;
-  char buffer[kBufferSize];
-  char destination[kBufferSize * 2];
-
-  MultipartAllocator::Allocations allocations(buffer, kBufferSize);
-
-  memset(buffer, 'x', kBufferSize);
-  memset(destination, 0, kBufferSize * 2);
-  allocations.Read(destination);
-  EXPECT_EQ(memcmp(buffer, destination, kBufferSize), 0);
-  EXPECT_TRUE(MemoryIsZero(destination + kBufferSize, kBufferSize));
-}
-
-TEST(MultipartAllocatorAllocationsTest, MultipleBuffers) {
-  const int kBufferSize0 = 128;
-  const int kBufferSize1 = 16;
-  char buffer0[kBufferSize0];
-  char buffer1[kBufferSize1];
-
-  std::vector<void*> buffers = {buffer0, buffer1};
-  std::vector<int> buffer_sizes = {kBufferSize0, kBufferSize1};
-
-  MultipartAllocator::Allocations allocations(
-      static_cast<int>(buffers.size()), buffers.data(), buffer_sizes.data());
-  EXPECT_EQ(allocations.number_of_buffers(), 2);
-  EXPECT_EQ(allocations.buffers()[0], buffer0);
-  EXPECT_EQ(allocations.buffers()[1], buffer1);
-  EXPECT_EQ(allocations.buffer_sizes()[0], kBufferSize0);
-  EXPECT_EQ(allocations.buffer_sizes()[1], kBufferSize1);
-}
-
-TEST(MultipartAllocatorAllocationsTest, MultipleBuffersShrink) {
-  const int kBufferSize0 = 128;
-  const int kBufferSize1 = 16;
-  char buffer0[kBufferSize0];
-  char buffer1[kBufferSize1];
-
-  std::vector<void*> buffers = {buffer0, buffer1};
-  std::vector<int> buffer_sizes = {kBufferSize0, kBufferSize1};
-
-  MultipartAllocator::Allocations allocations(
-      static_cast<int>(buffers.size()), buffers.data(), buffer_sizes.data());
-
-  allocations.ShrinkTo(kBufferSize0 + kBufferSize1 / 2);
-  EXPECT_EQ(allocations.number_of_buffers(), 2);
-  EXPECT_EQ(allocations.buffers()[0], buffer0);
-  EXPECT_EQ(allocations.buffers()[1], buffer1);
-  EXPECT_EQ(allocations.buffer_sizes()[0], kBufferSize0);
-  EXPECT_EQ(allocations.buffer_sizes()[1], kBufferSize1 / 2);
-
-  allocations.ShrinkTo(kBufferSize0);
-  EXPECT_EQ(allocations.number_of_buffers(), 2);
-  EXPECT_EQ(allocations.buffers()[0], buffer0);
-  EXPECT_EQ(allocations.buffers()[1], buffer1);
-  EXPECT_EQ(allocations.buffer_sizes()[0], kBufferSize0);
-  EXPECT_EQ(allocations.buffer_sizes()[1], 0);
-
-  allocations.ShrinkTo(kBufferSize0 / 2);
-  EXPECT_EQ(allocations.number_of_buffers(), 2);
-  EXPECT_EQ(allocations.buffers()[0], buffer0);
-  EXPECT_EQ(allocations.buffers()[1], buffer1);
-  EXPECT_EQ(allocations.buffer_sizes()[0], kBufferSize0 / 2);
-  EXPECT_EQ(allocations.buffer_sizes()[1], 0);
-
-  allocations.ShrinkTo(0);
-  EXPECT_EQ(allocations.number_of_buffers(), 2);
-  EXPECT_EQ(allocations.buffers()[0], buffer0);
-  EXPECT_EQ(allocations.buffers()[1], buffer1);
-  EXPECT_EQ(allocations.buffer_sizes()[0], 0);
-  EXPECT_EQ(allocations.buffer_sizes()[1], 0);
-}
-
-TEST(MultipartAllocatorAllocationsTest, MultipleBuffersWrite) {
-  const int kBufferSize0 = 128;
-  const int kBufferSize1 = 16;
-  char buffer0[kBufferSize0];
-  char buffer1[kBufferSize1 * 2];  // Use extra space for boundary checking.
-  char source[kBufferSize0 + kBufferSize1];
-
-  std::vector<void*> buffers = {buffer0, buffer1};
-  std::vector<int> buffer_sizes = {kBufferSize0, kBufferSize1};
-
-  MultipartAllocator::Allocations allocations(
-      static_cast<int>(buffers.size()), buffers.data(), buffer_sizes.data());
-  memset(source, 'x', kBufferSize0 + kBufferSize1);
-
-  memset(buffer0, 0, kBufferSize0);
-  memset(buffer1, 0, kBufferSize1 * 2);
-  allocations.Write(0, source, kBufferSize0 + kBufferSize1);
-  EXPECT_EQ(memcmp(buffer0, source, kBufferSize0), 0);
-  EXPECT_EQ(memcmp(buffer1, source, kBufferSize1), 0);
-  EXPECT_TRUE(MemoryIsZero(buffer1 + kBufferSize1, kBufferSize1));
-
-  memset(buffer0, 0, kBufferSize0);
-  memset(buffer1, 0, kBufferSize1 * 2);
-  allocations.Write(kBufferSize0 / 2, source, kBufferSize0 / 2 + kBufferSize1);
-  EXPECT_TRUE(MemoryIsZero(buffer0, kBufferSize0 / 2));
-  EXPECT_EQ(memcmp(buffer0 + kBufferSize0 / 2, source, kBufferSize0 / 2), 0);
-  EXPECT_EQ(memcmp(buffer1, source, kBufferSize1), 0);
-  EXPECT_TRUE(MemoryIsZero(buffer1 + kBufferSize1, kBufferSize1));
-
-  memset(buffer0, 0, kBufferSize0);
-  memset(buffer1, 0, kBufferSize1 * 2);
-  allocations.Write(kBufferSize0, source, kBufferSize1);
-  EXPECT_TRUE(MemoryIsZero(buffer0, kBufferSize0));
-  EXPECT_EQ(memcmp(buffer1, source, kBufferSize1), 0);
-  EXPECT_TRUE(MemoryIsZero(buffer1 + kBufferSize1, kBufferSize1));
-
-  memset(buffer0, 0, kBufferSize0);
-  memset(buffer1, 0, kBufferSize1 * 2);
-  allocations.Write(kBufferSize0 + kBufferSize1, source, 0);
-  EXPECT_TRUE(MemoryIsZero(buffer0, kBufferSize0));
-  EXPECT_TRUE(MemoryIsZero(buffer1, kBufferSize1 * 2));
-}
-
-TEST(MultipartAllocatorAllocationsTest, MultipleBuffersRead) {
-  const int kBufferSize0 = 128;
-  const int kBufferSize1 = 16;
-  char buffer0[kBufferSize0];
-  char buffer1[kBufferSize1];
-  char destination[kBufferSize0 + kBufferSize1 * 2];
-
-  std::vector<void*> buffers = {buffer0, buffer1};
-  std::vector<int> buffer_sizes = {kBufferSize0, kBufferSize1};
-
-  MultipartAllocator::Allocations allocations(
-      static_cast<int>(buffers.size()), buffers.data(), buffer_sizes.data());
-
-  memset(buffer0, 'x', kBufferSize0);
-  memset(buffer1, 'y', kBufferSize1);
-  memset(destination, 0, kBufferSize0 + kBufferSize1 * 2);
-  allocations.Read(destination);
-  EXPECT_EQ(memcmp(buffer0, destination, kBufferSize0), 0);
-  EXPECT_EQ(memcmp(buffer1, destination + kBufferSize0, kBufferSize1), 0);
-  EXPECT_TRUE(
-      MemoryIsZero(destination + kBufferSize0 + kBufferSize1, kBufferSize1));
-}
-
-}  // namespace
-}  // namespace nb
diff --git a/nb/ref_counted.cc b/nb/ref_counted.cc
deleted file mode 100644
index 07959ff..0000000
--- a/nb/ref_counted.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "nb/ref_counted.h"
-
-#include "starboard/common/log.h"
-
-namespace nb {
-
-namespace subtle {
-
-RefCountedBase::RefCountedBase()
-    : ref_count_(0)
-#ifndef NDEBUG
-      ,
-      in_dtor_(false)
-#endif
-{
-}
-
-RefCountedBase::~RefCountedBase() {
-#ifndef NDEBUG
-  SB_DCHECK(in_dtor_) << "RefCounted object deleted without calling Release()";
-#endif
-}
-
-void RefCountedBase::AddRef() const {
-// TODO(maruel): Add back once it doesn't assert 500 times/sec.
-// Current thread books the critical section "AddRelease" without release it.
-// DFAKE_SCOPED_LOCK_THREAD_LOCKED(add_release_);
-#ifndef NDEBUG
-  SB_DCHECK(!in_dtor_);
-#endif
-  ++ref_count_;
-}
-
-bool RefCountedBase::Release() const {
-// TODO(maruel): Add back once it doesn't assert 500 times/sec.
-// Current thread books the critical section "AddRelease" without release it.
-// DFAKE_SCOPED_LOCK_THREAD_LOCKED(add_release_);
-#ifndef NDEBUG
-  SB_DCHECK(!in_dtor_);
-#endif
-  if (--ref_count_ == 0) {
-#ifndef NDEBUG
-    in_dtor_ = true;
-#endif
-    return true;
-  }
-  return false;
-}
-
-bool RefCountedThreadSafeBase::HasOneRef() const {
-  return (SbAtomicAcquire_Load(
-              &const_cast<RefCountedThreadSafeBase*>(this)->ref_count_) == 1);
-}
-
-RefCountedThreadSafeBase::RefCountedThreadSafeBase() : ref_count_(0) {
-#ifndef NDEBUG
-  in_dtor_ = false;
-#endif
-}
-
-RefCountedThreadSafeBase::~RefCountedThreadSafeBase() {
-#ifndef NDEBUG
-  SB_DCHECK(in_dtor_) << "RefCountedThreadSafe object deleted without "
-                         "calling Release()";
-#endif
-}
-
-void RefCountedThreadSafeBase::AddRef() const {
-#ifndef NDEBUG
-  SB_DCHECK(!in_dtor_);
-#endif
-  SbAtomicNoBarrier_Increment(&ref_count_, 1);
-}
-
-bool RefCountedThreadSafeBase::Release() const {
-#ifndef NDEBUG
-  SB_DCHECK(!in_dtor_);
-  SB_DCHECK(!(SbAtomicAcquire_Load(&ref_count_) == 0));
-#endif
-  if (SbAtomicBarrier_Increment(&ref_count_, -1) == 0) {
-#ifndef NDEBUG
-    in_dtor_ = true;
-#endif
-    return true;
-  }
-  return false;
-}
-
-}  // namespace subtle
-
-}  // namespace nb
diff --git a/nb/reuse_allocator_benchmark.cc b/nb/reuse_allocator_benchmark.cc
index d865bec..d7e8a32 100644
--- a/nb/reuse_allocator_benchmark.cc
+++ b/nb/reuse_allocator_benchmark.cc
@@ -228,7 +228,9 @@
 
 int BenchmarkMain(int argc, char** argv) {
   const char* kBenchmarks[] = {
-      "mem_history_cobalt.txt", "mem_history_gpu.txt", "mem_history_main.txt",
+      "mem_history_cobalt.txt",
+      "mem_history_gpu.txt",
+      "mem_history_main.txt",
   };
 
   for (std::size_t i = 0; i < SB_ARRAY_SIZE(kBenchmarks); ++i) {
diff --git a/nb/rewindable_vector.h b/nb/rewindable_vector.h
deleted file mode 100644
index 6bc3800..0000000
--- a/nb/rewindable_vector.h
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2017 Google Inc. All Rights Reserved.

-//

-// Licensed under the Apache License, Version 2.0 (the "License");

-// you may not use this file except in compliance with the License.

-// You may obtain a copy of the License at

-//

-//     http://www.apache.org/licenses/LICENSE-2.0

-//

-// Unless required by applicable law or agreed to in writing, software

-// distributed under the License is distributed on an "AS IS" BASIS,

-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-// See the License for the specific language governing permissions and

-// limitations under the License.

-//

-

-#ifndef NB_REWINDABLE_VECTOR_CAST_H_

-#define NB_REWINDABLE_VECTOR_CAST_H_

-

-#include <vector>

-

-#include "starboard/common/log.h"

-

-namespace nb {

-

-// Like an std::vector, but supports an additional rewind operation. rewind()

-// is like a light-weight clear() operation which does not destroy contained

-// objects.

-// This is important for performance where the same elements need to be

-// re-used. For example, a vector of structs which contain std::strings in

-// which it's more desirable for the strings are re-assigned rather than

-// destroyed and then re-constructed through rewind() / grow().

-//

-// Object destruction occurs on clear() or container destruction.

-//

-// Example:

-//  RewindableVector<std::string> values;

-//  values.push_back("ABCDEF");

-//  values.rewindAll();  // string at [0] is unchanged.

-//  EXPECT_EQ(0, values.size());

-//  values.expand(1);    // string at [0] is unchanged.

-//  values[0].assign("ABC");  // string is re-assigned, no memory allocated.

-template <typename T, typename VectorT = std::vector<T> >

-class RewindableVector {

- public:

-  RewindableVector() : size_(0) {}

-

-  const T& operator[](size_t i) const { return at(i); }

-  T& operator[](size_t i) { return at(i); }

-  const T& at(size_t i) const {

-    SB_DCHECK(i < size_);

-    return vector_[i];

-  }

-  T& at(size_t i) {

-    SB_DCHECK(i < size_);

-    return vector_[i];

-  }

-

-  bool empty() const { return size() == 0; }

-  size_t size() const { return size_; }

-

-  void clear() {

-    vector_.clear();

-    size_ = 0;

-  }

-  void rewindAll() { size_ = 0; }

-  void rewind(size_t i) {

-    if (i <= size_) {

-      size_ -= i;

-    } else {

-      SB_NOTREACHED() << "underflow condition.";

-      rewindAll();

-    }

-  }

-

-  // Grows the array by n values. The new last element is returned.

-  T& grow(size_t n) {

-    size_ += n;

-    if (size_ > vector_.size()) {

-      vector_.resize(size_);

-    }

-    return back();

-  }

-  T& back() { return vector_[size_ - 1]; }

-

-  void pop_back() { rewind(1); }

-

-  void push_back(const T& v) {

-    if (size_ == vector_.size()) {

-      vector_.push_back(v);

-    } else {

-      vector_[size_] = v;

-    }

-    ++size_;

-  }

-

-  VectorT& InternalData() { return vector_; }

-

- private:

-  VectorT vector_;

-  size_t size_;

-};

-

-}  // namespace nb

-

-#endif  // NB_REWINDABLE_VECTOR_CAST_H_

diff --git a/nb/rewindable_vector_test.cc b/nb/rewindable_vector_test.cc
deleted file mode 100644
index c12d2a1..0000000
--- a/nb/rewindable_vector_test.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/rewindable_vector.h"
-
-#include <string>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace nb {
-namespace {
-
-TEST(RewindableVector, rewind) {
-  RewindableVector<std::string> string_vector;
-  string_vector.push_back("ABCDEF");
-  string_vector.rewind(1);
-
-  EXPECT_TRUE(string_vector.empty());
-  EXPECT_EQ(0, string_vector.size());
-  EXPECT_EQ(1, string_vector.InternalData().size());
-
-  string_vector.grow(1);
-  EXPECT_EQ(1, string_vector.size());
-  EXPECT_FALSE(string_vector.empty());
-
-  // This is only possible if the std::string is not destroyed via
-  // rewindAll().
-  EXPECT_EQ(std::string("ABCDEF"), string_vector[0]);
-}
-
-TEST(RewindableVector, rewindAll) {
-  RewindableVector<std::string> string_vector;
-  string_vector.push_back("ABCDEF");
-  string_vector.rewindAll();
-
-  EXPECT_TRUE(string_vector.empty());
-  EXPECT_EQ(0, string_vector.size());
-  EXPECT_EQ(1, string_vector.InternalData().size());
-
-  string_vector.grow(1);
-  EXPECT_EQ(1, string_vector.size());
-  EXPECT_FALSE(string_vector.empty());
-
-  // This is only possible if the std::string is not destroyed via
-  // rewindAll().
-  EXPECT_EQ(std::string("ABCDEF"), string_vector[0]);
-}
-
-TEST(RewindableVector, push_pop_back) {
-  RewindableVector<std::string> string_vector;
-  string_vector.push_back("ABCDEF");
-  string_vector.pop_back();
-
-  EXPECT_TRUE(string_vector.empty());
-  EXPECT_EQ(0, string_vector.size());
-  EXPECT_EQ(1, string_vector.InternalData().size());
-
-  string_vector.grow(1);
-
-  // This is only possible if value was not destroyed during pop_back().
-  EXPECT_EQ(std::string("ABCDEF"), string_vector[0]);
-}
-
-}  // namespace
-}  // namespace nb
diff --git a/nb/scoped_ptr.h b/nb/scoped_ptr.h
deleted file mode 100644
index 021e911..0000000
--- a/nb/scoped_ptr.h
+++ /dev/null
@@ -1,491 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Scopers help you manage ownership of a pointer, helping you easily manage the
-// a pointer within a scope, and automatically destroying the pointer at the
-// end of a scope.  There are two main classes you will use, which correspond
-// to the operators new/delete and new[]/delete[].
-//
-// Example usage (scoped_ptr):
-//   {
-//     scoped_ptr<Foo> foo(new Foo("wee"));
-//   }  // foo goes out of scope, releasing the pointer with it.
-//
-//   {
-//     scoped_ptr<Foo> foo;          // No pointer managed.
-//     foo.reset(new Foo("wee"));    // Now a pointer is managed.
-//     foo.reset(new Foo("wee2"));   // Foo("wee") was destroyed.
-//     foo.reset(new Foo("wee3"));   // Foo("wee2") was destroyed.
-//     foo->Method();                // Foo::Method() called.
-//     foo.get()->Method();          // Foo::Method() called.
-//     SomeFunc(foo.release());      // SomeFunc takes ownership, foo no longer
-//                                   // manages a pointer.
-//     foo.reset(new Foo("wee4"));   // foo manages a pointer again.
-//     foo.reset();                  // Foo("wee4") destroyed, foo no longer
-//                                   // manages a pointer.
-//   }  // foo wasn't managing a pointer, so nothing was destroyed.
-//
-// Example usage (scoped_array):
-//   {
-//     scoped_array<Foo> foo(new Foo[100]);
-//     foo.get()->Method();  // Foo::Method on the 0th element.
-//     foo[10].Method();     // Foo::Method on the 10th element.
-//   }
-//
-// These scopers also implement part of the functionality of C++11 unique_ptr
-// in that they are "movable but not copyable."  You can use the scopers in
-// the parameter and return types of functions to signify ownership transfer
-// in to and out of a function.  When calling a function that has a scoper
-// as the argument type, it must be called with the result of an analogous
-// scoper's Pass() function or another function that generates a temporary;
-// passing by copy will NOT work.  Here is an example using scoped_ptr:
-//
-//   void TakesOwnership(scoped_ptr<Foo> arg) {
-//     // Do something with arg
-//   }
-//   scoped_ptr<Foo> CreateFoo() {
-//     // No need for calling Pass() because we are constructing a temporary
-//     // for the return value.
-//     return scoped_ptr<Foo>(new Foo("new"));
-//   }
-//   scoped_ptr<Foo> PassThru(scoped_ptr<Foo> arg) {
-//     return arg.Pass();
-//   }
-//
-//   {
-//     scoped_ptr<Foo> ptr(new Foo("yay"));  // ptr manages Foo("yay").
-//     TakesOwnership(ptr.Pass());           // ptr no longer owns Foo("yay").
-//     scoped_ptr<Foo> ptr2 = CreateFoo();   // ptr2 owns the return Foo.
-//     scoped_ptr<Foo> ptr3 =                // ptr3 now owns what was in ptr2.
-//         PassThru(ptr2.Pass());            // ptr2 is correspondingly NULL.
-//   }
-//
-// Notice that if you do not call Pass() when returning from PassThru(), or
-// when invoking TakesOwnership(), the code will not compile because scopers
-// are not copyable; they only implement move semantics which require calling
-// the Pass() function to signify a destructive transfer of state. CreateFoo()
-// is different though because we are constructing a temporary on the return
-// line and thus can avoid needing to call Pass().
-//
-// Pass() properly handles upcast in assignment, i.e. you can assign
-// scoped_ptr<Child> to scoped_ptr<Parent>:
-//
-//   scoped_ptr<Foo> foo(new Foo());
-//   scoped_ptr<FooParent> parent = foo.Pass();
-//
-// PassAs<>() should be used to upcast return value in return statement:
-//
-//   scoped_ptr<Foo> CreateFoo() {
-//     scoped_ptr<FooChild> result(new FooChild());
-//     return result.PassAs<Foo>();
-//   }
-//
-// Note that PassAs<>() is implemented only for scoped_ptr, but not for
-// scoped_array. This is because casting array pointers may not be safe.
-
-#ifndef NB_SCOPED_PTR_H_
-#define NB_SCOPED_PTR_H_
-
-// This is an implementation designed to match the anticipated future TR2
-// implementation of the scoped_ptr class, and its closely-related brethren,
-// scoped_array, scoped_ptr_malloc.
-
-#include <assert.h>
-#include <stddef.h>
-#include <stdlib.h>
-
-#include <algorithm>
-
-#include "nb/move.h"
-
-namespace nb {
-
-// A scoped_ptr<T> is like a T*, except that the destructor of scoped_ptr<T>
-// automatically deletes the pointer it holds (if any).
-// That is, scoped_ptr<T> owns the T object that it points to.
-// Like a T*, a scoped_ptr<T> may hold either NULL or a pointer to a T object.
-// Also like T*, scoped_ptr<T> is thread-compatible, and once you
-// dereference it, you get the thread safety guarantees of T.
-//
-// The size of a scoped_ptr is small:
-// sizeof(scoped_ptr<C>) == sizeof(C*)
-template <class C>
-class scoped_ptr {
-  MOVE_ONLY_TYPE_FOR_CPP_03(scoped_ptr, RValue)
-
- public:
-  // The element type
-  typedef C element_type;
-
-  // Constructor.  Defaults to initializing with NULL.
-  // There is no way to create an uninitialized scoped_ptr.
-  // The input parameter must be allocated with new.
-  explicit scoped_ptr(C* p = NULL) : ptr_(p) {}
-
-// The GHS compiler always chooses this copy constructor over the next one,
-// so disable this to promote the more important and frequently used constr.
-#if !defined(COMPILER_GHS)
-  // Constructor.  Allows construction from a scoped_ptr rvalue for a
-  // convertible type.
-  template <typename U>
-  scoped_ptr(scoped_ptr<U> other)
-      : ptr_(other.release()) {}
-#endif
-
-  // Constructor.  Move constructor for C++03 move emulation of this type.
-  scoped_ptr(RValue rvalue) : ptr_(rvalue.object->release()) {}
-
-  // Destructor.  If there is a C object, delete it.
-  // We don't need to test ptr_ == NULL because C++ does that for us.
-  ~scoped_ptr() {
-    enum { type_must_be_complete = sizeof(C) };
-    delete ptr_;
-  }
-
-  // operator=.  Allows assignment from a scoped_ptr rvalue for a convertible
-  // type.
-  template <typename U>
-  scoped_ptr& operator=(scoped_ptr<U> rhs) {
-    reset(rhs.release());
-    return *this;
-  }
-
-  // operator=.  Move operator= for C++03 move emulation of this type.
-  scoped_ptr& operator=(RValue rhs) {
-    swap(*rhs->object);
-    return *this;
-  }
-
-  // Reset.  Deletes the current owned object, if any.
-  // Then takes ownership of a new object, if given.
-  // this->reset(this->get()) works.
-  void reset(C* p = NULL) {
-    if (p != ptr_) {
-      enum { type_must_be_complete = sizeof(C) };
-      delete ptr_;
-      ptr_ = p;
-    }
-  }
-
-  // Accessors to get the owned object.
-  // operator* and operator-> will assert() if there is no current object.
-  C& operator*() const {
-    assert(ptr_ != NULL);
-    return *ptr_;
-  }
-  C* operator->() const {
-    assert(ptr_ != NULL);
-    return ptr_;
-  }
-  C* get() const { return ptr_; }
-
-  // Allow scoped_ptr<C> to be used in boolean expressions, but not
-  // implicitly convertible to a real bool (which is dangerous).
-  typedef C* scoped_ptr::*Testable;
-  operator Testable() const { return ptr_ ? &scoped_ptr::ptr_ : NULL; }
-
-  // Comparison operators.
-  // These return whether two scoped_ptr refer to the same object, not just to
-  // two different but equal objects.
-  bool operator==(C* p) const { return ptr_ == p; }
-  bool operator!=(C* p) const { return ptr_ != p; }
-
-  // Swap two scoped pointers.
-  void swap(scoped_ptr& p2) {
-    C* tmp = ptr_;
-    ptr_ = p2.ptr_;
-    p2.ptr_ = tmp;
-  }
-
-  // Release a pointer.
-  // The return value is the current pointer held by this object.
-  // If this object holds a NULL pointer, the return value is NULL.
-  // After this operation, this object will hold a NULL pointer,
-  // and will not own the object any more.
-  C* release() {
-    C* retVal = ptr_;
-    ptr_ = NULL;
-    return retVal;
-  }
-
-  template <typename PassAsType>
-  scoped_ptr<PassAsType> PassAs() {
-    return scoped_ptr<PassAsType>(release());
-  }
-
- private:
-  C* ptr_;
-
-  // Forbid comparison of scoped_ptr types.  If C2 != C, it totally doesn't
-  // make sense, and if C2 == C, it still doesn't make sense because you should
-  // never have the same object owned by two different scoped_ptrs.
-  template <class C2>
-  bool operator==(scoped_ptr<C2> const& p2) const;
-  template <class C2>
-  bool operator!=(scoped_ptr<C2> const& p2) const;
-};
-
-// Free functions
-template <class C>
-void swap(scoped_ptr<C>& p1, scoped_ptr<C>& p2) {
-  p1.swap(p2);
-}
-
-template <class C>
-bool operator==(C* p1, const scoped_ptr<C>& p2) {
-  return p1 == p2.get();
-}
-
-template <class C>
-bool operator!=(C* p1, const scoped_ptr<C>& p2) {
-  return p1 != p2.get();
-}
-
-// scoped_array<C> is like scoped_ptr<C>, except that the caller must allocate
-// with new [] and the destructor deletes objects with delete [].
-//
-// As with scoped_ptr<C>, a scoped_array<C> either points to an object
-// or is NULL.  A scoped_array<C> owns the object that it points to.
-// scoped_array<T> is thread-compatible, and once you index into it,
-// the returned objects have only the thread safety guarantees of T.
-//
-// Size: sizeof(scoped_array<C>) == sizeof(C*)
-template <class C>
-class scoped_array {
-  MOVE_ONLY_TYPE_FOR_CPP_03(scoped_array, RValue)
-
- public:
-  // The element type
-  typedef C element_type;
-
-  // Constructor.  Defaults to initializing with NULL.
-  // There is no way to create an uninitialized scoped_array.
-  // The input parameter must be allocated with new [].
-  explicit scoped_array(C* p = NULL) : array_(p) {}
-
-  // Constructor.  Move constructor for C++03 move emulation of this type.
-  scoped_array(RValue rvalue) : array_(rvalue.object->release()) {}
-
-  // Destructor.  If there is a C object, delete it.
-  // We don't need to test ptr_ == NULL because C++ does that for us.
-  ~scoped_array() {
-    enum { type_must_be_complete = sizeof(C) };
-    delete[] array_;
-  }
-
-  // operator=.  Move operator= for C++03 move emulation of this type.
-  scoped_array& operator=(RValue rhs) {
-    swap(*rhs.object);
-    return *this;
-  }
-
-  // Reset.  Deletes the current owned object, if any.
-  // Then takes ownership of a new object, if given.
-  // this->reset(this->get()) works.
-  void reset(C* p = NULL) {
-    if (p != array_) {
-      enum { type_must_be_complete = sizeof(C) };
-      delete[] array_;
-      array_ = p;
-    }
-  }
-
-  // Get one element of the current object.
-  // Will assert() if there is no current object, or index i is negative.
-  C& operator[](ptrdiff_t i) const {
-    assert(i >= 0);
-    assert(array_ != NULL);
-    return array_[i];
-  }
-
-  // Get a pointer to the zeroth element of the current object.
-  // If there is no current object, return NULL.
-  C* get() const { return array_; }
-
-  // Allow scoped_array<C> to be used in boolean expressions, but not
-  // implicitly convertible to a real bool (which is dangerous).
-  typedef C* scoped_array::*Testable;
-  operator Testable() const { return array_ ? &scoped_array::array_ : NULL; }
-
-  // Comparison operators.
-  // These return whether two scoped_array refer to the same object, not just to
-  // two different but equal objects.
-  bool operator==(C* p) const { return array_ == p; }
-  bool operator!=(C* p) const { return array_ != p; }
-
-  // Swap two scoped arrays.
-  void swap(scoped_array& p2) {
-    C* tmp = array_;
-    array_ = p2.array_;
-    p2.array_ = tmp;
-  }
-
-  // Release an array.
-  // The return value is the current pointer held by this object.
-  // If this object holds a NULL pointer, the return value is NULL.
-  // After this operation, this object will hold a NULL pointer,
-  // and will not own the object any more.
-  C* release() {
-    C* retVal = array_;
-    array_ = NULL;
-    return retVal;
-  }
-
- private:
-  C* array_;
-
-  // Forbid comparison of different scoped_array types.
-  template <class C2>
-  bool operator==(scoped_array<C2> const& p2) const;
-  template <class C2>
-  bool operator!=(scoped_array<C2> const& p2) const;
-};
-
-// Free functions
-template <class C>
-void swap(scoped_array<C>& p1, scoped_array<C>& p2) {
-  p1.swap(p2);
-}
-
-template <class C>
-bool operator==(C* p1, const scoped_array<C>& p2) {
-  return p1 == p2.get();
-}
-
-template <class C>
-bool operator!=(C* p1, const scoped_array<C>& p2) {
-  return p1 != p2.get();
-}
-
-// This class wraps the c library function free() in a class that can be
-// passed as a template argument to scoped_ptr_malloc below.
-class ScopedPtrMallocFree {
- public:
-  inline void operator()(void* x) const { free(x); }
-};
-
-// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a
-// second template argument, the functor used to free the object.
-
-template <class C, class FreeProc = ScopedPtrMallocFree>
-class scoped_ptr_malloc {
-  MOVE_ONLY_TYPE_FOR_CPP_03(scoped_ptr_malloc, RValue)
-
- public:
-  // The element type
-  typedef C element_type;
-
-  // Constructor.  Defaults to initializing with NULL.
-  // There is no way to create an uninitialized scoped_ptr.
-  // The input parameter must be allocated with an allocator that matches the
-  // Free functor.  For the default Free functor, this is malloc, calloc, or
-  // realloc.
-  explicit scoped_ptr_malloc(C* p = NULL) : ptr_(p) {}
-
-  // Constructor.  Move constructor for C++03 move emulation of this type.
-  scoped_ptr_malloc(RValue rvalue) : ptr_(rvalue.object->release()) {}
-
-  // Destructor.  If there is a C object, call the Free functor.
-  ~scoped_ptr_malloc() { reset(); }
-
-  // operator=.  Move operator= for C++03 move emulation of this type.
-  scoped_ptr_malloc& operator=(RValue rhs) {
-    swap(*rhs.object);
-    return *this;
-  }
-
-  // Reset.  Calls the Free functor on the current owned object, if any.
-  // Then takes ownership of a new object, if given.
-  // this->reset(this->get()) works.
-  void reset(C* p = NULL) {
-    if (ptr_ != p) {
-      FreeProc free_proc;
-      free_proc(ptr_);
-      ptr_ = p;
-    }
-  }
-
-  // Get the current object.
-  // operator* and operator-> will cause an assert() failure if there is
-  // no current object.
-  C& operator*() const {
-    assert(ptr_ != NULL);
-    return *ptr_;
-  }
-
-  C* operator->() const {
-    assert(ptr_ != NULL);
-    return ptr_;
-  }
-
-  C* get() const { return ptr_; }
-
-  // Allow scoped_ptr_malloc<C> to be used in boolean expressions, but not
-  // implicitly convertible to a real bool (which is dangerous).
-  typedef C* scoped_ptr_malloc::*Testable;
-  operator Testable() const { return ptr_ ? &scoped_ptr_malloc::ptr_ : NULL; }
-
-  // Comparison operators.
-  // These return whether a scoped_ptr_malloc and a plain pointer refer
-  // to the same object, not just to two different but equal objects.
-  // For compatibility with the boost-derived implementation, these
-  // take non-const arguments.
-  bool operator==(C* p) const { return ptr_ == p; }
-
-  bool operator!=(C* p) const { return ptr_ != p; }
-
-  // Swap two scoped pointers.
-  void swap(scoped_ptr_malloc& b) {
-    C* tmp = b.ptr_;
-    b.ptr_ = ptr_;
-    ptr_ = tmp;
-  }
-
-  // Release a pointer.
-  // The return value is the current pointer held by this object.
-  // If this object holds a NULL pointer, the return value is NULL.
-  // After this operation, this object will hold a NULL pointer,
-  // and will not own the object any more.
-  C* release() {
-    C* tmp = ptr_;
-    ptr_ = NULL;
-    return tmp;
-  }
-
- private:
-  C* ptr_;
-
-  // no reason to use these: each scoped_ptr_malloc should have its own object
-  template <class C2, class GP>
-  bool operator==(scoped_ptr_malloc<C2, GP> const& p) const;
-  template <class C2, class GP>
-  bool operator!=(scoped_ptr_malloc<C2, GP> const& p) const;
-};
-
-template <class C, class FP>
-inline void swap(scoped_ptr_malloc<C, FP>& a, scoped_ptr_malloc<C, FP>& b) {
-  a.swap(b);
-}
-
-template <class C, class FP>
-inline bool operator==(C* p, const scoped_ptr_malloc<C, FP>& b) {
-  return p == b.get();
-}
-
-template <class C, class FP>
-inline bool operator!=(C* p, const scoped_ptr_malloc<C, FP>& b) {
-  return p != b.get();
-}
-
-// A function to convert T* into scoped_ptr<T>
-// Doing e.g. make_scoped_ptr(new FooBarBaz<type>(arg)) is a shorter notation
-// for scoped_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
-template <typename T>
-scoped_ptr<T> make_scoped_ptr(T* ptr) {
-  return scoped_ptr<T>(ptr);
-}
-
-}  // namespace nb
-
-#endif  // NB_SCOPED_PTR_H_
diff --git a/nb/simple_profiler.cc b/nb/simple_profiler.cc
deleted file mode 100644
index 46e906e..0000000
--- a/nb/simple_profiler.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-/*

- * Copyright 2017 Google Inc. All Rights Reserved.

- *

- * Licensed under the Apache License, Version 2.0 (the "License");

- * you may not use this file except in compliance with the License.

- * You may obtain a copy of the License at

- *

- *     http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing, software

- * distributed under the License is distributed on an "AS IS" BASIS,

- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- * See the License for the specific language governing permissions and

- * limitations under the License.

- */

-

-#include <algorithm>

-#include <string>

-#include <vector>

-

-#include "nb/rewindable_vector.h"

-#include "nb/simple_profiler.h"

-#include "nb/thread_local_object.h"

-#include "starboard/atomic.h"

-#include "starboard/common/string.h"

-#include "starboard/once.h"

-#include "starboard/time.h"

-

-namespace nb {

-namespace {

-

-class SimpleProfilerManager {

- public:

-  struct Entry {

-    Entry() : name(nullptr), time_delta(0), indent_value(0) {}

-    Entry(const char* n, SbTimeMonotonic dt, int ind)

-        : name(n), time_delta(dt), indent_value(ind) {}

-    Entry(const Entry& e) = default;

-    const char* name;

-    SbTimeMonotonic time_delta;

-    int indent_value;

-  };

-

-  using MessageHandlerFunction = SimpleProfiler::MessageHandlerFunction;

-  using ClockFunction = SimpleProfiler::ClockFunction;

-  SimpleProfilerManager()

-      : default_enabled_(true), message_handler_(nullptr),

-        clock_function_(nullptr) {}

-

-  int BeginInstance(const char* name) {

-    Data& d = ThreadLocal();

-    if (!d.enable_flag) {

-      return -1;

-    }

-    SbTimeMonotonic now = NowTime();

-    // SbAtomicMemoryBarrier() to Keep order of operations so clock doesn't

-    // get sampled out of order.

-    SbAtomicMemoryBarrier();

-    d.profiles.emplace_back(name, now, d.instance_count);

-    ++d.instance_count;

-    return d.profiles.size() - 1;

-  }

-

-  void Output(const Entry& entry, std::stringstream* sstream) {

-    for (auto i = 0; i < entry.indent_value; ++i) {

-      (*sstream) << ' ';

-    }

-    (*sstream) << entry.name << ": " << entry.time_delta << "us\n";

-  }

-

-  void FinishInstance(int index) {

-    Data& d = ThreadLocal();

-    if (!d.enable_flag || index < 0) {

-      return;

-    }

-

-    --d.instance_count;

-    Entry& entry = d.profiles[static_cast<size_t>(index)];

-    entry.time_delta = NowTime() - entry.time_delta;

-    // SbAtomicMemoryBarrier() to Keep order of operations so clock doesn't

-    // get sampled out of order.

-    SbAtomicMemoryBarrier();

-

-    if (d.instance_count == 0) {

-      std::stringstream ss;

-      for (auto it = d.profiles.begin(); it != d.profiles.end(); ++it) {

-        Output(*it, &ss);

-      }

-      d.profiles.clear();

-      HandleMessage(ss.str());

-    }

-  }

-  bool ThreadLocalEnabled() { return ThreadLocal().enable_flag; }

-  void SetThreadLocalEnabled(bool value) {

-    Data& d = ThreadLocal();

-    d.enable_flag = value;

-    d.enable_flag_set = true;

-  }

-

-  bool IsEnabled() const {

-    const Data& d = ThreadLocal();

-    if (d.enable_flag_set) {

-      return d.enable_flag;

-    }

-    return default_enabled_;

-  }

-  void SetDefaultEnabled(bool value) { default_enabled_ = value; }

-

-  void SetMessageHandler(MessageHandlerFunction handler) {

-    message_handler_ = handler;

-  }

-

-  void SetClockFunction(ClockFunction fcn) {

-    clock_function_ = fcn;

-  }

-

-  SbTimeMonotonic NowTime() {

-    if (!clock_function_) {

-      return SbTimeGetMonotonicNow();

-    } else {

-      return clock_function_();

-    }

-  }

-

- private:

-  struct Data {

-    bool enable_flag = true;

-    bool enable_flag_set = false;

-    int instance_count = 0;

-    std::vector<Entry> profiles;

-  };

-

-  void HandleMessage(const std::string& str) {

-    if (message_handler_) {

-      message_handler_(str.c_str());

-    } else {

-      SbLogRaw(str.c_str());

-    }

-  }

-

-  Data& ThreadLocal() { return *thread_local_.GetOrCreate(); }

-  const Data& ThreadLocal() const { return *thread_local_.GetOrCreate(); }

-  mutable nb::ThreadLocalObject<Data> thread_local_;

-  bool default_enabled_;

-  MessageHandlerFunction message_handler_;

-  ClockFunction clock_function_;

-};

-

-SB_ONCE_INITIALIZE_FUNCTION(SimpleProfilerManager, GetSimpleProfilerManager);

-

-}  // namespace

-

-SimpleProfiler::EnableScope::EnableScope(bool enabled) {

-  SimpleProfilerManager* mgr = GetSimpleProfilerManager();

-  prev_enabled_ = mgr->ThreadLocalEnabled();

-  mgr->SetThreadLocalEnabled(enabled);

-}

-

-SimpleProfiler::EnableScope::~EnableScope() {

-  GetSimpleProfilerManager()->SetThreadLocalEnabled(prev_enabled_);

-}

-

-SimpleProfiler::SimpleProfiler(const char* name) {

-  momento_index_ = GetSimpleProfilerManager()->BeginInstance(name);

-}

-

-SimpleProfiler::~SimpleProfiler() {

-  GetSimpleProfilerManager()->FinishInstance(momento_index_);

-}

-

-void SimpleProfiler::SetEnabledByDefault(bool value) {

-  GetSimpleProfilerManager()->SetDefaultEnabled(value);

-}

-

-bool SimpleProfiler::IsEnabled() {

-  return GetSimpleProfilerManager()->IsEnabled();

-}

-

-void SimpleProfiler::SetLoggingFunction(MessageHandlerFunction fcn) {

-  GetSimpleProfilerManager()->SetMessageHandler(fcn);

-}

-

-void SimpleProfiler::SetClockFunction(ClockFunction fcn) {

-  GetSimpleProfilerManager()->SetClockFunction(fcn);

-}

-

-}  // namespace nb

diff --git a/nb/simple_profiler.h b/nb/simple_profiler.h
deleted file mode 100644
index 2c9e4f4..0000000
--- a/nb/simple_profiler.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*

- * Copyright 2017 Google Inc. All Rights Reserved.

- *

- * Licensed under the Apache License, Version 2.0 (the "License");

- * you may not use this file except in compliance with the License.

- * You may obtain a copy of the License at

- *

- *     http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing, software

- * distributed under the License is distributed on an "AS IS" BASIS,

- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- * See the License for the specific language governing permissions and

- * limitations under the License.

- */

-

-#ifndef NB_SIMPLE_PROFILER_H_

-#define NB_SIMPLE_PROFILER_H_

-

-#include <string>

-

-#include "starboard/time.h"

-#include "starboard/types.h"

-

-namespace nb {

-

-// SimpleProfiler is useful for development. It will allow the developer

-// to track where the CPU spends most of it's time in a call chain.

-// CPU time is tracked via thread-local-storage. When the last SimpleProfiler

-// in the thread is destroyed then a printout of the timing will be printed

-// to the output log.

-//

-// By default, SimpleProfiler will generate output whenever it's used. To

-// selectively profile a thread see class SimpleProfiler::EnableScope.

-//

-// Example:

-//  void Foo() {

-//    SimpleProfiler profile(__FUNCTION__);

-//    Bar();

-//    Baz();

-//  }

-//  void Bar() {

-//    SimpleProfiler profile(__FUNCTION__);

-//    // ... do something expensive ...

-//    Qux();

-//  }

-//  void Baz() {

-//    SimpleProfiler profile(__FUNCTION__);

-//    // ... do something cheap ...

-//  }

-//  void Qux() {

-//    SimpleProfiler profile(__FUNCTION__);

-//    // ... do something nearly free ...

-//  }

-//

-//  Outputs: "Foo: 25us\n"

-//           " Bar: 20us\n"

-//           "  Qux: 1us\n"

-//           " Baz: 4us\n"

-class SimpleProfiler {

- public:

-  explicit SimpleProfiler(const char* name);

-  ~SimpleProfiler();

-  // EnableScope can be used to enable and disable SimpleProfiler in the

-  // thread. A scoped object is used so that SimpleProfiler

-  // constructor / destructor order is maintained in relation to

-  // enabling / disabling.

-  // Example:

-  //  // Assume SimpleProfiler was globally disabled by default.

-  //  void Foo() {

-  //     SimpleProfiler::ThreadScope enable_scope(true);  // enabled in scope.

-  //     SimpleProfiler profile(__FUNCTION__);

-  //     DoWork();

-  //  }

-  class EnableScope {

-   public:

-    explicit EnableScope(bool enabled);

-    ~EnableScope();

-   private:

-    bool prev_enabled_;

-  };

-  // If SetThreadLocalEnableFlag() isn't explicitly set by the thread

-  // then this |input| value will control whether the SimpleProfiler

-  // is active or not. For best results, set this value as early as

-  // possible during program execution.

-  static void SetEnabledByDefault(bool value);

-  // Is SimpleProfiler enabled? If Get/SetThreadLocalEnableFlag() isn't

-  // set then this will return an enabled by default flag, which defaults

-  // to true.

-  static bool IsEnabled();

-  typedef void (*MessageHandlerFunction)(const char* msg);

-  // Useful for tests. Setting to nullptr will reset the behavior to

-  // default functionality.

-  static void SetLoggingFunction(MessageHandlerFunction fcn);

-  // Useful for tests. Setting to nullptr will reset the behavior to

-  // default functionality.

-  typedef SbTimeMonotonic (*ClockFunction)();

-  static void SetClockFunction(ClockFunction fcn);

- private:

-  int momento_index_;

-};

-

-}  // namespace nb

-

-#endif  // NB_SIMPLE_PROFILER_H_

diff --git a/nb/simple_profiler_test.cc b/nb/simple_profiler_test.cc
deleted file mode 100644
index f78fa32..0000000
--- a/nb/simple_profiler_test.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-/*

- * Copyright 2017 Google Inc. All Rights Reserved.

- *

- * Licensed under the Apache License, Version 2.0 (the "License");

- * you may not use this file except in compliance with the License.

- * You may obtain a copy of the License at

- *

- *     http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing, software

- * distributed under the License is distributed on an "AS IS" BASIS,

- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- * See the License for the specific language governing permissions and

- * limitations under the License.

- */

-

-#include "nb/simple_profiler.h"

-

-#include <map>

-#include <string>

-#include <vector>

-

-#include "starboard/configuration.h"

-#include "testing/gtest/include/gtest/gtest.h"

-

-namespace nb {

-class SimpleProfilerTest : public ::testing::Test {

- public:

-  SimpleProfilerTest() {}

-  void SetUp() override {

-    s_log_buffer_.clear();

-    SimpleProfiler::SetLoggingFunction(TestLogFunction);

-  }

-  void TearDown() override {

-    SimpleProfiler::SetLoggingFunction(nullptr);

-    SimpleProfiler::SetClockFunction(nullptr);

-    s_log_buffer_.clear();

-  }

-

-  std::string GetProfilerOutput() { return s_log_buffer_; }

-

- private:

-  static std::string s_log_buffer_;

-  static void TestLogFunction(const char* value) { s_log_buffer_ = value; }

-};

-std::string SimpleProfilerTest::s_log_buffer_;

-

-struct CallChain {

-  static void Foo() {

-    SimpleProfiler profile("Foo");

-    Bar();

-    Qux();

-  }

-

-  static void Bar() {

-    SimpleProfiler profile("Bar");

-    Baz();

-  }

-

-  static void Baz() { SimpleProfiler profile("Baz"); }

-  static void Qux() { SimpleProfiler profile("Qux"); }

-};

-

-TEST_F(SimpleProfilerTest, IsEnabledByDefault) {

-  EXPECT_TRUE(SimpleProfiler::IsEnabled());

-}

-

-SbTimeMonotonic NullTime() {

-  return SbTimeMonotonic(0);

-}

-// Tests the expectation that SimpleProfiler can be used in a call

-// chain and will generate the expected string.

-TEST_F(SimpleProfilerTest, CallChain) {

-  SimpleProfiler::SetClockFunction(NullTime);

-  CallChain::Foo();

-  std::string profiler_log = GetProfilerOutput();

-

-  std::string expected_output =

-      "Foo: 0us\n"

-      " Bar: 0us\n"

-      "  Baz: 0us\n"

-      " Qux: 0us\n";

-

-  EXPECT_EQ(expected_output, profiler_log) << " actual output:\n"

-                                           << profiler_log;

-}

-

-TEST_F(SimpleProfilerTest, EnableScopeDisabled) {

-  SimpleProfiler::EnableScope enable(false);

-  CallChain::Foo();

-  std::string profiler_log = GetProfilerOutput();

-  EXPECT_TRUE(profiler_log.empty());

-}

-

-}  // namespace nb

diff --git a/nb/simple_thread.cc b/nb/simple_thread.cc
deleted file mode 100644
index 94dcdae..0000000
--- a/nb/simple_thread.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*

- * Copyright 2016 Google Inc. All Rights Reserved.

- *

- * Licensed under the Apache License, Version 2.0 (the "License");

- * you may not use this file except in compliance with the License.

- * You may obtain a copy of the License at

- *

- *     http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing, software

- * distributed under the License is distributed on an "AS IS" BASIS,

- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- * See the License for the specific language governing permissions and

- * limitations under the License.

- */

-

-#include "nb/simple_thread.h"

-

-#include "starboard/common/log.h"

-#include "starboard/common/mutex.h"

-#include "starboard/thread.h"

-#include "starboard/time.h"

-#include "starboard/types.h"

-

-namespace nb {

-

-SimpleThread::SimpleThread(const std::string& name)

-    : thread_(kSbThreadInvalid), name_(name),

-      join_called_(false) {}

-

-SimpleThread::~SimpleThread() {

-  SB_DCHECK(join_called_.load()) << "Join not called on thread.";

-}

-

-void SimpleThread::Start() {

-  SbThreadEntryPoint entry_point = ThreadEntryPoint;

-

-  thread_ = SbThreadCreate(0,                    // default stack_size.

-                           kSbThreadNoPriority,  // default priority.

-                           kSbThreadNoAffinity,  // default affinity.

-                           true,                 // joinable.

-                           name_.c_str(), entry_point, this);

-

-  // SbThreadCreate() above produced an invalid thread handle.

-  SB_DCHECK(thread_ != kSbThreadInvalid);

-  return;

-}

-

-void SimpleThread::Sleep(SbTime microseconds) {

-  SbThreadSleep(microseconds);

-}

-

-void SimpleThread::SleepMilliseconds(int value) {

-  return Sleep(value * kSbTimeMillisecond);

-}

-

-void* SimpleThread::ThreadEntryPoint(void* context) {

-  SimpleThread* this_ptr = static_cast<SimpleThread*>(context);

-  this_ptr->Run();

-  return NULL;

-}

-

-void SimpleThread::Join() {

-  SB_DCHECK(join_called_.load() == false);

-  if (!SbThreadJoin(thread_, NULL)) {

-    SB_DCHECK(false) << "Could not join thread.";

-  }

-  join_called_.store(true);

-}

-

-}  // namespace nb

diff --git a/nb/simple_thread.h b/nb/simple_thread.h
deleted file mode 100644
index e4b7386..0000000
--- a/nb/simple_thread.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*

- * Copyright 2016 Google Inc. All Rights Reserved.

- *

- * Licensed under the Apache License, Version 2.0 (the "License");

- * you may not use this file except in compliance with the License.

- * You may obtain a copy of the License at

- *

- *     http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing, software

- * distributed under the License is distributed on an "AS IS" BASIS,

- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- * See the License for the specific language governing permissions and

- * limitations under the License.

- */

-

-#ifndef NB_SIMPLE_THREAD_H_

-#define NB_SIMPLE_THREAD_H_

-

-#include <string>

-

-#include "starboard/common/atomic.h"

-#include "starboard/thread.h"

-#include "starboard/time.h"

-#include "starboard/types.h"

-

-namespace nb {

-

-class SimpleThread {

- public:

-  explicit SimpleThread(const std::string& name);

-  virtual ~SimpleThread();

-

-  // Subclasses should override the Run method.

-  virtual void Run() = 0;

-

-  // Signals to the thread to break out of it's loop.

-  virtual void Cancel() {}

-

-  // Called by the main thread, this will cause Run() to be invoked

-  // on another thread.

-  void Start();

-  // Destroys the threads resources.

-  void Join();

-

-  bool join_called() const { return join_called_.load(); }

-

- protected:

-  static void Sleep(SbTime microseconds);

-  static void SleepMilliseconds(int value);

-

- private:

-  static void* ThreadEntryPoint(void* context);

-

-  const std::string name_;

-  SbThread thread_;

-  starboard::atomic_bool join_called_;

-

-  SimpleThread(const SimpleThread&) = delete;

-  void operator=(const SimpleThread&) = delete;

-};

-

-}  // namespace nb

-

-#endif  // NB_SIMPLE_THREAD_H_

diff --git a/nb/std_allocator.h b/nb/std_allocator.h
deleted file mode 100644
index f055881..0000000
--- a/nb/std_allocator.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NB_STD_ALLOCATOR_H_
-#define NB_STD_ALLOCATOR_H_
-
-#include <memory>
-
-#include "nb/allocator.h"
-#include "starboard/configuration.h"
-#include "starboard/types.h"
-
-namespace nb {
-
-// A standard container compatible allocator that delegates allocations to a
-// custom allocator. This allows standard containers like vector<> and map<> to
-// use custom allocator schemes.
-//
-// AllocatorT:
-//   This is the backing allocator that implements Allocate(...) and
-//   Deallocate(...).
-//
-// Example:
-// struct AllocatorImpl {
-//   static void* Allocate(size_t n) {
-//     return SbMemoryAllocate(n);
-//   }
-//   // Second argument can be used for accounting, but is otherwise optional.
-//   static void Deallocate(void* ptr, size_t n) {
-//     SbMemoryDeallocate(ptr);
-//   }
-// };
-//
-// typedef std::vector<int, StdAllocator<T, AllocatorImpl> > MyVector;
-// MyVector vector;
-// ...
-template <typename T, typename AllocatorT>
-class StdAllocator : public std::allocator<T> {
- public:
-  typedef typename std::allocator<T>::pointer pointer;
-  typedef typename std::allocator<T>::const_pointer const_pointer;
-  typedef typename std::allocator<T>::reference reference;
-  typedef typename std::allocator<T>::const_reference const_reference;
-  typedef typename std::allocator<T>::size_type size_type;
-  typedef typename std::allocator<T>::value_type value_type;
-  typedef typename std::allocator<T>::difference_type difference_type;
-
-  StdAllocator() {}
-
-  // Constructor used for rebinding
-  template <typename U, typename V>
-  StdAllocator(const StdAllocator<U, V>&) {}
-
-  pointer allocate(size_type n,
-                   std::allocator<void>::const_pointer hint = NULL) {
-    void* ptr = AllocatorT::Allocate(n * sizeof(value_type));
-    return static_cast<pointer>(ptr);
-  }
-
-  void deallocate(pointer ptr, size_type n) {
-    AllocatorT::Deallocate(ptr, n * sizeof(value_type));
-  }
-  template <typename U>
-  struct rebind {
-    typedef StdAllocator<U, AllocatorT> other;
-  };
-};
-
-// A standard container compatible allocator that delegates allocations to a
-// custom allocator via a shared pointer. This differs from StdAllocator since
-// StdAllocator binds to static functions. This important difference allows
-// StdDynamicAllocator to keep memory accounting on a per-instance basis, but
-// otherwise is a tad slower, harder to instantiate and produces less readable
-// code.
-//
-// When in doubt, use StdAllocator over StdDynamicAllocator.
-//
-// Passed in nb::Allocator:
-//  Even though nb::Allocator has many functions for alignment, only the two
-//  are used within StdDynamicAllocator:
-//    void* nb::Allocator::Allocate() -and-
-//    void nb::FreeWithSize(void* ptr, size_t optional_size)
-//
-// Example of Allocator Definition:
-//  class MyAllocator : public SimpleAllocator {
-//   public:
-//    void* Allocate(size_t size) override {
-//      return SbMemoryAllocate(size);
-//    }
-//
-//    // Second argument can be used for accounting, but is otherwise optional.
-//    void FreeWithSize(void* ptr, size_t optional_size) override {
-//      SbMemoryDeallocate(ptr);
-//    }
-//
-//    // ... other functions
-//  };
-//
-// Example of std::vector<int>:
-//  typedef StdDynamicAllocator<int> IntAllocator;
-//  typedef std::vector<int, IntAllocator> IntVector;
-//
-//  MyAllocator my_allocator;
-//  // Note that IntVector is not default constructible!
-//  IntVector int_vector(IntAllocator(&my_allocator));
-//
-// Example of std::map<int, int>:
-//  // Note that maps require std::less() instance to be passed in whenever
-//  // a custom allocator is passed in.
-//  typedef std::map<int, int, std::less<int>, MyAllocator> IntMap;
-//  IntMap int_map(std::less<int>(), /* std::less<int> required pre-C++11 */
-//                 IntAllocator(&my_allocator));
-template <typename T>
-class StdDynamicAllocator : public std::allocator<T> {
- public:
-  typedef typename std::allocator<T>::pointer pointer;
-  typedef typename std::allocator<T>::const_pointer const_pointer;
-  typedef typename std::allocator<T>::reference reference;
-  typedef typename std::allocator<T>::const_reference const_reference;
-  typedef typename std::allocator<T>::size_type size_type;
-  typedef typename std::allocator<T>::value_type value_type;
-  typedef typename std::allocator<T>::difference_type difference_type;
-
-  explicit StdDynamicAllocator(Allocator* allocator) : allocator_(allocator) {}
-  StdDynamicAllocator(StdDynamicAllocator& std_allocator)
-      : allocator_(std_allocator.allocator_) {}
-
-  // Constructor used for rebinding
-  template <typename U>
-  StdDynamicAllocator(const StdDynamicAllocator<U>& x)
-      : allocator_(x.allocator()) {}
-
-  pointer allocate(size_type n,
-                   std::allocator<void>::const_pointer hint = NULL) {
-    void* ptr = allocator_->Allocate(n * sizeof(value_type));
-    return static_cast<pointer>(ptr);
-  }
-
-  void deallocate(pointer ptr, size_type n) {
-    allocator_->FreeWithSize(ptr, n * sizeof(value_type));
-  }
-  template <typename U>
-  struct rebind {
-    typedef StdDynamicAllocator<U> other;
-  };
-
-  Allocator* allocator() const { return allocator_; }
-
- private:
-  Allocator* allocator_;
-};
-
-}  // namespace nb
-
-#endif  // NB_STD_ALLOCATOR_H_
diff --git a/nb/std_allocator_test.cc b/nb/std_allocator_test.cc
deleted file mode 100644
index 7065ebb..0000000
--- a/nb/std_allocator_test.cc
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/std_allocator.h"
-
-#include <map>
-#include <vector>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace nb {
-namespace {
-
-struct CountingAllocator {
-  static int num_allocs;
-  static int64_t num_bytes;
-  static void Reset() {
-    num_allocs = 0;
-    num_bytes = 0;
-  }
-
-  static void* Allocate(size_t n) {
-    ++num_allocs;
-    num_bytes += n;
-    return SbMemoryAllocate(n);
-  }
-
-  static void Deallocate(void* ptr, size_t n) {
-    num_bytes -= n;
-    --num_allocs;
-    SbMemoryDeallocate(ptr);
-  }
-};
-int CountingAllocator::num_allocs = 0;
-int64_t CountingAllocator::num_bytes = 0;
-
-// Test the expectation that vector will go through the supplied allocator.
-TEST(StdAllocator, vector) {
-  CountingAllocator::Reset();
-
-  typedef std::vector<int, StdAllocator<int, CountingAllocator> > IntVector;
-
-  EXPECT_EQ(0, CountingAllocator::num_allocs);
-  EXPECT_EQ(0, CountingAllocator::num_bytes);
-
-  IntVector* int_vector = new IntVector;
-  int_vector->push_back(0);
-
-  for (int i = 0; i < 10; ++i) {
-    int_vector->push_back(i);
-  }
-
-  // We aren't sure how much allocation is here, but we know it's more than 0.
-  EXPECT_LT(0, CountingAllocator::num_allocs);
-  EXPECT_LT(0, CountingAllocator::num_bytes);
-
-  delete int_vector;
-
-  EXPECT_EQ(0, CountingAllocator::num_allocs);
-  EXPECT_EQ(0, CountingAllocator::num_bytes);
-
-  CountingAllocator::Reset();
-}
-
-// Test the expectation that map will go through the supplied allocator.
-TEST(StdAllocator, map) {
-  CountingAllocator::Reset();
-
-  typedef typename std::map<int, int>::value_type value_type;
-
-  typedef std::map<int, int, std::less<int>,
-                  StdAllocator<value_type, CountingAllocator> > IntMap;
-
-  EXPECT_EQ(0, CountingAllocator::num_allocs);
-  EXPECT_EQ(0, CountingAllocator::num_bytes);
-
-  IntMap* int_map = new IntMap;
-  for (int i = 0; i < 10; ++i) {
-    (*int_map)[i] = i;
-  }
-
-  // We aren't sure how much allocation is here, but we know it's more than 0.
-  EXPECT_LT(0, CountingAllocator::num_allocs);
-  EXPECT_LT(0, CountingAllocator::num_bytes);
-
-  delete int_map;
-
-  EXPECT_EQ(0, CountingAllocator::num_allocs);
-  EXPECT_EQ(0, CountingAllocator::num_bytes);
-
-  CountingAllocator::Reset();
-}
-
-class CountingDynamicAllocator : public nb::Allocator {
- public:
-  CountingDynamicAllocator() : bytes_allocated_(0), num_allocations_(0) {}
-  void* Allocate(size_t size) override {
-    bytes_allocated_ += size;
-    ++num_allocations_;
-    return SbMemoryAllocate(size);
-  }
-
-  void* Allocate(std::size_t size, std::size_t alignment) override {
-    EXPECT_TRUE(false) << "Unexpected that aligned version is called.";
-    return Allocate(size);
-  }
-
-  void Free(void* memory) override {
-    FreeWithSize(memory, 0);
-    ASSERT_TRUE(false) << "Unexpected that free without size "
-                          "version is called.";
-  }
-
-  void FreeWithSize(void* ptr, size_t optional_size) override {
-    SbMemoryDeallocate(ptr);
-
-    bytes_allocated_ -= optional_size;
-    --num_allocations_;
-  }
-
-  std::size_t GetCapacity() const override {
-    EXPECT_TRUE(false) << "Unexpected that GetCapacity().";
-    return 0;
-  }
-
-  std::size_t GetAllocated() const override {
-    return static_cast<size_t>(bytes_allocated_);
-  }
-
-  void PrintAllocations() const override {}
-
-  int64_t bytes_allocated_;
-  int64_t num_allocations_;
-};
-
-// Test the expectation that vector will go through the supplied allocator.
-TEST(StdDynamicAllocator, vector) {
-  typedef StdDynamicAllocator<int> IntAllocator;
-  typedef std::vector<int, IntAllocator> IntVector;
-
-  CountingDynamicAllocator counting_allocator;
-
-  EXPECT_EQ(0, counting_allocator.bytes_allocated_);
-  EXPECT_EQ(0, counting_allocator.num_allocations_);
-
-  IntVector* int_vector = new IntVector(IntAllocator(&counting_allocator));
-  int_vector->push_back(0);
-
-  for (int i = 0; i < 10; ++i) {
-    int_vector->push_back(i);
-  }
-
-  // We aren't sure how much allocation is here, but we know it's more than 0.
-  EXPECT_LT(0, counting_allocator.bytes_allocated_);
-  EXPECT_LT(0, counting_allocator.num_allocations_);
-
-  delete int_vector;
-
-  // Expect that all allocations are destroyed now.
-  EXPECT_EQ(0, counting_allocator.bytes_allocated_);
-  EXPECT_EQ(0, counting_allocator.num_allocations_);
-}
-
-// Test the expectation that vector will go through the supplied allocator.
-TEST(StdDynamicAllocator, map) {
-  typedef typename std::map<int, int>::value_type value_type;
-  typedef StdDynamicAllocator<value_type> IntAllocator;
-  typedef std::map<int, int, std::less<int>, IntAllocator> IntMap;
-
-  CountingDynamicAllocator counting_allocator;
-
-  EXPECT_EQ(0, counting_allocator.bytes_allocated_);
-  EXPECT_EQ(0, counting_allocator.num_allocations_);
-
-  IntMap* int_map = new IntMap(std::less<int>(),  // required.
-                               IntAllocator(&counting_allocator));
-  for (int i = 0; i < 10; ++i) {
-    (*int_map)[i] = i;
-  }
-
-  // We aren't sure how much allocation is here, but we know it's more than 0.
-  EXPECT_LT(0, counting_allocator.bytes_allocated_);
-  EXPECT_LT(0, counting_allocator.num_allocations_);
-
-  delete int_map;
-
-  // Expect that all allocations are destroyed now.
-  EXPECT_EQ(0, counting_allocator.bytes_allocated_);
-  EXPECT_EQ(0, counting_allocator.num_allocations_);
-}
-
-// Test the expectation that a copied vector will go through the allocator from
-// the first vector.
-TEST(StdDynamicAllocator, vector_copy) {
-  typedef StdDynamicAllocator<int> IntAllocator;
-  typedef std::vector<int, IntAllocator> IntVector;
-
-  CountingDynamicAllocator counting_allocator;
-
-  EXPECT_EQ(0, counting_allocator.bytes_allocated_);
-  EXPECT_EQ(0, counting_allocator.num_allocations_);
-
-  IntVector* int_vector = new IntVector(IntAllocator(&counting_allocator));
-  int_vector->push_back(0);
-
-  for (int i = 0; i < 10; ++i) {
-    int_vector->push_back(i);
-  }
-
-  // We aren't sure how much allocation is here, but we know it's more than 0.
-  EXPECT_LT(0, counting_allocator.bytes_allocated_);
-  EXPECT_LT(0, counting_allocator.num_allocations_);
-
-  int64_t saved_bytes_allocated = counting_allocator.bytes_allocated_;
-  int64_t saved_num_allocations = counting_allocator.num_allocations_;
-
-  IntVector* int_vector_copy = new IntVector(*int_vector);
-  for (int i = 0; i < 10; ++i) {
-    int_vector_copy->push_back(i);
-  }
-
-  EXPECT_LT(saved_bytes_allocated, counting_allocator.bytes_allocated_);
-  EXPECT_LT(saved_num_allocations, counting_allocator.num_allocations_);
-
-  delete int_vector_copy;
-  delete int_vector;
-
-  // Expect that all allocations are destroyed now.
-  EXPECT_EQ(0, counting_allocator.bytes_allocated_);
-  EXPECT_EQ(0, counting_allocator.num_allocations_);
-}
-
-// Test the expectation that vector will go through the supplied allocator.
-TEST(StdDynamicAllocator, map_copy) {
-  typedef typename std::map<int, int>::value_type value_type;
-  typedef StdDynamicAllocator<value_type> IntAllocator;
-  typedef std::map<int, int, std::less<int>, IntAllocator> IntMap;
-
-  CountingDynamicAllocator counting_allocator;
-
-  EXPECT_EQ(0, counting_allocator.bytes_allocated_);
-  EXPECT_EQ(0, counting_allocator.num_allocations_);
-
-  IntMap* int_map = new IntMap(std::less<int>(),  // required.
-                               IntAllocator(&counting_allocator));
-  for (int i = 0; i < 10; ++i) {
-    (*int_map)[i] = i;
-  }
-
-  int64_t saved_bytes_allocated = counting_allocator.bytes_allocated_;
-  int64_t saved_num_allocations = counting_allocator.num_allocations_;
-
-  IntMap* int_map_copy = new IntMap(*int_map);
-
-  for (int i = 0; i < 10; ++i) {
-    (*int_map_copy)[i] = i;
-  }
-
-  EXPECT_LT(saved_bytes_allocated, counting_allocator.bytes_allocated_);
-  EXPECT_LT(saved_num_allocations, counting_allocator.num_allocations_);
-
-  delete int_map_copy;
-  delete int_map;
-
-  // Expect that all allocations are destroyed now.
-  EXPECT_EQ(0, counting_allocator.bytes_allocated_);
-  EXPECT_EQ(0, counting_allocator.num_allocations_);
-}
-
-}  // namespace
-}  // namespace nb
diff --git a/nb/string_interner.cc b/nb/string_interner.cc
deleted file mode 100644
index 279d1b1..0000000
--- a/nb/string_interner.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "nb/hash.h"
-#include "nb/string_interner.h"
-#include "starboard/client_porting/poem/string_poem.h"
-#include "starboard/common/string.h"
-
-namespace nb {
-
-StringInterner::StringInterner() {
-}
-
-StringInterner::~StringInterner() {
-}
-
-const std::string& StringInterner::Intern(const std::string& str) {
-  starboard::ScopedLock lock(mutex_);
-  return Intern_Locked(str);
-}
-
-const std::string& StringInterner::Intern(const char* c_string) {
-  starboard::ScopedLock lock(mutex_);
-  scratch_.assign(c_string);  // Good at recycling memory.
-  return Intern_Locked(scratch_);
-}
-
-const std::string* StringInterner::Get(const std::string& str) const {
-  starboard::ScopedLock lock(mutex_);
-  return Get_Locked(str);
-}
-
-const std::string* StringInterner::Get(const char* c_string) const {
-  starboard::ScopedLock lock(mutex_);
-  scratch_.assign(c_string);  // Good at recycling memory.
-  return Get_Locked(scratch_);
-}
-
-const std::string* StringInterner::Get_Locked(const std::string& str) const {
-  std::set<std::string>::const_iterator it = string_set_.find(str);
-  if (it == string_set_.end()) {
-    return NULL;
-  } else {
-    const std::string& out = *it;
-    return &out;
-  }
-}
-
-size_t StringInterner::Size() const {
-  starboard::ScopedLock lock(mutex_);
-  return string_set_.size();
-}
-
-const std::string& StringInterner::Intern_Locked(const std::string& str) {
-  std::set<std::string>::const_iterator it = string_set_.insert(str).first;
-  const std::string& out = (*it);
-  // Safe because std::set does not invalidate iterators on insert or when
-  // erasing other iterators.
-  return out;
-}
-
-ConcurrentStringInterner::ConcurrentStringInterner(size_t table_size) {
-  Construct(table_size);
-}
-
-void ConcurrentStringInterner::Construct(size_t table_size) {
-  if (table_size == 0) {
-    table_size = 1;
-  }
-  string_interner_table_.reserve(table_size);
-  for (size_t i = 0; i < table_size; ++i) {
-    string_interner_table_.push_back(new StringInterner);
-  }
-}
-
-ConcurrentStringInterner::~ConcurrentStringInterner() {
-  for (size_t i = 0; i < string_interner_table_.size(); ++i) {
-    delete string_interner_table_[i];
-  }
-}
-
-const std::string& ConcurrentStringInterner::Intern(const std::string& str) {
-  return GetBucket(str.c_str(), str.size()).Intern(str);
-}
-
-const std::string& ConcurrentStringInterner::Intern(const char* c_string) {
-  return GetBucket(c_string, strlen(c_string)).Intern(c_string);
-}
-
-const std::string* ConcurrentStringInterner::Get(const std::string& str) const {
-  return GetBucket(str.c_str(), str.size()).Get(str);
-}
-
-const std::string* ConcurrentStringInterner::Get(const char* c_string) const {
-  return GetBucket(c_string, strlen(c_string)).Get(c_string);
-}
-
-size_t ConcurrentStringInterner::Size() const {
-  size_t sum = 0;
-  for (size_t i = 0; i < string_interner_table_.size(); ++i) {
-    sum += string_interner_table_[i]->Size();
-  }
-  return sum;
-}
-
-nb::StringInterner&
-ConcurrentStringInterner::GetBucket(const char* string, size_t n) {
-  uint32_t hash_value = nb::RuntimeHash32(string, static_cast<int>(n));
-  size_t index =
-    static_cast<size_t>(hash_value % string_interner_table_.size());
-  return *string_interner_table_[index];
-}
-
-const nb::StringInterner&
-ConcurrentStringInterner::GetBucket(const char* string, size_t n) const {
-  uint32_t hash_value = nb::RuntimeHash32(string, static_cast<int>(n));
-  size_t index =
-    static_cast<size_t>(hash_value % string_interner_table_.size());
-  return *string_interner_table_[index];
-}
-
- }  // namespace nb
diff --git a/nb/string_interner.h b/nb/string_interner.h
deleted file mode 100644
index f842449..0000000
--- a/nb/string_interner.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NB_STRING_INTERNER_H_
-#define NB_STRING_INTERNER_H_
-
-#include <set>
-#include <string>
-#include <vector>
-
-#include "starboard/common/mutex.h"
-#include "starboard/configuration.h"
-#include "starboard/types.h"
-
-namespace nb {
-
-// Takes a String and "interns" it, so that there is only one copy. Care is
-// taken to prevent memory allocation whenever possible. Intern() will only
-// allocate memory if the element is not found, otherwise it's expected to be
-// memory allocation free.
-//
-// A common use case is to never call Clear() or destroy the StringIntern,
-// since that will invalidate all std::string* that have been returned.
-//
-// Example:
-//   StringInterner str_interner;
-//   std::string a = "A";
-//   std::string a_copy = "A";
-//
-//   EXPECT_EQ(str_interner.Intern(a),
-//             str_interner.Intern(a_copy));
-//
-class StringInterner {
- public:
-  StringInterner();
-  ~StringInterner();  // All outstanding const std::string* are invalidated.
-  // Returns an equivalent string to the input. If the input is missing from
-  // the data store then a copy-by-value is made.
-  const std::string& Intern(const std::string& str);
-  const std::string& Intern(const char* c_string);
-
-  // Returns the string object if it exists, otherwise NULL.
-  const std::string* Get(const std::string& str) const;
-  const std::string* Get(const char* c_string) const;
-
-  size_t Size() const;
-
- private:
-  const std::string& Intern_Locked(const std::string& str);
-  const std::string* Get_Locked(const std::string& str) const;
-  std::set<std::string> string_set_;
-  mutable starboard::Mutex mutex_;
-  mutable std::string scratch_;
-
-  StringInterner(const StringInterner&) = delete;
-  void operator=(const StringInterner&) = delete;
-};
-
-class ConcurrentStringInterner {
- public:
-  explicit ConcurrentStringInterner(size_t table_size = 32);
-  ~ConcurrentStringInterner();  // All outstanding const std::string* are
-                                // invalidated.
-
-  // Returns an equivalent string to the input. If the input is missing from
-  // the data store then a copy-by-value is made.
-  const std::string& Intern(const std::string& str);
-  const std::string& Intern(const char* c_string);
-
-  // Returns the string object if it exists, otherwise NULL.
-  const std::string* Get(const std::string& str) const;
-  const std::string* Get(const char* c_string) const;
-
-  size_t Size() const;
-
- private:
-  void Construct(size_t table_size);
-  StringInterner& GetBucket(const char* string, size_t n);
-  const StringInterner& GetBucket(const char* string, size_t n) const;
-  std::vector<StringInterner*> string_interner_table_;
-
-  ConcurrentStringInterner(const ConcurrentStringInterner&) = delete;
-  void operator=(const ConcurrentStringInterner&) = delete;
-};
-
-}  // namespace nb
-
-#endif  // NB_STRING_INTERNER_H_
diff --git a/nb/string_interner_test.cc b/nb/string_interner_test.cc
deleted file mode 100644
index cb296a8..0000000
--- a/nb/string_interner_test.cc
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <cstring>
-#include <string>
-
-#include "nb/string_interner.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace nb {
-namespace {
-
-typedef ::testing::Types<StringInterner, ConcurrentStringInterner>
-    StringInternerTypes;
-
-// Defines test type that will be instantiated using each type in
-// AllAtomicTypes type list.
-template <typename T>
-class StringInternerTest : public ::testing::Test {};
-TYPED_TEST_CASE(StringInternerTest, StringInternerTypes);  // Registration.
-
-std::string GenerateRandomString(size_t size) {
-  static const char valid_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                                    "abcdefghijklmnopqrstuvwxyz";
-  static const size_t n = strlen(valid_chars);
-
-  std::stringstream ss;
-  for (size_t i = 0; i < size; ++i) {
-    size_t random_char_index = std::rand() % n;
-    ss << valid_chars[random_char_index];
-  }
-  return ss.str();
-}
-
-TYPED_TEST(StringInternerTest, Intern) {
-  typedef TypeParam StringInternerT;
-  StringInternerT string_interner;
-  EXPECT_FALSE(string_interner.Get("A"));
-  EXPECT_EQ(&string_interner.Intern("A"), &string_interner.Intern("A"));
-  EXPECT_TRUE(string_interner.Get("A"));
-
-  EXPECT_NE(&string_interner.Intern("A"), &string_interner.Intern("B"));
-  EXPECT_EQ(2, string_interner.Size());
-}
-
-TYPED_TEST(StringInternerTest, InternStdString) {
-  typedef TypeParam StringInternerT;
-  StringInternerT string_interner;
-  std::string a = "A";
-  std::string a_copy = "A";
-  std::string b = "B";
-
-  EXPECT_FALSE(string_interner.Get(a));
-  EXPECT_EQ(&string_interner.Intern(a), &string_interner.Intern(a_copy));
-  EXPECT_TRUE(string_interner.Get(a));
-
-  EXPECT_NE(&string_interner.Intern(a), &string_interner.Intern(b));
-  EXPECT_EQ(2, string_interner.Size());
-}
-
-TYPED_TEST(StringInternerTest, InternBothStrings) {
-  typedef TypeParam StringInternerT;
-  StringInternerT string_interner;
-
-  std::string a_stdstring = "A";
-  const char* c_string = "A";
-
-  const std::string* a_pointer = &string_interner.Intern("A");
-  EXPECT_EQ(a_pointer, &string_interner.Intern(c_string));
-  EXPECT_EQ(a_pointer, &string_interner.Intern(a_stdstring));
-}
-
-// Tests the expectation that a set of unique strings can all be inserted
-// into the (Concurrent)StringInterner.
-TYPED_TEST(StringInternerTest, LoadLotsOfUniqueStrings) {
-  typedef TypeParam StringInternerT;
-  StringInternerT string_interner;
-
-  static const size_t kNumStringsToLoad = 1000;
-
-  std::set<std::string> all_unique_strings;
-
-  // Keep generating random strings until we have a full set of unique strings.
-  while (all_unique_strings.size() < kNumStringsToLoad) {
-    all_unique_strings.insert(GenerateRandomString(25));
-  }
-
-  for (std::set<std::string>::const_iterator it = all_unique_strings.begin();
-       it != all_unique_strings.end(); ++it) {
-    const std::string& str = *it;
-    ASSERT_FALSE(string_interner.Get(str));
-    ASSERT_FALSE(string_interner.Get(str.c_str()));  // c-string version.
-
-    string_interner.Intern(str);
-
-    ASSERT_TRUE(string_interner.Get(str));
-    ASSERT_TRUE(string_interner.Get(str.c_str()));  // c-string version.
-  }
-
-  ASSERT_EQ(string_interner.Size(), all_unique_strings.size());
-}
-
-}  // namespace
-}  // namespace nb
diff --git a/nb/test_thread.h b/nb/test_thread.h
deleted file mode 100644
index 4f2da5d..0000000
--- a/nb/test_thread.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef NB_TEST_THREAD_H_
-#define NB_TEST_THREAD_H_
-
-#include "starboard/configuration.h"
-#include "starboard/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace nb {
-
-// TestThread that is a bare bones class wrapper around Starboard
-// thread. Subclasses must override Run().
-class TestThread {
- public:
-  TestThread() : thread_(kSbThreadInvalid) {}
-  virtual ~TestThread() {}
-
-  // Subclasses should override the Run method.
-  virtual void Run() = 0;
-
-  // Calls SbThreadCreate() with default parameters.
-  void Start() {
-    SbThreadEntryPoint entry_point = ThreadEntryPoint;
-
-    thread_ = SbThreadCreate(0,                    // default stack_size.
-                             kSbThreadNoPriority,  // default priority.
-                             kSbThreadNoAffinity,  // default affinity.
-                             true,                 // joinable.
-                             "TestThread", entry_point, this);
-
-    if (kSbThreadInvalid == thread_) {
-      ADD_FAILURE_AT(__FILE__, __LINE__) << "Invalid thread.";
-    }
-    return;
-  }
-
-  void Join() {
-    if (!SbThreadJoin(thread_, NULL)) {
-      ADD_FAILURE_AT(__FILE__, __LINE__) << "Could not join thread.";
-    }
-  }
-
- private:
-  static void* ThreadEntryPoint(void* ptr) {
-    TestThread* this_ptr = static_cast<TestThread*>(ptr);
-    this_ptr->Run();
-    return NULL;
-  }
-
-  SbThread thread_;
-
-  TestThread(const TestThread&) = delete;
-  void operator=(const TestThread&) = delete;
-};
-
-}  // namespace nb.
-
-#endif  // NB_TEST_THREAD_H_
diff --git a/nb/thread_collision_warner.cc b/nb/thread_collision_warner.cc
deleted file mode 100644
index f70654c..0000000
--- a/nb/thread_collision_warner.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "nb/thread_collision_warner.h"
-
-#include "starboard/atomic.h"
-#include "starboard/common/log.h"
-#include "starboard/thread.h"
-#include "starboard/types.h"
-
-namespace nb {
-
-void DCheckAsserter::warn() {
-  SB_NOTREACHED() << "Thread Collision";
-}
-
-static SbAtomic32 CurrentThread() {
-  const SbThreadId current_thread_id = SbThreadGetId();
-  // We need to get the thread id into an atomic data type. This might be a
-  // truncating conversion, but any loss-of-information just increases the
-  // chance of a false negative, not a false positive.
-  const SbAtomic32 atomic_thread_id =
-      static_cast<SbAtomic32>(current_thread_id);
-  return atomic_thread_id;
-}
-
-void ThreadCollisionWarner::EnterSelf() {
-  // If the active thread is 0 then I'll write the current thread ID
-  // if two or more threads arrive here only one will succeed to
-  // write on valid_thread_id_ the current thread ID.
-  SbAtomic32 current_thread_id = CurrentThread();
-
-  int previous_value =
-      SbAtomicNoBarrier_CompareAndSwap(&valid_thread_id_, 0, current_thread_id);
-  if (previous_value != 0 && previous_value != current_thread_id) {
-    // gotcha! a thread is trying to use the same class and that is
-    // not current thread.
-    asserter_->warn();
-  }
-
-  SbAtomicNoBarrier_Increment(&counter_, 1);
-}
-
-void ThreadCollisionWarner::Enter() {
-  SbAtomic32 current_thread_id = CurrentThread();
-
-  if (SbAtomicNoBarrier_CompareAndSwap(&valid_thread_id_, 0,
-                                       current_thread_id) != 0) {
-    // gotcha! another thread is trying to use the same class.
-    asserter_->warn();
-  }
-
-  SbAtomicNoBarrier_Increment(&counter_, 1);
-}
-
-void ThreadCollisionWarner::Leave() {
-  if (SbAtomicBarrier_Increment(&counter_, -1) == 0) {
-    SbAtomicNoBarrier_Store(&valid_thread_id_, 0);
-  }
-}
-
-}  // namespace nb
diff --git a/nb/thread_local_boolean.h b/nb/thread_local_boolean.h
deleted file mode 100644
index c27baf6..0000000
--- a/nb/thread_local_boolean.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NB_THREAD_LOCAL_BOOLEAN_H_
-#define NB_THREAD_LOCAL_BOOLEAN_H_
-
-#include "nb/thread_local_pointer.h"
-
-namespace nb {
-
-class ThreadLocalBoolean {
- public:
-  ThreadLocalBoolean() : default_value_(false) {}
-  explicit ThreadLocalBoolean(bool default_value)
-      : default_value_(default_value) {}
-  ~ThreadLocalBoolean() {}
-
-  bool Get() const {
-    bool val = tlp_.Get() != NULL;
-    return val ^ default_value_;
-  }
-
-  void Set(bool val) {
-    val = val ^ default_value_;
-    tlp_.Set(val ? TruePointer() : FalsePointer());
-  }
-
- private:
-  static void* TruePointer() { return reinterpret_cast<void*>(0x1); }
-  static void* FalsePointer() { return NULL; }
-  ThreadLocalPointer<void> tlp_;
-  const bool default_value_;
-
-  ThreadLocalBoolean(const ThreadLocalBoolean&) = delete;
-  void operator=(const ThreadLocalBoolean&) = delete;
-};
-
-}  // namespace nb.
-
-#endif  // NB_THREAD_LOCAL_POINTER_H_
diff --git a/nb/thread_local_object.h b/nb/thread_local_object.h
deleted file mode 100644
index 741227f..0000000
--- a/nb/thread_local_object.h
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NB_THREAD_LOCAL_OBJECT_H_
-#define NB_THREAD_LOCAL_OBJECT_H_
-
-#include <set>
-
-#include "starboard/common/log.h"
-#include "starboard/common/mutex.h"
-#include "starboard/configuration.h"
-#include "starboard/thread.h"
-
-namespace nb {
-
-// Like base::ThreadLocalPointer<T> but destroys objects. This is important
-// for using ThreadLocalObjects that aren't tied to a singleton, or for
-// access by threads which will call join().
-//
-// FEATURE COMPARISON TABLE:
-//                         |  Thread Join       | Container Destroyed
-//   ------------------------------------------------------------------
-//   ThreadLocalPointer<T> | LEAKS              | LEAKS
-//   ThreadLocalObject<T>  | Object Destroyed   | Objects Destroyed
-//
-// EXAMPLE:
-//  ThreadLocalObject<std::map<std::string, int> > map_tls;
-//  Map* map = map_tls->GetOrCreate();
-//  (*map)["my string"] = 15;
-//  Thread t = new Thread(&map_tls);
-//  t->start();
-//  // t creates it's own thread local map.
-//  t->join();  // Make sure that thread joins before map_tls is destroyed!
-//
-// OBJECT DESTRUCTION:
-//   There are two ways for an object to be destroyed by the ThreadLocalObject.
-//   The first way is via a thread join. In this case only the object
-//   associated with the thread is deleted.
-//   The second way an object is destroyed is by the ThreadLocalObject
-//   container to be destroyed, in this case ALL thread local objects are
-//   destroyed.
-//
-// PERFORMANCE:
-//   ThreadLocalObject is fast for the Get() function if the object has
-//   has already been created, requiring one extra pointer dereference
-//   over ThreadLocalPointer<T>.
-template <typename Type>
-class ThreadLocalObject {
- public:
-  ThreadLocalObject() : slot_() {
-    slot_ = SbThreadCreateLocalKey(DeleteEntry);
-    SB_DCHECK(kSbThreadLocalKeyInvalid != slot_);
-    constructing_thread_id_ = SbThreadGetId();
-  }
-
-  // Enables destruction by any other thread. Otherwise, the class instance
-  // will warn when a different thread than the constructing destroys this.
-  void EnableDestructionByAnyThread() {
-    constructing_thread_id_ = kSbThreadInvalidId;
-  }
-
-  // Thread Local Objects are destroyed after this call.
-  ~ThreadLocalObject() {
-    CheckCurrentThreadAllowedToDestruct();
-    if (SB_DLOG_IS_ON(FATAL)) {
-      SB_DCHECK(entry_set_.size() < 2)
-          << "Logic error: Some threads may still be accessing the objects "
-          << "that are about to be destroyed. Only one object is expected "
-          << "and that should be for the main thread. The caller should "
-          << "ensure that other threads that access this object are"
-          << " externally synchronized.";
-    }
-    // No locking is done because the entries should not be accessed by
-    // different threads while this object is shutting down. If access is
-    // occuring then the caller has a race condition, external to this class.
-    typedef typename Set::iterator Iter;
-    for (Iter it = entry_set_.begin(); it != entry_set_.end(); ++it) {
-      Entry* entry = *it;
-      SB_DCHECK(entry->owner_ == this);
-      delete entry->ptr_;
-      delete entry;
-    }
-
-    // Cleanup the thread local key.
-    SbThreadDestroyLocalKey(slot_);
-  }
-
-  // Warns if there is a misuse of this object.
-  void CheckCurrentThreadAllowedToDestruct() const {
-    if (kSbThreadInvalidId == constructing_thread_id_) {
-      return;  // EnableDestructionByAnyThread() called.
-    }
-    const SbThreadId curr_thread_id = SbThreadGetId();
-    if (curr_thread_id == constructing_thread_id_) {
-      return;  // Same thread that constructed this.
-    }
-
-    if (SB_DLOG_IS_ON(FATAL)) {
-      SB_DCHECK(false) << "ThreadLocalObject<T> was created in thread "
-                       << constructing_thread_id_ << "\nbut was destroyed by "
-                       << curr_thread_id
-                       << ". If this is intentional then call "
-                       << "EnableDestructionByAnyThread() to silence this "
-                       << "warning.";
-    }
-  }
-
-  // Either returns the created pointer for the current thread, or otherwise
-  // constructs the object using the default constructor and returns it.
-  Type* GetOrCreate() {
-    Type* object = GetIfExists();
-    if (!object) {  // create object.
-      object = new Type();
-      Entry* entry = new Entry(this, object);
-      // Insert into the set of tls entries.
-      // Performance: Its assumed that creation of objects is much less
-      // frequent than getting an object.
-      {
-        starboard::ScopedLock lock(entry_set_mutex_);
-        entry_set_.insert(entry);
-      }
-      SbThreadSetLocalValue(slot_, entry);
-    }
-    return object;
-  }
-
-  template <typename ConstructorArg>
-  Type* GetOrCreate(const ConstructorArg& arg) {
-    Type* object = GetIfExists();
-    if (!object) {  // create object.
-      object = new Type(arg);
-      Entry* entry = new Entry(this, object);
-      // Insert into the set of tls entries.
-      // Performance: Its assumed that creation of objects is much less
-      // frequent than getting an object.
-      {
-        starboard::ScopedLock lock(entry_set_mutex_);
-        entry_set_.insert(entry);
-      }
-      SbThreadSetLocalValue(slot_, entry);
-    }
-    return object;
-  }
-
-  // Returns the pointer if it exists in the current thread, otherwise NULL.
-  Type* GetIfExists() const {
-    Entry* entry = GetEntryIfExists();
-    if (!entry) {
-      return NULL;
-    }
-    return entry->ptr_;
-  }
-
-  // Releases ownership of the pointer FROM THE CURRENT THREAD.
-  // The caller has responsibility to make sure that the pointer is destroyed.
-  Type* Release() {
-    if (Entry* entry = GetEntryIfExists()) {
-      // The entry will no longer run it's destructor on thread join.
-      SbThreadSetLocalValue(slot_, NULL);  // NULL out pointer for TLS.
-      Type* object = entry->ptr_;
-      RemoveEntry(entry);
-      return object;
-    } else {
-      return NULL;
-    }
-  }
-
- private:
-  struct Entry {
-    Entry(ThreadLocalObject* own, Type* ptr) : owner_(own), ptr_(ptr) {}
-    ~Entry() {
-      ptr_ = NULL;
-      owner_ = NULL;
-    }
-    ThreadLocalObject* owner_;
-    Type* ptr_;
-  };
-
-  // Deletes the TLSEntry.
-  static void DeleteEntry(void* ptr) {
-    if (!ptr) {
-      SB_NOTREACHED();
-      return;
-    }
-    Entry* entry = reinterpret_cast<Entry*>(ptr);
-    ThreadLocalObject* tls = entry->owner_;
-    Type* object = entry->ptr_;
-    if (tls) {
-      tls->RemoveEntry(entry);
-    }
-    delete object;
-  }
-
-  void RemoveEntry(Entry* entry) {
-    {
-      starboard::ScopedLock lock(entry_set_mutex_);
-      entry_set_.erase(entry);
-    }
-    delete entry;
-  }
-
-  Entry* GetEntryIfExists() const {
-    void* ptr = SbThreadGetLocalValue(slot_);
-    Entry* entry = static_cast<Entry*>(ptr);
-    return entry;
-  }
-
-  typedef std::set<Entry*> Set;
-  // Allows GetIfExists() to be const.
-  mutable SbThreadLocalKey slot_;
-  // entry_set_ contains all the outstanding entries for the thread local
-  // objects that have been created.
-  Set entry_set_;
-  mutable starboard::Mutex entry_set_mutex_;
-  // Used to warn when there is a mismatch between thread that constructed and
-  // thread that destroyed this object.
-  SbThreadId constructing_thread_id_;
-
-  ThreadLocalObject<Type>(const ThreadLocalObject<Type>&) = delete;
-  void operator=(const ThreadLocalObject<Type>&) = delete;
-};
-
-}  // namespace nb
-
-#endif  // NB_THREAD_LOCAL_OBJECT_H_
diff --git a/nb/thread_local_object_test.cc b/nb/thread_local_object_test.cc
deleted file mode 100644
index 7b214d1..0000000
--- a/nb/thread_local_object_test.cc
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include <map>
-#include <string>
-
-#include "nb/scoped_ptr.h"
-#include "nb/test_thread.h"
-#include "nb/thread_local_object.h"
-#include "starboard/common/atomic.h"
-#include "starboard/common/mutex.h"
-#include "starboard/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace nb {
-namespace {
-
-// Simple class that counts the number of instances alive.
-struct CountsInstances {
-  CountsInstances() { s_instances_.increment(); }
-  ~CountsInstances() { s_instances_.decrement(); }
-  static starboard::atomic_int32_t s_instances_;
-  static int NumInstances() { return s_instances_.load(); }
-  static void ResetNumInstances() { s_instances_.exchange(0); }
-};
-starboard::atomic_int32_t CountsInstances::s_instances_(0);
-
-// A simple thread that just creates the an object from the supplied
-// ThreadLocalObject<T> and then exits.
-template <typename TYPE>
-class CreateThreadLocalObjectThenExit : public TestThread {
- public:
-  explicit CreateThreadLocalObjectThenExit(ThreadLocalObject<TYPE>* tlo)
-      : tlo_(tlo) {}
-
-  virtual void Run() {
-    // volatile as a defensive measure to prevent compiler from optimizing this
-    // statement out.
-    volatile TYPE* val = tlo_->GetOrCreate();
-  }
-  ThreadLocalObject<TYPE>* tlo_;
-};
-
-// A simple thread that just deletes the object supplied on a thread and then
-// exists.
-template <typename TYPE>
-class DestroyTypeOnThread : public TestThread {
- public:
-  explicit DestroyTypeOnThread(TYPE* ptr) : ptr_(ptr) {}
-  virtual void Run() {
-    ptr_.reset(NULL);  // Destroys the object.
-  }
-
- private:
-  nb::scoped_ptr<TYPE> ptr_;
-};
-
-// A simple struct that wraps an integer, and cannot be default constructed.
-struct IntegerWrapper {
-  explicit IntegerWrapper(int value) : value(value) {}
-  int value;
-};
-
-// Tests the expectation that a ThreadLocalObject can be simply used by
-// the main thread.
-TEST(ThreadLocalObject, MainThread) {
-  ThreadLocalObject<bool> tlo_bool;
-  EXPECT_TRUE(NULL == tlo_bool.GetIfExists());
-  bool* the_bool = tlo_bool.GetOrCreate();
-  EXPECT_TRUE(the_bool != NULL);
-  EXPECT_FALSE(*the_bool);
-  *the_bool = true;
-  EXPECT_TRUE(*(tlo_bool.GetIfExists()));
-}
-
-// The same as |MainThread|, except with |tlo_bool| initialized to |true|
-// rather than |false|, via passing |true| to |GetOrCreate|.
-TEST(ThreadLocalObject, MainThreadWithArg) {
-  ThreadLocalObject<bool> tlo_bool;
-  EXPECT_TRUE(NULL == tlo_bool.GetIfExists());
-  bool* the_bool = tlo_bool.GetOrCreate(true);
-  EXPECT_TRUE(the_bool != NULL);
-  EXPECT_TRUE(*the_bool);
-  *the_bool = false;
-  EXPECT_FALSE(*(tlo_bool.GetIfExists()));
-}
-
-// Tests the expectation that a ThreadLocalObject can be used on
-// complex objects type (i.e. non pod types).
-TEST(ThreadLocalObject, MainThreadComplexObject) {
-  typedef std::map<std::string, int> Map;
-  ThreadLocalObject<Map> map_tlo;
-  EXPECT_FALSE(map_tlo.GetIfExists());
-  ASSERT_TRUE(map_tlo.GetOrCreate());
-  Map* map = map_tlo.GetIfExists();
-  const Map* const_map = map_tlo.GetIfExists();
-  ASSERT_TRUE(map);
-  ASSERT_TRUE(const_map);
-  // If the object is properly constructed then this find operation
-  // should succeed.
-  (*map)["my string"] = 15;
-  ASSERT_EQ(15, (*map)["my string"]);
-}
-
-// The complex object analog of |MainThreadWithArg|.
-TEST(ThreadLocalObject, MainThreadComplexObjectWithArg) {
-  ThreadLocalObject<IntegerWrapper> integer_wrapper_tlo;
-  EXPECT_FALSE(integer_wrapper_tlo.GetIfExists());
-  ASSERT_TRUE(integer_wrapper_tlo.GetOrCreate(14));
-  IntegerWrapper* integer_wrapper = integer_wrapper_tlo.GetIfExists();
-  const IntegerWrapper* const_integer_wrapper =
-      integer_wrapper_tlo.GetIfExists();
-  ASSERT_TRUE(integer_wrapper);
-  ASSERT_TRUE(const_integer_wrapper);
-  integer_wrapper->value = 15;
-  ASSERT_EQ(15, integer_wrapper->value);
-}
-
-// Tests that when a ThreadLocalObject is destroyed on the main thread that
-// the pointers it contained are also destroyed.
-TEST(ThreadLocalObject, DestroysObjectOnTLODestruction) {
-  CountsInstances::ResetNumInstances();
-  typedef ThreadLocalObject<CountsInstances> TLO;
-
-  // Create the TLO object and then immediately destroy it.
-  nb::scoped_ptr<TLO> tlo_ptr(new TLO);
-  tlo_ptr->GetOrCreate();  // Instantiate the internal object.
-  EXPECT_EQ(1, CountsInstances::NumInstances());
-  tlo_ptr.reset(NULL);  // Should destroy all outstanding allocs.
-  // Now the TLO is destroyed and therefore the destructor should run on the
-  // internal object.
-  EXPECT_EQ(0, CountsInstances::NumInstances());
-
-  CountsInstances::ResetNumInstances();
-}
-
-// Tests the expectation that the object can be released and that the pointer
-// won't be deleted when the ThreadLocalObject that created it is destroyed.
-TEST(ThreadLocalObject, ReleasesObject) {
-  CountsInstances::ResetNumInstances();
-  typedef ThreadLocalObject<CountsInstances> TLO;
-
-  nb::scoped_ptr<TLO> tlo_ptr(new TLO);
-  // Instantiate the internal object.
-  tlo_ptr->GetOrCreate();
-  // Now release the pointer into the container.
-  nb::scoped_ptr<CountsInstances> last_ref(tlo_ptr->Release());
-  // Destroying the TLO should not trigger the destruction of the object,
-  // because it was released.
-  tlo_ptr.reset(NULL);
-  // 1 instance left, which is held in last_ref.
-  EXPECT_EQ(1, CountsInstances::NumInstances());
-  last_ref.reset(NULL);  // Now the object should be destroyed and the
-                         // instance count drops to 0.
-  EXPECT_EQ(0, CountsInstances::NumInstances());
-  CountsInstances::ResetNumInstances();
-}
-
-// Tests the expectation that a thread that creates an object from
-// the ThreadLocalObject store will automatically be destroyed by the
-// thread joining.
-TEST(ThreadLocalObject, ThreadJoinDestroysObject) {
-  CountsInstances::ResetNumInstances();
-  typedef ThreadLocalObject<CountsInstances> TLO;
-
-  nb::scoped_ptr<TLO> tlo(new TLO);
-  {
-    TestThread* thread =
-        new CreateThreadLocalObjectThenExit<CountsInstances>(tlo.get());
-    thread->Start();
-    thread->Join();
-    // Once the thread joins, the object should be deleted and the instance
-    // counter falls to 0.
-    EXPECT_EQ(0, CountsInstances::NumInstances());
-    delete thread;
-  }
-
-  tlo.reset(NULL);  // Now TLO destructor runs.
-  EXPECT_EQ(0, CountsInstances::NumInstances());
-  CountsInstances::ResetNumInstances();
-}
-
-// Tests the expectation that objects created on the main thread are not
-// leaked.
-TEST(ThreadLocalObject, NoLeaksOnMainThread) {
-  CountsInstances::ResetNumInstances();
-
-  ThreadLocalObject<CountsInstances>* tlo =
-      new ThreadLocalObject<CountsInstances>;
-  tlo->EnableDestructionByAnyThread();
-
-  // Creates the object on the main thread. This is important because the
-  // main thread will never join and therefore at-exit functions won't get
-  // run.
-  CountsInstances* main_thread_object = tlo->GetOrCreate();
-
-  EXPECT_EQ(1, CountsInstances::NumInstances());
-
-  // Thread will simply create the thread local object (CountsInstances)
-  // and then return.
-  nb::scoped_ptr<TestThread> thread_ptr(
-      new CreateThreadLocalObjectThenExit<CountsInstances>(tlo));
-  thread_ptr->Start();  // Object is now created.
-  thread_ptr->Join();   // ...then destroyed.
-  thread_ptr.reset(NULL);
-
-  // Only main_thread_object should be alive now, therefore the count is 1.
-  EXPECT_EQ(1, CountsInstances::NumInstances());
-
-  // We COULD destroy the TLO on the main thread, but to be even fancier lets
-  // create a thread that will destroy the object on a back ground thread.
-  // The end result is that the TLO entry should be cleared out.
-  thread_ptr.reset(
-      new DestroyTypeOnThread<ThreadLocalObject<CountsInstances> >(tlo));
-  thread_ptr->Start();
-  thread_ptr->Join();
-  thread_ptr.reset(NULL);
-
-  // Now we expect that number of instances to be 0.
-  EXPECT_EQ(0, CountsInstances::NumInstances());
-  CountsInstances::ResetNumInstances();
-}
-
-}  // anonymous namespace
-}  // namespace nb
diff --git a/nb/thread_local_pointer.h b/nb/thread_local_pointer.h
deleted file mode 100644
index 5d0e7f3..0000000
--- a/nb/thread_local_pointer.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NB_THREAD_LOCAL_POINTER_H_
-#define NB_THREAD_LOCAL_POINTER_H_
-
-#include "starboard/common/log.h"
-#include "starboard/configuration.h"
-#include "starboard/thread.h"
-
-namespace nb {
-
-template <typename Type>
-class ThreadLocalPointer {
- public:
-  ThreadLocalPointer() {
-    slot_ = SbThreadCreateLocalKey(NULL);  // No destructor for pointer.
-    SB_DCHECK(kSbThreadLocalKeyInvalid != slot_);
-  }
-
-  ~ThreadLocalPointer() { SbThreadDestroyLocalKey(slot_); }
-
-  Type* Get() const {
-    void* ptr = SbThreadGetLocalValue(slot_);
-    Type* type_ptr = static_cast<Type*>(ptr);
-    return type_ptr;
-  }
-
-  void Set(Type* ptr) {
-    void* void_ptr = static_cast<void*>(ptr);
-    SbThreadSetLocalValue(slot_, void_ptr);
-  }
-
- private:
-  SbThreadLocalKey slot_;
-  ThreadLocalPointer<Type>(const ThreadLocalPointer<Type>&) = delete;
-  void operator=(const ThreadLocalPointer<Type>&) = delete;
-};
-
-}  // namespace nb.
-
-#endif  // NB_THREAD_LOCAL_POINTER_H_
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 0412e4d..881ac6d 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -1737,7 +1737,6 @@
     "//base:i18n",
     "//base/third_party/dynamic_annotations",
     "//crypto",
-    "//nb",
     "//starboard",
     "//third_party/boringssl:crypto",
     "//third_party/brotli:dec",
diff --git a/net/android/unittest_support/AndroidManifest.xml b/net/android/unittest_support/AndroidManifest.xml
index 9293618..d4f4261 100644
--- a/net/android/unittest_support/AndroidManifest.xml
+++ b/net/android/unittest_support/AndroidManifest.xml
@@ -10,7 +10,7 @@
       android:versionCode="1"
       android:versionName="1.0">
 
-    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />
+    <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="33" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
diff --git a/net/base/file_stream_context.cc b/net/base/file_stream_context.cc
index 1a1a121..9588252 100644
--- a/net/base/file_stream_context.cc
+++ b/net/base/file_stream_context.cc
@@ -18,7 +18,6 @@
 #ifdef STARBOARD
 #include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
-#include "nb/polymorphic_downcast.h"
 #endif
 
 #if defined(OS_ANDROID)
diff --git a/net/cert/multi_threaded_cert_verifier.cc b/net/cert/multi_threaded_cert_verifier.cc
index c8fd6fc..a513f01 100644
--- a/net/cert/multi_threaded_cert_verifier.cc
+++ b/net/cert/multi_threaded_cert_verifier.cc
@@ -21,7 +21,6 @@
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "base/values.h"
-#include "nb/memory_scope.h"
 #include "net/base/hash_value.h"
 #include "net/base/net_errors.h"
 #include "net/base/trace_constants.h"
@@ -203,7 +202,6 @@
     int flags,
     const scoped_refptr<CRLSet>& crl_set,
     const CertificateList& additional_trust_anchors) {
-  TRACK_MEMORY_SCOPE("Net");
   TRACE_EVENT0(kNetTracingCategory, "DoVerifyOnWorkerThread");
   auto verify_result = std::make_unique<ResultHelper>();
   MultiThreadedCertVerifierScopedAllowBaseSyncPrimitives
diff --git a/net/codereview.settings b/net/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/net/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/net/test/android/javatests/AndroidManifest.xml b/net/test/android/javatests/AndroidManifest.xml
index 341949b..af051a4 100644
--- a/net/test/android/javatests/AndroidManifest.xml
+++ b/net/test/android/javatests/AndroidManifest.xml
@@ -8,7 +8,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     package="org.chromium.net.test.support">
 
-    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />
+    <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="33" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.INTERNET"/>
 
diff --git a/net/third_party/quiche/src/codereview.settings b/net/third_party/quiche/src/codereview.settings
deleted file mode 100644
index e30572e..0000000
--- a/net/third_party/quiche/src/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-  # This file is used by git cl to get repository specific information.
-  GERRIT_HOST: lbshell-internal-review.googlesource.com
-  GERRIT_AUTODETECT_BRANCH: true
-  CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/net/url_request/test_url_fetcher_factory.cc b/net/url_request/test_url_fetcher_factory.cc
index a5b1354..a847216 100644
--- a/net/url_request/test_url_fetcher_factory.cc
+++ b/net/url_request/test_url_fetcher_factory.cc
@@ -173,6 +173,13 @@
   SaveResponseToFileAtPath(path, file_task_runner);
 }
 
+#if defined(STARBOARD)
+void TestURLFetcher::SaveResponseToLargeString() {
+  // TODO(b/158043520): implement when dependent unit tests are enabled.
+  CHECK(false) << "Unimplemented";
+}
+#endif
+
 void TestURLFetcher::SaveResponseWithWriter(
     std::unique_ptr<URLFetcherResponseWriter> response_writer) {
   // In class URLFetcherCore this method is called by all three:
@@ -285,6 +292,15 @@
   return true;
 }
 
+#if defined(STARBOARD)
+bool TestURLFetcher::GetResponseAsLargeString(
+    std::string* out_response_string) const {
+  // TODO(b/158043520): implement when dependent unit tests are enabled.
+  CHECK(false) << "Unimplemented";
+  return false;
+}
+#endif
+
 bool TestURLFetcher::GetResponseAsFilePath(
     bool take_ownership, base::FilePath* out_response_path) const {
   if (fake_response_destination_ != TEMP_FILE)
diff --git a/net/url_request/test_url_fetcher_factory.h b/net/url_request/test_url_fetcher_factory.h
index 880d078..bcc4039 100644
--- a/net/url_request/test_url_fetcher_factory.h
+++ b/net/url_request/test_url_fetcher_factory.h
@@ -133,6 +133,9 @@
       scoped_refptr<base::SequencedTaskRunner> file_task_runner) override;
   void SaveResponseToTemporaryFile(
       scoped_refptr<base::SequencedTaskRunner> file_task_runner) override;
+#if defined(STARBOARD)
+  void SaveResponseToLargeString() override;
+#endif
   void SaveResponseWithWriter(
       std::unique_ptr<URLFetcherResponseWriter> response_writer) override;
 #if defined(STARBOARD)
@@ -161,6 +164,10 @@
   void ReceivedContentWasMalformed() override;
   // Override response access functions to return fake data.
   bool GetResponseAsString(std::string* out_response_string) const override;
+#if defined(STARBOARD)
+  bool GetResponseAsLargeString(std::string* out_response_string)
+      const override;
+#endif
   bool GetResponseAsFilePath(bool take_ownership,
                              base::FilePath* out_response_path) const override;
 
diff --git a/net/url_request/url_fetcher.h b/net/url_request/url_fetcher.h
index 5bc635f..88a16c5 100644
--- a/net/url_request/url_fetcher.h
+++ b/net/url_request/url_fetcher.h
@@ -311,6 +311,14 @@
   virtual void SaveResponseToTemporaryFile(
       scoped_refptr<base::SequencedTaskRunner> file_task_runner) = 0;
 
+#if defined(STARBOARD)
+  // By default, the response is saved in a string without preallocation. Call
+  // this method when the response is expected to be large and the capacity
+  // should be reserved to the response's content size upfront to reduce
+  // fragmentation.
+  virtual void SaveResponseToLargeString() = 0;
+#endif
+
   // By default, the response is saved in a string. Call this method to use the
   // specified writer to save the response. Must be called before Start().
   virtual void SaveResponseWithWriter(
@@ -381,6 +389,15 @@
   // set to store the response as a string.
   virtual bool GetResponseAsString(std::string* out_response_string) const = 0;
 
+  #if defined(STARBOARD)
+  // Get the resonse as a string when the response is expected to be large and
+  // the data should be "moved" and not copied. Should only be used in
+  // conjunction with SaveResponseToLargeString() and returns false if the
+  // fetcher was not set to store the response as a "large" string.
+  virtual bool GetResponseAsLargeString(std::string* out_response_string)
+      const = 0;
+  #endif
+
   // Get the path to the file containing the response body. Returns false
   // if the response body was not saved to a file. If take_ownership is
   // true, caller takes responsibility for the file, and it will not
diff --git a/net/url_request/url_fetcher_core.cc b/net/url_request/url_fetcher_core.cc
index 39512ed..4798a3a 100644
--- a/net/url_request/url_fetcher_core.cc
+++ b/net/url_request/url_fetcher_core.cc
@@ -352,6 +352,14 @@
       new URLFetcherFileWriter(file_task_runner, file_path)));
 }
 
+#if defined(STARBOARD)
+void URLFetcherCore::SaveResponseToLargeString() {
+  DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
+  SaveResponseWithWriter(std::unique_ptr<URLFetcherResponseWriter>(
+      new URLFetcherLargeStringWriter()));
+}
+#endif
+
 void URLFetcherCore::SaveResponseToTemporaryFile(
     scoped_refptr<base::SequencedTaskRunner> file_task_runner) {
   DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
@@ -435,6 +443,19 @@
   return true;
 }
 
+#if defined(STARBOARD)
+bool URLFetcherCore::GetResponseAsLargeString(
+    std::string* out_response_string) const {
+  URLFetcherLargeStringWriter* large_string_writer =
+      response_writer_ ? response_writer_->AsLargeStringWriter() : NULL;
+  if (!large_string_writer)
+    return false;
+
+  large_string_writer->GetAndResetData(out_response_string);
+  return true;
+}
+#endif
+
 bool URLFetcherCore::GetResponseAsFilePath(bool take_ownership,
                                            base::FilePath* out_response_path) {
   DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
diff --git a/net/url_request/url_fetcher_core.h b/net/url_request/url_fetcher_core.h
index 7c1bbcb..c40184d 100644
--- a/net/url_request/url_fetcher_core.h
+++ b/net/url_request/url_fetcher_core.h
@@ -114,6 +114,9 @@
   void SaveResponseToFileAtPath(
       const base::FilePath& file_path,
       scoped_refptr<base::SequencedTaskRunner> file_task_runner);
+#if defined(STARBOARD)
+  void SaveResponseToLargeString();
+#endif
   void SaveResponseToTemporaryFile(
       scoped_refptr<base::SequencedTaskRunner> file_task_runner);
   void SaveResponseWithWriter(
@@ -143,6 +146,9 @@
   // headers.
   void ReceivedContentWasMalformed();
   bool GetResponseAsString(std::string* out_response_string) const;
+#if defined(STARBOARD)
+  bool GetResponseAsLargeString(std::string* out_response_string) const;
+#endif
   bool GetResponseAsFilePath(bool take_ownership,
                              base::FilePath* out_response_path);
 
diff --git a/net/url_request/url_fetcher_impl.cc b/net/url_request/url_fetcher_impl.cc
index b651ce4..19a345b 100644
--- a/net/url_request/url_fetcher_impl.cc
+++ b/net/url_request/url_fetcher_impl.cc
@@ -145,6 +145,12 @@
   core_->SaveResponseToTemporaryFile(file_task_runner);
 }
 
+#if defined(STARBOARD)
+void URLFetcherImpl::SaveResponseToLargeString() {
+  core_->SaveResponseToLargeString();
+}
+#endif
+
 void URLFetcherImpl::SaveResponseWithWriter(
     std::unique_ptr<URLFetcherResponseWriter> response_writer) {
   core_->SaveResponseWithWriter(std::move(response_writer));
@@ -217,6 +223,13 @@
   return core_->GetResponseAsString(out_response_string);
 }
 
+#if defined(STARBOARD)
+bool URLFetcherImpl::GetResponseAsLargeString(
+    std::string* out_response_string) const {
+  return core_->GetResponseAsLargeString(out_response_string);
+}
+#endif
+
 bool URLFetcherImpl::GetResponseAsFilePath(
     bool take_ownership,
     base::FilePath* out_response_path) const {
diff --git a/net/url_request/url_fetcher_impl.h b/net/url_request/url_fetcher_impl.h
index 21aafed..8775360 100644
--- a/net/url_request/url_fetcher_impl.h
+++ b/net/url_request/url_fetcher_impl.h
@@ -79,6 +79,9 @@
       scoped_refptr<base::SequencedTaskRunner> file_task_runner) override;
   void SaveResponseToTemporaryFile(
       scoped_refptr<base::SequencedTaskRunner> file_task_runner) override;
+#if defined(STARBOARD)
+  void SaveResponseToLargeString() override;
+#endif
   void SaveResponseWithWriter(
       std::unique_ptr<URLFetcherResponseWriter> response_writer) override;
 #if defined(STARBOARD)
@@ -99,6 +102,10 @@
   int GetResponseCode() const override;
   void ReceivedContentWasMalformed() override;
   bool GetResponseAsString(std::string* out_response_string) const override;
+#if defined(STARBOARD)
+  bool GetResponseAsLargeString(std::string* out_response_string)
+      const override;
+#endif
   bool GetResponseAsFilePath(bool take_ownership,
                              base::FilePath* out_response_path) const override;
 
diff --git a/net/url_request/url_fetcher_impl_unittest.cc b/net/url_request/url_fetcher_impl_unittest.cc
index ed01d26..cf24c68 100644
--- a/net/url_request/url_fetcher_impl_unittest.cc
+++ b/net/url_request/url_fetcher_impl_unittest.cc
@@ -1664,6 +1664,73 @@
 }
 #endif  // STARBOARD
 
+#if defined(STARBOARD)
+// Get a small file and save it to a "large string". SaveResponseToLargeString()
+// and GetResponseAsLargeString() are intended to be used for URLs with large
+// data sizes but should still work for URLs with small data sizes.
+TEST_F(URLFetcherTest, LargeStringTestSmallGet) {
+  // Follows the structure of the TempFileTestSmallGet case + SaveFileTest
+  // helper.
+  const char* file_to_fetch = "simple.html";
+  std::unique_ptr<WaitingURLFetcherDelegate> delegate(
+        new WaitingURLFetcherDelegate());
+  delegate->CreateFetcher(
+      test_server_->GetURL(std::string(kTestServerFilePrefix) + file_to_fetch),
+      URLFetcher::GET, CreateSameThreadContextGetter());
+
+  delegate->fetcher()->SaveResponseToLargeString();
+
+  delegate->StartFetcherAndWait();
+
+  EXPECT_TRUE(delegate->fetcher()->GetStatus().is_success());
+  EXPECT_EQ(200, delegate->fetcher()->GetResponseCode());
+
+  std::string actual_content;
+  EXPECT_TRUE(
+      delegate->fetcher()->GetResponseAsLargeString(&actual_content));
+
+  base::FilePath server_root;
+    base::PathService::Get(base::DIR_TEST_DATA, &server_root);
+  std::string expected_content;
+  base::ReadFileToString(
+      server_root.Append(kDocRoot).AppendASCII(file_to_fetch),
+      &expected_content);
+  EXPECT_EQ(expected_content, actual_content);
+}
+
+// Get a file large enough to require more than one read into URLFetcher::Core's
+// IOBuffer and save it to a "large string".
+TEST_F(URLFetcherTest, LargeStringTestLargeGet) {
+  // Follows the structure of the TempFileTestLargeGet case + SaveFileTest
+  // helper.
+  const char* file_to_fetch = "animate1.gif";
+  std::unique_ptr<WaitingURLFetcherDelegate> delegate(
+        new WaitingURLFetcherDelegate());
+  delegate->CreateFetcher(
+      test_server_->GetURL(std::string(kTestServerFilePrefix) + file_to_fetch),
+      URLFetcher::GET, CreateSameThreadContextGetter());
+
+  delegate->fetcher()->SaveResponseToLargeString();
+
+  delegate->StartFetcherAndWait();
+
+  EXPECT_TRUE(delegate->fetcher()->GetStatus().is_success());
+  EXPECT_EQ(200, delegate->fetcher()->GetResponseCode());
+
+  std::string actual_content;
+  EXPECT_TRUE(
+      delegate->fetcher()->GetResponseAsLargeString(&actual_content));
+
+  base::FilePath server_root;
+    base::PathService::Get(base::DIR_TEST_DATA, &server_root);
+  std::string expected_content;
+  base::ReadFileToString(
+      server_root.Append(kDocRoot).AppendASCII(file_to_fetch),
+      &expected_content);
+  EXPECT_EQ(expected_content, actual_content);
+}
+#endif
+
 }  // namespace
 
 }  // namespace net
diff --git a/net/url_request/url_fetcher_response_writer.cc b/net/url_request/url_fetcher_response_writer.cc
index 27e91a3..b9f4812 100644
--- a/net/url_request/url_fetcher_response_writer.cc
+++ b/net/url_request/url_fetcher_response_writer.cc
@@ -21,6 +21,12 @@
   return NULL;
 }
 
+#if defined(STARBOARD)
+URLFetcherLargeStringWriter* URLFetcherResponseWriter::AsLargeStringWriter() {
+  return NULL;
+}
+#endif
+
 URLFetcherFileWriter* URLFetcherResponseWriter::AsFileWriter() {
   return NULL;
 }
@@ -51,6 +57,49 @@
   return this;
 }
 
+#if defined(STARBOARD)
+URLFetcherLargeStringWriter::URLFetcherLargeStringWriter() = default;
+
+URLFetcherLargeStringWriter::~URLFetcherLargeStringWriter() = default;
+
+int URLFetcherLargeStringWriter::Initialize(CompletionOnceCallback callback) {
+  data_.clear();
+  return OK;
+}
+
+void URLFetcherLargeStringWriter::OnResponseStarted(int64_t content_length) {
+  data_.reserve(content_length);
+}
+
+void URLFetcherLargeStringWriter::GetAndResetData(std::string* data) {
+  CHECK(data != nullptr);
+
+  // This implementation is copied from
+  // cobalt::loader::URLFetcherStringWriter::GetAndResetData().
+  std::string empty;
+  data->swap(empty);
+  data_.swap(*data);
+}
+
+int URLFetcherLargeStringWriter::Write(IOBuffer* buffer,
+                                       int num_bytes,
+                                       CompletionOnceCallback callback) {
+  data_.append(buffer->data(), num_bytes);
+  return num_bytes;
+}
+
+int URLFetcherLargeStringWriter::Finish(int net_error,
+                                        CompletionOnceCallback callback) {
+  // Do nothing.
+  return OK;
+}
+
+URLFetcherLargeStringWriter*
+    URLFetcherLargeStringWriter::AsLargeStringWriter() {
+  return this;
+}
+#endif
+
 URLFetcherFileWriter::URLFetcherFileWriter(
     scoped_refptr<base::SequencedTaskRunner> file_task_runner,
     const base::FilePath& file_path)
diff --git a/net/url_request/url_fetcher_response_writer.h b/net/url_request/url_fetcher_response_writer.h
index bd4ca14..c86a7cf 100644
--- a/net/url_request/url_fetcher_response_writer.h
+++ b/net/url_request/url_fetcher_response_writer.h
@@ -25,6 +25,9 @@
 class IOBuffer;
 class URLFetcherFileWriter;
 class URLFetcherStringWriter;
+#if defined(STARBOARD)
+class URLFetcherLargeStringWriter;
+#endif
 
 // This class encapsulates all state involved in writing URLFetcher response
 // bytes to the destination.
@@ -63,6 +66,12 @@
   // Returns this instance's pointer as URLFetcherStringWriter when possible.
   virtual URLFetcherStringWriter* AsStringWriter();
 
+#if defined(STARBOARD)
+  // Returns this instance's pointer as URLFetcherLargeStringWriter when
+  // possible.
+  virtual URLFetcherLargeStringWriter* AsLargeStringWriter();
+#endif
+
   // Returns this instance's pointer as URLFetcherFileWriter when possible.
   virtual URLFetcherFileWriter* AsFileWriter();
 };
@@ -92,6 +101,35 @@
   DISALLOW_COPY_AND_ASSIGN(URLFetcherStringWriter);
 };
 
+#if defined(STARBOARD)
+// Memory-conscious URLFetcherResponseWriter implementation for a "large"
+// std::string. The string's capacity is preallocated to the size of the content
+// and the data can be "moved" out.
+// Similar to cobalt::loader::URLFetcherStringWriter but with a different
+// preallocation strategy.
+class NET_EXPORT URLFetcherLargeStringWriter : public URLFetcherResponseWriter {
+ public:
+  URLFetcherLargeStringWriter();
+  ~URLFetcherLargeStringWriter() override;
+
+  void GetAndResetData(std::string* data);
+
+  // URLFetcherResponseWriter overrides:
+  int Initialize(CompletionOnceCallback callback) override;
+  void OnResponseStarted(int64_t content_length) override;
+  int Write(IOBuffer* buffer,
+            int num_bytes,
+            CompletionOnceCallback callback) override;
+  int Finish(int net_error, CompletionOnceCallback callback) override;
+  URLFetcherLargeStringWriter* AsLargeStringWriter() override;
+
+ private:
+  std::string data_;
+
+  DISALLOW_COPY_AND_ASSIGN(URLFetcherLargeStringWriter);
+};
+#endif
+
 // URLFetcherResponseWriter implementation for files.
 class NET_EXPORT URLFetcherFileWriter : public URLFetcherResponseWriter {
  public:
diff --git a/net/url_request/url_fetcher_response_writer_unittest.cc b/net/url_request/url_fetcher_response_writer_unittest.cc
index 45bfd22..e8266f4 100644
--- a/net/url_request/url_fetcher_response_writer_unittest.cc
+++ b/net/url_request/url_fetcher_response_writer_unittest.cc
@@ -57,6 +57,61 @@
   EXPECT_TRUE(writer_->data().empty());
 }
 
+#if defined(STARBOARD)
+class URLFetcherLargeStringWriterTest : public PlatformTest {
+ protected:
+  void SetUp() override {
+    writer_.reset(new URLFetcherLargeStringWriter);
+    buf_ = base::MakeRefCounted<StringIOBuffer>(kData);
+  }
+
+  std::unique_ptr<URLFetcherLargeStringWriter> writer_;
+  scoped_refptr<StringIOBuffer> buf_;
+};
+
+TEST_F(URLFetcherLargeStringWriterTest, Basic) {
+  // The structure of this case is copied from URLFetcherStringWriterTest.Basic.
+
+  int rv = 0;
+  // Initialize(), Write() and Finish().
+  TestCompletionCallback callback;
+  rv = writer_->Initialize(callback.callback());
+  EXPECT_THAT(callback.GetResult(rv), IsOk());
+  rv = writer_->Write(buf_.get(), buf_->size(), callback.callback());
+  EXPECT_EQ(buf_->size(), callback.GetResult(rv));
+  rv = writer_->Finish(OK, callback.callback());
+  EXPECT_THAT(callback.GetResult(rv), IsOk());
+
+  // Verify the result.
+  std::string actual_data;
+  writer_->GetAndResetData(&actual_data);
+  // TODO(b/158043520): as requested by yuying@, we should add a test that uses
+  // a string that is actually large as the test data.
+  EXPECT_EQ(kData, actual_data);
+
+  // Initialize() again to reset.
+  rv = writer_->Initialize(callback.callback());
+  EXPECT_THAT(callback.GetResult(rv), IsOk());
+  writer_->GetAndResetData(&actual_data);
+  EXPECT_TRUE(actual_data.empty());
+}
+
+TEST_F(URLFetcherLargeStringWriterTest, OnResponseStartedPreallocatesMemory) {
+  int rv = 0;
+  TestCompletionCallback callback;
+  rv = writer_->Initialize(callback.callback());
+  EXPECT_THAT(callback.GetResult(rv), IsOk());
+  // Should be larger than the default string size but otherwise arbitrary.
+  int64_t content_length = 1234;
+
+  writer_->OnResponseStarted(content_length);
+
+  std::string actual_data;
+  writer_->GetAndResetData(&actual_data);
+  EXPECT_GE(actual_data.capacity(), content_length);
+}
+#endif
+
 class URLFetcherFileWriterTest : public PlatformTest,
                                  public WithScopedTaskEnvironment {
  protected:
diff --git a/precommit_hooks/internal_file_check_wrapper.py b/precommit_hooks/internal_file_check_wrapper.py
deleted file mode 100644
index 0c0566c..0000000
--- a/precommit_hooks/internal_file_check_wrapper.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python3
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Wrapper for internal_file_check.py."""
-
-import sys
-try:
-  from internal.precommit_hooks.internal_file_check import CheckFiles
-except ImportError:
-  print('internal_file_check.py not found, skipping')
-  sys.exit(0)
-
-if __name__ == '__main__':
-  sys.exit(CheckFiles(sys.argv[1:]))
diff --git a/precommit_hooks/osslint_wrapper.py b/precommit_hooks/osslint_wrapper.py
deleted file mode 100644
index 80b472a..0000000
--- a/precommit_hooks/osslint_wrapper.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python3
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Wrapper to run osslint.py."""
-
-import sys
-try:
-  from internal.precommit_hooks.osslint import RunPrecommitCheck
-except ImportError as e:
-  print(e)
-  sys.exit(0)
-
-if __name__ == '__main__':
-  sys.exit(RunPrecommitCheck(sys.argv[1:]))
diff --git a/starboard/BUILD.gn b/starboard/BUILD.gn
index 8227a8e..5092c33 100644
--- a/starboard/BUILD.gn
+++ b/starboard/BUILD.gn
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import("//starboard/build/config/os_definitions.gni")
 import("//starboard/build/config/starboard_target_type.gni")
 
 group("gn_all") {
@@ -61,14 +62,7 @@
     deps += [ "//third_party/lz4_lib:lz4" ]
 
     if (sb_is_evergreen_compatible) {
-      deps += [
-        "//third_party/crashpad/client",
-
-        # TODO(b/270858365): remove this dependency on the Starboard-based
-        # target (from the target toolchain) once Buildbot has been updated to
-        # use the native target (from native_target toolchain).
-        "//third_party/crashpad/handler",
-      ]
+      deps += [ "//third_party/crashpad/client" ]
       data_deps = [
         "//starboard/loader_app",
         "//third_party/crashpad/handler:crashpad_handler(//$starboard_path/toolchain:native_target)",
@@ -91,17 +85,21 @@
     "//starboard/client_porting/eztime",
   ]
 
-  if (sb_is_evergreen) {
+  if (sb_is_modular && current_toolchain == cobalt_toolchain) {
     public_deps += [
-      "//starboard/elf_loader:sabi_string",
       "//third_party/llvm-project/compiler-rt:compiler_rt",
       "//third_party/llvm-project/libcxx:cxx",
       "//third_party/llvm-project/libcxxabi:cxxabi",
       "//third_party/musl:c",
     ]
-    if (build_with_separate_cobalt_toolchain) {
-      data_deps = [ ":starboard_platform_group($starboard_toolchain)" ]
+    if (sb_is_evergreen) {
+      public_deps += [ "//starboard/elf_loader:sabi_string" ]
     } else {
+      data_deps = [ ":starboard_platform_group($starboard_toolchain)" ]
+    }
+
+    # TODO: b/295702296 Fix libunwind for modular builds.
+    if (sb_is_evergreen || is_host_os_win) {
       public_deps += [ "//third_party/llvm-project/libunwind:unwind_evergreen" ]
     }
   } else {
@@ -110,7 +108,7 @@
       "//starboard/common",
     ]
 
-    if (!build_with_separate_cobalt_toolchain) {
+    if (!sb_is_modular || sb_is_evergreen) {
       if (sb_is_evergreen_compatible) {
         public_deps += [ "//third_party/crashpad/wrapper" ]
       } else {
@@ -206,10 +204,17 @@
       sources = [ "//starboard/common/test_main.cc" ]
 
       public_deps = [
-        ":starboard",
+        ":starboard_with_main",
         "//testing/gmock",
         "//testing/gtest",
       ]
     }
   }
+
+  group("starboard_with_main") {
+    public_deps = [ ":starboard" ]
+    if (sb_is_modular && !sb_is_evergreen) {
+      public_deps += [ "//$starboard_path:starboard_platform_with_main" ]
+    }
+  }
 }
diff --git a/starboard/CHANGELOG.md b/starboard/CHANGELOG.md
index f113a5d..1fe1e58 100644
--- a/starboard/CHANGELOG.md
+++ b/starboard/CHANGELOG.md
@@ -14,7 +14,21 @@
 can be found in the comments of the "Experimental Feature Defines" section of
 [configuration.h](configuration.h).
 
+## Version 16
+
+### Removed SbByteSwapS16, SbByteSwapS32, SbByteSwapS64, SbByteSwapU16, SbByteSwapU32, and SbByteSwapU64
+The APIs defined in `starboard/byte_swap.h` are no longer used and have been
+deprecated.
+
 ## Version 15
+
+### SbMemoryReporter is no longer used
+
+`SbMemoryReporter` defined in `starboard/memory_reporter.h`` is no longer used
+and is considered deprecated. It will be removed in upcoming Starboard versions.
+The corresponding `SbMemoryAllocateNoReport` and `SbMemoryDeallocateNoReport`
+are also deprecated.
+
 ### Removed version suffixes of SbPlayer functions and structures
 Renamed SbPlayerInfo2 to SbPlayerInfo, SbPlayerSeek2() to SbPlayerSeek(),and
 SbPlayerGetInfo2() to SbPlayerGetInfo(), as the version suffixes are no longer
diff --git a/starboard/android/apk/app/build.gradle b/starboard/android/apk/app/build.gradle
index b64b5d3..ec84c2b 100644
--- a/starboard/android/apk/app/build.gradle
+++ b/starboard/android/apk/app/build.gradle
@@ -109,7 +109,7 @@
                 cmake.arguments "-DCOBALT_CONFIG=debug"
             }
             signingConfig signingConfigs.debugConfig
-            testCoverageEnabled true
+            enableUnitTestCoverage true
         }
         devel {
             debuggable true
@@ -118,14 +118,14 @@
                 cmake.arguments "-DCOBALT_CONFIG=devel"
             }
             signingConfig signingConfigs.debugConfig
-            testCoverageEnabled true
+            enableUnitTestCoverage true
         }
         qa {
             externalNativeBuild {
                 cmake.arguments "-DCOBALT_CONFIG=qa"
             }
             signingConfig signingConfigs.debugConfig
-            testCoverageEnabled true
+            enableUnitTestCoverage true
         }
         release {
             minifyEnabled true
@@ -149,16 +149,16 @@
         }
         // Add the directories symlinked by the CMake "cobalt_content" custom command.
         debug {
-            assets.srcDir "${buildDir}/intermediates/cxx/debug/cobalt_content"
+            assets.srcDir "${cobaltContentDir}"
         }
         devel {
-            assets.srcDir "${buildDir}/intermediates/cxx/devel/cobalt_content"
+            assets.srcDir "${cobaltContentDir}"
         }
         qa {
-            assets.srcDir "${buildDir}/intermediates/cxx/qa/cobalt_content"
+            assets.srcDir "${cobaltContentDir}"
         }
         release {
-            assets.srcDir "${buildDir}/intermediates/cxx/gold/cobalt_content"
+            assets.srcDir "${cobaltContentDir}"
         }
     }
     externalNativeBuild {
diff --git a/starboard/android/apk/app/src/app/java/dev/cobalt/app/CobaltApplication.java b/starboard/android/apk/app/src/app/java/dev/cobalt/app/CobaltApplication.java
index 83f0a8e..76cd807 100644
--- a/starboard/android/apk/app/src/app/java/dev/cobalt/app/CobaltApplication.java
+++ b/starboard/android/apk/app/src/app/java/dev/cobalt/app/CobaltApplication.java
@@ -17,9 +17,7 @@
 import android.app.Application;
 import dev.cobalt.coat.StarboardBridge;
 
-/**
- * Android Application hosting the Starboard application.
- */
+/** Android Application hosting the Starboard application. */
 public class CobaltApplication extends Application implements StarboardBridge.HostApplication {
   StarboardBridge starboardBridge;
 
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/account/AccessToken.java b/starboard/android/apk/app/src/main/java/dev/cobalt/account/AccessToken.java
index 9139b43..0447458 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/account/AccessToken.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/account/AccessToken.java
@@ -16,9 +16,7 @@
 
 import dev.cobalt.util.UsedByNative;
 
-/**
- * POJO holding the token for a signed-in user.
- */
+/** POJO holding the token for a signed-in user. */
 public class AccessToken {
 
   private final String tokenValue;
@@ -29,18 +27,14 @@
     this.expirySeconds = expirySeconds;
   }
 
-  /**
-   * Returns the token value.
-   */
+  /** Returns the token value. */
   @SuppressWarnings("unused")
   @UsedByNative
   public String getTokenValue() {
     return tokenValue;
   }
 
-  /**
-   * Returns number of seconds since epoch when this token expires, or 0 if it doesn't expire.
-   */
+  /** Returns number of seconds since epoch when this token expires, or 0 if it doesn't expire. */
   @SuppressWarnings("unused")
   @UsedByNative
   public long getExpirySeconds() {
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/account/UserAuthorizer.java b/starboard/android/apk/app/src/main/java/dev/cobalt/account/UserAuthorizer.java
index 1fc849e..2ae1e4b 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/account/UserAuthorizer.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/account/UserAuthorizer.java
@@ -17,19 +17,13 @@
 import android.content.Intent;
 import dev.cobalt.util.UsedByNative;
 
-/**
- * Java side implementation for starboard::android::shared::cobalt::AndroidUserAuthorizer.
- */
+/** Java side implementation for starboard::android::shared::cobalt::AndroidUserAuthorizer. */
 public interface UserAuthorizer {
 
-  /**
-   * Cleans up at the end of the object's lifecycle.
-   */
+  /** Cleans up at the end of the object's lifecycle. */
   void shutdown();
 
-  /**
-   * Unblocks any pending request.
-   */
+  /** Unblocks any pending request. */
   @SuppressWarnings("unused")
   @UsedByNative
   void interrupt();
@@ -38,9 +32,9 @@
    * Prompts the user as necessary to choose an account, then gets an auth token for the selected
    * account. I.e., pairs the web app to be signed-in as a selected account.
    *
-   * This method blocks until finished, and must be called off the UI thread.
+   * <p>This method blocks until finished, and must be called off the UI thread.
    *
-   * Implementations must annotate this method with @UsedByNative so Proguard doesn't remove it.
+   * <p>Implementations must annotate this method with @UsedByNative so Proguard doesn't remove it.
    */
   @SuppressWarnings("unused")
   @UsedByNative
@@ -50,9 +44,9 @@
    * Prompts the user as necessary to stop using an account. i.e., unpairs the web app to be
    * signed-out.
    *
-   * This method blocks until finished, and must be called off the UI thread.
+   * <p>This method blocks until finished, and must be called off the UI thread.
    *
-   * Implementations must annotate this method with @UsedByNative so Proguard doesn't remove it.
+   * <p>Implementations must annotate this method with @UsedByNative so Proguard doesn't remove it.
    */
   @SuppressWarnings("unused")
   @UsedByNative
@@ -61,14 +55,14 @@
   /**
    * Gets a new auth token for the account most recently authorized.
    *
-   * No UI will be shown if there is already a current account restored at construction or selected
-   * in authorizeUser(). If there is no current account, or the restored account has been deleted,
-   * the account picker may be shown to let the user specify which account should become the current
-   * account.
+   * <p>No UI will be shown if there is already a current account restored at construction or
+   * selected in authorizeUser(). If there is no current account, or the restored account has been
+   * deleted, the account picker may be shown to let the user specify which account should become
+   * the current account.
    *
-   * This method blocks until finished, and must be called off the UI thread.
+   * <p>This method blocks until finished, and must be called off the UI thread.
    *
-   * Implementations must annotate this method with @UsedByNative so Proguard doesn't remove it.
+   * <p>Implementations must annotate this method with @UsedByNative so Proguard doesn't remove it.
    */
   @SuppressWarnings("unused")
   @UsedByNative
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/AdvertisingId.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/AdvertisingId.java
index 983eec6..c88383d 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/AdvertisingId.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/AdvertisingId.java
@@ -33,6 +33,7 @@
 
   @GuardedBy("advertisingIdInfoLock")
   private volatile AdvertisingIdClient.Info advertisingIdInfo;
+
   // Controls access to advertisingIdInfo
   private final Object advertisingIdInfoLock = new Object();
 
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltA11yHelper.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltA11yHelper.java
index 4c8180f..1985c1f 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltA11yHelper.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltA11yHelper.java
@@ -106,14 +106,14 @@
         new Runnable() {
           @Override
           public void run() {
-            sendEventForVirtualView(
-                CENTER_VIEW_ID, AccessibilityEvent.TYPE_VIEW_FOCUSED);
+            sendEventForVirtualView(CENTER_VIEW_ID, AccessibilityEvent.TYPE_VIEW_FOCUSED);
           }
-        }, INPUT_FOCUS_CHANGE_DELAY);
+        },
+        INPUT_FOCUS_CHANGE_DELAY);
   }
 
   private void maybeInjectEvent(int currentFocusedViewId) {
-    if (!unhandledInput) { 
+    if (!unhandledInput) {
       return;
     }
     switch (currentFocusedViewId) {
@@ -142,7 +142,9 @@
   }
 
   /**
-   * <p>Fake number grid:
+   *
+   *
+   * <pre>Fake number grid:
    *   |+-+-+-+
    *   ||1|2|3|
    *   |+-+-+-|
@@ -150,12 +152,11 @@
    *   |+-+-+-|
    *   ||7|8|9|
    *   |+-+-+-+
+   * </pre>
    *
-   * <p>The focus always starts from the middle number 5. When user changes
-   * focus, the focus is then moved to either 2, 4, 6 or 8 and we can capture
-   * the movement this way. The focus is then quickly switched back to the
-   * center 5 to be ready for the next movement.
-   *
+   * <p>The focus always starts from the middle number 5. When user changes focus, the focus is then
+   * moved to either 2, 4, 6 or 8 and we can capture the movement this way. The focus is then
+   * quickly switched back to the center 5 to be ready for the next movement.
    */
   @Override
   protected void onPopulateNodeForVirtualView(int virtualViewId, AccessibilityNodeInfoCompat node) {
@@ -181,11 +182,12 @@
 
     // Note that the specific bounds here are arbitrary. The importance
     // is the relative bounds to each other.
-    node.setBoundsInParent(new Rect(
-        x * FAKE_VIEW_WIDTH,
-        y * FAKE_VIEW_HEIGHT,
-        x * FAKE_VIEW_WIDTH + FAKE_VIEW_WIDTH,
-        y * FAKE_VIEW_HEIGHT + FAKE_VIEW_HEIGHT));
+    node.setBoundsInParent(
+        new Rect(
+            x * FAKE_VIEW_WIDTH,
+            y * FAKE_VIEW_HEIGHT,
+            x * FAKE_VIEW_WIDTH + FAKE_VIEW_WIDTH,
+            y * FAKE_VIEW_HEIGHT + FAKE_VIEW_HEIGHT));
     node.setText("");
 
     if (virtualViewId >= 1 || virtualViewId <= 9) {
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltService.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltService.java
index 1f96ccd..8588be8 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltService.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltService.java
@@ -32,6 +32,7 @@
     /** Get the name of the service. */
     public String getServiceName();
   }
+
   /** Take in a reference to StarboardBridge & use it as needed. Default behavior is no-op. */
   public void receiveStarboardBridge(StarboardBridge bridge) {}
 
@@ -54,6 +55,7 @@
     @SuppressWarnings("unused")
     @UsedByNative
     public boolean invalidState;
+
     /** The synchronous response data from the service. */
     @SuppressWarnings("unused")
     @UsedByNative
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/ErrorDialog.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/ErrorDialog.java
index 35bc1f0..775c493 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/ErrorDialog.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/ErrorDialog.java
@@ -94,8 +94,10 @@
     setContentView(R.layout.coat_error_dialog);
 
     ImageView imageView = (ImageView) findViewById(R.id.image);
-    Drawable drawable = getContext().getResources().getDrawable(
-        R.drawable.lb_ic_sad_cloud, getContext().getTheme());
+    Drawable drawable =
+        getContext()
+            .getResources()
+            .getDrawable(R.drawable.lb_ic_sad_cloud, getContext().getTheme());
     imageView.setImageDrawable(drawable);
 
     TextView messageView = (TextView) findViewById(R.id.message);
@@ -111,15 +113,15 @@
       button.setVisibility(View.VISIBLE);
 
       final int buttonId = params.buttonIds[i];
-      button.setOnClickListener(new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-          params.buttonClickListener.onClick(ErrorDialog.this, buttonId);
-        }
-      });
+      button.setOnClickListener(
+          new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+              params.buttonClickListener.onClick(ErrorDialog.this, buttonId);
+            }
+          });
     }
 
     setOnDismissListener(params.dismissListener);
   }
-
 }
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/NetworkStatus.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/NetworkStatus.java
index 347123d..5904910 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/NetworkStatus.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/NetworkStatus.java
@@ -21,7 +21,6 @@
 import android.net.ConnectivityManager.NetworkCallback;
 import android.net.Network;
 import android.net.NetworkCapabilities;
-import android.os.Build;
 import android.os.Handler;
 import android.os.Looper;
 import dev.cobalt.util.Log;
@@ -52,7 +51,8 @@
     public void onAvailable(Network network) {
       this.networkStatus.sendStatusChange(true);
     }
-  };
+  }
+  ;
 
   public void sendStatusChange(final boolean online) {
     this.mainHandler.post(
@@ -73,32 +73,26 @@
         (ConnectivityManager) appContext.getSystemService(Context.CONNECTIVITY_SERVICE);
     Log.i(TAG, "Opening NetworkStatus");
     networkCallback = new CobaltNetworkCallback(this, mainHandler);
-    if (Build.VERSION.SDK_INT >= 24) {
+    connectivityManager.registerDefaultNetworkCallback(networkCallback);
+    callbackAdded = true;
+  }
+
+  public void beforeStartOrResume() {
+    if (connectivityManager != null && !callbackAdded) {
       connectivityManager.registerDefaultNetworkCallback(networkCallback);
       callbackAdded = true;
     }
   }
 
-  public void beforeStartOrResume() {
-    if (connectivityManager != null && !callbackAdded) {
-      if (Build.VERSION.SDK_INT >= 24) {
-        connectivityManager.registerDefaultNetworkCallback(networkCallback);
-        callbackAdded = true;
-      }
-    }
-  }
-
   public void beforeSuspend() {
     if (connectivityManager != null && callbackAdded) {
-      if (Build.VERSION.SDK_INT >= 24) {
-        connectivityManager.unregisterNetworkCallback(networkCallback);
-        callbackAdded = false;
-      }
+      connectivityManager.unregisterNetworkCallback(networkCallback);
+      callbackAdded = false;
     }
   }
 
   public boolean isConnected() {
-    if (connectivityManager != null && Build.VERSION.SDK_INT >= 24) {
+    if (connectivityManager != null) {
       // Return the current network bandwidth when client pings the NetworkStatus service.
       NetworkCapabilities cap =
           connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/PlatformError.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/PlatformError.java
index 999b349..05a148b 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/PlatformError.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/PlatformError.java
@@ -18,6 +18,7 @@
 
 import android.app.Activity;
 import android.app.Dialog;
+import android.content.ActivityNotFoundException;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Handler;
@@ -36,12 +37,14 @@
   @Retention(RetentionPolicy.SOURCE)
   @IntDef({CONNECTION_ERROR})
   @interface ErrorType {}
+
   // This must be kept in sync with starboard/android/shared/system_platform_error.cc
   public static final int CONNECTION_ERROR = 0;
 
   @Retention(RetentionPolicy.SOURCE)
   @IntDef({CANCELLED, NEGATIVE, POSITIVE})
   @interface Response {}
+
   public static final int NEGATIVE = -1;
   public static final int CANCELLED = 0;
   public static final int POSITIVE = 1;
@@ -106,7 +109,11 @@
         case NETWORK_SETTINGS_BUTTON:
           Activity activity = activityHolder.get();
           if (activity != null) {
-            activity.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
+            try {
+              activity.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
+            } catch (ActivityNotFoundException e) {
+              Log.e(TAG, "Failed to start activity for ACTION_WIFI_SETTINGS.");
+            }
           }
           break;
         case RETRY_BUTTON:
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java
index 3e3cd7c..2d719ad 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java
@@ -40,7 +40,6 @@
 import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.CaptioningManager;
 import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
 import dev.cobalt.account.UserAuthorizer;
 import dev.cobalt.media.AudioOutputManager;
 import dev.cobalt.media.CaptionSettings;
@@ -529,23 +528,12 @@
   @SuppressWarnings("unused")
   @UsedByNative
   public boolean isMicrophoneDisconnected() {
-    if (Build.VERSION.SDK_INT >= 23) {
-      return !isMicrophoneConnectedV23();
-    } else {
-      // There is no way of checking for a connected microphone/device before API 23, so cannot
-      // guarantee that no microphone is connected.
-      return false;
-    }
-  }
-
-  @RequiresApi(23)
-  private boolean isMicrophoneConnectedV23() {
     // A check specifically for microphones is not available before API 28, so it is assumed that a
     // connected input audio device is a microphone.
     AudioManager audioManager = (AudioManager) appContext.getSystemService(AUDIO_SERVICE);
     AudioDeviceInfo[] devices = audioManager.getDevices(GET_DEVICES_INPUTS);
     if (devices.length > 0) {
-      return true;
+      return false;
     }
 
     // fallback to check for BT voice capable RCU
@@ -555,10 +543,10 @@
       final InputDevice inputDevice = inputManager.getInputDevice(inputDeviceId);
       final boolean hasMicrophone = inputDevice.hasMicrophone();
       if (hasMicrophone) {
-        return true;
+        return false;
       }
     }
-    return false;
+    return true;
   }
 
   /**
@@ -579,34 +567,6 @@
   @SuppressWarnings("unused")
   @UsedByNative
   boolean isCurrentNetworkWireless() {
-    if (Build.VERSION.SDK_INT >= 23) {
-      return isCurrentNetworkWirelessV23();
-    } else {
-      return isCurrentNetworkWirelessDeprecated();
-    }
-  }
-
-  @SuppressWarnings("deprecation")
-  private boolean isCurrentNetworkWirelessDeprecated() {
-    ConnectivityManager connMgr =
-        (ConnectivityManager) appContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-    android.net.NetworkInfo activeInfo = connMgr.getActiveNetworkInfo();
-    if (activeInfo == null) {
-      return false;
-    }
-    switch (activeInfo.getType()) {
-      case ConnectivityManager.TYPE_ETHERNET:
-        return false;
-      default:
-        // Consider anything that's not definitely wired to be wireless.
-        // For example, TYPE_VPN is ambiguous, but it's highly likely to be
-        // over wifi.
-        return true;
-    }
-  }
-
-  @RequiresApi(23)
-  private boolean isCurrentNetworkWirelessV23() {
     ConnectivityManager connMgr =
         (ConnectivityManager) appContext.getSystemService(Context.CONNECTIVITY_SERVICE);
     Network activeNetwork = connMgr.getActiveNetwork();
@@ -744,7 +704,6 @@
   }
 
   /** Return supported hdr types. */
-  @RequiresApi(24)
   @SuppressWarnings("unused")
   @UsedByNative
   public int[] getSupportedHdrTypes() {
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioOutputManager.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioOutputManager.java
index ebd8967..9fb274f 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioOutputManager.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioOutputManager.java
@@ -80,9 +80,7 @@
     audioTrackBridgeList.add(audioTrackBridge);
     hasAudioDeviceChanged.set(false);
 
-    if (Build.VERSION.SDK_INT < 23
-        || hasRegisteredAudioDeviceCallback
-        || !enableAudioDeviceCallback) {
+    if (hasRegisteredAudioDeviceCallback || !enableAudioDeviceCallback) {
       return audioTrackBridge;
     }
 
@@ -106,7 +104,7 @@
                     TAG,
                     "Setting |hasAudioDeviceChanged| to true for audio device %s, %s.",
                     info.getProductName(),
-                    getDeviceTypeNameV23(info.getType()));
+                    getDeviceTypeName(info.getType()));
                 hasAudioDeviceChanged.set(true);
                 break;
               }
@@ -158,15 +156,6 @@
       return 2;
     }
 
-    if (Build.VERSION.SDK_INT >= 23) {
-      return getMaxChannelsV23();
-    }
-    return 2;
-  }
-
-  /** Returns the maximum number of HDMI channels for API 23 and above. */
-  @RequiresApi(23)
-  private int getMaxChannelsV23() {
     AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
     AudioDeviceInfo[] deviceInfos = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
     int maxChannels = 2;
@@ -186,10 +175,56 @@
     return maxChannels;
   }
 
+  /** Stores info from AudioDeviceInfo to be passed to the native app. */
+  @SuppressWarnings("unused")
+  @UsedByNative
+  public static class OutputDeviceInfo {
+    @UsedByNative public int type;
+    @UsedByNative public int channels;
+
+    @UsedByNative
+    public int getType() {
+      return type;
+    }
+
+    @UsedByNative
+    public int getChannels() {
+      return channels;
+    }
+  }
+
+  /** Returns output device info. */
+  @SuppressWarnings("unused")
+  @UsedByNative
+  boolean getOutputDeviceInfo(int index, OutputDeviceInfo outDeviceInfo) {
+    if (index < 0) {
+      return false;
+    }
+
+    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+    AudioDeviceInfo[] deviceInfos = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
+
+    if (index >= 0 && index < deviceInfos.length) {
+      outDeviceInfo.type = deviceInfos[index].getType();
+      outDeviceInfo.channels = 2;
+
+      int[] channelCounts = deviceInfos[index].getChannelCounts();
+      if (channelCounts.length == 0) {
+        outDeviceInfo.channels = 8;
+      } else {
+        for (int count : channelCounts) {
+          outDeviceInfo.channels = Math.max(outDeviceInfo.channels, count);
+        }
+      }
+      return true;
+    }
+
+    return false;
+  }
+
   /** Convert AudioDeviceInfo.TYPE_* to name in String */
-  @RequiresApi(23)
-  private static String getDeviceTypeNameV23(int device_type) {
-    switch (device_type) {
+  private static String getDeviceTypeName(int deviceType) {
+    switch (deviceType) {
       case AudioDeviceInfo.TYPE_AUX_LINE:
         return "TYPE_AUX_LINE";
       case AudioDeviceInfo.TYPE_BLUETOOTH_A2DP:
@@ -236,66 +271,60 @@
         return "TYPE_WIRED_HEADSET";
       default:
         // This may include constants introduced after API 23.
-        return String.format(Locale.US, "TYPE_UNKNOWN (%d)", device_type);
+        return String.format(Locale.US, "TYPE_UNKNOWN (%d)", deviceType);
     }
   }
 
   /** Convert audio encodings in int[] to common separated values in String */
-  @RequiresApi(23)
   private static String getEncodingNames(final int[] encodings) {
-    StringBuffer encodings_in_string = new StringBuffer("[");
+    StringBuffer encodingsInString = new StringBuffer("[");
     for (int i = 0; i < encodings.length; ++i) {
       switch (encodings[i]) {
         case AudioFormat.ENCODING_DEFAULT:
-          encodings_in_string.append("DEFAULT");
+          encodingsInString.append("DEFAULT");
           break;
         case AudioFormat.ENCODING_PCM_8BIT:
-          encodings_in_string.append("PCM_8BIT");
+          encodingsInString.append("PCM_8BIT");
           break;
         case AudioFormat.ENCODING_PCM_16BIT:
-          encodings_in_string.append("PCM_16BIT");
+          encodingsInString.append("PCM_16BIT");
           break;
         case AudioFormat.ENCODING_PCM_FLOAT:
-          encodings_in_string.append("PCM_FLOAT");
+          encodingsInString.append("PCM_FLOAT");
           break;
         case AudioFormat.ENCODING_DTS:
-          encodings_in_string.append("DTS");
+          encodingsInString.append("DTS");
           break;
         case AudioFormat.ENCODING_DTS_HD:
-          encodings_in_string.append("DTS_HD");
+          encodingsInString.append("DTS_HD");
           break;
         case AudioFormat.ENCODING_AC3:
-          encodings_in_string.append("AC3");
+          encodingsInString.append("AC3");
           break;
         case AudioFormat.ENCODING_E_AC3:
-          encodings_in_string.append("E_AC3");
+          encodingsInString.append("E_AC3");
           break;
         case AudioFormat.ENCODING_IEC61937:
-          encodings_in_string.append("IEC61937");
+          encodingsInString.append("IEC61937");
           break;
         case AudioFormat.ENCODING_INVALID:
-          encodings_in_string.append("INVALID");
+          encodingsInString.append("INVALID");
           break;
         default:
           // This may include constants introduced after API 23.
-          encodings_in_string.append(String.format(Locale.US, "UNKNOWN (%d)", encodings[i]));
+          encodingsInString.append(String.format(Locale.US, "UNKNOWN (%d)", encodings[i]));
           break;
       }
       if (i != encodings.length - 1) {
-        encodings_in_string.append(", ");
+        encodingsInString.append(", ");
       }
     }
-    encodings_in_string.append(']');
-    return encodings_in_string.toString();
+    encodingsInString.append(']');
+    return encodingsInString.toString();
   }
 
   /** Dump all audio output devices. */
   public void dumpAllOutputDevices() {
-    if (Build.VERSION.SDK_INT < 23) {
-      Log.i(TAG, "dumpAllOutputDevices() is only supported in API level 23 or above.");
-      return;
-    }
-
     Log.i(TAG, "Dumping all audio output devices:");
 
     AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
@@ -305,7 +334,7 @@
       Log.i(
           TAG,
           "  Audio Device: %s, channels: %s, sample rates: %s, encodings: %s",
-          getDeviceTypeNameV23(info.getType()),
+          getDeviceTypeName(info.getType()),
           Arrays.toString(info.getChannelCounts()),
           Arrays.toString(info.getSampleRates()),
           getEncodingNames(info.getEncodings()));
@@ -363,16 +392,6 @@
   @SuppressWarnings("unused")
   @UsedByNative
   boolean hasPassthroughSupportFor(int encoding) {
-    if (Build.VERSION.SDK_INT < 23) {
-      Log.i(
-          TAG,
-          "Passthrough on encoding %d is rejected on api %d, as passthrough is only"
-              + " supported on api 23 or later.",
-          encoding,
-          Build.VERSION.SDK_INT);
-      return false;
-    }
-
     AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
     AudioDeviceInfo[] deviceInfos = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
 
@@ -454,7 +473,6 @@
   }
 
   /** Returns whether passthrough on `encoding` is supported for API 23 and above. */
-  @RequiresApi(23)
   private boolean hasPassthroughSupportForV23(final AudioDeviceInfo[] deviceInfos, int encoding) {
     for (AudioDeviceInfo info : deviceInfos) {
       final int type = info.getType();
@@ -473,7 +491,7 @@
             "Passthrough on encoding %d is supported on %s, because getEncodings() returns"
                 + " an empty array.",
             encoding,
-            getDeviceTypeNameV23(type));
+            getDeviceTypeName(type));
         return true;
       }
       for (int i = 0; i < encodings.length; ++i) {
@@ -482,7 +500,7 @@
               TAG,
               "Passthrough on encoding %d is supported on %s.",
               encoding,
-              getDeviceTypeNameV23(type));
+              getDeviceTypeName(type));
           return true;
         }
       }
@@ -490,7 +508,7 @@
           TAG,
           "Passthrough on encoding %d is not supported on %s.",
           encoding,
-          getDeviceTypeNameV23(type));
+          getDeviceTypeName(type));
     }
     Log.i(TAG, "Passthrough on encoding %d is not supported on any devices.", encoding);
     return false;
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java
index 2b63cd8..d554864 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java
@@ -271,12 +271,7 @@
       return writeWithAvSync(audioData, sizeInBytes, presentationTimeInMicroseconds);
     }
 
-    if (Build.VERSION.SDK_INT >= 23) {
-      return audioTrack.write(audioData, 0, sizeInBytes, AudioTrack.WRITE_NON_BLOCKING);
-    } else {
-      ByteBuffer byteBuffer = ByteBuffer.wrap(audioData);
-      return audioTrack.write(byteBuffer, sizeInBytes, AudioTrack.WRITE_NON_BLOCKING);
-    }
+    return audioTrack.write(audioData, 0, sizeInBytes, AudioTrack.WRITE_NON_BLOCKING);
   }
 
   private int writeWithAvSync(
@@ -297,7 +292,7 @@
     // Set the following constant to |false| to test manual sync header writing in API level 23 or
     // later.  Note that the code to write sync header manually only supports v1 sync header.
     final boolean useAutoSyncHeaderWrite = true;
-    if (useAutoSyncHeaderWrite && Build.VERSION.SDK_INT >= 23) {
+    if (useAutoSyncHeaderWrite) {
       ByteBuffer byteBuffer = ByteBuffer.wrap(audioData);
       return audioTrack.write(
           byteBuffer, sizeInBytes, AudioTrack.WRITE_NON_BLOCKING, presentationTimeInNanoseconds);
@@ -392,15 +387,6 @@
   @SuppressWarnings("unused")
   @UsedByNative
   private int getUnderrunCount() {
-    if (Build.VERSION.SDK_INT >= 24) {
-      return getUnderrunCountV24();
-    }
-    // The function getUnderrunCount() is added in API level 24.
-    return 0;
-  }
-
-  @RequiresApi(24)
-  private int getUnderrunCountV24() {
     if (audioTrack == null) {
       Log.e(TAG, "Unable to call getUnderrunCount() with NULL audio track.");
       return 0;
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/CaptionSettings.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/CaptionSettings.java
index 43d6997..81ed4ee 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/CaptionSettings.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/CaptionSettings.java
@@ -17,9 +17,7 @@
 import android.view.accessibility.CaptioningManager;
 import dev.cobalt.util.UsedByNative;
 
-/**
- * Captures the system Caption style in properties as needed by the Starboard implementation.
- */
+/** Captures the system Caption style in properties as needed by the Starboard implementation. */
 public class CaptionSettings {
 
   @UsedByNative public final boolean isEnabled;
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/Log.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/Log.java
index 44e51b8..17389fc 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/Log.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/Log.java
@@ -14,9 +14,7 @@
 
 package dev.cobalt.media;
 
-/**
- * Common definitions for logging in the media package.
- */
+/** Common definitions for logging in the media package. */
 public class Log {
   public static final String TAG = "starboard_media";
 
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java
index 9fbf090..8b179c9 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java
@@ -38,6 +38,7 @@
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.Locale;
+import java.util.Optional;
 
 /** A wrapper of the MediaCodec class. */
 @SuppressWarnings("unused")
@@ -82,7 +83,6 @@
   private boolean mFlushed;
   private long mLastPresentationTimeUs;
   private final String mMime;
-  private boolean mAdaptivePlaybackSupported;
   private double mPlaybackRate = 1.0;
   private int mFps = 30;
 
@@ -269,6 +269,7 @@
     private int mStatus;
     // May be null if mStatus is not MEDIA_CODEC_OK.
     private MediaFormat mFormat;
+    private Optional<Boolean> mFormatHasCropValues = Optional.empty();
 
     @SuppressWarnings("unused")
     @UsedByNative
@@ -277,18 +278,16 @@
       mFormat = null;
     }
 
-    @SuppressWarnings("unused")
-    @UsedByNative
-    private GetOutputFormatResult(int status, MediaFormat format) {
-      mStatus = status;
-      mFormat = format;
-    }
-
     private boolean formatHasCropValues() {
-      return mFormat.containsKey(KEY_CROP_RIGHT)
-          && mFormat.containsKey(KEY_CROP_LEFT)
-          && mFormat.containsKey(KEY_CROP_BOTTOM)
-          && mFormat.containsKey(KEY_CROP_TOP);
+      if (!mFormatHasCropValues.isPresent()) {
+        boolean hasCropValues =
+            mFormat.containsKey(KEY_CROP_RIGHT)
+                && mFormat.containsKey(KEY_CROP_LEFT)
+                && mFormat.containsKey(KEY_CROP_BOTTOM)
+                && mFormat.containsKey(KEY_CROP_TOP);
+        mFormatHasCropValues = Optional.of(hasCropValues);
+      }
+      return mFormatHasCropValues.get();
     }
 
     @SuppressWarnings("unused")
@@ -299,18 +298,38 @@
 
     @SuppressWarnings("unused")
     @UsedByNative
-    private int width() {
-      return formatHasCropValues()
-          ? mFormat.getInteger(KEY_CROP_RIGHT) - mFormat.getInteger(KEY_CROP_LEFT) + 1
-          : mFormat.getInteger(MediaFormat.KEY_WIDTH);
+    private int textureWidth() {
+      return mFormat.getInteger(MediaFormat.KEY_WIDTH);
     }
 
     @SuppressWarnings("unused")
     @UsedByNative
-    private int height() {
-      return formatHasCropValues()
-          ? mFormat.getInteger(KEY_CROP_BOTTOM) - mFormat.getInteger(KEY_CROP_TOP) + 1
-          : mFormat.getInteger(MediaFormat.KEY_HEIGHT);
+    private int textureHeight() {
+      return mFormat.getInteger(MediaFormat.KEY_HEIGHT);
+    }
+
+    @SuppressWarnings("unused")
+    @UsedByNative
+    private int cropLeft() {
+      return formatHasCropValues() ? mFormat.getInteger(KEY_CROP_LEFT) : -1;
+    }
+
+    @SuppressWarnings("unused")
+    @UsedByNative
+    private int cropTop() {
+      return formatHasCropValues() ? mFormat.getInteger(KEY_CROP_TOP) : -1;
+    }
+
+    @SuppressWarnings("unused")
+    @UsedByNative
+    private int cropRight() {
+      return formatHasCropValues() ? mFormat.getInteger(KEY_CROP_RIGHT) : -1;
+    }
+
+    @SuppressWarnings("unused")
+    @UsedByNative
+    private int cropBottom() {
+      return formatHasCropValues() ? mFormat.getInteger(KEY_CROP_BOTTOM) : -1;
     }
 
     @SuppressWarnings("unused")
@@ -427,7 +446,6 @@
       long nativeMediaCodecBridge,
       MediaCodec mediaCodec,
       String mime,
-      boolean adaptivePlaybackSupported,
       BitrateAdjustmentTypes bitrateAdjustmentType,
       int tunnelModeAudioSessionId) {
     if (mediaCodec == null) {
@@ -438,7 +456,6 @@
     mMime = mime; // TODO: Delete the unused mMime field
     mLastPresentationTimeUs = 0;
     mFlushed = true;
-    mAdaptivePlaybackSupported = adaptivePlaybackSupported;
     mBitrateAdjustmentType = bitrateAdjustmentType;
     mCallback =
         new MediaCodec.Callback() {
@@ -498,13 +515,16 @@
                 return;
               }
               nativeOnMediaCodecOutputFormatChanged(mNativeMediaCodecBridge);
+              if (mFrameRateEstimator != null) {
+                mFrameRateEstimator.reset();
+              }
             }
           }
         };
     mMediaCodec.setCallback(mCallback);
 
     // TODO: support OnFrameRenderedListener for non tunnel mode
-    if (tunnelModeAudioSessionId != -1 && Build.VERSION.SDK_INT >= 23) {
+    if (tunnelModeAudioSessionId != -1) {
       mTunnelModeFrameRendererListener =
           new MediaCodec.OnFrameRenderedListener() {
             @Override
@@ -549,12 +569,7 @@
     }
     MediaCodecBridge bridge =
         new MediaCodecBridge(
-            nativeMediaCodecBridge,
-            mediaCodec,
-            mime,
-            true,
-            BitrateAdjustmentTypes.NO_ADJUSTMENT,
-            -1);
+            nativeMediaCodecBridge, mediaCodec, mime, BitrateAdjustmentTypes.NO_ADJUSTMENT, -1);
 
     MediaFormat mediaFormat = createAudioFormat(mime, sampleRate, channelCount);
 
@@ -588,8 +603,10 @@
       long nativeMediaCodecBridge,
       String mime,
       String decoderName,
-      int width,
-      int height,
+      // `widthHint` and `heightHint` are used to create the Android video format, which don't have
+      // to be directly related to the resolution of the video.
+      int widthHint,
+      int heightHint,
       int fps,
       int maxWidth,
       int maxHeight,
@@ -649,10 +666,10 @@
             nativeMediaCodecBridge,
             mediaCodec,
             mime,
-            true,
             BitrateAdjustmentTypes.NO_ADJUSTMENT,
             tunnelModeAudioSessionId);
-    MediaFormat mediaFormat = createVideoDecoderFormat(mime, width, height, videoCapabilities);
+    MediaFormat mediaFormat =
+        createVideoDecoderFormat(mime, widthHint, heightHint, videoCapabilities);
 
     boolean shouldConfigureHdr =
         colorInfo != null && MediaCodecUtil.isHdrCapableVideoDecoder(mime, codecCapabilities);
@@ -756,14 +773,7 @@
     }
 
     if (!bridge.configureVideo(
-        mediaFormat,
-        surface,
-        crypto,
-        0,
-        true,
-        maxWidth,
-        maxHeight,
-        outCreateMediaCodecBridgeResult)) {
+        mediaFormat, surface, crypto, 0, maxWidth, maxHeight, outCreateMediaCodecBridgeResult)) {
       Log.e(TAG, "Failed to configure video codec.");
       bridge.release();
       // outCreateMediaCodecBridgeResult.mErrorMessage is set inside configureVideo() on error.
@@ -850,7 +860,7 @@
     try {
       mFlushed = true;
       mMediaCodec.flush();
-    } catch (IllegalStateException e) {
+    } catch (Exception e) {
       Log.e(TAG, "Failed to flush MediaCodec", e);
       return MEDIA_CODEC_ERROR;
     }
@@ -985,7 +995,7 @@
       cryptoInfo.set(
           numSubSamples, numBytesOfClearData, numBytesOfEncryptedData, keyId, iv, cipherMode);
 
-      if (Build.VERSION.SDK_INT >= 24 && cipherMode == MediaCodec.CRYPTO_MODE_AES_CBC) {
+      if (cipherMode == MediaCodec.CRYPTO_MODE_AES_CBC) {
         cryptoInfo.setPattern(new Pattern(blocksToEncrypt, blocksToSkip));
       } else if (blocksToEncrypt != 0 || blocksToSkip != 0) {
         Log.e(TAG, "Pattern encryption only supported for 'cbcs' scheme (CBC mode).");
@@ -1003,19 +1013,16 @@
             TAG,
             "Failed to queue secure input buffer: "
                 + "CryptoException.ERROR_INSUFFICIENT_OUTPUT_PROTECTION");
-        // Note that in Android OS version before 23, the MediaDrm class doesn't expose the current
-        // key ids it holds.  In such case the Starboard media stack is unable to notify Cobalt of
-        // the error via key statuses so MEDIA_CODEC_ERROR is returned instead to signal a general
-        // media codec error.
-        return Build.VERSION.SDK_INT >= 23
-            ? MEDIA_CODEC_INSUFFICIENT_OUTPUT_PROTECTION
-            : MEDIA_CODEC_ERROR;
+        return MEDIA_CODEC_INSUFFICIENT_OUTPUT_PROTECTION;
       }
       Log.e(
           TAG,
           "Failed to queue secure input buffer, CryptoException with error code "
               + e.getErrorCode());
       return MEDIA_CODEC_ERROR;
+    } catch (IllegalArgumentException e) {
+      Log.e(TAG, "Failed to queue secure input buffer, IllegalArgumentException " + e);
+      return MEDIA_CODEC_ERROR;
     } catch (IllegalStateException e) {
       Log.e(TAG, "Failed to queue secure input buffer, IllegalStateException " + e);
       return MEDIA_CODEC_ERROR;
@@ -1052,37 +1059,25 @@
       Surface surface,
       MediaCrypto crypto,
       int flags,
-      boolean allowAdaptivePlayback,
       int maxSupportedWidth,
       int maxSupportedHeight,
       CreateMediaCodecBridgeResult outCreateMediaCodecBridgeResult) {
     try {
-      // If adaptive playback is turned off by request, then treat it as
-      // not supported.  Note that configureVideo is only called once
-      // during creation, else this would prevent re-enabling adaptive
-      // playback later.
-      if (!allowAdaptivePlayback) {
-        mAdaptivePlaybackSupported = false;
+      // Since we haven't passed the properties of the stream we're playing down to this level, from
+      // our perspective, we could potentially adapt up to 8k at any point. We thus request 8k
+      // buffers up front, unless the decoder claims to not be able to do 8k, in which case we're
+      // ok, since we would've rejected a 8k stream when canPlayType was called, and then use those
+      // decoder values instead. We only support 8k for API level 29 and above.
+      if (Build.VERSION.SDK_INT > 28) {
+        format.setInteger(MediaFormat.KEY_MAX_WIDTH, Math.min(7680, maxSupportedWidth));
+        format.setInteger(MediaFormat.KEY_MAX_HEIGHT, Math.min(4320, maxSupportedHeight));
+      } else {
+        // Android 5.0/5.1 seems not support 8K. Fallback to 4K until we get a
+        // better way to get maximum supported resolution.
+        format.setInteger(MediaFormat.KEY_MAX_WIDTH, Math.min(3840, maxSupportedWidth));
+        format.setInteger(MediaFormat.KEY_MAX_HEIGHT, Math.min(2160, maxSupportedHeight));
       }
 
-      if (mAdaptivePlaybackSupported) {
-        // Since we haven't passed the properties of the stream we're playing
-        // down to this level, from our perspective, we could potentially
-        // adapt up to 8k at any point. We thus request 8k buffers up front,
-        // unless the decoder claims to not be able to do 8k, in which case
-        // we're ok, since we would've rejected a 8k stream when canPlayType
-        // was called, and then use those decoder values instead. We only
-        // support 8k for API level 29 and above.
-        if (Build.VERSION.SDK_INT > 28) {
-          format.setInteger(MediaFormat.KEY_MAX_WIDTH, Math.min(7680, maxSupportedWidth));
-          format.setInteger(MediaFormat.KEY_MAX_HEIGHT, Math.min(4320, maxSupportedHeight));
-        } else {
-          // Android 5.0/5.1 seems not support 8K. Fallback to 4K until we get a
-          // better way to get maximum supported resolution.
-          format.setInteger(MediaFormat.KEY_MAX_WIDTH, Math.min(3840, maxSupportedWidth));
-          format.setInteger(MediaFormat.KEY_MAX_HEIGHT, Math.min(2160, maxSupportedHeight));
-        }
-      }
       maybeSetMaxInputSize(format);
       mMediaCodec.configure(format, surface, crypto, flags);
       mFrameRateEstimator = new FrameRateEstimator();
@@ -1112,11 +1107,11 @@
   }
 
   private static MediaFormat createVideoDecoderFormat(
-      String mime, int width, int height, VideoCapabilities videoCapabilities) {
+      String mime, int widthHint, int heightHint, VideoCapabilities videoCapabilities) {
     return MediaFormat.createVideoFormat(
         mime,
-        alignDimension(width, videoCapabilities.getWidthAlignment()),
-        alignDimension(height, videoCapabilities.getHeightAlignment()));
+        alignDimension(widthHint, videoCapabilities.getWidthAlignment()),
+        alignDimension(heightHint, videoCapabilities.getHeightAlignment()));
   }
 
   private static int alignDimension(int size, int alignment) {
@@ -1142,11 +1137,11 @@
       return;
     }
     int maxHeight = format.getInteger(MediaFormat.KEY_HEIGHT);
-    if (mAdaptivePlaybackSupported && format.containsKey(MediaFormat.KEY_MAX_HEIGHT)) {
+    if (format.containsKey(MediaFormat.KEY_MAX_HEIGHT)) {
       maxHeight = Math.max(maxHeight, format.getInteger(MediaFormat.KEY_MAX_HEIGHT));
     }
     int maxWidth = format.getInteger(MediaFormat.KEY_WIDTH);
-    if (mAdaptivePlaybackSupported && format.containsKey(MediaFormat.KEY_MAX_WIDTH)) {
+    if (format.containsKey(MediaFormat.KEY_MAX_WIDTH)) {
       maxWidth = Math.max(maxHeight, format.getInteger(MediaFormat.KEY_MAX_WIDTH));
     }
     int maxPixels;
@@ -1195,14 +1190,6 @@
 
   @SuppressWarnings("unused")
   @UsedByNative
-  private boolean isAdaptivePlaybackSupported(int width, int height) {
-    // If media codec has adaptive playback supported, then the max sizes
-    // used during creation are only hints.
-    return mAdaptivePlaybackSupported;
-  }
-
-  @SuppressWarnings("unused")
-  @UsedByNative
   private static void setCodecSpecificData(MediaFormat format, int index, byte[] bytes) {
     // Codec Specific Data is set in the MediaFormat as ByteBuffer entries with keys csd-0,
     // csd-1, and so on. See: http://developer.android.com/reference/android/media/MediaCodec.html
@@ -1311,11 +1298,7 @@
       case 6:
         return AudioFormat.CHANNEL_OUT_5POINT1;
       case 8:
-        if (Build.VERSION.SDK_INT >= 23) {
-          return AudioFormat.CHANNEL_OUT_7POINT1_SURROUND;
-        } else {
-          return AudioFormat.CHANNEL_OUT_7POINT1;
-        }
+        return AudioFormat.CHANNEL_OUT_7POINT1_SURROUND;
       default:
         return AudioFormat.CHANNEL_OUT_DEFAULT;
     }
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecUtil.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecUtil.java
index c0cee61..9afa2bc 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecUtil.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecUtil.java
@@ -52,10 +52,10 @@
   private static final String AV1_MIME_TYPE = "video/av01";
 
   static {
-    if (Build.VERSION.SDK_INT >= 24 && Build.BRAND.equals("google")) {
+    if (Build.BRAND.equals("google")) {
       videoCodecDenyList.add("OMX.Nvidia.vp9.decode");
     }
-    if (Build.VERSION.SDK_INT >= 24 && Build.BRAND.equals("LGE")) {
+    if (Build.BRAND.equals("LGE")) {
       videoCodecDenyList.add("OMX.qcom.video.decoder.vp9");
     }
     if (Build.VERSION.RELEASE.startsWith("6.0.1")) {
@@ -469,11 +469,6 @@
   /** Determine whether codecCapabilities is capable of playing HDR. */
   public static boolean isHdrCapableVideoDecoder(
       String mimeType, CodecCapabilities codecCapabilities) {
-    // VP9Profile* values were not added until API level 24.  See
-    // https://developer.android.com/reference/android/media/MediaCodecInfo.CodecProfileLevel.html.
-    if (Build.VERSION.SDK_INT < 24) {
-      return false;
-    }
     // AV1ProfileMain10HDR10 value was not added until API level 29.  See
     // https://developer.android.com/reference/android/media/MediaCodecInfo.CodecProfileLevel.html.
     if (mimeType.equals(AV1_MIME_TYPE) && Build.VERSION.SDK_INT < 29) {
@@ -648,15 +643,6 @@
         continue;
       }
 
-      // VideoCapabilities is not implemented correctly on this device.
-      if (Build.VERSION.SDK_INT < 23
-          && Build.MODEL.equals("MIBOX3")
-          && name.equals("OMX.amlogic.vp9.decoder.awesome")
-          && (frameWidth > 1920 || frameHeight > 1080)) {
-        Log.v(TAG, "Skipping >1080p OMX.amlogic.vp9.decoder.awesome on mibox.");
-        continue;
-      }
-
       VideoCapabilities videoCapabilities = decoder.videoCapabilities;
       Range<Integer> supportedWidths = decoder.supportedWidths;
       Range<Integer> supportedHeights = decoder.supportedHeights;
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java
index 9722d93..23ab5f3 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java
@@ -81,8 +81,7 @@
   private static final int MEDIA_DRM_EVENT_PROVISION_REQUIRED = MediaDrm.EVENT_PROVISION_REQUIRED;
 
   // Added in API 23.
-  private static final int MEDIA_DRM_EVENT_SESSION_RECLAIMED =
-      Build.VERSION.SDK_INT >= 23 ? MediaDrm.EVENT_SESSION_RECLAIMED : 5;
+  private static final int MEDIA_DRM_EVENT_SESSION_RECLAIMED = MediaDrm.EVENT_SESSION_RECLAIMED;
 
   private MediaDrm mMediaDrm;
   private long mNativeMediaDrmBridge;
@@ -286,10 +285,6 @@
       }
       Log.d(
           TAG, String.format("Key successfully added for session %s", bytesToHexString(sessionId)));
-      if (Build.VERSION.SDK_INT < 23) {
-        // Pass null to indicate that KeyStatus isn't supported.
-        nativeOnKeyStatusChange(mNativeMediaDrmBridge, sessionId, null);
-      }
       return new UpdateSessionResult(UpdateSessionResult.Status.SUCCESS, "");
     } catch (NotProvisionedException e) {
       // TODO: Should we handle this?
@@ -444,20 +439,6 @@
           }
         });
 
-    if (Build.VERSION.SDK_INT >= 23) {
-      setOnKeyStatusChangeListenerV23();
-    }
-
-    mMediaDrm.setPropertyString("privacyMode", "enable");
-    mMediaDrm.setPropertyString("sessionSharing", "enable");
-    if (keySystem.equals("com.youtube.widevine.l3")
-        && mMediaDrm.getPropertyString("securityLevel") != "L3") {
-      mMediaDrm.setPropertyString("securityLevel", "L3");
-    }
-  }
-
-  @RequiresApi(23)
-  private void setOnKeyStatusChangeListenerV23() {
     mMediaDrm.setOnKeyStatusChangeListener(
         new MediaDrm.OnKeyStatusChangeListener() {
           @Override
@@ -473,6 +454,13 @@
           }
         },
         null);
+
+    mMediaDrm.setPropertyString("privacyMode", "enable");
+    mMediaDrm.setPropertyString("sessionSharing", "enable");
+    if (keySystem.equals("com.youtube.widevine.l3")
+        && mMediaDrm.getPropertyString("securityLevel") != "L3") {
+      mMediaDrm.setPropertyString("securityLevel", "L3");
+    }
   }
 
   /** Convert byte array to hex string for logging. */
@@ -491,17 +479,7 @@
       return;
     }
 
-    int requestType = MediaDrm.KeyRequest.REQUEST_TYPE_INITIAL;
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-      requestType = request.getRequestType();
-    } else {
-      // Prior to M, getRequestType() is not supported. Do our best guess here: Assume
-      // requests with a URL are renewals and all others are initial requests.
-      requestType =
-          request.getDefaultUrl().isEmpty()
-              ? MediaDrm.KeyRequest.REQUEST_TYPE_INITIAL
-              : MediaDrm.KeyRequest.REQUEST_TYPE_RENEWAL;
-    }
+    int requestType = request.getRequestType();
 
     nativeOnSessionMessage(
         mNativeMediaDrmBridge, ticket, sessionId, requestType, request.getData());
@@ -532,8 +510,7 @@
           mMediaDrm.getKeyRequest(
               sessionId, data, mime, MediaDrm.KEY_TYPE_STREAMING, optionalParameters);
     } catch (IllegalStateException e) {
-      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
-          && e instanceof android.media.MediaDrm.MediaDrmStateException) {
+      if (e instanceof android.media.MediaDrm.MediaDrmStateException) {
         Log.e(TAG, "MediaDrmStateException fired during getKeyRequest().", e);
       }
     }
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/storage/CobaltStorageLoader.java b/starboard/android/apk/app/src/main/java/dev/cobalt/storage/CobaltStorageLoader.java
index b94b5b8..4c3b3b4 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/storage/CobaltStorageLoader.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/storage/CobaltStorageLoader.java
@@ -29,9 +29,7 @@
 import java.io.IOException;
 import java.util.Arrays;
 
-/**
- * A class to load Cobalt storage from the file system.
- */
+/** A class to load Cobalt storage from the file system. */
 public class CobaltStorageLoader {
 
   private final File filesDir;
@@ -146,9 +144,7 @@
     fileObserver.setStorageObserver(storageObserver);
   }
 
-  /**
-   * Observer that is called when Cobalt storage changes.
-   */
+  /** Observer that is called when Cobalt storage changes. */
   public interface CobaltStorageObserver {
 
     /**
@@ -168,9 +164,7 @@
     private final File filesDir;
     private CobaltStorageObserver storageObserver = null;
 
-    /**
-     * Factory method to differentiate which constructor to use.
-     */
+    /** Factory method to differentiate which constructor to use. */
     static StorageFileObserver create(File filesDir) {
       if (Build.VERSION.SDK_INT >= 29) {
         return new StorageFileObserver(filesDir);
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/storage/README.md b/starboard/android/apk/app/src/main/java/dev/cobalt/storage/README.md
index 7938fc5..c5cae70 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/storage/README.md
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/storage/README.md
@@ -12,4 +12,3 @@
 to the StorageProto class:
 
 @SuppressWarnings("unchecked")
-
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/util/SystemPropertiesHelper.java b/starboard/android/apk/app/src/main/java/dev/cobalt/util/SystemPropertiesHelper.java
index 90448c8..24a8716 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/util/SystemPropertiesHelper.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/util/SystemPropertiesHelper.java
@@ -21,11 +21,13 @@
 /** Utility class for accessing system properties via reflection. */
 public class SystemPropertiesHelper {
   private static Method getStringMethod;
+
   static {
     try {
-      getStringMethod = ClassLoader.getSystemClassLoader()
-          .loadClass("android.os.SystemProperties")
-          .getMethod("get", String.class);
+      getStringMethod =
+          ClassLoader.getSystemClassLoader()
+              .loadClass("android.os.SystemProperties")
+              .getMethod("get", String.class);
       if (getStringMethod == null) {
         Log.e(TAG, "Couldn't load system properties getString");
       }
@@ -39,7 +41,7 @@
   public static String getString(String property) {
     if (getStringMethod != null) {
       try {
-        return (String) getStringMethod.invoke(null, new Object[] { property });
+        return (String) getStringMethod.invoke(null, new Object[] {property});
       } catch (Exception exception) {
         Log.e(TAG, "Exception getting system property: ", exception);
       }
diff --git a/starboard/android/apk/build.gradle b/starboard/android/apk/build.gradle
index 0860801..f03e58c 100644
--- a/starboard/android/apk/build.gradle
+++ b/starboard/android/apk/build.gradle
@@ -20,7 +20,7 @@
         mavenCentral()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:7.0.2'
+        classpath 'com.android.tools.build:gradle:7.4.2'
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
diff --git a/starboard/android/apk/gradle/wrapper/gradle-wrapper.properties b/starboard/android/apk/gradle/wrapper/gradle-wrapper.properties
index ffed3a2..31cca49 100644
--- a/starboard/android/apk/gradle/wrapper/gradle-wrapper.properties
+++ b/starboard/android/apk/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
diff --git a/starboard/android/arm/atomic_public.h b/starboard/android/arm/atomic_public.h
index 57fad75..5c9d632 100644
--- a/starboard/android/arm/atomic_public.h
+++ b/starboard/android/arm/atomic_public.h
@@ -12,4 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#ifndef STARBOARD_ANDROID_ARM_ATOMIC_PUBLIC_H_
+#define STARBOARD_ANDROID_ARM_ATOMIC_PUBLIC_H_
+
 #include "starboard/android/shared/atomic_public.h"
+
+#endif  // STARBOARD_ANDROID_ARM_ATOMIC_PUBLIC_H_
diff --git a/starboard/android/arm/configuration_public.h b/starboard/android/arm/configuration_public.h
index aa26c16..9135a90 100644
--- a/starboard/android/arm/configuration_public.h
+++ b/starboard/android/arm/configuration_public.h
@@ -19,4 +19,9 @@
 // Other source files should never include this header directly, but should
 // include the generic "starboard/configuration.h" instead.
 
+#ifndef STARBOARD_ANDROID_ARM_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_ANDROID_ARM_CONFIGURATION_PUBLIC_H_
+
 #include "starboard/android/shared/configuration_public.h"
+
+#endif  // STARBOARD_ANDROID_ARM_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/android/arm/toolchain/BUILD.gn b/starboard/android/arm/toolchain/BUILD.gn
index b49df51..6b167d1 100644
--- a/starboard/android/arm/toolchain/BUILD.gn
+++ b/starboard/android/arm/toolchain/BUILD.gn
@@ -21,7 +21,6 @@
   cc = "$prefix/armv7a-linux-androideabi${android_ndk_api_level}-clang"
   cxx = "$prefix/armv7a-linux-androideabi${android_ndk_api_level}-clang++"
   ld = cxx
-  ar = "$prefix/arm-linux-androideabi-readelf"
   ar = "ar"
   nm = "nm"
 
@@ -35,7 +34,6 @@
   cc = "$prefix/armv7a-linux-androideabi${android_ndk_api_level}-clang"
   cxx = "$prefix/armv7a-linux-androideabi${android_ndk_api_level}-clang++"
   ld = cxx
-  ar = "$prefix/arm-linux-androideabi-readelf"
   ar = "ar"
   nm = "nm"
 
diff --git a/starboard/android/arm64/atomic_public.h b/starboard/android/arm64/atomic_public.h
index 57fad75..f34db48 100644
--- a/starboard/android/arm64/atomic_public.h
+++ b/starboard/android/arm64/atomic_public.h
@@ -12,4 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#ifndef STARBOARD_ANDROID_ARM64_ATOMIC_PUBLIC_H_
+#define STARBOARD_ANDROID_ARM64_ATOMIC_PUBLIC_H_
+
 #include "starboard/android/shared/atomic_public.h"
+
+#endif  // STARBOARD_ANDROID_ARM64_ATOMIC_PUBLIC_H_
diff --git a/starboard/android/arm64/configuration_public.h b/starboard/android/arm64/configuration_public.h
index 52f31dc..6625801 100644
--- a/starboard/android/arm64/configuration_public.h
+++ b/starboard/android/arm64/configuration_public.h
@@ -19,4 +19,9 @@
 // Other source files should never include this header directly, but should
 // include the generic "starboard/configuration.h" instead.
 
+#ifndef STARBOARD_ANDROID_ARM64_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_ANDROID_ARM64_CONFIGURATION_PUBLIC_H_
+
 #include "starboard/android/shared/configuration_public.h"
+
+#endif  // STARBOARD_ANDROID_ARM64_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/android/shared/BUILD.gn b/starboard/android/shared/BUILD.gn
index d8a79e3..efa39d5 100644
--- a/starboard/android/shared/BUILD.gn
+++ b/starboard/android/shared/BUILD.gn
@@ -52,7 +52,6 @@
 
 static_library("starboard_platform") {
   sources = [
-    "$target_gen_dir/ndk-sources/cpu-features.c",
     "//starboard/shared/egl/system_egl.cc",
     "//starboard/shared/gcc/atomic_gcc_public.h",
     "//starboard/shared/gles/gl_call.h",
@@ -427,7 +426,6 @@
 
   public_deps = [
     ":game_activity_sources",
-    ":ndk_sources",
     ":starboard_base_symbolize",
     "//starboard/common",
     "//starboard/shared/starboard/media:media_util",
@@ -466,8 +464,8 @@
 
 static_library("starboard_base_symbolize") {
   sources = [
-    "//base/third_party/symbolize/demangle.cc",
-    "//base/third_party/symbolize/symbolize.cc",
+    "//third_party/symbolize/demangle.cc",
+    "//third_party/symbolize/symbolize.cc",
   ]
 
   public_deps = [ "//starboard/elf_loader:evergreen_info" ]
@@ -478,8 +476,11 @@
 
   sources = media_tests_sources + player_tests_sources + [
               "//starboard/common/test_main.cc",
+              "//starboard/shared/starboard/drm/drm_test_helpers.cc",
+              "//starboard/shared/starboard/drm/drm_test_helpers.h",
               "jni_env_ext_test.cc",
               "model_year_test.cc",
+              "player_get_preferred_output_mode_test.cc",
             ]
 
   configs += [ "//starboard/build/config:starboard_implementation" ]
@@ -491,8 +492,3 @@
     "//testing/gtest",
   ]
 }
-
-copy("ndk_sources") {
-  sources = [ "$android_ndk_path/sources/android/cpufeatures/cpu-features.c" ]
-  outputs = [ "$target_gen_dir/ndk-sources/{{source_file_part}}" ]
-}
diff --git a/starboard/android/shared/android_main.cc b/starboard/android/shared/android_main.cc
index 272875b..dbdb8c0 100644
--- a/starboard/android/shared/android_main.cc
+++ b/starboard/android/shared/android_main.cc
@@ -17,6 +17,7 @@
 #include "starboard/android/shared/jni_env_ext.h"
 #include "starboard/android/shared/jni_utils.h"
 #include "starboard/android/shared/log_internal.h"
+#include "starboard/common/file.h"
 #include "starboard/common/semaphore.h"
 #include "starboard/common/string.h"
 #if SB_IS(EVERGREEN_COMPATIBLE)
@@ -137,6 +138,7 @@
       return false;
     }
     int wrote = SbFileWriteAll(dst_file, file_contents.c_str(), file_size);
+    RecordFileWriteStat(wrote);
     if (wrote == -1) {
       SB_LOG(WARNING) << "SbFileWriteAll failed for file=" << path_to_dst_file;
       return false;
diff --git a/starboard/android/shared/android_media_session_client.cc b/starboard/android/shared/android_media_session_client.cc
index c0986b8..22ade7d 100644
--- a/starboard/android/shared/android_media_session_client.cc
+++ b/starboard/android/shared/android_media_session_client.cc
@@ -14,7 +14,6 @@
 
 #include "starboard/android/shared/android_media_session_client.h"
 
-#include "base/time/time.h"  // nogncheck
 #include "starboard/android/shared/jni_env_ext.h"
 #include "starboard/android/shared/jni_utils.h"
 #include "starboard/common/log.h"
diff --git a/starboard/android/shared/audio_renderer_passthrough.cc b/starboard/android/shared/audio_renderer_passthrough.cc
index c43fac3..610baaa 100644
--- a/starboard/android/shared/audio_renderer_passthrough.cc
+++ b/starboard/android/shared/audio_renderer_passthrough.cc
@@ -282,6 +282,7 @@
   stop_called_ = false;
   playback_head_position_when_stopped_ = 0;
   stopped_at_ = 0;
+  first_audio_timestamp_ = -1;
   if (!seek_to_time_set) {
     seek_to_time_ = seek_to_time;
   }
@@ -312,9 +313,17 @@
     return seek_to_time_;
   }
 
+  SbTime audio_start_time;
+  if (first_audio_timestamp_ > -1) {
+    audio_start_time = first_audio_timestamp_;
+  } else {
+    audio_start_time = seek_to_time_;
+  }
+
+  SbTime playback_time;
   if (stop_called_) {
     // When AudioTrackBridge::Stop() is called, the playback will continue until
-    // all the frames written are played, as the AudioTrack in created in
+    // all the frames written are played, as the AudioTrack is created in
     // MODE_STREAM.
     auto now = SbTimeGetMonotonicNow();
     SB_DCHECK(now >= stopped_at_);
@@ -324,8 +333,10 @@
     int64_t total_frames_played =
         frames_played + playback_head_position_when_stopped_;
     total_frames_played = std::min(total_frames_played, total_frames_written_);
-    return seek_to_time_ + total_frames_played * kSbTimeSecond /
+    playback_time =
+        audio_start_time + total_frames_played * kSbTimeSecond /
                                audio_stream_info_.samples_per_second;
+    return std::max(playback_time, seek_to_time_);
   }
 
   SbTime updated_at;
@@ -334,14 +345,13 @@
   if (playback_head_position <= 0) {
     // The playback is warming up, don't adjust the media time by the monotonic
     // system time.
-    return seek_to_time_;
+    return std::max(audio_start_time, seek_to_time_);
   }
 
   // TODO: This may cause time regression, because the unadjusted time will be
   //       returned on pause, after an adjusted time has been returned.
-  SbTime playback_time =
-      seek_to_time_ + playback_head_position * kSbTimeSecond /
-                          audio_stream_info_.samples_per_second;
+  playback_time = audio_start_time + playback_head_position * kSbTimeSecond /
+                                         audio_stream_info_.samples_per_second;
 
   // When underlying AudioTrack is paused, we use returned playback time
   // directly. Note that we should not use |paused_| or |playback_rate_| here.
@@ -352,7 +362,7 @@
   // before calling AudioTrack.Play(), the returned playback time and last frame
   // consumed time would be the same as at when we pause the video.
   if (audio_track_paused_) {
-    return playback_time;
+    return std::max(playback_time, seek_to_time_);
   }
 
   // TODO: Cap this to the maximum frames written to the AudioTrack.
@@ -366,7 +376,7 @@
 
   playback_time += std::max<SbTime>(now - updated_at, 0);
 
-  return playback_time;
+  return std::max(playback_time, seek_to_time_);
 }
 
 void AudioRendererPassthrough::CreateAudioTrackAndStartProcessing() {
@@ -542,6 +552,11 @@
         audio_track_bridge_->PauseAndFlush();
         return;
       }
+
+      if (first_audio_timestamp_ < 0) {
+        first_audio_timestamp_ = sync_time;
+      }
+
       decoded_audio_writing_offset_ += samples_written;
 
       if (decoded_audio_writing_offset_ ==
diff --git a/starboard/android/shared/audio_renderer_passthrough.h b/starboard/android/shared/audio_renderer_passthrough.h
index d4063df..7d9a1a3 100644
--- a/starboard/android/shared/audio_renderer_passthrough.h
+++ b/starboard/android/shared/audio_renderer_passthrough.h
@@ -130,6 +130,7 @@
   int64_t playback_head_position_when_stopped_ = 0;
   SbTimeMonotonic stopped_at_ = 0;
   SbTime seek_to_time_ = 0;
+  SbTime first_audio_timestamp_ = -1;
   double volume_ = 1.0;
   bool paused_ = true;
   double playback_rate_ = 1.0;
diff --git a/starboard/android/shared/cobalt/android_user_authorizer.cc b/starboard/android/shared/cobalt/android_user_authorizer.cc
index 9b19e75..a7515ec 100644
--- a/starboard/android/shared/cobalt/android_user_authorizer.cc
+++ b/starboard/android/shared/cobalt/android_user_authorizer.cc
@@ -21,11 +21,6 @@
 #include "starboard/android/shared/jni_utils.h"
 #include "starboard/common/log.h"
 
-// We're in starboard source, but compiled with Cobalt.
-#define STARBOARD_IMPLEMENTATION
-#include "starboard/shared/nouser/user_internal.h"
-#undef STARBOARD_IMPLEMENTATION
-
 namespace starboard {
 namespace android {
 namespace shared {
@@ -60,8 +55,7 @@
   env->CallVoidMethodOrAbort(j_user_authorizer_, "interrupt", "()V");
 }
 
-std::unique_ptr<AccessToken> AndroidUserAuthorizer::AuthorizeUser(SbUser user) {
-  SB_DCHECK(user == &::starboard::shared::nouser::g_user);
+std::unique_ptr<AccessToken> AndroidUserAuthorizer::AuthorizeUser() {
   if (shutdown_) {
     DLOG(WARNING) << "No-op AuthorizeUser after shutdown";
     return std::unique_ptr<AccessToken>();
@@ -73,8 +67,7 @@
   return CreateAccessToken(j_token.Get());
 }
 
-bool AndroidUserAuthorizer::DeauthorizeUser(SbUser user) {
-  SB_DCHECK(user == &::starboard::shared::nouser::g_user);
+bool AndroidUserAuthorizer::DeauthorizeUser() {
   if (shutdown_) {
     DLOG(WARNING) << "No-op DeauthorizeUser after shutdown";
     return false;
@@ -84,9 +77,7 @@
                                        "()Z");
 }
 
-std::unique_ptr<AccessToken> AndroidUserAuthorizer::RefreshAuthorization(
-    SbUser user) {
-  SB_DCHECK(user == &::starboard::shared::nouser::g_user);
+std::unique_ptr<AccessToken> AndroidUserAuthorizer::RefreshAuthorization() {
   if (shutdown_) {
     DLOG(WARNING) << "No-op RefreshAuthorization after shutdown";
     return std::unique_ptr<AccessToken>();
diff --git a/starboard/android/shared/cobalt/android_user_authorizer.h b/starboard/android/shared/cobalt/android_user_authorizer.h
index a9ae0c9..9f8d2ba 100644
--- a/starboard/android/shared/cobalt/android_user_authorizer.h
+++ b/starboard/android/shared/cobalt/android_user_authorizer.h
@@ -15,6 +15,8 @@
 #ifndef STARBOARD_ANDROID_SHARED_COBALT_ANDROID_USER_AUTHORIZER_H_
 #define STARBOARD_ANDROID_SHARED_COBALT_ANDROID_USER_AUTHORIZER_H_
 
+#include <memory>
+
 #include "cobalt/account/user_authorizer.h"
 
 #include "starboard/android/shared/jni_env_ext.h"
@@ -26,10 +28,7 @@
 
 using ::cobalt::account::AccessToken;
 
-// Android implementation of UserAuthorizer, using the single 'nouser' SbUser to
-// represent the Android platform running our app.  Unlike game consoles which
-// launch the app as a particular platform user, Android always launches the app
-// as the same platform "user" no matter what accounts may be on the device.
+// Android implementation of UserAuthorizer.
 //
 // Signing-in is a higher-level concept that is implemented by the Android app
 // using the Android AccountManager and/or Google Play Services to select an
@@ -42,9 +41,9 @@
   AndroidUserAuthorizer();
   ~AndroidUserAuthorizer() override;
 
-  std::unique_ptr<AccessToken> AuthorizeUser(SbUser user) override;
-  bool DeauthorizeUser(SbUser user) override;
-  std::unique_ptr<AccessToken> RefreshAuthorization(SbUser user) override;
+  std::unique_ptr<AccessToken> AuthorizeUser() override;
+  bool DeauthorizeUser() override;
+  std::unique_ptr<AccessToken> RefreshAuthorization() override;
   void Shutdown() override;
 
  private:
diff --git a/starboard/android/shared/decode_target_create.cc b/starboard/android/shared/decode_target_create.cc
index f54f90b..9773b93 100644
--- a/starboard/android/shared/decode_target_create.cc
+++ b/starboard/android/shared/decode_target_create.cc
@@ -138,8 +138,7 @@
   params.format = format;
   params.decode_target_out = kSbDecodeTargetInvalid;
 
-  SbDecodeTargetRunInGlesContext(
-      provider, &CreateWithContextRunner, &params);
+  SbDecodeTargetRunInGlesContext(provider, &CreateWithContextRunner, &params);
   return params.decode_target_out;
 }
 
diff --git a/starboard/android/shared/decode_target_internal.h b/starboard/android/shared/decode_target_internal.h
index 953840a..512b7ee 100644
--- a/starboard/android/shared/decode_target_internal.h
+++ b/starboard/android/shared/decode_target_internal.h
@@ -15,8 +15,8 @@
 #ifndef STARBOARD_ANDROID_SHARED_DECODE_TARGET_INTERNAL_H_
 #define STARBOARD_ANDROID_SHARED_DECODE_TARGET_INTERNAL_H_
 
-#include <android/native_window.h>
 #include <GLES2/gl2.h>
+#include <android/native_window.h>
 #include <jni.h>
 
 #include "starboard/common/ref_counted.h"
diff --git a/starboard/android/shared/directory_get_next.cc b/starboard/android/shared/directory_get_next.cc
index 2dfc5a0..cc78151 100644
--- a/starboard/android/shared/directory_get_next.cc
+++ b/starboard/android/shared/directory_get_next.cc
@@ -12,11 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/common/string.h"
-#include "starboard/directory.h"
+#include <string.h>
 
 #include <android/asset_manager.h>
-#include <string.h>
+
+#include "starboard/common/string.h"
+#include "starboard/directory.h"
 
 #include "starboard/android/shared/directory_internal.h"
 #include "starboard/configuration_constants.h"
diff --git a/starboard/android/shared/egl_swap_buffers.cc b/starboard/android/shared/egl_swap_buffers.cc
index e1567f8..ed9d8fc 100644
--- a/starboard/android/shared/egl_swap_buffers.cc
+++ b/starboard/android/shared/egl_swap_buffers.cc
@@ -22,8 +22,8 @@
 EGLBoolean __real_eglSwapBuffers(EGLDisplay dpy, EGLSurface surface);
 
 // This needs to be exported to ensure shared_library targets include it.
-SB_EXPORT_PLATFORM EGLBoolean __wrap_eglSwapBuffers(
-    EGLDisplay dpy, EGLSurface surface) {
+SB_EXPORT_PLATFORM EGLBoolean __wrap_eglSwapBuffers(EGLDisplay dpy,
+                                                    EGLSurface surface) {
   // Kick off the GPU while waiting for new player bounds to take effect.
   GL_CALL(glFlush());
 
@@ -40,5 +40,4 @@
 
   return __real_eglSwapBuffers(dpy, surface);
 }
-
 }
diff --git a/starboard/android/shared/file_internal.cc b/starboard/android/shared/file_internal.cc
index 06b10b9..607e9f4 100644
--- a/starboard/android/shared/file_internal.cc
+++ b/starboard/android/shared/file_internal.cc
@@ -55,25 +55,22 @@
 
   SB_DCHECK(g_java_asset_manager == NULL);
   SB_DCHECK(g_asset_manager == NULL);
-  ScopedLocalJavaRef<jstring> j_app(
-      env->CallStarboardObjectMethodOrAbort(
-          "getApplicationContext", "()Landroid/content/Context;"));
-  g_java_asset_manager = env->ConvertLocalRefToGlobalRef(
-      env->CallObjectMethodOrAbort(j_app.Get(),
-          "getAssets", "()Landroid/content/res/AssetManager;"));
+  ScopedLocalJavaRef<jstring> j_app(env->CallStarboardObjectMethodOrAbort(
+      "getApplicationContext", "()Landroid/content/Context;"));
+  g_java_asset_manager =
+      env->ConvertLocalRefToGlobalRef(env->CallObjectMethodOrAbort(
+          j_app.Get(), "getAssets", "()Landroid/content/res/AssetManager;"));
   g_asset_manager = AAssetManager_fromJava(env, g_java_asset_manager);
 
   SB_DCHECK(g_app_files_dir == NULL);
-  ScopedLocalJavaRef<jstring> j_string(
-      env->CallStarboardObjectMethodOrAbort("getFilesAbsolutePath",
-                                           "()Ljava/lang/String;"));
+  ScopedLocalJavaRef<jstring> j_string(env->CallStarboardObjectMethodOrAbort(
+      "getFilesAbsolutePath", "()Ljava/lang/String;"));
   g_app_files_dir = DuplicateJavaString(env, j_string.Get());
   SB_DLOG(INFO) << "Files dir: " << g_app_files_dir;
 
   SB_DCHECK(g_app_cache_dir == NULL);
-  j_string.Reset(
-      env->CallStarboardObjectMethodOrAbort("getCacheAbsolutePath",
-                                           "()Ljava/lang/String;"));
+  j_string.Reset(env->CallStarboardObjectMethodOrAbort("getCacheAbsolutePath",
+                                                       "()Ljava/lang/String;"));
   g_app_cache_dir = DuplicateJavaString(env, j_string.Get());
   SB_DLOG(INFO) << "Cache dir: " << g_app_cache_dir;
 
@@ -81,8 +78,8 @@
   ScopedLocalJavaRef<jobject> j_app_info(
       env->CallObjectMethodOrAbort(j_app.Get(), "getApplicationInfo",
                                    "()Landroid/content/pm/ApplicationInfo;"));
-  j_string.Reset(env->GetStringFieldOrAbort(j_app_info.Get(),
-                                            "nativeLibraryDir"));
+  j_string.Reset(
+      env->GetStringFieldOrAbort(j_app_info.Get(), "nativeLibraryDir"));
   g_app_lib_dir = DuplicateJavaString(env, j_string.Get());
   SB_DLOG(INFO) << "Lib dir: " << g_app_lib_dir;
 }
@@ -109,9 +106,8 @@
 
 bool IsAndroidAssetPath(const char* path) {
   size_t prefix_len = strlen(g_app_assets_dir);
-  return path != NULL
-      && strncmp(g_app_assets_dir, path, prefix_len) == 0
-      && (path[prefix_len] == '/' || path[prefix_len] == '\0');
+  return path != NULL && strncmp(g_app_assets_dir, path, prefix_len) == 0 &&
+         (path[prefix_len] == '/' || path[prefix_len] == '\0');
 }
 
 AAsset* OpenAndroidAsset(const char* path) {
diff --git a/starboard/android/shared/jni_env_ext_test.cc b/starboard/android/shared/jni_env_ext_test.cc
index 4c69b95..8b66e19 100644
--- a/starboard/android/shared/jni_env_ext_test.cc
+++ b/starboard/android/shared/jni_env_ext_test.cc
@@ -49,8 +49,8 @@
 
   EXPECT_EQ(kU16Length, env->GetStringLength(j_str));
   const jchar* u16_chars = env->GetStringChars(j_str, NULL);
-  std::u16string u16_string(
-      reinterpret_cast<const char16_t*>(u16_chars), kU16Length);
+  std::u16string u16_string(reinterpret_cast<const char16_t*>(u16_chars),
+                            kU16Length);
   EXPECT_EQ(std::u16string(kU16), u16_string);
   env->ReleaseStringChars(j_str, u16_chars);
 }
@@ -61,8 +61,8 @@
 
   EXPECT_EQ(kU16Length, env->GetStringLength(j_str));
   const jchar* u16_chars = env->GetStringChars(j_str, NULL);
-  std::u16string u16_string(
-      reinterpret_cast<const char16_t*>(u16_chars), kU16Length);
+  std::u16string u16_string(reinterpret_cast<const char16_t*>(u16_chars),
+                            kU16Length);
   EXPECT_EQ(std::u16string(kU16), u16_string);
   env->ReleaseStringChars(j_str, u16_chars);
 }
diff --git a/starboard/android/shared/launcher.py b/starboard/android/shared/launcher.py
index ead7a0d..3f2b272 100644
--- a/starboard/android/shared/launcher.py
+++ b/starboard/android/shared/launcher.py
@@ -148,10 +148,11 @@
     # Verify connection and dump target build fingerprint.
     self._CheckCallAdb('shell', 'getprop', 'ro.build.fingerprint')
 
-    out_directory = os.path.split(self.GetTargetPath())[0]
-    self.apk_path = os.path.join(out_directory, f'{target_name}.apk')
-    if not os.path.exists(self.apk_path):
-      raise Exception(f"Can't find APK {self.apk_path}")
+    if abstract_launcher.ARG_NOINSTALL not in self.launcher_args:
+      out_directory = os.path.split(self.GetTargetPath())[0]
+      self.apk_path = os.path.join(out_directory, f'{target_name}.apk')
+      if not os.path.exists(self.apk_path):
+        raise ValueError(f"Can't find APK {self.apk_path}")
 
     # This flag is set when the main Run() loop exits.  If Kill() is called
     # after this flag is set, it will not do anything.
@@ -161,6 +162,10 @@
     # on.
     self.local_port = None
 
+    # Keep track of the port used by ADB reverse in order to remove it later
+    # on.
+    self.web_server_port = None
+
   def _IsValidIPv4Address(self, address):
     """Returns True if address is a valid IPv4 address, False otherwise."""
     try:
@@ -384,6 +389,8 @@
         self._Shutdown()
       if self.local_port is not None:
         self.CallAdb('forward', '--remove', f'tcp:{self.local_port}')
+      if self.web_server_port is not None:
+        self.RemoveDeviceToHostTunnel(self.web_server_port)
       am_monitor.Shutdown()
       self.killed.set()
       run_timer.Stop()
@@ -444,6 +451,24 @@
     # pylint: disable=g-socket-gethostbyname
     return socket.gethostbyname('localhost'), self.local_port
 
+  def CreateDeviceToHostTunnel(self, host_port, device_port):
+    self.web_server_port = host_port
+    reverse_p = self._PopenAdb(
+        'reverse',
+        f'tcp:{device_port}',
+        f'tcp:{host_port}',
+        stdout=subprocess.PIPE)
+    reverse_p.wait()
+    sys.stderr.write(f'ADB reverse host port {host_port} '
+                     f'=> device port {device_port}\n')
+    return True
+
+  def RemoveDeviceToHostTunnel(self, host_port):
+    reverse_p = self._PopenAdb(
+        'reverse --remove ', f'tcp:{host_port}', stdout=subprocess.PIPE)
+    reverse_p.wait()
+    sys.stderr.write(f'ADB reverse --remove tcp:{host_port}\n')
+
   def GetDeviceIp(self):
     """Gets the device IP. TODO: Implement."""
     return None
diff --git a/starboard/android/shared/log_flush.cc b/starboard/android/shared/log_flush.cc
index 382dde9..519c31e 100644
--- a/starboard/android/shared/log_flush.cc
+++ b/starboard/android/shared/log_flush.cc
@@ -17,5 +17,4 @@
 #include <stdio.h>
 #include <unistd.h>
 
-void SbLogFlush() {
-}
+void SbLogFlush() {}
diff --git a/starboard/android/shared/media_codec_bridge.cc b/starboard/android/shared/media_codec_bridge.cc
index 298ea0c..fe97038 100644
--- a/starboard/android/shared/media_codec_bridge.cc
+++ b/starboard/android/shared/media_codec_bridge.cc
@@ -215,8 +215,8 @@
 // static
 scoped_ptr<MediaCodecBridge> MediaCodecBridge::CreateVideoMediaCodecBridge(
     SbMediaVideoCodec video_codec,
-    int width,
-    int height,
+    int width_hint,
+    int height_hint,
     int fps,
     optional<int> max_width,
     optional<int> max_height,
@@ -322,9 +322,10 @@
       "Ldev/cobalt/media/MediaCodecBridge$CreateMediaCodecBridgeResult;)"
       "V",
       reinterpret_cast<jlong>(native_media_codec_bridge.get()), j_mime.Get(),
-      j_decoder_name.Get(), width, height, fps, max_width.value_or(-1),
-      max_height.value_or(-1), j_surface, j_media_crypto, j_color_info.Get(),
-      tunnel_mode_audio_session_id, j_create_media_codec_bridge_result.Get());
+      j_decoder_name.Get(), width_hint, height_hint, fps,
+      max_width.value_or(-1), max_height.value_or(-1), j_surface,
+      j_media_crypto, j_color_info.Get(), tunnel_mode_audio_session_id,
+      j_create_media_codec_bridge_result.Get());
 
   jobject j_media_codec_bridge = env->CallObjectMethodOrAbort(
       j_create_media_codec_bridge_result.Get(), "mediaCodecBridge",
@@ -451,16 +452,25 @@
                                                 "()I");
 }
 
-SurfaceDimensions MediaCodecBridge::GetOutputDimensions() {
+FrameSize MediaCodecBridge::GetOutputSize() {
   JniEnvExt* env = JniEnvExt::Get();
   env->CallVoidMethodOrAbort(
       j_media_codec_bridge_, "getOutputFormat",
       "(Ldev/cobalt/media/MediaCodecBridge$GetOutputFormatResult;)V",
       j_reused_get_output_format_result_);
-  return {env->CallIntMethodOrAbort(j_reused_get_output_format_result_, "width",
-                                    "()I"),
-          env->CallIntMethodOrAbort(j_reused_get_output_format_result_,
-                                    "height", "()I")};
+
+  auto call_int_method = [env, this](const char* name) {
+    return env->CallIntMethodOrAbort(j_reused_get_output_format_result_, name,
+                                     "()I");
+  };
+
+  FrameSize size = {
+      call_int_method("textureWidth"), call_int_method("textureHeight"),
+      call_int_method("cropLeft"),     call_int_method("cropTop"),
+      call_int_method("cropRight"),    call_int_method("cropBottom")};
+
+  size.DCheckValid();
+  return size;
 }
 
 AudioOutputFormatResult MediaCodecBridge::GetAudioOutputFormat() {
diff --git a/starboard/android/shared/media_codec_bridge.h b/starboard/android/shared/media_codec_bridge.h
index 1490b75..bf395d5 100644
--- a/starboard/android/shared/media_codec_bridge.h
+++ b/starboard/android/shared/media_codec_bridge.h
@@ -63,9 +63,53 @@
   jint num_bytes;
 };
 
-struct SurfaceDimensions {
-  jint width;
-  jint height;
+struct FrameSize {
+  jint texture_width;
+  jint texture_height;
+
+  // Crop values can be set to -1 when they are not provided by the platform
+  jint crop_left = -1;
+  jint crop_top = -1;
+  jint crop_right = -1;
+  jint crop_bottom = -1;
+
+  bool has_crop_values() const {
+    return crop_left >= 0 && crop_top >= 0 && crop_right >= 0 &&
+           crop_bottom >= 0;
+  }
+
+  jint display_width() const {
+    if (has_crop_values()) {
+      return crop_right - crop_left + 1;
+    }
+
+    return texture_width;
+  }
+
+  jint display_height() const {
+    if (has_crop_values()) {
+      return crop_bottom - crop_top + 1;
+    }
+
+    return texture_height;
+  }
+
+  void DCheckValid() const {
+    SB_DCHECK(texture_width >= 0) << texture_width;
+    SB_DCHECK(texture_height >= 0) << texture_height;
+
+    if (crop_left >= 0 || crop_top >= 0 || crop_right >= 0 ||
+        crop_bottom >= 0) {
+      // If there is at least one crop value set, all of them should be set.
+      SB_DCHECK(crop_left >= 0) << crop_left;
+      SB_DCHECK(crop_top >= 0) << crop_top;
+      SB_DCHECK(crop_right >= 0) << crop_right;
+      SB_DCHECK(crop_bottom >= 0) << crop_bottom;
+      SB_DCHECK(has_crop_values());
+      SB_DCHECK(display_width() >= 0) << display_width();
+      SB_DCHECK(display_height() >= 0) << display_height();
+    }
+  }
 };
 
 struct AudioOutputFormatResult {
@@ -113,8 +157,11 @@
   // them without the other), which will be checked in the function.
   static scoped_ptr<MediaCodecBridge> CreateVideoMediaCodecBridge(
       SbMediaVideoCodec video_codec,
-      int width,
-      int height,
+      // `width_hint` and `height_hint` are used to create the Android video
+      // format, which don't have to be directly related to the resolution of
+      // the video.
+      int width_hint,
+      int height_hint,
       int fps,
       optional<int> max_width,
       optional<int> max_height,
@@ -152,7 +199,7 @@
 
   void SetPlaybackRate(double playback_rate);
   jint Flush();
-  SurfaceDimensions GetOutputDimensions();
+  FrameSize GetOutputSize();
   AudioOutputFormatResult GetAudioOutputFormat();
 
   void OnMediaCodecError(bool is_recoverable,
diff --git a/starboard/android/shared/media_decoder.cc b/starboard/android/shared/media_decoder.cc
index a44acf8..721680e 100644
--- a/starboard/android/shared/media_decoder.cc
+++ b/starboard/android/shared/media_decoder.cc
@@ -60,7 +60,7 @@
     case MEDIA_CODEC_ERROR:
       return "MEDIA_CODEC_ERROR";
     default:
-      SB_NOTREACHED();
+      SB_NOTREACHED() << "Unknown status value: " << status;
       return "MEDIA_CODEC_ERROR_UNKNOWN";
   }
 }
@@ -103,8 +103,8 @@
 
 MediaDecoder::MediaDecoder(Host* host,
                            SbMediaVideoCodec video_codec,
-                           int width,
-                           int height,
+                           int width_hint,
+                           int height_hint,
                            optional<int> max_width,
                            optional<int> max_height,
                            int fps,
@@ -130,7 +130,7 @@
       drm_system_ && drm_system_->require_secured_decoder();
   SB_DCHECK(!drm_system_ || j_media_crypto);
   media_codec_bridge_ = MediaCodecBridge::CreateVideoMediaCodecBridge(
-      video_codec, width, height, fps, max_width, max_height, this,
+      video_codec, width_hint, height_hint, fps, max_width, max_height, this,
       j_output_surface, j_media_crypto, color_metadata, require_secured_decoder,
       require_software_codec, tunnel_mode_audio_session_id,
       force_big_endian_hdr_metadata, force_improved_support_check,
diff --git a/starboard/android/shared/media_decoder.h b/starboard/android/shared/media_decoder.h
index 350e611..7c7a2eb 100644
--- a/starboard/android/shared/media_decoder.h
+++ b/starboard/android/shared/media_decoder.h
@@ -82,8 +82,11 @@
                SbDrmSystem drm_system);
   MediaDecoder(Host* host,
                SbMediaVideoCodec video_codec,
-               int width,
-               int height,
+               // `width_hint` and `height_hint` are used to create the Android
+               // video format, which don't have to be directly related to the
+               // resolution of the video.
+               int width_hint,
+               int height_hint,
                optional<int> max_width,
                optional<int> max_height,
                int fps,
diff --git a/starboard/android/shared/media_get_audio_configuration.cc b/starboard/android/shared/media_get_audio_configuration.cc
index 7bcfddd..dbd658f 100644
--- a/starboard/android/shared/media_get_audio_configuration.cc
+++ b/starboard/android/shared/media_get_audio_configuration.cc
@@ -14,32 +14,173 @@
 
 #include "starboard/media.h"
 
+#include "starboard/android/shared/jni_env_ext.h"
+#include "starboard/android/shared/jni_utils.h"
 #include "starboard/android/shared/media_capabilities_cache.h"
 
-using starboard::android::shared::MediaCapabilitiesCache;
+// Constants for output types from
+// https://developer.android.com/reference/android/media/AudioDeviceInfo.
+constexpr int TYPE_AUX_LINE = 19;
+constexpr int TYPE_BLE_BROADCAST = 30;
+constexpr int TYPE_BLE_HEADSET = 26;
+constexpr int TYPE_BLE_SPEAKER = 27;
+constexpr int TYPE_BLUETOOTH_A2DP = 8;
+constexpr int TYPE_BLUETOOTH_SCO = 7;
+constexpr int TYPE_BUILTIN_EARPIECE = 1;
+constexpr int TYPE_BUILTIN_MIC = 15;
+constexpr int TYPE_BUILTIN_SPEAKER = 2;
+constexpr int TYPE_BUILTIN_SPEAKER_SAFE = 24;
+constexpr int TYPE_BUS = 21;
+constexpr int TYPE_DOCK = 13;
+constexpr int TYPE_DOCK_ANALOG = 31;
+constexpr int TYPE_FM = 14;
+constexpr int TYPE_FM_TUNER = 16;
+constexpr int TYPE_HDMI = 9;
+constexpr int TYPE_HDMI_ARC = 10;
+constexpr int TYPE_HDMI_EARC = 29;
+constexpr int TYPE_HEARING_AID = 23;
+constexpr int TYPE_IP = 20;
+constexpr int TYPE_LINE_ANALOG = 5;
+constexpr int TYPE_LINE_DIGITAL = 6;
+constexpr int TYPE_REMOTE_SUBMIX = 25;
+constexpr int TYPE_TELEPHONY = 18;
+constexpr int TYPE_TV_TUNER = 17;
+constexpr int TYPE_UNKNOWN = 0;
+constexpr int TYPE_USB_ACCESSORY = 12;
+constexpr int TYPE_USB_DEVICE = 11;
+constexpr int TYPE_USB_HEADSET = 22;
+constexpr int TYPE_WIRED_HEADPHONES = 4;
+constexpr int TYPE_WIRED_HEADSET = 3;
 
+SbMediaAudioConnector GetConnectorFromAndroidOutputType(
+    int android_output_device_type) {
+  switch (android_output_device_type) {
+    case TYPE_AUX_LINE:
+      return kSbMediaAudioConnectorAnalog;
+    case TYPE_BLE_BROADCAST:
+      return kSbMediaAudioConnectorBluetooth;
+    case TYPE_BLE_HEADSET:
+      return kSbMediaAudioConnectorBluetooth;
+    case TYPE_BLE_SPEAKER:
+      return kSbMediaAudioConnectorBluetooth;
+    case TYPE_BLUETOOTH_A2DP:
+      return kSbMediaAudioConnectorBluetooth;
+    case TYPE_BLUETOOTH_SCO:
+      return kSbMediaAudioConnectorBluetooth;
+    case TYPE_BUILTIN_EARPIECE:
+      return kSbMediaAudioConnectorBuiltIn;
+    case TYPE_BUILTIN_MIC:
+      return kSbMediaAudioConnectorBuiltIn;
+    case TYPE_BUILTIN_SPEAKER:
+      return kSbMediaAudioConnectorBuiltIn;
+    case TYPE_BUILTIN_SPEAKER_SAFE:
+      return kSbMediaAudioConnectorBuiltIn;
+    case TYPE_BUS:
+      return kSbMediaAudioConnectorUnknown;
+    case TYPE_DOCK:
+      return kSbMediaAudioConnectorUnknown;
+    case TYPE_DOCK_ANALOG:
+      return kSbMediaAudioConnectorAnalog;
+    case TYPE_FM:
+      return kSbMediaAudioConnectorUnknown;
+    case TYPE_FM_TUNER:
+      return kSbMediaAudioConnectorUnknown;
+    case TYPE_HDMI:
+      return kSbMediaAudioConnectorHdmi;
+    case TYPE_HDMI_ARC:
+      return kSbMediaAudioConnectorHdmi;
+    case TYPE_HDMI_EARC:
+      return kSbMediaAudioConnectorHdmi;
+    case TYPE_HEARING_AID:
+      return kSbMediaAudioConnectorUnknown;
+    case TYPE_IP:
+      return kSbMediaAudioConnectorRemoteWired;
+    case TYPE_LINE_ANALOG:
+      return kSbMediaAudioConnectorAnalog;
+    case TYPE_LINE_DIGITAL:
+      return kSbMediaAudioConnectorUnknown;
+    case TYPE_REMOTE_SUBMIX:
+      return kSbMediaAudioConnectorRemoteOther;
+    case TYPE_TELEPHONY:
+      return kSbMediaAudioConnectorUnknown;
+    case TYPE_TV_TUNER:
+      return kSbMediaAudioConnectorUnknown;
+    case TYPE_UNKNOWN:
+      return kSbMediaAudioConnectorUnknown;
+    case TYPE_USB_ACCESSORY:
+      return kSbMediaAudioConnectorUsb;
+    case TYPE_USB_DEVICE:
+      return kSbMediaAudioConnectorUsb;
+    case TYPE_USB_HEADSET:
+      return kSbMediaAudioConnectorUsb;
+    case TYPE_WIRED_HEADPHONES:
+      return kSbMediaAudioConnectorAnalog;
+    case TYPE_WIRED_HEADSET:
+      return kSbMediaAudioConnectorAnalog;
+  }
+
+  SB_LOG(WARNING) << "Encountered unknown audio output device type "
+                  << android_output_device_type;
+  return kSbMediaAudioConnectorUnknown;
+}
+
+// TODO(b/284140486): Refine the implementation so it works when the audio
+// outputs are changed during the query.
 bool SbMediaGetAudioConfiguration(
     int output_index,
     SbMediaAudioConfiguration* out_configuration) {
-  if (output_index != 0 || out_configuration == NULL) {
+  using starboard::android::shared::JniEnvExt;
+  using starboard::android::shared::MediaCapabilitiesCache;
+  using starboard::android::shared::ScopedLocalJavaRef;
+
+  if (output_index < 0 || out_configuration == NULL) {
     return false;
   }
 
   *out_configuration = {};
 
-  out_configuration->connector = kSbMediaAudioConnectorHdmi;
+  JniEnvExt* env = JniEnvExt::Get();
+  ScopedLocalJavaRef<jobject> j_audio_output_manager(
+      env->CallStarboardObjectMethodOrAbort(
+          "getAudioOutputManager", "()Ldev/cobalt/media/AudioOutputManager;"));
+  ScopedLocalJavaRef<jobject> j_output_device_info(env->NewObjectOrAbort(
+      "dev/cobalt/media/AudioOutputManager$OutputDeviceInfo", "()V"));
+
+  bool succeeded = env->CallBooleanMethodOrAbort(
+      j_audio_output_manager.Get(), "getOutputDeviceInfo",
+      "(ILdev/cobalt/media/AudioOutputManager$OutputDeviceInfo;)Z",
+      output_index, j_output_device_info.Get());
+
+  if (!succeeded) {
+    return false;
+  }
+
+  auto call_int_method = [env, &j_output_device_info](const char* name) {
+    return env->CallIntMethodOrAbort(j_output_device_info.Get(), name, "()I");
+  };
+
+  out_configuration->connector =
+      GetConnectorFromAndroidOutputType(call_int_method("getType"));
   out_configuration->latency = 0;
   out_configuration->coding_type = kSbMediaAudioCodingTypePcm;
+  out_configuration->number_of_channels = call_int_method("getChannels");
 
-  int channels =
-      MediaCapabilitiesCache::GetInstance()->GetMaxAudioOutputChannels();
-  if (channels < 2) {
-    SB_DLOG(WARNING)
-        << "The supported channels from output device is smaller than 2. "
-           "Fallback to 2 channels";
-    out_configuration->number_of_channels = 2;
+  if (out_configuration->connector == kSbMediaAudioConnectorHdmi) {
+    // Keep the previous logic for HDMI to reduce risk.
+    // TODO(b/284140486): Update this using same logic as other connectors.
+    int channels =
+        MediaCapabilitiesCache::GetInstance()->GetMaxAudioOutputChannels();
+    if (channels < 2) {
+      SB_LOG(WARNING)
+          << "The supported channels from output device is smaller than 2. "
+             "Fallback to 2 channels";
+      out_configuration->number_of_channels = 2;
+    } else {
+      out_configuration->number_of_channels = channels;
+    }
   } else {
-    out_configuration->number_of_channels = channels;
+    out_configuration->number_of_channels = 2;
   }
+
   return true;
 }
diff --git a/starboard/android/shared/platform_configuration/BUILD.gn b/starboard/android/shared/platform_configuration/BUILD.gn
index 5240ff6..3195db7 100644
--- a/starboard/android/shared/platform_configuration/BUILD.gn
+++ b/starboard/android/shared/platform_configuration/BUILD.gn
@@ -86,6 +86,7 @@
     "-fno-limit-debug-info",
     "-fcolor-diagnostics",
     "-fno-strict-aliasing",  # See http://crbug.com/32204
+    "-fno-delete-null-pointer-checks",  # see b/288107039
 
     # Default visibility is hidden to enable dead stripping.
     "-fvisibility=hidden",
diff --git a/starboard/android/shared/player_components_factory.h b/starboard/android/shared/player_components_factory.h
index eb85c45..18db0ba 100644
--- a/starboard/android/shared/player_components_factory.h
+++ b/starboard/android/shared/player_components_factory.h
@@ -515,8 +515,8 @@
     }
 
     scoped_ptr<VideoDecoder> video_decoder(new VideoDecoder(
-        creation_parameters.video_codec(), creation_parameters.drm_system(),
-        creation_parameters.output_mode(),
+        creation_parameters.video_stream_info(),
+        creation_parameters.drm_system(), creation_parameters.output_mode(),
         creation_parameters.decode_target_graphics_context_provider(),
         creation_parameters.max_video_capabilities(),
         tunnel_mode_audio_session_id, force_secure_pipeline_under_tunnel_mode,
diff --git a/starboard/android/shared/player_get_preferred_output_mode.cc b/starboard/android/shared/player_get_preferred_output_mode.cc
index 4639159..c7485e3 100644
--- a/starboard/android/shared/player_get_preferred_output_mode.cc
+++ b/starboard/android/shared/player_get_preferred_output_mode.cc
@@ -17,6 +17,7 @@
 #include <algorithm>
 
 #include "starboard/configuration.h"
+#include "starboard/shared/starboard/media/media_util.h"
 #include "starboard/shared/starboard/player/filter/player_components.h"
 #include "starboard/string.h"
 
@@ -64,35 +65,49 @@
   auto drm_system = creation_param->drm_system;
   auto max_video_capabilities = video_stream_info.max_video_capabilities;
 
-  // Sub players must use decode-to-texture on Android.
+  bool is_sdr = true;
+  if (codec != kSbMediaVideoCodecNone) {
+    const auto& color_metadata = video_stream_info.color_metadata;
+    is_sdr = starboard::shared::starboard::media::IsSDRVideo(
+        color_metadata.bits_per_channel, color_metadata.primaries,
+        color_metadata.transfer, color_metadata.matrix);
+  }
+
   if (max_video_capabilities && strlen(max_video_capabilities) > 0) {
+    // Sub players must use "decode-to-texture" on Android.
+    // Since hdr videos are not supported under "decode-to-texture" mode, reject
+    // it for sub players.
     if (PlayerComponents::Factory::OutputModeSupported(
-            kSbPlayerOutputModeDecodeToTexture, codec, drm_system)) {
+            kSbPlayerOutputModeDecodeToTexture, codec, drm_system) &&
+        is_sdr) {
       return kSbPlayerOutputModeDecodeToTexture;
     }
-    SB_NOTREACHED();
     return kSbPlayerOutputModeInvalid;
   }
 
-  // The main player may use any output mode.
-  SbPlayerOutputMode output_modes_to_check[] = {
-      kSbPlayerOutputModePunchOut,
-      kSbPlayerOutputModeDecodeToTexture,
-  };
+  SbPlayerOutputMode output_modes_to_check[2] = {kSbPlayerOutputModeInvalid,
+                                                 kSbPlayerOutputModeInvalid};
+  int number_of_output_modes_to_check = 2;
 
-  // Check |kSbPlayerOutputModeDecodeToTexture| first if the caller prefers it.
-  if (creation_param->output_mode == kSbPlayerOutputModeDecodeToTexture) {
-    std::swap(output_modes_to_check[0], output_modes_to_check[1]);
+  if (is_sdr) {
+    if (creation_param->output_mode == kSbPlayerOutputModeDecodeToTexture) {
+      output_modes_to_check[0] = kSbPlayerOutputModeDecodeToTexture;
+      output_modes_to_check[1] = kSbPlayerOutputModePunchOut;
+    } else {
+      output_modes_to_check[0] = kSbPlayerOutputModePunchOut;
+      output_modes_to_check[1] = kSbPlayerOutputModeDecodeToTexture;
+    }
+  } else {
+    // HDR videos require "punch-out".
+    output_modes_to_check[0] = kSbPlayerOutputModePunchOut;
+    number_of_output_modes_to_check = 1;
   }
 
-  if (PlayerComponents::Factory::OutputModeSupported(output_modes_to_check[0],
-                                                     codec, drm_system)) {
-    return output_modes_to_check[0];
-  }
-
-  if (PlayerComponents::Factory::OutputModeSupported(output_modes_to_check[1],
-                                                     codec, drm_system)) {
-    return output_modes_to_check[1];
+  for (int i = 0; i < number_of_output_modes_to_check; ++i) {
+    if (PlayerComponents::Factory::OutputModeSupported(output_modes_to_check[i],
+                                                       codec, drm_system)) {
+      return output_modes_to_check[i];
+    }
   }
 
   SB_LOG(WARNING) << "creation_param->video_stream_info.codec ("
diff --git a/starboard/android/shared/player_get_preferred_output_mode_test.cc b/starboard/android/shared/player_get_preferred_output_mode_test.cc
new file mode 100644
index 0000000..775d76c
--- /dev/null
+++ b/starboard/android/shared/player_get_preferred_output_mode_test.cc
@@ -0,0 +1,149 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <string>
+
+#include "starboard/drm.h"
+#include "starboard/media.h"
+#include "starboard/player.h"
+#include "starboard/shared/starboard/drm/drm_test_helpers.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+// The Android TV `SbPlayerGetPreferredOutputMode()` implementation has special
+// constraints that requires it own tests.
+
+namespace starboard {
+namespace android {
+namespace shared {
+namespace {
+
+using ::starboard::shared::starboard::drm::CreateDummyDrmSystem;
+
+SbPlayerCreationParam GetDefaultPlaybackParam() {
+  SbPlayerCreationParam creation_param = {
+      kSbDrmSystemInvalid,
+      {
+          kSbMediaAudioCodecAac,
+      },
+      {
+          kSbMediaVideoCodecVp9,
+      },
+  };
+
+  creation_param.audio_stream_info.mime = "";
+  creation_param.audio_stream_info.number_of_channels = 2;
+  creation_param.audio_stream_info.samples_per_second = 48000;
+  creation_param.audio_stream_info.bits_per_sample = 16;
+
+  auto& video_stream_info = creation_param.video_stream_info;
+
+  video_stream_info.mime = "";
+  video_stream_info.max_video_capabilities = "";
+  video_stream_info.frame_width = 640;
+  video_stream_info.frame_height = 480;
+
+  video_stream_info.color_metadata.bits_per_channel = 8;
+  video_stream_info.color_metadata.primaries = kSbMediaPrimaryIdBt709;
+  video_stream_info.color_metadata.transfer = kSbMediaTransferIdBt709;
+  video_stream_info.color_metadata.matrix = kSbMediaMatrixIdBt709;
+
+  return creation_param;
+}
+
+SbPlayerCreationParam GetSdrPlaybackParam() {
+  return GetDefaultPlaybackParam();
+}
+
+SbPlayerCreationParam GetHdrPlaybackParam() {
+  SbPlayerCreationParam creation_param = GetDefaultPlaybackParam();
+  auto& video_stream_info = creation_param.video_stream_info;
+
+  video_stream_info.color_metadata.bits_per_channel = 10;
+  video_stream_info.color_metadata.primaries = kSbMediaPrimaryIdBt2020;
+  video_stream_info.color_metadata.transfer = kSbMediaTransferId10BitBt2020;
+  video_stream_info.color_metadata.matrix =
+      kSbMediaMatrixIdBt2020ConstantLuminance;
+
+  return creation_param;
+}
+
+TEST(SbPlayerGetPreferredOutputModeTest, HdrPlaybackRequiresPunchOut) {
+  SbPlayerCreationParam creation_param = GetHdrPlaybackParam();
+
+  creation_param.output_mode = kSbPlayerOutputModeDecodeToTexture;
+  auto preferred_output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
+  EXPECT_EQ(preferred_output_mode, kSbPlayerOutputModePunchOut);
+}
+
+TEST(SbPlayerGetPreferredOutputModeTest,
+     SecondaryPlayerRequiresDecodeToTexture) {
+  SbPlayerCreationParam creation_param = GetSdrPlaybackParam();
+
+  creation_param.video_stream_info.max_video_capabilities =
+      "width=640; height=480";
+  creation_param.output_mode = kSbPlayerOutputModePunchOut;
+  auto preferred_output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
+  EXPECT_EQ(preferred_output_mode, kSbPlayerOutputModeDecodeToTexture);
+}
+
+TEST(SbPlayerGetPreferredOutputModeTest, SecondaryPlayerCannotBeHdr) {
+  SbPlayerCreationParam creation_param = GetHdrPlaybackParam();
+
+  creation_param.video_stream_info.max_video_capabilities =
+      "width=640; height=480";
+  creation_param.output_mode = kSbPlayerOutputModeDecodeToTexture;
+  auto preferred_output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
+  EXPECT_EQ(preferred_output_mode, kSbPlayerOutputModeInvalid);
+}
+
+TEST(SbPlayerGetPreferredOutputModeTest, SecuredDrmRequiresPunchOut) {
+  SbPlayerCreationParam creation_param = GetSdrPlaybackParam();
+
+  SbDrmSystem drm_system = CreateDummyDrmSystem("com.widevine");
+  ASSERT_TRUE(SbDrmSystemIsValid(drm_system));
+
+  creation_param.drm_system = drm_system;
+  creation_param.output_mode = kSbPlayerOutputModeDecodeToTexture;
+  auto preferred_output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
+  EXPECT_EQ(preferred_output_mode, kSbPlayerOutputModePunchOut);
+
+  SbDrmDestroySystem(drm_system);
+}
+
+TEST(SbPlayerGetPreferredOutputModeTest,
+     SecuredDrmWithDecodeToTextureIsInvalid) {
+  SbPlayerCreationParam creation_param = GetSdrPlaybackParam();
+
+  SbDrmSystem drm_system = CreateDummyDrmSystem("com.widevine");
+  ASSERT_TRUE(SbDrmSystemIsValid(drm_system));
+
+  creation_param.drm_system = drm_system;
+  creation_param.video_stream_info.max_video_capabilities =
+      "width=640; height=480";
+
+  creation_param.output_mode = kSbPlayerOutputModePunchOut;
+  auto preferred_output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
+  EXPECT_EQ(preferred_output_mode, kSbPlayerOutputModeInvalid);
+
+  creation_param.output_mode = kSbPlayerOutputModeDecodeToTexture;
+  preferred_output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
+  EXPECT_EQ(preferred_output_mode, kSbPlayerOutputModeInvalid);
+
+  SbDrmDestroySystem(drm_system);
+}
+
+}  // namespace
+}  // namespace shared
+}  // namespace android
+}  // namespace starboard
diff --git a/starboard/android/shared/sanitizer_options.cc b/starboard/android/shared/sanitizer_options.cc
index aafbc54..06cc5fb 100644
--- a/starboard/android/shared/sanitizer_options.cc
+++ b/starboard/android/shared/sanitizer_options.cc
@@ -21,15 +21,12 @@
 // libraries. To make the linker pick the strong replacements for those
 // functions from this module, we explicitly force its inclusion by passing
 // -Wl,-u_sanitizer_options_link_helper
-extern "C" void _sanitizer_options_link_helper() { }
+extern "C" void _sanitizer_options_link_helper() {}
 
-#define SANITIZER_HOOK_ATTRIBUTE          \
-  extern "C"                              \
-  __attribute__((no_sanitize_address))    \
-  __attribute__((no_sanitize_memory))     \
-  __attribute__((no_sanitize_thread))     \
-  __attribute__((visibility("default")))  \
-  __attribute__((weak))                   \
+#define SANITIZER_HOOK_ATTRIBUTE                                          \
+  extern "C" __attribute__((no_sanitize_address))                         \
+  __attribute__((no_sanitize_memory)) __attribute__((no_sanitize_thread)) \
+  __attribute__((visibility("default"))) __attribute__((weak))            \
   __attribute__((used))
 
 // Newline separated list of issues to suppress, see
diff --git a/starboard/android/shared/speech_synthesis_internal.cc b/starboard/android/shared/speech_synthesis_internal.cc
index 8b22256..653f8b9 100644
--- a/starboard/android/shared/speech_synthesis_internal.cc
+++ b/starboard/android/shared/speech_synthesis_internal.cc
@@ -22,8 +22,8 @@
 namespace android {
 namespace shared {
 
-extern "C" SB_EXPORT_PLATFORM
-void Java_dev_cobalt_coat_CobaltTextToSpeechHelper_nativeSendTTSChangedEvent(
+extern "C" SB_EXPORT_PLATFORM void
+Java_dev_cobalt_coat_CobaltTextToSpeechHelper_nativeSendTTSChangedEvent(
     JniEnvExt* env,
     jobject unused_this) {
   ApplicationAndroid::Get()->SendTTSChangedEvent();
diff --git a/starboard/android/shared/system_get_property.cc b/starboard/android/shared/system_get_property.cc
index 2342cbf..9a88271 100644
--- a/starboard/android/shared/system_get_property.cc
+++ b/starboard/android/shared/system_get_property.cc
@@ -22,7 +22,6 @@
 #include "starboard/common/log.h"
 #include "starboard/common/string.h"
 
-// We can't #include "base/stringize_macros.h" in Starboard
 #define STRINGIZE_NO_EXPANSION(x) #x
 #define STRINGIZE(x) STRINGIZE_NO_EXPANSION(x)
 
diff --git a/starboard/android/shared/system_network_is_disconnected.cc b/starboard/android/shared/system_network_is_disconnected.cc
index 87c9a86..20e173f 100644
--- a/starboard/android/shared/system_network_is_disconnected.cc
+++ b/starboard/android/shared/system_network_is_disconnected.cc
@@ -1,3 +1,5 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
@@ -10,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/system.h"
 #include "starboard/android/shared/jni_env_ext.h"
+#include "starboard/system.h"
 
 namespace starboard {
 namespace android {
@@ -19,8 +21,8 @@
 
 bool IsSystemNetworkConnected() {
   JniEnvExt* env = JniEnvExt::Get();
-  jboolean j_is_connected = env->CallStarboardBooleanMethodOrAbort(
-      "isNetworkConnected", "()Z");
+  jboolean j_is_connected =
+      env->CallStarboardBooleanMethodOrAbort("isNetworkConnected", "()Z");
   return j_is_connected;
 }
 
diff --git a/starboard/android/shared/system_platform_error.cc b/starboard/android/shared/system_platform_error.cc
index fe1e560..a68490d 100644
--- a/starboard/android/shared/system_platform_error.cc
+++ b/starboard/android/shared/system_platform_error.cc
@@ -75,9 +75,9 @@
     SB_DCHECK(*send_response_callback)
         << "send_response_callback should never be an empty function";
     SbSystemPlatformErrorResponse error_response =
-        jni_response < 0 ? kSbSystemPlatformErrorResponseNegative :
-        jni_response > 0 ? kSbSystemPlatformErrorResponsePositive :
-        kSbSystemPlatformErrorResponseCancel;
+        jni_response < 0   ? kSbSystemPlatformErrorResponseNegative
+        : jni_response > 0 ? kSbSystemPlatformErrorResponsePositive
+                           : kSbSystemPlatformErrorResponseCancel;
     (*send_response_callback)(error_response);
     delete send_response_callback;
   }
diff --git a/starboard/android/shared/test_filters.py b/starboard/android/shared/test_filters.py
index efade80..cb1953f 100644
--- a/starboard/android/shared/test_filters.py
+++ b/starboard/android/shared/test_filters.py
@@ -77,14 +77,23 @@
         # SbDrmGenerateSessionUpdateRequest().
         'SbDrmSessionTest.InvalidSessionUpdateRequestParams',
 
-        # TODO: b/288107039 This test crashed after NDK 25 upgrade, re-enable it.
-        'SbUndefinedBehaviorTest.CallThisPointerIsNullRainyDay',
-
         # TODO: b/288107692 This test crashed on arm64 after NDK 25 upgrade, re-enable it.
         'PixelTest.TooManyGlyphs',
 
         # TODO: Filter this test on a per-device basis.
         'SbMediaCanPlayMimeAndKeySystem.MinimumSupport',
+
+        # TODO: b/289281412 Make this test work on lab devices consistently.
+        'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.PartialAudio/*',
+
+        # TODO: b/292319097 Make this test work on lab devices consistently.
+        'SbPlayerTest.MaxVideoCapabilities',
+
+        # TODO: b/292409536 Make this test fork on lab devices consistently.
+        'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.PartialAudioDiscardAll/*',
+
+        # TODO: b/280432564 Make this test work on lab devices consistently.
+        'SbAudioSinkTest.ContinuousAppend',
     ],
 }
 # pylint: enable=line-too-long
diff --git a/starboard/android/shared/thread_get_name.cc b/starboard/android/shared/thread_get_name.cc
index 3adbf9a..5a6033c 100644
--- a/starboard/android/shared/thread_get_name.cc
+++ b/starboard/android/shared/thread_get_name.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/thread.h"
 #include <sys/prctl.h>
+#include "starboard/thread.h"
 
 void SbThreadGetName(char* buffer, int buffer_size) {
   prctl(PR_GET_NAME, buffer, 0L, 0L, 0L);
diff --git a/starboard/android/shared/toolchain/toolchain.gni b/starboard/android/shared/toolchain/toolchain.gni
index 9091c94..a743119 100644
--- a/starboard/android/shared/toolchain/toolchain.gni
+++ b/starboard/android/shared/toolchain/toolchain.gni
@@ -18,7 +18,7 @@
   android_sdk_path = getenv("ANDROID_HOME")
   android_ndk_path = ""
   sb_android_ndk_version = "25.2.9519653"
-  android_ndk_api_level = 21
+  android_ndk_api_level = 24
 }
 
 if (android_sdk_path == "") {
diff --git a/starboard/android/shared/video_decoder.cc b/starboard/android/shared/video_decoder.cc
index 807868d..723a1cc 100644
--- a/starboard/android/shared/video_decoder.cc
+++ b/starboard/android/shared/video_decoder.cc
@@ -102,12 +102,12 @@
 }
 
 void ParseMaxResolution(const std::string& max_video_capabilities,
-                        int window_width,
-                        int window_height,
+                        int frame_width,
+                        int frame_height,
                         optional<int>* max_width,
                         optional<int>* max_height) {
-  SB_DCHECK(window_width > 0);
-  SB_DCHECK(window_height > 0);
+  SB_DCHECK(frame_width > 0);
+  SB_DCHECK(frame_height > 0);
   SB_DCHECK(max_width);
   SB_DCHECK(max_height);
 
@@ -148,31 +148,31 @@
     return;
   }
 
-  if (window_width <= 0 || window_height <= 0) {
+  if (frame_width <= 0 || frame_height <= 0) {
     // We DCHECK() above, but just be safe.
     SB_LOG(WARNING)
-        << "Failed to parse max resolutions due to invalid window resolutions ("
-        << window_width << ", " << window_height << ").";
+        << "Failed to parse max resolutions due to invalid frame resolutions ("
+        << frame_width << ", " << frame_height << ").";
     return;
   }
 
   if (width > 0) {
     *max_width = width;
-    *max_height = max_width->value() * window_height / window_width;
+    *max_height = max_width->value() * frame_height / frame_width;
     SB_LOG(INFO) << "Inferred max height (" << *max_height
                  << ") from max_width (" << *max_width
-                 << ") and window resolution @ (" << window_width << ", "
-                 << window_height << ").";
+                 << ") and frame resolution @ (" << frame_width << ", "
+                 << frame_height << ").";
     return;
   }
 
   if (height > 0) {
     *max_height = height;
-    *max_width = max_height->value() * window_width / window_height;
+    *max_width = max_height->value() * frame_width / frame_height;
     SB_LOG(INFO) << "Inferred max width (" << *max_width
                  << ") from max_height (" << *max_height
-                 << ") and window resolution @ (" << window_width << ", "
-                 << window_height << ").";
+                 << ") and frame resolution @ (" << frame_width << ", "
+                 << frame_height << ").";
   }
 }
 
@@ -344,7 +344,7 @@
   bool rendered_;
 };
 
-VideoDecoder::VideoDecoder(SbMediaVideoCodec video_codec,
+VideoDecoder::VideoDecoder(const VideoStreamInfo& video_stream_info,
                            SbDrmSystem drm_system,
                            SbPlayerOutputMode output_mode,
                            SbDecodeTargetGraphicsContextProvider*
@@ -356,7 +356,7 @@
                            bool force_big_endian_hdr_metadata,
                            bool force_improved_support_check,
                            std::string* error_message)
-    : video_codec_(video_codec),
+    : video_codec_(video_stream_info.codec),
       drm_system_(static_cast<DrmSystem*>(drm_system)),
       output_mode_(output_mode),
       decode_target_graphics_context_provider_(
@@ -390,7 +390,7 @@
   }
 
   if (video_codec_ != kSbMediaVideoCodecAv1) {
-    if (!InitializeCodec(error_message)) {
+    if (!InitializeCodec(video_stream_info, error_message)) {
       *error_message =
           "Failed to initialize video decoder with error: " + *error_message;
       SB_LOG(ERROR) << *error_message;
@@ -490,7 +490,8 @@
     // because we need to change the color metadata.
     if (video_codec_ != kSbMediaVideoCodecAv1 && media_decoder_ == NULL) {
       std::string error_message;
-      if (!InitializeCodec(&error_message)) {
+      if (!InitializeCodec(input_buffers.front()->video_stream_info(),
+                           &error_message)) {
         error_message =
             "Failed to reinitialize codec with error: " + error_message;
         SB_LOG(ERROR) << error_message;
@@ -519,7 +520,8 @@
       return;
     }
     std::string error_message;
-    if (!InitializeCodec(&error_message)) {
+    if (!InitializeCodec(pending_input_buffers_.front()->video_stream_info(),
+                         &error_message)) {
       error_message =
           "Failed to reinitialize codec with error: " + error_message;
       SB_LOG(ERROR) << error_message;
@@ -556,7 +558,8 @@
     SB_DCHECK(pending_input_buffers_.size() == input_buffer_written_);
 
     std::string error_message;
-    if (!InitializeCodec(&error_message)) {
+    if (!InitializeCodec(pending_input_buffers_.front()->video_stream_info(),
+                         &error_message)) {
       error_message =
           "Failed to reinitialize codec with error: " + error_message;
       SB_LOG(ERROR) << error_message;
@@ -586,9 +589,6 @@
   TeardownCodec();
   CancelPendingJobs();
 
-  // After TeardownCodec, buffered_output_frames_ should equal to 0.
-  SB_DCHECK(buffered_output_frames_ == 0);
-
   tunnel_mode_prerolling_.store(true);
   tunnel_mode_frame_rendered_.store(false);
   input_buffer_written_ = 0;
@@ -604,11 +604,12 @@
   //       it depends on the behavior of the video renderer.
 }
 
-bool VideoDecoder::InitializeCodec(std::string* error_message) {
+bool VideoDecoder::InitializeCodec(const VideoStreamInfo& video_stream_info,
+                                   std::string* error_message) {
   SB_DCHECK(BelongsToCurrentThread());
   SB_DCHECK(error_message);
 
-  if (video_codec_ == kSbMediaVideoCodecAv1) {
+  if (video_stream_info.codec == kSbMediaVideoCodecAv1) {
     SB_DCHECK(pending_input_buffers_.size() > 0);
 
     // Guesstimate the video fps.
@@ -682,17 +683,9 @@
     return false;
   }
 
-  int window_width, window_height;
-  if (!GetVideoWindowSize(&window_width, &window_height)) {
-    *error_message =
-        "Can't initialize the codec since we don't have a video window.";
-    SB_LOG(ERROR) << *error_message;
-    return false;
-  }
-
   jobject j_media_crypto = drm_system_ ? drm_system_->GetMediaCrypto() : NULL;
   SB_DCHECK(!drm_system_ || j_media_crypto);
-  if (video_codec_ == kSbMediaVideoCodecAv1) {
+  if (video_stream_info.codec == kSbMediaVideoCodecAv1) {
     SB_DCHECK(video_fps_ > 0);
   } else {
     SB_DCHECK(video_fps_ == 0);
@@ -701,12 +694,13 @@
   optional<int> max_width, max_height;
   // TODO(b/281431214): Evaluate if we should also parse the fps from
   //                    `max_video_capabilities_` and pass to MediaDecoder ctor.
-  ParseMaxResolution(max_video_capabilities_, window_width, window_height,
-                     &max_width, &max_height);
+  ParseMaxResolution(max_video_capabilities_, video_stream_info.frame_width,
+                     video_stream_info.frame_height, &max_width, &max_height);
 
   media_decoder_.reset(new MediaDecoder(
-      this, video_codec_, window_width, window_height, max_width, max_height,
-      video_fps_, j_output_surface, drm_system_,
+      this, video_stream_info.codec, video_stream_info.frame_width,
+      video_stream_info.frame_height, max_width, max_height, video_fps_,
+      j_output_surface, drm_system_,
       color_metadata_ ? &*color_metadata_ : nullptr, require_software_codec_,
       std::bind(&VideoDecoder::OnTunnelModeFrameRendered, this, _1),
       tunnel_mode_audio_session_id_, force_big_endian_hdr_metadata_,
@@ -718,7 +712,7 @@
     }
     media_decoder_->SetPlaybackRate(playback_rate_);
 
-    if (video_codec_ == kSbMediaVideoCodecAv1) {
+    if (video_stream_info.codec == kSbMediaVideoCodecAv1) {
       SB_DCHECK(!pending_input_buffers_.empty());
     } else {
       SB_DCHECK(pending_input_buffers_.empty());
@@ -892,11 +886,8 @@
   SB_DLOG(INFO) << "Output format changed, trying to dequeue again.";
 
   ScopedLock lock(decode_target_mutex_);
-  // Record the latest width/height of the decoded input.
-  SurfaceDimensions output_dimensions =
-      media_codec_bridge->GetOutputDimensions();
-  frame_width_ = output_dimensions.width;
-  frame_height_ = output_dimensions.height;
+  // Record the latest dimensions of the decoded input.
+  frame_sizes_.push_back(media_codec_bridge->GetOutputSize());
 
   if (tunnel_mode_audio_session_id_ != -1) {
     return;
@@ -909,9 +900,9 @@
     output_format_ = starboard::nullopt;
     return;
   }
-  output_format_ = VideoOutputFormat(video_codec_, output_dimensions.width,
-                                     output_dimensions.height,
-                                     (color_metadata_ ? true : false));
+  output_format_ = VideoOutputFormat(
+      video_codec_, frame_sizes_.back().display_width(),
+      frame_sizes_.back().display_height(), (color_metadata_ ? true : false));
   first_output_format_changed_ = true;
   auto max_output_buffers =
       MaxMediaCodecOutputBuffersLookupTable::GetInstance()
@@ -934,6 +925,7 @@
 }
 
 namespace {
+
 void updateTexImage(jobject surface_texture) {
   JniEnvExt* env = JniEnvExt::Get();
   env->CallVoidMethodOrAbort(surface_texture, "updateTexImage", "()V");
@@ -1016,6 +1008,7 @@
   content_region->top = extent_y * height;
   content_region->bottom = origin_y * height;
 }
+
 }  // namespace
 
 // When in decode-to-texture mode, this returns the current decoded video frame.
@@ -1028,17 +1021,7 @@
     bool has_new_texture = has_new_texture_available_.exchange(false);
     if (has_new_texture) {
       updateTexImage(decode_target_->data->surface_texture);
-
-      decode_target_->data->info.planes[0].width = frame_width_;
-      decode_target_->data->info.planes[0].height = frame_height_;
-      decode_target_->data->info.width = frame_width_;
-      decode_target_->data->info.height = frame_height_;
-
-      float matrix4x4[16];
-      getTransformMatrix(decode_target_->data->surface_texture, matrix4x4);
-      SetDecodeTargetContentRegionFromMatrix(
-          &decode_target_->data->info.planes[0].content_region, frame_width_,
-          frame_height_, matrix4x4);
+      UpdateDecodeTargetSizeAndContentRegion_Locked();
 
       if (!first_texture_received_) {
         first_texture_received_ = true;
@@ -1054,6 +1037,97 @@
   return kSbDecodeTargetInvalid;
 }
 
+void VideoDecoder::UpdateDecodeTargetSizeAndContentRegion_Locked() {
+  decode_target_mutex_.DCheckAcquired();
+
+  SB_DCHECK(!frame_sizes_.empty());
+
+  while (!frame_sizes_.empty()) {
+    const auto& frame_size = frame_sizes_.front();
+    if (frame_size.has_crop_values()) {
+      decode_target_->data->info.planes[0].width = frame_size.texture_width;
+      decode_target_->data->info.planes[0].height = frame_size.texture_height;
+      decode_target_->data->info.width = frame_size.texture_width;
+      decode_target_->data->info.height = frame_size.texture_height;
+
+      float matrix4x4[16];
+      getTransformMatrix(decode_target_->data->surface_texture, matrix4x4);
+
+      auto& content_region =
+          decode_target_->data->info.planes[0].content_region;
+      SetDecodeTargetContentRegionFromMatrix(
+          &content_region, frame_size.texture_width, frame_size.texture_height,
+          matrix4x4);
+
+      // Now we have two crop rectangles, one from the MediaFormat, one from the
+      // transform of the surface texture.  Their sizes should match.
+      // Note that we cannot compare individual corners directly, as the values
+      // retrieving from the surface texture can be flipped.
+      int content_region_width =
+          std::abs(content_region.left - content_region.right) + 1;
+      int content_region_height =
+          std::abs(content_region.bottom - content_region.top) + 1;
+      // Using 2 as epsilon, as the texture may get clipped by one pixel from
+      // each side.
+      bool are_crop_values_matching =
+          std::abs(content_region_width - frame_size.display_width()) <= 2 &&
+          std::abs(content_region_height - frame_size.display_height()) <= 2;
+      if (are_crop_values_matching) {
+        return;
+      }
+
+#if !defined(COBALT_BUILD_TYPE_GOLD)
+      // If we failed to find any matching clip regions, the crop values
+      // returned from the platform may be inconsistent.
+      // Crash in non-gold mode, and fallback to the old logic in gold mode to
+      // avoid terminating the app in production.
+      SB_LOG_IF(WARNING, frame_sizes_.size() <= 1)
+          << frame_size.texture_width << "x" << frame_size.texture_height
+          << " - (" << content_region.left << ", " << content_region.top << ", "
+          << content_region.right << ", " << content_region.bottom << "), ("
+          << frame_size.crop_left << "), (" << frame_size.crop_top << "), ("
+          << frame_size.crop_right << "), (" << frame_size.crop_bottom << ")";
+#endif  // !defined(COBALT_BUILD_TYPE_GOLD)
+    } else {
+      SB_LOG(WARNING) << "Crop values not set.";
+    }
+
+    if (frame_sizes_.size() == 1) {
+      SB_LOG(WARNING) << "Setting content region frame width/height failed,"
+                      << " fallback to the legacy logic.";
+      break;
+    }
+
+    frame_sizes_.erase(frame_sizes_.begin());
+  }
+
+  SB_DCHECK(!frame_sizes_.empty());
+  if (frame_sizes_.empty()) {
+    // This should never happen.  Appending a default value so it aligns to the
+    // legacy behavior, where a single value (instead of an std::vector<>) is
+    // used.
+    frame_sizes_.resize(1);
+  }
+
+  // The legacy logic works when the crop rectangle has the same aspect ratio as
+  // the video texture, which is true for most of the playbacks.
+  // Leaving the legacy logic in place in case the new logic above doesn't work
+  // on some devices, so at least the majority of playbacks still work.
+  decode_target_->data->info.planes[0].width =
+      frame_sizes_.back().display_width();
+  decode_target_->data->info.planes[0].height =
+      frame_sizes_.back().display_height();
+  decode_target_->data->info.width = frame_sizes_.back().display_width();
+  decode_target_->data->info.height = frame_sizes_.back().display_height();
+
+  float matrix4x4[16];
+  getTransformMatrix(decode_target_->data->surface_texture, matrix4x4);
+  SetDecodeTargetContentRegionFromMatrix(
+      &decode_target_->data->info.planes[0].content_region,
+      frame_sizes_.back().display_width(), frame_sizes_.back().display_height(),
+      matrix4x4);
+}
+
 void VideoDecoder::SetPlaybackRate(double playback_rate) {
   playback_rate_ = playback_rate;
   if (media_decoder_) {
diff --git a/starboard/android/shared/video_decoder.h b/starboard/android/shared/video_decoder.h
index d8eafed..232db16 100644
--- a/starboard/android/shared/video_decoder.h
+++ b/starboard/android/shared/video_decoder.h
@@ -34,6 +34,7 @@
 #include "starboard/media.h"
 #include "starboard/player.h"
 #include "starboard/shared/internal_only.h"
+#include "starboard/shared/starboard/media/media_util.h"
 #include "starboard/shared/starboard/player/filter/video_decoder_internal.h"
 #include "starboard/shared/starboard/player/filter/video_render_algorithm.h"
 #include "starboard/shared/starboard/player/filter/video_renderer_sink.h"
@@ -50,6 +51,8 @@
       private ::starboard::shared::starboard::player::JobQueue::JobOwner,
       private VideoSurfaceHolder {
  public:
+  typedef ::starboard::shared::starboard::media::VideoStreamInfo
+      VideoStreamInfo;
   typedef ::starboard::shared::starboard::player::filter::VideoRenderAlgorithm
       VideoRenderAlgorithm;
   typedef ::starboard::shared::starboard::player::filter::VideoRendererSink
@@ -57,7 +60,7 @@
 
   class Sink;
 
-  VideoDecoder(SbMediaVideoCodec video_codec,
+  VideoDecoder(const VideoStreamInfo& video_stream_info,
                SbDrmSystem drm_system,
                SbPlayerOutputMode output_mode,
                SbDecodeTargetGraphicsContextProvider*
@@ -90,6 +93,7 @@
   void Reset() override;
   SbDecodeTarget GetCurrentDecodeTarget() override;
 
+  void UpdateDecodeTargetSizeAndContentRegion_Locked();
   void SetPlaybackRate(double playback_rate);
 
   void OnNewTextureAvailable();
@@ -99,7 +103,8 @@
  private:
   // Attempt to initialize the codec.  Returns whether initialization was
   // successful.
-  bool InitializeCodec(std::string* error_message);
+  bool InitializeCodec(const VideoStreamInfo& video_stream_info,
+                       std::string* error_message);
   void TeardownCodec();
 
   void WriteInputBuffersInternal(const InputBuffers& input_buffers);
@@ -168,9 +173,12 @@
   // and we do so through this mutex.
   Mutex decode_target_mutex_;
 
-  // The width and height of the latest decoded frame.
-  int32_t frame_width_ = 0;
-  int32_t frame_height_ = 0;
+  // The size infos of the frames in use, i.e. the frames being displayed, and
+  // the frames recently decoded frames and pending display.
+  // They are the same at most of the time, but they can be different when there
+  // is a format change. For example, when the newly decoded frames are at
+  // 1080p, and the frames being played are still at 480p.
+  std::vector<FrameSize> frame_sizes_;
 
   double playback_rate_ = 1.0;
 
diff --git a/starboard/android/shared/video_render_algorithm.cc b/starboard/android/shared/video_render_algorithm.cc
index 74ed628..5edf96f 100644
--- a/starboard/android/shared/video_render_algorithm.cc
+++ b/starboard/android/shared/video_render_algorithm.cc
@@ -26,7 +26,7 @@
 
 namespace {
 
-const SbTimeMonotonic kBufferTooLateThreshold = -30 * kSbTimeMillisecond;
+const SbTimeMonotonic kBufferTooLateThreshold = -32 * kSbTimeMillisecond;
 const SbTimeMonotonic kBufferReadyThreshold = 50 * kSbTimeMillisecond;
 
 jlong GetSystemNanoTime() {
diff --git a/starboard/android/x86/atomic_public.h b/starboard/android/x86/atomic_public.h
index 640dc99..20f1997 100644
--- a/starboard/android/x86/atomic_public.h
+++ b/starboard/android/x86/atomic_public.h
@@ -12,4 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#ifndef STARBOARD_ANDROID_X86_ATOMIC_PUBLIC_H_
+#define STARBOARD_ANDROID_X86_ATOMIC_PUBLIC_H_
+
 #include "starboard/android/shared/atomic_public.h"
+
+#endif  // STARBOARD_ANDROID_X86_ATOMIC_PUBLIC_H_
diff --git a/starboard/android/x86/configuration_public.h b/starboard/android/x86/configuration_public.h
index e36dc6a..9eb30cd 100644
--- a/starboard/android/x86/configuration_public.h
+++ b/starboard/android/x86/configuration_public.h
@@ -19,4 +19,9 @@
 // Other source files should never include this header directly, but should
 // include the generic "starboard/configuration.h" instead.
 
+#ifndef STARBOARD_ANDROID_X86_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_ANDROID_X86_CONFIGURATION_PUBLIC_H_
+
 #include "starboard/android/shared/configuration_public.h"
+
+#endif  // STARBOARD_ANDROID_X86_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/benchmark/memory_benchmark.cc b/starboard/benchmark/memory_benchmark.cc
index 703e48b..8b83fec 100644
--- a/starboard/benchmark/memory_benchmark.cc
+++ b/starboard/benchmark/memory_benchmark.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include <cstring>
+
 #include "starboard/memory.h"
 
 #include "third_party/google_benchmark/include/benchmark/benchmark.h"
 
-#include <cstring>
-
 namespace starboard {
 namespace benchmark {
 namespace {
diff --git a/starboard/build/config/BUILD.gn b/starboard/build/config/BUILD.gn
index aaa87f9..6a0290a 100644
--- a/starboard/build/config/BUILD.gn
+++ b/starboard/build/config/BUILD.gn
@@ -92,7 +92,7 @@
 config("target") {
   if (current_toolchain != host_toolchain) {
     if (final_executable_type == "shared_library") {
-      if (!build_with_separate_cobalt_toolchain) {
+      if (!sb_is_modular || sb_is_evergreen) {
         # Rewrite main() functions into StarboardMain. TODO: This is a
         # hack, it would be better to be more surgical, here.
         defines = [ "main=StarboardMain" ]
@@ -102,7 +102,11 @@
       # the compiler must be told to generate Position Independent Code.
       # This appears to cause errors when linking the code statically,
       # however.
-      cflags = [ "-fPIC" ]
+      # For windows based platforms this flag causes a linker error while building with cobalt toolchain
+      if (!(host_os == "win" && sb_is_modular &&
+            current_toolchain == cobalt_toolchain)) {
+        cflags = [ "-fPIC" ]
+      }
     }
 
     if (is_starboard) {
@@ -145,14 +149,14 @@
       defines += [ "INTERNAL_BUILD" ]
     }
 
-    if (sb_allows_memory_tracking) {
-      defines += [ "STARBOARD_ALLOWS_MEMORY_TRACKING" ]
-    }
-
     if (sb_enable_lib) {
       defines += [ "SB_IS_LIBRARY=1" ]
     }
 
+    if (sb_is_modular) {
+      defines += [ "SB_IS_MODULAR=1" ]
+    }
+
     if (sb_is_evergreen) {
       defines += [ "SB_IS_EVERGREEN=1" ]
     }
@@ -225,7 +229,8 @@
 # override flags specified in a platform's "platform_configuration" config,
 # which is where these particular flags would otherwise naturally fit.
 config("default_compiler_flags") {
-  if (is_starboardized_toolchain && sb_is_evergreen && target_cpu == "arm") {
+  if (is_starboardized_toolchain && sb_is_modular &&
+      current_toolchain == cobalt_toolchain && target_cpu == "arm") {
     cflags = [ "-mfpu=vfpv3" ]
     asmflags = cflags
   }
diff --git a/starboard/build/config/BUILDCONFIG.gn b/starboard/build/config/BUILDCONFIG.gn
index 5efc2c8..ff81ee6 100644
--- a/starboard/build/config/BUILDCONFIG.gn
+++ b/starboard/build/config/BUILDCONFIG.gn
@@ -57,7 +57,6 @@
 assert(is_debug || is_devel || is_qa || is_gold)
 
 # Set some variables we never want to change.
-sb_allows_memory_tracking = !is_gold
 host_byteorder = "little"
 is_official_build = false  # Chromium's build files expect this to be set.
 is_component_build = false
@@ -91,13 +90,22 @@
 # TODO(b/272790873): Set host_cpu to x86 for 32 bit builds.
 if (target_cpu == "x86" || target_cpu == "arm") {
   _host_toolchain_cpu = "x86"
+} else if (target_cpu == "arm64") {
+  # TODO(b/292107465): Set host_cpu to x64 for arm64 builds.
+  _host_toolchain_cpu = "x64"
 } else {
   _host_toolchain_cpu = host_cpu
 }
 host_toolchain = "//starboard/build/toolchain/$host_os:$_host_toolchain_cpu"
 
 if (build_with_separate_cobalt_toolchain) {
-  cobalt_toolchain = "//starboard/build/toolchain/linux:clang_lld"
+  # TODO(b/294450490): decide a way to set cobalt_toolchain for modular builds for all platforms.
+  # we'll need more conditionals for other platforms.
+  if (host_os == "win") {
+    cobalt_toolchain = "//$starboard_path/toolchain:cobalt"
+  } else {
+    cobalt_toolchain = "//starboard/build/toolchain:clang"
+  }
   starboard_toolchain = "//$starboard_path/toolchain:starboard"
 } else {
   cobalt_toolchain = "//$starboard_path/toolchain:target"
@@ -109,12 +117,18 @@
 import("//$starboard_path/platform_configuration/configuration.gni")
 import("//starboard/build/config/build_assertions.gni")
 
+# TODO(b/295399926) Clean up flag by moving to modular/helper_var.gni
+sb_is_modular = sb_is_evergreen || build_with_separate_cobalt_toolchain
+
 declare_args() {
   use_tsan = getenv("USE_TSAN") == 1
 }
 
-_use_asan_default = (is_debug || is_devel) && (is_linux || is_mac) &&
-                    is_clang && !sb_is_evergreen && !using_old_compiler
+_use_asan_default =
+    (is_debug || is_devel) && (is_linux || is_mac) && is_clang &&
+    (!sb_is_evergreen || build_with_separate_cobalt_toolchain) &&
+    !using_old_compiler
+
 declare_args() {
   use_asan = (_use_asan_default || getenv("USE_ASAN") == 1) && !use_tsan
 }
@@ -313,6 +327,88 @@
   }
 }
 
+template("evergreen_loader") {
+  # Add additional evergreen_loader target for every native target.
+  original_target_name = invoker.original_target_name
+  shared_data_deps = invoker.data_deps
+  shared_data_deps += [ "//third_party/icu:icudata" ]
+  shared_data_deps += [
+    ":copy_loader_app_lib${original_target_name}",
+    "//starboard/loader_app:copy_loader_app_content",
+  ]
+  if (cobalt_font_package == "empty") {
+    shared_data_deps += [ "//cobalt/content/fonts:copy_font_data" ]
+  } else {
+    shared_data_deps += [
+      "//cobalt/content/fonts:copy_fonts",
+      "//cobalt/content/fonts:fonts_xml",
+    ]
+  }
+  shared_library(target_name) {
+    forward_variables_from(invoker, [ "testonly" ])
+    if (has_pedantic_warnings) {
+      configs += [ "//starboard/build/config:pedantic_warnings" ]
+    }
+
+    configs += [ "//$starboard_path/platform_configuration" ]
+    if (!has_pedantic_warnings) {
+      configs += [ "//starboard/build/config:no_pedantic_warnings" ]
+    }
+
+    sources = [ "//starboard/elf_loader/sandbox.cc" ]
+    configs += [ "//starboard/elf_loader:elf_loader_config" ]
+
+    deps = [
+      ":copy_loader_app_lib${original_target_name}",
+      "//cobalt/content/fonts:copy_font_data",
+      "//starboard",
+      "//starboard/elf_loader:constants",
+      "//starboard/elf_loader:elf_loader",
+      "//starboard/elf_loader:evergreen_info",
+      "//starboard/elf_loader:sabi_string",
+      "//starboard/loader_app:copy_loader_app_content",
+    ]
+
+    if (!sb_is_evergreen_compatible) {
+      deps += [ "//third_party/crashpad/wrapper:wrapper_stub" ]
+    }
+  }
+  if (separate_install_targets_for_bundling) {
+    import("//starboard/build/config/bundle_content.gni")
+    bundle_content(
+        "copy_loader_app_lib${original_target_name}_bundle_content") {
+      forward_variables_from(invoker, [ "testonly" ])
+
+      bundle_name = target_name
+      bundle_deps = shared_data_deps
+    }
+  }
+  copy("copy_loader_app_lib${original_target_name}") {
+    install_content = true
+    if (target_cpu == "arm" && arm_float_abi == "softfp") {
+      sources = [ "$root_out_dir/../evergreen-$target_cpu-${arm_float_abi}_$build_type/lib${original_target_name}.so" ]
+    } else if (target_cpu == "arm64") {
+      sources = [ "$root_out_dir/../evergreen-$target_cpu_$build_type/install/lib/libcobalt.so" ]
+    }
+    outputs = [ "$sb_static_contents_output_data_dir/app/cobalt/lib/lib${original_target_name}.so" ]
+  }
+  install_target(original_target_name + "_evergreen_loader_install") {
+    forward_variables_from(invoker, [ "testonly" ])
+    installable_target_name = original_target_name + "_evergreen_loader"
+    type = "shared_library"
+    deps = []
+    if (defined(invoker.deps)) {
+      deps += invoker.deps
+    }
+    foreach(dep, shared_data_deps) {
+      deps += [ "${dep}_install_content" ]
+    }
+    if (separate_install_targets_for_bundling) {
+      deps += [ ":copy_loader_app_lib${original_target_name}_bundle_content" ]
+    }
+  }
+}
+
 template("executable") {
   not_needed(invoker, [ "build_loader" ])
 
@@ -402,6 +498,10 @@
         forward_variables_from(invoker, [ "testonly" ])
         sources = [ "//$starboard_path/starboard_loader.cc" ]
 
+        if (use_asan) {
+          sources += [ "//$starboard_path/sanitizer_options.cc" ]
+        }
+
         out_dir = rebase_path(root_build_dir)
         defines = [
           "SB_LOADER_MODULE=\"$actual_target_name\"",
@@ -451,6 +551,13 @@
       }
     }
 
+    if (sb_is_evergreen_compatible && sb_evergreen_compatible_package &&
+        target_name != "loader_app") {
+      evergreen_loader(original_target_name + "_evergreen_loader") {
+        forward_variables_from(invoker, "*")
+      }
+    }
+
     install_target(target_name + "_install") {
       forward_variables_from(invoker, [ "testonly" ])
       installable_target_name = shared_library_target_name
diff --git a/starboard/build/config/base_configuration.gni b/starboard/build/config/base_configuration.gni
index 0241180..4005cb9 100644
--- a/starboard/build/config/base_configuration.gni
+++ b/starboard/build/config/base_configuration.gni
@@ -44,6 +44,9 @@
   # Directory path to static contents' data.
   sb_static_contents_output_data_dir = "$root_out_dir/content/data"
 
+  # Whether this is a modular build.
+  sb_is_modular = false
+
   # Whether this is an Evergreen build.
   sb_is_evergreen = false
 
diff --git a/starboard/build/config/os_definitions.gni b/starboard/build/config/os_definitions.gni
index 6a5747b..993ab0c 100644
--- a/starboard/build/config/os_definitions.gni
+++ b/starboard/build/config/os_definitions.gni
@@ -31,3 +31,5 @@
 
 is_apple = is_ios || is_mac
 is_posix = !is_win && !is_fuchsia
+
+is_host_os_win = host_os == "win"
diff --git a/starboard/build/config/starboard_target_type.gni b/starboard/build/config/starboard_target_type.gni
index 0c3983a..503c0b0 100644
--- a/starboard/build/config/starboard_target_type.gni
+++ b/starboard/build/config/starboard_target_type.gni
@@ -17,7 +17,7 @@
 }
 
 if (starboard_target_type == "") {
-  if (build_with_separate_cobalt_toolchain) {
+  if (sb_is_modular && !sb_is_evergreen) {
     starboard_target_type = "shared_library"
   } else {
     starboard_target_type = "group"
diff --git a/starboard/build/config/win/BUILD.gn b/starboard/build/config/win/BUILD.gn
index f2aec79..b69e93c 100644
--- a/starboard/build/config/win/BUILD.gn
+++ b/starboard/build/config/win/BUILD.gn
@@ -36,9 +36,6 @@
     "UNICODE",
   ]
 
-  # Allows compilation against VS 2022.
-  configs += [ "//build/config/win:visual_studio_version_compat" ]
-
   # msvs_base
   # OutputDirectory and IntermediateDirectory, maybe CharacterSet
   include_dirs += [
@@ -234,5 +231,17 @@
 
     # Deprecated function warning.
     "/wd4996",
+
+    # Compiler warnings introduced after upgrading to Visual Studio 2022.
+    # Implicit conversion from 'type' to bool. Possible information loss.
+    "/wd4800",
+
+    # Discarding return value of function with 'nodiscard' attribute.
+    "/wd4834",
+    "/wd4858",
+
+    # Unnamed class used in typedef name cannot declare members other than
+    # non-static data members, member enumerations, or member classes.
+    "/wd5208",
   ]
 }
diff --git a/starboard/build/platform_configuration.py b/starboard/build/platform_configuration.py
index c5bac3d..af3fa2c 100644
--- a/starboard/build/platform_configuration.py
+++ b/starboard/build/platform_configuration.py
@@ -165,13 +165,19 @@
     Returns:
       A list of strings of test target names.
     """
+    # TODO(b/292007482): Replace static list with gn query.
     return [
         'app_key_files_test',
         'app_key_test',
+        'common_test',
+        'cwrappers_test',
         'drain_file_test',
         'elf_loader_test',
+        'eztime_test',
         'installation_manager_test',
         'nplb',
+        # TODO(b/292138589): Fails on various linux configs.
+        # 'nplb_evergreen_compat_tests',
         'player_filter_tests',
         'reset_evergreen_update_test',
         'slot_management_test',
diff --git a/starboard/build/platforms.py b/starboard/build/platforms.py
index 6bd2f3c..696453e 100644
--- a/starboard/build/platforms.py
+++ b/starboard/build/platforms.py
@@ -42,6 +42,7 @@
     'evergreen-arm-softfp': 'starboard/evergreen/arm/softfp',
     'evergreen-arm64': 'starboard/evergreen/arm64',
     'win-win32': 'starboard/win/win32',
+    'xb1': 'starboard/xb1',
 }
 PLATFORMS.update(INTERNAL_PLATFORMS)
 
diff --git a/tools/lbshell/open_source_release/create_tarball.sh b/starboard/build/toolchain/BUILD.gn
old mode 100755
new mode 100644
similarity index 79%
copy from tools/lbshell/open_source_release/create_tarball.sh
copy to starboard/build/toolchain/BUILD.gn
index 79904b4..2bfec6e
--- a/tools/lbshell/open_source_release/create_tarball.sh
+++ b/starboard/build/toolchain/BUILD.gn
@@ -1,5 +1,3 @@
-#!/bin/bash
-#
 # Copyright 2023 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,5 +12,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-CURRENT_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-${CURRENT_DIR}/../../../internal/tools/lbshell/open_source_release/create_tarball.sh "$@"
+import("//build/config/clang/clang.gni")
+import("//build/toolchain/gcc_toolchain.gni")
+
+clang_toolchain("clang") {
+  clang_base_path = clang_base_path
+}
diff --git a/starboard/build/toolchain/linux/BUILD.gn b/starboard/build/toolchain/linux/BUILD.gn
index 97a5b53..24da4aa 100644
--- a/starboard/build/toolchain/linux/BUILD.gn
+++ b/starboard/build/toolchain/linux/BUILD.gn
@@ -14,7 +14,6 @@
 
 import("//build/toolchain/gcc_toolchain.gni")
 import("//starboard/build/platform_path.gni")
-import("//starboard/build/toolchain/linux/clang_lld_toolchain.gni")
 
 clang_toolchain("x64") {
   clang_base_path = clang_base_path
@@ -37,6 +36,3 @@
     is_clang_16 = true
   }
 }
-
-clang_lld_toolchain("clang_lld") {
-}
diff --git a/starboard/build/toolchain/linux/clang_lld_toolchain.gni b/starboard/build/toolchain/linux/clang_lld_toolchain.gni
deleted file mode 100644
index f9de0de..0000000
--- a/starboard/build/toolchain/linux/clang_lld_toolchain.gni
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2023 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import("//build/toolchain/gcc_toolchain.gni")
-
-template("clang_lld_toolchain") {
-  not_needed(invoker, "*")
-
-  gcc_toolchain(target_name) {
-    prefix = rebase_path("$clang_base_path/bin", root_build_dir)
-    cc = "$prefix/clang"
-    cxx = "$prefix/clang++"
-    ld = "$prefix/ld.lld"
-    ar = "$prefix/llvm-ar"
-    nm = "nm"
-
-    toolchain_args = {
-      is_clang = true
-    }
-  }
-}
diff --git a/starboard/build/toolchain/mac/BUILD.gn b/starboard/build/toolchain/mac/BUILD.gn
index 780c648..7e11b90 100644
--- a/starboard/build/toolchain/mac/BUILD.gn
+++ b/starboard/build/toolchain/mac/BUILD.gn
@@ -24,3 +24,13 @@
     toolchain_config_path = "//starboard/build/config/mac:host"
   }
 }
+
+apple_toolchain("arm64") {
+  bin_path = apple_clang_base_path
+  toolchain_args = {
+    current_os = "mac"
+    current_cpu = "arm64"
+    use_xcode_clang = true
+    toolchain_config_path = "//starboard/build/config/mac:host"
+  }
+}
diff --git a/starboard/byte_swap.h b/starboard/byte_swap.h
index cdd2c6a..55e5263 100644
--- a/starboard/byte_swap.h
+++ b/starboard/byte_swap.h
@@ -20,6 +20,8 @@
 #ifndef STARBOARD_BYTE_SWAP_H_
 #define STARBOARD_BYTE_SWAP_H_
 
+#if SB_API_VERSION < 16
+
 #include "starboard/configuration.h"
 #include "starboard/export.h"
 #include "starboard/types.h"
@@ -82,4 +84,10 @@
 }  // extern "C"
 #endif
 
+#else  // SB_API_VERSION < 16
+
+#error This file is deprecated with SB_API_VERSION 16.
+
+#endif  // SB_API_VERSION < 16
+
 #endif  // STARBOARD_BYTE_SWAP_H_
diff --git a/starboard/client_porting/README.md b/starboard/client_porting/README.md
index 75c8435..6d046bd 100644
--- a/starboard/client_porting/README.md
+++ b/starboard/client_porting/README.md
@@ -42,4 +42,3 @@
 `starboard/client_porting/eztime/eztime.h`, or you can include
 `starboard/client_porting/poem/eztime_poem.h` in your implementation file to
 automatically simulate POSIXy time functions.
-
diff --git a/starboard/client_porting/eztime/eztime.cc b/starboard/client_porting/eztime/eztime.cc
index 7638200..d8eb73e 100644
--- a/starboard/client_porting/eztime/eztime.cc
+++ b/starboard/client_porting/eztime/eztime.cc
@@ -42,7 +42,9 @@
 // The timezone names in ASCII (UTF8-compatible) literals. This must match the
 // order of the EzTimeZone enum.
 const char* kTimeZoneNames[] = {
-    "America/Los_Angeles", "Etc/GMT", "",
+    "America/Los_Angeles",
+    "Etc/GMT",
+    "",
 };
 
 SB_COMPILE_ASSERT(SB_ARRAY_SIZE(kTimeZoneNames) == kEzTimeZoneCount,
diff --git a/starboard/client_porting/icu_init/icu_init.cc b/starboard/client_porting/icu_init/icu_init.cc
index c229ca1..2867bc8 100644
--- a/starboard/client_porting/icu_init/icu_init.cc
+++ b/starboard/client_porting/icu_init/icu_init.cc
@@ -44,22 +44,6 @@
   data_path += kSbFileSepString;
   data_path += "icu";
 
-#if SB_IS(EVERGREEN)
-  // If the icu tables are not under the content directory, use the
-  // storage directory. This minimizes Evergreen's storage usage
-  // on the device, as it can share the tables under
-  // storage between all the installations, but still has the option
-  // to use its own tables under content.
-  if (!SbFileExists(data_path.c_str())) {
-    bool result = SbSystemGetPath(kSbSystemPathStorageDirectory,
-                                  base_path.data(), base_path.size());
-    SB_DCHECK(result);
-    data_path = base_path.data();
-    data_path += kSbFileSepString;
-    data_path += "icu";
-    SbLogFormatF("Using icu tables from: %s\n", data_path.c_str());
-  }
-#endif
   // set this as the data directory.
   u_setDataDirectory(data_path.c_str());
 
diff --git a/starboard/client_porting/poem/inet_poem.h b/starboard/client_porting/poem/inet_poem.h
index 97c48b0..b612dcb 100644
--- a/starboard/client_porting/poem/inet_poem.h
+++ b/starboard/client_porting/poem/inet_poem.h
@@ -18,7 +18,7 @@
 #define STARBOARD_CLIENT_PORTING_POEM_INET_POEM_H_
 
 #if defined(STARBOARD)
-#include "starboard/byte_swap.h"
+#include "starboard/common/byte_swap.h"
 
 #undef htonl
 #define htonl(x) SB_HOST_TO_NET_U32(x)
diff --git a/starboard/client_porting/walk_dir.py b/starboard/client_porting/walk_dir.py
deleted file mode 100644
index 84b10ab..0000000
--- a/starboard/client_porting/walk_dir.py
+++ /dev/null
@@ -1,287 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""A directory walker framework that filter and process files.
-
-It filters file name against filter functions and process filtered files using
-processor function.
-"""
-
-from __future__ import print_function
-
-import os
-
-# All filter functions
-
-
-def CppSourceCodeFilter(filename):
-  """Filter function returns true for C++ source code files."""
-  return (filename[-3:] == '.cc' or filename[-4:] == '.cpp' or
-          filename[-2:] == '.h' or filename[-4:] == '.hpp')
-
-
-def SourceCodeFilter(filename):
-  """Filter function returns true for general source code files."""
-  return (filename[-3:] == '.cc' or filename[-4:] == '.cpp' or
-          filename[-2:] == '.h' or filename[-4:] == '.hpp' or
-          filename[-4:] == '.idl' or filename[-11:] == '.h.template' or
-          filename[-12:] == '.cc.template' or filename[-2:] == '.y' or
-          filename[-7:] == '.h.pump' or filename[-3:] == '.js')
-
-
-# All processor functions
-
-
-def AddInvalidSpace(pathname):
-  """Add a space in the very beginning of the file."""
-  with open(pathname, 'r', encoding='utf-8') as f:
-    content = f.read()
-  content = ' ' + content
-  with open(pathname, 'w', encoding='utf-8') as f:
-    f.write(content)
-
-
-def ReplaceLicenseHeader(pathname):
-  """Replace license headers in /* ... */ to // ...."""
-  with open(pathname, 'r', encoding='utf-8') as f:
-    lines = f.readlines()
-  # Guestimate the copyright header
-  for i in range(0, len(lines)):
-    if (len(lines[i]) == 3 and lines[i][:2] == '/*' and
-        lines[i + 1].find('opyright') != -1 and
-        lines[i + 1].find('Google') != -1):
-      del lines[i]
-      for j in range(i, len(lines)):
-        if lines[j].find('*/') != -1:
-          del lines[j]
-          break
-
-        if lines[j][0] == ' ':
-          line_without_star = lines[j][2:]
-        else:
-          line_without_star = lines[j][1:]
-        lines[j] = '//' + line_without_star
-    if i >= len(lines) - 1:
-      break
-  with open(pathname, 'w', encoding='utf-8') as f:
-    f.writelines(lines)
-
-
-def ReplaceMediaNamespace(pathname):
-  """Move namespace media into namespace cobalt."""
-  with open(pathname, 'r', encoding='utf-8') as f:
-    source_lines = f.readlines()
-  target_lines = []
-  for i in range(0, len(source_lines)):
-    if source_lines[i].find('namespace media {') != -1:
-      if i == 0 or source_lines[i - 1].find('namespace cobalt {') == -1:
-        target_lines.append('namespace cobalt {\n')
-    target_lines.append(source_lines[i])
-    if source_lines[i].find('}  // namespace media') != -1:
-      if i == len(source_lines) - 1 or source_lines[i + 1].find(
-          '}  // namespace cobalt') == -1:
-        target_lines.append('}  // namespace cobalt\n')
-
-  with open(pathname, 'w', encoding='utf-8') as f:
-    f.writelines(target_lines)
-
-
-C_FUNCTION_LIST = """
-assert,isalnum,isalpha,iscntrl,isdigit,isgraph,islower,isprint,ispunct,isspace,
-isupper,isxdigit,toupper,tolower,errno,setlocale,acos,asin,atan,atan2,ceil,cos,
-cosh,exp,fabs,floor,fmod,frexp,ldexp,log,log10,modf,pow,sin,sinh,sqrt,tan,tanh,
-setjmp,longjmp,signal,raise,va_start,va_arg,va_end,clearerr,fclose,feof,fflush,
-fgetc,fgetpos,fgets,fopen,fprintf,fputc,fputs,fread,freopen,fscanf,fseek,
-fsetpos,ftell,fwrite,getc,getchar,gets,perror,printf,putchar,puts,remove,rewind,
-scanf,setbuf,setvbuf,sprintf,sscanf,tmpfile,tmpnam,ungetc,vfprintf,vprintf,
-vsprintf,abort,abs,atexit,atof,atoi,atol,bsearch,calloc,div,exit,getenv,free,
-labs,ldiv,malloc,mblen,mbstowcs,mbtowc,qsort,rand,realloc,strtod,strtol,strtoul,
-srand,system,wctomb,wcstombs,memchr,memcmp,memcpy,memmove,memset,strcat,strchr,
-strcmp,strcoll,strcpy,strcspn,strerror,strlen,strncat,strncmp,strncpy,strpbrk,
-strrchr,strspn,strstr,strtok,strxfrm,asctime,clock,ctime,difftime,gmtime,
-localtime,mktime,strftime,time,opendir,closedir,readdir,rewinddir,scandir,
-seekdir,telldir,access,alarm,chdir,chown,close,chroot,ctermid,cuserid,dup,dup2,
-execl,execle,execlp,execv,execve,execvp,fchdir,fork,fpathconf,getegid,geteuid,
-gethostname,getopt,getgid,getgroups,getlogin,getpgrp,getpid,getppid,getuid,
-isatty,link,lseek,mkdir,open,pathconf,pause,pipe,read,rename,rmdir,setgid,
-setpgid,setsid,setuid,sleep,sysconf,tcgetpgrp,tcsetpgrp,ttyname,unlink,write,
-clrscr,getch,getche,statfs,endpwent,fgetpwent,getpw,getpwent,getpwnam,getpwuid,
-getuidx,putpwent,pclose,popen,putenv,setenv,setpwent,setreuid,stat,uname,
-unsetenv,setuidx,setegid,setrgid,seteuid,setruid,getruid
-"""
-
-SB_MEMORY_REPLACEMENT_DICT = {
-    'free': 'SbMemoryDeallocate',
-    'malloc': 'SbMemoryAllocate',
-    'realloc': 'SbMemoryReallocate'
-}
-
-SB_STRING_REPLACEMENT_DICT = {}
-
-c_function_list = []
-
-
-def AddProjectHeader(lines, header):
-  """Add a new project header into lines which takes order into account."""
-  assert header.find('.h') != -1 and header.find('/') != -1
-
-  include_statement = '#include "' + header + '"\n'
-
-  last_c_header = -1
-  last_cpp_header = -1
-  last_project_header = -1
-
-  for i in range(0, len(lines)):
-    line = lines[i]
-    if line.find('#include <') != -1:
-      if line.find('.h') != -1:
-        last_c_header = i
-      else:
-        last_cpp_header = i
-    elif line.find('#include "') != -1:
-      if line.find(header) != -1:
-        return
-      last_project_header = i
-
-  if (last_project_header < last_cpp_header or
-      last_project_header < last_c_header):
-    # There is no project header at all, add after last cpp or c header
-    if last_cpp_header != -1:
-      lines.insert(last_cpp_header + 1, include_statement)
-      lines.insert(last_cpp_header + 1, '\n')
-    else:
-      # In the case that there is no C header as well, this will be added to the
-      # first line, maybe before the copyrights, and hopefully will be caught
-      # during code review.
-      lines.insert(last_c_header + 1, include_statement)
-      lines.insert(last_c_header + 1, '\n')
-    return
-
-  # Now we have to add into the project include section with proper ordering
-  while last_project_header > 0:
-    if include_statement > lines[last_project_header]:
-      lines.insert(last_project_header + 1, include_statement)
-      return
-    last_project_header -= 1
-
-  lines.insert(0, include_statement)
-
-
-def RemoveHeader(lines, header):
-  for i in range(0, len(lines)):
-    if lines[i].find('#include') != -1 and lines[i].find(header) != -1:
-      del lines[i]
-      if (lines[i] == '\n' and lines[i + 1] == '\n' or
-          lines[i - 1] == '\n' and lines[i] == '\n'):
-        del lines[i]
-      return
-
-
-def DumpCHeadersAndFunctions(pathname):
-  """Print out C headers included and C functions used."""
-  global c_function_list
-  if not c_function_list:
-    c_function_list = [
-        x for x in C_FUNCTION_LIST.replace('\n', '').split(',') if x
-    ]
-  with open(pathname, 'r', encoding='utf-8') as f:
-    source_lines = f.readlines()
-  first = True
-
-  add_starboard_memory_h = False
-  add_starboard_string_h = False
-  add_starboard_types_h = False
-
-  for i in range(0, len(source_lines)):
-    if source_lines[i].find('#include <') != -1 and source_lines[i].find(
-        '.h>') != -1:
-      if source_lines[i].find('stddef.h') or source_lines[i].find('stdint.h'):
-        add_starboard_types_h = True
-        continue  # We can fix this, no need to dump
-
-      if first:
-        print(pathname)
-        first = False
-      print('    => line ', i + 1, '\t', source_lines[i][:-1])
-    for j in range(0, len(c_function_list)):
-      index = source_lines[i].find(c_function_list[j] + '(')
-      if index == -1:
-        continue
-      if (source_lines[i].find('//') != -1 and
-          source_lines[i].find('//') < index):
-        continue
-      if index == 0 or (not source_lines[i][index - 1].isalpha() and
-                        source_lines[i][index - 1] != '_' and
-                        source_lines[i][index - 1] != ':' and
-                        source_lines[i][index - 1] != '>' and
-                        source_lines[i][index - 1] != '.'):
-        if c_function_list[j] in SB_MEMORY_REPLACEMENT_DICT:
-          source_lines[i] = source_lines[i].replace(
-              c_function_list[j],
-              SB_MEMORY_REPLACEMENT_DICT[c_function_list[j]])
-          add_starboard_memory_h = True
-          continue  # We fixed this, no need to dump
-        if c_function_list[j] in SB_STRING_REPLACEMENT_DICT:
-          source_lines[i] = source_lines[i].replace(
-              c_function_list[j],
-              SB_STRING_REPLACEMENT_DICT[c_function_list[j]])
-          add_starboard_string_h = True
-          continue  # We fixed this, no need to dump
-        if first:
-          print(pathname)
-          first = False
-        print('    => line ', i + 1, '\t', source_lines[i][:-1], 'contains',
-              c_function_list[j])
-
-  if add_starboard_memory_h:
-    AddProjectHeader(source_lines, 'starboard/memory.h')
-
-  if add_starboard_string_h:
-    AddProjectHeader(source_lines, 'starboard/string.h')
-
-  if add_starboard_types_h:
-    RemoveHeader(source_lines, 'stddef.h')
-    RemoveHeader(source_lines, 'stdint.h')
-    AddProjectHeader(source_lines, 'starboard/types.h')
-
-  with open(pathname, 'w', encoding='utf-8') as f:
-    f.writelines(source_lines)
-
-
-def CollectFilesInDirectory(root, file_filter=None):
-  """Traverse the folder and call filters."""
-  result = []
-  for current_dir, _, files in os.walk(root):
-    for f in files:
-      pathname = current_dir + '/' + f
-      if file_filter and not file_filter(pathname):
-        continue
-      result.append(pathname)
-  return result
-
-
-def ProcessFiles(pathnames, processor):
-  for pathname in pathnames:
-    processor(pathname)
-
-
-# ProcessFiles(CollectFilesInDirectory('.', CppSourceCodeFilter),
-#                                      AddInvalidSpace)
-# ProcessFiles(CollectFilesInDirectory('.', SourceCodeFilter),
-#                                      ReplaceLicenseHeader)
-# ProcessFiles(CollectFilesInDirectory('.', SourceCodeFilter),
-#                                      ReplaceMediaNamespace)
-ProcessFiles(
-    CollectFilesInDirectory('.', CppSourceCodeFilter), DumpCHeadersAndFunctions)
diff --git a/starboard/client_porting/wrap_main/wrap_main.h b/starboard/client_porting/wrap_main/wrap_main.h
index a0a498d..ddc7aad 100644
--- a/starboard/client_porting/wrap_main/wrap_main.h
+++ b/starboard/client_porting/wrap_main/wrap_main.h
@@ -47,10 +47,10 @@
 }  // namespace client_porting
 }  // namespace starboard
 
-#define STARBOARD_WRAP_SIMPLE_MAIN(main_function)                \
-  void SbEventHandle(const SbEvent* event) {                     \
-    ::starboard::client_porting::wrap_main::SimpleEventHandler<  \
-        main_function>(event);                                   \
+#define STARBOARD_WRAP_SIMPLE_MAIN(main_function)                              \
+  void SbEventHandle(const SbEvent* event) {                                   \
+    ::starboard::client_porting::wrap_main::SimpleEventHandler<main_function>( \
+        event);                                                                \
   }
 
 #endif  // STARBOARD_CLIENT_PORTING_WRAP_MAIN_WRAP_MAIN_H_
diff --git a/starboard/codereview.settings b/starboard/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/starboard/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/starboard/common/BUILD.gn b/starboard/common/BUILD.gn
index 5c1977e..e1db661 100644
--- a/starboard/common/BUILD.gn
+++ b/starboard/common/BUILD.gn
@@ -51,6 +51,8 @@
     "log.cc",
     "media.cc",
     "media.h",
+    "metrics/stats_tracker.cc",
+    "metrics/stats_tracker.h",
     "move.h",
     "murmurhash2.cc",
     "murmurhash2.h",
diff --git a/starboard/common/README.md b/starboard/common/README.md
index 61772a4..e890e6c 100644
--- a/starboard/common/README.md
+++ b/starboard/common/README.md
@@ -5,5 +5,3 @@
 
 ## Intended Use
 The library is intended to be used by both Starboard and Cobalt layers.
-
-
diff --git a/starboard/common/benchmark_main.cc b/starboard/common/benchmark_main.cc
index d100a56..bd49b9e 100644
--- a/starboard/common/benchmark_main.cc
+++ b/starboard/common/benchmark_main.cc
@@ -27,7 +27,7 @@
 
 // When we are building Evergreen we need to export SbEventHandle so that the
 // ELF loader can find and invoke it.
-#if SB_IS(EVERGREEN)
+#if SB_IS(MODULAR)
 SB_EXPORT
-#endif  // SB_IS(EVERGREEN)
+#endif  // SB_IS(MODULAR)
 STARBOARD_WRAP_SIMPLE_MAIN(RunAllBenchmarks);
diff --git a/starboard/common/byte_swap.h b/starboard/common/byte_swap.h
index c2ad084..f991e23 100644
--- a/starboard/common/byte_swap.h
+++ b/starboard/common/byte_swap.h
@@ -12,58 +12,69 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-// Module Overview: Starboard Byte Swap module C++ convenience layer
+// Module Overview: Starboard Byte Swap macros
 //
-// Implements convenient templated wrappers around the core Starboard Byte Swap
-// module. These functions are used to deal with endianness when performing I/O.
+// Specifies macros for swapping byte order. These functions are used to
+// deal with endianness when performing I/O.
 
 #ifndef STARBOARD_COMMON_BYTE_SWAP_H_
 #define STARBOARD_COMMON_BYTE_SWAP_H_
 
-#include <algorithm>
+#if SB_API_VERSION < 16
 
 #include "starboard/byte_swap.h"
+
+#else  // SB_API_VERSION < 16
+
+#include "starboard/configuration.h"
 #include "starboard/types.h"
 
-namespace starboard {
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-template <typename T>
-T SbByteSwap(T value) {
-  std::reverse(reinterpret_cast<uint8_t*>(&value),
-               reinterpret_cast<uint8_t*>(&value + 1));
-  return value;
+// TODO: b/295440998 - Consider using compiler builtins.
+
+static __inline uint16_t __sb_bswap_16(uint16_t __x) {
+  return ((uint16_t)(__x << 8)) | __x >> 8;
 }
 
-template <>
-inline int16_t SbByteSwap(int16_t value) {
-  return SbByteSwapS16(value);
+static __inline uint32_t __sb_bswap_32(uint32_t __x) {
+  return __x >> 24 | (__x >> 8 & 0xff00) | ((uint32_t)(__x << 8 & 0xff0000)) |
+         ((uint32_t)(__x << 24));
 }
 
-template <>
-inline uint16_t SbByteSwap(uint16_t value) {
-  return SbByteSwapU16(value);
+static __inline uint64_t __sb_bswap_64(uint64_t __x) {
+  return (__sb_bswap_32((uint32_t)__x) + 0ULL) << 32 | __sb_bswap_32(__x >> 32);
 }
 
-template <>
-inline int32_t SbByteSwap(int32_t value) {
-  return SbByteSwapS32(value);
-}
+#if SB_IS(BIG_ENDIAN)
+#define SB_HOST_TO_NET_S16(x) (x)
+#define SB_HOST_TO_NET_U16(x) (x)
+#define SB_HOST_TO_NET_S32(x) (x)
+#define SB_HOST_TO_NET_U32(x) (x)
+#define SB_HOST_TO_NET_S64(x) (x)
+#define SB_HOST_TO_NET_U64(x) (x)
+#else
+#define SB_HOST_TO_NET_S16(x) __sb_bswap_16(x)
+#define SB_HOST_TO_NET_U16(x) __sb_bswap_16(x)
+#define SB_HOST_TO_NET_S32(x) __sb_bswap_32(x)
+#define SB_HOST_TO_NET_U32(x) __sb_bswap_32(x)
+#define SB_HOST_TO_NET_S64(x) __sb_bswap_64(x)
+#define SB_HOST_TO_NET_U64(x) __sb_bswap_64(x)
+#endif
 
-template <>
-inline uint32_t SbByteSwap(uint32_t value) {
-  return SbByteSwapU32(value);
-}
+#define SB_NET_TO_HOST_S16(x) SB_HOST_TO_NET_S16(x)
+#define SB_NET_TO_HOST_U16(x) SB_HOST_TO_NET_U16(x)
+#define SB_NET_TO_HOST_S32(x) SB_HOST_TO_NET_S32(x)
+#define SB_NET_TO_HOST_U32(x) SB_HOST_TO_NET_U32(x)
+#define SB_NET_TO_HOST_S64(x) SB_HOST_TO_NET_S64(x)
+#define SB_NET_TO_HOST_U64(x) SB_HOST_TO_NET_U64(x)
 
-template <>
-inline int64_t SbByteSwap(int64_t value) {
-  return SbByteSwapS64(value);
-}
+#ifdef __cplusplus
+}  // extern "C"
+#endif
 
-template <>
-inline uint64_t SbByteSwap(uint64_t value) {
-  return SbByteSwapU64(value);
-}
-
-}  // namespace starboard
+#endif  // SB_API_VERSION < 16
 
 #endif  // STARBOARD_COMMON_BYTE_SWAP_H_
diff --git a/starboard/common/common.cc b/starboard/common/common.cc
index 49ae0d2..e7effe3 100644
--- a/starboard/common/common.cc
+++ b/starboard/common/common.cc
@@ -17,16 +17,16 @@
 // These audits are here so they are only displayed once every build.
 
 #if SB_API_VERSION == SB_EXPERIMENTAL_API_VERSION
-#pragma message( \
-    "Your platform's SB_API_VERSION == SB_EXPERIMENTAL_API_VERSION. " \
-    "You are implementing the Experimental version of Starboard at your " \
-    "own risk!  We don't recommend this for third parties.")
+#pragma message(                                                              \
+        "Your platform's SB_API_VERSION == SB_EXPERIMENTAL_API_VERSION. "     \
+        "You are implementing the Experimental version of Starboard at your " \
+        "own risk!  We don't recommend this for third parties.")
 #endif
 
-#if defined(SB_RELEASE_CANDIDATE_API_VERSION) && \
+#if defined(SB_RELEASE_CANDIDATE_API_VERSION) &&          \
     SB_API_VERSION >= SB_RELEASE_CANDIDATE_API_VERSION && \
     SB_API_VERSION < SB_EXPERIMENTAL_API_VERSION
-#pragma message( \
-    "Your platform's SB_API_VERSION >= SB_RELEASE_CANDIDATE_API_VERSION. " \
-    "Note that the RC version of Starboard is still subject to change.")
+#pragma message(                                                               \
+        "Your platform's SB_API_VERSION >= SB_RELEASE_CANDIDATE_API_VERSION. " \
+        "Note that the RC version of Starboard is still subject to change.")
 #endif
diff --git a/starboard/common/file.cc b/starboard/common/file.cc
index ea2955a..e2aa877 100644
--- a/starboard/common/file.cc
+++ b/starboard/common/file.cc
@@ -19,6 +19,7 @@
 #include <vector>
 
 #include "starboard/common/log.h"
+#include "starboard/common/metrics/stats_tracker.h"
 #include "starboard/configuration_constants.h"
 #include "starboard/directory.h"
 #include "starboard/file.h"
@@ -37,6 +38,16 @@
 
 }  // namespace
 
+void RecordFileWriteStat(int write_file_result) {
+  auto& stats_tracker = StatsTrackerContainer::GetInstance()->stats_tracker();
+  if (write_file_result <= 0) {
+    stats_tracker.FileWriteFail();
+  } else {
+    stats_tracker.FileWriteSuccess();
+    stats_tracker.FileWriteBytesWritten(/*bytes_written=*/write_file_result);
+  }
+}
+
 bool SbFileDeleteRecursive(const char* path, bool preserve_root) {
   if (!SbFileExists(path)) {
     SB_LOG(ERROR) << "Path does not exist: '" << path << "'";
diff --git a/starboard/common/file.h b/starboard/common/file.h
index c24cdfe..3965042 100644
--- a/starboard/common/file.h
+++ b/starboard/common/file.h
@@ -24,6 +24,8 @@
 
 namespace starboard {
 
+void RecordFileWriteStat(int write_file_result);
+
 // Deletes the file, symlink or directory at |path|. When |path| is a directory,
 // the function will recursively delete the entire tree; however, when
 // |preserve_root| is |true| the root directory is not removed. On some
@@ -75,11 +77,15 @@
   }
 
   int Write(const char* data, int size) const {
-    return SbFileWrite(file_, data, size);
+    int result = SbFileWrite(file_, data, size);
+    RecordFileWriteStat(result);
+    return result;
   }
 
   int WriteAll(const char* data, int size) const {
-    return SbFileWriteAll(file_, data, size);
+    int result = SbFileWriteAll(file_, data, size);
+    RecordFileWriteStat(result);
+    return result;
   }
 
   bool Truncate(int64_t length) const { return SbFileTruncate(file_, length); }
diff --git a/starboard/common/log.h b/starboard/common/log.h
index 48f7596..74b8384 100644
--- a/starboard/common/log.h
+++ b/starboard/common/log.h
@@ -123,7 +123,7 @@
 #define SB_LAZY_STREAM(stream, condition) \
   !(condition) ? (void)0 : ::starboard::logging::LogMessageVoidify() & (stream)
 
-#if SB_LOGGING_IS_OFFICIAL_BUILD && !SB_IS(EVERGREEN) && \
+#if SB_LOGGING_IS_OFFICIAL_BUILD && !SB_IS(MODULAR) && \
     !SB_IS(EVERGREEN_COMPATIBLE)
 #define SB_LOG_IS_ON(severity)                         \
   ((::starboard::logging::SB_LOG_##severity >=         \
diff --git a/cobalt/h5vcc/h5vcc_account_info.idl b/starboard/common/metrics/stats_tracker.cc
similarity index 63%
copy from cobalt/h5vcc/h5vcc_account_info.idl
copy to starboard/common/metrics/stats_tracker.cc
index 1fc2417..e9e4483 100644
--- a/cobalt/h5vcc/h5vcc_account_info.idl
+++ b/starboard/common/metrics/stats_tracker.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Cobalt Authors. All Rights Reserved.
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,8 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-interface H5vccAccountInfo {
-  readonly attribute DOMString avatarUrl;
-  readonly attribute DOMString username;
-  readonly attribute DOMString userId;
-};
+#include "starboard/common/metrics/stats_tracker.h"
+
+#include "starboard/once.h"
+
+namespace starboard {
+
+SB_ONCE_INITIALIZE_FUNCTION(StatsTrackerContainer,
+                            StatsTrackerContainer::GetInstance);
+
+}  // namespace starboard
diff --git a/starboard/common/metrics/stats_tracker.h b/starboard/common/metrics/stats_tracker.h
new file mode 100644
index 0000000..9406175
--- /dev/null
+++ b/starboard/common/metrics/stats_tracker.h
@@ -0,0 +1,75 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_COMMON_METRICS_STATS_TRACKER_H_
+#define STARBOARD_COMMON_METRICS_STATS_TRACKER_H_
+
+#include <memory>
+#include <utility>
+
+#include "starboard/common/log.h"
+
+namespace starboard {
+
+class StatsTracker {
+ public:
+  virtual ~StatsTracker() = default;
+
+  virtual void FileWriteSuccess() = 0;
+  virtual void FileWriteFail() = 0;
+  virtual void FileWriteBytesWritten(int bytes_written) = 0;
+
+  virtual void StorageWriteRecordSuccess() = 0;
+  virtual void StorageWriteRecordFail() = 0;
+  virtual void StorageWriteRecordBytesWritten(int bytes_written) = 0;
+};
+
+class StatsTrackerUndefined : public StatsTracker {
+ public:
+  void FileWriteSuccess() override {}
+  void FileWriteFail() override {}
+  void FileWriteBytesWritten(int bytes_written) override {}
+
+  void StorageWriteRecordSuccess() override {}
+  void StorageWriteRecordFail() override {}
+  void StorageWriteRecordBytesWritten(int bytes_written) override {}
+};
+
+class StatsTrackerContainer {
+ public:
+  static StatsTrackerContainer* GetInstance();
+
+  StatsTracker& stats_tracker() {
+    if (!stats_tracker_) {
+      SB_DLOG_IF(ERROR, !undefined_logged_)
+          << "[once] StatsTracker is not defined.";
+      undefined_logged_ = true;
+      return undefined_stats_tracker_;
+    }
+    return *(stats_tracker_.get());
+  }
+
+  void set_stats_tracker(std::unique_ptr<StatsTracker> stats_tracker) {
+    stats_tracker_ = std::move(stats_tracker);
+  }
+
+ private:
+  StatsTrackerUndefined undefined_stats_tracker_;
+  std::unique_ptr<StatsTracker> stats_tracker_;
+  bool undefined_logged_ = false;
+};
+
+}  // namespace starboard
+
+#endif  // STARBOARD_COMMON_METRICS_STATS_TRACKER_H_
diff --git a/starboard/common/optional.h b/starboard/common/optional.h
index 6c65763..f67609c 100644
--- a/starboard/common/optional.h
+++ b/starboard/common/optional.h
@@ -21,7 +21,6 @@
 
 #include "starboard/common/log.h"
 #include "starboard/configuration.h"
-#include "starboard/export.h"
 #include "starboard/memory.h"
 
 namespace starboard {
@@ -89,7 +88,7 @@
 extern const in_place_t in_place;
 
 template <typename T>
-class SB_EXPORT optional {
+class optional {
  public:
   // Construction via the default constructor results in an optional that is
   // not engaged.
diff --git a/starboard/common/optional_internal.h b/starboard/common/optional_internal.h
index a26353c..ae66db2 100644
--- a/starboard/common/optional_internal.h
+++ b/starboard/common/optional_internal.h
@@ -18,6 +18,9 @@
 // limitations under the License.
 //
 
+#ifndef STARBOARD_COMMON_OPTIONAL_INTERNAL_H_
+#define STARBOARD_COMMON_OPTIONAL_INTERNAL_H_
+
 // clang-format off
 // Begin forwarding constructor definitions ////////////////////////////////////
   explicit optional(in_place_t) {
@@ -178,3 +181,5 @@
   }
 // End emplace(...) definitions ////////////////////////////////////////////////
 // clang-format on
+
+#endif  // STARBOARD_COMMON_OPTIONAL_INTERNAL_H_
diff --git a/starboard/common/rwlock.cc b/starboard/common/rwlock.cc
index 3e54d03..0dd0ac1 100644
--- a/starboard/common/rwlock.cc
+++ b/starboard/common/rwlock.cc
@@ -20,9 +20,7 @@
 
 // Write-preferring lock.
 // https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock
-RWLock::RWLock()
-    : readers_(0),
-      writing_(false) {
+RWLock::RWLock() : readers_(0), writing_(false) {
   SB_CHECK(SbMutexCreate(&mutex_));
   SB_CHECK(SbConditionVariableCreate(&condition_, &mutex_));
 }
diff --git a/starboard/common/scoped_ptr.h b/starboard/common/scoped_ptr.h
index 90e91e4..e90eb1a 100644
--- a/starboard/common/scoped_ptr.h
+++ b/starboard/common/scoped_ptr.h
@@ -1,3 +1,4 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
@@ -9,20 +10,20 @@
 //
 // Example usage (scoped_ptr):
 //   {
-//     scoped_ptr<Foo> foo(new Foo("wee"));
+//     scoped_ptr<Foo> foo(new Foo("whee"));
 //   }  // foo goes out of scope, releasing the pointer with it.
 //
 //   {
 //     scoped_ptr<Foo> foo;          // No pointer managed.
-//     foo.reset(new Foo("wee"));    // Now a pointer is managed.
-//     foo.reset(new Foo("wee2"));   // Foo("wee") was destroyed.
-//     foo.reset(new Foo("wee3"));   // Foo("wee2") was destroyed.
+//     foo.reset(new Foo("whee"));   // Now a pointer is managed.
+//     foo.reset(new Foo("whee2"));  // Foo("whee") was destroyed.
+//     foo.reset(new Foo("whee3"));  // Foo("whee2") was destroyed.
 //     foo->Method();                // Foo::Method() called.
 //     foo.get()->Method();          // Foo::Method() called.
 //     SomeFunc(foo.release());      // SomeFunc takes ownership, foo no longer
 //                                   // manages a pointer.
-//     foo.reset(new Foo("wee4"));   // foo manages a pointer again.
-//     foo.reset();                  // Foo("wee4") destroyed, foo no longer
+//     foo.reset(new Foo("whee4"));  // foo manages a pointer again.
+//     foo.reset();                  // Foo("whee4") destroyed, foo no longer
 //                                   // manages a pointer.
 //   }  // foo wasn't managing a pointer, so nothing was destroyed.
 //
@@ -92,6 +93,7 @@
 // scoped_array, scoped_ptr_malloc.
 
 #include <algorithm>
+#include <utility>
 
 #include "starboard/common/log.h"
 #include "starboard/common/move.h"
@@ -128,12 +130,13 @@
   // Constructor.  Allows construction from a scoped_ptr rvalue for a
   // convertible type.
   template <typename U>
-  scoped_ptr(scoped_ptr<U> other)
+  scoped_ptr(scoped_ptr<U> other)  // NOLINT(runtime/explicit)
       : ptr_(other.release()) {}
 #endif
 
   // Constructor.  Move constructor for C++03 move emulation of this type.
-  scoped_ptr(RValue rvalue) : ptr_(rvalue.object->release()) {}
+  scoped_ptr(RValue rvalue)  // NOLINT(runtime/explicit)
+      : ptr_(rvalue.object->release()) {}
 
   // Destructor.  If there is a C object, delete it.
   // We don't need to test ptr_ == NULL because C++ does that for us.
@@ -264,7 +267,8 @@
   explicit scoped_array(C* p = NULL) : array_(p) {}
 
   // Constructor.  Move constructor for C++03 move emulation of this type.
-  scoped_array(RValue rvalue) : array_(rvalue.object->release()) {}
+  scoped_array(RValue rvalue)  // NOLINT(runtime/explicit)
+      : array_(rvalue.object->release()) {}
 
   // Destructor.  If there is a C object, delete it.
   // We don't need to test ptr_ == NULL because C++ does that for us.
@@ -390,7 +394,8 @@
   explicit scoped_ptr_malloc(C* p = NULL) : ptr_(p) {}
 
   // Constructor.  Move constructor for C++03 move emulation of this type.
-  scoped_ptr_malloc(RValue rvalue) : ptr_(rvalue.object->release()) {}
+  scoped_ptr_malloc(RValue rvalue)  // NOLINT(runtime/explicit)
+      : ptr_(rvalue.object->release()) {}
 
   // Destructor.  If there is a C object, call the Free functor.
   ~scoped_ptr_malloc() { reset(); }
diff --git a/starboard/common/test_main.cc b/starboard/common/test_main.cc
index 9144eaa..375ff3a 100644
--- a/starboard/common/test_main.cc
+++ b/starboard/common/test_main.cc
@@ -26,7 +26,7 @@
 
 // When we are building Evergreen we need to export SbEventHandle so that the
 // ELF loader can find and invoke it.
-#if SB_IS(EVERGREEN)
+#if SB_IS(MODULAR)
 SB_EXPORT
-#endif  // SB_IS(EVERGREEN)
+#endif  // SB_IS(MODULAR)
 STARBOARD_WRAP_SIMPLE_MAIN(InitAndRunAllTests);
diff --git a/starboard/contrib/README.md b/starboard/contrib/README.md
index fe405cc..c327f06 100644
--- a/starboard/contrib/README.md
+++ b/starboard/contrib/README.md
@@ -1,10 +1,9 @@
-# The starboard/contrib directroy
+# The starboard/contrib directory
 
 Contents of this directory have been contributed by the community, but
 have not been fully integrated into the Google-managed internal continuous
 integration system.
 
 Therefore, while ports in this directory have compiled and worked correctly
-in the past, they may require some maintenence to work with the current
+in the past, they may require some maintenance to work with the current
 release of Cobalt.
-
diff --git a/starboard/doc/evergreen/cobalt_evergreen_overview.md b/starboard/doc/evergreen/cobalt_evergreen_overview.md
index 8e2591c..2f35e8b 100644
--- a/starboard/doc/evergreen/cobalt_evergreen_overview.md
+++ b/starboard/doc/evergreen/cobalt_evergreen_overview.md
@@ -90,38 +90,46 @@
 
 ### Building Cobalt Evergreen Components
 
-Cobalt Evergreen requires that there are two separate build(`gyp`)
-configurations used due to the separation of the Cobalt core(`libcobalt.so`) and
-the platform-specific Starboard layer(`loader_app`). As a result, you will have
-to initiate a separate gyp process for each. This is required since the Cobalt
-core binary is built with the Google toolchain settings and the
-platform-specific Starboard layer is built with partner toolchain
-configurations.
+Because of its separation of the Cobalt core (`libcobalt.so`) and platform-
+specific Starboard layers, Cobalt Evergreen requires two build configurations.
+This means there are two relevant GN platforms defined in the build code, and
+that `gn gen` must be run twice to generate ninja files for two separate
+platforms.
 
-Cobalt Evergreen is built by a separate gyp platform using the Google toolchain:
+#### Configuring your port for Evergreen
+
+The Evergreen platforms for the different supported architectures, which are
+used to build Cobalt core (`libcobalt.so`), are maintained by Google. So, no
+changes are needed by the partner here.
+
+However, a few small changes are needed in the partner's port, which is used to
+build the partner-built components, to make it compatible with Evergreen.
+
+First, partners should set `sb_is_evergreen_compatible = true` in the platform's
+`platform_configuration/configuration.gni` file. (Please DO NOT set
+`sb_is_evergreen` to `true`, as this should only be set in the Evergreen
+platforms that are maintained by Google and used to build Cobalt core.)
+
+Second, in the platform's `toolchain/BUILD.gn` file partners should copy their
+"target" toolchain to add a "native_target" toolchain that is identical except
+that it sets `is_starboard = false` and `is_native_target_build = true`.
+
+For example:
 
 ```
-$ cobalt/build/gn.py -p evergreen-arm-softfp -c qa
-$ ninja -C out/evergreen-arm-softfp_qa cobalt
+gcc_toolchain("target") {
+  ...
+}
+
+gcc_toolchain("native_target") {
+  ...
+  is_starboard = false
+  is_native_target_build = true
+}
 ```
 
-Which produces a shared library `libcobalt.so` targeted for specific
-architecture, ABI and Starboard version.
-
-The gyp variable `sb_evergreen` is set to 1 when building `libcobalt.so`.
-
-The partner port of Starboard is built with the partner’s toolchain and is
-linked into the `loader_app` which knows how to dynamically load
-`libcobalt.so`, and the `crashpad_handler` which handles crashes.
-
-```
-$ cobalt/build/gn.py -p <partner_port_name> -c qa
-$ ninja -C out/<partner_port_name>_qa loader_app crashpad_handler
-```
-
-Partners should set `sb_evergreen_compatible` to 1 in their gyp platform config.
-DO NOT set the `sb_evergreen` to 1 in your platform-specific configuration as it
-is used only by Cobalt when building with the Google toolchain.
+This "native_target" toolchain is required in order to build the
+`crashpad_handler` binary, which should NOT use the Starboard porting layer.
 
 Additionally, partners should install crash handlers as instructed in the
 [Installing Crash Handlers for Cobalt guide](../crash_handlers.md).
@@ -152,7 +160,36 @@
 If your target architecture falls outside the support list above, please reach
 out to us for guidance.
 
-#### Adding Crash Handlers to Evergreen
+#### Build commands
+
+As mentioned, the Google-maintained Evergreen toolchain is used to build Cobalt
+core (`libcobalt.so`). For example:
+
+```
+$ gn gen out/evergreen-arm-softfp_qa --args="target_platform=\"evergreen-arm-softfp\" build_type=\"qa\" target_cpu=\"arm\" target_os=\"linux\" sb_api_version=15"
+$ ninja -C out/evergreen-arm-softfp_qa cobalt_install
+```
+
+This produces a `libcobalt.so` shared library targeted for a specific
+architecture, ABI, and Starboard version.
+
+Note: `sb_api_version` defaults to the latest supported Starboard version in the
+current branch.
+
+
+The partner port of Starboard is built with the partner’s "target" toolchain and
+is linked into the `loader_app`, which knows how to dynamically load
+`libcobalt.so`. And the `crashpad_handler` binary is built with the partner's
+"native_target" toolchain. For example:
+
+```
+$ gn gen out/<partner_port_name>_qa --args='target_platform="<partner_port_name>" build_type="qa" sb_api_version=15'
+$ ninja -C out/<partner_port_name>_qa loader_app
+$ ninja -C out/<partner_port_name>_qa native_target/crashpad_handler
+```
+
+Note that when building `crashpad_handler`, a special prefix is used to have
+Ninja compile the target in the non-default, "native_target" toolchain.
 
 ### What is an example for how this would help me?
 
diff --git a/starboard/egl.h b/starboard/egl.h
index 7503691..82f6f3b 100644
--- a/starboard/egl.h
+++ b/starboard/egl.h
@@ -42,24 +42,24 @@
 
 // The following type definitions were adapted from the types declared in
 // https://www.khronos.org/registry/EGL/api/EGL/eglplatform.h.
-typedef int32_t  SbEglInt32;
+typedef int32_t SbEglInt32;
 typedef intptr_t SbEglNativeDisplayType;
 typedef intptr_t SbEglNativePixmapType;
 typedef intptr_t SbEglNativeWindowType;
 
 // The following type definitions were adapted from the types declared in
 // https://www.khronos.org/registry/EGL/api/EGL/egl.h.
-typedef void   (*SbEglCastsToProperFunctionPointerType)(void);
-typedef int64_t  SbEglAttrib;
+typedef void (*SbEglCastsToProperFunctionPointerType)(void);
+typedef int64_t SbEglAttrib;
 typedef uint32_t SbEglBoolean;
-typedef void*    SbEglClientBuffer;
-typedef void*    SbEglConfig;
-typedef void*    SbEglContext;
-typedef void*    SbEglDisplay;
+typedef void* SbEglClientBuffer;
+typedef void* SbEglConfig;
+typedef void* SbEglContext;
+typedef void* SbEglDisplay;
 typedef uint32_t SbEglEnum;
-typedef void*    SbEglImage;
-typedef void*    SbEglSurface;
-typedef void*    SbEglSync;
+typedef void* SbEglImage;
+typedef void* SbEglSurface;
+typedef void* SbEglSync;
 typedef uint64_t SbEglTime;
 
 typedef struct SbEglInterface {
diff --git a/starboard/elf_loader/BUILD.gn b/starboard/elf_loader/BUILD.gn
index bca4126..7883415 100644
--- a/starboard/elf_loader/BUILD.gn
+++ b/starboard/elf_loader/BUILD.gn
@@ -115,6 +115,9 @@
     if (!sb_is_evergreen_compatible) {
       deps += [ "//third_party/crashpad/wrapper:wrapper_stub" ]
     }
+    if (sb_is_evergreen_compatible && sb_evergreen_compatible_package) {
+      deps += [ "//starboard/loader_app:copy_crashpad_handler_named_as_so" ]
+    }
   }
 }
 
diff --git a/starboard/elf_loader/exported_symbols.cc b/starboard/elf_loader/exported_symbols.cc
index 3f8aef0..058a3be 100644
--- a/starboard/elf_loader/exported_symbols.cc
+++ b/starboard/elf_loader/exported_symbols.cc
@@ -16,7 +16,9 @@
 
 #include "starboard/accessibility.h"
 #include "starboard/audio_sink.h"
+#if SB_API_VERSION < 16
 #include "starboard/byte_swap.h"
+#endif
 #include "starboard/common/log.h"
 #include "starboard/condition_variable.h"
 #include "starboard/configuration.h"
@@ -98,12 +100,14 @@
   REGISTER_SYMBOL(SbAudioSinkIsAudioFrameStorageTypeSupported);
   REGISTER_SYMBOL(SbAudioSinkIsAudioSampleTypeSupported);
   REGISTER_SYMBOL(SbAudioSinkIsValid);
+#if SB_API_VERSION < 16
   REGISTER_SYMBOL(SbByteSwapS16);
   REGISTER_SYMBOL(SbByteSwapS32);
   REGISTER_SYMBOL(SbByteSwapS64);
   REGISTER_SYMBOL(SbByteSwapU16);
   REGISTER_SYMBOL(SbByteSwapU32);
   REGISTER_SYMBOL(SbByteSwapU64);
+#endif
   REGISTER_SYMBOL(SbConditionVariableBroadcast);
   REGISTER_SYMBOL(SbConditionVariableCreate);
   REGISTER_SYMBOL(SbConditionVariableDestroy);
diff --git a/starboard/evergreen/arm/hardfp/platform_configuration/BUILD.gn b/starboard/evergreen/arm/hardfp/platform_configuration/BUILD.gn
index 2dcac4f..c4403ea 100644
--- a/starboard/evergreen/arm/hardfp/platform_configuration/BUILD.gn
+++ b/starboard/evergreen/arm/hardfp/platform_configuration/BUILD.gn
@@ -28,7 +28,7 @@
     "//starboard/evergreen/arm/shared/platform_configuration",
   ]
   ldflags = [
-    "-m",
-    "armelf",
+    "-Wl,-m",
+    "-Wl,armelf",
   ]
 }
diff --git a/starboard/evergreen/arm/hardfp/toolchain/BUILD.gn b/starboard/evergreen/arm/hardfp/toolchain/BUILD.gn
index 5bc6339..8f50b01 100644
--- a/starboard/evergreen/arm/hardfp/toolchain/BUILD.gn
+++ b/starboard/evergreen/arm/hardfp/toolchain/BUILD.gn
@@ -12,7 +12,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import("//starboard/build/toolchain/linux/clang_lld_toolchain.gni")
+import("//build/config/clang/clang.gni")
+import("//build/toolchain/gcc_toolchain.gni")
 
-clang_lld_toolchain("target") {
+clang_toolchain("target") {
+  clang_base_path = clang_base_path
 }
diff --git a/starboard/evergreen/arm/softfp/platform_configuration/BUILD.gn b/starboard/evergreen/arm/softfp/platform_configuration/BUILD.gn
index 0de964f..907d14e 100644
--- a/starboard/evergreen/arm/softfp/platform_configuration/BUILD.gn
+++ b/starboard/evergreen/arm/softfp/platform_configuration/BUILD.gn
@@ -28,7 +28,7 @@
     "//starboard/evergreen/arm/shared/platform_configuration",
   ]
   ldflags = [
-    "-m",
-    "armelf",
+    "-Wl,-m",
+    "-Wl,armelf",
   ]
 }
diff --git a/starboard/evergreen/arm/softfp/toolchain/BUILD.gn b/starboard/evergreen/arm/softfp/toolchain/BUILD.gn
index 5bc6339..8f50b01 100644
--- a/starboard/evergreen/arm/softfp/toolchain/BUILD.gn
+++ b/starboard/evergreen/arm/softfp/toolchain/BUILD.gn
@@ -12,7 +12,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import("//starboard/build/toolchain/linux/clang_lld_toolchain.gni")
+import("//build/config/clang/clang.gni")
+import("//build/toolchain/gcc_toolchain.gni")
 
-clang_lld_toolchain("target") {
+clang_toolchain("target") {
+  clang_base_path = clang_base_path
 }
diff --git a/starboard/evergreen/arm64/platform_configuration/BUILD.gn b/starboard/evergreen/arm64/platform_configuration/BUILD.gn
index ce00c13..20a22bb 100644
--- a/starboard/evergreen/arm64/platform_configuration/BUILD.gn
+++ b/starboard/evergreen/arm64/platform_configuration/BUILD.gn
@@ -31,8 +31,8 @@
   ]
 
   ldflags = [
-    "-m",
-    "aarch64elf",
+    "-Wl,-m",
+    "-Wl,aarch64elf",
   ]
   cflags = [ "-isystem" +
              rebase_path("//third_party/musl/arch/aarch64", root_build_dir) ]
diff --git a/starboard/evergreen/arm64/toolchain/BUILD.gn b/starboard/evergreen/arm64/toolchain/BUILD.gn
index 5bc6339..8f50b01 100644
--- a/starboard/evergreen/arm64/toolchain/BUILD.gn
+++ b/starboard/evergreen/arm64/toolchain/BUILD.gn
@@ -12,7 +12,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import("//starboard/build/toolchain/linux/clang_lld_toolchain.gni")
+import("//build/config/clang/clang.gni")
+import("//build/toolchain/gcc_toolchain.gni")
 
-clang_lld_toolchain("target") {
+clang_toolchain("target") {
+  clang_base_path = clang_base_path
 }
diff --git a/starboard/evergreen/shared/launcher.py b/starboard/evergreen/shared/launcher.py
index 41143bd..cd427f4 100644
--- a/starboard/evergreen/shared/launcher.py
+++ b/starboard/evergreen/shared/launcher.py
@@ -21,7 +21,8 @@
 from starboard.tools import paths
 
 _BASE_STAGING_DIRECTORY = 'evergreen_staging'
-_CRASHPAD_TARGET = 'crashpad_handler'
+_NATIVE_TARGET_TOOLCHAIN = 'native_target'
+_CRASHPAD_EXECUTABLE = 'crashpad_handler'
 _DEFAULT_LOADER_TARGET = 'elf_loader_sandbox'
 
 
@@ -193,9 +194,11 @@
     loader_target_dst = os.path.join(self.staging_directory, self.loader_target)
     shutil.copy(loader_target_src, loader_target_dst)
 
-    crashpad_target_src = os.path.join(loader_install_path, 'bin',
-                                       _CRASHPAD_TARGET)
-    crashpad_target_dst = os.path.join(self.staging_directory, _CRASHPAD_TARGET)
+    crashpad_target_src = os.path.join(self.loader_out_directory,
+                                       _NATIVE_TARGET_TOOLCHAIN,
+                                       _CRASHPAD_EXECUTABLE)
+    crashpad_target_dst = os.path.join(self.staging_directory,
+                                       _CRASHPAD_EXECUTABLE)
     shutil.copy(crashpad_target_src, crashpad_target_dst)
 
     # Copy target content and binary
@@ -242,10 +245,11 @@
                                      self.loader_target)
     shutil.copy(loader_target_src, loader_target_dst)
 
-    crashpad_target_src = os.path.join(loader_binary_src, _CRASHPAD_TARGET,
-                                       _CRASHPAD_TARGET)
+    crashpad_target_src = os.path.join(self.loader_out_directory,
+                                       _NATIVE_TARGET_TOOLCHAIN,
+                                       _CRASHPAD_EXECUTABLE)
     crashpad_target_dst = os.path.join(staging_directory_loader,
-                                       _CRASHPAD_TARGET)
+                                       _CRASHPAD_EXECUTABLE)
     shutil.copy(crashpad_target_src, crashpad_target_dst)
 
     # Copy target content and binary
diff --git a/starboard/evergreen/shared/platform_configuration/BUILD.gn b/starboard/evergreen/shared/platform_configuration/BUILD.gn
index 6b154a0..2340c86 100644
--- a/starboard/evergreen/shared/platform_configuration/BUILD.gn
+++ b/starboard/evergreen/shared/platform_configuration/BUILD.gn
@@ -14,22 +14,23 @@
 
 config("platform_configuration") {
   ldflags = [
-    "--build-id",
-    "--gc-sections",
-    "-X",
-    "-v",
-    "-eh-frame-hdr",
-    "--fini=__cxa_finalize",
-    "-shared",
-    "-L$clang_base_path",
-    "-L/usr/lib",
-    "-L/lib",
-    "-nostdlib",
-    "--whole-archive",
-    "--no-whole-archive",
-    "-u GetEvergreenSabiString",
+    "-fuse-ld=lld",
+    "-Wl,--build-id",
+    "-Wl,--gc-sections",
+    "-Wl,-X",
+    "-Wl,-v",
+    "-Wl,-eh-frame-hdr",
+    "-Wl,--fini=__cxa_finalize",
+    "-Wl,-shared",
+    "-Wl,-L$clang_base_path",
+    "-Wl,-L/usr/lib",
+    "-Wl,-L/lib",
+    "-Wl,-u GetEvergreenSabiString",
   ]
 
+  if (sb_is_evergreen) {
+    ldflags += [ "-nostdlib" ]
+  }
   cflags = [
     "-ffunction-sections",
     "-fdata-sections",
@@ -91,11 +92,13 @@
     cflags += [
       "-O0",
       "-frtti",
+      "-g",
     ]
   } else if (is_devel) {
     cflags += [
       "-O2",
       "-frtti",
+      "-g",
     ]
   } else {
     cflags += [
@@ -105,7 +108,6 @@
   }
 
   if (is_clang) {
-    ldflags += [ "-nostdlib" ]
     cflags += [
       "-fcolor-diagnostics",
 
@@ -201,7 +203,7 @@
 config("size") {
   cflags = [ "-Os" ]
   if (is_qa || is_gold) {
-    ldflags = [ "--icf=safe" ]
+    ldflags = [ "-Wl,--icf=safe" ]
   }
 }
 
diff --git a/starboard/evergreen/shared/platform_configuration/configuration.gni b/starboard/evergreen/shared/platform_configuration/configuration.gni
index f3aab33..4327e1d 100644
--- a/starboard/evergreen/shared/platform_configuration/configuration.gni
+++ b/starboard/evergreen/shared/platform_configuration/configuration.gni
@@ -14,7 +14,7 @@
 
 import("//starboard/build/config/base_configuration.gni")
 
-sb_is_evergreen = true
+sb_is_evergreen = !build_with_separate_cobalt_toolchain
 
 cobalt_font_package = "empty"
 
diff --git a/starboard/evergreen/testing/run_all_tests.sh b/starboard/evergreen/testing/run_all_tests.sh
index 0894d29..9fc6e33 100755
--- a/starboard/evergreen/testing/run_all_tests.sh
+++ b/starboard/evergreen/testing/run_all_tests.sh
@@ -24,7 +24,8 @@
 USE_COMPRESSED_SYSTEM_IMAGE="false"
 SYSTEM_IMAGE_EXTENSION=".so"
 
-DISABLE_TESTS="false"
+# Temporary disable test to publish new SB 16 changes b/149243810
+DISABLE_TESTS="true"
 
 while getopts "d:a:c" o; do
     case "${o}" in
diff --git a/starboard/evergreen/x64/platform_configuration/BUILD.gn b/starboard/evergreen/x64/platform_configuration/BUILD.gn
index 47d7e22..d49869b 100644
--- a/starboard/evergreen/x64/platform_configuration/BUILD.gn
+++ b/starboard/evergreen/x64/platform_configuration/BUILD.gn
@@ -28,8 +28,8 @@
   ]
 
   ldflags = [
-    "-m",
-    "elf_x86_64",
+    "-Wl,-m",
+    "-Wl,elf_x86_64",
   ]
   cflags = [ "-isystem" +
              rebase_path("//third_party/musl/arch/x86_64", root_build_dir) ]
diff --git a/starboard/evergreen/x64/toolchain/BUILD.gn b/starboard/evergreen/x64/toolchain/BUILD.gn
index 5bc6339..8f50b01 100644
--- a/starboard/evergreen/x64/toolchain/BUILD.gn
+++ b/starboard/evergreen/x64/toolchain/BUILD.gn
@@ -12,7 +12,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import("//starboard/build/toolchain/linux/clang_lld_toolchain.gni")
+import("//build/config/clang/clang.gni")
+import("//build/toolchain/gcc_toolchain.gni")
 
-clang_lld_toolchain("target") {
+clang_toolchain("target") {
+  clang_base_path = clang_base_path
 }
diff --git a/starboard/evergreen/x86/platform_configuration/BUILD.gn b/starboard/evergreen/x86/platform_configuration/BUILD.gn
index 633a354..d1bcbc0 100644
--- a/starboard/evergreen/x86/platform_configuration/BUILD.gn
+++ b/starboard/evergreen/x86/platform_configuration/BUILD.gn
@@ -27,6 +27,10 @@
     "//starboard/evergreen/shared/platform_configuration",
   ]
 
+  ldflags = [
+    "-Wl,-m",
+    "-Wl,elf_i386",
+  ]
   cflags = [ "-isystem" +
              rebase_path("//third_party/musl/arch/i386", root_build_dir) ]
 }
diff --git a/starboard/evergreen/x86/toolchain/BUILD.gn b/starboard/evergreen/x86/toolchain/BUILD.gn
index 5bc6339..8f50b01 100644
--- a/starboard/evergreen/x86/toolchain/BUILD.gn
+++ b/starboard/evergreen/x86/toolchain/BUILD.gn
@@ -12,7 +12,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import("//starboard/build/toolchain/linux/clang_lld_toolchain.gni")
+import("//build/config/clang/clang.gni")
+import("//build/toolchain/gcc_toolchain.gni")
 
-clang_lld_toolchain("target") {
+clang_toolchain("target") {
+  clang_base_path = clang_base_path
 }
diff --git a/starboard/examples/glclear/main.cc b/starboard/examples/glclear/main.cc
index 2a4e361..1971b37 100644
--- a/starboard/examples/glclear/main.cc
+++ b/starboard/examples/glclear/main.cc
@@ -153,7 +153,9 @@
   // Create the GLES2 or GLEX3 Context.
   context_ = SB_EGL_NO_CONTEXT;
   SbEglInt32 context_attrib_list[] = {
-      SB_EGL_CONTEXT_CLIENT_VERSION, 3, SB_EGL_NONE,
+      SB_EGL_CONTEXT_CLIENT_VERSION,
+      3,
+      SB_EGL_NONE,
   };
 
   if (context_ == SB_EGL_NO_CONTEXT) {
@@ -242,6 +244,7 @@
       delete s_application;
     } break;
 
-    default: {}
+    default: {
+    }
   }
 }
diff --git a/starboard/export.h b/starboard/export.h
index 3578e17..60be3f9 100644
--- a/starboard/export.h
+++ b/starboard/export.h
@@ -24,12 +24,12 @@
 // COMPONENT_BUILD is defined when generating shared libraries for each project,
 // rather than static libraries. This means we need to be careful about
 // EXPORT/IMPORT.
-//
-// SB_IS_EVERGREEN is defined when the binaries generated will be composed
+
+// SB_IS_MODULAR is defined when the binaries generated will be composed
 // entirely of the Starboard implementation and will provide the Starboard API,
 // with all client applications being built separately.
 
-#if defined(COMPONENT_BUILD) || SB_IS(EVERGREEN)
+#if defined(COMPONENT_BUILD) || SB_IS(MODULAR)
 
 // STARBOARD_IMPLEMENTATION is defined when building the Starboard library
 // sources, and shouldn't be defined when building sources that are clients of
@@ -54,7 +54,7 @@
 #define SB_EXPORT_PRIVATE SB_IMPORT_PLATFORM
 #define SB_IMPORT SB_EXPORT_PLATFORM
 #endif
-#else  // defined(COMPONENT_BUILD) || SB_IS(EVERGREEN)
+#else  // defined(COMPONENT_BUILD) || SB_IS(MODULAR)
 #define SB_EXPORT
 #define SB_EXPORT_PRIVATE
 #define SB_IMPORT
diff --git a/starboard/extension/BUILD.gn b/starboard/extension/BUILD.gn
index cf61cd9..57b95b1 100644
--- a/starboard/extension/BUILD.gn
+++ b/starboard/extension/BUILD.gn
@@ -26,7 +26,7 @@
     "//testing/gmock",
     "//testing/gtest",
   ]
-  if (sb_is_evergreen) {
+  if (sb_is_modular && current_toolchain == cobalt_toolchain) {
     deps += cobalt_platform_dependencies
   }
 }
diff --git a/starboard/gles.h b/starboard/gles.h
index 08f5f36..14ecef1 100644
--- a/starboard/gles.h
+++ b/starboard/gles.h
@@ -43,24 +43,24 @@
 
 // The following type definitions were adapted from the types declared in
 // https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h.
-typedef uint8_t  SbGlBoolean;
+typedef uint8_t SbGlBoolean;
 typedef uint32_t SbGlBitfield;
-typedef char     SbGlChar;
-typedef float    SbGlClampf;
+typedef char SbGlChar;
+typedef float SbGlClampf;
 typedef uint32_t SbGlEnum;
-typedef int32_t  SbGlFixed;
-typedef float    SbGlFloat;
-typedef int8_t   SbGlInt8;
-typedef int16_t  SbGlInt16;
-typedef int32_t  SbGlInt32;
-typedef int64_t  SbGlInt64;
-typedef int32_t  SbGlSizei;
+typedef int32_t SbGlFixed;
+typedef float SbGlFloat;
+typedef int8_t SbGlInt8;
+typedef int16_t SbGlInt16;
+typedef int32_t SbGlInt32;
+typedef int64_t SbGlInt64;
+typedef int32_t SbGlSizei;
 typedef struct __GLsync* SbGlSync;
-typedef uint8_t  SbGlUInt8;
+typedef uint8_t SbGlUInt8;
 typedef uint16_t SbGlUInt16;
 typedef uint32_t SbGlUInt32;
 typedef uint64_t SbGlUInt64;
-typedef void     SbGlVoid;
+typedef void SbGlVoid;
 
 // Some compilers will transform the intptr_t to an int transparently behind the
 // scenes, which is not equivalent to a long int, or long long int, as far as
@@ -68,10 +68,10 @@
 // types to those exact types used by OpenGL ES 2.0
 // (https://www.khronos.org/registry/OpenGL/api/GLES2/gl2ext.h).
 #if (SB_SIZE_OF(POINTER) == 8) && (SB_SIZE_OF(LONG) == 4)
-typedef long long int SbGlIntPtr;  // NOLINT
+typedef long long int SbGlIntPtr;    // NOLINT
 typedef long long int SbGlSizeiPtr;  // NOLINT
 #else   // (SB_SIZE_OF(POINTER) != 8) || (SB_SIZE_OF(LONG) != 4)
-typedef long int SbGlIntPtr;  // NOLINT
+typedef long int SbGlIntPtr;    // NOLINT
 typedef long int SbGlSizeiPtr;  // NOLINT
 #endif  // (SB_SIZE_OF(POINTER) == 8) && (SB_SIZE_OF(LONG) == 4)
 
diff --git a/starboard/linux/shared/BUILD.gn b/starboard/linux/shared/BUILD.gn
index 01a1bf5..8bccb82 100644
--- a/starboard/linux/shared/BUILD.gn
+++ b/starboard/linux/shared/BUILD.gn
@@ -47,8 +47,8 @@
 
 static_library("starboard_base_symbolize") {
   sources = [
-    "//base/third_party/symbolize/demangle.cc",
-    "//base/third_party/symbolize/symbolize.cc",
+    "//third_party/symbolize/demangle.cc",
+    "//third_party/symbolize/symbolize.cc",
   ]
   public_deps = [ "//starboard/elf_loader:evergreen_info" ]
 }
@@ -378,17 +378,6 @@
   ]
   deps = [ "//third_party/boringssl:crypto" ]
 
-  if (sb_api_version == 12) {
-    sources += [
-      "//starboard/shared/stub/speech_recognizer_cancel.cc",
-      "//starboard/shared/stub/speech_recognizer_create.cc",
-      "//starboard/shared/stub/speech_recognizer_destroy.cc",
-      "//starboard/shared/stub/speech_recognizer_is_supported.cc",
-      "//starboard/shared/stub/speech_recognizer_start.cc",
-      "//starboard/shared/stub/speech_recognizer_stop.cc",
-    ]
-  }
-
   if (is_internal_build) {
     sources += [
       "//internal/starboard/linux/shared/internal/oemcrypto_engine_device_properties_linux.cc",
@@ -439,13 +428,15 @@
     build_loader = false
     testonly = true
 
-    sources = media_tests_sources + player_tests_sources +
-              [ "//starboard/common/test_main.cc" ]
+    sources = media_tests_sources + player_tests_sources + [
+                "//starboard/common/test_main.cc",
+                "//starboard/shared/ffmpeg/ffmpeg_audio_decoder_test.cc",
+              ]
 
     configs += [ "//starboard/build/config:starboard_implementation" ]
 
     deps = [
-      "//starboard",
+      "//starboard:starboard_with_main",
       "//starboard/shared/starboard/player/filter/testing:test_util",
       "//testing/gmock",
       "//testing/gtest",
diff --git a/starboard/linux/shared/cobalt/configuration.py b/starboard/linux/shared/cobalt/configuration.py
index 957db80..6deb19f 100644
--- a/starboard/linux/shared/cobalt/configuration.py
+++ b/starboard/linux/shared/cobalt/configuration.py
@@ -13,6 +13,8 @@
 # limitations under the License.
 """Starboard Linux Cobalt shared configuration."""
 
+import os
+
 from cobalt.build import cobalt_configuration
 from starboard.tools.testing import test_filter
 
@@ -61,6 +63,12 @@
     ],
 }
 
+# Tracked by b/294070803
+if os.getenv('MODULAR_BUILD', '0') == '1':
+  _FILTERED_TESTS['layout_tests'] = [
+      'CobaltSpecificLayoutTests/Layout.Test/platform_object_user_properties_survive_gc',  # pylint: disable=line-too-long
+  ]
+
 
 class CobaltLinuxConfiguration(cobalt_configuration.CobaltConfiguration):
   """Starboard Linux Cobalt shared configuration."""
@@ -104,5 +112,9 @@
         },
         'net_unittests': {
             'ASAN_OPTIONS': 'detect_leaks=0'
+        },
+        # Tracked by b/294071365
+        'starboard_platform_tests': {
+            'ASAN_OPTIONS': 'detect_odr_violation=0'
         }
     }
diff --git a/starboard/linux/shared/launcher.py b/starboard/linux/shared/launcher.py
index 812b87c..539f018 100644
--- a/starboard/linux/shared/launcher.py
+++ b/starboard/linux/shared/launcher.py
@@ -69,9 +69,6 @@
         self.executable = os.path.abspath(
             os.path.join(self.out_directory, "starboard", self.target_name))
 
-      # TODO(b/285234546): Resolve ASAN leaks and re-enable it.
-      self.IgnoreAsanLeaks()
-
     env = os.environ.copy()
     env.update(self.env_variables)
     self.full_env = env
diff --git a/starboard/linux/shared/media_is_audio_supported.cc b/starboard/linux/shared/media_is_audio_supported.cc
index 8d2e637..d857bd5 100644
--- a/starboard/linux/shared/media_is_audio_supported.cc
+++ b/starboard/linux/shared/media_is_audio_supported.cc
@@ -49,6 +49,12 @@
   if (audio_codec == kSbMediaAudioCodecMp3) {
     return bitrate <= kSbMediaMaxAudioBitrateInBitsPerSecond;
   }
+  if (audio_codec == kSbMediaAudioCodecPcm) {
+    return bitrate <= kSbMediaMaxAudioBitrateInBitsPerSecond;
+  }
+  if (audio_codec == kSbMediaAudioCodecFlac) {
+    return bitrate <= kSbMediaMaxAudioBitrateInBitsPerSecond;
+  }
 #endif  // SB_API_VERSION >= 14
 
   return false;
diff --git a/starboard/linux/shared/platform_configuration/BUILD.gn b/starboard/linux/shared/platform_configuration/BUILD.gn
index d1cc9e1..4e7334a 100644
--- a/starboard/linux/shared/platform_configuration/BUILD.gn
+++ b/starboard/linux/shared/platform_configuration/BUILD.gn
@@ -63,8 +63,8 @@
       # Do not warn about unused function params.
       "-Wno-unused-parameter",
     ]
-    if (build_with_separate_cobalt_toolchain) {
-      # If we're building modularly, we need visibility.
+    if (sb_is_modular && !sb_is_evergreen) {
+      # If we're building with cobalt toolchain and native linker, we need visibility.
       cflags += [ "-fvisibility=default" ]
     } else {
       # Default visibility to hidden, to enable dead stripping.
@@ -143,7 +143,7 @@
     "rt",
   ]
 
-  if (!sb_is_evergreen) {
+  if (!sb_is_modular || current_toolchain != cobalt_toolchain) {
     ldflags += [ "-static-libstdc++" ]
   }
 
diff --git a/starboard/linux/x64x11/BUILD.gn b/starboard/linux/x64x11/BUILD.gn
index ad6b13a..3666f36 100644
--- a/starboard/linux/x64x11/BUILD.gn
+++ b/starboard/linux/x64x11/BUILD.gn
@@ -15,7 +15,10 @@
 static_library("starboard_platform") {
   check_includes = false
 
-  sources = [ "//starboard/linux/x64x11/main.cc" ]
+  sources = [ "//starboard/linux/x64x11/run_starboard_main.cc" ]
+  if (!sb_is_modular || sb_is_evergreen) {
+    sources += [ "//starboard/linux/x64x11/main.cc" ]
+  }
 
   public_deps = [
     "//starboard/linux/x64x11/shared:starboard_platform",
@@ -24,3 +27,12 @@
 
   configs += [ "//starboard/build/config:starboard_implementation" ]
 }
+
+if (sb_is_modular && !sb_is_evergreen) {
+  static_library("starboard_platform_with_main") {
+    check_includes = false
+    sources = [ "//starboard/linux/x64x11/main.cc" ]
+    configs += [ "//starboard/build/config:starboard_implementation" ]
+    public_deps = [ ":starboard_platform" ]
+  }
+}
diff --git a/starboard/linux/x64x11/clang/3.9/BUILD.gn b/starboard/linux/x64x11/clang/3.9/BUILD.gn
index ba56f59..f947b50 100644
--- a/starboard/linux/x64x11/clang/3.9/BUILD.gn
+++ b/starboard/linux/x64x11/clang/3.9/BUILD.gn
@@ -15,7 +15,10 @@
 static_library("starboard_platform") {
   check_includes = false
 
-  sources = [ "//starboard/linux/x64x11/main.cc" ]
+  sources = [ "//starboard/linux/x64x11/run_starboard_main.cc" ]
+  if (!sb_is_modular || sb_is_evergreen) {
+    sources += [ "//starboard/linux/x64x11/main.cc" ]
+  }
 
   public_deps = [
     "//starboard/linux/x64x11/shared:starboard_platform",
diff --git a/starboard/linux/x64x11/egl/BUILD.gn b/starboard/linux/x64x11/egl/BUILD.gn
index ad6b13a..91ed007 100644
--- a/starboard/linux/x64x11/egl/BUILD.gn
+++ b/starboard/linux/x64x11/egl/BUILD.gn
@@ -15,7 +15,10 @@
 static_library("starboard_platform") {
   check_includes = false
 
-  sources = [ "//starboard/linux/x64x11/main.cc" ]
+  sources = [ "//starboard/linux/x64x11/run_starboard_main.cc" ]
+  if (!sb_is_modular || sb_is_evergreen) {
+    sources += [ "//starboard/linux/x64x11/main.cc" ]
+  }
 
   public_deps = [
     "//starboard/linux/x64x11/shared:starboard_platform",
diff --git a/starboard/linux/x64x11/gcc/6.3/BUILD.gn b/starboard/linux/x64x11/gcc/6.3/BUILD.gn
index ba56f59..f947b50 100644
--- a/starboard/linux/x64x11/gcc/6.3/BUILD.gn
+++ b/starboard/linux/x64x11/gcc/6.3/BUILD.gn
@@ -15,7 +15,10 @@
 static_library("starboard_platform") {
   check_includes = false
 
-  sources = [ "//starboard/linux/x64x11/main.cc" ]
+  sources = [ "//starboard/linux/x64x11/run_starboard_main.cc" ]
+  if (!sb_is_modular || sb_is_evergreen) {
+    sources += [ "//starboard/linux/x64x11/main.cc" ]
+  }
 
   public_deps = [
     "//starboard/linux/x64x11/shared:starboard_platform",
diff --git a/starboard/linux/x64x11/gcc/6.3/nosanitizer.diff b/starboard/linux/x64x11/gcc/6.3/nosanitizer.diff
deleted file mode 100644
index 838bf56..0000000
--- a/starboard/linux/x64x11/gcc/6.3/nosanitizer.diff
+++ /dev/null
@@ -1,17 +0,0 @@
-diff -ur x86_64-linux-gnu-gcc-6.3.0.orig/gcc-6.3.0/libsanitizer/configure.tgt x86_64-linux-gnu-gcc-6.3.0/gcc-6.3.0/libsanitizer/configure.tgt
---- x86_64-linux-gnu-gcc-6.3.0.orig/gcc-6.3.0/libsanitizer/configure.tgt	2015-11-23 01:07:18.000000000 -0800
-+++ x86_64-linux-gnu-gcc-6.3.0/gcc-6.3.0/libsanitizer/configure.tgt	2019-08-13 15:41:51.394524015 -0700
-@@ -21,13 +21,6 @@
- # Filter out unsupported systems.
- TSAN_TARGET_DEPENDENT_OBJECTS=
- case "${target}" in
--  x86_64-*-linux* | i?86-*-linux*)
--	if test x$ac_cv_sizeof_void_p = x8; then
--		TSAN_SUPPORTED=yes
--		LSAN_SUPPORTED=yes
--		TSAN_TARGET_DEPENDENT_OBJECTS=tsan_rtl_amd64.lo
--	fi
--	;;
-   powerpc*-*-linux*)
- 	;;
-   sparc*-*-linux*)
diff --git a/starboard/linux/x64x11/gcc/6.3/ucontext.diff b/starboard/linux/x64x11/gcc/6.3/ucontext.diff
deleted file mode 100644
index 31206da..0000000
--- a/starboard/linux/x64x11/gcc/6.3/ucontext.diff
+++ /dev/null
@@ -1,33 +0,0 @@
-diff -ur x86_64-linux-gnu-gcc-6.3.0.orig/gcc-6.3.0/libgcc/config/aarch64/linux-unwind.h x86_64-linux-gnu-gcc-6.3.0/gcc-6.3.0/libgcc/config/aarch64/linux-unwind.h
---- x86_64-linux-gnu-gcc-6.3.0.orig/gcc-6.3.0/libgcc/config/aarch64/linux-unwind.h	2016-01-04 06:30:50.000000000 -0800
-+++ x86_64-linux-gnu-gcc-6.3.0/gcc-6.3.0/libgcc/config/aarch64/linux-unwind.h	2019-08-13 14:11:12.318898306 -0700
-@@ -52,7 +52,7 @@
-   struct rt_sigframe
-   {
-     siginfo_t info;
--    struct ucontext uc;
-+    ucontext_t uc;
-   };
- 
-   struct rt_sigframe *rt_;
-diff -ur x86_64-linux-gnu-gcc-6.3.0.orig/gcc-6.3.0/libgcc/config/i386/linux-unwind.h x86_64-linux-gnu-gcc-6.3.0/gcc-6.3.0/libgcc/config/i386/linux-unwind.h
---- x86_64-linux-gnu-gcc-6.3.0.orig/gcc-6.3.0/libgcc/config/i386/linux-unwind.h	2016-01-04 06:30:50.000000000 -0800
-+++ x86_64-linux-gnu-gcc-6.3.0/gcc-6.3.0/libgcc/config/i386/linux-unwind.h	2019-08-13 14:11:20.386855553 -0700
-@@ -58,7 +58,7 @@
-   if (*(unsigned char *)(pc+0) == 0x48
-       && *(unsigned long long *)(pc+1) == RT_SIGRETURN_SYSCALL)
-     {
--      struct ucontext *uc_ = context->cfa;
-+      ucontext_t *uc_ = context->cfa;
-       /* The void * cast is necessary to avoid an aliasing warning.
-          The aliasing warning is correct, but should not be a problem
-          because it does not alias anything.  */
-@@ -138,7 +138,7 @@
- 	siginfo_t *pinfo;
- 	void *puc;
- 	siginfo_t info;
--	struct ucontext uc;
-+	ucontext_t uc;
-       } *rt_ = context->cfa;
-       /* The void * cast is necessary to avoid an aliasing warning.
-          The aliasing warning is correct, but should not be a problem
diff --git a/starboard/linux/x64x11/main.cc b/starboard/linux/x64x11/main.cc
index 82046a0..c1f32bd 100644
--- a/starboard/linux/x64x11/main.cc
+++ b/starboard/linux/x64x11/main.cc
@@ -83,15 +83,3 @@
   starboard::shared::signal::UninstallCrashSignalHandlers();
   return result;
 }
-
-#if SB_API_VERSION >= 15
-int SbRunStarboardMain(int argc, char** argv, SbEventHandleCallback callback) {
-  starboard::shared::x11::ApplicationX11 application(callback);
-  int result = 0;
-  {
-    starboard::shared::starboard::LinkReceiver receiver(&application);
-    result = application.Run(argc, argv);
-  }
-  return result;
-}
-#endif  // SB_API_VERSION >= 15
diff --git a/starboard/linux/x64x11/run_starboard_main.cc b/starboard/linux/x64x11/run_starboard_main.cc
new file mode 100644
index 0000000..813e1df
--- /dev/null
+++ b/starboard/linux/x64x11/run_starboard_main.cc
@@ -0,0 +1,30 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/event.h"
+
+#include "starboard/shared/starboard/link_receiver.h"
+#include "starboard/shared/x11/application_x11.h"
+
+#if SB_API_VERSION >= 15
+int SbRunStarboardMain(int argc, char** argv, SbEventHandleCallback callback) {
+  starboard::shared::x11::ApplicationX11 application(callback);
+  int result = 0;
+  {
+    starboard::shared::starboard::LinkReceiver receiver(&application);
+    result = application.Run(argc, argv);
+  }
+  return result;
+}
+#endif  // SB_API_VERSION >= 15
diff --git a/starboard/linux/x64x11/shared/BUILD.gn b/starboard/linux/x64x11/shared/BUILD.gn
index 5863561..2da6b40 100644
--- a/starboard/linux/x64x11/shared/BUILD.gn
+++ b/starboard/linux/x64x11/shared/BUILD.gn
@@ -28,7 +28,6 @@
 static_library("starboard_platform_sources") {
   check_includes = false
   sources = [
-    "//starboard/linux/x64x11/sanitizer_options.cc",
     "//starboard/linux/x64x11/system_get_property.cc",
     "//starboard/linux/x64x11/system_get_property_impl.cc",
     "//starboard/shared/libjpeg/image_decode.cc",
@@ -46,6 +45,10 @@
     "//starboard/shared/x11/window_internal.cc",
   ]
 
+  if (!sb_is_modular || sb_is_evergreen) {
+    sources += [ "//starboard/linux/x64x11/sanitizer_options.cc" ]
+  }
+
   if (is_internal_build) {
     sources += [ "//starboard/keyboxes/linux/system_properties.cc" ]
   } else {
diff --git a/starboard/linux/x64x11/shared/platform_configuration/BUILD.gn b/starboard/linux/x64x11/shared/platform_configuration/BUILD.gn
index 32c24f6..ab9cf36 100644
--- a/starboard/linux/x64x11/shared/platform_configuration/BUILD.gn
+++ b/starboard/linux/x64x11/shared/platform_configuration/BUILD.gn
@@ -13,8 +13,8 @@
 # limitations under the License.
 
 config("platform_configuration") {
-  if (current_toolchain == default_toolchain &&
-      build_with_separate_cobalt_toolchain) {
+  if (current_toolchain == default_toolchain && sb_is_modular &&
+      !sb_is_evergreen) {
     configs = [ "//starboard/evergreen/x64/platform_configuration" ]
   } else {
     configs = [
@@ -28,7 +28,7 @@
 
 config("libraries") {
   configs = [ "//starboard/linux/shared/platform_configuration:libraries" ]
-  if (build_with_separate_cobalt_toolchain) {
+  if (sb_is_modular && !sb_is_evergreen) {
     libs = [ "//third_party/libvpx/platforms/linux-x64/libvpx.so.6" ]
     ldflags = [ "-Wl,-rpath=" + rebase_path("//") +
                 "/third_party/libvpx/platforms/linux-x64/" ]
diff --git a/starboard/linux/x64x11/skia/BUILD.gn b/starboard/linux/x64x11/skia/BUILD.gn
index 024e560..66917ea 100644
--- a/starboard/linux/x64x11/skia/BUILD.gn
+++ b/starboard/linux/x64x11/skia/BUILD.gn
@@ -16,11 +16,14 @@
   check_includes = false
 
   sources = [
-    "//starboard/linux/x64x11/main.cc",
+    "//starboard/linux/x64x11/run_starboard_main.cc",
     "//starboard/linux/x64x11/skia/configuration.cc",
     "//starboard/linux/x64x11/skia/configuration.h",
     "//starboard/linux/x64x11/skia/system_get_extensions.cc",
   ]
+  if (!sb_is_modular || sb_is_evergreen) {
+    sources += [ "//starboard/linux/x64x11/main.cc" ]
+  }
 
   public_deps = [
     "//starboard/linux/x64x11/shared:starboard_platform",
diff --git a/starboard/loader_app/BUILD.gn b/starboard/loader_app/BUILD.gn
index 4d38cce..fe5b02e 100644
--- a/starboard/loader_app/BUILD.gn
+++ b/starboard/loader_app/BUILD.gn
@@ -52,18 +52,6 @@
     }
     outputs = [ "$sb_static_contents_output_data_dir/app/cobalt/content" ]
   }
-  copy("copy_loader_app_lib") {
-    install_content = true
-    if (target_cpu == "arm" && arm_float_abi == "softfp") {
-      sources = [ "$root_out_dir/../evergreen-$target_cpu-${arm_float_abi}_$build_type/install/lib/libcobalt.so" ]
-    } else if (target_cpu == "arm64") {
-      sources = [ "$root_out_dir/../evergreen-$target_cpu_$build_type/install/lib/libcobalt.so" ]
-    } else {
-      sources = []
-    }
-    outputs =
-        [ "$sb_static_contents_output_data_dir/app/cobalt/lib/libcobalt.so" ]
-  }
   copy("copy_loader_app_manifest") {
     install_content = true
     if (target_cpu == "arm" && arm_float_abi == "softfp") {
@@ -106,20 +94,21 @@
       deps = [
         ":common_loader_app_dependencies",
         "//cobalt/content/fonts:copy_font_data",
+        "//starboard:starboard_with_main",
         "//starboard/elf_loader",
       ]
       if (sb_is_evergreen_compatible && sb_evergreen_compatible_package) {
         data_deps += [
           ":copy_crashpad_handler_named_as_so",
           ":copy_loader_app_content",
-          ":copy_loader_app_lib",
           ":copy_loader_app_manifest",
+          "//cobalt/browser:copy_loader_app_libcobalt",
         ]
         deps += [
           ":copy_crashpad_handler_named_as_so",
           ":copy_loader_app_content",
-          ":copy_loader_app_lib",
           ":copy_loader_app_manifest",
+          "//cobalt/browser:copy_loader_app_libcobalt",
         ]
       }
     }
diff --git a/starboard/loader_app/app_key_test.cc b/starboard/loader_app/app_key_test.cc
index af3d5e1..9bd3340 100644
--- a/starboard/loader_app/app_key_test.cc
+++ b/starboard/loader_app/app_key_test.cc
@@ -35,631 +35,631 @@
 
 // The URLs below were taken from url/url_parse_unittest.cc.
 const URLWithExtractedAndEncoded kURLWithExtractedAndEncoded[] = {
-  {
-    "http://user:pass@foo:21/bar;par?b#c",
-    "http://foo:21/bar;par",
-    "aHR0cDovL2ZvbzoyMS9iYXI7cGFy",
-  },
-  {
-    "http:foo.com",
-    "http:foo.com",
-    "aHR0cDpmb28uY29t",
-  },
-  {
-    "\t   :foo.com   \n",
-    "\t   :foo.com   \n",
-    "CSAgIDpmb28uY29tICAgCg==",
-  },
-  {
-    " foo.com  ",
-    " foo.com  ",
-    "IGZvby5jb20gIA==",
-  },
-  {
-    "a:\t foo.com",
-    "a:\t foo.com",
-    "YToJIGZvby5jb20=",
-  },
-  {
-    "http://f:21/ b ? d # e ",
-    "http://f:21/ b ",
-    "aHR0cDovL2Y6MjEvIGIg",
-  },
-  {
-    "http://f:/c",
-    "http://f:/c",
-    "aHR0cDovL2Y6L2M=",
-  },
-  {
-    "http://f:0/c",
-    "http://f:0/c",
-    "aHR0cDovL2Y6MC9j",
-  },
-  {
-    "http://f:00000000000000/c",
-    "http://f:00000000000000/c",
-    "aHR0cDovL2Y6MDAwMDAwMDAwMDAwMDAvYw==",
-  },
-  {
-    "http://f:00000000000000000000080/c",
-    "http://f:00000000000000000000080/c",
-    "aHR0cDovL2Y6MDAwMDAwMDAwMDAwMDAwMDAwMDAwODAvYw==",
-  },
-  {
-    "http://f:b/c",
-    "http://f:b/c",
-    "aHR0cDovL2Y6Yi9j",
-  },
-  {
-    "http://f: /c",
-    "http://f: /c",
-    "aHR0cDovL2Y6IC9j",
-  },
-  {
-    "http://f:\n/c",
-    "http://f:\n/c",
-    "aHR0cDovL2Y6Ci9j",
-  },
-  {
-    "http://f:fifty-two/c",
-    "http://f:fifty-two/c",
-    "aHR0cDovL2Y6ZmlmdHktdHdvL2M=",
-  },
-  {
-    "http://f:999999/c",
-    "http://f:999999/c",
-    "aHR0cDovL2Y6OTk5OTk5L2M=",
-  },
-  {
-    "http://f: 21 / b ? d # e ",
-    "http://f: 21 / b ",
-    "aHR0cDovL2Y6IDIxIC8gYiA=",
-  },
-  {
-    "",
-    "",
-    "",
-  },
-  {
-    "  \t",
-    "  \t",
-    "ICAJ",
-  },
-  {
-    ":foo.com/",
-    ":foo.com/",
-    "OmZvby5jb20v",
-  },
-  {
-    ":foo.com\\",
-    ":foo.com\\",
-    "OmZvby5jb21c",
-  },
-  {
-    ":",
-    ":",
-    "Og==",
-  },
-  {
-    ":a",
-    ":a",
-    "OmE=",
-  },
-  {
-    ":/",
-    ":/",
-    "Oi8=",
-  },
-  {
-    ":\\",
-    ":\\",
-    "Olw=",
-  },
-  {
-    ":#",
-    ":",
-    "Og==",
-  },
-  {
-    "#",
-    "",
-    "",
-  },
-  {
-    "#/",
-    "",
-    "",
-  },
-  {
-    "#\\",
-    "",
-    "",
-  },
-  {
-    "#;?",
-    "",
-    "",
-  },
-  {
-    "?",
-    "",
-    "",
-  },
-  {
-    "/",
-    "/",
-    "Lw==",
-  },
-  {
-    ":23",
-    ":23",
-    "OjIz",
-  },
-  {
-    "/:23",
-    "/:23",
-    "LzoyMw==",
-  },
-  {
-    "//",
-    "//",
-    "Ly8=",
-  },
-  {
-    "::",
-    "::",
-    "Ojo=",
-  },
-  {
-    "::23",
-    "::23",
-    "OjoyMw==",
-  },
-  {
-    "foo://",
-    "foo://",
-    "Zm9vOi8v",
-  },
-  {
-    "http://a:b@c:29/d",
-    "http://c:29/d",
-    "aHR0cDovL2M6MjkvZA==",
-  },
-  {
-    "http::@c:29",
-    "http::@c:29",
-    "aHR0cDo6QGM6Mjk=",
-  },
-  {
-    "http://&a:foo(b]c@d:2/",
-    "http://d:2/",
-    "aHR0cDovL2Q6Mi8=",
-  },
-  {
-    "http://::@c@d:2",
-    "http://c@d:2",
-    "aHR0cDovL2NAZDoy",
-  },
-  {
-    "http://foo.com:b@d/",
-    "http://d/",
-    "aHR0cDovL2Qv",
-  },
-  {
-    "http://foo.com/\\@",
-    "http://",
-    "aHR0cDovLw==",
-  },
-  {
-    "http:\\\\foo.com\\",
-    "http:\\\\foo.com\\",
-    "aHR0cDpcXGZvby5jb21c",
-  },
-  {
-    "http:\\\\a\\b:c\\d@foo.com\\",
-    "http:\\\\a\\b:c\\d@foo.com\\",
-    "aHR0cDpcXGFcYjpjXGRAZm9vLmNvbVw=",
-  },
-  {
-    "foo:/",
-    "foo:/",
-    "Zm9vOi8=",
-  },
-  {
-    "foo:/bar.com/",
-    "foo:/bar.com/",
-    "Zm9vOi9iYXIuY29tLw==",
-  },
-  {
-    "foo://///////",
-    "foo://///////",
-    "Zm9vOi8vLy8vLy8vLw==",
-  },
-  {
-    "foo://///////bar.com/",
-    "foo://///////bar.com/",
-    "Zm9vOi8vLy8vLy8vL2Jhci5jb20v",
-  },
-  {
-    "foo:////://///",
-    "foo:////://///",
-    "Zm9vOi8vLy86Ly8vLy8=",
-  },
-  {
-    "c:/foo",
-    "c:/foo",
-    "YzovZm9v",
-  },
-  {
-    "//foo/bar",
-    "//foo/bar",
-    "Ly9mb28vYmFy",
-  },
-  {
-    "http://foo/path;a??e#f#g",
-    "http://foo/path;a",
-    "aHR0cDovL2Zvby9wYXRoO2E=",
-  },
-  {
-    "http://foo/abcd?efgh?ijkl",
-    "http://foo/abcd",
-    "aHR0cDovL2Zvby9hYmNk",
-  },
-  {
-    "http://foo/abcd#foo?bar",
-    "http://foo/abcd",
-    "aHR0cDovL2Zvby9hYmNk",
-  },
-  {
-    "[61:24:74]:98",
-    "[61:24:74]:98",
-    "WzYxOjI0Ojc0XTo5OA==",
-  },
-  {
-    "http://[61:27]:98",
-    "http://[61:27]:98",
-    "aHR0cDovL1s2MToyN106OTg=",
-  },
-  {
-    "http:[61:27]/:foo",
-    "http:[61:27]/:foo",
-    "aHR0cDpbNjE6MjddLzpmb28=",
-  },
-  {
-    "http://[1::2]:3:4",
-    "http://[1::2]:3:4",
-    "aHR0cDovL1sxOjoyXTozOjQ=",
-  },
-  {
-    "http://2001::1",
-    "http://2001::1",
-    "aHR0cDovLzIwMDE6OjE=",
-  },
-  {
-    "http://[2001::1",
-    "http://[2001::1",
-    "aHR0cDovL1syMDAxOjox",
-  },
-  {
-    "http://2001::1]",
-    "http://2001::1]",
-    "aHR0cDovLzIwMDE6OjFd",
-  },
-  {
-    "http://2001::1]:80",
-    "http://2001::1]:80",
-    "aHR0cDovLzIwMDE6OjFdOjgw",
-  },
-  {
-    "http://[2001::1]",
-    "http://[2001::1]",
-    "aHR0cDovL1syMDAxOjoxXQ==",
-  },
-  {
-    "http://[2001::1]:80",
-    "http://[2001::1]:80",
-    "aHR0cDovL1syMDAxOjoxXTo4MA==",
-  },
-  {
-    "http://[[::]]",
-    "http://[[::]]",
-    "aHR0cDovL1tbOjpdXQ==",
-  },
-  {
-    "file:server",
-    "file:server",
-    "ZmlsZTpzZXJ2ZXI=",
-  },
-  {
-    "  file: server  \t",
-    "  file: server  \t",
-    "ICBmaWxlOiBzZXJ2ZXIgIAk=",
-  },
-  {
-    "FiLe:c|",
-    "FiLe:c|",
-    "RmlMZTpjfA==",
-  },
-  {
-    "FILE:/\\\\/server/file",
-    "FILE:/\\\\/server/file",
-    "RklMRTovXFwvc2VydmVyL2ZpbGU=",
-  },
-  {
-    "file://server/",
-    "file://server/",
-    "ZmlsZTovL3NlcnZlci8=",
-  },
-  {
-    "file://localhost/c:/",
-    "file://localhost/c:/",
-    "ZmlsZTovL2xvY2FsaG9zdC9jOi8=",
-  },
-  {
-    "file://127.0.0.1/c|\\",
-    "file://127.0.0.1/c|\\",
-    "ZmlsZTovLzEyNy4wLjAuMS9jfFw=",
-  },
-  {
-    "file:/",
-    "file:/",
-    "ZmlsZTov",
-  },
-  {
-    "file:",
-    "file:",
-    "ZmlsZTo=",
-  },
-  {
-    "file:c:\\fo\\b",
-    "file:c:\\fo\\b",
-    "ZmlsZTpjOlxmb1xi",
-  },
-  {
-    "file:/c:\\foo/bar",
-    "file:/c:\\foo/bar",
-    "ZmlsZTovYzpcZm9vL2Jhcg==",
-  },
-  {
-    "file://c:/f\\b",
-    "file://c:/f\\b",
-    "ZmlsZTovL2M6L2ZcYg==",
-  },
-  {
-    "file:///C:/foo",
-    "file:///C:/foo",
-    "ZmlsZTovLy9DOi9mb28=",
-  },
-  {
-    "file://///\\/\\/c:\\f\\b",
-    "file://///\\/\\/c:\\f\\b",
-    "ZmlsZTovLy8vL1wvXC9jOlxmXGI=",
-  },
-  {
-    "file:server/file",
-    "file:server/file",
-    "ZmlsZTpzZXJ2ZXIvZmlsZQ==",
-  },
-  {
-    "file:/server/file",
-    "file:/server/file",
-    "ZmlsZTovc2VydmVyL2ZpbGU=",
-  },
-  {
-    "file://server/file",
-    "file://server/file",
-    "ZmlsZTovL3NlcnZlci9maWxl",
-  },
-  {
-    "file:///server/file",
-    "file:///server/file",
-    "ZmlsZTovLy9zZXJ2ZXIvZmlsZQ==",
-  },
-  {
-    "file://\\server/file",
-    "file://\\server/file",
-    "ZmlsZTovL1xzZXJ2ZXIvZmlsZQ==",
-  },
-  {
-    "file:////server/file",
-    "file:////server/file",
-    "ZmlsZTovLy8vc2VydmVyL2ZpbGU=",
-  },
-  {
-    "file:///C:/foo.html?#",
-    "file:///C:/foo.html",
-    "ZmlsZTovLy9DOi9mb28uaHRtbA==",
-  },
-  {
-    "file:///C:/foo.html?query=yes#ref",
-    "file:///C:/foo.html",
-    "ZmlsZTovLy9DOi9mb28uaHRtbA==",
-  },
-  {
-    "file:",
-    "file:",
-    "ZmlsZTo=",
-  },
-  {
-    "file:path",
-    "file:path",
-    "ZmlsZTpwYXRo",
-  },
-  {
-    "file:path/",
-    "file:path/",
-    "ZmlsZTpwYXRoLw==",
-  },
-  {
-    "file:path/f.txt",
-    "file:path/f.txt",
-    "ZmlsZTpwYXRoL2YudHh0",
-  },
-  {
-    "file:/",
-    "file:/",
-    "ZmlsZTov",
-  },
-  {
-    "file:/path",
-    "file:/path",
-    "ZmlsZTovcGF0aA==",
-  },
-  {
-    "file:/path/",
-    "file:/path/",
-    "ZmlsZTovcGF0aC8=",
-  },
-  {
-    "file:/path/f.txt",
-    "file:/path/f.txt",
-    "ZmlsZTovcGF0aC9mLnR4dA==",
-  },
-  {
-    "file://",
-    "file://",
-    "ZmlsZTovLw==",
-  },
-  {
-    "file://server",
-    "file://server",
-    "ZmlsZTovL3NlcnZlcg==",
-  },
-  {
-    "file://server/",
-    "file://server/",
-    "ZmlsZTovL3NlcnZlci8=",
-  },
-  {
-    "file://server/f.txt",
-    "file://server/f.txt",
-    "ZmlsZTovL3NlcnZlci9mLnR4dA==",
-  },
-  {
-    "file:///",
-    "file:///",
-    "ZmlsZTovLy8=",
-  },
-  {
-    "file:///path",
-    "file:///path",
-    "ZmlsZTovLy9wYXRo",
-  },
-  {
-    "file:///path/",
-    "file:///path/",
-    "ZmlsZTovLy9wYXRoLw==",
-  },
-  {
-    "file:///path/f.txt",
-    "file:///path/f.txt",
-    "ZmlsZTovLy9wYXRoL2YudHh0",
-  },
-  {
-    "file:////",
-    "file:////",
-    "ZmlsZTovLy8v",
-  },
-  {
-    "file:////path",
-    "file:////path",
-    "ZmlsZTovLy8vcGF0aA==",
-  },
-  {
-    "file:////path/",
-    "file:////path/",
-    "ZmlsZTovLy8vcGF0aC8=",
-  },
-  {
-    "file:////path/f.txt",
-    "file:////path/f.txt",
-    "ZmlsZTovLy8vcGF0aC9mLnR4dA==",
-  },
-  {
-    "path/f.txt",
-    "path/f.txt",
-    "cGF0aC9mLnR4dA==",
-  },
-  {
-    "path:80/f.txt",
-    "path:80/f.txt",
-    "cGF0aDo4MC9mLnR4dA==",
-  },
-  {
-    "path/f.txt:80",
-    "path/f.txt:80",
-    "cGF0aC9mLnR4dDo4MA==",
-  },
-  {
-    "/path/f.txt",
-    "/path/f.txt",
-    "L3BhdGgvZi50eHQ=",
-  },
-  {
-    "/path:80/f.txt",
-    "/path:80/f.txt",
-    "L3BhdGg6ODAvZi50eHQ=",
-  },
-  {
-    "/path/f.txt:80",
-    "/path/f.txt:80",
-    "L3BhdGgvZi50eHQ6ODA=",
-  },
-  {
-    "//server/f.txt",
-    "//server/f.txt",
-    "Ly9zZXJ2ZXIvZi50eHQ=",
-  },
-  {
-    "//server:80/f.txt",
-    "//server:80/f.txt",
-    "Ly9zZXJ2ZXI6ODAvZi50eHQ=",
-  },
-  {
-    "//server/f.txt:80",
-    "//server/f.txt:80",
-    "Ly9zZXJ2ZXIvZi50eHQ6ODA=",
-  },
-  {
-    "///path/f.txt",
-    "///path/f.txt",
-    "Ly8vcGF0aC9mLnR4dA==",
-  },
-  {
-    "///path:80/f.txt",
-    "///path:80/f.txt",
-    "Ly8vcGF0aDo4MC9mLnR4dA==",
-  },
-  {
-    "///path/f.txt:80",
-    "///path/f.txt:80",
-    "Ly8vcGF0aC9mLnR4dDo4MA==",
-  },
-  {
-    "////path/f.txt",
-    "////path/f.txt",
-    "Ly8vL3BhdGgvZi50eHQ=",
-  },
-  {
-    "////path:80/f.txt",
-    "////path:80/f.txt",
-    "Ly8vL3BhdGg6ODAvZi50eHQ=",
-  },
-  {
-    "////path/f.txt:80",
-    "////path/f.txt:80",
-    "Ly8vL3BhdGgvZi50eHQ6ODA=",
-  },
-  {
-    "file:///foo.html?#",
-    "file:///foo.html",
-    "ZmlsZTovLy9mb28uaHRtbA==",
-  },
-  {
-    "file:///foo.html?q=y#ref",
-    "file:///foo.html",
-    "ZmlsZTovLy9mb28uaHRtbA==",
-  },
+    {
+        "http://user:pass@foo:21/bar;par?b#c",
+        "http://foo:21/bar;par",
+        "aHR0cDovL2ZvbzoyMS9iYXI7cGFy",
+    },
+    {
+        "http:foo.com",
+        "http:foo.com",
+        "aHR0cDpmb28uY29t",
+    },
+    {
+        "\t   :foo.com   \n",
+        "\t   :foo.com   \n",
+        "CSAgIDpmb28uY29tICAgCg==",
+    },
+    {
+        " foo.com  ",
+        " foo.com  ",
+        "IGZvby5jb20gIA==",
+    },
+    {
+        "a:\t foo.com",
+        "a:\t foo.com",
+        "YToJIGZvby5jb20=",
+    },
+    {
+        "http://f:21/ b ? d # e ",
+        "http://f:21/ b ",
+        "aHR0cDovL2Y6MjEvIGIg",
+    },
+    {
+        "http://f:/c",
+        "http://f:/c",
+        "aHR0cDovL2Y6L2M=",
+    },
+    {
+        "http://f:0/c",
+        "http://f:0/c",
+        "aHR0cDovL2Y6MC9j",
+    },
+    {
+        "http://f:00000000000000/c",
+        "http://f:00000000000000/c",
+        "aHR0cDovL2Y6MDAwMDAwMDAwMDAwMDAvYw==",
+    },
+    {
+        "http://f:00000000000000000000080/c",
+        "http://f:00000000000000000000080/c",
+        "aHR0cDovL2Y6MDAwMDAwMDAwMDAwMDAwMDAwMDAwODAvYw==",
+    },
+    {
+        "http://f:b/c",
+        "http://f:b/c",
+        "aHR0cDovL2Y6Yi9j",
+    },
+    {
+        "http://f: /c",
+        "http://f: /c",
+        "aHR0cDovL2Y6IC9j",
+    },
+    {
+        "http://f:\n/c",
+        "http://f:\n/c",
+        "aHR0cDovL2Y6Ci9j",
+    },
+    {
+        "http://f:fifty-two/c",
+        "http://f:fifty-two/c",
+        "aHR0cDovL2Y6ZmlmdHktdHdvL2M=",
+    },
+    {
+        "http://f:999999/c",
+        "http://f:999999/c",
+        "aHR0cDovL2Y6OTk5OTk5L2M=",
+    },
+    {
+        "http://f: 21 / b ? d # e ",
+        "http://f: 21 / b ",
+        "aHR0cDovL2Y6IDIxIC8gYiA=",
+    },
+    {
+        "",
+        "",
+        "",
+    },
+    {
+        "  \t",
+        "  \t",
+        "ICAJ",
+    },
+    {
+        ":foo.com/",
+        ":foo.com/",
+        "OmZvby5jb20v",
+    },
+    {
+        ":foo.com\\",
+        ":foo.com\\",
+        "OmZvby5jb21c",
+    },
+    {
+        ":",
+        ":",
+        "Og==",
+    },
+    {
+        ":a",
+        ":a",
+        "OmE=",
+    },
+    {
+        ":/",
+        ":/",
+        "Oi8=",
+    },
+    {
+        ":\\",
+        ":\\",
+        "Olw=",
+    },
+    {
+        ":#",
+        ":",
+        "Og==",
+    },
+    {
+        "#",
+        "",
+        "",
+    },
+    {
+        "#/",
+        "",
+        "",
+    },
+    {
+        "#\\",
+        "",
+        "",
+    },
+    {
+        "#;?",
+        "",
+        "",
+    },
+    {
+        "?",
+        "",
+        "",
+    },
+    {
+        "/",
+        "/",
+        "Lw==",
+    },
+    {
+        ":23",
+        ":23",
+        "OjIz",
+    },
+    {
+        "/:23",
+        "/:23",
+        "LzoyMw==",
+    },
+    {
+        "//",
+        "//",
+        "Ly8=",
+    },
+    {
+        "::",
+        "::",
+        "Ojo=",
+    },
+    {
+        "::23",
+        "::23",
+        "OjoyMw==",
+    },
+    {
+        "foo://",
+        "foo://",
+        "Zm9vOi8v",
+    },
+    {
+        "http://a:b@c:29/d",
+        "http://c:29/d",
+        "aHR0cDovL2M6MjkvZA==",
+    },
+    {
+        "http::@c:29",
+        "http::@c:29",
+        "aHR0cDo6QGM6Mjk=",
+    },
+    {
+        "http://&a:foo(b]c@d:2/",
+        "http://d:2/",
+        "aHR0cDovL2Q6Mi8=",
+    },
+    {
+        "http://::@c@d:2",
+        "http://c@d:2",
+        "aHR0cDovL2NAZDoy",
+    },
+    {
+        "http://foo.com:b@d/",
+        "http://d/",
+        "aHR0cDovL2Qv",
+    },
+    {
+        "http://foo.com/\\@",
+        "http://",
+        "aHR0cDovLw==",
+    },
+    {
+        "http:\\\\foo.com\\",
+        "http:\\\\foo.com\\",
+        "aHR0cDpcXGZvby5jb21c",
+    },
+    {
+        "http:\\\\a\\b:c\\d@foo.com\\",
+        "http:\\\\a\\b:c\\d@foo.com\\",
+        "aHR0cDpcXGFcYjpjXGRAZm9vLmNvbVw=",
+    },
+    {
+        "foo:/",
+        "foo:/",
+        "Zm9vOi8=",
+    },
+    {
+        "foo:/bar.com/",
+        "foo:/bar.com/",
+        "Zm9vOi9iYXIuY29tLw==",
+    },
+    {
+        "foo://///////",
+        "foo://///////",
+        "Zm9vOi8vLy8vLy8vLw==",
+    },
+    {
+        "foo://///////bar.com/",
+        "foo://///////bar.com/",
+        "Zm9vOi8vLy8vLy8vL2Jhci5jb20v",
+    },
+    {
+        "foo:////://///",
+        "foo:////://///",
+        "Zm9vOi8vLy86Ly8vLy8=",
+    },
+    {
+        "c:/foo",
+        "c:/foo",
+        "YzovZm9v",
+    },
+    {
+        "//foo/bar",
+        "//foo/bar",
+        "Ly9mb28vYmFy",
+    },
+    {
+        "http://foo/path;a??e#f#g",
+        "http://foo/path;a",
+        "aHR0cDovL2Zvby9wYXRoO2E=",
+    },
+    {
+        "http://foo/abcd?efgh?ijkl",
+        "http://foo/abcd",
+        "aHR0cDovL2Zvby9hYmNk",
+    },
+    {
+        "http://foo/abcd#foo?bar",
+        "http://foo/abcd",
+        "aHR0cDovL2Zvby9hYmNk",
+    },
+    {
+        "[61:24:74]:98",
+        "[61:24:74]:98",
+        "WzYxOjI0Ojc0XTo5OA==",
+    },
+    {
+        "http://[61:27]:98",
+        "http://[61:27]:98",
+        "aHR0cDovL1s2MToyN106OTg=",
+    },
+    {
+        "http:[61:27]/:foo",
+        "http:[61:27]/:foo",
+        "aHR0cDpbNjE6MjddLzpmb28=",
+    },
+    {
+        "http://[1::2]:3:4",
+        "http://[1::2]:3:4",
+        "aHR0cDovL1sxOjoyXTozOjQ=",
+    },
+    {
+        "http://2001::1",
+        "http://2001::1",
+        "aHR0cDovLzIwMDE6OjE=",
+    },
+    {
+        "http://[2001::1",
+        "http://[2001::1",
+        "aHR0cDovL1syMDAxOjox",
+    },
+    {
+        "http://2001::1]",
+        "http://2001::1]",
+        "aHR0cDovLzIwMDE6OjFd",
+    },
+    {
+        "http://2001::1]:80",
+        "http://2001::1]:80",
+        "aHR0cDovLzIwMDE6OjFdOjgw",
+    },
+    {
+        "http://[2001::1]",
+        "http://[2001::1]",
+        "aHR0cDovL1syMDAxOjoxXQ==",
+    },
+    {
+        "http://[2001::1]:80",
+        "http://[2001::1]:80",
+        "aHR0cDovL1syMDAxOjoxXTo4MA==",
+    },
+    {
+        "http://[[::]]",
+        "http://[[::]]",
+        "aHR0cDovL1tbOjpdXQ==",
+    },
+    {
+        "file:server",
+        "file:server",
+        "ZmlsZTpzZXJ2ZXI=",
+    },
+    {
+        "  file: server  \t",
+        "  file: server  \t",
+        "ICBmaWxlOiBzZXJ2ZXIgIAk=",
+    },
+    {
+        "FiLe:c|",
+        "FiLe:c|",
+        "RmlMZTpjfA==",
+    },
+    {
+        "FILE:/\\\\/server/file",
+        "FILE:/\\\\/server/file",
+        "RklMRTovXFwvc2VydmVyL2ZpbGU=",
+    },
+    {
+        "file://server/",
+        "file://server/",
+        "ZmlsZTovL3NlcnZlci8=",
+    },
+    {
+        "file://localhost/c:/",
+        "file://localhost/c:/",
+        "ZmlsZTovL2xvY2FsaG9zdC9jOi8=",
+    },
+    {
+        "file://127.0.0.1/c|\\",
+        "file://127.0.0.1/c|\\",
+        "ZmlsZTovLzEyNy4wLjAuMS9jfFw=",
+    },
+    {
+        "file:/",
+        "file:/",
+        "ZmlsZTov",
+    },
+    {
+        "file:",
+        "file:",
+        "ZmlsZTo=",
+    },
+    {
+        "file:c:\\fo\\b",
+        "file:c:\\fo\\b",
+        "ZmlsZTpjOlxmb1xi",
+    },
+    {
+        "file:/c:\\foo/bar",
+        "file:/c:\\foo/bar",
+        "ZmlsZTovYzpcZm9vL2Jhcg==",
+    },
+    {
+        "file://c:/f\\b",
+        "file://c:/f\\b",
+        "ZmlsZTovL2M6L2ZcYg==",
+    },
+    {
+        "file:///C:/foo",
+        "file:///C:/foo",
+        "ZmlsZTovLy9DOi9mb28=",
+    },
+    {
+        "file://///\\/\\/c:\\f\\b",
+        "file://///\\/\\/c:\\f\\b",
+        "ZmlsZTovLy8vL1wvXC9jOlxmXGI=",
+    },
+    {
+        "file:server/file",
+        "file:server/file",
+        "ZmlsZTpzZXJ2ZXIvZmlsZQ==",
+    },
+    {
+        "file:/server/file",
+        "file:/server/file",
+        "ZmlsZTovc2VydmVyL2ZpbGU=",
+    },
+    {
+        "file://server/file",
+        "file://server/file",
+        "ZmlsZTovL3NlcnZlci9maWxl",
+    },
+    {
+        "file:///server/file",
+        "file:///server/file",
+        "ZmlsZTovLy9zZXJ2ZXIvZmlsZQ==",
+    },
+    {
+        "file://\\server/file",
+        "file://\\server/file",
+        "ZmlsZTovL1xzZXJ2ZXIvZmlsZQ==",
+    },
+    {
+        "file:////server/file",
+        "file:////server/file",
+        "ZmlsZTovLy8vc2VydmVyL2ZpbGU=",
+    },
+    {
+        "file:///C:/foo.html?#",
+        "file:///C:/foo.html",
+        "ZmlsZTovLy9DOi9mb28uaHRtbA==",
+    },
+    {
+        "file:///C:/foo.html?query=yes#ref",
+        "file:///C:/foo.html",
+        "ZmlsZTovLy9DOi9mb28uaHRtbA==",
+    },
+    {
+        "file:",
+        "file:",
+        "ZmlsZTo=",
+    },
+    {
+        "file:path",
+        "file:path",
+        "ZmlsZTpwYXRo",
+    },
+    {
+        "file:path/",
+        "file:path/",
+        "ZmlsZTpwYXRoLw==",
+    },
+    {
+        "file:path/f.txt",
+        "file:path/f.txt",
+        "ZmlsZTpwYXRoL2YudHh0",
+    },
+    {
+        "file:/",
+        "file:/",
+        "ZmlsZTov",
+    },
+    {
+        "file:/path",
+        "file:/path",
+        "ZmlsZTovcGF0aA==",
+    },
+    {
+        "file:/path/",
+        "file:/path/",
+        "ZmlsZTovcGF0aC8=",
+    },
+    {
+        "file:/path/f.txt",
+        "file:/path/f.txt",
+        "ZmlsZTovcGF0aC9mLnR4dA==",
+    },
+    {
+        "file://",
+        "file://",
+        "ZmlsZTovLw==",
+    },
+    {
+        "file://server",
+        "file://server",
+        "ZmlsZTovL3NlcnZlcg==",
+    },
+    {
+        "file://server/",
+        "file://server/",
+        "ZmlsZTovL3NlcnZlci8=",
+    },
+    {
+        "file://server/f.txt",
+        "file://server/f.txt",
+        "ZmlsZTovL3NlcnZlci9mLnR4dA==",
+    },
+    {
+        "file:///",
+        "file:///",
+        "ZmlsZTovLy8=",
+    },
+    {
+        "file:///path",
+        "file:///path",
+        "ZmlsZTovLy9wYXRo",
+    },
+    {
+        "file:///path/",
+        "file:///path/",
+        "ZmlsZTovLy9wYXRoLw==",
+    },
+    {
+        "file:///path/f.txt",
+        "file:///path/f.txt",
+        "ZmlsZTovLy9wYXRoL2YudHh0",
+    },
+    {
+        "file:////",
+        "file:////",
+        "ZmlsZTovLy8v",
+    },
+    {
+        "file:////path",
+        "file:////path",
+        "ZmlsZTovLy8vcGF0aA==",
+    },
+    {
+        "file:////path/",
+        "file:////path/",
+        "ZmlsZTovLy8vcGF0aC8=",
+    },
+    {
+        "file:////path/f.txt",
+        "file:////path/f.txt",
+        "ZmlsZTovLy8vcGF0aC9mLnR4dA==",
+    },
+    {
+        "path/f.txt",
+        "path/f.txt",
+        "cGF0aC9mLnR4dA==",
+    },
+    {
+        "path:80/f.txt",
+        "path:80/f.txt",
+        "cGF0aDo4MC9mLnR4dA==",
+    },
+    {
+        "path/f.txt:80",
+        "path/f.txt:80",
+        "cGF0aC9mLnR4dDo4MA==",
+    },
+    {
+        "/path/f.txt",
+        "/path/f.txt",
+        "L3BhdGgvZi50eHQ=",
+    },
+    {
+        "/path:80/f.txt",
+        "/path:80/f.txt",
+        "L3BhdGg6ODAvZi50eHQ=",
+    },
+    {
+        "/path/f.txt:80",
+        "/path/f.txt:80",
+        "L3BhdGgvZi50eHQ6ODA=",
+    },
+    {
+        "//server/f.txt",
+        "//server/f.txt",
+        "Ly9zZXJ2ZXIvZi50eHQ=",
+    },
+    {
+        "//server:80/f.txt",
+        "//server:80/f.txt",
+        "Ly9zZXJ2ZXI6ODAvZi50eHQ=",
+    },
+    {
+        "//server/f.txt:80",
+        "//server/f.txt:80",
+        "Ly9zZXJ2ZXIvZi50eHQ6ODA=",
+    },
+    {
+        "///path/f.txt",
+        "///path/f.txt",
+        "Ly8vcGF0aC9mLnR4dA==",
+    },
+    {
+        "///path:80/f.txt",
+        "///path:80/f.txt",
+        "Ly8vcGF0aDo4MC9mLnR4dA==",
+    },
+    {
+        "///path/f.txt:80",
+        "///path/f.txt:80",
+        "Ly8vcGF0aC9mLnR4dDo4MA==",
+    },
+    {
+        "////path/f.txt",
+        "////path/f.txt",
+        "Ly8vL3BhdGgvZi50eHQ=",
+    },
+    {
+        "////path:80/f.txt",
+        "////path:80/f.txt",
+        "Ly8vL3BhdGg6ODAvZi50eHQ=",
+    },
+    {
+        "////path/f.txt:80",
+        "////path/f.txt:80",
+        "Ly8vL3BhdGgvZi50eHQ6ODA=",
+    },
+    {
+        "file:///foo.html?#",
+        "file:///foo.html",
+        "ZmlsZTovLy9mb28uaHRtbA==",
+    },
+    {
+        "file:///foo.html?q=y#ref",
+        "file:///foo.html",
+        "ZmlsZTovLy9mb28uaHRtbA==",
+    },
 };
 
 TEST(AppKeyTest, SunnyDayExtractAppKey) {
diff --git a/starboard/loader_app/drain_file_helper.h b/starboard/loader_app/drain_file_helper.h
index caf8b44..0948f4d 100644
--- a/starboard/loader_app/drain_file_helper.h
+++ b/starboard/loader_app/drain_file_helper.h
@@ -29,7 +29,8 @@
 // that it allows you to choose where to create the file.
 class ScopedDrainFile {
  public:
-  ScopedDrainFile(const std::string& dir, const std::string& app_key,
+  ScopedDrainFile(const std::string& dir,
+                  const std::string& app_key,
                   SbTime timestamp);
   ~ScopedDrainFile();
 
diff --git a/starboard/loader_app/drain_file_test.cc b/starboard/loader_app/drain_file_test.cc
index bf0863c..a1e0f07 100644
--- a/starboard/loader_app/drain_file_test.cc
+++ b/starboard/loader_app/drain_file_test.cc
@@ -19,6 +19,7 @@
 
 #include "starboard/common/file.h"
 #include "starboard/common/log.h"
+#include "starboard/common/string.h"
 #include "starboard/configuration_constants.h"
 #include "starboard/directory.h"
 #include "starboard/loader_app/drain_file_helper.h"
@@ -40,6 +41,11 @@
     temp_dir_.resize(kSbFileMaxPath);
     ASSERT_TRUE(SbSystemGetPath(kSbSystemPathTempDirectory, temp_dir_.data(),
                                 temp_dir_.size()));
+
+    // Use dedicated dir for testing to avoid meddling with other files.
+    starboard::strlcat(temp_dir_.data(), kSbFileSepString, kSbFileMaxPath);
+    starboard::strlcat(temp_dir_.data(), "df", kSbFileMaxPath);
+    ASSERT_TRUE(SbDirectoryCreate(temp_dir_.data()));
   }
 
   void TearDown() override { DrainFileClearForApp(GetTempDir(), ""); }
diff --git a/starboard/loader_app/installation_manager_test.cc b/starboard/loader_app/installation_manager_test.cc
index b7e6cad..d8cdc58 100644
--- a/starboard/loader_app/installation_manager_test.cc
+++ b/starboard/loader_app/installation_manager_test.cc
@@ -421,11 +421,13 @@
   }
   int max_num_installations = 2;
   int setup_priorities[2][2] = {
-      {0, 1}, {1, 0},
+      {0, 1},
+      {1, 0},
   };
 
   int expected_priorities[2][2] = {
-      {0, 1}, {0, 1},
+      {0, 1},
+      {0, 1},
   };
 
   for (int i = 0; i < 2; i++) {
@@ -440,11 +442,13 @@
   }
   int max_num_installations = 2;
   int setup_priorities[2][2] = {
-      {0, 1}, {1, 0},
+      {0, 1},
+      {1, 0},
   };
 
   int expected_priorities[2][2] = {
-      {1, 0}, {1, 0},
+      {1, 0},
+      {1, 0},
   };
 
   for (int i = 0; i < 2; i++) {
@@ -517,17 +521,26 @@
   // List of 2 index pairs of (priority, is_success) for which the revert would
   // fail.
   int priority_success_pairs1[4][2][2] = {
-      {{0, 1}, {1, 0}}, {{0, 0}, {1, 0}}, {{1, 0}, {0, 1}}, {{1, 0}, {0, 0}},
+      {{0, 1}, {1, 0}},
+      {{0, 0}, {1, 0}},
+      {{1, 0}, {0, 1}},
+      {{1, 0}, {0, 0}},
   };
 
   // List of 2 index pairs of (priority, is_success) for which the revert would
   // succeed.
   int priority_success_pairs2[4][2][2] = {
-      {{0, 0}, {1, 1}}, {{1, 1}, {0, 0}}, {{0, 1}, {1, 1}}, {{1, 1}, {0, 1}},
+      {{0, 0}, {1, 1}},
+      {{1, 1}, {0, 0}},
+      {{0, 1}, {1, 1}},
+      {{1, 1}, {0, 1}},
   };
 
   int expected_priorities[4][2] = {
-      {1, 0}, {0, 1}, {1, 0}, {0, 1},
+      {1, 0},
+      {0, 1},
+      {1, 0},
+      {0, 1},
   };
 
   for (int i = 0; i < 4; i++) {
diff --git a/starboard/memory.h b/starboard/memory.h
index 564e15e..d3676ed 100644
--- a/starboard/memory.h
+++ b/starboard/memory.h
@@ -88,8 +88,7 @@
 //   passed to SbMemoryDeallocate.
 SB_EXPORT void* SbMemoryAllocate(size_t size);
 
-// Same as SbMemoryAllocate() but will not report memory to the tracker. Avoid
-// using this unless absolutely necessary.
+// DEPRECATED: Same as SbMemoryAllocate().
 SB_EXPORT void* SbMemoryAllocateNoReport(size_t size);
 
 // Attempts to resize |memory| to be at least |size| bytes, without touching
@@ -131,8 +130,7 @@
 // |memory|: The chunk of memory to be freed.
 SB_EXPORT void SbMemoryDeallocate(void* memory);
 
-// Same as SbMemoryDeallocate() but will not report memory deallocation to the
-// tracker. This function must be matched with SbMemoryAllocateNoReport().
+// DEPRECATED: Same as SbMemoryDeallocate()
 SB_EXPORT void SbMemoryDeallocateNoReport(void* memory);
 
 // Frees a previously allocated chunk of aligned memory. This function should
diff --git a/starboard/memory_reporter.h b/starboard/memory_reporter.h
index b83a79d..a5f0306 100644
--- a/starboard/memory_reporter.h
+++ b/starboard/memory_reporter.h
@@ -14,7 +14,7 @@
 
 // Module Overview: Memory Reporting API.
 //
-// Provides an interface for memory reporting.
+// DEPRECATED: Provides an interface for memory reporting.
 
 #ifndef STARBOARD_MEMORY_REPORTER_H_
 #define STARBOARD_MEMORY_REPORTER_H_
@@ -34,7 +34,8 @@
 
 // A function to report a memory allocation from SbMemoryAllocate(). Note that
 // operator new calls SbMemoryAllocate which will delegate to this callback.
-typedef void (*SbMemoryReporterOnAlloc)(void* context, const void* memory,
+typedef void (*SbMemoryReporterOnAlloc)(void* context,
+                                        const void* memory,
                                         size_t size);
 
 // A function to report a memory deallocation from SbMemoryDeallcoate(). Note
@@ -43,7 +44,8 @@
 typedef void (*SbMemoryReporterOnDealloc)(void* context, const void* memory);
 
 // A function to report a memory mapping from SbMemoryMap().
-typedef void (*SbMemoryReporterOnMapMemory)(void* context, const void* memory,
+typedef void (*SbMemoryReporterOnMapMemory)(void* context,
+                                            const void* memory,
                                             size_t size);
 
 // A function to report a memory unmapping from SbMemoryUnmap().
@@ -77,6 +79,9 @@
 // Sets the MemoryReporter. Any previous memory reporter is unset. No lifetime
 // management is done internally on input pointer.
 //
+// NOTE: This module is unused starting with Starboard 15 and will be removed
+// in the future.
+//
 // Returns true if the memory reporter was set with no errors. If an error
 // was reported then check the log for why it failed.
 //
diff --git a/starboard/nplb/BUILD.gn b/starboard/nplb/BUILD.gn
index 26baef2..08e415a 100644
--- a/starboard/nplb/BUILD.gn
+++ b/starboard/nplb/BUILD.gn
@@ -23,6 +23,8 @@
     "//starboard/nplb/sabi/signedness_of_char_test.cc",
     "//starboard/nplb/sabi/size_test.cc",
     "//starboard/nplb/sabi/struct_alignment_test.cc",
+    "//starboard/shared/starboard/drm/drm_test_helpers.cc",
+    "//starboard/shared/starboard/drm/drm_test_helpers.h",
     "//starboard/testing/fake_graphics_context_provider.cc",
     "//starboard/testing/fake_graphics_context_provider.h",
     "accessibility_test.cc",
@@ -55,7 +57,6 @@
     "directory_get_next_test.cc",
     "directory_open_test.cc",
     "drm_get_metrics_test.cc",
-    "drm_helpers.cc",
     "drm_helpers.h",
     "drm_is_server_certificate_updatable_test.cc",
     "drm_session_test.cc",
@@ -106,7 +107,6 @@
     "memory_deallocate_test.cc",
     "memory_map_test.cc",
     "memory_reallocate_test.cc",
-    "memory_reporter_test.cc",
     "microphone_close_test.cc",
     "microphone_create_test.cc",
     "microphone_destroy_test.cc",
diff --git a/starboard/nplb/align_test.cc b/starboard/nplb/align_test.cc
index 71c51ab..1a684a3 100644
--- a/starboard/nplb/align_test.cc
+++ b/starboard/nplb/align_test.cc
@@ -20,11 +20,11 @@
 namespace nplb {
 namespace {
 
-bool IsAligned(void *pointer, size_t alignment) {
+bool IsAligned(void* pointer, size_t alignment) {
   return (reinterpret_cast<uintptr_t>(pointer) % alignment) == 0;
 }
 
-size_t GetAlignment(void *pointer) {
+size_t GetAlignment(void* pointer) {
   for (size_t alignment = static_cast<size_t>(1) << ((sizeof(size_t) * 8) - 1);
        alignment != 0; alignment /= 2) {
     if (IsAligned(pointer, alignment)) {
diff --git a/starboard/nplb/byte_swap_test.cc b/starboard/nplb/byte_swap_test.cc
index c7c69f7..91ff92e 100644
--- a/starboard/nplb/byte_swap_test.cc
+++ b/starboard/nplb/byte_swap_test.cc
@@ -36,6 +36,7 @@
 const int64_t kExpectedS64 =
     static_cast<int64_t>(SB_INT64_C(0x1032547698BADCFE));
 
+#if SB_API_VERSION < 16
 TEST(SbByteSwapTest, SunnyDay) {
   EXPECT_EQ(kExpectedU16, SbByteSwapU16(kTestU16));
   EXPECT_EQ(kExpectedS16, SbByteSwapS16(kTestS16));
@@ -46,6 +47,7 @@
   EXPECT_EQ(kExpectedU64, SbByteSwapU64(kTestU64));
   EXPECT_EQ(kExpectedS64, SbByteSwapS64(kTestS64));
 }
+#endif
 
 #if SB_IS(BIG_ENDIAN)
 TEST(SbByteSwapTest, BigEndian) {
diff --git a/starboard/nplb/compiler_compliance/cpp17_support.cc b/starboard/nplb/compiler_compliance/cpp17_support.cc
index 443f054..c117191 100644
--- a/starboard/nplb/compiler_compliance/cpp17_support.cc
+++ b/starboard/nplb/compiler_compliance/cpp17_support.cc
@@ -17,6 +17,14 @@
 #include "starboard/configuration.h"
 #include "starboard/types.h"
 
+namespace starboard::foo::bar::baz {
+
+constexpr int life() {
+  return 42;
+}
+
+}  // namespace starboard::foo::bar::baz
+
 namespace starboard {
 namespace nplb {
 namespace {
@@ -28,7 +36,7 @@
 #endif
 
 constexpr char test_structured_bindings() {
-  auto[a, b] = std::pair<int, char>(42, 'A');
+  auto [a, b] = std::pair<int, char>(42, 'A');
   return b;
 }
 
@@ -51,6 +59,31 @@
 
 static_assert(add_one(1) == 2, "Constexpr lambdas support is required");
 
+// Test Nested Namespaces support
+
+static_assert(starboard::foo::bar::baz::life() == 42,
+              "Nested Namespaces support is required");
+
+// Test fallthrough support
+
+constexpr int test_fallthrough(int n) {
+  switch (n) {
+    case 1:
+      return 1;
+      break;
+    case 2:
+      [[fallthrough]];  // intentional fallthrough
+    case 3:
+      return 3;
+      break;
+  }
+
+  return 0;
+}
+
+static_assert(test_fallthrough(2) == 3,
+              "[fallthrough]] attribute support is required");
+
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/condition_variable_create_test.cc b/starboard/nplb/condition_variable_create_test.cc
index 5e7f98d..4c9fb20 100644
--- a/starboard/nplb/condition_variable_create_test.cc
+++ b/starboard/nplb/condition_variable_create_test.cc
@@ -52,16 +52,16 @@
 }
 
 TEST(SbConditionVariableCreateTest, SunnyDayABunchAtOnce) {
-  SbMutex mutices[kABunch];
+  SbMutex mutexes[kABunch];
   SbConditionVariable conditions[kABunch];
   for (int i = 0; i < kABunch; ++i) {
-    EXPECT_TRUE(SbMutexCreate(&mutices[i]));
-    EXPECT_TRUE(SbConditionVariableCreate(&conditions[i], &mutices[i]));
+    EXPECT_TRUE(SbMutexCreate(&mutexes[i]));
+    EXPECT_TRUE(SbConditionVariableCreate(&conditions[i], &mutexes[i]));
   }
 
   for (int i = 0; i < kABunch; ++i) {
     EXPECT_TRUE(SbConditionVariableDestroy(&conditions[i]));
-    EXPECT_TRUE(SbMutexDestroy(&mutices[i]));
+    EXPECT_TRUE(SbMutexDestroy(&mutexes[i]));
   }
 }
 
diff --git a/starboard/nplb/condition_variable_wait_timed_test.cc b/starboard/nplb/condition_variable_wait_timed_test.cc
index 73a0de5..73a2475 100644
--- a/starboard/nplb/condition_variable_wait_timed_test.cc
+++ b/starboard/nplb/condition_variable_wait_timed_test.cc
@@ -36,7 +36,7 @@
 
   const SbTime kDelay = kSbTimeMillisecond * 10;
   // Allow two-millisecond-level precision.
-  const SbTime kPrecision = kSbTimeMillisecond*2;
+  const SbTime kPrecision = kSbTimeMillisecond * 2;
 
   // We know the thread hasn't signaled the condition variable yet, and won't
   // unless we tell it, so it should wait at least the whole delay time.
diff --git a/starboard/nplb/configuration_test.cc b/starboard/nplb/configuration_test.cc
index faf74ab..09994cd 100644
--- a/starboard/nplb/configuration_test.cc
+++ b/starboard/nplb/configuration_test.cc
@@ -24,8 +24,7 @@
 
 SB_COMPILE_ASSERT(sizeof(int32_t) < sizeof(int64_t), int32_less_than_int64);
 
-void TheUnreferencer(int unreferenced) {
-}
+void TheUnreferencer(int unreferenced) {}
 
 struct PossiblyFunnySize {
   int32_t a;
diff --git a/starboard/nplb/drm_helpers.h b/starboard/nplb/drm_helpers.h
index 6717fcc..1d64f49 100644
--- a/starboard/nplb/drm_helpers.h
+++ b/starboard/nplb/drm_helpers.h
@@ -1,4 +1,4 @@
-// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -15,136 +15,24 @@
 #ifndef STARBOARD_NPLB_DRM_HELPERS_H_
 #define STARBOARD_NPLB_DRM_HELPERS_H_
 
-#include "starboard/drm.h"
+#include "starboard/shared/starboard/drm/drm_test_helpers.h"
 
 namespace starboard {
 namespace nplb {
 
-void DummySessionUpdateRequestFunc(SbDrmSystem drm_system,
-                                   void* context,
-                                   int ticket,
-                                   SbDrmStatus status,
-                                   SbDrmSessionRequestType type,
-                                   const char* error_message,
-                                   const void* session_id,
-                                   int session_id_size,
-                                   const void* content,
-                                   int content_size,
-                                   const char* url);
+using ::starboard::shared::starboard::drm::DummyServerCertificateUpdatedFunc;
+using ::starboard::shared::starboard::drm::DummySessionClosedFunc;
+using ::starboard::shared::starboard::drm::DummySessionKeyStatusesChangedFunc;
+using ::starboard::shared::starboard::drm::DummySessionUpdatedFunc;
+using ::starboard::shared::starboard::drm::DummySessionUpdateRequestFunc;
 
-void DummySessionUpdatedFunc(SbDrmSystem drm_system,
-                             void* context,
-                             int ticket,
-                             SbDrmStatus status,
-                             const char* error_message,
-                             const void* session_id,
-                             int session_id_size);
+using ::starboard::shared::starboard::drm::CreateDummyDrmSystem;
 
-void DummyServerCertificateUpdatedFunc(SbDrmSystem drm_system,
-                                       void* context,
-                                       int ticket,
-                                       SbDrmStatus status,
-                                       const char* error_message);
+using ::starboard::shared::starboard::drm::kEncryptionSchemes;
+using ::starboard::shared::starboard::drm::kKeySystems;
+using ::starboard::shared::starboard::drm::kWidevineCertificate;
 
-void DummySessionKeyStatusesChangedFunc(SbDrmSystem drm_system,
-                                        void* context,
-                                        const void* session_id,
-                                        int session_id_size,
-                                        int number_of_keys,
-                                        const SbDrmKeyId* key_ids,
-                                        const SbDrmKeyStatus* key_statuses);
-
-void DummySessionClosedFunc(SbDrmSystem drm_system,
-                            void* context,
-                            const void* session_id,
-                            int session_id_size);
-
-SbDrmSystem CreateDummyDrmSystem(const char* key_system);
-
-static const char* kKeySystems[] = {
-    "com.widevine",
-    "com.widevine.alpha",
-    "com.youtube.playready",
-    "com.youtube.fairplay",
-};
-
-static const char* kEncryptionSchemes[] = {
-    "cenc",
-    "cbcs",
-    "cbcs-1-9",
-};
-
-static constexpr uint8_t kWidevineCertificate[] = {
-    0x0a, 0xc1, 0x02, 0x08, 0x03, 0x12, 0x10, 0x17, 0x05, 0xb9, 0x17, 0xcc,
-    0x12, 0x04, 0x86, 0x8b, 0x06, 0x33, 0x3a, 0x2f, 0x77, 0x2a, 0x8c, 0x18,
-    0x82, 0xb4, 0x82, 0x92, 0x05, 0x22, 0x8e, 0x02, 0x30, 0x82, 0x01, 0x0a,
-    0x02, 0x82, 0x01, 0x01, 0x00, 0x99, 0xed, 0x5b, 0x3b, 0x32, 0x7d, 0xab,
-    0x5e, 0x24, 0xef, 0xc3, 0xb6, 0x2a, 0x95, 0xb5, 0x98, 0x52, 0x0a, 0xd5,
-    0xbc, 0xcb, 0x37, 0x50, 0x3e, 0x06, 0x45, 0xb8, 0x14, 0xd8, 0x76, 0xb8,
-    0xdf, 0x40, 0x51, 0x04, 0x41, 0xad, 0x8c, 0xe3, 0xad, 0xb1, 0x1b, 0xb8,
-    0x8c, 0x4e, 0x72, 0x5a, 0x5e, 0x4a, 0x9e, 0x07, 0x95, 0x29, 0x1d, 0x58,
-    0x58, 0x40, 0x23, 0xa7, 0xe1, 0xaf, 0x0e, 0x38, 0xa9, 0x12, 0x79, 0x39,
-    0x30, 0x08, 0x61, 0x0b, 0x6f, 0x15, 0x8c, 0x87, 0x8c, 0x7e, 0x21, 0xbf,
-    0xfb, 0xfe, 0xea, 0x77, 0xe1, 0x01, 0x9e, 0x1e, 0x57, 0x81, 0xe8, 0xa4,
-    0x5f, 0x46, 0x26, 0x3d, 0x14, 0xe6, 0x0e, 0x80, 0x58, 0xa8, 0x60, 0x7a,
-    0xdc, 0xe0, 0x4f, 0xac, 0x84, 0x57, 0xb1, 0x37, 0xa8, 0xd6, 0x7c, 0xcd,
-    0xeb, 0x33, 0x70, 0x5d, 0x98, 0x3a, 0x21, 0xfb, 0x4e, 0xec, 0xbd, 0x4a,
-    0x10, 0xca, 0x47, 0x49, 0x0c, 0xa4, 0x7e, 0xaa, 0x5d, 0x43, 0x82, 0x18,
-    0xdd, 0xba, 0xf1, 0xca, 0xde, 0x33, 0x92, 0xf1, 0x3d, 0x6f, 0xfb, 0x64,
-    0x42, 0xfd, 0x31, 0xe1, 0xbf, 0x40, 0xb0, 0xc6, 0x04, 0xd1, 0xc4, 0xba,
-    0x4c, 0x95, 0x20, 0xa4, 0xbf, 0x97, 0xee, 0xbd, 0x60, 0x92, 0x9a, 0xfc,
-    0xee, 0xf5, 0x5b, 0xba, 0xf5, 0x64, 0xe2, 0xd0, 0xe7, 0x6c, 0xd7, 0xc5,
-    0x5c, 0x73, 0xa0, 0x82, 0xb9, 0x96, 0x12, 0x0b, 0x83, 0x59, 0xed, 0xce,
-    0x24, 0x70, 0x70, 0x82, 0x68, 0x0d, 0x6f, 0x67, 0xc6, 0xd8, 0x2c, 0x4a,
-    0xc5, 0xf3, 0x13, 0x44, 0x90, 0xa7, 0x4e, 0xec, 0x37, 0xaf, 0x4b, 0x2f,
-    0x01, 0x0c, 0x59, 0xe8, 0x28, 0x43, 0xe2, 0x58, 0x2f, 0x0b, 0x6b, 0x9f,
-    0x5d, 0xb0, 0xfc, 0x5e, 0x6e, 0xdf, 0x64, 0xfb, 0xd3, 0x08, 0xb4, 0x71,
-    0x1b, 0xcf, 0x12, 0x50, 0x01, 0x9c, 0x9f, 0x5a, 0x09, 0x02, 0x03, 0x01,
-    0x00, 0x01, 0x3a, 0x14, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e,
-    0x77, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x2e, 0x63, 0x6f, 0x6d,
-    0x12, 0x80, 0x03, 0xae, 0x34, 0x73, 0x14, 0xb5, 0xa8, 0x35, 0x29, 0x7f,
-    0x27, 0x13, 0x88, 0xfb, 0x7b, 0xb8, 0xcb, 0x52, 0x77, 0xd2, 0x49, 0x82,
-    0x3c, 0xdd, 0xd1, 0xda, 0x30, 0xb9, 0x33, 0x39, 0x51, 0x1e, 0xb3, 0xcc,
-    0xbd, 0xea, 0x04, 0xb9, 0x44, 0xb9, 0x27, 0xc1, 0x21, 0x34, 0x6e, 0xfd,
-    0xbd, 0xea, 0xc9, 0xd4, 0x13, 0x91, 0x7e, 0x6e, 0xc1, 0x76, 0xa1, 0x04,
-    0x38, 0x46, 0x0a, 0x50, 0x3b, 0xc1, 0x95, 0x2b, 0x9b, 0xa4, 0xe4, 0xce,
-    0x0f, 0xc4, 0xbf, 0xc2, 0x0a, 0x98, 0x08, 0xaa, 0xaf, 0x4b, 0xfc, 0xd1,
-    0x9c, 0x1d, 0xcf, 0xcd, 0xf5, 0x74, 0xcc, 0xac, 0x28, 0xd1, 0xb4, 0x10,
-    0x41, 0x6c, 0xf9, 0xde, 0x88, 0x04, 0x30, 0x1c, 0xbd, 0xb3, 0x34, 0xca,
-    0xfc, 0xd0, 0xd4, 0x09, 0x78, 0x42, 0x3a, 0x64, 0x2e, 0x54, 0x61, 0x3d,
-    0xf0, 0xaf, 0xcf, 0x96, 0xca, 0x4a, 0x92, 0x49, 0xd8, 0x55, 0xe4, 0x2b,
-    0x3a, 0x70, 0x3e, 0xf1, 0x76, 0x7f, 0x6a, 0x9b, 0xd3, 0x6d, 0x6b, 0xf8,
-    0x2b, 0xe7, 0x6b, 0xbf, 0x0c, 0xba, 0x4f, 0xde, 0x59, 0xd2, 0xab, 0xcc,
-    0x76, 0xfe, 0xb6, 0x42, 0x47, 0xb8, 0x5c, 0x43, 0x1f, 0xbc, 0xa5, 0x22,
-    0x66, 0xb6, 0x19, 0xfc, 0x36, 0x97, 0x95, 0x43, 0xfc, 0xa9, 0xcb, 0xbd,
-    0xbb, 0xfa, 0xfa, 0x0e, 0x1a, 0x55, 0xe7, 0x55, 0xa3, 0xc7, 0xbc, 0xe6,
-    0x55, 0xf9, 0x64, 0x6f, 0x58, 0x2a, 0xb9, 0xcf, 0x70, 0xaa, 0x08, 0xb9,
-    0x79, 0xf8, 0x67, 0xf6, 0x3a, 0x0b, 0x2b, 0x7f, 0xdb, 0x36, 0x2c, 0x5b,
-    0xc4, 0xec, 0xd5, 0x55, 0xd8, 0x5b, 0xca, 0xa9, 0xc5, 0x93, 0xc3, 0x83,
-    0xc8, 0x57, 0xd4, 0x9d, 0xaa, 0xb7, 0x7e, 0x40, 0xb7, 0x85, 0x1d, 0xdf,
-    0xd2, 0x49, 0x98, 0x80, 0x8e, 0x35, 0xb2, 0x58, 0xe7, 0x5d, 0x78, 0xea,
-    0xc0, 0xca, 0x16, 0xf7, 0x04, 0x73, 0x04, 0xc2, 0x0d, 0x93, 0xed, 0xe4,
-    0xe8, 0xff, 0x1c, 0x6f, 0x17, 0xe6, 0x24, 0x3e, 0x3f, 0x3d, 0xa8, 0xfc,
-    0x17, 0x09, 0x87, 0x0e, 0xc4, 0x5f, 0xba, 0x82, 0x3a, 0x26, 0x3f, 0x0c,
-    0xef, 0xa1, 0xf7, 0x09, 0x3b, 0x19, 0x09, 0x92, 0x83, 0x26, 0x33, 0x37,
-    0x05, 0x04, 0x3a, 0x29, 0xbd, 0xa6, 0xf9, 0xb4, 0x34, 0x2c, 0xc8, 0xdf,
-    0x54, 0x3c, 0xb1, 0xa1, 0x18, 0x2f, 0x7c, 0x5f, 0xff, 0x33, 0xf1, 0x04,
-    0x90, 0xfa, 0xca, 0x5b, 0x25, 0x36, 0x0b, 0x76, 0x01, 0x5e, 0x9c, 0x5a,
-    0x06, 0xab, 0x8e, 0xe0, 0x2f, 0x00, 0xd2, 0xe8, 0xd5, 0x98, 0x61, 0x04,
-    0xaa, 0xcc, 0x4d, 0xd4, 0x75, 0xfd, 0x96, 0xee, 0x9c, 0xe4, 0xe3, 0x26,
-    0xf2, 0x1b, 0x83, 0xc7, 0x05, 0x85, 0x77, 0xb3, 0x87, 0x32, 0xcd, 0xda,
-    0xbc, 0x6a, 0x6b, 0xed, 0x13, 0xfb, 0x0d, 0x49, 0xd3, 0x8a, 0x45, 0xeb,
-    0x87, 0xa5, 0xf4};
-
-// Widevine-specific CENC Initialization data.
-// https://www.w3.org/TR/eme-stream-mp4/
-// https://www.w3.org/TR/eme-initdata-cenc/#common-system
-static constexpr uint8_t kCencInitData[] = {
-    0x00, 0x00, 0x00, 0x34, 0x70, 0x73, 0x73, 0x68, 0x00, 0x00, 0x00,
-    0x00, 0xed, 0xef, 0x8b, 0xa9, 0x79, 0xd6, 0x4a, 0xce, 0xa3, 0xc8,
-    0x27, 0xdc, 0xd5, 0x1d, 0x21, 0xed, 0x00, 0x00, 0x00, 0x14, 0x08,
-    0x01, 0x12, 0x10, 0x31, 0xfd, 0x5b, 0x66, 0x19, 0xfc, 0x5e, 0xad,
-    0x86, 0x7c, 0xff, 0xb5, 0x84, 0xed, 0x4c, 0x19};
+using ::starboard::shared::starboard::drm::kCencInitData;
 
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/extern_c_test.cc b/starboard/nplb/extern_c_test.cc
index 326967d..0961e08 100644
--- a/starboard/nplb/extern_c_test.cc
+++ b/starboard/nplb/extern_c_test.cc
@@ -18,7 +18,9 @@
 #include "starboard/accessibility.h"
 #include "starboard/atomic.h"
 #include "starboard/audio_sink.h"
+#if SB_API_VERSION < 16
 #include "starboard/byte_swap.h"
+#endif
 #include "starboard/condition_variable.h"
 #include "starboard/configuration.h"
 #include "starboard/cpu_features.h"
diff --git a/starboard/nplb/file_delete_recursive_test.cc b/starboard/nplb/file_delete_recursive_test.cc
index fe894da..7c31fad 100644
--- a/starboard/nplb/file_delete_recursive_test.cc
+++ b/starboard/nplb/file_delete_recursive_test.cc
@@ -32,11 +32,15 @@
 const char kRoot[] = {"SbFileDeleteRecursiveTest"};
 
 const char* kDirectories[kDirectoryCount] = {
-    "", "test1", "test2",
+    "",
+    "test1",
+    "test2",
 };
 
 const char* kFiles[kFileCount] = {
-    "file1", "test1/file2", "test2/file3",
+    "file1",
+    "test1/file2",
+    "test2/file3",
 };
 
 TEST(SbFileDeleteRecursiveTest, SunnyDayDeleteExistingPath) {
@@ -96,8 +100,8 @@
   SbFileError err = kSbFileOk;
   SbFile file = kSbFileInvalid;
 
-  file = SbFileOpen(path.c_str(), kSbFileCreateAlways | kSbFileWrite, NULL,
-                    &err);
+  file =
+      SbFileOpen(path.c_str(), kSbFileCreateAlways | kSbFileWrite, NULL, &err);
 
   EXPECT_EQ(kSbFileOk, err);
   EXPECT_TRUE(SbFileClose(file));
diff --git a/starboard/nplb/file_helpers.cc b/starboard/nplb/file_helpers.cc
index 8ac08b4..810ab64 100644
--- a/starboard/nplb/file_helpers.cc
+++ b/starboard/nplb/file_helpers.cc
@@ -45,10 +45,10 @@
   std::vector<char> content_path(kPathSize);
   EXPECT_TRUE(SbSystemGetPath(kSbSystemPathContentDirectory,
                               content_path.data(), kPathSize));
-  std::string directory_path =
-      std::string(content_path.data()) + kSbFileSepChar + "test" +
-      kSbFileSepChar + "starboard" + kSbFileSepChar + "nplb" +
-      kSbFileSepChar + "file_tests";
+  std::string directory_path = std::string(content_path.data()) +
+                               kSbFileSepChar + "test" + kSbFileSepChar +
+                               "starboard" + kSbFileSepChar + "nplb" +
+                               kSbFileSepChar + "file_tests";
   SB_CHECK(SbDirectoryCanOpen(directory_path.c_str()));
   return directory_path;
 }
@@ -69,25 +69,20 @@
 
 std::vector<std::string> GetFileTestsFilePaths() {
   const char* kFiles[] = {
-    // This long file MUST be first -- SbFileSeekTest depends on it!
-    "file_with_long_name_and_contents_for_seek_testing_1234567890",
-    "file01",
-    "dir_with_files/file11",
-    "dir_with_files/file12",
-    "dir_with_only_subdir/dir_with_files/file21",
-    "dir_with_only_subdir/dir_with_files/file22",
-    nullptr
-  };
+      // This long file MUST be first -- SbFileSeekTest depends on it!
+      "file_with_long_name_and_contents_for_seek_testing_1234567890",
+      "file01",
+      "dir_with_files/file11",
+      "dir_with_files/file12",
+      "dir_with_only_subdir/dir_with_files/file21",
+      "dir_with_only_subdir/dir_with_files/file22",
+      nullptr};
   return MakePathsVector(kFiles);
 }
 
 std::vector<std::string> GetFileTestsDirectoryPaths() {
-  const char* kDirs[] = {
-    "dir_with_files",
-    "dir_with_only_subdir",
-    "dir_with_only_subdir/dir_with_files",
-    nullptr
-  };
+  const char* kDirs[] = {"dir_with_files", "dir_with_only_subdir",
+                         "dir_with_only_subdir/dir_with_files", nullptr};
   return MakePathsVector(kDirs);
 }
 
diff --git a/starboard/nplb/file_write_test.cc b/starboard/nplb/file_write_test.cc
index 4aca8d7..9f6d87d 100644
--- a/starboard/nplb/file_write_test.cc
+++ b/starboard/nplb/file_write_test.cc
@@ -62,9 +62,9 @@
   ScopedRandomFile random_file(0, ScopedRandomFile::kDontCreate);
   const std::string& filename = random_file.filename();
 
-  SbFile file = SbFileOpen(filename.c_str(),
-                           kSbFileCreateAlways | kSbFileWrite | kSbFileRead,
-                           NULL, NULL);
+  SbFile file =
+      SbFileOpen(filename.c_str(),
+                 kSbFileCreateAlways | kSbFileWrite | kSbFileRead, NULL, NULL);
   ASSERT_TRUE(SbFileIsValid(file));
 
   // Create a bigger buffer than necessary, so we can test the memory around
@@ -85,8 +85,8 @@
 
     int remaining = kFileSize - total;
     int to_write = remaining < kBufferLength ? remaining : kBufferLength;
-    int bytes_written = TypeParam::Write(
-        file, buffer + (total % kBufferLength), to_write);
+    int bytes_written =
+        TypeParam::Write(file, buffer + (total % kBufferLength), to_write);
 
     // Check that we didn't write more than the buffer size.
     EXPECT_GE(to_write, bytes_written);
diff --git a/starboard/nplb/image_test.cc b/starboard/nplb/image_test.cc
index 0590e4b..89d4bef 100644
--- a/starboard/nplb/image_test.cc
+++ b/starboard/nplb/image_test.cc
@@ -22,22 +22,18 @@
 namespace {
 
 const SbDecodeTargetFormat kDecodeTargetFormats[] = {
-  kSbDecodeTargetFormat1PlaneRGBA,
-  kSbDecodeTargetFormat1PlaneBGRA,
-  kSbDecodeTargetFormat2PlaneYUVNV12,
-  kSbDecodeTargetFormat3PlaneYUVI420,
-  kSbDecodeTargetFormat3Plane10BitYUVI420,
-  kSbDecodeTargetFormat1PlaneUYVY,
-  kSbDecodeTargetFormatInvalid,
+    kSbDecodeTargetFormat1PlaneRGBA,
+    kSbDecodeTargetFormat1PlaneBGRA,
+    kSbDecodeTargetFormat2PlaneYUVNV12,
+    kSbDecodeTargetFormat3PlaneYUVI420,
+    kSbDecodeTargetFormat3Plane10BitYUVI420,
+    kSbDecodeTargetFormat1PlaneUYVY,
+    kSbDecodeTargetFormatInvalid,
 };
 
 const char* kMimeTypes[] = {
-  "image/jpeg",
-  "image/png",
-  "image/gif",
-  "application/json",
-  "image/webp",
-  "invalid",
+    "image/jpeg",       "image/png",  "image/gif",
+    "application/json", "image/webp", "invalid",
 };
 
 // Verify SbImageIsDecodeSupported() can be called with any parameter values.
diff --git a/starboard/nplb/include_all.c b/starboard/nplb/include_all.c
index 4b33c79..b68a23b 100644
--- a/starboard/nplb/include_all.c
+++ b/starboard/nplb/include_all.c
@@ -17,7 +17,9 @@
 #include "starboard/accessibility.h"
 #include "starboard/atomic.h"
 #include "starboard/audio_sink.h"
+#if SB_API_VERSION < 16
 #include "starboard/byte_swap.h"
+#endif
 #include "starboard/condition_variable.h"
 #include "starboard/configuration.h"
 #include "starboard/cpu_features.h"
diff --git a/starboard/nplb/include_all_too.c b/starboard/nplb/include_all_too.c
index b59799f..611b6f1 100644
--- a/starboard/nplb/include_all_too.c
+++ b/starboard/nplb/include_all_too.c
@@ -16,4 +16,3 @@
 // no duplicate symbols.
 
 #include "starboard/nplb/include_all.c"
-
diff --git a/starboard/nplb/memory_reporter_test.cc b/starboard/nplb/memory_reporter_test.cc
deleted file mode 100644
index 8b2604a..0000000
--- a/starboard/nplb/memory_reporter_test.cc
+++ /dev/null
@@ -1,552 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/memory_reporter.h"
-#include "starboard/common/mutex.h"
-#include "starboard/configuration.h"
-#include "starboard/memory.h"
-#include "starboard/thread.h"
-#include "starboard/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace starboard {
-namespace nplb {
-namespace {
-
-// This thread local boolean is used to filter allocations and
-// 1) Prevent allocations from other threads.
-// 2) Selectively disable allocations so that unintended allocs from
-//    gTest (ASSERT_XXX) don't cause the current test to fail.
-void InitMemoryTrackingState_ThreadLocal();
-bool GetMemoryTrackingEnabled_ThreadLocal();
-void SetMemoryTrackingEnabled_ThreadLocal(bool value);
-
-// Scoped object that temporary turns off MemoryTracking. This is needed
-// to avoid allocations from gTest being inserted into the memory tracker.
-struct NoMemTracking {
-  bool prev_val;
-  NoMemTracking() {
-    prev_val = GetMemoryTrackingEnabled_ThreadLocal();
-    SetMemoryTrackingEnabled_ThreadLocal(false);
-  }
-  ~NoMemTracking() { SetMemoryTrackingEnabled_ThreadLocal(prev_val); }
-};
-
-// EXPECT_XXX and ASSERT_XXX allocate memory, a big no-no when
-// for unit testing allocations. These overrides disable memory
-// tracking for the duration of the EXPECT and ASSERT operations.
-#define EXPECT_EQ_NO_TRACKING(A, B)                 \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    EXPECT_EQ(A, B);                                \
-  }
-
-#define EXPECT_NE_NO_TRACKING(A, B)                 \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    EXPECT_NE(A, B);                                \
-  }
-
-#define EXPECT_TRUE_NO_TRACKING(A)                  \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    EXPECT_TRUE(A);                                 \
-  }
-
-#define EXPECT_FALSE_NO_TRACKING(A)                 \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    EXPECT_FALSE(A);                                \
-  }
-
-#define ASSERT_EQ_NO_TRACKING(A, B)                 \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    ASSERT_EQ(A, B);                                \
-  }
-
-#define ASSERT_NE_NO_TRACKING(A, B)                 \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    ASSERT_NE(A, B);                                \
-  }
-
-#define ASSERT_TRUE_NO_TRACKING(A)                  \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    ASSERT_TRUE(A);                                 \
-  }
-
-#define ASSERT_FALSE_NO_TRACKING(A)                 \
-  {                                                 \
-    NoMemTracking no_memory_tracking_in_this_scope; \
-    ASSERT_FALSE(A);                                \
-  }
-
-// A structure that cannot be allocated because it throws an exception in its
-// constructor. This is needed to test the std::nothrow version of delete since
-// it is only called when the std::nothrow version of new fails.
-struct ThrowConstructor {
-  // ThrowConstructor() throw(std::exception) { throw std::exception(); }
-  ThrowConstructor() : foo_(1) { throw std::exception(); }
-  // Required to prevent the constructor from being inlined and optimized away.
-  volatile int foo_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// A memory reporter that is used to watch allocations from the system.
-class TestMemReporter {
- public:
-  TestMemReporter() { Construct(); }
-
-  SbMemoryReporter* memory_reporter() { return &memory_reporter_; }
-
-  // Removes this object from listening to allocations.
-  void RemoveGlobalHooks() {
-    SbMemorySetReporter(NULL);
-    // Sleep to allow other threads time to pass through.
-    SbThreadSleep(250 * kSbTimeMillisecond);
-  }
-
-  // Total number allocations outstanding.
-  int number_allocs() const { return number_allocs_; }
-
-  // Total number memory map outstanding.
-  int number_map_mem() const { return number_map_mem_; }
-
-  void Clear() {
-    starboard::ScopedLock lock(mutex_);
-    number_allocs_ = 0;
-    number_map_mem_ = 0;
-    last_allocation_ = NULL;
-    last_deallocation_ = NULL;
-    last_mem_map_ = NULL;
-    last_mem_unmap_ = NULL;
-  }
-
-  const void* last_allocation() const { return last_allocation_; }
-  const void* last_deallocation() const { return last_deallocation_; }
-  const void* last_mem_map() const { return last_mem_map_; }
-  const void* last_mem_unmap() const { return last_mem_unmap_; }
-
- private:
-  // Boilerplate to delegate static function callbacks to the class instance.
-  static void OnMalloc(void* context, const void* memory, size_t size) {
-    TestMemReporter* t = static_cast<TestMemReporter*>(context);
-    t->ReportAlloc(memory, size);
-  }
-
-  static void OnMapMem(void* context, const void* memory, size_t size) {
-    TestMemReporter* t = static_cast<TestMemReporter*>(context);
-    t->ReportMapMem(memory, size);
-  }
-
-  static void OnDealloc(void* context, const void* memory) {
-    TestMemReporter* t = static_cast<TestMemReporter*>(context);
-    t->ReportDealloc(memory);
-  }
-
-  static void SbUnMapMem(void* context, const void* memory, size_t size) {
-    TestMemReporter* t = static_cast<TestMemReporter*>(context);
-    t->ReportUnMapMemory(memory, size);
-  }
-
-  static SbMemoryReporter CreateSbMemoryReporter(TestMemReporter* context) {
-    SbMemoryReporter cb = {OnMalloc, OnDealloc, OnMapMem, SbUnMapMem, context};
-    return cb;
-  }
-
-  void ReportAlloc(const void* memory, size_t size) {
-    if (!GetMemoryTrackingEnabled_ThreadLocal()) {
-      return;
-    }
-    starboard::ScopedLock lock(mutex_);
-    last_allocation_ = memory;
-    number_allocs_++;
-  }
-
-  void ReportMapMem(const void* memory, size_t size) {
-    if (!GetMemoryTrackingEnabled_ThreadLocal()) {
-      return;
-    }
-    starboard::ScopedLock lock(mutex_);
-    last_mem_map_ = memory;
-    number_map_mem_++;
-  }
-
-  void ReportDealloc(const void* memory) {
-    if (!GetMemoryTrackingEnabled_ThreadLocal()) {
-      return;
-    }
-    starboard::ScopedLock lock(mutex_);
-    last_deallocation_ = memory;
-    number_allocs_--;
-  }
-
-  void ReportUnMapMemory(const void* memory, size_t size) {
-    if (!GetMemoryTrackingEnabled_ThreadLocal()) {
-      return;
-    }
-    starboard::ScopedLock lock(mutex_);
-    last_mem_unmap_ = memory;
-    number_map_mem_--;
-  }
-
-  void Construct() {
-    Clear();
-    memory_reporter_ = CreateSbMemoryReporter(this);
-  }
-
-  SbMemoryReporter memory_reporter_;
-  starboard::Mutex mutex_;
-  const void* last_allocation_;
-  const void* last_deallocation_;
-  const void* last_mem_map_;
-  const void* last_mem_unmap_;
-  int number_allocs_;
-  int number_map_mem_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Needed by all tests that require a memory tracker to be installed. On the
-// first test the test memory tracker is installed and then after the last test
-// the memory tracker is removed.
-class MemoryReportingTest : public ::testing::Test {
- public:
-  TestMemReporter* mem_reporter() { return s_test_alloc_tracker_; }
-  bool MemoryReportingEnabled() const {
-    return s_memory_reporter_error_enabled_;
-  }
-
- protected:
-  // Global setup - runs before the first test in the series.
-  static void SetUpTestCase() {
-    InitMemoryTrackingState_ThreadLocal();
-    // global init test code should run here.
-    if (s_test_alloc_tracker_ == NULL) {
-      s_test_alloc_tracker_ = new TestMemReporter;
-    }
-    s_memory_reporter_error_enabled_ =
-        SbMemorySetReporter(s_test_alloc_tracker_->memory_reporter());
-  }
-
-  // Global Teardown after last test has run it's course.
-  static void TearDownTestCase() { s_test_alloc_tracker_->RemoveGlobalHooks(); }
-
-  // Per test setup.
-  virtual void SetUp() {
-    mem_reporter()->Clear();
-    // Allows current thread to capture memory allocations. If this wasn't
-    // done then background threads spawned by a framework could notify this
-    // class about allocations and fail the test.
-    SetMemoryTrackingEnabled_ThreadLocal(true);
-  }
-
-  // Per test teardown.
-  virtual void TearDown() {
-    SetMemoryTrackingEnabled_ThreadLocal(false);
-    if ((mem_reporter()->number_allocs() != 0) ||
-        (mem_reporter()->number_map_mem() != 0)) {
-      ADD_FAILURE_AT(__FILE__, __LINE__) << "Memory Leak detected.";
-    }
-    mem_reporter()->Clear();
-  }
-  static TestMemReporter* s_test_alloc_tracker_;
-  static bool s_memory_reporter_error_enabled_;
-};
-TestMemReporter* MemoryReportingTest::s_test_alloc_tracker_ = NULL;
-bool MemoryReportingTest::s_memory_reporter_error_enabled_ = false;
-
-///////////////////////////////////////////////////////////////////////////////
-// TESTS.
-// There are two sets of tests: POSITIVE and NEGATIVE.
-//  The positive tests are active when STARBOARD_ALLOWS_MEMORY_TRACKING is
-//  defined and test that memory tracking is enabled.
-//  NEGATIVE tests ensure that tracking is disabled when
-//  STARBOARD_ALLOWS_MEMORY_TRACKING is not defined.
-// When adding new tests:
-//  POSITIVE tests are named normally.
-//  NEGATIVE tets are named with "No" prefixed to the beginning.
-//  Example:
-//   TEST_F(MemoryReportingTest, CapturesAllocDealloc) <--- POSITIVE test.
-//   TEST_F(MemoryReportingTest, NoCapturesAllocDealloc) <- NEGATIVE test.
-//  All positive & negative tests are grouped together.
-///////////////////////////////////////////////////////////////////////////////
-
-#ifdef STARBOARD_ALLOWS_MEMORY_TRACKING
-// These are POSITIVE tests, which test the expectation that when the define
-// STARBOARD_ALLOWS_MEMORY_TRACKING is active that the memory tracker will
-// receive memory allocations notifications.
-//
-// Tests the assumption that the SbMemoryAllocate and SbMemoryDeallocate
-// will report memory allocations.
-TEST_F(MemoryReportingTest, CapturesAllocDealloc) {
-  if (!MemoryReportingEnabled()) {
-    SbLog(kSbLogPriorityInfo, "Memory reporting is disabled.\n");
-    return;
-  }
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_allocs());
-  void* memory = SbMemoryAllocate(4);
-  EXPECT_EQ_NO_TRACKING(1, mem_reporter()->number_allocs());
-
-  EXPECT_EQ_NO_TRACKING(memory, mem_reporter()->last_allocation());
-
-  SbMemoryDeallocate(memory);
-  EXPECT_EQ_NO_TRACKING(mem_reporter()->number_allocs(), 0);
-
-  // Should equal the last allocation.
-  EXPECT_EQ_NO_TRACKING(memory, mem_reporter()->last_deallocation());
-}
-
-// Tests the assumption that SbMemoryReallocate() will report a
-// deallocation and an allocation to the memory tracker.
-TEST_F(MemoryReportingTest, CapturesRealloc) {
-  if (!MemoryReportingEnabled()) {
-    SbLog(kSbLogPriorityInfo, "Memory reporting is disabled.\n");
-    return;
-  }
-  void* prev_memory = SbMemoryAllocate(4);
-  void* new_memory = SbMemoryReallocate(prev_memory, 8);
-
-  EXPECT_EQ_NO_TRACKING(new_memory, mem_reporter()->last_allocation());
-  EXPECT_EQ_NO_TRACKING(prev_memory, mem_reporter()->last_deallocation());
-
-  EXPECT_EQ_NO_TRACKING(1, mem_reporter()->number_allocs());
-
-  SbMemoryDeallocate(new_memory);
-  EXPECT_EQ_NO_TRACKING(mem_reporter()->number_allocs(), 0);
-}
-
-// Tests the assumption that the SbMemoryMap and SbMemoryUnmap
-// will report memory allocations.
-TEST_F(MemoryReportingTest, CapturesMemMapUnmap) {
-  if (!MemoryReportingEnabled()) {
-    SbLog(kSbLogPriorityInfo, "Memory reporting is disabled.\n");
-    return;
-  }
-  const int64_t kMemSize = 4096;
-  const int kFlags = kSbMemoryMapProtectReadWrite;
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_map_mem());
-  void* mem_chunk = SbMemoryMap(kMemSize, kFlags, "TestMemMap");
-  EXPECT_EQ_NO_TRACKING(1, mem_reporter()->number_map_mem());
-
-  // Now unmap the memory and confirm that this memory was reported as free.
-  EXPECT_EQ_NO_TRACKING(mem_chunk, mem_reporter()->last_mem_map());
-  SbMemoryUnmap(mem_chunk, kMemSize);
-  EXPECT_EQ_NO_TRACKING(mem_chunk, mem_reporter()->last_mem_unmap());
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_map_mem());
-  // On some platforms, bookkeeping for memory mapping can cost allocations.
-  // Call Clear() explicitly before TearDown() checks number_allocs_;
-  mem_reporter()->Clear();
-}
-
-// Tests the assumption that the operator new/delete will report
-// memory allocations.
-TEST_F(MemoryReportingTest, CapturesOperatorNewDelete) {
-  if (!MemoryReportingEnabled()) {
-    SbLog(kSbLogPriorityInfo, "Memory reporting is disabled.\n");
-    return;
-  }
-  EXPECT_TRUE_NO_TRACKING(mem_reporter()->number_allocs() == 0);
-  int* my_int = new int();
-  EXPECT_TRUE_NO_TRACKING(mem_reporter()->number_allocs() == 1);
-
-  bool is_last_allocation = my_int == mem_reporter()->last_allocation();
-
-  EXPECT_TRUE_NO_TRACKING(is_last_allocation);
-
-  delete my_int;
-  EXPECT_TRUE_NO_TRACKING(mem_reporter()->number_allocs() == 0);
-
-  // Expect last deallocation to be the expected pointer.
-  EXPECT_EQ_NO_TRACKING(my_int, mem_reporter()->last_deallocation());
-}
-
-// Tests the assumption that the nothrow version of operator new will report
-// memory allocations.
-TEST_F(MemoryReportingTest, CapturesOperatorNewNothrow) {
-  if (!MemoryReportingEnabled()) {
-    SbLog(kSbLogPriorityInfo, "Memory reporting is disabled.\n");
-    return;
-  }
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_allocs());
-  int* my_int = new (std::nothrow) int();
-  EXPECT_EQ_NO_TRACKING(1, mem_reporter()->number_allocs());
-
-  bool is_last_allocation = my_int == mem_reporter()->last_allocation();
-
-  EXPECT_TRUE_NO_TRACKING(is_last_allocation);
-
-  delete my_int;
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_allocs());
-
-  // Expect last deallocation to be the expected pointer.
-  EXPECT_EQ_NO_TRACKING(my_int, mem_reporter()->last_deallocation());
-}
-
-// Tests the assumption that the nothrow version of operator delete will report
-// memory deallocations.
-TEST_F(MemoryReportingTest, CapturesOperatorDeleteNothrow) {
-  if (!MemoryReportingEnabled()) {
-    SbLog(kSbLogPriorityInfo, "Memory reporting is disabled.\n");
-    return;
-  }
-  const void* init_alloc = mem_reporter()->last_allocation();
-
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_allocs());
-  void* my_obj = nullptr;
-  bool caught_exception = false;
-  try {
-    my_obj = new (std::nothrow) ThrowConstructor();
-  } catch (std::exception e) {
-    caught_exception = true;
-  }
-  EXPECT_TRUE(caught_exception);
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_allocs());
-
-  // Expect that an allocation occurred, even though we never got a pointer.
-  EXPECT_EQ_NO_TRACKING(nullptr, my_obj);
-  EXPECT_NE_NO_TRACKING(nullptr, mem_reporter()->last_allocation());
-  EXPECT_NE_NO_TRACKING(init_alloc, mem_reporter()->last_allocation());
-
-  // Expect last deallocation to be the allocation we never got.
-  EXPECT_EQ_NO_TRACKING(mem_reporter()->last_allocation(),
-                        mem_reporter()->last_deallocation());
-}
-
-#else  // !defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-// These are NEGATIVE tests, which test the expectation that when the
-// STARBOARD_ALLOWS_MEMORY_TRACKING is undefined that the memory tracker does
-// not receive memory allocations notifications.
-
-TEST_F(MemoryReportingTest, NoCapturesAllocDealloc) {
-  EXPECT_FALSE_NO_TRACKING(MemoryReportingEnabled());
-
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_allocs());
-  void* memory = SbMemoryAllocate(4);
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_allocs());
-  EXPECT_EQ_NO_TRACKING(NULL, mem_reporter()->last_allocation());
-
-  SbMemoryDeallocate(memory);
-  EXPECT_EQ_NO_TRACKING(mem_reporter()->number_allocs(), 0);
-  EXPECT_EQ_NO_TRACKING(NULL, mem_reporter()->last_deallocation());
-}
-
-TEST_F(MemoryReportingTest, NoCapturesRealloc) {
-  EXPECT_FALSE_NO_TRACKING(MemoryReportingEnabled());
-  void* prev_memory = SbMemoryAllocate(4);
-  void* new_memory = SbMemoryReallocate(prev_memory, 8);
-
-  EXPECT_EQ_NO_TRACKING(NULL, mem_reporter()->last_allocation());
-  EXPECT_EQ_NO_TRACKING(NULL, mem_reporter()->last_deallocation());
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_allocs());
-
-  SbMemoryDeallocate(new_memory);
-  EXPECT_EQ_NO_TRACKING(mem_reporter()->number_allocs(), 0);
-}
-
-TEST_F(MemoryReportingTest, NoCapturesMemMapUnmap) {
-  EXPECT_FALSE_NO_TRACKING(MemoryReportingEnabled());
-  const int64_t kMemSize = 4096;
-  const int kFlags = 0;
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_allocs());
-  void* mem_chunk = SbMemoryMap(kMemSize, kFlags, "TestMemMap");
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_allocs());
-
-  // Now unmap the memory and confirm that this memory was reported as free.
-  EXPECT_EQ_NO_TRACKING(NULL, mem_reporter()->last_mem_map());
-  SbMemoryUnmap(mem_chunk, kMemSize);
-  EXPECT_EQ_NO_TRACKING(NULL, mem_reporter()->last_mem_unmap());
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_allocs());
-}
-
-TEST_F(MemoryReportingTest, NoCapturesOperatorNewDelete) {
-  EXPECT_FALSE_NO_TRACKING(MemoryReportingEnabled());
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_map_mem());
-  int* my_int = new int();
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_map_mem());
-  EXPECT_EQ_NO_TRACKING(NULL, mem_reporter()->last_allocation());
-
-  delete my_int;
-  EXPECT_EQ_NO_TRACKING(0, mem_reporter()->number_map_mem());
-  EXPECT_EQ_NO_TRACKING(NULL, mem_reporter()->last_deallocation());
-}
-
-#endif  // !defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-
-/////////////////////////////// Implementation ////////////////////////////////
-
-// Simple ThreadLocalBool class which allows a default value to be
-// true or false.
-class ThreadLocalBool {
- public:
-  ThreadLocalBool() {
-    // NULL is the destructor.
-    slot_ = SbThreadCreateLocalKey(NULL);
-  }
-
-  ~ThreadLocalBool() { SbThreadDestroyLocalKey(slot_); }
-
-  void SetEnabled(bool value) { SetEnabledThreadLocal(value); }
-
-  bool Enabled() const { return GetEnabledThreadLocal(); }
-
- private:
-  void SetEnabledThreadLocal(bool value) {
-    void* bool_as_pointer;
-    if (value) {
-      bool_as_pointer = reinterpret_cast<void*>(0x1);
-    } else {
-      bool_as_pointer = NULL;
-    }
-    SbThreadSetLocalValue(slot_, bool_as_pointer);
-  }
-
-  bool GetEnabledThreadLocal() const {
-    void* ptr = SbThreadGetLocalValue(slot_);
-    return ptr != NULL;
-  }
-
-  mutable SbThreadLocalKey slot_;
-  bool default_value_;
-};
-
-void InitMemoryTrackingState_ThreadLocal() {
-  GetMemoryTrackingEnabled_ThreadLocal();
-}
-
-static ThreadLocalBool* GetMemoryTrackingState() {
-  static ThreadLocalBool* thread_local_bool = new ThreadLocalBool();
-  return thread_local_bool;
-}
-
-bool GetMemoryTrackingEnabled_ThreadLocal() {
-  return GetMemoryTrackingState()->Enabled();
-}
-
-void SetMemoryTrackingEnabled_ThreadLocal(bool value) {
-  GetMemoryTrackingState()->SetEnabled(value);
-}
-
-// No use for these macros anymore.
-#undef EXPECT_EQ_NO_TRACKING
-#undef EXPECT_TRUE_NO_TRACKING
-#undef EXPECT_FALSE_NO_TRACKING
-#undef ASSERT_EQ_NO_TRACKING
-#undef ASSERT_TRUE_NO_TRACKING
-#undef ASSERT_FALSE_NO_TRACKING
-
-}  // namespace
-}  // namespace nplb
-}  // namespace starboard
diff --git a/starboard/nplb/murmurhash2_test.cc b/starboard/nplb/murmurhash2_test.cc
index d9bd5ce..e168fbd 100644
--- a/starboard/nplb/murmurhash2_test.cc
+++ b/starboard/nplb/murmurhash2_test.cc
@@ -15,7 +15,6 @@
 // Thread joining is mostly tested in the other tests.
 
 #include "starboard/common/murmurhash2.h"
-#include "starboard/common/byte_swap.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace starboard {
@@ -27,8 +26,8 @@
   uint32_t hash_unaligned = MurmurHash2_32(&val, sizeof(val));
   uint32_t hash_aligned = MurmurHash2_32_Aligned(&val, sizeof(val));
   EXPECT_EQ(hash_aligned, hash_unaligned);
-  char data[sizeof(uint32_t)*2];
-  memcpy(data+1, &val, sizeof(val));
+  char data[sizeof(uint32_t) * 2];
+  memcpy(data + 1, &val, sizeof(val));
   EXPECT_EQ(hash_aligned, MurmurHash2_32(data + 1, sizeof(val)));
 }
 
diff --git a/starboard/nplb/nplb_evergreen_compat_tests/storage_test.cc b/starboard/nplb/nplb_evergreen_compat_tests/storage_test.cc
index 218cfb3..2445fd4 100644
--- a/starboard/nplb/nplb_evergreen_compat_tests/storage_test.cc
+++ b/starboard/nplb/nplb_evergreen_compat_tests/storage_test.cc
@@ -32,7 +32,7 @@
 namespace {
 
 const char kFileName[] = "test_file.data";
-const size_t kBufSize = 96 * 1024 * 1024;  // 96 MB
+const size_t kBufSize = 64 * 1024 * 1024;  // 64 MB
 
 class StorageTest : public ::testing::Test {
  protected:
diff --git a/starboard/nplb/semaphore_test.cc b/starboard/nplb/semaphore_test.cc
index ca49fe6..76742d8 100644
--- a/starboard/nplb/semaphore_test.cc
+++ b/starboard/nplb/semaphore_test.cc
@@ -65,7 +65,9 @@
 class ThreadTakesWaitSemaphore : public AbstractTestThread {
  public:
   explicit ThreadTakesWaitSemaphore(SbTime wait_us)
-      : thread_started_(false), wait_us_(wait_us), result_signaled_(false),
+      : thread_started_(false),
+        wait_us_(wait_us),
+        result_signaled_(false),
         result_wait_time_(0) {}
   void Run() override {
     thread_started_ = true;
diff --git a/starboard/nplb/string_compare_no_case_n_test.cc b/starboard/nplb/string_compare_no_case_n_test.cc
index 59f1d1b..84e4228 100644
--- a/starboard/nplb/string_compare_no_case_n_test.cc
+++ b/starboard/nplb/string_compare_no_case_n_test.cc
@@ -21,8 +21,7 @@
 
 TEST(SbStringCompareNoCaseNTest, SunnyDaySelf) {
   const char kString[] = "0123456789";
-  EXPECT_EQ(
-      0, SbStringCompareNoCaseN(kString, kString, strlen(kString)));
+  EXPECT_EQ(0, SbStringCompareNoCaseN(kString, kString, strlen(kString)));
   EXPECT_EQ(0, SbStringCompareNoCaseN("", "", 0));
 }
 
@@ -38,28 +37,23 @@
 
 TEST(SbStringCompareNoCaseNTest, SunnyDayBigN) {
   const char kString[] = "0123456789";
-  EXPECT_EQ(0, SbStringCompareNoCaseN(kString, kString,
-                                      strlen(kString) * 2));
+  EXPECT_EQ(0, SbStringCompareNoCaseN(kString, kString, strlen(kString) * 2));
 }
 
 TEST(SbStringCompareNoCaseNTest, SunnyDayCase) {
   const char kString1[] = "aBcDeFgHiJkLmNoPqRsTuVwXyZ";
   const char kString2[] = "AbCdEfGhIjKlMnOpQrStUvWxYz";
-  EXPECT_EQ(0, SbStringCompareNoCaseN(kString1, kString2,
-                                      strlen(kString1)));
-  EXPECT_EQ(0, SbStringCompareNoCaseN(kString2, kString1,
-                                      strlen(kString2)));
+  EXPECT_EQ(0, SbStringCompareNoCaseN(kString1, kString2, strlen(kString1)));
+  EXPECT_EQ(0, SbStringCompareNoCaseN(kString2, kString1, strlen(kString2)));
 
   const char kString3[] = "aBcDeFgHiJkLmaBcDeFgHiJkLm";
   const char kString4[] = "AbCdEfGhIjKlMnOpQrStUvWxYz";
-  EXPECT_GT(0, SbStringCompareNoCaseN(kString3, kString4,
-                                      strlen(kString3)));
-  EXPECT_LT(0, SbStringCompareNoCaseN(kString4, kString3,
-                                      strlen(kString4)));
-  EXPECT_EQ(0, SbStringCompareNoCaseN(kString3, kString4,
-                                      strlen(kString3) / 2));
-  EXPECT_EQ(0, SbStringCompareNoCaseN(kString4, kString3,
-                                      strlen(kString4) / 2));
+  EXPECT_GT(0, SbStringCompareNoCaseN(kString3, kString4, strlen(kString3)));
+  EXPECT_LT(0, SbStringCompareNoCaseN(kString4, kString3, strlen(kString4)));
+  EXPECT_EQ(0,
+            SbStringCompareNoCaseN(kString3, kString4, strlen(kString3) / 2));
+  EXPECT_EQ(0,
+            SbStringCompareNoCaseN(kString4, kString3, strlen(kString4) / 2));
 }
 
 }  // namespace
diff --git a/starboard/nplb/system_hide_splash_screen_test.cc b/starboard/nplb/system_hide_splash_screen_test.cc
index 8ec2e4d..9d2e8e3 100644
--- a/starboard/nplb/system_hide_splash_screen_test.cc
+++ b/starboard/nplb/system_hide_splash_screen_test.cc
@@ -30,7 +30,7 @@
 
 TEST(SbSystemHideSplashScreenTest, SunnyDay) {
   // Function returns no result, and correct execution cannot be determined
-  // programatically, but we should at least be able to call it twice without
+  // programmatically, but we should at least be able to call it twice without
   // crashing.
   SbSystemHideSplashScreen();
   SbSystemHideSplashScreen();
diff --git a/starboard/nplb/thread_join_test.cc b/starboard/nplb/thread_join_test.cc
index 54da92d..d150079 100644
--- a/starboard/nplb/thread_join_test.cc
+++ b/starboard/nplb/thread_join_test.cc
@@ -38,8 +38,8 @@
   struct LocalStatic {
     static void* ThreadEntryPoint(void* input) {
       int* value = static_cast<int*>(input);
-      static const SbTime kSleepTime = 10*kSbTimeMillisecond;  // 10 ms.
-      // Wait to write the value to increase likelyhood of catching
+      static const SbTime kSleepTime = 10 * kSbTimeMillisecond;  // 10 ms.
+      // Wait to write the value to increase likelihood of catching
       // a race condition.
       SbThreadSleep(kSleepTime);
       (*value)++;
@@ -47,17 +47,16 @@
     }
   };
 
-  // Try to increase likelyhood of a race condition by running multiple times.
+  // Try to increase likelihood of a race condition by running multiple times.
   for (int i = 0; i < 10; ++i) {
     int num_times_thread_entry_point_run = 0;
-    SbThread thread = SbThreadCreate(
-        0,                    // Signals automatic thread stack size.
-        kSbThreadNoPriority,  // Signals default priority.
-        kSbThreadNoAffinity,  // Signals default affinity.
-        true,                 // joinable thread.
-        "TestThread",
-        LocalStatic::ThreadEntryPoint,
-        &num_times_thread_entry_point_run);
+    SbThread thread =
+        SbThreadCreate(0,  // Signals automatic thread stack size.
+                       kSbThreadNoPriority,  // Signals default priority.
+                       kSbThreadNoAffinity,  // Signals default affinity.
+                       true,                 // joinable thread.
+                       "TestThread", LocalStatic::ThreadEntryPoint,
+                       &num_times_thread_entry_point_run);
 
     ASSERT_NE(kSbThreadInvalid, thread) << "Thread creation not successful";
     ASSERT_TRUE(SbThreadJoin(thread, NULL));
diff --git a/starboard/nplb/thread_local_value_test.cc b/starboard/nplb/thread_local_value_test.cc
index 6dfae12..3b4ce10 100644
--- a/starboard/nplb/thread_local_value_test.cc
+++ b/starboard/nplb/thread_local_value_test.cc
@@ -144,9 +144,7 @@
       kSbThreadNoPriority,  // Signals default priority.
       kSbThreadNoAffinity,  // Signals default affinity.
       true,                 // joinable thread.
-      "TestThread",
-      LocalStatic::ThreadEntryPoint,
-      static_cast<void*>(&key));
+      "TestThread", LocalStatic::ThreadEntryPoint, static_cast<void*>(&key));
 
   ASSERT_NE(kSbThreadInvalid, thread) << "Thread creation not successful";
   // 2nd param is return value from ThreadEntryPoint, which is always NULL.
diff --git a/starboard/nplb/thread_sleep_test.cc b/starboard/nplb/thread_sleep_test.cc
index 4773334..fd04c9b 100644
--- a/starboard/nplb/thread_sleep_test.cc
+++ b/starboard/nplb/thread_sleep_test.cc
@@ -40,8 +40,8 @@
     SbTimeMonotonic start = SbTimeGetMonotonicNow();
     SbThreadSleep(kDelay);
     SbTimeMonotonic end = SbTimeGetMonotonicNow();
-    EXPECT_LE(start + kDelay, end + kPrecision) << "Trial " << trial
-                                                << ", kDelay=" << kDelay;
+    EXPECT_LE(start + kDelay, end + kPrecision)
+        << "Trial " << trial << ", kDelay=" << kDelay;
   }
 }
 
@@ -50,8 +50,8 @@
   for (int trial = 0; trial < kTrials; ++trial) {
     SbTimeMonotonic start = SbTimeGetMonotonicNow();
     SbThreadSleep(-kSbTimeSecond);
-    EXPECT_GT(kSbTimeSecond / 5, SbTimeGetMonotonicNow() - start) << "Trial "
-                                                                  << trial;
+    EXPECT_GT(kSbTimeSecond / 5, SbTimeGetMonotonicNow() - start)
+        << "Trial " << trial;
   }
 }
 
diff --git a/starboard/nplb/user_get_property_test.cc b/starboard/nplb/user_get_property_test.cc
index 009d6a0..0b4cb24 100644
--- a/starboard/nplb/user_get_property_test.cc
+++ b/starboard/nplb/user_get_property_test.cc
@@ -53,7 +53,9 @@
 
   TestProperty(current, kSbUserPropertyUserName);
   TestProperty(current, kSbUserPropertyUserId);
+#if SB_API_VERSION < 16
   TestProperty(current, kSbUserPropertyAvatarUrl);
+#endif
 }
 
 TEST(SbUserGetPropertyTest, MultipleTimes) {
@@ -69,8 +71,10 @@
   TestProperty(current, kSbUserPropertyUserId);
   TestProperty(current, kSbUserPropertyUserId);
 
+#if SB_API_VERSION < 16
   TestProperty(current, kSbUserPropertyAvatarUrl);
   TestProperty(current, kSbUserPropertyAvatarUrl);
+#endif
 }
 
 }  // namespace
diff --git a/starboard/once.h b/starboard/once.h
index ad8c274..46cb1dd 100644
--- a/starboard/once.h
+++ b/starboard/once.h
@@ -81,7 +81,9 @@
     static SbOnceControl s_once_flag = SB_ONCE_INITIALIZER; \
     static Type* s_singleton = NULL;                        \
     struct Local {                                          \
-      static void Init() { s_singleton = new Type(); }      \
+      static void Init() {                                  \
+        s_singleton = new Type();                           \
+      }                                                     \
     };                                                      \
     SbOnce(&s_once_flag, Local::Init);                      \
     return s_singleton;                                     \
diff --git a/starboard/optional/README.md b/starboard/optional/README.md
index 84c058a..a01c6a2 100644
--- a/starboard/optional/README.md
+++ b/starboard/optional/README.md
@@ -7,4 +7,3 @@
 
 The only code that we currently support optionally including is test targets.
 The test targets can be retrieved in formats friendly to both Python and GYP.
-
diff --git a/starboard/raspi/2/skia/platform_configuration/BUILD.gn b/starboard/raspi/2/skia/platform_configuration/BUILD.gn
index 17a93b7..235357d 100644
--- a/starboard/raspi/2/skia/platform_configuration/BUILD.gn
+++ b/starboard/raspi/2/skia/platform_configuration/BUILD.gn
@@ -13,7 +13,5 @@
 # limitations under the License.
 
 config("platform_configuration") {
-  configs = [
-    "//starboard/raspi/2/platform_configuration",
-  ]
+  configs = [ "//starboard/raspi/2/platform_configuration" ]
 }
diff --git a/starboard/raspi/shared/BUILD.gn b/starboard/raspi/shared/BUILD.gn
index 3a4b331..d31dbb3 100644
--- a/starboard/raspi/shared/BUILD.gn
+++ b/starboard/raspi/shared/BUILD.gn
@@ -337,17 +337,6 @@
 
   sources += common_player_sources
 
-  if (sb_api_version == 12) {
-    sources += [
-      "//starboard/shared/stub/speech_recognizer_cancel.cc",
-      "//starboard/shared/stub/speech_recognizer_create.cc",
-      "//starboard/shared/stub/speech_recognizer_destroy.cc",
-      "//starboard/shared/stub/speech_recognizer_is_supported.cc",
-      "//starboard/shared/stub/speech_recognizer_start.cc",
-      "//starboard/shared/stub/speech_recognizer_stop.cc",
-    ]
-  }
-
   configs += [ "//starboard/build/config:starboard_implementation" ]
 
   public_deps = [
@@ -382,8 +371,8 @@
 
 static_library("starboard_base_symbolize") {
   sources = [
-    "//base/third_party/symbolize/demangle.cc",
-    "//base/third_party/symbolize/symbolize.cc",
+    "//third_party/symbolize/demangle.cc",
+    "//third_party/symbolize/symbolize.cc",
   ]
 
   public_deps = [ "//starboard/elf_loader:evergreen_info" ]
diff --git a/starboard/raspi/shared/open_max/decode_target_create.cc b/starboard/raspi/shared/open_max/decode_target_create.cc
index 32a0e74..7d51202 100644
--- a/starboard/raspi/shared/open_max/decode_target_create.cc
+++ b/starboard/raspi/shared/open_max/decode_target_create.cc
@@ -98,8 +98,8 @@
   params.egl_context = provider->egl_context;
   params.decode_target_out = kSbDecodeTargetInvalid;
 
-  SbDecodeTargetRunInGlesContext(
-      provider, &CreateWithContextRunner, static_cast<void*>(&params));
+  SbDecodeTargetRunInGlesContext(provider, &CreateWithContextRunner,
+                                 static_cast<void*>(&params));
 
   return params.decode_target_out;
 }
diff --git a/starboard/raspi/shared/open_max/open_max_component.cc b/starboard/raspi/shared/open_max/open_max_component.cc
index 94c03da..6a19725 100644
--- a/starboard/raspi/shared/open_max/open_max_component.cc
+++ b/starboard/raspi/shared/open_max/open_max_component.cc
@@ -80,7 +80,9 @@
   SendCommandAndWaitForCompletion(OMX_CommandFlush, output_port_);
 }
 
-int OpenMaxComponent::WriteData(const void* data, int size, DataType type,
+int OpenMaxComponent::WriteData(const void* data,
+                                int size,
+                                DataType type,
                                 SbTime timestamp) {
   int offset = 0;
 
@@ -218,8 +220,8 @@
 void OpenMaxComponent::OnErrorEvent(OMX_U32 data1,
                                     OMX_U32 data2,
                                     OMX_PTR event_data) {
-  SB_NOTREACHED() << "OMX_EventError received with " << std::hex << data1
-                  << " " << data2;
+  SB_NOTREACHED() << "OMX_EventError received with " << std::hex << data1 << " "
+                  << data2;
 }
 
 OMX_BUFFERHEADERTYPE* OpenMaxComponent::AllocateBuffer(int port,
@@ -328,10 +330,10 @@
   OMX_ERRORTYPE error =
       OMX_SetupTunnel(handle_, output_port_, output_component_->handle_,
                       output_component_->input_port_);
-  SB_DCHECK(error == OMX_ErrorNone) << "OMX_SetupTunnel " << output_port_
-                                    << " to " << output_component_->input_port_
-                                    << " failed with error " << std::hex
-                                    << error;
+  SB_DCHECK(error == OMX_ErrorNone)
+      << "OMX_SetupTunnel " << output_port_ << " to "
+      << output_component_->input_port_ << " failed with error " << std::hex
+      << error;
 
   // Enable the tunnel. This takes place of output_component_->Start(), but
   // the component will still need to be put into the executing state when
diff --git a/starboard/raspi/shared/open_max/open_max_component.h b/starboard/raspi/shared/open_max/open_max_component.h
index 1889c5c..6ca5c49 100644
--- a/starboard/raspi/shared/open_max/open_max_component.h
+++ b/starboard/raspi/shared/open_max/open_max_component.h
@@ -32,8 +32,8 @@
 class OpenMaxComponent : protected OpenMaxComponentBase {
  public:
   enum DataType {
-    kDataNonEOS,    // Do not flag any buffer as end of stream.
-    kDataEOS,       // Flag the last buffer written as end of stream.
+    kDataNonEOS,  // Do not flag any buffer as end of stream.
+    kDataEOS,     // Flag the last buffer written as end of stream.
   };
 
   explicit OpenMaxComponent(const char* name);
@@ -69,8 +69,7 @@
   void DropOutputBuffer(OMX_BUFFERHEADERTYPE* buffer);
 
   // Callbacks available to children.
-  void OnErrorEvent(OMX_U32 data1, OMX_U32 data2,
-                    OMX_PTR event_data) override;
+  void OnErrorEvent(OMX_U32 data1, OMX_U32 data2, OMX_PTR event_data) override;
   virtual bool OnEnableInputPort(OMXParamPortDefinition* port_definition) {
     return false;
   }
diff --git a/starboard/raspi/shared/open_max/open_max_component_base.h b/starboard/raspi/shared/open_max/open_max_component_base.h
index 700d671..2449aec 100644
--- a/starboard/raspi/shared/open_max/open_max_component_base.h
+++ b/starboard/raspi/shared/open_max/open_max_component_base.h
@@ -69,27 +69,27 @@
   void GetInputPortParam(ParamType* param) const {
     param->nPortIndex = input_port_;
     OMX_ERRORTYPE error = OMX_GetParameter(handle_, ParamType::Index, param);
-    SB_DCHECK(error == OMX_ErrorNone) << std::hex << "OMX_GetParameter("
-                                      << ParamType::Index
-                                      << ") failed with error " << error;
+    SB_DCHECK(error == OMX_ErrorNone)
+        << std::hex << "OMX_GetParameter(" << ParamType::Index
+        << ") failed with error " << error;
   }
 
   template <typename ParamType>
   void GetOutputPortParam(ParamType* param) const {
     param->nPortIndex = output_port_;
     OMX_ERRORTYPE error = OMX_GetParameter(handle_, ParamType::Index, param);
-    SB_DCHECK(error == OMX_ErrorNone) << std::hex << "OMX_GetParameter("
-                                      << ParamType::Index
-                                      << ") failed with error " << error;
+    SB_DCHECK(error == OMX_ErrorNone)
+        << std::hex << "OMX_GetParameter(" << ParamType::Index
+        << ") failed with error " << error;
   }
 
   template <typename ParamType>
   void SetPortParam(const ParamType& param) const {
     OMX_ERRORTYPE error = OMX_SetParameter(handle_, ParamType::Index,
                                            const_cast<ParamType*>(&param));
-    SB_DCHECK(error == OMX_ErrorNone) << std::hex << "OMX_SetParameter("
-                                      << ParamType::Index
-                                      << ") failed with error " << error;
+    SB_DCHECK(error == OMX_ErrorNone)
+        << std::hex << "OMX_SetParameter(" << ParamType::Index
+        << ") failed with error " << error;
   }
 
   void SendCommand(OMX_COMMANDTYPE command, int param);
@@ -101,7 +101,8 @@
                         OMX_U32 data2,
                         OMX_PTR event_data);
 
-  virtual void OnErrorEvent(OMX_U32 data1, OMX_U32 data2,
+  virtual void OnErrorEvent(OMX_U32 data1,
+                            OMX_U32 data2,
                             OMX_PTR event_data) = 0;
   virtual void OnOutputSettingChanged() = 0;
   virtual OMX_ERRORTYPE OnEmptyBufferDone(OMX_BUFFERHEADERTYPE* buffer) = 0;
diff --git a/starboard/raspi/shared/open_max/open_max_video_decode_component.h b/starboard/raspi/shared/open_max/open_max_video_decode_component.h
index 05df492..9ab601e 100644
--- a/starboard/raspi/shared/open_max/open_max_video_decode_component.h
+++ b/starboard/raspi/shared/open_max/open_max_video_decode_component.h
@@ -33,8 +33,8 @@
 // manages the disposition of Dispmanx resource.
 class OpenMaxVideoDecodeComponent : private OpenMaxComponent {
  public:
-  using OpenMaxComponent::Start;
   using OpenMaxComponent::Flush;
+  using OpenMaxComponent::Start;
   using OpenMaxComponent::WriteData;
   using OpenMaxComponent::WriteEOS;
 
diff --git a/starboard/raspi/shared/system_gles2.cc b/starboard/raspi/shared/system_gles2.cc
index fd9140d..c45d5aa 100644
--- a/starboard/raspi/shared/system_gles2.cc
+++ b/starboard/raspi/shared/system_gles2.cc
@@ -170,110 +170,110 @@
     &glVertexAttrib4fv,
     &glVertexAttribPointer,
     &glViewport,
-    nullptr, // glReadBuffer
-    nullptr, // glDrawRangeElements
-    nullptr, // glTexImage3D
-    nullptr, // glTexSubImage3D
-    nullptr, // glCopyTexSubImage3D
-    nullptr, // glCompressedTexImage3D
-    nullptr, // glCompressedTexSubImage3D
-    nullptr, // glGenQueries
-    nullptr, // glDeleteQueries
-    nullptr, // glIsQuery
-    nullptr, // glBeginQuery
-    nullptr, // glEndQuery
-    nullptr, // glGetQueryiv
-    nullptr, // glGetQueryObjectuiv
-    nullptr, // glUnmapBuffer
-    nullptr, // glGetBufferPointerv
-    nullptr, // glDrawBuffers
-    nullptr, // glUniformMatrix2x3fv
-    nullptr, // glUniformMatrix3x2fv
-    nullptr, // glUniformMatrix2x4fv
-    nullptr, // glUniformMatrix4x2fv
-    nullptr, // glUniformMatrix3x4fv
-    nullptr, // glUniformMatrix4x3fv
-    nullptr, // glBlitFramebuffer
-    nullptr, // glRenderbufferStorageMultisample
-    nullptr, // glFramebufferTextureLayer
-    nullptr, // glMapBufferRange
-    nullptr, // glFlushMappedBufferRange
-    nullptr, // glBindVertexArray
-    nullptr, // glDeleteVertexArrays
-    nullptr, // glGenVertexArrays
-    nullptr, // glIsVertexArray
-    nullptr, // glGetIntegeri_v
-    nullptr, // glBeginTransformFeedback
-    nullptr, // glEndTransformFeedback
-    nullptr, // glBindBufferRange
-    nullptr, // glBindBufferBase
-    nullptr, // glTransformFeedbackVaryings
-    nullptr, // glGetTransformFeedbackVarying
-    nullptr, // glVertexAttribIPointer
-    nullptr, // glGetVertexAttribIiv
-    nullptr, // glGetVertexAttribIuiv
-    nullptr, // glVertexAttribI4i
-    nullptr, // glVertexAttribI4ui
-    nullptr, // glVertexAttribI4iv
-    nullptr, // glVertexAttribI4uiv
-    nullptr, // glGetUniformuiv
-    nullptr, // glGetFragDataLocation
-    nullptr, // glUniform1ui
-    nullptr, // glUniform2ui
-    nullptr, // glUniform3ui
-    nullptr, // glUniform4ui
-    nullptr, // glUniform1uiv
-    nullptr, // glUniform2uiv
-    nullptr, // glUniform3uiv
-    nullptr, // glUniform4uiv
-    nullptr, // glClearBufferiv
-    nullptr, // glClearBufferuiv
-    nullptr, // glClearBufferfv
-    nullptr, // glClearBufferfi
-    nullptr, // glGetStringi
-    nullptr, // glCopyBufferSubData
-    nullptr, // glGetUniformIndices
-    nullptr, // glGetActiveUniformsiv
-    nullptr, // glGetUniformBlockIndex
-    nullptr, // glGetActiveUniformBlockiv
-    nullptr, // glGetActiveUniformBlockName
-    nullptr, // glUniformBlockBinding
-    nullptr, // glDrawArraysInstanced
-    nullptr, // glDrawElementsInstanced
-    nullptr, // glFenceSync
-    nullptr, // glIsSync
-    nullptr, // glDeleteSync
-    nullptr, // glClientWaitSync
-    nullptr, // glWaitSync
-    nullptr, // glGetInteger64v
-    nullptr, // glGetSynciv
-    nullptr, // glGetInteger64i_v
-    nullptr, // glGetBufferParameteri64v
-    nullptr, // glGenSamplers
-    nullptr, // glDeleteSamplers
-    nullptr, // glIsSampler
-    nullptr, // glBindSampler
-    nullptr, // glSamplerParameteri
-    nullptr, // glSamplerParameteriv
-    nullptr, // glSamplerParameterf
-    nullptr, // glSamplerParameterfv
-    nullptr, // glGetSamplerParameteriv
-    nullptr, // glGetSamplerParameterfv
-    nullptr, // glVertexAttribDivisor
-    nullptr, // glBindTransformFeedback
-    nullptr, // glDeleteTransformFeedbacks
-    nullptr, // glGenTransformFeedbacks
-    nullptr, // glIsTransformFeedback
-    nullptr, // glPauseTransformFeedback
-    nullptr, // glResumeTransformFeedback
-    nullptr, // glGetProgramBinary
-    nullptr, // glProgramBinary
-    nullptr, // glProgramParameteri
-    nullptr, // glInvalidateFramebuffer
-    nullptr, // glInvalidateSubFramebuffer
-    nullptr, // glTexStorage2D
-    nullptr, // glTexStorage3D
-    nullptr, // glGetInternalformativ
+    nullptr,  // glReadBuffer
+    nullptr,  // glDrawRangeElements
+    nullptr,  // glTexImage3D
+    nullptr,  // glTexSubImage3D
+    nullptr,  // glCopyTexSubImage3D
+    nullptr,  // glCompressedTexImage3D
+    nullptr,  // glCompressedTexSubImage3D
+    nullptr,  // glGenQueries
+    nullptr,  // glDeleteQueries
+    nullptr,  // glIsQuery
+    nullptr,  // glBeginQuery
+    nullptr,  // glEndQuery
+    nullptr,  // glGetQueryiv
+    nullptr,  // glGetQueryObjectuiv
+    nullptr,  // glUnmapBuffer
+    nullptr,  // glGetBufferPointerv
+    nullptr,  // glDrawBuffers
+    nullptr,  // glUniformMatrix2x3fv
+    nullptr,  // glUniformMatrix3x2fv
+    nullptr,  // glUniformMatrix2x4fv
+    nullptr,  // glUniformMatrix4x2fv
+    nullptr,  // glUniformMatrix3x4fv
+    nullptr,  // glUniformMatrix4x3fv
+    nullptr,  // glBlitFramebuffer
+    nullptr,  // glRenderbufferStorageMultisample
+    nullptr,  // glFramebufferTextureLayer
+    nullptr,  // glMapBufferRange
+    nullptr,  // glFlushMappedBufferRange
+    nullptr,  // glBindVertexArray
+    nullptr,  // glDeleteVertexArrays
+    nullptr,  // glGenVertexArrays
+    nullptr,  // glIsVertexArray
+    nullptr,  // glGetIntegeri_v
+    nullptr,  // glBeginTransformFeedback
+    nullptr,  // glEndTransformFeedback
+    nullptr,  // glBindBufferRange
+    nullptr,  // glBindBufferBase
+    nullptr,  // glTransformFeedbackVaryings
+    nullptr,  // glGetTransformFeedbackVarying
+    nullptr,  // glVertexAttribIPointer
+    nullptr,  // glGetVertexAttribIiv
+    nullptr,  // glGetVertexAttribIuiv
+    nullptr,  // glVertexAttribI4i
+    nullptr,  // glVertexAttribI4ui
+    nullptr,  // glVertexAttribI4iv
+    nullptr,  // glVertexAttribI4uiv
+    nullptr,  // glGetUniformuiv
+    nullptr,  // glGetFragDataLocation
+    nullptr,  // glUniform1ui
+    nullptr,  // glUniform2ui
+    nullptr,  // glUniform3ui
+    nullptr,  // glUniform4ui
+    nullptr,  // glUniform1uiv
+    nullptr,  // glUniform2uiv
+    nullptr,  // glUniform3uiv
+    nullptr,  // glUniform4uiv
+    nullptr,  // glClearBufferiv
+    nullptr,  // glClearBufferuiv
+    nullptr,  // glClearBufferfv
+    nullptr,  // glClearBufferfi
+    nullptr,  // glGetStringi
+    nullptr,  // glCopyBufferSubData
+    nullptr,  // glGetUniformIndices
+    nullptr,  // glGetActiveUniformsiv
+    nullptr,  // glGetUniformBlockIndex
+    nullptr,  // glGetActiveUniformBlockiv
+    nullptr,  // glGetActiveUniformBlockName
+    nullptr,  // glUniformBlockBinding
+    nullptr,  // glDrawArraysInstanced
+    nullptr,  // glDrawElementsInstanced
+    nullptr,  // glFenceSync
+    nullptr,  // glIsSync
+    nullptr,  // glDeleteSync
+    nullptr,  // glClientWaitSync
+    nullptr,  // glWaitSync
+    nullptr,  // glGetInteger64v
+    nullptr,  // glGetSynciv
+    nullptr,  // glGetInteger64i_v
+    nullptr,  // glGetBufferParameteri64v
+    nullptr,  // glGenSamplers
+    nullptr,  // glDeleteSamplers
+    nullptr,  // glIsSampler
+    nullptr,  // glBindSampler
+    nullptr,  // glSamplerParameteri
+    nullptr,  // glSamplerParameteriv
+    nullptr,  // glSamplerParameterf
+    nullptr,  // glSamplerParameterfv
+    nullptr,  // glGetSamplerParameteriv
+    nullptr,  // glGetSamplerParameterfv
+    nullptr,  // glVertexAttribDivisor
+    nullptr,  // glBindTransformFeedback
+    nullptr,  // glDeleteTransformFeedbacks
+    nullptr,  // glGenTransformFeedbacks
+    nullptr,  // glIsTransformFeedback
+    nullptr,  // glPauseTransformFeedback
+    nullptr,  // glResumeTransformFeedback
+    nullptr,  // glGetProgramBinary
+    nullptr,  // glProgramBinary
+    nullptr,  // glProgramParameteri
+    nullptr,  // glInvalidateFramebuffer
+    nullptr,  // glInvalidateSubFramebuffer
+    nullptr,  // glTexStorage2D
+    nullptr,  // glTexStorage3D
+    nullptr,  // glGetInternalformativ
 };
 
 }  // namespace
diff --git a/starboard/sabi/arm/hardfp/sabi-v12.json b/starboard/sabi/arm/hardfp/sabi-v12.json
index 3aa03da..5e110d6 100644
--- a/starboard/sabi/arm/hardfp/sabi-v12.json
+++ b/starboard/sabi/arm/hardfp/sabi-v12.json
@@ -29,4 +29,3 @@
     "size_of_short":   2
   }
 }
-
diff --git a/starboard/sabi/arm/hardfp/sabi-v13.json b/starboard/sabi/arm/hardfp/sabi-v13.json
index c0a7a8a..1a36aba 100644
--- a/starboard/sabi/arm/hardfp/sabi-v13.json
+++ b/starboard/sabi/arm/hardfp/sabi-v13.json
@@ -29,4 +29,3 @@
     "size_of_short":   2
   }
 }
-
diff --git a/starboard/sabi/arm/softfp/sabi-v12.json b/starboard/sabi/arm/softfp/sabi-v12.json
index 68fbbd3..077c62e 100644
--- a/starboard/sabi/arm/softfp/sabi-v12.json
+++ b/starboard/sabi/arm/softfp/sabi-v12.json
@@ -29,4 +29,3 @@
     "size_of_short":   2
   }
 }
-
diff --git a/starboard/sabi/arm/softfp/sabi-v13.json b/starboard/sabi/arm/softfp/sabi-v13.json
index aa4735d..00a0b48 100644
--- a/starboard/sabi/arm/softfp/sabi-v13.json
+++ b/starboard/sabi/arm/softfp/sabi-v13.json
@@ -29,4 +29,3 @@
     "size_of_short":   2
   }
 }
-
diff --git a/starboard/sabi/arm64/sabi-v12.json b/starboard/sabi/arm64/sabi-v12.json
index 9f77065..e59ae59 100644
--- a/starboard/sabi/arm64/sabi-v12.json
+++ b/starboard/sabi/arm64/sabi-v12.json
@@ -29,4 +29,3 @@
     "size_of_short":   2
   }
 }
-
diff --git a/starboard/sabi/arm64/sabi-v13.json b/starboard/sabi/arm64/sabi-v13.json
index bcc7a70..bb1d643 100644
--- a/starboard/sabi/arm64/sabi-v13.json
+++ b/starboard/sabi/arm64/sabi-v13.json
@@ -29,4 +29,3 @@
     "size_of_short":   2
   }
 }
-
diff --git a/starboard/sabi/default/sabi.json b/starboard/sabi/default/sabi.json
index db0c403..c8edca9 100644
--- a/starboard/sabi/default/sabi.json
+++ b/starboard/sabi/default/sabi.json
@@ -1,4 +1,3 @@
 {
   "sabi_warning": "Including this file results in default values for the Starboard ABI."
 }
-
diff --git a/starboard/sabi/omaha_request.py b/starboard/sabi/omaha_request.py
index 8f35c28..c6930c1 100644
--- a/starboard/sabi/omaha_request.py
+++ b/starboard/sabi/omaha_request.py
@@ -167,7 +167,8 @@
       requests.post(
           _ENDPOINT_QA if args.qa else _ENDPOINT,
           data=json.dumps(_REQUEST),
-          headers=_HEADERS).text)
+          headers=_HEADERS,
+          timeout=60).text)
 
   return 0
 
diff --git a/starboard/sabi/x64/sysv/sabi-v12.json b/starboard/sabi/x64/sysv/sabi-v12.json
index b727171..5c59b50 100644
--- a/starboard/sabi/x64/sysv/sabi-v12.json
+++ b/starboard/sabi/x64/sysv/sabi-v12.json
@@ -29,4 +29,3 @@
     "size_of_short":   2
   }
 }
-
diff --git a/starboard/sabi/x64/sysv/sabi-v13.json b/starboard/sabi/x64/sysv/sabi-v13.json
index 171f997..736bee7 100644
--- a/starboard/sabi/x64/sysv/sabi-v13.json
+++ b/starboard/sabi/x64/sysv/sabi-v13.json
@@ -29,4 +29,3 @@
     "size_of_short":   2
   }
 }
-
diff --git a/starboard/sabi/x64/windows/sabi-v12.json b/starboard/sabi/x64/windows/sabi-v12.json
index 99b6acd..7a67694 100644
--- a/starboard/sabi/x64/windows/sabi-v12.json
+++ b/starboard/sabi/x64/windows/sabi-v12.json
@@ -29,4 +29,3 @@
     "size_of_short":   2
   }
 }
-
diff --git a/starboard/sabi/x64/windows/sabi-v13.json b/starboard/sabi/x64/windows/sabi-v13.json
index f6b0f98..90b7eea 100644
--- a/starboard/sabi/x64/windows/sabi-v13.json
+++ b/starboard/sabi/x64/windows/sabi-v13.json
@@ -29,4 +29,3 @@
     "size_of_short":   2
   }
 }
-
diff --git a/starboard/sabi/x86/sabi-v12.json b/starboard/sabi/x86/sabi-v12.json
index 790626f..9d79f50 100644
--- a/starboard/sabi/x86/sabi-v12.json
+++ b/starboard/sabi/x86/sabi-v12.json
@@ -29,4 +29,3 @@
     "size_of_short":   2
   }
 }
-
diff --git a/starboard/sabi/x86/sabi-v13.json b/starboard/sabi/x86/sabi-v13.json
index d50a396..26c493b 100644
--- a/starboard/sabi/x86/sabi-v13.json
+++ b/starboard/sabi/x86/sabi-v13.json
@@ -29,4 +29,3 @@
     "size_of_short":   2
   }
 }
-
diff --git a/starboard/shared/README.md b/starboard/shared/README.md
index 79f265c..fd026fa 100644
--- a/starboard/shared/README.md
+++ b/starboard/shared/README.md
@@ -27,4 +27,3 @@
  * `shared/starboard/` - Implementations of Starboard API functions that only
    rely on other Starboard API functions. Code in here should be reusable on any
    platform that implements the needed APIs.
-
diff --git a/starboard/shared/alsa/alsa_util.cc b/starboard/shared/alsa/alsa_util.cc
index 8413a6d..e1084cc 100644
--- a/starboard/shared/alsa/alsa_util.cc
+++ b/starboard/shared/alsa/alsa_util.cc
@@ -18,15 +18,14 @@
 
 #include "starboard/common/log.h"
 
-#define ALSA_CHECK(error, alsa_function, failure_return)      \
-  do {                                                        \
-    if (error < 0) {                                          \
-      SB_LOG(ERROR) << __FUNCTION__ << ": " << #alsa_function \
-                    << "() failed with error "                \
-                    << snd_strerror(error)                    \
-                    << " (" << error << ")";                  \
-      return (failure_return);                                \
-    }                                                         \
+#define ALSA_CHECK(error, alsa_function, failure_return)                      \
+  do {                                                                        \
+    if (error < 0) {                                                          \
+      SB_LOG(ERROR) << __FUNCTION__ << ": " << #alsa_function                 \
+                    << "() failed with error " << snd_strerror(error) << " (" \
+                    << error << ")";                                          \
+      return (failure_return);                                                \
+    }                                                                         \
   } while (false)
 
 #if defined(ADDRESS_SANITIZER)
diff --git a/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc b/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc
index 17937fa..4cf444b 100644
--- a/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc
+++ b/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc
@@ -20,6 +20,7 @@
 #include "starboard/audio_sink.h"
 #include "starboard/common/log.h"
 #include "starboard/common/string.h"
+#include "starboard/media.h"
 #include "starboard/memory.h"
 #include "starboard/shared/starboard/media/media_util.h"
 
@@ -36,7 +37,10 @@
   return kSbMediaAudioSampleTypeInt16Deprecated;
 }
 
-AVCodecID GetFfmpegCodecIdByMediaCodec(SbMediaAudioCodec audio_codec) {
+AVCodecID GetFfmpegCodecIdByMediaCodec(
+    starboard::media::AudioStreamInfo stream_info) {
+  SbMediaAudioCodec audio_codec = stream_info.codec;
+
   switch (audio_codec) {
     case kSbMediaAudioCodecAac:
       return AV_CODEC_ID_AAC;
@@ -57,6 +61,24 @@
 #if SB_API_VERSION >= 14
     case kSbMediaAudioCodecMp3:
       return AV_CODEC_ID_MP3;
+    case kSbMediaAudioCodecPcm:
+      if (stream_info.bits_per_sample == 16) {
+        return AV_CODEC_ID_PCM_S16LE;
+      } else {
+        SB_LOG(ERROR) << "PCM is only supported for 16-bit audio ("
+                      << stream_info.bits_per_sample
+                      << " bits per sample was requested)";
+        return AV_CODEC_ID_NONE;
+      }
+    case kSbMediaAudioCodecFlac:
+      if (stream_info.bits_per_sample == 16) {
+        return AV_CODEC_ID_FLAC;
+      } else {
+        SB_LOG(ERROR) << "FLAC is only supported for 16-bit audio ("
+                      << stream_info.bits_per_sample
+                      << " bits per sample was requested)";
+        return AV_CODEC_ID_NONE;
+      }
 #endif  // SB_API_VERSION >= 14
     default:
       return AV_CODEC_ID_NONE;
@@ -78,7 +100,7 @@
       stream_ended_(false),
       audio_stream_info_(audio_stream_info) {
   SB_DCHECK(g_registered) << "Decoder Specialization registration failed.";
-  SB_DCHECK(GetFfmpegCodecIdByMediaCodec(audio_stream_info_.codec) !=
+  SB_DCHECK(GetFfmpegCodecIdByMediaCodec(audio_stream_info_) !=
             AV_CODEC_ID_NONE)
       << "Unsupported audio codec " << audio_stream_info_.codec;
   ffmpeg_ = FFMPEGDispatch::GetInstance();
@@ -277,10 +299,16 @@
   }
 
   codec_context_->codec_type = AVMEDIA_TYPE_AUDIO;
-  codec_context_->codec_id =
-      GetFfmpegCodecIdByMediaCodec(audio_stream_info_.codec);
+  codec_context_->codec_id = GetFfmpegCodecIdByMediaCodec(audio_stream_info_);
   // Request_sample_fmt is set by us, but sample_fmt is set by the decoder.
-  if (GetSupportedSampleType() == kSbMediaAudioSampleTypeInt16Deprecated) {
+  if (GetSupportedSampleType() == kSbMediaAudioSampleTypeInt16Deprecated
+#if SB_API_VERSION >= 14
+      // If we request FLT for 16-bit FLAC, FFmpeg will pick S32 as the closest
+      // option. Since the rest of this pipeline doesn't support S32, we should
+      // use S16 as the desired format.
+      || audio_stream_info_.codec == kSbMediaAudioCodecFlac
+#endif  // SB_API_VERSION >= 14
+  ) {
     codec_context_->request_sample_fmt = AV_SAMPLE_FMT_S16;
   } else {
     codec_context_->request_sample_fmt = AV_SAMPLE_FMT_FLT;
diff --git a/starboard/shared/ffmpeg/ffmpeg_audio_decoder_test.cc b/starboard/shared/ffmpeg/ffmpeg_audio_decoder_test.cc
new file mode 100644
index 0000000..c009bb4
--- /dev/null
+++ b/starboard/shared/ffmpeg/ffmpeg_audio_decoder_test.cc
@@ -0,0 +1,84 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/ffmpeg/ffmpeg_audio_decoder.h"
+
+#include <memory>
+
+#include "starboard/media.h"
+#include "starboard/shared/starboard/media/media_util.h"
+#include "starboard/shared/starboard/player/job_queue.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace starboard {
+namespace shared {
+namespace ffmpeg {
+namespace {
+
+// The codecs tested by these tests were introduced in SB_API_VERSION 14.
+#if SB_API_VERSION >= 14
+using ::starboard::shared::starboard::media::AudioStreamInfo;
+using ::testing::NotNull;
+
+AudioStreamInfo CreateStreamInfoForCodec(SbMediaAudioCodec codec) {
+  AudioStreamInfo stream_info;
+  stream_info.codec = codec;
+  stream_info.number_of_channels = 2;
+  stream_info.samples_per_second = 44100;
+  stream_info.bits_per_sample = 8;
+  return stream_info;
+}
+
+class FFmpegAudioDecoderTest
+    : public ::testing::Test,
+      public ::starboard::shared::starboard::player::JobQueue::JobOwner {
+ protected:
+  FFmpegAudioDecoderTest() : JobOwner(kDetached) { AttachToCurrentThread(); }
+
+  ~FFmpegAudioDecoderTest() override = default;
+
+  // Create a JobQueue for use on the current thread.
+  ::starboard::shared::starboard::player::JobQueue job_queue_;
+};
+
+TEST_F(FFmpegAudioDecoderTest, SupportsMp3Codec) {
+  AudioStreamInfo stream_info = CreateStreamInfoForCodec(kSbMediaAudioCodecMp3);
+  std::unique_ptr<AudioDecoder> decoder(AudioDecoder::Create(stream_info));
+  ASSERT_THAT(decoder, NotNull());
+  EXPECT_TRUE(decoder->is_valid());
+}
+
+TEST_F(FFmpegAudioDecoderTest, SupportsFlacCodecFor16BitAudio) {
+  AudioStreamInfo stream_info =
+      CreateStreamInfoForCodec(kSbMediaAudioCodecFlac);
+  stream_info.bits_per_sample = 16;
+  std::unique_ptr<AudioDecoder> decoder(AudioDecoder::Create(stream_info));
+  ASSERT_THAT(decoder, NotNull());
+  EXPECT_TRUE(decoder->is_valid());
+}
+
+TEST_F(FFmpegAudioDecoderTest, SupportsPcmCodecFor16BitAudio) {
+  AudioStreamInfo stream_info = CreateStreamInfoForCodec(kSbMediaAudioCodecPcm);
+  stream_info.bits_per_sample = 16;
+  std::unique_ptr<AudioDecoder> decoder(AudioDecoder::Create(stream_info));
+  ASSERT_THAT(decoder, NotNull());
+  EXPECT_TRUE(decoder->is_valid());
+}
+#endif  // SB_API_VERSION >= 14
+
+}  // namespace
+}  // namespace ffmpeg
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/gcc/atomic_gcc_public.h b/starboard/shared/gcc/atomic_gcc_public.h
index bf1eded..a6c520e 100644
--- a/starboard/shared/gcc/atomic_gcc_public.h
+++ b/starboard/shared/gcc/atomic_gcc_public.h
@@ -41,8 +41,7 @@
 }
 
 static SB_C_FORCE_INLINE SbAtomic32
-SbAtomicBarrier_Increment(volatile SbAtomic32* ptr,
-                          SbAtomic32 increment) {
+SbAtomicBarrier_Increment(volatile SbAtomic32* ptr, SbAtomic32 increment) {
   return increment + __atomic_fetch_add(ptr, increment, __ATOMIC_SEQ_CST);
 }
 
@@ -103,16 +102,16 @@
 // 8-bit atomic operations.
 static SB_C_FORCE_INLINE SbAtomic8
 SbAtomicRelease_CompareAndSwap8(volatile SbAtomic8* ptr,
-                               SbAtomic8 old_value,
-                               SbAtomic8 new_value) {
+                                SbAtomic8 old_value,
+                                SbAtomic8 new_value) {
   bool result = __atomic_compare_exchange_n(ptr, &old_value, new_value, false,
-                              __ATOMIC_RELEASE, __ATOMIC_RELAXED);
+                                            __ATOMIC_RELEASE, __ATOMIC_RELAXED);
   SB_UNREFERENCED_PARAMETER(result);  // Make gcc compiler happy.
   return old_value;
 }
 
-static SB_C_FORCE_INLINE void
-SbAtomicNoBarrier_Store8(volatile SbAtomic8* ptr, SbAtomic8 value) {
+static SB_C_FORCE_INLINE void SbAtomicNoBarrier_Store8(volatile SbAtomic8* ptr,
+                                                       SbAtomic8 value) {
   __atomic_store_n(ptr, value, __ATOMIC_RELAXED);
 }
 
@@ -165,9 +164,9 @@
   return old_value;
 }
 
-static SB_C_FORCE_INLINE void
-SbAtomicNoBarrier_Store64(volatile SbAtomic64* ptr,
-                          SbAtomic64 value) {
+static SB_C_FORCE_INLINE void SbAtomicNoBarrier_Store64(
+    volatile SbAtomic64* ptr,
+    SbAtomic64 value) {
   __atomic_store_n(ptr, value, __ATOMIC_RELAXED);
 }
 
diff --git a/starboard/shared/gles/system_gles2.cc b/starboard/shared/gles/system_gles2.cc
index a0ccae9..8e0f947 100644
--- a/starboard/shared/gles/system_gles2.cc
+++ b/starboard/shared/gles/system_gles2.cc
@@ -162,110 +162,110 @@
     &glVertexAttrib4fv,
     &glVertexAttribPointer,
     &glViewport,
-    nullptr, // glReadBuffer
-    nullptr, // glDrawRangeElements
-    nullptr, // glTexImage3D
-    nullptr, // glTexSubImage3D
-    nullptr, // glCopyTexSubImage3D
-    nullptr, // glCompressedTexImage3D
-    nullptr, // glCompressedTexSubImage3D
-    nullptr, // glGenQueries
-    nullptr, // glDeleteQueries
-    nullptr, // glIsQuery
-    nullptr, // glBeginQuery
-    nullptr, // glEndQuery
-    nullptr, // glGetQueryiv
-    nullptr, // glGetQueryObjectuiv
-    nullptr, // glUnmapBuffer
-    nullptr, // glGetBufferPointerv
-    nullptr, // glDrawBuffers
-    nullptr, // glUniformMatrix2x3fv
-    nullptr, // glUniformMatrix3x2fv
-    nullptr, // glUniformMatrix2x4fv
-    nullptr, // glUniformMatrix4x2fv
-    nullptr, // glUniformMatrix3x4fv
-    nullptr, // glUniformMatrix4x3fv
-    nullptr, // glBlitFramebuffer
-    nullptr, // glRenderbufferStorageMultisample
-    nullptr, // glFramebufferTextureLayer
-    nullptr, // glMapBufferRange
-    nullptr, // glFlushMappedBufferRange
-    nullptr, // glBindVertexArray
-    nullptr, // glDeleteVertexArrays
-    nullptr, // glGenVertexArrays
-    nullptr, // glIsVertexArray
-    nullptr, // glGetIntegeri_v
-    nullptr, // glBeginTransformFeedback
-    nullptr, // glEndTransformFeedback
-    nullptr, // glBindBufferRange
-    nullptr, // glBindBufferBase
-    nullptr, // glTransformFeedbackVaryings
-    nullptr, // glGetTransformFeedbackVarying
-    nullptr, // glVertexAttribIPointer
-    nullptr, // glGetVertexAttribIiv
-    nullptr, // glGetVertexAttribIuiv
-    nullptr, // glVertexAttribI4i
-    nullptr, // glVertexAttribI4ui
-    nullptr, // glVertexAttribI4iv
-    nullptr, // glVertexAttribI4uiv
-    nullptr, // glGetUniformuiv
-    nullptr, // glGetFragDataLocation
-    nullptr, // glUniform1ui
-    nullptr, // glUniform2ui
-    nullptr, // glUniform3ui
-    nullptr, // glUniform4ui
-    nullptr, // glUniform1uiv
-    nullptr, // glUniform2uiv
-    nullptr, // glUniform3uiv
-    nullptr, // glUniform4uiv
-    nullptr, // glClearBufferiv
-    nullptr, // glClearBufferuiv
-    nullptr, // glClearBufferfv
-    nullptr, // glClearBufferfi
-    nullptr, // glGetStringi
-    nullptr, // glCopyBufferSubData
-    nullptr, // glGetUniformIndices
-    nullptr, // glGetActiveUniformsiv
-    nullptr, // glGetUniformBlockIndex
-    nullptr, // glGetActiveUniformBlockiv
-    nullptr, // glGetActiveUniformBlockName
-    nullptr, // glUniformBlockBinding
-    nullptr, // glDrawArraysInstanced
-    nullptr, // glDrawElementsInstanced
-    nullptr, // glFenceSync
-    nullptr, // glIsSync
-    nullptr, // glDeleteSync
-    nullptr, // glClientWaitSync
-    nullptr, // glWaitSync
-    nullptr, // glGetInteger64v
-    nullptr, // glGetSynciv
-    nullptr, // glGetInteger64i_v
-    nullptr, // glGetBufferParameteri64v
-    nullptr, // glGenSamplers
-    nullptr, // glDeleteSamplers
-    nullptr, // glIsSampler
-    nullptr, // glBindSampler
-    nullptr, // glSamplerParameteri
-    nullptr, // glSamplerParameteriv
-    nullptr, // glSamplerParameterf
-    nullptr, // glSamplerParameterfv
-    nullptr, // glGetSamplerParameteriv
-    nullptr, // glGetSamplerParameterfv
-    nullptr, // glVertexAttribDivisor
-    nullptr, // glBindTransformFeedback
-    nullptr, // glDeleteTransformFeedbacks
-    nullptr, // glGenTransformFeedbacks
-    nullptr, // glIsTransformFeedback
-    nullptr, // glPauseTransformFeedback
-    nullptr, // glResumeTransformFeedback
-    nullptr, // glGetProgramBinary
-    nullptr, // glProgramBinary
-    nullptr, // glProgramParameteri
-    nullptr, // glInvalidateFramebuffer
-    nullptr, // glInvalidateSubFramebuffer
-    nullptr, // glTexStorage2D
-    nullptr, // glTexStorage3D
-    nullptr, // glGetInternalformativ
+    nullptr,  // glReadBuffer
+    nullptr,  // glDrawRangeElements
+    nullptr,  // glTexImage3D
+    nullptr,  // glTexSubImage3D
+    nullptr,  // glCopyTexSubImage3D
+    nullptr,  // glCompressedTexImage3D
+    nullptr,  // glCompressedTexSubImage3D
+    nullptr,  // glGenQueries
+    nullptr,  // glDeleteQueries
+    nullptr,  // glIsQuery
+    nullptr,  // glBeginQuery
+    nullptr,  // glEndQuery
+    nullptr,  // glGetQueryiv
+    nullptr,  // glGetQueryObjectuiv
+    nullptr,  // glUnmapBuffer
+    nullptr,  // glGetBufferPointerv
+    nullptr,  // glDrawBuffers
+    nullptr,  // glUniformMatrix2x3fv
+    nullptr,  // glUniformMatrix3x2fv
+    nullptr,  // glUniformMatrix2x4fv
+    nullptr,  // glUniformMatrix4x2fv
+    nullptr,  // glUniformMatrix3x4fv
+    nullptr,  // glUniformMatrix4x3fv
+    nullptr,  // glBlitFramebuffer
+    nullptr,  // glRenderbufferStorageMultisample
+    nullptr,  // glFramebufferTextureLayer
+    nullptr,  // glMapBufferRange
+    nullptr,  // glFlushMappedBufferRange
+    nullptr,  // glBindVertexArray
+    nullptr,  // glDeleteVertexArrays
+    nullptr,  // glGenVertexArrays
+    nullptr,  // glIsVertexArray
+    nullptr,  // glGetIntegeri_v
+    nullptr,  // glBeginTransformFeedback
+    nullptr,  // glEndTransformFeedback
+    nullptr,  // glBindBufferRange
+    nullptr,  // glBindBufferBase
+    nullptr,  // glTransformFeedbackVaryings
+    nullptr,  // glGetTransformFeedbackVarying
+    nullptr,  // glVertexAttribIPointer
+    nullptr,  // glGetVertexAttribIiv
+    nullptr,  // glGetVertexAttribIuiv
+    nullptr,  // glVertexAttribI4i
+    nullptr,  // glVertexAttribI4ui
+    nullptr,  // glVertexAttribI4iv
+    nullptr,  // glVertexAttribI4uiv
+    nullptr,  // glGetUniformuiv
+    nullptr,  // glGetFragDataLocation
+    nullptr,  // glUniform1ui
+    nullptr,  // glUniform2ui
+    nullptr,  // glUniform3ui
+    nullptr,  // glUniform4ui
+    nullptr,  // glUniform1uiv
+    nullptr,  // glUniform2uiv
+    nullptr,  // glUniform3uiv
+    nullptr,  // glUniform4uiv
+    nullptr,  // glClearBufferiv
+    nullptr,  // glClearBufferuiv
+    nullptr,  // glClearBufferfv
+    nullptr,  // glClearBufferfi
+    nullptr,  // glGetStringi
+    nullptr,  // glCopyBufferSubData
+    nullptr,  // glGetUniformIndices
+    nullptr,  // glGetActiveUniformsiv
+    nullptr,  // glGetUniformBlockIndex
+    nullptr,  // glGetActiveUniformBlockiv
+    nullptr,  // glGetActiveUniformBlockName
+    nullptr,  // glUniformBlockBinding
+    nullptr,  // glDrawArraysInstanced
+    nullptr,  // glDrawElementsInstanced
+    nullptr,  // glFenceSync
+    nullptr,  // glIsSync
+    nullptr,  // glDeleteSync
+    nullptr,  // glClientWaitSync
+    nullptr,  // glWaitSync
+    nullptr,  // glGetInteger64v
+    nullptr,  // glGetSynciv
+    nullptr,  // glGetInteger64i_v
+    nullptr,  // glGetBufferParameteri64v
+    nullptr,  // glGenSamplers
+    nullptr,  // glDeleteSamplers
+    nullptr,  // glIsSampler
+    nullptr,  // glBindSampler
+    nullptr,  // glSamplerParameteri
+    nullptr,  // glSamplerParameteriv
+    nullptr,  // glSamplerParameterf
+    nullptr,  // glSamplerParameterfv
+    nullptr,  // glGetSamplerParameteriv
+    nullptr,  // glGetSamplerParameterfv
+    nullptr,  // glVertexAttribDivisor
+    nullptr,  // glBindTransformFeedback
+    nullptr,  // glDeleteTransformFeedbacks
+    nullptr,  // glGenTransformFeedbacks
+    nullptr,  // glIsTransformFeedback
+    nullptr,  // glPauseTransformFeedback
+    nullptr,  // glResumeTransformFeedback
+    nullptr,  // glGetProgramBinary
+    nullptr,  // glProgramBinary
+    nullptr,  // glProgramParameteri
+    nullptr,  // glInvalidateFramebuffer
+    nullptr,  // glInvalidateSubFramebuffer
+    nullptr,  // glTexStorage2D
+    nullptr,  // glTexStorage3D
+    nullptr,  // glGetInternalformativ
 };
 
 }  // namespace
diff --git a/starboard/shared/iso/impl/directory_impl.h b/starboard/shared/iso/impl/directory_impl.h
index 82fbced..883f29c 100644
--- a/starboard/shared/iso/impl/directory_impl.h
+++ b/starboard/shared/iso/impl/directory_impl.h
@@ -22,7 +22,7 @@
 
 // Ensure SbDirectory is typedef'd to a SbDirectoryPrivate* that has a directory
 // field.
-SB_COMPILE_ASSERT(sizeof(((SbDirectory)0)->directory), \
+SB_COMPILE_ASSERT(sizeof(((SbDirectory)0)->directory),
                   SbDirectoryPrivate_must_have_directory);
 
 #endif  // STARBOARD_SHARED_ISO_IMPL_DIRECTORY_IMPL_H_
diff --git a/starboard/shared/linux/byte_swap.cc b/starboard/shared/linux/byte_swap.cc
index 58f1950..3661c77 100644
--- a/starboard/shared/linux/byte_swap.cc
+++ b/starboard/shared/linux/byte_swap.cc
@@ -15,18 +15,34 @@
 // Not breaking these functions up because however one is implemented, the
 // others should be implemented similarly.
 
+#if SB_API_VERSION < 16
+
 #include "starboard/common/byte_swap.h"
 
 #include <byteswap.h>
 
-int16_t SbByteSwapS16(int16_t value) { return bswap_16(value); }
+int16_t SbByteSwapS16(int16_t value) {
+  return bswap_16(value);
+}
 
-uint16_t SbByteSwapU16(uint16_t value) { return bswap_16(value); }
+uint16_t SbByteSwapU16(uint16_t value) {
+  return bswap_16(value);
+}
 
-int32_t SbByteSwapS32(int32_t value) { return bswap_32(value); }
+int32_t SbByteSwapS32(int32_t value) {
+  return bswap_32(value);
+}
 
-uint32_t SbByteSwapU32(uint32_t value) { return bswap_32(value); }
+uint32_t SbByteSwapU32(uint32_t value) {
+  return bswap_32(value);
+}
 
-int64_t SbByteSwapS64(int64_t value) { return bswap_64(value); }
+int64_t SbByteSwapS64(int64_t value) {
+  return bswap_64(value);
+}
 
-uint64_t SbByteSwapU64(uint64_t value) { return bswap_64(value); }
+uint64_t SbByteSwapU64(uint64_t value) {
+  return bswap_64(value);
+}
+
+#endif
diff --git a/starboard/shared/linux/cpu_features_get.cc b/starboard/shared/linux/cpu_features_get.cc
index d7466cc..4dd4a4b 100644
--- a/starboard/shared/linux/cpu_features_get.cc
+++ b/starboard/shared/linux/cpu_features_get.cc
@@ -117,9 +117,9 @@
 
 #endif  // SB_IS(ARCH_ARM) || SB_IS(ARCH_ARM64)
 
-using starboard::shared::SetX86FeaturesInvalid;
 using starboard::shared::SetArmFeaturesInvalid;
 using starboard::shared::SetGeneralFeaturesInvalid;
+using starboard::shared::SetX86FeaturesInvalid;
 
 // Class that holds the information in system file /proc/cpuinfo.
 class ProcCpuInfo {
diff --git a/starboard/shared/linux/get_home_directory.cc b/starboard/shared/linux/get_home_directory.cc
index cbfe95d..b4b123c 100644
--- a/starboard/shared/linux/get_home_directory.cc
+++ b/starboard/shared/linux/get_home_directory.cc
@@ -46,8 +46,8 @@
   int result =
       getpwuid_r(getuid(), &passwd, buffer.data(), kBufferSize, &pw_result);
   if (result != 0) {
-    SB_DLOG(ERROR) << "getpwuid_r failed for uid " << getuid() << ": result = "
-                   << result;
+    SB_DLOG(ERROR) << "getpwuid_r failed for uid " << getuid()
+                   << ": result = " << result;
     return false;
   }
 
diff --git a/starboard/shared/linux/singleton.h b/starboard/shared/linux/singleton.h
index 7e6fcea..cc1318b 100644
--- a/starboard/shared/linux/singleton.h
+++ b/starboard/shared/linux/singleton.h
@@ -17,8 +17,8 @@
 // Onces represent initializations that should only ever happen once per
 // process, in a thread-safe way.
 
-#ifndef STARBOARD_NXSWITCH_SINGLETON_H_
-#define STARBOARD_NXSWITCH_SINGLETON_H_
+#ifndef STARBOARD_SHARED_LINUX_SINGLETON_H_
+#define STARBOARD_SHARED_LINUX_SINGLETON_H_
 
 #include "starboard/once.h"
 #include "starboard/shared/internal_only.h"
@@ -63,4 +63,4 @@
 
 }  // namespace starboard
 
-#endif  // STARBOARD_NXSWITCH_SINGLETON_H_
+#endif  // STARBOARD_SHARED_LINUX_SINGLETON_H_
diff --git a/starboard/shared/linux/socket_get_interface_address.cc b/starboard/shared/linux/socket_get_interface_address.cc
index 3ff1c1c..fbc82d0 100644
--- a/starboard/shared/linux/socket_get_interface_address.cc
+++ b/starboard/shared/linux/socket_get_interface_address.cc
@@ -70,7 +70,7 @@
 
 template <typename T, int source_size>
 void CopyIntoObjectFromArray(T* out_destination,
-                             const unsigned char(&source)[source_size]) {
+                             const unsigned char (&source)[source_size]) {
   SB_COMPILE_ASSERT(sizeof(T) <= source_size, destination_is_too_small);
   memcpy(out_destination, source, sizeof(T));
 }
@@ -128,8 +128,7 @@
     if (!GetPotentialMatch(interface->ifa_addr, &potential_match))
       continue;
 
-    if (memcmp(&to_match, potential_match, sizeof(in_addr_type)) !=
-        0) {
+    if (memcmp(&to_match, potential_match, sizeof(in_addr_type)) != 0) {
       continue;
     }
 
diff --git a/starboard/shared/linux/system_get_used_cpu_memory.cc b/starboard/shared/linux/system_get_used_cpu_memory.cc
index 210c390..a34ab65 100644
--- a/starboard/shared/linux/system_get_used_cpu_memory.cc
+++ b/starboard/shared/linux/system_get_used_cpu_memory.cc
@@ -43,8 +43,7 @@
 // Searches for a specific value we're interested in and return it.  Will
 // modify |buffer| in order to do so quickly and easily.  Returns the memory
 // value in bytes (not kilobytes as it is presented in /proc/self/status).
-int64_t SearchForMemoryValue(
-    const char* search_key, const char* buffer) {
+int64_t SearchForMemoryValue(const char* search_key, const char* buffer) {
   const char* found = strstr(buffer, search_key);
   if (!found) {
     SB_LOG(ERROR) << "Could not find '" << search_key << "' in "
diff --git a/starboard/shared/linux/system_symbolize.cc b/starboard/shared/linux/system_symbolize.cc
index 1f2dc20..698b67d 100644
--- a/starboard/shared/linux/system_symbolize.cc
+++ b/starboard/shared/linux/system_symbolize.cc
@@ -17,7 +17,7 @@
 
 #include "starboard/system.h"
 
-#include "base/third_party/symbolize/symbolize.h"
+#include "third_party/symbolize/symbolize.h"
 
 bool SbSystemSymbolize(const void* address, char* out_buffer, int buffer_size) {
   if (address == nullptr || *reinterpret_cast<const uintptr_t*>(address) == 0)
diff --git a/starboard/shared/nouser/user_internal.cc b/starboard/shared/nouser/user_internal.cc
index b4d06a3..7a8f59b 100644
--- a/starboard/shared/nouser/user_internal.cc
+++ b/starboard/shared/nouser/user_internal.cc
@@ -21,7 +21,8 @@
 namespace nouser {
 // The one instance of the signed-in user.
 SbUserPrivate g_user = {
-    "user", "user",
+    "user",
+    "user",
 };
 }  // namespace nouser
 }  // namespace shared
diff --git a/starboard/shared/posix/file_open.cc b/starboard/shared/posix/file_open.cc
index 9d9be35..b8d76cf 100644
--- a/starboard/shared/posix/file_open.cc
+++ b/starboard/shared/posix/file_open.cc
@@ -20,6 +20,6 @@
                   int flags,
                   bool* out_created,
                   SbFileError* out_error) {
-  return ::starboard::shared::posix::impl::FileOpen(
-      path, flags, out_created, out_error);
+  return ::starboard::shared::posix::impl::FileOpen(path, flags, out_created,
+                                                    out_error);
 }
diff --git a/starboard/shared/posix/impl/file_impl.h b/starboard/shared/posix/impl/file_impl.h
index 09ede65..43fb61c 100644
--- a/starboard/shared/posix/impl/file_impl.h
+++ b/starboard/shared/posix/impl/file_impl.h
@@ -23,7 +23,7 @@
 #include "starboard/shared/internal_only.h"
 
 // Ensure SbFile is typedef'd to a SbFilePrivate* that has a descriptor field.
-SB_COMPILE_ASSERT(sizeof(((SbFile)0)->descriptor), \
+SB_COMPILE_ASSERT(sizeof(((SbFile)0)->descriptor),
                   SbFilePrivate_must_have_descriptor);
 
 #endif  // STARBOARD_SHARED_POSIX_IMPL_FILE_IMPL_H_
diff --git a/starboard/shared/posix/memory_flush.cc b/starboard/shared/posix/memory_flush.cc
index 61c1b70..d1bee96 100644
--- a/starboard/shared/posix/memory_flush.cc
+++ b/starboard/shared/posix/memory_flush.cc
@@ -21,7 +21,8 @@
 #include "starboard/common/log.h"
 
 #if !SB_CAN(MAP_EXECUTABLE_MEMORY)
-#error "You shouldn't implement SbMemoryFlush unless you can map " \
+#error \
+    "You shouldn't implement SbMemoryFlush unless you can map " \
        "memory pages as executable"
 #endif
 
diff --git a/starboard/shared/posix/memory_map.cc b/starboard/shared/posix/memory_map.cc
index 41b2d5c..04c51c3 100644
--- a/starboard/shared/posix/memory_map.cc
+++ b/starboard/shared/posix/memory_map.cc
@@ -14,10 +14,8 @@
 
 #include "starboard/memory.h"
 #include "starboard/shared/posix/page_internal.h"
-#include "starboard/shared/starboard/memory_reporter_internal.h"
 
 void* SbMemoryMap(int64_t size_bytes, int flags, const char* name) {
   void* memory = SbPageMap(size_bytes, flags, name);
-  SbMemoryReporterReportMappedMemory(memory, size_bytes);
   return memory;
 }
diff --git a/starboard/shared/posix/memory_unmap.cc b/starboard/shared/posix/memory_unmap.cc
index 93d2db9..96592df 100644
--- a/starboard/shared/posix/memory_unmap.cc
+++ b/starboard/shared/posix/memory_unmap.cc
@@ -14,9 +14,7 @@
 
 #include "starboard/memory.h"
 #include "starboard/shared/posix/page_internal.h"
-#include "starboard/shared/starboard/memory_reporter_internal.h"
 
 bool SbMemoryUnmap(void* virtual_address, int64_t size_bytes) {
-  SbMemoryReporterReportUnmappedMemory(virtual_address, size_bytes);
   return SbPageUnmap(virtual_address, size_bytes);
 }
diff --git a/starboard/shared/posix/socket_resolve.cc b/starboard/shared/posix/socket_resolve.cc
index 1973772..283aee9 100644
--- a/starboard/shared/posix/socket_resolve.cc
+++ b/starboard/shared/posix/socket_resolve.cc
@@ -34,7 +34,7 @@
       hints.ai_family = AF_INET;
     }
   } else if (filters & kSbSocketResolveFilterIpv6) {
-      hints.ai_family = AF_INET6;
+    hints.ai_family = AF_INET6;
   } else {
     hints.ai_family = AF_UNSPEC;
   }
@@ -60,7 +60,7 @@
   bool* parsed = new bool[address_count];
   int index = 0;
   int skip = 0;
-  for (const struct addrinfo *i = ai; i != NULL; i = i->ai_next, ++index) {
+  for (const struct addrinfo* i = ai; i != NULL; i = i->ai_next, ++index) {
     // Skip over any addresses we can't parse.
     parsed[index] = sock_addrs[index].FromSockaddr(i->ai_addr);
     if (!parsed[index]) {
diff --git a/starboard/shared/posix/system_get_error_string.cc b/starboard/shared/posix/system_get_error_string.cc
index ff690c4..45005ef 100644
--- a/starboard/shared/posix/system_get_error_string.cc
+++ b/starboard/shared/posix/system_get_error_string.cc
@@ -12,22 +12,21 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/system.h"
-
-#include <iostream>
-
 #include <errno.h>
 #include <string.h>
 
+#include <iostream>
+
 #include "starboard/common/string.h"
 #include "starboard/configuration.h"
+#include "starboard/system.h"
 
 int SbSystemGetErrorString(SbSystemError error,
                            char* out_string,
                            int string_length) {
   char buffer[256];
 
-#if defined(__GLIBC__)
+#if defined(__GLIBC__) || defined(_GNU_SOURCE)
   char* result = strerror_r(error, buffer, SB_ARRAY_SIZE(buffer));
 #else
   char* result = buffer;
diff --git a/starboard/shared/posix/system_get_locale_id.cc b/starboard/shared/posix/system_get_locale_id.cc
index 1eac1f2..839d3f0 100644
--- a/starboard/shared/posix/system_get_locale_id.cc
+++ b/starboard/shared/posix/system_get_locale_id.cc
@@ -24,7 +24,7 @@
   return !((posix_id == NULL) || (strncmp("C", posix_id, 1) == 0) ||
            (strncmp("POSIX", posix_id, 5) == 0));
 }
-}
+}  // namespace
 
 const char* SbSystemGetLocaleId() {
   // Adapted from ICU's putil.c:uprv_getPOSIXIDForCategory.
diff --git a/starboard/shared/pthread/condition_variable_create.cc b/starboard/shared/pthread/condition_variable_create.cc
index f5731ea..0dd49cb 100644
--- a/starboard/shared/pthread/condition_variable_create.cc
+++ b/starboard/shared/pthread/condition_variable_create.cc
@@ -63,8 +63,8 @@
   // Always use CLOCK_MONOTONIC so that SbConditionVariableWaitTimed() will
   // not be based off of the system clock (which can lead to erroneous
   // behavior if the system clock is changed while a process is running).
-  if (!IsSuccess(pthread_condattr_setclock(
-           attributes.attributes(), CLOCK_MONOTONIC))) {
+  if (!IsSuccess(pthread_condattr_setclock(attributes.attributes(),
+                                           CLOCK_MONOTONIC))) {
     SB_DLOG(ERROR) << "Failed to call pthread_condattr_setclock().";
     return false;
   }
diff --git a/starboard/shared/pthread/condition_variable_wait_timed.cc b/starboard/shared/pthread/condition_variable_wait_timed.cc
index d4a3ff4..aaf0d26 100644
--- a/starboard/shared/pthread/condition_variable_wait_timed.cc
+++ b/starboard/shared/pthread/condition_variable_wait_timed.cc
@@ -40,7 +40,7 @@
 
 #if !SB_HAS_QUIRK(NO_CONDATTR_SETCLOCK_SUPPORT)
   SbTime timeout_time = SbTimeGetMonotonicNow() + timeout;
-#else  // !SB_HAS_QUIRK(NO_CONDATTR_SETCLOCK_SUPPORT)
+#else   // !SB_HAS_QUIRK(NO_CONDATTR_SETCLOCK_SUPPORT)
   int64_t timeout_time = SbTimeToPosix(SbTimeGetNow()) + timeout;
 #endif  // !SB_HAS_QUIRK(NO_CONDATTR_SETCLOCK_SUPPORT)
 
diff --git a/starboard/shared/pthread/thread_sampler_internal.cc b/starboard/shared/pthread/thread_sampler_internal.cc
index 691ce25..7417233 100644
--- a/starboard/shared/pthread/thread_sampler_internal.cc
+++ b/starboard/shared/pthread/thread_sampler_internal.cc
@@ -107,16 +107,19 @@
 bool SignalHandler::Thaw(SbThreadSampler sampler) {
   starboard::ScopedLock lock(GetMutex());
   SB_DCHECK(frozen_sampler_ == sampler) << "SbThreadSampler didn't freeze.";
-  if (frozen_sampler_ != sampler) return false;
+  if (frozen_sampler_ != sampler)
+    return false;
   sb_context_ = SbThreadContextPrivate();
   sem_post(&thaw_semaphore_);
   frozen_sampler_ = kSbThreadSamplerInvalid;
   return true;
 }
 
-void SignalHandler::HandleProfilerSignal(int signal, siginfo_t* info,
+void SignalHandler::HandleProfilerSignal(int signal,
+                                         siginfo_t* info,
                                          void* context) {
-  if (signal != SIGPROF) return;
+  if (signal != SIGPROF)
+    return;
   sb_context_ = SbThreadContextPrivate(reinterpret_cast<ucontext_t*>(context));
   // |Freeze| can return the context now.
   sem_post(&freeze_semaphore_);
@@ -139,4 +142,6 @@
   return SignalHandler::Freeze(this);
 }
 
-bool SbThreadSamplerPrivate::Thaw() { return SignalHandler::Thaw(this); }
+bool SbThreadSamplerPrivate::Thaw() {
+  return SignalHandler::Thaw(this);
+}
diff --git a/starboard/shared/pthread/thread_sampler_is_supported.cc b/starboard/shared/pthread/thread_sampler_is_supported.cc
index ac771ce..3563f78 100644
--- a/starboard/shared/pthread/thread_sampler_is_supported.cc
+++ b/starboard/shared/pthread/thread_sampler_is_supported.cc
@@ -14,4 +14,6 @@
 
 #include "starboard/thread.h"
 
-bool SbThreadSamplerIsSupported() { return true; }
+bool SbThreadSamplerIsSupported() {
+  return true;
+}
diff --git a/starboard/shared/starboard/command_line.h b/starboard/shared/starboard/command_line.h
index 176ed86..0af3308 100644
--- a/starboard/shared/starboard/command_line.h
+++ b/starboard/shared/starboard/command_line.h
@@ -1,3 +1,4 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
@@ -44,9 +45,7 @@
         begin_args_(other.begin_args_) {}
 
   // Move constructor
-  CommandLine(CommandLine&& other) {
-    swap(*this, other);
-  }
+  CommandLine(CommandLine&& other) { swap(*this, other); }
 
   ~CommandLine();
 
@@ -78,8 +77,7 @@
 
   // Append a switch [with optional value] to the command line.
   // Note: Switches will precede arguments regardless of appending order.
-  void AppendSwitch(const std::string& switch_string,
-                    const StringType& value);
+  void AppendSwitch(const std::string& switch_string, const StringType& value);
 
   // Returns the value associated with the given switch. If the switch has no
   // value or isn't present, this method returns the empty string.
diff --git a/starboard/shared/starboard/drm/drm_generate_session_update_request.cc b/starboard/shared/starboard/drm/drm_generate_session_update_request.cc
index cf5ce49..6a104c6 100644
--- a/starboard/shared/starboard/drm/drm_generate_session_update_request.cc
+++ b/starboard/shared/starboard/drm/drm_generate_session_update_request.cc
@@ -32,7 +32,6 @@
     return;
   }
 
-  drm_system->GenerateSessionUpdateRequest(
-      ticket,
-      type, initialization_data, initialization_data_size);
+  drm_system->GenerateSessionUpdateRequest(ticket, type, initialization_data,
+                                           initialization_data_size);
 }
diff --git a/starboard/nplb/drm_helpers.cc b/starboard/shared/starboard/drm/drm_test_helpers.cc
similarity index 93%
rename from starboard/nplb/drm_helpers.cc
rename to starboard/shared/starboard/drm/drm_test_helpers.cc
index cac39fa..f010f4c 100644
--- a/starboard/nplb/drm_helpers.cc
+++ b/starboard/shared/starboard/drm/drm_test_helpers.cc
@@ -12,12 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/nplb/drm_helpers.h"
+#include "starboard/shared/starboard/drm/drm_test_helpers.h"
 
 #include "starboard/drm.h"
 
 namespace starboard {
-namespace nplb {
+namespace shared {
+namespace starboard {
+namespace drm {
 
 void DummySessionUpdateRequestFunc(SbDrmSystem drm_system,
                                    void* context,
@@ -65,5 +67,7 @@
       DummyServerCertificateUpdatedFunc, DummySessionClosedFunc);
 }
 
-}  // namespace nplb
+}  // namespace drm
+}  // namespace starboard
+}  // namespace shared
 }  // namespace starboard
diff --git a/starboard/shared/starboard/drm/drm_test_helpers.h b/starboard/shared/starboard/drm/drm_test_helpers.h
new file mode 100644
index 0000000..4ed08b8
--- /dev/null
+++ b/starboard/shared/starboard/drm/drm_test_helpers.h
@@ -0,0 +1,158 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_STARBOARD_DRM_DRM_TEST_HELPERS_H_
+#define STARBOARD_SHARED_STARBOARD_DRM_DRM_TEST_HELPERS_H_
+
+#include "starboard/drm.h"
+
+// Helpers to be used by tests
+
+namespace starboard {
+namespace shared {
+namespace starboard {
+namespace drm {
+
+void DummySessionUpdateRequestFunc(SbDrmSystem drm_system,
+                                   void* context,
+                                   int ticket,
+                                   SbDrmStatus status,
+                                   SbDrmSessionRequestType type,
+                                   const char* error_message,
+                                   const void* session_id,
+                                   int session_id_size,
+                                   const void* content,
+                                   int content_size,
+                                   const char* url);
+
+void DummySessionUpdatedFunc(SbDrmSystem drm_system,
+                             void* context,
+                             int ticket,
+                             SbDrmStatus status,
+                             const char* error_message,
+                             const void* session_id,
+                             int session_id_size);
+
+void DummyServerCertificateUpdatedFunc(SbDrmSystem drm_system,
+                                       void* context,
+                                       int ticket,
+                                       SbDrmStatus status,
+                                       const char* error_message);
+
+void DummySessionKeyStatusesChangedFunc(SbDrmSystem drm_system,
+                                        void* context,
+                                        const void* session_id,
+                                        int session_id_size,
+                                        int number_of_keys,
+                                        const SbDrmKeyId* key_ids,
+                                        const SbDrmKeyStatus* key_statuses);
+
+void DummySessionClosedFunc(SbDrmSystem drm_system,
+                            void* context,
+                            const void* session_id,
+                            int session_id_size);
+
+SbDrmSystem CreateDummyDrmSystem(const char* key_system);
+
+static const char* kKeySystems[] = {
+    "com.widevine",
+    "com.widevine.alpha",
+    "com.youtube.playready",
+    "com.youtube.fairplay",
+};
+
+static const char* kEncryptionSchemes[] = {
+    "cenc",
+    "cbcs",
+    "cbcs-1-9",
+};
+
+static constexpr uint8_t kWidevineCertificate[] = {
+    0x0a, 0xc1, 0x02, 0x08, 0x03, 0x12, 0x10, 0x17, 0x05, 0xb9, 0x17, 0xcc,
+    0x12, 0x04, 0x86, 0x8b, 0x06, 0x33, 0x3a, 0x2f, 0x77, 0x2a, 0x8c, 0x18,
+    0x82, 0xb4, 0x82, 0x92, 0x05, 0x22, 0x8e, 0x02, 0x30, 0x82, 0x01, 0x0a,
+    0x02, 0x82, 0x01, 0x01, 0x00, 0x99, 0xed, 0x5b, 0x3b, 0x32, 0x7d, 0xab,
+    0x5e, 0x24, 0xef, 0xc3, 0xb6, 0x2a, 0x95, 0xb5, 0x98, 0x52, 0x0a, 0xd5,
+    0xbc, 0xcb, 0x37, 0x50, 0x3e, 0x06, 0x45, 0xb8, 0x14, 0xd8, 0x76, 0xb8,
+    0xdf, 0x40, 0x51, 0x04, 0x41, 0xad, 0x8c, 0xe3, 0xad, 0xb1, 0x1b, 0xb8,
+    0x8c, 0x4e, 0x72, 0x5a, 0x5e, 0x4a, 0x9e, 0x07, 0x95, 0x29, 0x1d, 0x58,
+    0x58, 0x40, 0x23, 0xa7, 0xe1, 0xaf, 0x0e, 0x38, 0xa9, 0x12, 0x79, 0x39,
+    0x30, 0x08, 0x61, 0x0b, 0x6f, 0x15, 0x8c, 0x87, 0x8c, 0x7e, 0x21, 0xbf,
+    0xfb, 0xfe, 0xea, 0x77, 0xe1, 0x01, 0x9e, 0x1e, 0x57, 0x81, 0xe8, 0xa4,
+    0x5f, 0x46, 0x26, 0x3d, 0x14, 0xe6, 0x0e, 0x80, 0x58, 0xa8, 0x60, 0x7a,
+    0xdc, 0xe0, 0x4f, 0xac, 0x84, 0x57, 0xb1, 0x37, 0xa8, 0xd6, 0x7c, 0xcd,
+    0xeb, 0x33, 0x70, 0x5d, 0x98, 0x3a, 0x21, 0xfb, 0x4e, 0xec, 0xbd, 0x4a,
+    0x10, 0xca, 0x47, 0x49, 0x0c, 0xa4, 0x7e, 0xaa, 0x5d, 0x43, 0x82, 0x18,
+    0xdd, 0xba, 0xf1, 0xca, 0xde, 0x33, 0x92, 0xf1, 0x3d, 0x6f, 0xfb, 0x64,
+    0x42, 0xfd, 0x31, 0xe1, 0xbf, 0x40, 0xb0, 0xc6, 0x04, 0xd1, 0xc4, 0xba,
+    0x4c, 0x95, 0x20, 0xa4, 0xbf, 0x97, 0xee, 0xbd, 0x60, 0x92, 0x9a, 0xfc,
+    0xee, 0xf5, 0x5b, 0xba, 0xf5, 0x64, 0xe2, 0xd0, 0xe7, 0x6c, 0xd7, 0xc5,
+    0x5c, 0x73, 0xa0, 0x82, 0xb9, 0x96, 0x12, 0x0b, 0x83, 0x59, 0xed, 0xce,
+    0x24, 0x70, 0x70, 0x82, 0x68, 0x0d, 0x6f, 0x67, 0xc6, 0xd8, 0x2c, 0x4a,
+    0xc5, 0xf3, 0x13, 0x44, 0x90, 0xa7, 0x4e, 0xec, 0x37, 0xaf, 0x4b, 0x2f,
+    0x01, 0x0c, 0x59, 0xe8, 0x28, 0x43, 0xe2, 0x58, 0x2f, 0x0b, 0x6b, 0x9f,
+    0x5d, 0xb0, 0xfc, 0x5e, 0x6e, 0xdf, 0x64, 0xfb, 0xd3, 0x08, 0xb4, 0x71,
+    0x1b, 0xcf, 0x12, 0x50, 0x01, 0x9c, 0x9f, 0x5a, 0x09, 0x02, 0x03, 0x01,
+    0x00, 0x01, 0x3a, 0x14, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e,
+    0x77, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x2e, 0x63, 0x6f, 0x6d,
+    0x12, 0x80, 0x03, 0xae, 0x34, 0x73, 0x14, 0xb5, 0xa8, 0x35, 0x29, 0x7f,
+    0x27, 0x13, 0x88, 0xfb, 0x7b, 0xb8, 0xcb, 0x52, 0x77, 0xd2, 0x49, 0x82,
+    0x3c, 0xdd, 0xd1, 0xda, 0x30, 0xb9, 0x33, 0x39, 0x51, 0x1e, 0xb3, 0xcc,
+    0xbd, 0xea, 0x04, 0xb9, 0x44, 0xb9, 0x27, 0xc1, 0x21, 0x34, 0x6e, 0xfd,
+    0xbd, 0xea, 0xc9, 0xd4, 0x13, 0x91, 0x7e, 0x6e, 0xc1, 0x76, 0xa1, 0x04,
+    0x38, 0x46, 0x0a, 0x50, 0x3b, 0xc1, 0x95, 0x2b, 0x9b, 0xa4, 0xe4, 0xce,
+    0x0f, 0xc4, 0xbf, 0xc2, 0x0a, 0x98, 0x08, 0xaa, 0xaf, 0x4b, 0xfc, 0xd1,
+    0x9c, 0x1d, 0xcf, 0xcd, 0xf5, 0x74, 0xcc, 0xac, 0x28, 0xd1, 0xb4, 0x10,
+    0x41, 0x6c, 0xf9, 0xde, 0x88, 0x04, 0x30, 0x1c, 0xbd, 0xb3, 0x34, 0xca,
+    0xfc, 0xd0, 0xd4, 0x09, 0x78, 0x42, 0x3a, 0x64, 0x2e, 0x54, 0x61, 0x3d,
+    0xf0, 0xaf, 0xcf, 0x96, 0xca, 0x4a, 0x92, 0x49, 0xd8, 0x55, 0xe4, 0x2b,
+    0x3a, 0x70, 0x3e, 0xf1, 0x76, 0x7f, 0x6a, 0x9b, 0xd3, 0x6d, 0x6b, 0xf8,
+    0x2b, 0xe7, 0x6b, 0xbf, 0x0c, 0xba, 0x4f, 0xde, 0x59, 0xd2, 0xab, 0xcc,
+    0x76, 0xfe, 0xb6, 0x42, 0x47, 0xb8, 0x5c, 0x43, 0x1f, 0xbc, 0xa5, 0x22,
+    0x66, 0xb6, 0x19, 0xfc, 0x36, 0x97, 0x95, 0x43, 0xfc, 0xa9, 0xcb, 0xbd,
+    0xbb, 0xfa, 0xfa, 0x0e, 0x1a, 0x55, 0xe7, 0x55, 0xa3, 0xc7, 0xbc, 0xe6,
+    0x55, 0xf9, 0x64, 0x6f, 0x58, 0x2a, 0xb9, 0xcf, 0x70, 0xaa, 0x08, 0xb9,
+    0x79, 0xf8, 0x67, 0xf6, 0x3a, 0x0b, 0x2b, 0x7f, 0xdb, 0x36, 0x2c, 0x5b,
+    0xc4, 0xec, 0xd5, 0x55, 0xd8, 0x5b, 0xca, 0xa9, 0xc5, 0x93, 0xc3, 0x83,
+    0xc8, 0x57, 0xd4, 0x9d, 0xaa, 0xb7, 0x7e, 0x40, 0xb7, 0x85, 0x1d, 0xdf,
+    0xd2, 0x49, 0x98, 0x80, 0x8e, 0x35, 0xb2, 0x58, 0xe7, 0x5d, 0x78, 0xea,
+    0xc0, 0xca, 0x16, 0xf7, 0x04, 0x73, 0x04, 0xc2, 0x0d, 0x93, 0xed, 0xe4,
+    0xe8, 0xff, 0x1c, 0x6f, 0x17, 0xe6, 0x24, 0x3e, 0x3f, 0x3d, 0xa8, 0xfc,
+    0x17, 0x09, 0x87, 0x0e, 0xc4, 0x5f, 0xba, 0x82, 0x3a, 0x26, 0x3f, 0x0c,
+    0xef, 0xa1, 0xf7, 0x09, 0x3b, 0x19, 0x09, 0x92, 0x83, 0x26, 0x33, 0x37,
+    0x05, 0x04, 0x3a, 0x29, 0xbd, 0xa6, 0xf9, 0xb4, 0x34, 0x2c, 0xc8, 0xdf,
+    0x54, 0x3c, 0xb1, 0xa1, 0x18, 0x2f, 0x7c, 0x5f, 0xff, 0x33, 0xf1, 0x04,
+    0x90, 0xfa, 0xca, 0x5b, 0x25, 0x36, 0x0b, 0x76, 0x01, 0x5e, 0x9c, 0x5a,
+    0x06, 0xab, 0x8e, 0xe0, 0x2f, 0x00, 0xd2, 0xe8, 0xd5, 0x98, 0x61, 0x04,
+    0xaa, 0xcc, 0x4d, 0xd4, 0x75, 0xfd, 0x96, 0xee, 0x9c, 0xe4, 0xe3, 0x26,
+    0xf2, 0x1b, 0x83, 0xc7, 0x05, 0x85, 0x77, 0xb3, 0x87, 0x32, 0xcd, 0xda,
+    0xbc, 0x6a, 0x6b, 0xed, 0x13, 0xfb, 0x0d, 0x49, 0xd3, 0x8a, 0x45, 0xeb,
+    0x87, 0xa5, 0xf4};
+
+// Widevine-specific CENC Initialization data.
+// https://www.w3.org/TR/eme-stream-mp4/
+// https://www.w3.org/TR/eme-initdata-cenc/#common-system
+static constexpr uint8_t kCencInitData[] = {
+    0x00, 0x00, 0x00, 0x34, 0x70, 0x73, 0x73, 0x68, 0x00, 0x00, 0x00,
+    0x00, 0xed, 0xef, 0x8b, 0xa9, 0x79, 0xd6, 0x4a, 0xce, 0xa3, 0xc8,
+    0x27, 0xdc, 0xd5, 0x1d, 0x21, 0xed, 0x00, 0x00, 0x00, 0x14, 0x08,
+    0x01, 0x12, 0x10, 0x31, 0xfd, 0x5b, 0x66, 0x19, 0xfc, 0x5e, 0xad,
+    0x86, 0x7c, 0xff, 0xb5, 0x84, 0xed, 0x4c, 0x19};
+
+}  // namespace drm
+}  // namespace starboard
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_STARBOARD_DRM_DRM_TEST_HELPERS_H_
diff --git a/starboard/shared/starboard/drm/drm_update_session.cc b/starboard/shared/starboard/drm/drm_update_session.cc
index 58dbdd0..a98e000 100644
--- a/starboard/shared/starboard/drm/drm_update_session.cc
+++ b/starboard/shared/starboard/drm/drm_update_session.cc
@@ -28,7 +28,5 @@
     return;
   }
 
-  drm_system->UpdateSession(
-      ticket,
-      key, key_size, session_id, session_id_size);
+  drm_system->UpdateSession(ticket, key, key_size, session_id, session_id_size);
 }
diff --git a/starboard/shared/starboard/file_atomic_replace_write_file.cc b/starboard/shared/starboard/file_atomic_replace_write_file.cc
index 6516eca..5d7e489 100644
--- a/starboard/shared/starboard/file_atomic_replace_write_file.cc
+++ b/starboard/shared/starboard/file_atomic_replace_write_file.cc
@@ -16,6 +16,7 @@
 
 #include <algorithm>
 
+#include "starboard/common/file.h"
 #include "starboard/common/log.h"
 #include "starboard/file.h"
 
@@ -43,6 +44,7 @@
     const int to_write_max =
         static_cast<int>(std::min(to_write, static_cast<int64_t>(kSbInt32Max)));
     const int bytes_written = SbFileWrite(temp_file, source, to_write_max);
+    RecordFileWriteStat(bytes_written);
 
     if (bytes_written < 0) {
       SbFileClose(temp_file);
diff --git a/starboard/shared/starboard/link_receiver.h b/starboard/shared/starboard/link_receiver.h
index 1806700..93ce579 100644
--- a/starboard/shared/starboard/link_receiver.h
+++ b/starboard/shared/starboard/link_receiver.h
@@ -24,7 +24,7 @@
 
 // A loopback-only server that listens to receive null-terminated strings that
 // will be dispatched to the Link() method on the passed in |application|. This
-// will result in kSbEventTypeLink events beind dispatched on the main Starboard
+// will result in kSbEventTypeLink events being dispatched on the main Starboard
 // dispatch thread.
 //
 // This server Runs on its own thread, joining it on destruction. It must be
diff --git a/starboard/shared/starboard/media/codec_util.cc b/starboard/shared/starboard/media/codec_util.cc
index 291bee1..1c2c1b3 100644
--- a/starboard/shared/starboard/media/codec_util.cc
+++ b/starboard/shared/starboard/media/codec_util.cc
@@ -103,6 +103,11 @@
   if (strcmp(codec, "flac") == 0) {
     return kSbMediaAudioCodecFlac;
   }
+  // For WAV, the "codecs" parameter of a MIME type refers to the WAVE format
+  // ID, where 1 represents PCM: https://datatracker.ietf.org/doc/html/rfc2361
+  if (strcmp(codec, "1") == 0) {
+    return kSbMediaAudioCodecPcm;
+  }
 #endif  // SB_API_VERSION >= 14
 #if SB_API_VERSION >= 15
   if (strncmp(codec, "iamf.", 5) == 0) {
diff --git a/starboard/shared/starboard/media/media_get_buffer_alignment.cc b/starboard/shared/starboard/media/media_get_buffer_alignment.cc
index 5f7e50a..7c525dc 100644
--- a/starboard/shared/starboard/media/media_get_buffer_alignment.cc
+++ b/starboard/shared/starboard/media/media_get_buffer_alignment.cc
@@ -16,7 +16,7 @@
 
 #if SB_API_VERSION >= 14
 int SbMediaGetBufferAlignment() {
-#else  // SB_API_VERSION >= 14
+#else   // SB_API_VERSION >= 14
 int SbMediaGetBufferAlignment(SbMediaType type) {
 #endif  // SB_API_VERSION >= 14
   return 1;
diff --git a/starboard/shared/starboard/media/media_tests.gni b/starboard/shared/starboard/media/media_tests.gni
index a720a48..4777863 100644
--- a/starboard/shared/starboard/media/media_tests.gni
+++ b/starboard/shared/starboard/media/media_tests.gni
@@ -17,6 +17,7 @@
   "//starboard/shared/starboard/media/codec_util_test.cc",
   "//starboard/shared/starboard/media/media_util_test.cc",
   "//starboard/shared/starboard/media/mime_type_test.cc",
+  "//starboard/shared/starboard/media/mime_util_test.cc",
   "//starboard/shared/starboard/media/video_capabilities_test.cc",
   "//starboard/shared/starboard/media/vp9_util_test.cc",
 ]
diff --git a/starboard/shared/starboard/media/mime_util.cc b/starboard/shared/starboard/media/mime_util.cc
index fe49830..fc6ca2f 100644
--- a/starboard/shared/starboard/media/mime_util.cc
+++ b/starboard/shared/starboard/media/mime_util.cc
@@ -99,9 +99,20 @@
       break;
 #if SB_API_VERSION >= 14
     case kSbMediaAudioCodecMp3:
+      if (mime_type.subtype() != "mpeg" && mime_type.subtype() != "mp3") {
+        return false;
+      }
+      break;
     case kSbMediaAudioCodecFlac:
+      if (mime_type.subtype() != "ogg" && mime_type.subtype() != "flac") {
+        return false;
+      }
+      break;
     case kSbMediaAudioCodecPcm:
-      return false;
+      if (mime_type.subtype() != "wav") {
+        return false;
+      }
+      break;
 #endif  // SB_API_VERSION >= 14
 #if SB_API_VERSION >= 15
     case kSbMediaAudioCodecIamf:
diff --git a/starboard/shared/starboard/media/mime_util_test.cc b/starboard/shared/starboard/media/mime_util_test.cc
new file mode 100644
index 0000000..14784e6
--- /dev/null
+++ b/starboard/shared/starboard/media/mime_util_test.cc
@@ -0,0 +1,122 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/starboard/media/mime_util.h"
+
+#include "starboard/media.h"
+#include "starboard/shared/starboard/media/media_support_internal.h"
+#include "starboard/shared/starboard/media/mime_type.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace starboard {
+namespace shared {
+namespace starboard {
+namespace media {
+namespace {
+
+// The codecs tested by these tests were introduced in SB_API_VERSION 14.
+#if SB_API_VERSION >= 14
+constexpr char kEmptyKeySystem[] = "";
+constexpr int64_t kBitrate = 44100;
+
+TEST(MimeUtilTest, ChecksSupportedMp3Containers) {
+  const std::string valid_mp3_mime_str_1 =
+      "audio/mpeg; codecs=\"mp3\"; bitrate=44100";
+  const MimeType valid_mp3_mime_1(valid_mp3_mime_str_1);
+  EXPECT_EQ(
+      CanPlayMimeAndKeySystem(valid_mp3_mime_str_1.c_str(), kEmptyKeySystem),
+      SbMediaIsAudioSupported(kSbMediaAudioCodecMp3, &valid_mp3_mime_1,
+                              kBitrate)
+          ? kSbMediaSupportTypeProbably
+          : kSbMediaSupportTypeNotSupported);
+
+  const std::string valid_mp3_mime_str_2 =
+      "audio/mp3; codecs=\"mp3\"; bitrate=44100";
+  const MimeType valid_mp3_mime_2(valid_mp3_mime_str_2);
+  EXPECT_EQ(
+      CanPlayMimeAndKeySystem(valid_mp3_mime_str_2.c_str(), kEmptyKeySystem),
+      SbMediaIsAudioSupported(kSbMediaAudioCodecMp3, &valid_mp3_mime_2,
+                              kBitrate)
+          ? kSbMediaSupportTypeProbably
+          : kSbMediaSupportTypeNotSupported);
+}
+
+TEST(MimeUtilTest, ChecksUnsupportedMp3Containers) {
+  // Invalid container for MP3 codec.
+  const std::string invalid_mp3_mime_str =
+      "audio/mp4; codecs=\"mp3\"; bitrate=44100";
+  const MimeType invalid_mp3_mime(invalid_mp3_mime_str);
+  EXPECT_EQ(
+      CanPlayMimeAndKeySystem(invalid_mp3_mime_str.c_str(), kEmptyKeySystem),
+      kSbMediaSupportTypeNotSupported);
+}
+
+TEST(MimeUtilTest, ChecksSupportedFlacContainers) {
+  const std::string valid_flac_mime_str_1 =
+      "audio/ogg; codecs=\"flac\"; bitrate=44100";
+  const MimeType valid_flac_mime_1(valid_flac_mime_str_1);
+  EXPECT_EQ(
+      CanPlayMimeAndKeySystem(valid_flac_mime_str_1.c_str(), kEmptyKeySystem),
+      SbMediaIsAudioSupported(kSbMediaAudioCodecMp3, &valid_flac_mime_1,
+                              kBitrate)
+          ? kSbMediaSupportTypeProbably
+          : kSbMediaSupportTypeNotSupported);
+
+  const std::string valid_flac_mime_str_2 =
+      "audio/flac; codecs=\"flac\"; bitrate=44100";
+  const MimeType valid_flac_mime_2(valid_flac_mime_str_2);
+  EXPECT_EQ(
+      CanPlayMimeAndKeySystem(valid_flac_mime_str_2.c_str(), kEmptyKeySystem),
+      SbMediaIsAudioSupported(kSbMediaAudioCodecMp3, &valid_flac_mime_2,
+                              kBitrate)
+          ? kSbMediaSupportTypeProbably
+          : kSbMediaSupportTypeNotSupported);
+}
+
+TEST(MimeUtilTest, ChecksUnsupportedFlacContainers) {
+  // Invalid container for FLAC codec.
+  const std::string invalid_flac_mime_str =
+      "audio/mp4; codecs=\"flac\"; bitrate=44100";
+  const MimeType invalid_flac_mime(invalid_flac_mime_str);
+  EXPECT_EQ(
+      CanPlayMimeAndKeySystem(invalid_flac_mime_str.c_str(), kEmptyKeySystem),
+      kSbMediaSupportTypeNotSupported);
+}
+
+TEST(MimeUtilTest, ChecksSupportedPcmContainers) {
+  const std::string valid_pcm_mime_str =
+      "audio/wav; codecs=\"1\"; bitrate=44100";
+  const MimeType valid_pcm_mime(valid_pcm_mime_str);
+  EXPECT_EQ(
+      CanPlayMimeAndKeySystem(valid_pcm_mime_str.c_str(), kEmptyKeySystem),
+      SbMediaIsAudioSupported(kSbMediaAudioCodecPcm, &valid_pcm_mime, kBitrate)
+          ? kSbMediaSupportTypeProbably
+          : kSbMediaSupportTypeNotSupported);
+}
+
+TEST(MimeUtilTest, ChecksUnsupportedWavCodecs) {
+  const std::string invalid_wav_mime_str =
+      "audio/wav; codecs=\"aac\"; bitrate=44100";
+  const MimeType invalid_wav_mime(invalid_wav_mime_str);
+  EXPECT_EQ(
+      CanPlayMimeAndKeySystem(invalid_wav_mime_str.c_str(), kEmptyKeySystem),
+      kSbMediaSupportTypeNotSupported);
+}
+#endif  // SB_API_VERSION >= 14
+
+}  // namespace
+}  // namespace media
+}  // namespace starboard
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/starboard/memory.cc b/starboard/shared/starboard/memory.cc
index 919e828..1f6816d 100644
--- a/starboard/shared/starboard/memory.cc
+++ b/starboard/shared/starboard/memory.cc
@@ -16,71 +16,31 @@
 #include "starboard/atomic.h"
 #include "starboard/common/log.h"
 #include "starboard/memory_reporter.h"
-#include "starboard/shared/starboard/memory_reporter_internal.h"
 
 namespace {
 
 inline void* SbMemoryAllocateImpl(size_t size);
 inline void* SbMemoryAllocateAlignedImpl(size_t alignment, size_t size);
 inline void* SbMemoryReallocateImpl(void* memory, size_t size);
-inline void SbReportAllocation(const void* memory, size_t size);
-inline void SbReportDeallocation(const void* memory);
-
-SbMemoryReporter* s_memory_reporter = NULL;
-
-bool LeakTraceEnabled();               // True when leak tracing enabled.
-bool StarboardAllowsMemoryTracking();  // True when build enabled.
 
 }  // namespace
 
-bool SbMemorySetReporter(SbMemoryReporter* reporter) {
-  // TODO: We should run a runtime test here with a test memory
-  // reporter that determines whether global operator new/delete are properly
-  // overridden. This problem appeared with address sanitizer and given
-  // how tricky operator new/delete are in general (see a google search)
-  // it's reasonable to assume that the likely hood of this happening again
-  // is high. To allow the QA/developer to take corrective action, this
-  // condition needs to be detected at runtime with a simple error message so
-  // that corrective action (i.e. running a different build) can be applied.
-  //
-  // RunOperatorNewDeleteRuntimeTest();  // Implement me.
-
-  // Flush local memory to main so that other threads don't
-  // see a partially constructed reporter due to memory
-  // re-ordering.
-  SbAtomicMemoryBarrier();
-  s_memory_reporter = reporter;
-
-  // These are straight forward error messages. We use the build settings to
-  // predict whether the MemoryReporter is likely to fail.
-  if (!StarboardAllowsMemoryTracking()) {
-    SbLogRaw(
-        "\nMemory Reporting is disabled because this build does "
-        "not support it. Try a QA, devel or debug build.\n");
-    return false;
-  } else if (LeakTraceEnabled()) {
-    SbLogRaw(
-        "\nMemory Reporting might be disabled because leak trace "
-        "(from address sanitizer?) is active.\n");
-    return false;
-  }
-  return true;
+bool SbMemorySetReporter(SbMemoryReporter* _unused) {
+  // Memory reporting is removed
+  return false;
 }
 
 void* SbMemoryAllocate(size_t size) {
   void* memory = SbMemoryAllocateImpl(size);
-  SbReportAllocation(memory, size);
   return memory;
 }
 
 void* SbMemoryAllocateNoReport(size_t size) {
-  void* memory = SbMemoryAllocateImpl(size);
-  return memory;
+  return SbMemoryAllocate(size);
 }
 
 void* SbMemoryAllocateAligned(size_t alignment, size_t size) {
   void* memory = SbMemoryAllocateAlignedImpl(alignment, size);
-  SbReportAllocation(memory, size);
   return memory;
 }
 
@@ -90,27 +50,23 @@
       << "Calling SbMemoryReallocate with a non-null pointer and size 0 is not "
          "guaranteed to release the memory, and therefore may leak memory.";
 #endif
-  SbReportDeallocation(memory);
   void* new_memory = SbMemoryReallocateImpl(memory, size);
-  SbReportAllocation(new_memory, size);
   return new_memory;
 }
 
 void SbMemoryDeallocate(void* memory) {
   // Report must happen first or else a race condition allows the memory to
   // be freed and then reported as allocated, before the allocation is removed.
-  SbReportDeallocation(memory);
   SbMemoryFree(memory);
 }
 
 void SbMemoryDeallocateNoReport(void* memory) {
-  SbMemoryFree(memory);
+  SbMemoryDeallocate(memory);
 }
 
 void SbMemoryDeallocateAligned(void* memory) {
   // Report must happen first or else a race condition allows the memory to
   // be freed and then reported as allocated, before the allocation is removed.
-  SbReportDeallocation(memory);
   SbMemoryFreeAligned(memory);
 }
 
@@ -136,52 +92,8 @@
   return address;
 }
 
-void SbMemoryReporterReportMappedMemory(const void* memory, size_t size) {
-#if !defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-  return;
-#else
-  if (SB_LIKELY(!s_memory_reporter)) {
-    return;
-  }
-  s_memory_reporter->on_mapmem_cb(s_memory_reporter->context, memory, size);
-#endif  // STARBOARD_ALLOWS_MEMORY_TRACKING
-}
-
-void SbMemoryReporterReportUnmappedMemory(const void* memory, size_t size) {
-#if !defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-  return;
-#else
-  if (SB_LIKELY(!s_memory_reporter)) {
-    return;
-  }
-  s_memory_reporter->on_unmapmem_cb(s_memory_reporter->context, memory, size);
-#endif  // STARBOARD_ALLOWS_MEMORY_TRACKING
-}
-
 namespace {
 
-inline void SbReportAllocation(const void* memory, size_t size) {
-#if !defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-  return;
-#else
-  if (SB_LIKELY(!s_memory_reporter)) {
-    return;
-  }
-  s_memory_reporter->on_alloc_cb(s_memory_reporter->context, memory, size);
-#endif  // STARBOARD_ALLOWS_MEMORY_TRACKING
-}
-
-inline void SbReportDeallocation(const void* memory) {
-#if !defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-  return;
-#else
-  if (SB_LIKELY(!s_memory_reporter)) {
-    return;
-  }
-  s_memory_reporter->on_dealloc_cb(s_memory_reporter->context, memory);
-#endif  // STARBOARD_ALLOWS_MEMORY_TRACKING
-}
-
 inline void* SbMemoryAllocateImpl(size_t size) {
 #if SB_ABORT_ON_ALLOCATION_FAILURE
   return SbMemoryAllocateChecked(size);
@@ -206,25 +118,4 @@
 #endif
 }
 
-bool LeakTraceEnabled() {
-#if defined(HAS_LEAK_SANITIZER) && (0 == HAS_LEAK_SANITIZER)
-  // In this build the leak tracer is specifically disabled. This
-  // build condition is typical for some builds of address sanitizer.
-  return true;
-#elif defined(ADDRESS_SANITIZER)
-  // Leak tracer is not specifically disabled and address sanitizer is running.
-  return true;
-#else
-  return false;
-#endif
-}
-
-bool StarboardAllowsMemoryTracking() {
-#if defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
-  return true;
-#else
-  return false;
-#endif
-}
-
 }  // namespace
diff --git a/starboard/shared/starboard/memory_reporter_internal.h b/starboard/shared/starboard/memory_reporter_internal.h
deleted file mode 100644
index 898d7dd..0000000
--- a/starboard/shared/starboard/memory_reporter_internal.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_SHARED_STARBOARD_MEMORY_REPORTER_INTERNAL_H_
-#define STARBOARD_SHARED_STARBOARD_MEMORY_REPORTER_INTERNAL_H_
-
-#include "starboard/export.h"
-#include "starboard/shared/internal_only.h"
-#include "starboard/types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Internal function used to track mapped memory. This is used internally by
-// implementations of SbMemoryMap().
-void SbMemoryReporterReportMappedMemory(const void* memory, size_t size);
-
-// Internal function used to track mapped memory. This is used internally by
-// implementations of SbMemoryUnmap().
-void SbMemoryReporterReportUnmappedMemory(const void* memory, size_t size);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // STARBOARD_SHARED_STARBOARD_MEMORY_REPORTER_INTERNAL_H_
diff --git a/starboard/shared/starboard/net_args.cc b/starboard/shared/starboard/net_args.cc
index 22ab94f..ea4ce74 100644
--- a/starboard/shared/starboard/net_args.cc
+++ b/starboard/shared/starboard/net_args.cc
@@ -68,11 +68,7 @@
     }
   };
 
-  SbSocketWaiterAdd(waiter,
-                    sock,
-                    NULL,
-                    &F::WakeUp,
-                    kSbSocketWaiterInterestRead,
+  SbSocketWaiterAdd(waiter, sock, NULL, &F::WakeUp, kSbSocketWaiterInterestRead,
                     false);  // false means one shot.
 
   SbSocketWaiterWait(waiter);
@@ -82,10 +78,9 @@
 
 scoped_ptr<Socket> WaitForClientConnection(Socket* listen_sock,
                                            SbTime timeout) {
-  SbTimeMonotonic expire_time =
-      (timeout >= 0) && (timeout < kSbTimeMax)?
-      SbTimeGetMonotonicNow() + timeout :
-      kSbTimeMax;
+  SbTimeMonotonic expire_time = (timeout >= 0) && (timeout < kSbTimeMax)
+                                    ? SbTimeGetMonotonicNow() + timeout
+                                    : kSbTimeMax;
   while (true) {
     scoped_ptr<Socket> client_connection(listen_sock->Accept());
     if (client_connection) {
diff --git a/starboard/shared/starboard/player/filter/testing/BUILD.gn b/starboard/shared/starboard/player/filter/testing/BUILD.gn
index 80f2765..34e411d 100644
--- a/starboard/shared/starboard/player/filter/testing/BUILD.gn
+++ b/starboard/shared/starboard/player/filter/testing/BUILD.gn
@@ -38,6 +38,7 @@
 
     public_deps = [
       ":test_util",
+      "//starboard:starboard_with_main",
       "//starboard/shared/starboard/media:media_util",
       "//testing/gmock",
     ]
diff --git a/starboard/shared/starboard/player/filter/tools/BUILD.gn b/starboard/shared/starboard/player/filter/tools/BUILD.gn
index b2d0a78..f1842ff 100644
--- a/starboard/shared/starboard/player/filter/tools/BUILD.gn
+++ b/starboard/shared/starboard/player/filter/tools/BUILD.gn
@@ -18,7 +18,7 @@
     sources = [ "audio_dmp_player.cc" ]
     configs += [ "//starboard/build/config:starboard_implementation" ]
     public_deps = [
-      "//starboard",
+      "//starboard:starboard_with_main",
       "//starboard/shared/starboard/media:media_util",
       "//starboard/shared/starboard/player:player_download_test_data",
       "//starboard/shared/starboard/player:video_dmp",
diff --git a/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc b/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc
index c19c65e..4888810 100644
--- a/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc
+++ b/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc
@@ -189,8 +189,7 @@
     cadence_pattern_generator_.UpdateFrameRate(frame_rate * playback_rate);
     SB_DCHECK(cadence_pattern_generator_.has_cadence());
 
-    auto frame_duration =
-        static_cast<SbTime>(kSbTimeSecond / refresh_rate);
+    auto frame_duration = static_cast<SbTime>(kSbTimeSecond / refresh_rate);
 
     if (current_frame_rendered_times_ >=
         cadence_pattern_generator_.GetNumberOfTimesCurrentFrameDisplays()) {
@@ -200,8 +199,8 @@
       frames->pop_front();
       cadence_pattern_generator_.AdvanceToNextFrame();
       current_frame_rendered_times_ = 0;
-      if (cadence_pattern_generator_.GetNumberOfTimesCurrentFrameDisplays()
-          == 0) {
+      if (cadence_pattern_generator_.GetNumberOfTimesCurrentFrameDisplays() ==
+          0) {
         continue;
       }
       if (frames->front()->timestamp() <= media_time - frame_duration) {
diff --git a/starboard/shared/starboard/player/filter/video_renderer_internal_impl.cc b/starboard/shared/starboard/player/filter/video_renderer_internal_impl.cc
index ccb7ba8..7f42d61 100644
--- a/starboard/shared/starboard/player/filter/video_renderer_internal_impl.cc
+++ b/starboard/shared/starboard/player/filter/video_renderer_internal_impl.cc
@@ -371,28 +371,28 @@
   }
   auto now = SbTimeGetMonotonicNow();
   if (!end_of_stream_written_.load()) {
-    auto elasped = now - last_buffering_state_update_;
-    if (elasped > kDelayBeforeWarning) {
+    auto elapsed = now - last_buffering_state_update_;
+    if (elapsed > kDelayBeforeWarning) {
       switch (buffering_state_) {
         case kWaitForBuffer:
-          SB_LOG(ERROR) << "Haven't received input buffer for " << elasped
+          SB_LOG(ERROR) << "Haven't received input buffer for " << elapsed
                         << " microseconds.";
           break;
         case kWaitForConsumption:
-          SB_LOG(ERROR) << "Haven't consumed input buffer for " << elasped
+          SB_LOG(ERROR) << "Haven't consumed input buffer for " << elapsed
                         << " microseconds.";
           break;
       }
     }
-    elasped = now - last_can_accept_more_data;
-    SB_LOG_IF(ERROR, elasped > kDelayBeforeWarning)
-        << "Haven't ready for input for " << elasped << " microseconds. "
+    elapsed = now - last_can_accept_more_data;
+    SB_LOG_IF(ERROR, elapsed > kDelayBeforeWarning)
+        << "Haven't ready for input for " << elapsed << " microseconds. "
         << "Frame backlog/max frames: " << number_of_frames_.load() << "/"
         << decoder_->GetMaxNumberOfCachedFrames();
   }
-  auto elasped = now - last_output_;
-  SB_LOG_IF(ERROR, elasped > kDelayBeforeWarning)
-      << "Haven't received any output for " << elasped << " microseconds.";
+  auto elapsed = now - last_output_;
+  SB_LOG_IF(ERROR, elapsed > kDelayBeforeWarning)
+      << "Haven't received any output for " << elapsed << " microseconds.";
   Schedule(std::bind(&VideoRendererImpl::CheckBufferingState, this),
            kCheckBufferingStateInterval);
 }
diff --git a/starboard/shared/starboard/player/job_queue_test.cc b/starboard/shared/starboard/player/job_queue_test.cc
index 53578cf..e0b855a 100644
--- a/starboard/shared/starboard/player/job_queue_test.cc
+++ b/starboard/shared/starboard/player/job_queue_test.cc
@@ -159,7 +159,7 @@
 
   std::atomic_bool moved = {false}, copied = {false};
   MoveMe move_me;
-  auto job = [ move_me = std::move(move_me), &moved, &copied ]() {
+  auto job = [move_me = std::move(move_me), &moved, &copied]() {
     moved = move_me.moved;
     copied = move_me.copied;
   };
diff --git a/starboard/shared/starboard/player/player_get_audio_configuration.cc b/starboard/shared/starboard/player/player_get_audio_configuration.cc
index d06f973..bdc0d63 100644
--- a/starboard/shared/starboard/player/player_get_audio_configuration.cc
+++ b/starboard/shared/starboard/player/player_get_audio_configuration.cc
@@ -29,15 +29,7 @@
   SB_DCHECK(index >= 0);
   SB_DCHECK(out_audio_configuration);
 
-  if (index > 0) {
-    // We assume that |player| only uses the primary (index 0) audio output.
-    // For playbacks using more than one audio outputs, or using audio outputs
-    // other than the primary one, the platform should have its own
-    // `SbPlayerGetAudioConfiguration()` implementation.
-    return false;
-  }
-
-  return SbMediaGetAudioConfiguration(index, out_audio_configuration);
+  return player->GetAudioConfiguration(index, out_audio_configuration);
 }
 
 #endif  // SB_API_VERSION >= 15
diff --git a/starboard/shared/starboard/player/player_internal.cc b/starboard/shared/starboard/player/player_internal.cc
index 2edfd56..7247adc 100644
--- a/starboard/shared/starboard/player/player_internal.cc
+++ b/starboard/shared/starboard/player/player_internal.cc
@@ -18,6 +18,8 @@
 #include <utility>
 
 #include "starboard/common/log.h"
+#include "starboard/common/media.h"
+#include "starboard/time.h"
 
 #if SB_PLAYER_ENABLE_VIDEO_DUMPER
 #include SB_PLAYER_DMP_WRITER_INCLUDE_PATH
@@ -171,3 +173,55 @@
 SbDecodeTarget SbPlayerPrivate::GetCurrentDecodeTarget() {
   return worker_->GetCurrentDecodeTarget();
 }
+
+bool SbPlayerPrivate::GetAudioConfiguration(
+    int index,
+    SbMediaAudioConfiguration* out_audio_configuration) {
+  SB_DCHECK(index >= 0);
+  SB_DCHECK(out_audio_configuration);
+
+  starboard::ScopedLock lock(audio_configurations_mutex_);
+  if (audio_configurations_.empty()) {
+#if !defined(COBALT_BUILD_TYPE_GOLD)
+    SbTime start = SbTimeGetMonotonicNow();
+#endif  // !defined(COBALT_BUILD_TYPE_GOLD)
+    for (int i = 0; i < 32; ++i) {
+      SbMediaAudioConfiguration audio_configuration;
+      if (SbMediaGetAudioConfiguration(i, &audio_configuration)) {
+        audio_configurations_.push_back(audio_configuration);
+      } else {
+        break;
+      }
+    }
+    if (!audio_configurations_.empty() &&
+        audio_configurations_[0].connector != kSbMediaAudioConnectorHdmi) {
+      // Move the HDMI connector to the very beginning to be backwards
+      // compatible.
+      for (size_t i = 1; i < audio_configurations_.size(); ++i) {
+        if (audio_configurations_[i].connector == kSbMediaAudioConnectorHdmi) {
+          std::swap(audio_configurations_[i], audio_configurations_[0]);
+          break;
+        }
+      }
+    }
+#if !defined(COBALT_BUILD_TYPE_GOLD)
+    SbTime elapsed = SbTimeGetMonotonicNow() - start;
+    SB_LOG(INFO)
+        << "GetAudioConfiguration(): Updating audio configurations takes "
+        << elapsed << " microseconds.";
+    for (auto&& audio_configuration : audio_configurations_) {
+      SB_LOG(INFO) << "Found audio configuration "
+                   << starboard::GetMediaAudioConnectorName(
+                          audio_configuration.connector)
+                   << ", channels " << audio_configuration.number_of_channels;
+    }
+#endif  // !defined(COBALT_BUILD_TYPE_GOLD)
+  }
+
+  if (index < static_cast<int>(audio_configurations_.size())) {
+    *out_audio_configuration = audio_configurations_[index];
+    return true;
+  }
+
+  return false;
+}
diff --git a/starboard/shared/starboard/player/player_internal.h b/starboard/shared/starboard/player/player_internal.h
index a43e030..d6391ff 100644
--- a/starboard/shared/starboard/player/player_internal.h
+++ b/starboard/shared/starboard/player/player_internal.h
@@ -16,6 +16,7 @@
 #define STARBOARD_SHARED_STARBOARD_PLAYER_PLAYER_INTERNAL_H_
 
 #include <utility>
+#include <vector>
 
 #include "starboard/common/scoped_ptr.h"
 #include "starboard/decode_target.h"
@@ -64,6 +65,9 @@
   void SetVolume(double volume);
 
   SbDecodeTarget GetCurrentDecodeTarget();
+  bool GetAudioConfiguration(
+      int index,
+      SbMediaAudioConfiguration* out_audio_configuration);
 
   ~SbPlayerPrivate() {
     --number_of_players_;
@@ -92,6 +96,7 @@
 
   SbPlayerDeallocateSampleFunc sample_deallocate_func_;
   void* context_;
+
   starboard::Mutex mutex_;
   int ticket_ = SB_PLAYER_INITIAL_TICKET;
   SbTime media_time_ = 0;
@@ -109,6 +114,9 @@
 
   starboard::scoped_ptr<PlayerWorker> worker_;
 
+  starboard::Mutex audio_configurations_mutex_;
+  std::vector<SbMediaAudioConfiguration> audio_configurations_;
+
   static int number_of_players_;
 };
 
diff --git a/starboard/shared/starboard/player/testdata/beneath_the_canopy_248_vp9.dmp.sha1 b/starboard/shared/starboard/player/testdata/beneath_the_canopy_248_vp9.dmp.sha1
index fd2339c..2b2109d 100644
--- a/starboard/shared/starboard/player/testdata/beneath_the_canopy_248_vp9.dmp.sha1
+++ b/starboard/shared/starboard/player/testdata/beneath_the_canopy_248_vp9.dmp.sha1
@@ -1 +1 @@
-014eb1dd73784f081b3c7621196e5bc75ea9fbb0
\ No newline at end of file
+014eb1dd73784f081b3c7621196e5bc75ea9fbb0
diff --git a/starboard/shared/starboard/player/testdata/beneath_the_canopy_aac_5_1.dmp.sha1 b/starboard/shared/starboard/player/testdata/beneath_the_canopy_aac_5_1.dmp.sha1
index 8ae1579..632353f 100644
--- a/starboard/shared/starboard/player/testdata/beneath_the_canopy_aac_5_1.dmp.sha1
+++ b/starboard/shared/starboard/player/testdata/beneath_the_canopy_aac_5_1.dmp.sha1
@@ -1 +1 @@
-6d8fd13961e519725481fd122f60514adc16f0da
\ No newline at end of file
+6d8fd13961e519725481fd122f60514adc16f0da
diff --git a/starboard/shared/starboard/player/testdata/beneath_the_canopy_aac_mono.dmp.sha1 b/starboard/shared/starboard/player/testdata/beneath_the_canopy_aac_mono.dmp.sha1
index 969f852..77dd3ab 100644
--- a/starboard/shared/starboard/player/testdata/beneath_the_canopy_aac_mono.dmp.sha1
+++ b/starboard/shared/starboard/player/testdata/beneath_the_canopy_aac_mono.dmp.sha1
@@ -1 +1 @@
-ded4cfaba4dde8fff9e5de209b9593dafe70e912
\ No newline at end of file
+ded4cfaba4dde8fff9e5de209b9593dafe70e912
diff --git a/starboard/shared/starboard/player/testdata/beneath_the_canopy_aac_stereo.dmp.sha1 b/starboard/shared/starboard/player/testdata/beneath_the_canopy_aac_stereo.dmp.sha1
index df8bc3c..63b1de5 100644
--- a/starboard/shared/starboard/player/testdata/beneath_the_canopy_aac_stereo.dmp.sha1
+++ b/starboard/shared/starboard/player/testdata/beneath_the_canopy_aac_stereo.dmp.sha1
@@ -1 +1 @@
-da6d60521ec2a1d5174712d010d7bd20c6ce5847
\ No newline at end of file
+da6d60521ec2a1d5174712d010d7bd20c6ce5847
diff --git a/starboard/shared/starboard/player/testdata/beneath_the_canopy_opus_5_1.dmp.sha1 b/starboard/shared/starboard/player/testdata/beneath_the_canopy_opus_5_1.dmp.sha1
index a42109c..eebc2ce 100644
--- a/starboard/shared/starboard/player/testdata/beneath_the_canopy_opus_5_1.dmp.sha1
+++ b/starboard/shared/starboard/player/testdata/beneath_the_canopy_opus_5_1.dmp.sha1
@@ -1 +1 @@
-53e543fed416debd4b34e394766ba7fb65d483de
\ No newline at end of file
+53e543fed416debd4b34e394766ba7fb65d483de
diff --git a/starboard/shared/starboard/player/testdata/beneath_the_canopy_opus_mono.dmp.sha1 b/starboard/shared/starboard/player/testdata/beneath_the_canopy_opus_mono.dmp.sha1
index 8fa07b5..e47e7a1 100644
--- a/starboard/shared/starboard/player/testdata/beneath_the_canopy_opus_mono.dmp.sha1
+++ b/starboard/shared/starboard/player/testdata/beneath_the_canopy_opus_mono.dmp.sha1
@@ -1 +1 @@
-a821fbd0211ddf4f91375d1eb3f8b3b1ec06b8e3
\ No newline at end of file
+a821fbd0211ddf4f91375d1eb3f8b3b1ec06b8e3
diff --git a/starboard/shared/starboard/player/testdata/beneath_the_canopy_opus_stereo.dmp.sha1 b/starboard/shared/starboard/player/testdata/beneath_the_canopy_opus_stereo.dmp.sha1
index e771e7b..c9b45ae 100644
--- a/starboard/shared/starboard/player/testdata/beneath_the_canopy_opus_stereo.dmp.sha1
+++ b/starboard/shared/starboard/player/testdata/beneath_the_canopy_opus_stereo.dmp.sha1
@@ -1 +1 @@
-8e07663bc1cd2dc8f258f5c80650265d792e9f47
\ No newline at end of file
+8e07663bc1cd2dc8f258f5c80650265d792e9f47
diff --git a/starboard/shared/starboard/player/testdata/black_test_avc_1080p_30to60_fps.dmp.sha1 b/starboard/shared/starboard/player/testdata/black_test_avc_1080p_30to60_fps.dmp.sha1
index e70a0d0..49aa842 100644
--- a/starboard/shared/starboard/player/testdata/black_test_avc_1080p_30to60_fps.dmp.sha1
+++ b/starboard/shared/starboard/player/testdata/black_test_avc_1080p_30to60_fps.dmp.sha1
@@ -1 +1 @@
-eba2d4b5be46a273811f4fcbe9c3bae72bd65b37
\ No newline at end of file
+eba2d4b5be46a273811f4fcbe9c3bae72bd65b37
diff --git a/starboard/shared/starboard/player/testdata/licences/creative_commons_BY30_licence.txt b/starboard/shared/starboard/player/testdata/licences/creative_commons_BY30_licence.txt
index d1df8c0..1a16e05 100644
--- a/starboard/shared/starboard/player/testdata/licences/creative_commons_BY30_licence.txt
+++ b/starboard/shared/starboard/player/testdata/licences/creative_commons_BY30_licence.txt
@@ -317,4 +317,3 @@
     this trademark restriction does not form part of this License.
 
     Creative Commons may be contacted at https://creativecommons.org/.
-
diff --git a/starboard/shared/starboard/player/testdata/sintel_399_av1.dmp.sha1 b/starboard/shared/starboard/player/testdata/sintel_399_av1.dmp.sha1
index b2a1296..b17f00b 100644
--- a/starboard/shared/starboard/player/testdata/sintel_399_av1.dmp.sha1
+++ b/starboard/shared/starboard/player/testdata/sintel_399_av1.dmp.sha1
@@ -1 +1 @@
-6efec071ba03d758d76a00e6ca8f968e5cf65e62
\ No newline at end of file
+6efec071ba03d758d76a00e6ca8f968e5cf65e62
diff --git a/starboard/shared/starboard/player/video_dmp_writer.cc b/starboard/shared/starboard/player/video_dmp_writer.cc
index dcf3f1c..c421f0e 100644
--- a/starboard/shared/starboard/player/video_dmp_writer.cc
+++ b/starboard/shared/starboard/player/video_dmp_writer.cc
@@ -18,6 +18,7 @@
 #include <sstream>
 #include <string>
 
+#include "starboard/common/file.h"
 #include "starboard/common/log.h"
 #include "starboard/common/mutex.h"
 #include "starboard/common/string.h"
@@ -187,7 +188,9 @@
 }
 
 int VideoDmpWriter::WriteToFile(const void* buffer, int size) {
-  return SbFileWrite(file_, static_cast<const char*>(buffer), size);
+  int result = SbFileWrite(file_, static_cast<const char*>(buffer), size);
+  RecordFileWriteStat(result);
+  return result;
 }
 
 }  // namespace video_dmp
diff --git a/starboard/shared/starboard/thread_checker.h b/starboard/shared/starboard/thread_checker.h
index 412b9ee..5ec38af 100644
--- a/starboard/shared/starboard/thread_checker.h
+++ b/starboard/shared/starboard/thread_checker.h
@@ -28,8 +28,7 @@
  public:
   enum Type { kSetThreadIdOnCreation, kSetThreadIdOnFirstCheck };
 
-  explicit ThreadChecker(Type type = kSetThreadIdOnCreation) {
-  }
+  explicit ThreadChecker(Type type = kSetThreadIdOnCreation) {}
 
   void Detach() {}
 
diff --git a/starboard/shared/starboard/thread_local_storage_internal.cc b/starboard/shared/starboard/thread_local_storage_internal.cc
index 55bfb03..ff205ad 100644
--- a/starboard/shared/starboard/thread_local_storage_internal.cc
+++ b/starboard/shared/starboard/thread_local_storage_internal.cc
@@ -41,13 +41,6 @@
   s_instance = new TLSKeyManager();
 }
 
-// RawAllocator uses the SbMemoryAllocateNoReport() and
-// SbMemoryDeallocateNoReport() allocation functions. This allows the
-// TLSKeyManager to be used with the memory tracking system.
-// Without this allocator, the TLSKeyManager could receive an event for memory
-// allocation, which will cause memory to be allocated in the map, which will
-// generate an event for memory allocation ... which results in an infinite
-// loop and a crash.
 template <typename T>
 class RawAllocator : public std::allocator<T> {
  public:
@@ -67,11 +60,11 @@
 
   pointer allocate(size_type n,
                    std::allocator<void>::const_pointer hint = NULL) {
-    void* ptr = SbMemoryAllocateNoReport(n * sizeof(value_type));
+    void* ptr = SbMemoryAllocate(n * sizeof(value_type));
     return static_cast<pointer>(ptr);
   }
 
-  void deallocate(pointer p, size_type n) { SbMemoryDeallocateNoReport(p); }
+  void deallocate(pointer p, size_type n) { SbMemoryDeallocate(p); }
   template <typename U>
   struct rebind {
     typedef RawAllocator<U> other;
@@ -88,7 +81,7 @@
     map_vector_.resize(kNumBuckets);
 
     for (size_t i = 0; i < map_vector_.size(); ++i) {
-      void* memory_block = SbMemoryAllocateNoReport(sizeof(LockedMap));
+      void* memory_block = SbMemoryAllocate(sizeof(LockedMap));
       map_vector_[i] = new (memory_block) LockedMap;
     }
   }
@@ -97,7 +90,7 @@
     for (size_t i = 0; i < map_vector_.size(); ++i) {
       LockedMap* obj = map_vector_[i];
       obj->~LockedMap();
-      SbMemoryDeallocateNoReport(obj);
+      SbMemoryDeallocate(obj);
     }
   }
 
@@ -189,8 +182,8 @@
   typedef ConcurrentThreadIdMap ThreadIdMap;
 
   // Overrides new/delete for InternalData to bypass memory reporting.
-  static void* operator new(size_t n) { return SbMemoryAllocateNoReport(n); }
-  static void operator delete(void* p) { SbMemoryDeallocateNoReport(p); }
+  static void* operator new(size_t n) { return SbMemoryAllocate(n); }
+  static void operator delete(void* p) { SbMemoryDeallocate(p); }
 
   // The key record tracks all key values among all threads, along with their
   // destructors, if specified.
@@ -219,8 +212,7 @@
 SbThreadLocalKey TLSKeyManager::CreateKey(SbThreadLocalDestructor destructor) {
   // Allocate key and bypass the the normal allocator. Otherwise there
   // could be a re-entrant loop that kills the process.
-  void* memory_block =
-      SbMemoryAllocateNoReport(sizeof(SbThreadLocalKeyPrivate));
+  void* memory_block = SbMemoryAllocate(sizeof(SbThreadLocalKeyPrivate));
   SbThreadLocalKey key = new (memory_block) SbThreadLocalKeyPrivate();
 
   ScopedLock lock(mutex_);
@@ -247,7 +239,7 @@
   data_->key_table_[key->index].valid = false;
 
   key.~SbThreadLocalKey();
-  SbMemoryDeallocateNoReport(key);
+  SbMemoryDeallocate(key);
 }
 
 bool TLSKeyManager::SetLocalValue(SbThreadLocalKey key, void* value) {
diff --git a/starboard/shared/stub/accessibility_get_caption_settings.cc b/starboard/shared/stub/accessibility_get_caption_settings.cc
index 7975467..a956eae 100644
--- a/starboard/shared/stub/accessibility_get_caption_settings.cc
+++ b/starboard/shared/stub/accessibility_get_caption_settings.cc
@@ -12,8 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "base/compiler_specific.h"  // nogncheck
-
 #include "starboard/accessibility.h"
 #include "starboard/common/memory.h"
 
diff --git a/starboard/shared/stub/atomic_public.h b/starboard/shared/stub/atomic_public.h
index 6aa6f89..1b7a2a5 100644
--- a/starboard/shared/stub/atomic_public.h
+++ b/starboard/shared/stub/atomic_public.h
@@ -60,16 +60,13 @@
 SB_C_FORCE_INLINE void SbAtomicMemoryBarrier() {}
 
 SB_C_FORCE_INLINE void SbAtomicNoBarrier_Store(volatile SbAtomic32* ptr,
-                                               SbAtomic32 value) {
-}
+                                               SbAtomic32 value) {}
 
 SB_C_FORCE_INLINE void SbAtomicAcquire_Store(volatile SbAtomic32* ptr,
-                                             SbAtomic32 value) {
-}
+                                             SbAtomic32 value) {}
 
 SB_C_FORCE_INLINE void SbAtomicRelease_Store(volatile SbAtomic32* ptr,
-                                             SbAtomic32 value) {
-}
+                                             SbAtomic32 value) {}
 
 SB_C_FORCE_INLINE SbAtomic32
 SbAtomicNoBarrier_Load(volatile const SbAtomic32* ptr) {
@@ -88,14 +85,13 @@
 
 SB_C_FORCE_INLINE SbAtomic8
 SbAtomicRelease_CompareAndSwap8(volatile SbAtomic8* ptr,
-                               SbAtomic8 old_value,
-                               SbAtomic8 new_value) {
+                                SbAtomic8 old_value,
+                                SbAtomic8 new_value) {
   return 0;
 }
 
-SB_C_FORCE_INLINE void
-SbAtomicNoBarrier_Store8(volatile SbAtomic8* ptr, SbAtomic8 value) {
-}
+SB_C_FORCE_INLINE void SbAtomicNoBarrier_Store8(volatile SbAtomic8* ptr,
+                                                SbAtomic8 value) {}
 
 SB_C_FORCE_INLINE SbAtomic8
 SbAtomicNoBarrier_Load8(volatile const SbAtomic8* ptr) {
@@ -141,16 +137,13 @@
 }
 
 SB_C_FORCE_INLINE void SbAtomicNoBarrier_Store64(volatile SbAtomic64* ptr,
-                                                 SbAtomic64 value) {
-}
+                                                 SbAtomic64 value) {}
 
 SB_C_FORCE_INLINE void SbAtomicAcquire_Store64(volatile SbAtomic64* ptr,
-                                               SbAtomic64 value) {
-}
+                                               SbAtomic64 value) {}
 
 SB_C_FORCE_INLINE void SbAtomicRelease_Store64(volatile SbAtomic64* ptr,
-                                               SbAtomic64 value) {
-}
+                                               SbAtomic64 value) {}
 
 SB_C_FORCE_INLINE SbAtomic64
 SbAtomicNoBarrier_Load64(volatile const SbAtomic64* ptr) {
diff --git a/starboard/shared/stub/audio_sink_get_nearest_supported_sample_frequency.cc b/starboard/shared/stub/audio_sink_get_nearest_supported_sample_frequency.cc
index 1152dc0..ae61809 100644
--- a/starboard/shared/stub/audio_sink_get_nearest_supported_sample_frequency.cc
+++ b/starboard/shared/stub/audio_sink_get_nearest_supported_sample_frequency.cc
@@ -14,7 +14,6 @@
 
 #include "starboard/audio_sink.h"
 
-int SbAudioSinkGetNearestSupportedSampleFrequency(
-    int sampling_frequency_hz) {
+int SbAudioSinkGetNearestSupportedSampleFrequency(int sampling_frequency_hz) {
   return sampling_frequency_hz;
 }
diff --git a/starboard/shared/stub/byte_swap.cc b/starboard/shared/stub/byte_swap.cc
index 58ec716..6a7cef8 100644
--- a/starboard/shared/stub/byte_swap.cc
+++ b/starboard/shared/stub/byte_swap.cc
@@ -15,6 +15,8 @@
 // Not breaking these functions up because however one is implemented, the
 // others should be implemented similarly.
 
+#if SB_API_VERSION < 16
+
 #include "starboard/common/byte_swap.h"
 
 int16_t SbByteSwapS16(int16_t value) {
@@ -40,3 +42,5 @@
 uint64_t SbByteSwapU64(uint64_t value) {
   return 0;
 }
+
+#endif
diff --git a/starboard/shared/stub/drm_close_session.cc b/starboard/shared/stub/drm_close_session.cc
index 544889c..91afe51 100644
--- a/starboard/shared/stub/drm_close_session.cc
+++ b/starboard/shared/stub/drm_close_session.cc
@@ -16,5 +16,4 @@
 
 void SbDrmCloseSession(SbDrmSystem drm_system,
                        const void* session_id,
-                       int session_id_size) {
-}
+                       int session_id_size) {}
diff --git a/starboard/shared/stub/drm_destroy_system.cc b/starboard/shared/stub/drm_destroy_system.cc
index 22f5aef..2e866a9 100644
--- a/starboard/shared/stub/drm_destroy_system.cc
+++ b/starboard/shared/stub/drm_destroy_system.cc
@@ -14,5 +14,4 @@
 
 #include "starboard/drm.h"
 
-void SbDrmDestroySystem(SbDrmSystem drm_system) {
-}
+void SbDrmDestroySystem(SbDrmSystem drm_system) {}
diff --git a/starboard/shared/stub/drm_update_server_certificate.cc b/starboard/shared/stub/drm_update_server_certificate.cc
index 8d4d97b..2816007 100644
--- a/starboard/shared/stub/drm_update_server_certificate.cc
+++ b/starboard/shared/stub/drm_update_server_certificate.cc
@@ -17,5 +17,4 @@
 void SbDrmUpdateServerCertificate(SbDrmSystem drm_system,
                                   int ticket,
                                   const void* certificate,
-                                  int certificate_size) {
-}
+                                  int certificate_size) {}
diff --git a/starboard/shared/stub/log_flush.cc b/starboard/shared/stub/log_flush.cc
index 6d3e123..2fe09a7 100644
--- a/starboard/shared/stub/log_flush.cc
+++ b/starboard/shared/stub/log_flush.cc
@@ -14,5 +14,4 @@
 
 #include "starboard/common/log.h"
 
-void SbLogFlush() {
-}
+void SbLogFlush() {}
diff --git a/starboard/shared/stub/media_get_buffer_alignment.cc b/starboard/shared/stub/media_get_buffer_alignment.cc
index 32bfad7..f926109 100644
--- a/starboard/shared/stub/media_get_buffer_alignment.cc
+++ b/starboard/shared/stub/media_get_buffer_alignment.cc
@@ -16,7 +16,7 @@
 
 #if SB_API_VERSION >= 14
 int SbMediaGetBufferAlignment() {
-#else  // SB_API_VERSION >= 14
+#else   // SB_API_VERSION >= 14
 int SbMediaGetBufferAlignment(SbMediaType type) {
 #endif  // SB_API_VERSION >= 14
   return 0;
diff --git a/starboard/shared/stub/system_clear_last_error.cc b/starboard/shared/stub/system_clear_last_error.cc
index 267a596..4635269 100644
--- a/starboard/shared/stub/system_clear_last_error.cc
+++ b/starboard/shared/stub/system_clear_last_error.cc
@@ -14,5 +14,4 @@
 
 #include "starboard/system.h"
 
-void SbSystemClearLastError() {
-}
+void SbSystemClearLastError() {}
diff --git a/starboard/shared/stub/thread_sampler_destroy.cc b/starboard/shared/stub/thread_sampler_destroy.cc
index 263ae6e..45192cd 100644
--- a/starboard/shared/stub/thread_sampler_destroy.cc
+++ b/starboard/shared/stub/thread_sampler_destroy.cc
@@ -14,5 +14,4 @@
 
 #include "starboard/thread.h"
 
-void SbThreadSamplerDestroy(SbThreadSampler sampler) {
-}
+void SbThreadSamplerDestroy(SbThreadSampler sampler) {}
diff --git a/starboard/shared/stub/thread_sampler_is_supported.cc b/starboard/shared/stub/thread_sampler_is_supported.cc
index 2ad040f..7f0bc3f 100644
--- a/starboard/shared/stub/thread_sampler_is_supported.cc
+++ b/starboard/shared/stub/thread_sampler_is_supported.cc
@@ -14,4 +14,6 @@
 
 #include "starboard/thread.h"
 
-bool SbThreadSamplerIsSupported() { return false; }
+bool SbThreadSamplerIsSupported() {
+  return false;
+}
diff --git a/starboard/shared/stub/thread_yield.cc b/starboard/shared/stub/thread_yield.cc
index a53a7a6..9577105 100644
--- a/starboard/shared/stub/thread_yield.cc
+++ b/starboard/shared/stub/thread_yield.cc
@@ -14,5 +14,4 @@
 
 #include "starboard/thread.h"
 
-void SbThreadYield() {
-}
+void SbThreadYield() {}
diff --git a/starboard/shared/uwp/async_utils.h b/starboard/shared/uwp/async_utils.h
index 570af19..510f9b4 100644
--- a/starboard/shared/uwp/async_utils.h
+++ b/starboard/shared/uwp/async_utils.h
@@ -29,22 +29,24 @@
 namespace uwp {
 
 template <typename TResult>
-TResult WaitForResult(IAsyncOperation<TResult>^ operation) {
+TResult WaitForResult(IAsyncOperation<TResult> ^ operation) {
   using concurrency::task_continuation_context;
   HANDLE event = CreateEvent(nullptr, TRUE, FALSE, nullptr);
   concurrency::create_task(operation,
                            task_continuation_context::use_arbitrary())
-      .then([&event](TResult result) {
-        BOOL success = SetEvent(event);
-        SB_DCHECK(success);
-      }, task_continuation_context::use_arbitrary());
+      .then(
+          [&event](TResult result) {
+            BOOL success = SetEvent(event);
+            SB_DCHECK(success);
+          },
+          task_continuation_context::use_arbitrary());
   DWORD return_value = WaitForSingleObject(event, INFINITE);
   SB_DCHECK(return_value == WAIT_OBJECT_0);
   CloseHandle(event);
   return operation->GetResults();
 }
 
-inline void WaitForComplete(IAsyncAction^ action) {
+inline void WaitForComplete(IAsyncAction ^ action) {
   using concurrency::task_continuation_context;
   HANDLE event = CreateEvent(nullptr, TRUE, FALSE, nullptr);
   concurrency::create_task(action, task_continuation_context::use_arbitrary())
diff --git a/starboard/shared/uwp/extended_resources_manager.cc b/starboard/shared/uwp/extended_resources_manager.cc
index 6694d3b..5b0c78b 100644
--- a/starboard/shared/uwp/extended_resources_manager.cc
+++ b/starboard/shared/uwp/extended_resources_manager.cc
@@ -16,7 +16,6 @@
 
 #include <ppltasks.h>
 
-#include "internal/starboard/xb1/shared/internal_shims.h"
 #include "starboard/common/condition_variable.h"
 #include "starboard/common/semaphore.h"
 #include "starboard/common/string.h"
@@ -25,9 +24,10 @@
 #include "starboard/shared/win32/video_decoder.h"
 #include "starboard/thread.h"
 #include "starboard/time.h"
+#include "starboard/xb1/shared/internal_shims.h"
 #if defined(INTERNAL_BUILD)
-#include "internal/starboard/xb1/internal/av1_video_decoder.h"
-#include "internal/starboard/xb1/internal/vpx_video_decoder.h"
+#include "internal/starboard/xb1/av1_video_decoder.h"
+#include "internal/starboard/xb1/vpx_video_decoder.h"
 #include "third_party/internal/libvpx_xb1/libvpx/d3dx12.h"
 #endif  // defined(INTERNAL_BUILD)
 
diff --git a/starboard/shared/uwp/log_file_impl.cc b/starboard/shared/uwp/log_file_impl.cc
index 723f1f0..c226950 100644
--- a/starboard/shared/uwp/log_file_impl.cc
+++ b/starboard/shared/uwp/log_file_impl.cc
@@ -36,7 +36,7 @@
  public:
   static LogFileImpl* GetInstance();
 
-  void OpenUWP(StorageFolder^ folder, const char* filename) {
+  void OpenUWP(StorageFolder ^ folder, const char* filename) {
     ScopedLock lock(mutex_);
     impl_.reset();
     impl_ = CreateLogWriterUWP(folder, filename);
@@ -74,7 +74,7 @@
   LogFileImpl::GetInstance()->Close();
 }
 
-void OpenLogFileUWP(StorageFolder^ folder, const char* filename) {
+void OpenLogFileUWP(StorageFolder ^ folder, const char* filename) {
   LogFileImpl::GetInstance()->OpenUWP(folder, filename);
 }
 
diff --git a/starboard/shared/uwp/log_file_impl.h b/starboard/shared/uwp/log_file_impl.h
index ebd5733..4157cfb 100644
--- a/starboard/shared/uwp/log_file_impl.h
+++ b/starboard/shared/uwp/log_file_impl.h
@@ -22,7 +22,7 @@
 namespace shared {
 namespace uwp {
 
-void OpenLogFileUWP(Windows::Storage::StorageFolder^ folder,
+void OpenLogFileUWP(Windows::Storage::StorageFolder ^ folder,
                     const char* filename);
 
 void OpenLogFileWin32(const char* path);
diff --git a/starboard/shared/uwp/log_raw.cc b/starboard/shared/uwp/log_raw.cc
index b9f4b35..77f8ca8 100644
--- a/starboard/shared/uwp/log_raw.cc
+++ b/starboard/shared/uwp/log_raw.cc
@@ -47,8 +47,7 @@
 
 void SbLogRaw(const char* message) {
   fprintf(stderr, "%s", message);
-  sbuwp::WriteToLogFile(
-      message, static_cast<int>(strlen(message)));
+  sbuwp::WriteToLogFile(message, static_cast<int>(strlen(message)));
   OutputToDebugConsole(message);
   starboard::shared::starboard::NetLogWrite(message);
 }
diff --git a/starboard/shared/uwp/log_writer_uwp.cc b/starboard/shared/uwp/log_writer_uwp.cc
index 3376db6..0beb327 100644
--- a/starboard/shared/uwp/log_writer_uwp.cc
+++ b/starboard/shared/uwp/log_writer_uwp.cc
@@ -30,8 +30,8 @@
 using Windows::Storage::StorageFile;
 using Windows::Storage::StorageFolder;
 using Windows::Storage::Streams::DataWriter;
-using Windows::Storage::Streams::IRandomAccessStream;
 using Windows::Storage::Streams::IOutputStream;
+using Windows::Storage::Streams::IRandomAccessStream;
 
 namespace starboard {
 namespace shared {
@@ -44,19 +44,18 @@
   void Acquire() { sema_.Take(); }
   void Release() { sema_.Put(); }
   bool AcquireTry() { return sema_.TakeTry(); }
+
  private:
   Semaphore sema_;
 };
 
 class LogWriterUWP : public ILogWriter {
  public:
-  LogWriterUWP(StorageFolder^ folder, const char* filename) {
+  LogWriterUWP(StorageFolder ^ folder, const char* filename) {
     OpenLogFile(folder, filename);
   }
 
-  ~LogWriterUWP() {
-    CloseLogFile();
-  }
+  ~LogWriterUWP() { CloseLogFile(); }
 
   void Write(const char* content, int size) override {
     WriteToLogFile(content, size);
@@ -65,9 +64,7 @@
  private:
   // SbMutex is not reentrant, so factor out close log file functionality for
   // use by other functions.
-  void CloseLogFile_Locked() {
-    log_writer_ = nullptr;
-  }
+  void CloseLogFile_Locked() { log_writer_ = nullptr; }
 
   void CloseLogFile() {
     log_mutex_.Acquire();
@@ -75,7 +72,7 @@
     log_mutex_.Release();
   }
 
-  void OpenLogFile(StorageFolder^ folder, const char* filename) {
+  void OpenLogFile(StorageFolder ^ folder, const char* filename) {
     std::wstring wfilename = win32::CStringToWString(filename);
 
     log_mutex_.Acquire();
@@ -87,30 +84,31 @@
     auto task = folder->CreateFileAsync(
         ref new Platform::String(wfilename.c_str()),
         Windows::Storage::CreationCollisionOption::ReplaceExisting);
-    task->Completed = ref new AsyncOperationCompletedHandler<StorageFile^>(
-        [folder, this](IAsyncOperation<StorageFile^>^ op, AsyncStatus) {
-        if (op->Status != AsyncStatus::Completed) {
-          this->log_mutex_.Release();
-          SB_LOG(ERROR) << "Unable to open log file in folder "
-                        << win32::platformStringToString(folder->Name);
-          return;
-        }
+    task->Completed = ref new AsyncOperationCompletedHandler<StorageFile ^>(
+        [folder, this](IAsyncOperation<StorageFile ^> ^ op, AsyncStatus) {
+          if (op->Status != AsyncStatus::Completed) {
+            this->log_mutex_.Release();
+            SB_LOG(ERROR) << "Unable to open log file in folder "
+                          << win32::platformStringToString(folder->Name);
+            return;
+          }
 
-        try {
-          auto task = op->GetResults()->OpenAsync(FileAccessMode::ReadWrite);
-          task->Completed = ref new
-              AsyncOperationCompletedHandler<IRandomAccessStream^>(
-              [this](IAsyncOperation<IRandomAccessStream^>^ op, AsyncStatus) {
-                this->log_writer_ = ref new DataWriter(
-                    op->GetResults()->GetOutputStreamAt(0));
-                this->log_mutex_.Release();
-              });
-        } catch(Platform::Exception^) {
-          this->log_mutex_.Release();
-          SB_LOG(ERROR) << "Unable to open log file in folder "
-                        << win32::platformStringToString(folder->Name);
-        }
-      });
+          try {
+            auto task = op->GetResults()->OpenAsync(FileAccessMode::ReadWrite);
+            task->Completed =
+                ref new AsyncOperationCompletedHandler<IRandomAccessStream ^>(
+                    [this](IAsyncOperation<IRandomAccessStream ^> ^ op,
+                           AsyncStatus) {
+                      this->log_writer_ = ref new DataWriter(
+                          op->GetResults()->GetOutputStreamAt(0));
+                      this->log_mutex_.Release();
+                    });
+          } catch (Platform::Exception ^) {
+            this->log_mutex_.Release();
+            SB_LOG(ERROR) << "Unable to open log file in folder "
+                          << win32::platformStringToString(folder->Name);
+          }
+        });
   }
 
   void WriteToLogFile(const char* text, int text_length) {
@@ -120,17 +118,17 @@
     log_mutex_.Acquire();
     if (log_writer_) {
       log_writer_->WriteBytes(ref new Platform::Array<unsigned char>(
-          (unsigned char*) text, text_length));
+          (unsigned char*)text, text_length));
 
       // Manually set the completion callback function instead of using
       // concurrency::create_task() since those tasks may not execute before the
       // UI thread wants the log_mutex_ to output another log.
       auto task = log_writer_->StoreAsync();
       task->Completed = ref new AsyncOperationCompletedHandler<unsigned int>(
-          [this](IAsyncOperation<unsigned int>^, AsyncStatus) {
+          [this](IAsyncOperation<unsigned int> ^, AsyncStatus) {
             auto task = this->log_writer_->FlushAsync();
             task->Completed = ref new AsyncOperationCompletedHandler<bool>(
-                [this](IAsyncOperation<bool>^, AsyncStatus) {
+                [this](IAsyncOperation<bool> ^, AsyncStatus) {
                   this->log_mutex_.Release();
                 });
           });
@@ -142,12 +140,13 @@
   // The Windows Storage API must be used in order to access files in
   // privileged areas (e.g. KnownFolders::RemovableDevices). The win32
   // file API used by SbFile returns access denied errors in these situations.
-  DataWriter^ log_writer_ = nullptr;
+  DataWriter ^ log_writer_ = nullptr;
 };
 }  // namespace.
 
-scoped_ptr<ILogWriter> CreateLogWriterUWP(
-    Windows::Storage::StorageFolder^ folder, const char* filename) {
+scoped_ptr<ILogWriter> CreateLogWriterUWP(Windows::Storage::StorageFolder ^
+                                              folder,
+                                          const char* filename) {
   scoped_ptr<ILogWriter> output(new LogWriterUWP(folder, filename));
   return output.Pass();
 }
diff --git a/starboard/shared/uwp/log_writer_uwp.h b/starboard/shared/uwp/log_writer_uwp.h
index baa6729..5b88158 100644
--- a/starboard/shared/uwp/log_writer_uwp.h
+++ b/starboard/shared/uwp/log_writer_uwp.h
@@ -25,7 +25,8 @@
 namespace uwp {
 
 starboard::scoped_ptr<ILogWriter> CreateLogWriterUWP(
-    Windows::Storage::StorageFolder^ folder, const char* filename);
+    Windows::Storage::StorageFolder ^ folder,
+    const char* filename);
 
 }  // namespace uwp
 }  // namespace shared
diff --git a/starboard/shared/uwp/log_writer_win32.cc b/starboard/shared/uwp/log_writer_win32.cc
index 6533c8c..123ae79 100644
--- a/starboard/shared/uwp/log_writer_win32.cc
+++ b/starboard/shared/uwp/log_writer_win32.cc
@@ -35,20 +35,16 @@
   explicit LogWriterWin32(const std::string& file_path) {
     SbFileError out_error = kSbFileOk;
     bool created_ok = false;
-    file_.reset(
-        new ScopedFile(file_path.c_str(),
-                       kSbFileCreateAlways | kSbFileWrite,
-                       &created_ok,
-                       &out_error));
+    file_.reset(new ScopedFile(file_path.c_str(),
+                               kSbFileCreateAlways | kSbFileWrite, &created_ok,
+                               &out_error));
     if (!created_ok || out_error != kSbFileOk) {
       SB_LOG(ERROR) << "Could not create watchdog file " << file_path;
       file_.reset();
     }
   }
 
-  ~LogWriterWin32() {
-    FlushToDisk();
-  }
+  ~LogWriterWin32() { FlushToDisk(); }
 
   void Write(const char* content, int size) override {
     starboard::ScopedLock lock(mutex_);
@@ -59,11 +55,9 @@
   }
 
  private:
-  bool IsValid_Locked() const {
-    return file_ && file_->IsValid();
-  }
+  bool IsValid_Locked() const { return file_ && file_->IsValid(); }
 
-  void FlushToDisk()  {
+  void FlushToDisk() {
     starboard::ScopedLock lock(mutex_);
     if (IsValid_Locked()) {
       file_->Flush();
diff --git a/starboard/shared/uwp/media_is_video_supported.cc b/starboard/shared/uwp/media_is_video_supported.cc
index 5316a98..eab4c87 100644
--- a/starboard/shared/uwp/media_is_video_supported.cc
+++ b/starboard/shared/uwp/media_is_video_supported.cc
@@ -112,11 +112,7 @@
       case starboard::shared::uwp::kXboxOneX:
         // Horizontal video resolutions
         hw_decoder_capabilities_.AddSdrRule(kSbMediaVideoCodecVp9, 3840, 2160,
-                                            30);
-        hw_decoder_capabilities_.AddSdrRule(kSbMediaVideoCodecVp9, 2560, 1440,
                                             60);
-        // Until we can resolve b/170881040, we should cap Xbox One X to 2K for
-        // HDR 60 FPS.
         hw_decoder_capabilities_.AddHdrRule(kSbMediaVideoCodecVp9, 3840, 2160,
                                             30);
         hw_decoder_capabilities_.AddHdrRule(kSbMediaVideoCodecVp9, 2560, 1440,
@@ -124,7 +120,7 @@
         // Vertical video resolutions
         hw_decoder_capabilities_.AddSdrRule(kSbMediaVideoCodecVp9, 2160, 3840,
                                             30);
-        hw_decoder_capabilities_.AddSdrRule(kSbMediaVideoCodecVp9, 1440, 2560,
+        hw_decoder_capabilities_.AddSdrRule(kSbMediaVideoCodecVp9, 2160, 3840,
                                             60);
         hw_decoder_capabilities_.AddHdrRule(kSbMediaVideoCodecVp9, 2160, 3840,
                                             30);
diff --git a/starboard/shared/uwp/player_components_factory.cc b/starboard/shared/uwp/player_components_factory.cc
index 44d43f5..6963151 100644
--- a/starboard/shared/uwp/player_components_factory.cc
+++ b/starboard/shared/uwp/player_components_factory.cc
@@ -18,7 +18,6 @@
 
 #include <functional>
 
-#include "internal/starboard/xb1/shared/video_decoder_uwp.h"
 #include "starboard/common/device_type.h"
 #include "starboard/common/log.h"
 #include "starboard/common/ref_counted.h"
@@ -41,10 +40,11 @@
 #include "starboard/shared/uwp/audio_renderer_passthrough.h"
 #include "starboard/shared/uwp/extended_resources_manager.h"
 #include "starboard/shared/win32/audio_decoder.h"
+#include "starboard/xb1/shared/video_decoder_uwp.h"
 
 #if defined(INTERNAL_BUILD)
-#include "internal/starboard/xb1/internal/av1_video_decoder.h"
-#include "internal/starboard/xb1/internal/vpx_video_decoder.h"
+#include "internal/starboard/xb1/av1_video_decoder.h"
+#include "internal/starboard/xb1/vpx_video_decoder.h"
 #endif  // defined(INTERNAL_BUILD)
 
 namespace starboard {
diff --git a/starboard/shared/uwp/system_get_property.cc b/starboard/shared/uwp/system_get_property.cc
index fd534f5..42014fb 100644
--- a/starboard/shared/uwp/system_get_property.cc
+++ b/starboard/shared/uwp/system_get_property.cc
@@ -18,17 +18,17 @@
 #include <string>
 #include <vector>
 
-#include "internal/starboard/xb1/shared/internal_shims.h"
 #include "starboard/common/device_type.h"
 #include "starboard/common/log.h"
 #include "starboard/common/string.h"
 #include "starboard/configuration_constants.h"
-#include "starboard/keyboxes/xbox/system_properties.h"
 #include "starboard/memory.h"
 #include "starboard/shared/uwp/application_uwp.h"
 #include "starboard/shared/uwp/keys.h"
 #include "starboard/shared/win32/wchar_utils.h"
 #include "starboard/system.h"
+#include "starboard/xb1/shared/internal_shims.h"
+#include "starboard/xb1/system_properties.h"
 
 using starboard::shared::win32::platformStringToString;
 using Windows::Security::ExchangeActiveSyncProvisioning::
@@ -69,9 +69,6 @@
 // Chipset for unidentified device forms.
 const char kUnknownChipset[] = "UwpUnknown";
 
-// XOR key for certification secret.
-const char kRandomKey[] = "27539";
-
 bool CopyStringAndTestIfSuccess(char* out_value,
                                 int value_length,
                                 const char* from_value) {
@@ -93,15 +90,6 @@
   return result;
 }
 
-bool StartsWith(const std::string& str, const char* prefix) {
-  size_t len = strlen(prefix);
-  if (str.size() < len) {
-    return false;
-  }
-
-  return 0 == str.compare(0, len, prefix);
-}
-
 const std::size_t kOsVersionSize = 128;
 
 struct WindowsVersion {
@@ -269,15 +257,6 @@
                                     version_string.str().c_str());
 }
 
-size_t XorString(char* dest, const char* src) {
-  size_t keyLen = strlen(kRandomKey);
-  size_t ret = strlen(src);
-  for (size_t i = 0; i < ret; i++) {
-    dest[i] = src[i] ^ (kRandomKey[i % keyLen]);
-  }
-  return ret;
-}
-
 std::string GetAdvertisingId() {
   Platform::String ^ advertising_id = AdvertisingManager::AdvertisingId;
   return platformStringToString(advertising_id);
diff --git a/starboard/shared/uwp/system_platform_error_internal.h b/starboard/shared/uwp/system_platform_error_internal.h
index 19a4046..959aab3 100644
--- a/starboard/shared/uwp/system_platform_error_internal.h
+++ b/starboard/shared/uwp/system_platform_error_internal.h
@@ -25,21 +25,24 @@
   typedef starboard::shared::uwp::ApplicationUwp ApplicationUwp;
 
   SbSystemPlatformErrorPrivate(const SbSystemPlatformErrorPrivate&) = delete;
-  SbSystemPlatformErrorPrivate& operator=(const SbSystemPlatformErrorPrivate&)
-      = delete;
+  SbSystemPlatformErrorPrivate& operator=(const SbSystemPlatformErrorPrivate&) =
+      delete;
 
   SbSystemPlatformErrorPrivate(ApplicationUwp* app,
-      SbSystemPlatformErrorType type, SbSystemPlatformErrorCallback callback,
-      void* user_data);
+                               SbSystemPlatformErrorType type,
+                               SbSystemPlatformErrorCallback callback,
+                               void* user_data);
   bool IsValid() const;
   void ClearAndDelete();
 
  private:
   typedef Windows::UI::Popups::IUICommand IUICommand;
-  typedef Windows::Foundation::IAsyncOperation<IUICommand^> DialogOperation;
+  typedef Windows::Foundation::IAsyncOperation<IUICommand ^> DialogOperation;
 
-  IUICommand^ MakeUICommand(ApplicationUwp* app, const char* id,
-      const char* fallback, SbSystemPlatformErrorResponse response);
+  IUICommand ^ MakeUICommand(ApplicationUwp* app,
+                             const char* id,
+                             const char* fallback,
+                             SbSystemPlatformErrorResponse response);
 
   SbSystemPlatformErrorCallback callback_;
   void* user_data_;
diff --git a/starboard/shared/uwp/watchdog_log.cc b/starboard/shared/uwp/watchdog_log.cc
index aa35837..a7c1711 100644
--- a/starboard/shared/uwp/watchdog_log.cc
+++ b/starboard/shared/uwp/watchdog_log.cc
@@ -16,6 +16,7 @@
 
 #include <string>
 
+#include "starboard/common/file.h"
 #include "starboard/common/log.h"
 #include "starboard/common/scoped_ptr.h"
 #include "starboard/common/semaphore.h"
@@ -39,19 +40,16 @@
     Start();
   }
 
-  ~WatchDogThread() {
-    Join();
-  }
+  ~WatchDogThread() { Join(); }
 
   void Run() override {
     static const SbTime kSleepTime = kSbTimeMillisecond * 250;
     int counter = 0;
     bool created_ok = false;
     SbFileError out_error = kSbFileOk;
-    SbFile file_handle = SbFileOpen(file_path_.c_str(),
-                                    kSbFileCreateAlways | kSbFileWrite,
-                                    &created_ok,
-                                    &out_error);
+    SbFile file_handle =
+        SbFileOpen(file_path_.c_str(), kSbFileCreateAlways | kSbFileWrite,
+                   &created_ok, &out_error);
     if (!created_ok) {
       SB_LOG(ERROR) << "Could not create watchdog file " << file_path_;
       return;
@@ -60,11 +58,15 @@
       std::stringstream ss;
       ss << "alive: " << counter++ << "\n";
       std::string str = ss.str();
-      SbFileWrite(file_handle, str.c_str(), static_cast<int>(str.size()));
+      int result =
+          SbFileWrite(file_handle, str.c_str(), static_cast<int>(str.size()));
+      RecordFileWriteStat(result);
       SbFileFlush(file_handle);
     }
     const char kDone[] = "done\n";
-    SbFileWrite(file_handle, kDone, static_cast<int>(strlen(kDone)));
+    int result =
+        SbFileWrite(file_handle, kDone, static_cast<int>(strlen(kDone)));
+    RecordFileWriteStat(result);
     SbFileFlush(file_handle);
     SbThreadSleep(50 * kSbTimeMillisecond);
     bool closed = SbFileClose(file_handle);
diff --git a/starboard/shared/uwp/window_internal.cc b/starboard/shared/uwp/window_internal.cc
index accf538..b184af4 100644
--- a/starboard/shared/uwp/window_internal.cc
+++ b/starboard/shared/uwp/window_internal.cc
@@ -22,8 +22,7 @@
 using Windows::UI::Core::CoreWindow;
 
 SbWindowPrivate::SbWindowPrivate(int width, int height)
-    : width(width),
-      height(height) {
+    : width(width), height(height) {
   angle_property_set = ref new Windows::Foundation::Collections::PropertySet();
   angle_property_set->Insert(
       ref new Platform::String(EGLNativeWindowTypeProperty),
diff --git a/starboard/shared/uwp/window_internal.h b/starboard/shared/uwp/window_internal.h
index 004b931..374ab04 100644
--- a/starboard/shared/uwp/window_internal.h
+++ b/starboard/shared/uwp/window_internal.h
@@ -36,7 +36,7 @@
   int height;
 
  private:
-  Windows::Foundation::Collections::PropertySet^ angle_property_set;
+  Windows::Foundation::Collections::PropertySet ^ angle_property_set;
 };
 
 #endif  // STARBOARD_SHARED_UWP_WINDOW_INTERNAL_H_
diff --git a/starboard/shared/win32/atomic_public.h b/starboard/shared/win32/atomic_public.h
index 2d84281..1b9d429 100644
--- a/starboard/shared/win32/atomic_public.h
+++ b/starboard/shared/win32/atomic_public.h
@@ -25,49 +25,34 @@
 // Defined here to avoid including Windows headers
 // See https://msdn.microsoft.com/en-us/library/w5405h95.aspx
 
-long _InterlockedCompareExchange(
-  long volatile * Destination,
-  long Exchange,
-  long Comparand
-);
+long _InterlockedCompareExchange(  // NOLINT(runtime/int)
+    long volatile* Destination,    // NOLINT(runtime/int)
+    long Exchange,                 // NOLINT(runtime/int)
+    long Comparand);               // NOLINT(runtime/int)
 #pragma intrinsic(_InterlockedCompareExchange)
 
-__int64 _InterlockedCompareExchange64(
-  __int64 volatile * Destination,
-  __int64 Exchange,
-  __int64 Comparand
-);
+__int64 _InterlockedCompareExchange64(__int64 volatile* Destination,
+                                      __int64 Exchange,
+                                      __int64 Comparand);
 #pragma intrinsic(_InterlockedCompareExchange64)
 
-char _InterlockedCompareExchange8(
-  char volatile * Destination,
-  char Exchange,
-  char Comparand
-);
+char _InterlockedCompareExchange8(char volatile* Destination,
+                                  char Exchange,
+                                  char Comparand);
 #pragma intrinsic(_InterlockedCompareExchange8)
 
-long _InterlockedExchange(
-  long volatile * Target,
-  long Value
-);
+long _InterlockedExchange(long volatile* Target,  // NOLINT(runtime/int)
+                          long Value);            // NOLINT(runtime/int)
 #pragma intrinsic(_InterlockedExchange)
 
-__int64 _InterlockedExchange64(
-  __int64 volatile * Target,
-  __int64 Value
-);
+__int64 _InterlockedExchange64(__int64 volatile* Target, __int64 Value);
 #pragma intrinsic(_InterlockedExchange64)
 
-long _InterlockedExchangeAdd(
-  long volatile * Addend,
-  long Value
-);
+long _InterlockedExchangeAdd(long volatile* Addend,  // NOLINT(runtime/int)
+                             long Value);            // NOLINT(runtime/int)
 #pragma intrinsic(_InterlockedExchangeAdd)
 
-__int64 _InterlockedExchangeAdd64(
-  __int64 volatile * Addend,
-  __int64 Value
-);
+__int64 _InterlockedExchangeAdd64(__int64 volatile* Addend, __int64 Value);
 #pragma intrinsic(_InterlockedExchangeAdd64)
 
 void _ReadWriteBarrier(void);
@@ -79,13 +64,16 @@
                                  SbAtomic32 new_value) {
   // Note this does a full memory barrier
   return _InterlockedCompareExchange(
-      (volatile long*) ptr, (long) new_value, (long) old_value);
+      (volatile long*)ptr,  // NOLINT(runtime/int)
+      (long)new_value,      // NOLINT(runtime/int)
+      (long)old_value);     // NOLINT(runtime/int)
 }
 
 SB_C_FORCE_INLINE SbAtomic32
 SbAtomicNoBarrier_Exchange(volatile SbAtomic32* ptr, SbAtomic32 new_value) {
   // Note this does a full memory barrier
-  return _InterlockedExchange((volatile long*)ptr, (long)new_value);
+  return _InterlockedExchange((volatile long*)ptr,  // NOLINT(runtime/int)
+                              (long)new_value);     // NOLINT(runtime/int)
 }
 
 SB_C_FORCE_INLINE SbAtomic32
@@ -96,8 +84,9 @@
 SB_C_FORCE_INLINE SbAtomic32 SbAtomicBarrier_Increment(volatile SbAtomic32* ptr,
                                                        SbAtomic32 increment) {
   // Note InterlockedExchangeAdd does a full memory barrier
-  return increment + _InterlockedExchangeAdd(
-      (volatile long *)ptr, (long)increment);
+  return increment +
+         _InterlockedExchangeAdd((volatile long*)ptr,  // NOLINT(runtime/int)
+                                 (long)increment);     // NOLINT(runtime/int)
 }
 
 SB_C_FORCE_INLINE SbAtomic32
@@ -106,7 +95,9 @@
                                SbAtomic32 new_value) {
   // Note this does a full memory barrier
   return _InterlockedCompareExchange(
-      (volatile long*) ptr, (long) new_value, (long) old_value);
+      (volatile long*)ptr,  // NOLINT(runtime/int)
+      (long)new_value,      // NOLINT(runtime/int)
+      (long)old_value);     // NOLINT(runtime/int)
 }
 
 SB_C_FORCE_INLINE SbAtomic32
@@ -115,7 +106,9 @@
                                SbAtomic32 new_value) {
   // Note this does a full memory barrier
   return _InterlockedCompareExchange(
-      (volatile long*) ptr, (long) new_value, (long) old_value);
+      (volatile long*)ptr,  // NOLINT(runtime/int)
+      (long)new_value,      // NOLINT(runtime/int)
+      (long)old_value);     // NOLINT(runtime/int)
 }
 
 // NOTE: https://msdn.microsoft.com/en-us/library/f20w0x5e.aspx
@@ -163,14 +156,15 @@
 
 SB_C_FORCE_INLINE SbAtomic8
 SbAtomicRelease_CompareAndSwap8(volatile SbAtomic8* ptr,
-                               SbAtomic8 old_value,
-                               SbAtomic8 new_value) {
+                                SbAtomic8 old_value,
+                                SbAtomic8 new_value) {
   // Note this does a full memory barrier
-  return _InterlockedCompareExchange8((volatile char*)ptr, new_value, old_value);
+  return _InterlockedCompareExchange8((volatile char*)ptr, new_value,
+                                      old_value);
 }
 
-SB_C_FORCE_INLINE void
-SbAtomicNoBarrier_Store8(volatile SbAtomic8* ptr, SbAtomic8 value) {
+SB_C_FORCE_INLINE void SbAtomicNoBarrier_Store8(volatile SbAtomic8* ptr,
+                                                SbAtomic8 value) {
   *ptr = value;
 }
 
diff --git a/starboard/shared/win32/byte_swap.cc b/starboard/shared/win32/byte_swap.cc
index 2bf8c77..1394cea 100644
--- a/starboard/shared/win32/byte_swap.cc
+++ b/starboard/shared/win32/byte_swap.cc
@@ -15,6 +15,8 @@
 // Not breaking these functions up because however one is implemented, the
 // others should be implemented similarly.
 
+#if SB_API_VERSION < 16
+
 #include "starboard/common/byte_swap.h"
 
 #include <stdlib.h>
@@ -42,3 +44,5 @@
 uint64_t SbByteSwapU64(uint64_t value) {
   return _byteswap_uint64(value);
 }
+
+#endif
diff --git a/starboard/shared/win32/decrypting_decoder.cc b/starboard/shared/win32/decrypting_decoder.cc
index 9cb884f..0ef81fa 100644
--- a/starboard/shared/win32/decrypting_decoder.cc
+++ b/starboard/shared/win32/decrypting_decoder.cc
@@ -14,10 +14,11 @@
 
 #include "starboard/shared/win32/decrypting_decoder.h"
 
+#include <stdlib.h>
+
 #include <algorithm>
 #include <numeric>
 
-#include "starboard/common/byte_swap.h"
 #include "starboard/common/log.h"
 #include "starboard/common/memory.h"
 #include "starboard/common/ref_counted.h"
@@ -80,9 +81,9 @@
   SB_DCHECK(key_id_size == sizeof(GUID));
   GUID guid = *reinterpret_cast<const GUID*>(key_id);
 
-  guid.Data1 = SbByteSwapU32(guid.Data1);
-  guid.Data2 = SbByteSwapU16(guid.Data2);
-  guid.Data3 = SbByteSwapU16(guid.Data3);
+  guid.Data1 = _byteswap_ulong(guid.Data1);
+  guid.Data2 = _byteswap_ushort(guid.Data2);
+  guid.Data3 = _byteswap_ushort(guid.Data3);
 
   sample->SetGUID(MFSampleExtension_Content_KeyID, guid);
 
@@ -224,11 +225,13 @@
 }
 
 bool DecryptingDecoder::ProcessAndRead(ComPtr<IMFSample>* output,
-                                       ComPtr<IMFMediaType>* new_type) {
+                                       ComPtr<IMFMediaType>* new_type,
+                                       bool* has_error) {
   bool did_something = false;
 
   *output = decoder_->TryRead(new_type);
   did_something |= *output != NULL;
+  *has_error = decoder_->HasError();
 
   if (decryptor_) {
     if (!pending_decryptor_output_) {
diff --git a/starboard/shared/win32/decrypting_decoder.h b/starboard/shared/win32/decrypting_decoder.h
index 6ac9d62..674e54c 100644
--- a/starboard/shared/win32/decrypting_decoder.h
+++ b/starboard/shared/win32/decrypting_decoder.h
@@ -58,7 +58,8 @@
   // |new_type| contains the new output type in case the output type of the
   // decoding stream is changed.
   bool ProcessAndRead(ComPtr<IMFSample>* output,
-                      ComPtr<IMFMediaType>* new_type);
+                      ComPtr<IMFMediaType>* new_type,
+                      bool* has_error);
   void Drain();
   void Reset();
 
diff --git a/starboard/shared/win32/dialog.cc b/starboard/shared/win32/dialog.cc
index 1fafa5f..8784307 100644
--- a/starboard/shared/win32/dialog.cc
+++ b/starboard/shared/win32/dialog.cc
@@ -27,8 +27,8 @@
 
 typedef std::function<void()> DialogCallback;
 
-using starboard::shared::win32::DebugLogWinError;
 using starboard::shared::win32::CStringToWString;
+using starboard::shared::win32::DebugLogWinError;
 
 namespace {
 HWND g_current_dialog_handle = nullptr;
diff --git a/starboard/shared/win32/directory_create.cc b/starboard/shared/win32/directory_create.cc
index 8dcaf41..9df1a03 100644
--- a/starboard/shared/win32/directory_create.cc
+++ b/starboard/shared/win32/directory_create.cc
@@ -14,8 +14,8 @@
 
 #include "starboard/directory.h"
 
-#include <vector>
 #include <windows.h>
+#include <vector>
 
 #include "starboard/shared/win32/directory_internal.h"
 #include "starboard/shared/win32/file_internal.h"
diff --git a/starboard/shared/win32/drm_system_playready.cc b/starboard/shared/win32/drm_system_playready.cc
index 43a5f41..1e72c62 100644
--- a/starboard/shared/win32/drm_system_playready.cc
+++ b/starboard/shared/win32/drm_system_playready.cc
@@ -123,8 +123,8 @@
 
   ScopedLock lock(GetActiveDrmSystems()->mutex_);
   auto& active_systems = GetActiveDrmSystems()->active_systems_;
-  active_systems.erase(std::remove(
-      active_systems.begin(), active_systems.end(), this));
+  active_systems.erase(
+      std::remove(active_systems.begin(), active_systems.end(), this));
 }
 
 bool DrmSystemPlayready::IsKeySystemSupported(const char* key_system) {
@@ -332,9 +332,9 @@
   memcpy(&(drm_key_id.identifier), &key_id, sizeof(key_id));
   drm_key_id.identifier_size = sizeof(key_id);
 
-  key_statuses_changed_callback_(this, context_,
-      session_id.data(), static_cast<int>(session_id.size()),
-      1, &drm_key_id, &(item.status_));
+  key_statuses_changed_callback_(this, context_, session_id.data(),
+                                 static_cast<int>(session_id.size()), 1,
+                                 &drm_key_id, &(item.status_));
 }
 
 scoped_refptr<DrmSystemPlayready::License> DrmSystemPlayready::GetLicense(
@@ -359,8 +359,8 @@
 
 void DrmSystemPlayready::OnUwpResume() {
   for (auto& item : successful_requests_) {
-    session_closed_callback_(this, context_,
-        item.first.data(), static_cast<int>(item.first.size()));
+    session_closed_callback_(this, context_, item.first.data(),
+                             static_cast<int>(item.first.size()));
   }
 }
 
diff --git a/starboard/shared/win32/drm_system_playready.h b/starboard/shared/win32/drm_system_playready.h
index efcade1..cda8653 100644
--- a/starboard/shared/win32/drm_system_playready.h
+++ b/starboard/shared/win32/drm_system_playready.h
@@ -88,8 +88,7 @@
   bool IsServerCertificateUpdatable() override { return false; }
   void UpdateServerCertificate(int ticket,
                                const void* certificate,
-                               int certificate_size) override {
-  }
+                               int certificate_size) override {}
 
   const void* GetMetrics(int* size) override { return NULL; }
 
diff --git a/starboard/shared/win32/error_utils.cc b/starboard/shared/win32/error_utils.cc
index fa3e7a4..a14304b 100644
--- a/starboard/shared/win32/error_utils.cc
+++ b/starboard/shared/win32/error_utils.cc
@@ -38,8 +38,7 @@
       FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER |
           FORMAT_MESSAGE_IGNORE_INSERTS,
       nullptr,  // Unused with FORMAT_MESSAGE_FROM_SYSTEM.
-      hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-      (LPTSTR)&error_message,
+      hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&error_message,
       0,  // Minimum size for output buffer.
       nullptr);
   SB_DCHECK(message_size);
@@ -50,95 +49,95 @@
 
 #define MAKE_HR_PAIR(X) std::pair<HRESULT, std::string>(X, #X)
 const std::pair<HRESULT, std::string> kHresultValueStrings[] = {
-  MAKE_HR_PAIR(S_OK),
-  MAKE_HR_PAIR(MF_E_PLATFORM_NOT_INITIALIZED),
-  MAKE_HR_PAIR(MF_E_BUFFERTOOSMALL),
-  MAKE_HR_PAIR(MF_E_INVALIDREQUEST),
-  MAKE_HR_PAIR(MF_E_INVALIDSTREAMNUMBER),
-  MAKE_HR_PAIR(MF_E_INVALIDMEDIATYPE),
-  MAKE_HR_PAIR(MF_E_NOTACCEPTING),
-  MAKE_HR_PAIR(MF_E_NOT_INITIALIZED),
-  MAKE_HR_PAIR(MF_E_UNSUPPORTED_REPRESENTATION),
-  MAKE_HR_PAIR(MF_E_NO_MORE_TYPES),
-  MAKE_HR_PAIR(MF_E_UNSUPPORTED_SERVICE),
-  MAKE_HR_PAIR(MF_E_UNEXPECTED),
-  MAKE_HR_PAIR(MF_E_INVALIDNAME),
-  MAKE_HR_PAIR(MF_E_INVALIDTYPE),
-  MAKE_HR_PAIR(MF_E_INVALID_FILE_FORMAT),
-  MAKE_HR_PAIR(MF_E_INVALIDINDEX),
-  MAKE_HR_PAIR(MF_E_INVALID_TIMESTAMP),
-  MAKE_HR_PAIR(MF_E_UNSUPPORTED_SCHEME),
-  MAKE_HR_PAIR(MF_E_UNSUPPORTED_BYTESTREAM_TYPE),
-  MAKE_HR_PAIR(MF_E_UNSUPPORTED_TIME_FORMAT),
-  MAKE_HR_PAIR(MF_E_NO_SAMPLE_TIMESTAMP),
-  MAKE_HR_PAIR(MF_E_NO_SAMPLE_DURATION),
-  MAKE_HR_PAIR(MF_E_INVALID_STREAM_DATA),
-  MAKE_HR_PAIR(MF_E_RT_UNAVAILABLE),
-  MAKE_HR_PAIR(MF_E_UNSUPPORTED_RATE),
-  MAKE_HR_PAIR(MF_E_THINNING_UNSUPPORTED),
-  MAKE_HR_PAIR(MF_E_REVERSE_UNSUPPORTED),
-  MAKE_HR_PAIR(MF_E_UNSUPPORTED_RATE_TRANSITION),
-  MAKE_HR_PAIR(MF_E_RATE_CHANGE_PREEMPTED),
-  MAKE_HR_PAIR(MF_E_NOT_FOUND),
-  MAKE_HR_PAIR(MF_E_NOT_AVAILABLE),
-  MAKE_HR_PAIR(MF_E_NO_CLOCK),
-  MAKE_HR_PAIR(MF_S_MULTIPLE_BEGIN),
-  MAKE_HR_PAIR(MF_E_MULTIPLE_BEGIN),
-  MAKE_HR_PAIR(MF_E_MULTIPLE_SUBSCRIBERS),
-  MAKE_HR_PAIR(MF_E_TIMER_ORPHANED),
-  MAKE_HR_PAIR(MF_E_STATE_TRANSITION_PENDING),
-  MAKE_HR_PAIR(MF_E_UNSUPPORTED_STATE_TRANSITION),
-  MAKE_HR_PAIR(MF_E_UNRECOVERABLE_ERROR_OCCURRED),
-  MAKE_HR_PAIR(MF_E_SAMPLE_HAS_TOO_MANY_BUFFERS),
-  MAKE_HR_PAIR(MF_E_SAMPLE_NOT_WRITABLE),
-  MAKE_HR_PAIR(MF_E_INVALID_KEY),
-  MAKE_HR_PAIR(MF_E_BAD_STARTUP_VERSION),
-  MAKE_HR_PAIR(MF_E_UNSUPPORTED_CAPTION),
-  MAKE_HR_PAIR(MF_E_INVALID_POSITION),
-  MAKE_HR_PAIR(MF_E_ATTRIBUTENOTFOUND),
-  MAKE_HR_PAIR(MF_E_PROPERTY_TYPE_NOT_ALLOWED),
-  MAKE_HR_PAIR(MF_E_TOPO_INVALID_OPTIONAL_NODE),
-  MAKE_HR_PAIR(MF_E_TOPO_CANNOT_FIND_DECRYPTOR),
-  MAKE_HR_PAIR(MF_E_TOPO_CODEC_NOT_FOUND),
-  MAKE_HR_PAIR(MF_E_TOPO_CANNOT_CONNECT),
-  MAKE_HR_PAIR(MF_E_TOPO_UNSUPPORTED),
-  MAKE_HR_PAIR(MF_E_TOPO_INVALID_TIME_ATTRIBUTES),
-  MAKE_HR_PAIR(MF_E_TOPO_LOOPS_IN_TOPOLOGY),
-  MAKE_HR_PAIR(MF_E_TOPO_MISSING_PRESENTATION_DESCRIPTOR),
-  MAKE_HR_PAIR(MF_E_TOPO_MISSING_STREAM_DESCRIPTOR),
-  MAKE_HR_PAIR(MF_E_TOPO_STREAM_DESCRIPTOR_NOT_SELECTED),
-  MAKE_HR_PAIR(MF_E_TOPO_MISSING_SOURCE),
-  MAKE_HR_PAIR(MF_E_TOPO_SINK_ACTIVATES_UNSUPPORTED),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_TYPE_NOT_SET),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_STREAM_CHANGE),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_INPUT_REMAINING),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_PROFILE_MISSING),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_PROFILE_INVALID_OR_CORRUPT),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_PROFILE_TRUNCATED),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_PID_NOT_RECOGNIZED),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_VARIANT_TYPE_WRONG),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_NOT_WRITEABLE),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_ARRAY_VALUE_WRONG_NUM_DIM),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_VALUE_SIZE_WRONG),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_VALUE_OUT_OF_RANGE),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_VALUE_INCOMPATIBLE),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_OUTPUT_MEDIATYPE),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_INPUT_MEDIATYPE),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_MEDIATYPE_COMBINATION),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_CONFLICTS_WITH_OTHER_CURRENTLY_ENABLED_FEATURES),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_NEED_MORE_INPUT),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_SPKR_CONFIG),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING),
-  MAKE_HR_PAIR(MF_S_TRANSFORM_DO_NOT_PROPAGATE_EVENT),
-  MAKE_HR_PAIR(MF_E_UNSUPPORTED_D3D_TYPE),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_ASYNC_LOCKED),
-  MAKE_HR_PAIR(MF_E_TRANSFORM_CANNOT_INITIALIZE_ACM_DRIVER),
+    MAKE_HR_PAIR(S_OK),
+    MAKE_HR_PAIR(MF_E_PLATFORM_NOT_INITIALIZED),
+    MAKE_HR_PAIR(MF_E_BUFFERTOOSMALL),
+    MAKE_HR_PAIR(MF_E_INVALIDREQUEST),
+    MAKE_HR_PAIR(MF_E_INVALIDSTREAMNUMBER),
+    MAKE_HR_PAIR(MF_E_INVALIDMEDIATYPE),
+    MAKE_HR_PAIR(MF_E_NOTACCEPTING),
+    MAKE_HR_PAIR(MF_E_NOT_INITIALIZED),
+    MAKE_HR_PAIR(MF_E_UNSUPPORTED_REPRESENTATION),
+    MAKE_HR_PAIR(MF_E_NO_MORE_TYPES),
+    MAKE_HR_PAIR(MF_E_UNSUPPORTED_SERVICE),
+    MAKE_HR_PAIR(MF_E_UNEXPECTED),
+    MAKE_HR_PAIR(MF_E_INVALIDNAME),
+    MAKE_HR_PAIR(MF_E_INVALIDTYPE),
+    MAKE_HR_PAIR(MF_E_INVALID_FILE_FORMAT),
+    MAKE_HR_PAIR(MF_E_INVALIDINDEX),
+    MAKE_HR_PAIR(MF_E_INVALID_TIMESTAMP),
+    MAKE_HR_PAIR(MF_E_UNSUPPORTED_SCHEME),
+    MAKE_HR_PAIR(MF_E_UNSUPPORTED_BYTESTREAM_TYPE),
+    MAKE_HR_PAIR(MF_E_UNSUPPORTED_TIME_FORMAT),
+    MAKE_HR_PAIR(MF_E_NO_SAMPLE_TIMESTAMP),
+    MAKE_HR_PAIR(MF_E_NO_SAMPLE_DURATION),
+    MAKE_HR_PAIR(MF_E_INVALID_STREAM_DATA),
+    MAKE_HR_PAIR(MF_E_RT_UNAVAILABLE),
+    MAKE_HR_PAIR(MF_E_UNSUPPORTED_RATE),
+    MAKE_HR_PAIR(MF_E_THINNING_UNSUPPORTED),
+    MAKE_HR_PAIR(MF_E_REVERSE_UNSUPPORTED),
+    MAKE_HR_PAIR(MF_E_UNSUPPORTED_RATE_TRANSITION),
+    MAKE_HR_PAIR(MF_E_RATE_CHANGE_PREEMPTED),
+    MAKE_HR_PAIR(MF_E_NOT_FOUND),
+    MAKE_HR_PAIR(MF_E_NOT_AVAILABLE),
+    MAKE_HR_PAIR(MF_E_NO_CLOCK),
+    MAKE_HR_PAIR(MF_S_MULTIPLE_BEGIN),
+    MAKE_HR_PAIR(MF_E_MULTIPLE_BEGIN),
+    MAKE_HR_PAIR(MF_E_MULTIPLE_SUBSCRIBERS),
+    MAKE_HR_PAIR(MF_E_TIMER_ORPHANED),
+    MAKE_HR_PAIR(MF_E_STATE_TRANSITION_PENDING),
+    MAKE_HR_PAIR(MF_E_UNSUPPORTED_STATE_TRANSITION),
+    MAKE_HR_PAIR(MF_E_UNRECOVERABLE_ERROR_OCCURRED),
+    MAKE_HR_PAIR(MF_E_SAMPLE_HAS_TOO_MANY_BUFFERS),
+    MAKE_HR_PAIR(MF_E_SAMPLE_NOT_WRITABLE),
+    MAKE_HR_PAIR(MF_E_INVALID_KEY),
+    MAKE_HR_PAIR(MF_E_BAD_STARTUP_VERSION),
+    MAKE_HR_PAIR(MF_E_UNSUPPORTED_CAPTION),
+    MAKE_HR_PAIR(MF_E_INVALID_POSITION),
+    MAKE_HR_PAIR(MF_E_ATTRIBUTENOTFOUND),
+    MAKE_HR_PAIR(MF_E_PROPERTY_TYPE_NOT_ALLOWED),
+    MAKE_HR_PAIR(MF_E_TOPO_INVALID_OPTIONAL_NODE),
+    MAKE_HR_PAIR(MF_E_TOPO_CANNOT_FIND_DECRYPTOR),
+    MAKE_HR_PAIR(MF_E_TOPO_CODEC_NOT_FOUND),
+    MAKE_HR_PAIR(MF_E_TOPO_CANNOT_CONNECT),
+    MAKE_HR_PAIR(MF_E_TOPO_UNSUPPORTED),
+    MAKE_HR_PAIR(MF_E_TOPO_INVALID_TIME_ATTRIBUTES),
+    MAKE_HR_PAIR(MF_E_TOPO_LOOPS_IN_TOPOLOGY),
+    MAKE_HR_PAIR(MF_E_TOPO_MISSING_PRESENTATION_DESCRIPTOR),
+    MAKE_HR_PAIR(MF_E_TOPO_MISSING_STREAM_DESCRIPTOR),
+    MAKE_HR_PAIR(MF_E_TOPO_STREAM_DESCRIPTOR_NOT_SELECTED),
+    MAKE_HR_PAIR(MF_E_TOPO_MISSING_SOURCE),
+    MAKE_HR_PAIR(MF_E_TOPO_SINK_ACTIVATES_UNSUPPORTED),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_TYPE_NOT_SET),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_STREAM_CHANGE),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_INPUT_REMAINING),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_PROFILE_MISSING),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_PROFILE_INVALID_OR_CORRUPT),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_PROFILE_TRUNCATED),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_PID_NOT_RECOGNIZED),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_VARIANT_TYPE_WRONG),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_NOT_WRITEABLE),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_ARRAY_VALUE_WRONG_NUM_DIM),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_VALUE_SIZE_WRONG),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_VALUE_OUT_OF_RANGE),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_VALUE_INCOMPATIBLE),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_OUTPUT_MEDIATYPE),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_INPUT_MEDIATYPE),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_MEDIATYPE_COMBINATION),
+    MAKE_HR_PAIR(
+        MF_E_TRANSFORM_CONFLICTS_WITH_OTHER_CURRENTLY_ENABLED_FEATURES),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_NEED_MORE_INPUT),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_SPKR_CONFIG),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING),
+    MAKE_HR_PAIR(MF_S_TRANSFORM_DO_NOT_PROPAGATE_EVENT),
+    MAKE_HR_PAIR(MF_E_UNSUPPORTED_D3D_TYPE),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_ASYNC_LOCKED),
+    MAKE_HR_PAIR(MF_E_TRANSFORM_CANNOT_INITIALIZE_ACM_DRIVER),
 };
 #undef MAKE_HR_PAIR
 
 bool FindHResultEnumString(HRESULT hr, std::string* output) {
-  const size_t n = sizeof(kHresultValueStrings) /
-                   sizeof(*kHresultValueStrings);
+  const size_t n = sizeof(kHresultValueStrings) / sizeof(*kHresultValueStrings);
 
   for (auto i = 0; i < n; ++i) {
     const auto& elems = kHresultValueStrings[i];
diff --git a/starboard/shared/win32/file_can_open.cc b/starboard/shared/win32/file_can_open.cc
index 4e78d34..8f830b2 100644
--- a/starboard/shared/win32/file_can_open.cc
+++ b/starboard/shared/win32/file_can_open.cc
@@ -43,7 +43,8 @@
   bool can_open = true;
 
   if (((find_data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) && can_write) ||
-      !starboard::shared::win32::PathEndsWith(path_wstring, find_data.cFileName)) {
+      !starboard::shared::win32::PathEndsWith(path_wstring,
+                                              find_data.cFileName)) {
     can_open = false;
   }
 
diff --git a/starboard/shared/win32/file_internal.cc b/starboard/shared/win32/file_internal.cc
index 84c9bcd..b4835b6 100644
--- a/starboard/shared/win32/file_internal.cc
+++ b/starboard/shared/win32/file_internal.cc
@@ -87,8 +87,8 @@
   // are other handles open for read/write. This is necessary for the
   // Async file tests which, due to system timing, will sometimes have
   // outstanding handles open and fail to delete, failing the test.
-  const DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE |
-                           FILE_SHARE_DELETE;
+  const DWORD share_mode =
+      FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
 
   DWORD creation_disposition = 0;
   if (flags & kSbFileCreateOnly) {
diff --git a/starboard/shared/win32/file_open.cc b/starboard/shared/win32/file_open.cc
index 6d7c18e..2aa6182 100644
--- a/starboard/shared/win32/file_open.cc
+++ b/starboard/shared/win32/file_open.cc
@@ -30,8 +30,8 @@
     return kSbFileInvalid;
   }
 
-  HANDLE file_handle =
-      starboard::shared::win32::OpenFileOrDirectory(path, flags, out_created, out_error);
+  HANDLE file_handle = starboard::shared::win32::OpenFileOrDirectory(
+      path, flags, out_created, out_error);
 
   if (!starboard::shared::win32::IsValidHandle(file_handle)) {
     return kSbFileInvalid;
diff --git a/starboard/shared/win32/log_file_impl.cc b/starboard/shared/win32/log_file_impl.cc
index 58904a0..04f1969 100644
--- a/starboard/shared/win32/log_file_impl.cc
+++ b/starboard/shared/win32/log_file_impl.cc
@@ -17,6 +17,7 @@
 #include <string>
 #include <vector>
 
+#include "starboard/common/file.h"
 #include "starboard/common/log.h"
 #include "starboard/common/mutex.h"
 #include "starboard/common/string.h"
@@ -107,6 +108,7 @@
   }
 
   int bytes_written = SbFileWriteAll(log_file, text, text_length);
+  RecordFileWriteStat(bytes_written);
   SB_DCHECK(text_length == bytes_written);
 
   SbFileFlush(log_file);
diff --git a/starboard/shared/win32/log_raw.cc b/starboard/shared/win32/log_raw.cc
index 77c3efd..dd9dcd7 100644
--- a/starboard/shared/win32/log_raw.cc
+++ b/starboard/shared/win32/log_raw.cc
@@ -26,8 +26,7 @@
 void SbLogRaw(const char* message) {
   fprintf(stderr, "%s", message);
   OutputDebugStringA(message);
-  sbwin32::WriteToLogFile(
-      message, static_cast<int>(strlen(message)));
+  sbwin32::WriteToLogFile(message, static_cast<int>(strlen(message)));
 
   starboard::shared::starboard::NetLogWrite(message);
 }
diff --git a/starboard/shared/win32/log_raw_format.cc b/starboard/shared/win32/log_raw_format.cc
index cdae664..4eda23c 100644
--- a/starboard/shared/win32/log_raw_format.cc
+++ b/starboard/shared/win32/log_raw_format.cc
@@ -25,7 +25,7 @@
 
 void SbLogRawFormat(const char* format, va_list arguments) {
   char log_buffer[kMaxLogLineChars] = {0};
-  int result = vsprintf_s(log_buffer, kMaxLogLineChars-1, format, arguments);
+  int result = vsprintf_s(log_buffer, kMaxLogLineChars - 1, format, arguments);
   if (result > 0) {
     SbLogRaw(log_buffer);
   } else {
diff --git a/starboard/shared/win32/media_foundation_utils.cc b/starboard/shared/win32/media_foundation_utils.cc
index 052b392..f07ed62 100644
--- a/starboard/shared/win32/media_foundation_utils.cc
+++ b/starboard/shared/win32/media_foundation_utils.cc
@@ -35,45 +35,45 @@
 #define MAKE_GUID_PAIR(X) std::pair<GUID, std::string>(X, #X)
 
 const std::pair<GUID, std::string> kMfMtAudio[] = {
-  MAKE_GUID_PAIR(MF_MT_AAC_PAYLOAD_TYPE),
-  MAKE_GUID_PAIR(MF_MT_AUDIO_AVG_BYTES_PER_SECOND),
-  MAKE_GUID_PAIR(MF_MT_AUDIO_BITS_PER_SAMPLE),
-  MAKE_GUID_PAIR(MF_MT_AUDIO_BLOCK_ALIGNMENT),
-  MAKE_GUID_PAIR(MF_MT_AUDIO_CHANNEL_MASK),
-  MAKE_GUID_PAIR(MF_MT_AUDIO_FLOAT_SAMPLES_PER_SECOND),
-  MAKE_GUID_PAIR(MF_MT_AUDIO_NUM_CHANNELS),
-  MAKE_GUID_PAIR(MF_MT_AUDIO_SAMPLES_PER_BLOCK),
-  MAKE_GUID_PAIR(MF_MT_AUDIO_SAMPLES_PER_SECOND),
-  MAKE_GUID_PAIR(MF_MT_AUDIO_NUM_CHANNELS),
-  MAKE_GUID_PAIR(MF_MT_MAJOR_TYPE),
-  MAKE_GUID_PAIR(MF_MT_AUDIO_PREFER_WAVEFORMATEX),
-  MAKE_GUID_PAIR(MF_MT_USER_DATA),
-  MAKE_GUID_PAIR(MF_MT_SUBTYPE),
-  MAKE_GUID_PAIR(MFAudioFormat_AAC),
-  MAKE_GUID_PAIR(MFAudioFormat_ADTS),
-  MAKE_GUID_PAIR(MFAudioFormat_ALAC),
-  MAKE_GUID_PAIR(MFAudioFormat_AMR_NB),
-  MAKE_GUID_PAIR(MFAudioFormat_AMR_WB),
-  MAKE_GUID_PAIR(MFAudioFormat_AMR_WP),
-  MAKE_GUID_PAIR(MFAudioFormat_Dolby_AC3),
-  MAKE_GUID_PAIR(MFAudioFormat_Dolby_AC3_SPDIF),
-  MAKE_GUID_PAIR(MFAudioFormat_Dolby_DDPlus),
-  MAKE_GUID_PAIR(MFAudioFormat_DRM),
-  MAKE_GUID_PAIR(MFAudioFormat_DTS),
-  MAKE_GUID_PAIR(MFAudioFormat_FLAC),
-  MAKE_GUID_PAIR(MFAudioFormat_Float),
-  MAKE_GUID_PAIR(MFAudioFormat_Float_SpatialObjects),
-  MAKE_GUID_PAIR(MFAudioFormat_MP3),
-  MAKE_GUID_PAIR(MFAudioFormat_MPEG),
-  MAKE_GUID_PAIR(MFAudioFormat_MSP1),
-  MAKE_GUID_PAIR(MFAudioFormat_Opus),
-  MAKE_GUID_PAIR(MFAudioFormat_PCM),
-  MAKE_GUID_PAIR(MFAudioFormat_WMASPDIF),
-  MAKE_GUID_PAIR(MFAudioFormat_WMAudio_Lossless),
-  MAKE_GUID_PAIR(MFAudioFormat_WMAudioV8),
-  MAKE_GUID_PAIR(MFAudioFormat_WMAudioV9),
-  MAKE_GUID_PAIR(MFAudioFormat_WMAudioV9),
-  MAKE_GUID_PAIR(MFMediaType_Audio),
+    MAKE_GUID_PAIR(MF_MT_AAC_PAYLOAD_TYPE),
+    MAKE_GUID_PAIR(MF_MT_AUDIO_AVG_BYTES_PER_SECOND),
+    MAKE_GUID_PAIR(MF_MT_AUDIO_BITS_PER_SAMPLE),
+    MAKE_GUID_PAIR(MF_MT_AUDIO_BLOCK_ALIGNMENT),
+    MAKE_GUID_PAIR(MF_MT_AUDIO_CHANNEL_MASK),
+    MAKE_GUID_PAIR(MF_MT_AUDIO_FLOAT_SAMPLES_PER_SECOND),
+    MAKE_GUID_PAIR(MF_MT_AUDIO_NUM_CHANNELS),
+    MAKE_GUID_PAIR(MF_MT_AUDIO_SAMPLES_PER_BLOCK),
+    MAKE_GUID_PAIR(MF_MT_AUDIO_SAMPLES_PER_SECOND),
+    MAKE_GUID_PAIR(MF_MT_AUDIO_NUM_CHANNELS),
+    MAKE_GUID_PAIR(MF_MT_MAJOR_TYPE),
+    MAKE_GUID_PAIR(MF_MT_AUDIO_PREFER_WAVEFORMATEX),
+    MAKE_GUID_PAIR(MF_MT_USER_DATA),
+    MAKE_GUID_PAIR(MF_MT_SUBTYPE),
+    MAKE_GUID_PAIR(MFAudioFormat_AAC),
+    MAKE_GUID_PAIR(MFAudioFormat_ADTS),
+    MAKE_GUID_PAIR(MFAudioFormat_ALAC),
+    MAKE_GUID_PAIR(MFAudioFormat_AMR_NB),
+    MAKE_GUID_PAIR(MFAudioFormat_AMR_WB),
+    MAKE_GUID_PAIR(MFAudioFormat_AMR_WP),
+    MAKE_GUID_PAIR(MFAudioFormat_Dolby_AC3),
+    MAKE_GUID_PAIR(MFAudioFormat_Dolby_AC3_SPDIF),
+    MAKE_GUID_PAIR(MFAudioFormat_Dolby_DDPlus),
+    MAKE_GUID_PAIR(MFAudioFormat_DRM),
+    MAKE_GUID_PAIR(MFAudioFormat_DTS),
+    MAKE_GUID_PAIR(MFAudioFormat_FLAC),
+    MAKE_GUID_PAIR(MFAudioFormat_Float),
+    MAKE_GUID_PAIR(MFAudioFormat_Float_SpatialObjects),
+    MAKE_GUID_PAIR(MFAudioFormat_MP3),
+    MAKE_GUID_PAIR(MFAudioFormat_MPEG),
+    MAKE_GUID_PAIR(MFAudioFormat_MSP1),
+    MAKE_GUID_PAIR(MFAudioFormat_Opus),
+    MAKE_GUID_PAIR(MFAudioFormat_PCM),
+    MAKE_GUID_PAIR(MFAudioFormat_WMASPDIF),
+    MAKE_GUID_PAIR(MFAudioFormat_WMAudio_Lossless),
+    MAKE_GUID_PAIR(MFAudioFormat_WMAudioV8),
+    MAKE_GUID_PAIR(MFAudioFormat_WMAudioV9),
+    MAKE_GUID_PAIR(MFAudioFormat_WMAudioV9),
+    MAKE_GUID_PAIR(MFMediaType_Audio),
 };
 #undef MAKE_GUID_PAIR
 
@@ -132,7 +132,8 @@
 
       case MF_ATTRIBUTE_BLOB: {
         // Skip.
-        ss << "<BLOB>" << "\n";
+        ss << "<BLOB>"
+           << "\n";
         break;
       }
 
diff --git a/starboard/shared/win32/media_foundation_utils.h b/starboard/shared/win32/media_foundation_utils.h
index 8b5be47..6d96080 100644
--- a/starboard/shared/win32/media_foundation_utils.h
+++ b/starboard/shared/win32/media_foundation_utils.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <wrl/client.h>
 #include <Mfobjects.h>
+#include <wrl/client.h>
 
 #include <string>
 
diff --git a/starboard/shared/win32/media_transform.cc b/starboard/shared/win32/media_transform.cc
index a724231..6367f80 100644
--- a/starboard/shared/win32/media_transform.cc
+++ b/starboard/shared/win32/media_transform.cc
@@ -101,7 +101,7 @@
   SB_DCHECK(thread_checker_.CalledOnValidThread());
   SB_DCHECK(new_type);
 
-  if (state_ == kDrained || !transform_) {
+  if (state_ == kDrained || !transform_ || state_ == kInvalidInput) {
     return NULL;
   }
 
@@ -130,9 +130,10 @@
 
   if (FAILED(hr)) {
     // Sometimes the decryptor refuse to emit output after shutting down.
-    SB_DCHECK(hr == MF_E_INVALIDREQUEST);
-    if (state_ == kDraining) {
+    if (hr == MF_E_INVALIDREQUEST && state_ == kDraining) {
       state_ = kDrained;
+    } else {
+      state_ = kInvalidInput;
     }
     return NULL;
   }
@@ -179,6 +180,11 @@
   return state_ == kDrained;
 }
 
+bool MediaTransform::HasError() const {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  return state_ == kInvalidInput;
+}
+
 bool MediaTransform::HasValidTransform() const {
   return transform_ ? true : false;
 }
diff --git a/starboard/shared/win32/media_transform.h b/starboard/shared/win32/media_transform.h
index 79e7072..ecc9abd 100644
--- a/starboard/shared/win32/media_transform.h
+++ b/starboard/shared/win32/media_transform.h
@@ -58,6 +58,7 @@
   void Drain();
   bool draining() const;
   bool drained() const;
+  bool HasError() const;
   // Once the transform is drained, this function can be called to allow the
   // transform to accept new input as a newly created transform.  This allows
   // the reuse of existing transform without re-negotiating all types and
@@ -87,7 +88,13 @@
   void Reset();
 
  private:
-  enum State { kCanAcceptInput, kCanProvideOutput, kDraining, kDrained };
+  enum State {
+    kCanAcceptInput,
+    kCanProvideOutput,
+    kDraining,
+    kDrained,
+    kInvalidInput
+  };
 
   void PrepareOutputDataBuffer(MFT_OUTPUT_DATA_BUFFER* output_data_buffer);
   HRESULT ProcessOutput(Microsoft::WRL::ComPtr<IMFSample>* sample);
diff --git a/starboard/shared/win32/memory_map.cc b/starboard/shared/win32/memory_map.cc
index ae3aa52..529f8d1 100644
--- a/starboard/shared/win32/memory_map.cc
+++ b/starboard/shared/win32/memory_map.cc
@@ -17,7 +17,6 @@
 #include <windows.h>
 
 #include "starboard/common/log.h"
-#include "starboard/shared/starboard/memory_reporter_internal.h"
 
 void* SbMemoryMap(int64_t size_bytes, int flags, const char* name) {
   if (size_bytes == 0) {
@@ -46,10 +45,7 @@
 
   void* memory = VirtualAllocFromApp(
       NULL, size_bytes,
-     (flags == kSbMemoryMapProtectReserved) ? MEM_RESERVE : MEM_COMMIT,
+      (flags == kSbMemoryMapProtectReserved) ? MEM_RESERVE : MEM_COMMIT,
       protect);
-  if (PAGE_READONLY != protect) {
-    SbMemoryReporterReportMappedMemory(memory, size_bytes);
-  }
   return memory;
 }
diff --git a/starboard/shared/win32/memory_unmap.cc b/starboard/shared/win32/memory_unmap.cc
index 37ee710..03868db 100644
--- a/starboard/shared/win32/memory_unmap.cc
+++ b/starboard/shared/win32/memory_unmap.cc
@@ -16,12 +16,9 @@
 
 #include <windows.h>
 
-#include "starboard/shared/starboard/memory_reporter_internal.h"
-
 bool SbMemoryUnmap(void* virtual_address, int64_t size_bytes) {
   // Note that SbMemoryUnmap documentation says that "This function can
   // unmap multiple contiguous regions that were mapped with separate calls
   // to SbMemoryMap()". Because of that, we cannot use MEM_FREE here.
-  SbMemoryReporterReportUnmappedMemory(virtual_address, size_bytes);
   return VirtualFree(virtual_address, size_bytes, MEM_DECOMMIT);
 }
diff --git a/starboard/shared/win32/socket_create.cc b/starboard/shared/win32/socket_create.cc
index ecceaaf..65c1786 100644
--- a/starboard/shared/win32/socket_create.cc
+++ b/starboard/shared/win32/socket_create.cc
@@ -14,8 +14,11 @@
 
 #include "starboard/common/socket.h"
 
+// WinSock includes need to be in particular order
+// clang-format off
 #include <winsock2.h>
 #include <mswsock.h>
+// clang-format on
 
 #include "starboard/common/log.h"
 #include "starboard/shared/win32/set_non_blocking_internal.h"
diff --git a/starboard/shared/win32/socket_get_interface_address.cc b/starboard/shared/win32/socket_get_interface_address.cc
index 5d0929a..ed0ef19 100644
--- a/starboard/shared/win32/socket_get_interface_address.cc
+++ b/starboard/shared/win32/socket_get_interface_address.cc
@@ -122,8 +122,8 @@
 bool GetNetmaskForInterfaceAddress(const SbSocketAddress& interface_address,
                                    SbSocketAddress* out_netmask) {
   std::unique_ptr<char[]> adapter_info_memory_block;
-  if (!sbwin32::GetAdapters(
-      interface_address.type, &adapter_info_memory_block)) {
+  if (!sbwin32::GetAdapters(interface_address.type,
+                            &adapter_info_memory_block)) {
     return false;
   }
   const void* const interface_address_buffer =
diff --git a/starboard/shared/win32/socket_internal.cc b/starboard/shared/win32/socket_internal.cc
index 078043c..3e718d3 100644
--- a/starboard/shared/win32/socket_internal.cc
+++ b/starboard/shared/win32/socket_internal.cc
@@ -28,7 +28,7 @@
     static_cast<socklen_t>(sizeof(struct sockaddr_in));
 const socklen_t kAddressStructLengthIpv6 =
     static_cast<socklen_t>(sizeof(struct sockaddr_in6));
-}
+}  // namespace
 
 SbSocketError TranslateSocketErrorStatus(int error) {
   switch (error) {
@@ -142,7 +142,7 @@
     return false;
   }
 
-// Check that we have been properly initialized.
+  // Check that we have been properly initialized.
   SB_DCHECK(length == kAddressStructLengthIpv4 ||
             length == kAddressStructLengthIpv6);
 
diff --git a/starboard/shared/win32/socket_resolve.cc b/starboard/shared/win32/socket_resolve.cc
index 44c3200..2074e6d 100644
--- a/starboard/shared/win32/socket_resolve.cc
+++ b/starboard/shared/win32/socket_resolve.cc
@@ -66,7 +66,7 @@
 
   int index = 0;
   int skip = 0;
-  for (const auto *i = ai; i != nullptr; i = i->ai_next, ++index) {
+  for (const auto* i = ai; i != nullptr; i = i->ai_next, ++index) {
     // Skip over any addresses we can't parse.
     parsed[index] = sock_addrs[index].FromSockaddr(i->ai_addr);
     if (!parsed[index]) {
diff --git a/starboard/shared/win32/socket_send_to.cc b/starboard/shared/win32/socket_send_to.cc
index 53fa594..b7ac3dc 100644
--- a/starboard/shared/win32/socket_send_to.cc
+++ b/starboard/shared/win32/socket_send_to.cc
@@ -14,9 +14,9 @@
 
 #include "starboard/common/socket.h"
 
+#include <winsock2.h>
 #include <sstream>
 #include <string>
-#include <winsock2.h>
 
 #include "starboard/common/log.h"
 #include "starboard/shared/win32/socket_internal.h"
diff --git a/starboard/shared/win32/socket_waiter_internal.cc b/starboard/shared/win32/socket_waiter_internal.cc
index 6f80d95..421685f 100644
--- a/starboard/shared/win32/socket_waiter_internal.cc
+++ b/starboard/shared/win32/socket_waiter_internal.cc
@@ -17,6 +17,7 @@
 #include <windows.h>
 
 #include <algorithm>
+#include <utility>
 
 #include "starboard/common/log.h"
 #include "starboard/common/optional.h"
@@ -111,8 +112,8 @@
   collection.resize(new_size);
 }
 
-SbSocketWaiterInterest CombineInterests(
-    SbSocketWaiterInterest a, SbSocketWaiterInterest b) {
+SbSocketWaiterInterest CombineInterests(SbSocketWaiterInterest a,
+                                        SbSocketWaiterInterest b) {
   int a_int = static_cast<int>(a);
   int b_int = static_cast<int>(b);
   return static_cast<SbSocketWaiterInterest>(a_int | b_int);
@@ -324,12 +325,12 @@
     }
 
     bool has_writable = (maybe_writable_socket != kSbSocketInvalid);
-    DWORD return_value = WSAWaitForMultipleEvents(
-        number_events, waitees_.GetHandleArray(),
-        false, has_writable ? 0 : millis, false);
+    DWORD return_value =
+        WSAWaitForMultipleEvents(number_events, waitees_.GetHandleArray(),
+                                 false, has_writable ? 0 : millis, false);
 
     if (has_writable || ((return_value >= WSA_WAIT_EVENT_0) &&
-        (return_value < (WSA_WAIT_EVENT_0 + number_events)))) {
+                         (return_value < (WSA_WAIT_EVENT_0 + number_events)))) {
       int64_t socket_index;
       if (has_writable) {
         socket_index = waitees_.GetIndex(maybe_writable_socket).value();
@@ -370,7 +371,7 @@
             DiscoverNetworkEventInterests(socket->socket_handle);
 
         if ((waitee->interests & kSbSocketWaiterInterestWrite) &&
-              socket->writable.load()) {
+            socket->writable.load()) {
           interests = CombineInterests(interests, kSbSocketWaiterInterestWrite);
         } else if (interests & kSbSocketWaiterInterestWrite) {
           socket->writable.store(true);
@@ -426,8 +427,8 @@
   return waitees_[token.value()].get();
 }
 
-starboard::optional<int64_t>
-SbSocketWaiterPrivate::WaiteeRegistry::GetIndex(SbSocket socket) {
+starboard::optional<int64_t> SbSocketWaiterPrivate::WaiteeRegistry::GetIndex(
+    SbSocket socket) {
   auto iterator = socket_to_index_map_.find(socket);
   if (iterator == socket_to_index_map_.end()) {
     return starboard::nullopt;
diff --git a/starboard/shared/win32/string_compare_no_case.cc b/starboard/shared/win32/string_compare_no_case.cc
index c3e0866..6021bf7 100644
--- a/starboard/shared/win32/string_compare_no_case.cc
+++ b/starboard/shared/win32/string_compare_no_case.cc
@@ -19,4 +19,3 @@
 int SbStringCompareNoCase(const char* string1, const char* string2) {
   return _stricmp(string1, string2);
 }
-
diff --git a/starboard/shared/win32/string_compare_no_case_n.cc b/starboard/shared/win32/string_compare_no_case_n.cc
index 5c3c688..7490d3d 100644
--- a/starboard/shared/win32/string_compare_no_case_n.cc
+++ b/starboard/shared/win32/string_compare_no_case_n.cc
@@ -17,7 +17,7 @@
 #include <string.h>
 
 int SbStringCompareNoCaseN(const char* string1,
-  const char* string2, size_t count) {
+                           const char* string2,
+                           size_t count) {
   return _strnicmp(string1, string2, count);
 }
-
diff --git a/starboard/shared/win32/system_get_locale_id.cc b/starboard/shared/win32/system_get_locale_id.cc
index c6a86ed..9695281 100644
--- a/starboard/shared/win32/system_get_locale_id.cc
+++ b/starboard/shared/win32/system_get_locale_id.cc
@@ -40,7 +40,7 @@
     } else {
       SB_LOG(ERROR) << "Error retrieving GetUserDefaultLocaleName";
       DebugLogWinError();
-      value_ ="en-US";
+      value_ = "en-US";
     }
   }
   std::string value_;
diff --git a/starboard/shared/win32/system_get_stack.cc b/starboard/shared/win32/system_get_stack.cc
index 9fa9f02..de30224 100644
--- a/starboard/shared/win32/system_get_stack.cc
+++ b/starboard/shared/win32/system_get_stack.cc
@@ -18,7 +18,7 @@
 
 __declspec(noinline) int SbSystemGetStack(void** out_stack, int stack_size) {
   ULONG frames_to_skip = 1;
-  int num_captured = CaptureStackBackTrace(frames_to_skip, stack_size,
-                                           out_stack, nullptr);
+  int num_captured =
+      CaptureStackBackTrace(frames_to_skip, stack_size, out_stack, nullptr);
   return num_captured;
 }
diff --git a/starboard/shared/win32/thread_create_local_key.cc b/starboard/shared/win32/thread_create_local_key.cc
index f721b74..b1337c0 100644
--- a/starboard/shared/win32/thread_create_local_key.cc
+++ b/starboard/shared/win32/thread_create_local_key.cc
@@ -48,7 +48,7 @@
   }
 
   SbThreadLocalKeyPrivate* result = static_cast<SbThreadLocalKeyPrivate*>(
-      SbMemoryAllocateNoReport(sizeof(SbThreadLocalKeyPrivate)));
+      SbMemoryAllocate(sizeof(SbThreadLocalKeyPrivate)));
 
   if (result == nullptr) {
     return kSbThreadLocalKeyInvalid;
diff --git a/starboard/shared/win32/thread_destroy_local_key.cc b/starboard/shared/win32/thread_destroy_local_key.cc
index e2abb3c..ed58be1 100644
--- a/starboard/shared/win32/thread_destroy_local_key.cc
+++ b/starboard/shared/win32/thread_destroy_local_key.cc
@@ -21,8 +21,8 @@
 #include "starboard/shared/win32/thread_private.h"
 
 using starboard::shared::win32::GetThreadSubsystemSingleton;
-using starboard::shared::win32::TlsInternalFree;
 using starboard::shared::win32::ThreadSubsystemSingleton;
+using starboard::shared::win32::TlsInternalFree;
 
 void SbThreadDestroyLocalKey(SbThreadLocalKey key) {
   if (!SbThreadIsValidLocalKey(key)) {
@@ -39,5 +39,5 @@
   SbMutexRelease(&singleton->mutex_);
 
   TlsInternalFree(tls_index);
-  SbMemoryDeallocateNoReport(key);
+  SbMemoryDeallocate(key);
 }
diff --git a/starboard/shared/win32/thread_set_name.cc b/starboard/shared/win32/thread_set_name.cc
index 72aafef..c112a88 100644
--- a/starboard/shared/win32/thread_set_name.cc
+++ b/starboard/shared/win32/thread_set_name.cc
@@ -49,7 +49,7 @@
   __try {
     RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR),
                    reinterpret_cast<ULONG_PTR*>(&info));
-  } __except(EXCEPTION_EXECUTE_HANDLER) {
+  } __except (EXCEPTION_EXECUTE_HANDLER) {  // NOLINT(whitespace/parens)
   }
 #pragma warning(pop)
 }
diff --git a/starboard/shared/win32/time_zone_get_current.cc b/starboard/shared/win32/time_zone_get_current.cc
index 85a5493..e8d8c32 100644
--- a/starboard/shared/win32/time_zone_get_current.cc
+++ b/starboard/shared/win32/time_zone_get_current.cc
@@ -23,14 +23,14 @@
   DWORD zone_id = GetDynamicTimeZoneInformation(&time_zone_info);
 
   switch (zone_id) {
-  case TIME_ZONE_ID_UNKNOWN:
-    return time_zone_info.Bias;
-  case TIME_ZONE_ID_STANDARD:
-    return time_zone_info.Bias + time_zone_info.StandardBias;
-  case TIME_ZONE_ID_DAYLIGHT:
-    return time_zone_info.Bias + time_zone_info.DaylightBias;
-  default:
-    SB_NOTREACHED();
-    return 0;
+    case TIME_ZONE_ID_UNKNOWN:
+      return time_zone_info.Bias;
+    case TIME_ZONE_ID_STANDARD:
+      return time_zone_info.Bias + time_zone_info.StandardBias;
+    case TIME_ZONE_ID_DAYLIGHT:
+      return time_zone_info.Bias + time_zone_info.DaylightBias;
+    default:
+      SB_NOTREACHED();
+      return 0;
   }
 }
diff --git a/starboard/shared/win32/time_zone_get_name.cc b/starboard/shared/win32/time_zone_get_name.cc
index bc92e3b..e001b02 100644
--- a/starboard/shared/win32/time_zone_get_name.cc
+++ b/starboard/shared/win32/time_zone_get_name.cc
@@ -14,8 +14,8 @@
 
 #include "starboard/time_zone.h"
 
-#include <string>
 #include <Windows.h>
+#include <string>
 
 #include "starboard/common/log.h"
 #include "starboard/once.h"
diff --git a/starboard/shared/win32/video_decoder.cc b/starboard/shared/win32/video_decoder.cc
index f53d6b9..b69cdaf 100644
--- a/starboard/shared/win32/video_decoder.cc
+++ b/starboard/shared/win32/video_decoder.cc
@@ -284,7 +284,9 @@
   SB_DCHECK(input_buffers[0]);
   SB_DCHECK(decoder_status_cb_);
   EnsureDecoderThreadRunning();
-
+  if (error_occured_.load()) {
+    return;
+  }
   const auto& input_buffer = input_buffers[0];
   if (TryUpdateOutputForHdrVideo(input_buffer->video_stream_info())) {
     ScopedLock lock(thread_lock_);
@@ -300,6 +302,9 @@
   SB_DCHECK(thread_checker_.CalledOnValidThread());
   SB_DCHECK(decoder_status_cb_);
   EnsureDecoderThreadRunning();
+  if (error_occured_.load()) {
+    return;
+  }
 
   ScopedLock lock(thread_lock_);
   thread_events_.emplace_back(new Event{Event::kWriteEndOfStream});
@@ -317,6 +322,7 @@
   thread_outputs_.clear();
   thread_lock_.Release();
   outputs_reset_lock_.Release();
+  error_occured_.store(false);
 
   // If the previous priming hasn't finished, restart it.  This happens rarely
   // as it is only triggered when a seek is requested immediately after video is
@@ -470,8 +476,9 @@
 
   ComPtr<IMFAttributes> attributes = transform->GetAttributes();
   SB_DCHECK(attributes);
-  CheckResult(attributes->SetUINT32(MF_SA_MINIMUM_OUTPUT_SAMPLE_COUNT,
-                                    kMaxOutputSamples));
+  CheckResult(
+      attributes->SetUINT32(MF_SA_MINIMUM_OUTPUT_SAMPLE_COUNT,
+                            static_cast<UINT32>(GetMaxNumberOfCachedFrames())));
 
   UpdateVideoArea(transform->GetCurrentOutputType());
 
@@ -661,6 +668,10 @@
       switch (event->type) {
         case Event::kWriteInputBuffer:
           SB_DCHECK(event->input_buffer != nullptr);
+          if (error_occured_) {
+            event.reset();
+            break;
+          }
           if (decoder_->TryWriteInputBuffer(event->input_buffer, 0)) {
             if (priming_output_count_ > 0) {
               // Save this event for the actual playback.
@@ -706,7 +717,7 @@
       // MF_SA_MINIMUM_OUTPUT_SAMPLE_COUNT.
       thread_lock_.Acquire();
       bool input_full = thread_events_.size() >= kMaxInputSamples;
-      bool output_full = thread_outputs_.size() >= kMaxOutputSamples;
+      bool output_full = thread_outputs_.size() >= GetMaxNumberOfCachedFrames();
       thread_lock_.Release();
 
       Status status = input_full ? kBufferFull : kNeedMoreInput;
@@ -719,7 +730,13 @@
 
       ComPtr<IMFSample> sample;
       ComPtr<IMFMediaType> media_type;
-      decoder_->ProcessAndRead(&sample, &media_type);
+      bool hasError;
+      decoder_->ProcessAndRead(&sample, &media_type, &hasError);
+      if (hasError) {
+        error_occured_.exchange(true);
+        error_cb_(kSbPlayerErrorDecode, "Something went wrong in decoding.");
+        break;
+      }
       if (media_type) {
         UpdateVideoArea(media_type);
       }
diff --git a/starboard/shared/win32/video_decoder.h b/starboard/shared/win32/video_decoder.h
index 0708b43..8457a23 100644
--- a/starboard/shared/win32/video_decoder.h
+++ b/starboard/shared/win32/video_decoder.h
@@ -18,6 +18,7 @@
 #include <D3d11_1.h>
 #include <wrl/client.h>
 
+#include <atomic>
 #include <list>
 #include <memory>
 
@@ -159,6 +160,7 @@
   std::list<SbDecodeTarget> prev_decode_targets_;
 
   bool is_hdr_supported_;
+  std::atomic_bool error_occured_ = {false};
 };
 
 }  // namespace win32
diff --git a/starboard/shared/win32/wchar_utils.h b/starboard/shared/win32/wchar_utils.h
index 7ee0960..e1791a9 100644
--- a/starboard/shared/win32/wchar_utils.h
+++ b/starboard/shared/win32/wchar_utils.h
@@ -41,14 +41,16 @@
 }
 
 #if defined(__cplusplus_winrt)
-inline std::string platformStringToString(Platform::String^ to_convert) {
+inline std::string platformStringToString(Platform::String ^ to_convert) {
   std::wstring ws(to_convert->Begin(), to_convert->End());
   return wchar_tToUTF8(ws.data(), ws.size());
 }
 
-inline Platform::String^ stringToPlatformString(const std::string& to_convert) {
-  return ref new Platform::String(CStringToWString(to_convert.c_str()).c_str());
-}
+inline Platform::String ^
+    stringToPlatformString(const std::string& to_convert) {
+      return ref new Platform::String(
+          CStringToWString(to_convert.c_str()).c_str());
+    }
 #endif
 
 }  // namespace win32
diff --git a/starboard/shared/win32/win32_audio_decoder.cc b/starboard/shared/win32/win32_audio_decoder.cc
index 76cc479..84d526a 100644
--- a/starboard/shared/win32/win32_audio_decoder.cc
+++ b/starboard/shared/win32/win32_audio_decoder.cc
@@ -167,7 +167,8 @@
     impl_->Drain();
     ComPtr<IMFSample> sample;
     ComPtr<IMFMediaType> media_type;
-    while (impl_->ProcessAndRead(&sample, &media_type)) {
+    bool hasError;
+    while (impl_->ProcessAndRead(&sample, &media_type, &hasError)) {
       if (sample) {
         Consume(sample);
       }
@@ -183,7 +184,8 @@
 
     ComPtr<IMFSample> sample;
     ComPtr<IMFMediaType> media_type;
-    while (impl_->ProcessAndRead(&sample, &media_type)) {
+    bool hasError;
+    while (impl_->ProcessAndRead(&sample, &media_type, &hasError)) {
       if (sample) {
         Consume(sample);
       }
diff --git a/starboard/shared/win32/wrm_header.cc b/starboard/shared/win32/wrm_header.cc
index 71003d3..59f3212 100644
--- a/starboard/shared/win32/wrm_header.cc
+++ b/starboard/shared/win32/wrm_header.cc
@@ -16,10 +16,10 @@
 
 #include <guiddef.h>
 #include <initguid.h>
+#include <stdlib.h>
 
 #include <algorithm>
 
-#include "starboard/common/byte_swap.h"
 #include "starboard/memory.h"
 #include "starboard/shared/win32/error_utils.h"
 
@@ -275,9 +275,9 @@
 
   GUID key_id = *reinterpret_cast<const GUID*>(key_id_in_string.data());
 
-  key_id.Data1 = SbByteSwap(key_id.Data1);
-  key_id.Data2 = SbByteSwap(key_id.Data2);
-  key_id.Data3 = SbByteSwap(key_id.Data3);
+  key_id.Data1 = _byteswap_ulong(key_id.Data1);
+  key_id.Data2 = _byteswap_ushort(key_id.Data2);
+  key_id.Data3 = _byteswap_ushort(key_id.Data3);
 
   return key_id;
 }
diff --git a/starboard/shared/x11/application_x11.h b/starboard/shared/x11/application_x11.h
index 7bdf726..94596c0 100644
--- a/starboard/shared/x11/application_x11.h
+++ b/starboard/shared/x11/application_x11.h
@@ -21,7 +21,7 @@
 #include <unordered_map>
 #include <vector>
 
-#include "nb/scoped_ptr.h"
+#include "starboard/common/scoped_ptr.h"
 #include "starboard/configuration.h"
 #include "starboard/player.h"
 #include "starboard/shared/internal_only.h"
diff --git a/starboard/shared/x11/window_internal.h b/starboard/shared/x11/window_internal.h
index 0adfcd6..01d7e12 100644
--- a/starboard/shared/x11/window_internal.h
+++ b/starboard/shared/x11/window_internal.h
@@ -15,8 +15,8 @@
 #ifndef STARBOARD_SHARED_X11_WINDOW_INTERNAL_H_
 #define STARBOARD_SHARED_X11_WINDOW_INTERNAL_H_
 
-#include <X11/extensions/Xrender.h>
 #include <X11/Xlib.h>
+#include <X11/extensions/Xrender.h>
 
 #include "starboard/configuration.h"
 #include "starboard/shared/internal_only.h"
diff --git a/starboard/stub/platform_configuration/BUILD.gn b/starboard/stub/platform_configuration/BUILD.gn
index 1f7e42f..e1d5a11 100644
--- a/starboard/stub/platform_configuration/BUILD.gn
+++ b/starboard/stub/platform_configuration/BUILD.gn
@@ -16,7 +16,7 @@
   configs = [ "//starboard/build/config/sabi" ]
   cflags = []
 
-  cflags_cc = [ "-std=gnu++14" ]
+  cflags_cc = [ "-std=gnu++17" ]
   ldflags = [ "-static-libstdc++" ]
 
   if (is_debug) {
diff --git a/starboard/tools/abstract_launcher.py b/starboard/tools/abstract_launcher.py
index ff361cf..f9a0a91 100644
--- a/starboard/tools/abstract_launcher.py
+++ b/starboard/tools/abstract_launcher.py
@@ -283,6 +283,33 @@
     """
     return self.device_id, port
 
+  def CreateDeviceToHostTunnel(self, host_port, device_port):
+    """Creates a tunnel that transfers requests from device to host.
+
+    This is used by on-device processes to connect to services on the host.
+
+    Args:
+      host_port: The host_port to receive requests from the device.
+      device_port: The port on device to proxy on-device requests.
+
+    Returns:
+      True if succeed and false otherwise.
+    """
+    del host_port
+    del device_port
+    return False
+
+  def RemoveDeviceToHostTunnel(self, host_port):
+    """Removes the tunnel created from CreateDeviceToHostTunnel.
+
+    Args:
+      host_port: The host_port to receive requests from the device.
+    Returns:
+      True if succeed and false otherwise.
+    """
+    del host_port
+    return False
+
   def GetTargetPath(self):
     """Constructs the path to an executable target.
 
diff --git a/starboard/tools/download_clang.py b/starboard/tools/download_clang.py
index f3c5061..8e9a059 100755
--- a/starboard/tools/download_clang.py
+++ b/starboard/tools/download_clang.py
@@ -96,7 +96,7 @@
     pass
 
   if os.getenv('IS_CI', '') == '1':
-    raise Exception('Dynamic toolchain downloads are disabled in CI')
+    raise RuntimeError('Dynamic toolchain downloads are disabled in CI')
 
   if os.path.exists(target_dir):
     shutil.rmtree(target_dir)
diff --git a/starboard/tools/paths.py b/starboard/tools/paths.py
index 59b741d..330a4a1 100644
--- a/starboard/tools/paths.py
+++ b/starboard/tools/paths.py
@@ -32,6 +32,7 @@
 BUILD_OUTPUT_ROOT = path.join(REPOSITORY_ROOT, 'out')
 
 
+# pylint:disable=consider-using-f-string
 def BuildOutputDirectory(platform, config):
   """Gets the build output directory for the given platform and config."""
   return path.join(BUILD_OUTPUT_ROOT, '%s_%s' % (platform, config))
diff --git a/starboard/tools/testing/test_runner.py b/starboard/tools/testing/test_runner.py
index 97addf1..b6fa3e1 100755
--- a/starboard/tools/testing/test_runner.py
+++ b/starboard/tools/testing/test_runner.py
@@ -46,8 +46,7 @@
 _TESTS_FAILED_REGEX = re.compile(r"^\[  FAILED  \] (.*) tests?, listed below:")
 _SINGLE_TEST_FAILED_REGEX = re.compile(r"^\[  FAILED  \] (.*)")
 
-_CRASHPAD_TARGET = "crashpad_handler"
-_NATIVE_CRASHPARD_TARGET = "native_target/crashpad_handler"
+_NATIVE_CRASHPAD_TARGET = "native_target/crashpad_handler"
 _LOADER_TARGET = "elf_loader_sandbox"
 
 
@@ -477,7 +476,7 @@
       logging.info(("Xml results for this test will "
                     "be logged to '%s'."), test_result_xml_path)
     elif self.xml_output_dir:
-      xml_output_subdir = os.path.join(self.xml_output_dir, target_name)
+      xml_output_subdir = os.path.join(self.xml_output_dir)
       try:
         os.makedirs(xml_output_subdir)
       except OSError as ose:
@@ -788,11 +787,7 @@
       # The loader is not built with the same platform configuration as our
       # tests so we need to build it separately.
       if self.loader_platform:
-        target_list = [_LOADER_TARGET]
-        if self.loader_platform.startswith("android"):
-          target_list.append(_NATIVE_CRASHPARD_TARGET)
-        else:
-          target_list.append(_CRASHPAD_TARGET)
+        target_list = [_LOADER_TARGET, _NATIVE_CRASHPAD_TARGET]
         build_tests.BuildTargets(
             target_list, self.loader_out_directory, self.dry_run,
             extra_flags + [os.getenv("TEST_RUNNER_PLATFORM_BUILD_FLAGS", "")])
diff --git a/starboard/win/shared/BUILD.gn b/starboard/win/shared/BUILD.gn
index 26787cc..9501d8f 100644
--- a/starboard/win/shared/BUILD.gn
+++ b/starboard/win/shared/BUILD.gn
@@ -19,7 +19,7 @@
 config("starboard_platform_config") {
   if (current_os == "winuwp") {
     # We want this to apply to all shared win sources for xb1.
-    configs = [ "//internal/starboard/xb1:starboard_platform_config" ]
+    configs = [ "//starboard/xb1:starboard_platform_config" ]
   }
   include_dirs = [
     "//third_party/angle/include",
diff --git a/starboard/win/win32/args.gn b/starboard/win/win32/args.gn
index 5dba6c9..ca2004d 100644
--- a/starboard/win/win32/args.gn
+++ b/starboard/win/win32/args.gn
@@ -16,4 +16,3 @@
 target_os = "win"
 target_cpu = "x64"
 is_clang = false
-is_internal_build = true
diff --git a/starboard/xb1/BUILD.gn b/starboard/xb1/BUILD.gn
new file mode 100644
index 0000000..5a54c16
--- /dev/null
+++ b/starboard/xb1/BUILD.gn
@@ -0,0 +1,250 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+config("starboard_platform_config") {
+  cflags_cc = [
+    "/ZW",  # Windows Runtime
+    "/ZW:nostdlib",  # Windows Runtime, no default #using
+  ]
+  defines = [
+    # VS2017 always defines this for UWP apps
+    "WINAPI_FAMILY=WINAPI_FAMILY_APP",
+
+    # VS2017 always defines this for UWP apps
+    "__WRL_NO_DEFAULT_LIB__",
+  ]
+}
+
+static_library("starboard_platform") {
+  sources = [
+    "//starboard/shared/egl/system_egl.cc",
+    "//starboard/shared/gles/system_gles2.cc",
+    "//starboard/shared/opus/opus_audio_decoder.cc",
+    "//starboard/shared/opus/opus_audio_decoder.h",
+    "//starboard/shared/starboard/decode_target/decode_target_context_runner.cc",
+    "//starboard/shared/starboard/decode_target/decode_target_context_runner.h",
+    "//starboard/shared/starboard/drm/drm_close_session.cc",
+    "//starboard/shared/starboard/drm/drm_destroy_system.cc",
+    "//starboard/shared/starboard/drm/drm_generate_session_update_request.cc",
+    "//starboard/shared/starboard/drm/drm_get_metrics.cc",
+    "//starboard/shared/starboard/drm/drm_is_server_certificate_updatable.cc",
+    "//starboard/shared/starboard/drm/drm_system_internal.h",
+    "//starboard/shared/starboard/drm/drm_update_server_certificate.cc",
+    "//starboard/shared/starboard/drm/drm_update_session.cc",
+    "//starboard/shared/starboard/localized_strings.cc",
+    "//starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc",
+    "//starboard/shared/starboard/media/media_get_audio_buffer_budget.cc",
+    "//starboard/shared/starboard/media/media_get_audio_output_count_single_audio_output.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_alignment.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_allocation_unit.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_garbage_collection_duration_threshold.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_padding.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_storage_type.cc",
+    "//starboard/shared/starboard/media/media_get_initial_buffer_capacity.cc",
+    "//starboard/shared/starboard/media/media_get_progressive_buffer_budget.cc",
+    "//starboard/shared/starboard/media/media_get_video_buffer_budget.cc",
+    "//starboard/shared/starboard/media/media_is_buffer_pool_allocate_on_demand.cc",
+    "//starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc",
+    "//starboard/shared/starboard/memory.cc",
+    "//starboard/shared/starboard/microphone/microphone_close.cc",
+    "//starboard/shared/starboard/microphone/microphone_create.cc",
+    "//starboard/shared/starboard/microphone/microphone_destroy.cc",
+    "//starboard/shared/starboard/microphone/microphone_get_available.cc",
+    "//starboard/shared/starboard/microphone/microphone_internal.h",
+    "//starboard/shared/starboard/microphone/microphone_is_sample_rate_supported.cc",
+    "//starboard/shared/starboard/microphone/microphone_open.cc",
+    "//starboard/shared/starboard/microphone/microphone_read.cc",
+    "//starboard/shared/starboard/player/filter/audio_frame_tracker.cc",
+    "//starboard/shared/starboard/player/filter/audio_frame_tracker.h",
+    "//starboard/shared/starboard/player/filter/audio_renderer_internal.h",
+    "//starboard/shared/starboard/player/filter/audio_renderer_internal_pcm.cc",
+    "//starboard/shared/starboard/player/filter/audio_renderer_internal_pcm.h",
+    "//starboard/shared/starboard/player/filter/audio_renderer_sink.h",
+    "//starboard/shared/starboard/player/filter/audio_renderer_sink_impl.cc",
+    "//starboard/shared/starboard/player/filter/audio_renderer_sink_impl.h",
+    "//starboard/shared/starboard/player/filter/audio_resampler_impl.cc",
+    "//starboard/shared/starboard/player/filter/audio_time_stretcher.cc",
+    "//starboard/shared/starboard/player/filter/decoded_audio_queue.cc",
+    "//starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc",
+    "//starboard/shared/starboard/player/filter/media_time_provider.h",
+    "//starboard/shared/starboard/player/filter/media_time_provider_impl.cc",
+    "//starboard/shared/starboard/player/filter/media_time_provider_impl.h",
+    "//starboard/shared/starboard/player/filter/video_frame_internal.h",
+    "//starboard/shared/starboard/player/filter/video_render_algorithm.h",
+    "//starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc",
+    "//starboard/shared/starboard/player/filter/video_render_algorithm_impl.h",
+    "//starboard/shared/starboard/player/filter/video_renderer_internal.h",
+    "//starboard/shared/starboard/player/filter/video_renderer_internal_impl.cc",
+    "//starboard/shared/starboard/player/filter/video_renderer_internal_impl.h",
+    "//starboard/shared/starboard/player/filter/wsola_internal.cc",
+    "//starboard/shared/starboard/system_request_blur.cc",
+    "//starboard/shared/starboard/system_request_conceal.cc",
+    "//starboard/shared/starboard/system_request_focus.cc",
+    "//starboard/shared/starboard/system_request_freeze.cc",
+    "//starboard/shared/starboard/system_request_reveal.cc",
+    "//starboard/shared/starboard/system_request_stop.cc",
+    "//starboard/shared/starboard/system_supports_resume.cc",
+    "//starboard/shared/stub/media_set_audio_write_duration.cc",
+    "//starboard/shared/stub/system_symbolize.cc",
+    "//starboard/shared/uwp/analog_thumbstick_input.cc",
+    "//starboard/shared/uwp/analog_thumbstick_input.h",
+    "//starboard/shared/uwp/analog_thumbstick_input_thread.cc",
+    "//starboard/shared/uwp/analog_thumbstick_input_thread.h",
+    "//starboard/shared/uwp/application_uwp.cc",
+    "//starboard/shared/uwp/application_uwp.h",
+    "//starboard/shared/uwp/application_uwp_key_event.cc",
+    "//starboard/shared/uwp/async_utils.h",
+    "//starboard/shared/uwp/audio_renderer_passthrough.cc",
+    "//starboard/shared/uwp/audio_renderer_passthrough.h",
+    "//starboard/shared/uwp/decoder_utils.cc",
+    "//starboard/shared/uwp/decoder_utils.h",
+    "//starboard/shared/uwp/extended_resources_manager.cc",
+    "//starboard/shared/uwp/extended_resources_manager.h",
+    "//starboard/shared/uwp/get_home_directory.cc",
+    "//starboard/shared/uwp/keys.h",
+    "//starboard/shared/uwp/log_file_impl.cc",
+    "//starboard/shared/uwp/log_file_impl.h",
+    "//starboard/shared/uwp/log_raw.cc",
+    "//starboard/shared/uwp/log_raw_format.cc",
+    "//starboard/shared/uwp/log_writer_interface.h",
+    "//starboard/shared/uwp/log_writer_uwp.cc",
+    "//starboard/shared/uwp/log_writer_uwp.h",
+    "//starboard/shared/uwp/log_writer_win32.cc",
+    "//starboard/shared/uwp/log_writer_win32.h",
+    "//starboard/shared/uwp/media_get_audio_configuration.cc",
+    "//starboard/shared/uwp/media_is_audio_supported.cc",
+    "//starboard/shared/uwp/media_is_video_supported.cc",
+    "//starboard/shared/uwp/microphone_impl.cc",
+    "//starboard/shared/uwp/player_components_factory.cc",
+    "//starboard/shared/uwp/system_get_device_type.cc",
+    "//starboard/shared/uwp/system_get_property.cc",
+    "//starboard/shared/uwp/system_get_total_cpu_memory.cc",
+    "//starboard/shared/uwp/system_get_used_cpu_memory.cc",
+    "//starboard/shared/uwp/system_platform_error_internal.cc",
+    "//starboard/shared/uwp/system_platform_error_internal.h",
+    "//starboard/shared/uwp/system_raise_platform_error.cc",
+    "//starboard/shared/uwp/wasapi_audio.cc",
+    "//starboard/shared/uwp/wasapi_audio.h",
+    "//starboard/shared/uwp/wasapi_audio_sink.cc",
+    "//starboard/shared/uwp/wasapi_audio_sink.h",
+    "//starboard/shared/uwp/watchdog_log.cc",
+    "//starboard/shared/uwp/watchdog_log.h",
+    "//starboard/shared/uwp/window_create.cc",
+    "//starboard/shared/uwp/window_destroy.cc",
+    "//starboard/shared/uwp/window_get_diagonal_size_in_inches.cc",
+    "//starboard/shared/uwp/window_get_platform_handle.cc",
+    "//starboard/shared/uwp/window_get_size.cc",
+    "//starboard/shared/uwp/window_internal.cc",
+    "//starboard/shared/uwp/window_internal.h",
+    "//starboard/shared/uwp/window_set_default_options.cc",
+    "//starboard/shared/uwp/xb1_get_type.cc",
+    "//starboard/shared/uwp/xb1_get_type.h",
+    "//starboard/shared/uwp/xb1_media_session_client.cc",
+    "//starboard/shared/uwp/xb1_media_session_client.h",
+    "//starboard/shared/win32/atomic_queue.h",
+    "//starboard/shared/win32/audio_decoder.cc",
+    "//starboard/shared/win32/audio_decoder.h",
+    "//starboard/shared/win32/audio_decoder_thread.cc",
+    "//starboard/shared/win32/audio_decoder_thread.h",
+    "//starboard/shared/win32/audio_transform.cc",
+    "//starboard/shared/win32/audio_transform.h",
+    "//starboard/shared/win32/decode_target_internal.cc",
+    "//starboard/shared/win32/decode_target_internal.h",
+    "//starboard/shared/win32/decrypting_decoder.cc",
+    "//starboard/shared/win32/decrypting_decoder.h",
+    "//starboard/shared/win32/drm_system_playready.cc",
+    "//starboard/shared/win32/drm_system_playready.h",
+    "//starboard/shared/win32/dx_context_video_decoder.cc",
+    "//starboard/shared/win32/dx_context_video_decoder.h",
+    "//starboard/shared/win32/hardware_decode_target_internal.cc",
+    "//starboard/shared/win32/hardware_decode_target_internal.h",
+    "//starboard/shared/win32/media_common.cc",
+    "//starboard/shared/win32/media_common.h",
+    "//starboard/shared/win32/media_foundation_utils.cc",
+    "//starboard/shared/win32/media_foundation_utils.h",
+    "//starboard/shared/win32/media_get_max_buffer_capacity.cc",
+    "//starboard/shared/win32/media_transform.cc",
+    "//starboard/shared/win32/media_transform.h",
+    "//starboard/shared/win32/video_decoder.cc",
+    "//starboard/shared/win32/video_decoder.h",
+    "//starboard/shared/win32/win32_audio_decoder.cc",
+    "//starboard/shared/win32/win32_audio_decoder.h",
+    "//starboard/shared/win32/wrm_header.cc",
+    "//starboard/shared/win32/wrm_header.h",
+    "//starboard/xb1/shared/gpu_base_video_decoder.cc",
+    "//starboard/xb1/shared/gpu_base_video_decoder.h",
+    "//starboard/xb1/shared/internal_shims.h",
+    "//starboard/xb1/shared/playready_license.cc",
+    "//starboard/xb1/shared/video_decoder_uwp.cc",
+    "//starboard/xb1/shared/video_decoder_uwp.h",
+    "//starboard/xb1/shared/video_frame_impl.h",
+    "atomic_public.h",
+    "configuration_public.h",
+    "shared/configuration.cc",
+    "shared/configuration.h",
+    "shared/configuration_constants.cc",
+    "shared/system_get_extensions.cc",
+    "shared/system_get_path.cc",
+  ]
+
+  configs += [
+    "//starboard/build/config:starboard_implementation",
+    "//starboard/win/shared:starboard_platform_config",
+  ]
+
+  public_deps = [ "//starboard/win/shared:starboard_platform" ]
+
+  deps = [
+    "//third_party/angle:translator",
+    "//third_party/opus",
+  ]
+
+  if (is_internal_build) {
+    sources += [
+      "//internal/starboard/shared/uwp/keys.cc",
+      "//internal/starboard/xb1/av1_video_decoder.cc",
+      "//internal/starboard/xb1/av1_video_decoder.h",
+      "//internal/starboard/xb1/drm_create_system.cc",
+      "//internal/starboard/xb1/internal_shims.cc",
+      "//internal/starboard/xb1/media_is_supported.cc",
+      "//internal/starboard/xb1/oemcrypto_engine_device_properties_xb1.cc",
+      "//internal/starboard/xb1/system_sign_with_certification_secret_key.cc",
+      "//internal/starboard/xb1/vpx_video_decoder.cc",
+      "//internal/starboard/xb1/vpx_video_decoder.h",
+      "//starboard/keyboxes/xbox/system_properties.cc",
+      "//starboard/shared/widevine/drm_system_widevine.cc",
+      "//starboard/shared/widevine/drm_system_widevine.h",
+      "//starboard/shared/widevine/widevine_storage.cc",
+      "//starboard/shared/widevine/widevine_storage.h",
+      "//starboard/shared/widevine/widevine_timer.cc",
+      "//starboard/shared/widevine/widevine_timer.h",
+    ]
+    deps += [
+      "//starboard/shared/widevine:oemcrypto",
+      "//third_party/internal/ce_cdm/cdm:widevine_cdm_core",
+      "//third_party/internal/ce_cdm/cdm:widevine_ce_cdm_static",
+      "//third_party/internal/libav1_xb1",
+      "//third_party/internal/libvpx_xb1",
+    ]
+  } else {
+    sources += [
+      "//starboard/shared/stub/drm_create_system.cc",
+      "//starboard/shared/stub/media_is_supported.cc",
+      "//starboard/shared/stub/system_sign_with_certification_secret_key.cc",
+      "//starboard/shared/uwp/keys.cc",
+      "//starboard/xb1/public_system_properties.cc",
+      "//starboard/xb1/shared/internal_stubs.cc",
+    ]
+  }
+}
diff --git a/tools/lbshell/open_source_release/create_tarball.sh b/starboard/xb1/__init__.py
old mode 100755
new mode 100644
similarity index 71%
copy from tools/lbshell/open_source_release/create_tarball.sh
copy to starboard/xb1/__init__.py
index 79904b4..2b2e9ab
--- a/tools/lbshell/open_source_release/create_tarball.sh
+++ b/starboard/xb1/__init__.py
@@ -1,6 +1,5 @@
-#!/bin/bash
 #
-# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -13,6 +12,6 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-
-CURRENT_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-${CURRENT_DIR}/../../../internal/tools/lbshell/open_source_release/create_tarball.sh "$@"
+#
+"""Imports the Package class so the starboard Packager class can discover it."""
+from starboard.xb1.tools.packager import Package
diff --git a/starboard/xb1/appx_product_settings.py b/starboard/xb1/appx_product_settings.py
new file mode 100644
index 0000000..862ae12
--- /dev/null
+++ b/starboard/xb1/appx_product_settings.py
@@ -0,0 +1,75 @@
+# Copyright 2023 The Cobalt Authors. All Rights Reserved.

+#

+# Licensed under the Apache License, Version 2.0 (the "License");

+# you may not use this file except in compliance with the License.

+# You may obtain a copy of the License at

+#

+#     http://www.apache.org/licenses/LICENSE-2.0

+#

+# Unless required by applicable law or agreed to in writing, software

+# distributed under the License is distributed on an "AS IS" BASIS,

+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+# See the License for the specific language governing permissions and

+# limitations under the License.

+"""Contains Xbox variables for the appx manifest."""

+

+# Required product settings used in the xml template. If any of these are

+# missing, the AppxManifest.xml file will fail to generate properly.

+PRODUCT_SETTINGS = {

+    'cobalt': {

+        # Value for the Name attribute of Identity:

+        # https://learn.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-identity#attributes

+        'IDENTITY_NAME': 'Cobalt',

+        # Value for the Publisher attribute of Identity:

+        # https://learn.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-identity#attributes

+        'PUBLISHER': 'CN=CommonName',

+        # Value for the DisplayName element:

+        # https://learn.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-displayname

+        'DISPLAY_NAME': 'Cobalt',

+        # Value for the PublisherDisplayName element:

+        # https://learn.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-publisherdisplayname

+        'PUBLISHER_DISPLAY_NAME': 'My Company',

+        # Value for the EntryPoint attribute of Application:

+        # https://learn.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-application#attributes

+        'ENTRYPOINT': 'https://youtube.com/tv',

+        # Value for the DisplayName attribute of VisualElements:

+        # https://learn.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-uap-visualelements#attributes

+        'APPLICATION_DISPLAY_NAME': 'CobaltApp',

+        # Value for the Description attribute of VisualElements:

+        # https://learn.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-uap-visualelements#attributes

+        'APPLICATION_DESCRIPTION': 'The Cobalt App',

+    },

+}

+

+# Optional fields used in the xml template. If any of these are included in a

+# product in PRODUCT_SETTINGS above they will be used, otherwise they will be

+# skipped.

+OPTIONAL_PRODUCT_SETTINGS = {

+    # Value for the IgnorableNamespaces attribute of Package:

+    # https://learn.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-package#attributes

+    'IGNORABLE_NAMESPACES':

+        'uap mp build',

+    # XML element for PhoneIdentity:

+    # https://learn.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-mp-phoneidentity

+    'PHONE_IDENTITY':

+        '<mp:PhoneIdentity PhoneProductId="..." PhonePublisherId="..." />',

+    # List of XML elements for capabilities:

+    # https://learn.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-capabilities

+    # Will simply be inserted line by line into the template within the

+    # <Capabilities> element.

+    'EXTRA_CAPABILITIES': ['<Capability Name="objects3D" />'],

+    # List of XML elements for extensions:

+    # https://learn.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-uap-extension

+    # Will simply be inserted line by line into the template within the

+    # <Extensions> element.

+    'EXTRA_EXTENSIONS': [

+        '<uap:Extension Category="windows.autoPlayContent">',

+        '   <uap:AutoPlayContent>'

+        '     <uap:LaunchAction'

+        '       Verb="show"'

+        '       ActionDisplayName="Show Pictures"'

+        '       ContentEvent="ShowPicturesOnArrival"/>'

+        '   </uap:AutoPlayContent>'

+        ' </uap:Extension>,'

+    ],

+}

diff --git a/tools/lbshell/open_source_release/create_tarball.sh b/starboard/xb1/args.gn
old mode 100755
new mode 100644
similarity index 71%
copy from tools/lbshell/open_source_release/create_tarball.sh
copy to starboard/xb1/args.gn
index 79904b4..2bf8065
--- a/tools/lbshell/open_source_release/create_tarball.sh
+++ b/starboard/xb1/args.gn
@@ -1,6 +1,4 @@
-#!/bin/bash
-#
-# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -14,5 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-CURRENT_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-${CURRENT_DIR}/../../../internal/tools/lbshell/open_source_release/create_tarball.sh "$@"
+target_platform = "xb1"
+target_os = "winuwp"
+target_cpu = "x64"
+is_clang = false
diff --git a/starboard/xb1/assets/Square150x150Logo.scale-100.png b/starboard/xb1/assets/Square150x150Logo.scale-100.png
new file mode 100644
index 0000000..e66555b
--- /dev/null
+++ b/starboard/xb1/assets/Square150x150Logo.scale-100.png
Binary files differ
diff --git a/starboard/xb1/assets/Square310x310Logo.scale-100.png b/starboard/xb1/assets/Square310x310Logo.scale-100.png
new file mode 100644
index 0000000..daf83b0
--- /dev/null
+++ b/starboard/xb1/assets/Square310x310Logo.scale-100.png
Binary files differ
diff --git a/starboard/xb1/assets/Square44x44Logo.scale-100.png b/starboard/xb1/assets/Square44x44Logo.scale-100.png
new file mode 100644
index 0000000..5d92a6a
--- /dev/null
+++ b/starboard/xb1/assets/Square44x44Logo.scale-100.png
Binary files differ
diff --git a/starboard/xb1/assets/Square71x71Logo.scale-100.png b/starboard/xb1/assets/Square71x71Logo.scale-100.png
new file mode 100644
index 0000000..fa9ecad
--- /dev/null
+++ b/starboard/xb1/assets/Square71x71Logo.scale-100.png
Binary files differ
diff --git a/starboard/xb1/assets/Wide310x150Logo.scale-100.png b/starboard/xb1/assets/Wide310x150Logo.scale-100.png
new file mode 100644
index 0000000..c228fa4
--- /dev/null
+++ b/starboard/xb1/assets/Wide310x150Logo.scale-100.png
Binary files differ
diff --git a/cobalt/h5vcc/h5vcc_account_info.idl b/starboard/xb1/atomic_public.h
similarity index 70%
copy from cobalt/h5vcc/h5vcc_account_info.idl
copy to starboard/xb1/atomic_public.h
index 1fc2417..ed90f7e 100644
--- a/cobalt/h5vcc/h5vcc_account_info.idl
+++ b/starboard/xb1/atomic_public.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Cobalt Authors. All Rights Reserved.
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-interface H5vccAccountInfo {
-  readonly attribute DOMString avatarUrl;
-  readonly attribute DOMString username;
-  readonly attribute DOMString userId;
-};
+#ifndef STARBOARD_XB1_ATOMIC_PUBLIC_H_
+#define STARBOARD_XB1_ATOMIC_PUBLIC_H_
+
+#include "starboard/shared/win32/atomic_public.h"
+
+#endif  // STARBOARD_XB1_ATOMIC_PUBLIC_H_
diff --git a/starboard/xb1/cert/README.md b/starboard/xb1/cert/README.md
new file mode 100644
index 0000000..7462013
--- /dev/null
+++ b/starboard/xb1/cert/README.md
@@ -0,0 +1,32 @@
+This directory contains a cobalt.pfx cert for signing UWP appx packages.

+

+This cert is not for use with submitting to the Microsoft store. It

+is intended only to be used for running the Windows App Cert Kit. Note that

+you will need to regenerate this file to be able to sign a cobalt appx yourself.

+

+It was generated as follows, using tools in SDK 10.0.22621.0 run in PowerShell

+as an administrator:

+

+Create a new self-signed certificate with an extended key usage for code

+signing. The Subject must match the Publisher field in your AppxManifest.

+`New-SelfSignedCertificate -Type Custom -Subject "<Publisher information from AppxManifest.xml>" -FriendlyName "cobalt-cert" -KeyUsage DigitalSignature -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3")`

+

+Verify that the cert was created properly. You should see the new cert if you

+run the following command (Cert:\LocalMachine\My is the default cert store,

+yours may be in a different location).

+`Get-ChildItem Cert:\LocalMachine\My | Format-Table Subject, FriendlyName, Thumbprint`

+

+Export the certificate to a Personal Information Exchange (pfx) file.

+`Export-PfxCertificate -cert Cert:\LocalMachine\My\<Certificate Thumbprint> -FilePath <FilePath>.pfx -ProtectTo <Username or group name>`

+

+See the following for more information:

+

+https://learn.microsoft.com/en-us/windows/msix/package/create-certificate-package-signing

+

+It is recommended that you remove any certificates once they are no longer

+necessary to prevent them from being used maliciously. If you need to remove

+this certificate, run the following in PowerShell as an administrator.

+

+`Get-ChildItem Cert:\LocalMachine\My | Format-Table Subject, FriendlyName, Thumbprint`

+

+`Get-ChildItem Cert:\LocalMachine\My\<Certificate Thumbprint> | Remove-Item`

diff --git a/starboard/xb1/cert/cobalt.pfx b/starboard/xb1/cert/cobalt.pfx
new file mode 100644
index 0000000..3f8d22d
--- /dev/null
+++ b/starboard/xb1/cert/cobalt.pfx
Binary files differ
diff --git a/starboard/xb1/cobalt/__init__.py b/starboard/xb1/cobalt/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/starboard/xb1/cobalt/__init__.py
diff --git a/starboard/xb1/cobalt/configuration.py b/starboard/xb1/cobalt/configuration.py
new file mode 100644
index 0000000..532c374
--- /dev/null
+++ b/starboard/xb1/cobalt/configuration.py
@@ -0,0 +1,48 @@
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Starboard Microsoft Xbox Cobalt configuration."""
+
+from cobalt.build import cobalt_configuration
+from starboard.tools.testing import test_filter
+
+
+class CobaltXB1Configuration(cobalt_configuration.CobaltConfiguration):
+  """Starboard Microsoft Xbox Cobalt configuration."""
+
+  def WebdriverBenchmarksEnabled(self):
+    return True
+
+  def GetTestFilters(self):
+    filters = super().GetTestFilters()
+    for target, tests in self.__FILTERED_TESTS.items():
+      filters.extend(test_filter.TestFilter(target, test) for test in tests)
+    return filters
+
+  def GetWebPlatformTestFilters(self):
+    filters = super().GetWebPlatformTestFilters()
+    filters += [
+        '*WebPlatformTest.Run*',
+    ]
+    return filters
+
+  __FILTERED_TESTS = {  # pylint: disable=invalid-name
+      'base_unittests': ['PathServiceTest.Get',],
+      # TODO(b/284008426): update comment or re-enable once fixed.
+      'persistent_settings_test': [
+          'PersistentSettingTest.DeleteSettings',
+          'PersistentSettingTest.InvalidSettings'
+      ],
+      # TODO(b/275908073): update comment or re-enable once fixed.
+      'renderer_test': ['StressTest.TooManyTextures'],
+  }
diff --git a/starboard/xb1/cobalt/package.py b/starboard/xb1/cobalt/package.py
new file mode 100644
index 0000000..d0c4a48
--- /dev/null
+++ b/starboard/xb1/cobalt/package.py
@@ -0,0 +1,40 @@
+#!/usr/bin/python
+
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Cobalt specific configuration for XB1 packages."""
+
+from starboard.tools import config
+
+_XB1_PACKAGE_CONFIGURATIONS = {
+    'youtube': config.GetAll(),
+    'mainappbeta': [config.Config.QA, config.Config.GOLD],
+    'youtubetv': [config.Config.QA, config.Config.GOLD]
+}
+
+
+def _GetPackageConfigurationsForPoduct(product):
+  return _XB1_PACKAGE_CONFIGURATIONS[product]
+
+
+def DefaultPackageParameters(_, product):
+  """Default parameters to be passed to XB1's Package constructor."""
+  return {'publisher': None, 'product': product}
+
+
+def NightlyPackageParametersList(product):
+  """Yield a (config, package_parameters, install_targets) tuple."""
+  for configuration in _GetPackageConfigurationsForPoduct(product):
+    package_parameters = DefaultPackageParameters(configuration, product)
+    yield (configuration, package_parameters, None)
diff --git a/cobalt/script/v8c/stack_trace_helpers.cc b/starboard/xb1/configuration_public.h
similarity index 64%
rename from cobalt/script/v8c/stack_trace_helpers.cc
rename to starboard/xb1/configuration_public.h
index cbec9de..56a8866 100644
--- a/cobalt/script/v8c/stack_trace_helpers.cc
+++ b/starboard/xb1/configuration_public.h
@@ -12,19 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "cobalt/script/util/stack_trace_helpers.h"
+// Other source files should never include this header directly, but should
+// include the generic "starboard/configuration.h" instead.
 
-#include "base/logging.h"
+#ifndef STARBOARD_XB1_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_XB1_CONFIGURATION_PUBLIC_H_
 
-namespace cobalt {
-namespace script {
-namespace util {
+#include "starboard/xb1/shared/configuration_public.h"
 
-StackTraceGenerator* GetThreadLocalStackTraceGenerator() {
-  NOTIMPLEMENTED();
-  return nullptr;
-}
-
-}  // namespace util
-}  // namespace script
-}  // namespace cobalt
+#endif  // STARBOARD_XB1_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/xb1/gyp_configuration.py b/starboard/xb1/gyp_configuration.py
new file mode 100644
index 0000000..eeab585
--- /dev/null
+++ b/starboard/xb1/gyp_configuration.py
@@ -0,0 +1,42 @@
+# Copyright 2016 The Cobalt Authors. All Rights Reserved.

+#

+# Licensed under the Apache License, Version 2.0 (the "License");

+# you may not use this file except in compliance with the License.

+# You may obtain a copy of the License at

+#

+#     http://www.apache.org/licenses/LICENSE-2.0

+#

+# Unless required by applicable law or agreed to in writing, software

+# distributed under the License is distributed on an "AS IS" BASIS,

+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+# See the License for the specific language governing permissions and

+# limitations under the License.

+"""Starboard Xbox One platform configuration for gyp_cobalt."""

+import imp  # pylint: disable=deprecated-module

+import logging

+import os

+from starboard.shared.win32 import gyp_configuration as gyp_configuration_win32

+

+

+def CreatePlatformConfig():

+  try:

+    xb1_config = Xb1Configuration('xb1')

+    return xb1_config

+  except RuntimeError as e:

+    logging.critical(e)

+    return None

+

+

+class Xb1Configuration(gyp_configuration_win32.Win32SharedConfiguration):

+  """Starboard XB1 platform configuration."""

+

+  def GetLauncher(self):

+    """Gets the module used to launch applications on this platform."""

+    module_path = os.path.abspath(

+        os.path.join(os.path.dirname(__file__), 'launcher.py'))

+    launcher_module = imp.load_source('launcher', module_path)

+    return launcher_module

+

+  def GetDeployPathPatterns(self):

+    """example src/out/xb1_devel/appx"""

+    return ['appx/*']  # Overinclude

diff --git a/starboard/xb1/i18n/BUILD.gn b/starboard/xb1/i18n/BUILD.gn
new file mode 100644
index 0000000..bc52aeb
--- /dev/null
+++ b/starboard/xb1/i18n/BUILD.gn
@@ -0,0 +1,57 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//starboard/build/convert_i18n_data.gni")
+
+convert_i18n_data("i18n") {
+  install_content = true
+  xlb_files = [
+    "da.xlb",
+    "de-AT.xlb",
+    "de-CH.xlb",
+    "de.xlb",
+    "en-AU.xlb",
+    "en-CA.xlb",
+    "en-GB.xlb",
+    "en-IE.xlb",
+    "en.xlb",
+    "es-419.xlb",
+    "es-AR.xlb",
+    "es-CL.xlb",
+    "es-CO.xlb",
+    "es-MX.xlb",
+    "es-US.xlb",
+    "es.xlb",
+    "fi.xlb",
+    "fr-CA.xlb",
+    "fr-CH.xlb",
+    "fr.xlb",
+    "it.xlb",
+    "ja.xlb",
+    "ko.xlb",
+    "nb.xlb",
+    "nl.xlb",
+    "pl.xlb",
+    "pt-BR.xlb",
+    "pt-PT.xlb",
+    "pt.xlb",
+    "ru.xlb",
+    "sv.xlb",
+    "tr.xlb",
+    "zh-CN.xlb",
+    "zh-HK.xlb",
+    "zh-TW.xlb",
+    "zh.xlb",
+  ]
+}
diff --git a/starboard/xb1/i18n/da.xlb b/starboard/xb1/i18n/da.xlb
new file mode 100644
index 0000000..b9d99bf
--- /dev/null
+++ b/starboard/xb1/i18n/da.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="da">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">For at bruge YouTube skal du logge ind på en konto med et Xbox Live-medlemskab.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Vælg en konto</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Afslut</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Der kunne desværre ikke oprettes forbindelse til YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Du kan få flere oplysninger om dette problem på youtube.com/xb1_help, eller du kan give feedback på youtube.com/xb1_feedback. Du kan også gå til www.xbox.com/status for at få flere oplysninger om applikationsudfald.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Xbox Live kan ikke kontaktes.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Prøv igen</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/de-AT.xlb b/starboard/xb1/i18n/de-AT.xlb
new file mode 100644
index 0000000..a74dbfc
--- /dev/null
+++ b/starboard/xb1/i18n/de-AT.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="de-AT">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Melde dich bei einem Konto mit Xbox Live-Mitgliedschaft an, um YouTube zu nutzen.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Konto auswählen</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Schließen</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Die Verbindung zu YouTube konnte nicht hergestellt werden.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Weitere Informationen zu diesem Problem erhältst du unter youtube.com/xb1_help. Unter youtube.com/xb1_feedback kannst du Feedback abgeben. Weitere Informationen zu Anwendungsausfällen findest du auch unter www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Kontakt zu Xbox Live konnte nicht hergestellt werden.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Erneut versuchen</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/de-CH.xlb b/starboard/xb1/i18n/de-CH.xlb
new file mode 100644
index 0000000..9b2323f
--- /dev/null
+++ b/starboard/xb1/i18n/de-CH.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="de-CH">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Melde dich bei einem Konto mit Xbox Live-Mitgliedschaft an, um YouTube zu nutzen.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Konto auswählen</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Schliessen</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Die Verbindung zu YouTube konnte nicht hergestellt werden.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Weitere Informationen zu diesem Problem erhältst du unter youtube.com/xb1_help. Unter youtube.com/xb1_feedback kannst du Feedback abgeben. Weitere Informationen zu Anwendungsausfällen findest du auch unter www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Kontakt zu Xbox Live konnte nicht hergestellt werden.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Erneut versuchen</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/de.xlb b/starboard/xb1/i18n/de.xlb
new file mode 100644
index 0000000..ade1f9e
--- /dev/null
+++ b/starboard/xb1/i18n/de.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="de">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Melde dich bei einem Konto mit Xbox Live-Mitgliedschaft an, um YouTube zu nutzen.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Konto auswählen</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Schließen</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Die Verbindung zu YouTube konnte nicht hergestellt werden.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Weitere Informationen zu diesem Problem erhältst du unter youtube.com/xb1_help. Unter youtube.com/xb1_feedback kannst du Feedback abgeben. Weitere Informationen zu Anwendungsausfällen findest du auch unter www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Kontakt zu Xbox Live konnte nicht hergestellt werden.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Erneut versuchen</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/en-AU.xlb b/starboard/xb1/i18n/en-AU.xlb
new file mode 100644
index 0000000..a9efb4a
--- /dev/null
+++ b/starboard/xb1/i18n/en-AU.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="en-AU">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">To use YouTube, please sign in to an account with Xbox Live membership.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Choose an account</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Exit</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Sorry, could not connect to YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">You can find more information on this issue at youtube.com/xb1_help, or leave feedback at youtube.com/xb1_feedback. For more information on application outages, you can also visit www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Unable to contact Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Retry</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/en-CA.xlb b/starboard/xb1/i18n/en-CA.xlb
new file mode 100644
index 0000000..a69d35e
--- /dev/null
+++ b/starboard/xb1/i18n/en-CA.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="en-CA">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">To use YouTube, please sign in to an account with Xbox Live membership.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Choose an account</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Exit</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Sorry, could not connect to YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">You can find more information on this issue at youtube.com/xb1_help, or leave feedback at youtube.com/xb1_feedback. For more information on application outages, you can also visit www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Unable to contact Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Retry</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/en-GB.xlb b/starboard/xb1/i18n/en-GB.xlb
new file mode 100644
index 0000000..580d8b5
--- /dev/null
+++ b/starboard/xb1/i18n/en-GB.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="en-GB">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">To use YouTube, please sign in to an account with Xbox Live membership.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Choose an account</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Exit</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Sorry, could not connect to YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">You can find more information on this issue at youtube.com/xb1_help, or leave feedback at youtube.com/xb1_feedback. For more information on application outages, you can also visit www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Unable to contact Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Retry</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/en-IE.xlb b/starboard/xb1/i18n/en-IE.xlb
new file mode 100644
index 0000000..40f91cb
--- /dev/null
+++ b/starboard/xb1/i18n/en-IE.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="en-IE">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">To use YouTube, please sign in to an account with Xbox Live membership.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Choose an account</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Exit</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Sorry, could not connect to YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">You can find more information on this issue at youtube.com/xb1_help, or leave feedback at youtube.com/xb1_feedback. For more information on application outages, you can also visit www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Unable to contact Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Retry</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/en.xlb b/starboard/xb1/i18n/en.xlb
new file mode 100644
index 0000000..9081b30
--- /dev/null
+++ b/starboard/xb1/i18n/en.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="en">
+<messages>
+<msg name="GOLD_ACCOUNT_REQUIRED" desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account">To use YouTube, please sign in to an account with Xbox Live membership.</msg>
+<msg name="CHOOSE_ACCOUNT_BUTTON" desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account.">Choose an account</msg>
+<msg name="EXIT_BUTTON" desc="This is the text on a button which will exit the application.">Exit</msg>
+<msg name="UNABLE_TO_CONTACT_YOUTUBE_1" desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application.">Sorry, could not connect to YouTube.</msg>
+<msg name="UNABLE_TO_CONTACT_YOUTUBE_2" desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application.">You can find more information on this issue at youtube.com/xb1_help, or leave feedback at youtube.com/xb1_feedback. For more information on application outages, you can also visit www.xbox.com/status.</msg>
+<msg name="UNABLE_TO_CONTACT_LIVE" desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service.">Unable to contact Xbox Live.</msg>
+<msg name="RETRY_BUTTON" desc="This is the text on a button which will retry a previously attempted action.">Retry</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/es-419.xlb b/starboard/xb1/i18n/es-419.xlb
new file mode 100644
index 0000000..0c8b68c
--- /dev/null
+++ b/starboard/xb1/i18n/es-419.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="es-419">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Para usar YouTube, accede a una cuenta de miembros de Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Elegir una cuenta</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Salir</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">No se puede establecer conexión con YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Puedes encontrar más información sobre este problema en youtube.com/xb1_help o dejar un comentario en youtube.com/xb1_feedback. Para obtener más información sobre las interrupciones de la app, también puedes visitar www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">No es posible contactarse con Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Reintentar</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/es-AR.xlb b/starboard/xb1/i18n/es-AR.xlb
new file mode 100644
index 0000000..3b9aed7
--- /dev/null
+++ b/starboard/xb1/i18n/es-AR.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="es-AR">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Para usar YouTube, accede a una cuenta de miembros de Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Elegir una cuenta</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Salir</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">No se puede establecer conexión con YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Puedes encontrar más información sobre este problema en youtube.com/xb1_help o dejar un comentario en youtube.com/xb1_feedback. Para obtener más información sobre las interrupciones de la app, también puedes visitar www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">No es posible contactarse con Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Reintentar</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/es-CL.xlb b/starboard/xb1/i18n/es-CL.xlb
new file mode 100644
index 0000000..36a2b2b
--- /dev/null
+++ b/starboard/xb1/i18n/es-CL.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="es-CL">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Para usar YouTube, accede a una cuenta de miembros de Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Elegir una cuenta</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Salir</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">No se puede establecer conexión con YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Puedes encontrar más información sobre este problema en youtube.com/xb1_help o dejar un comentario en youtube.com/xb1_feedback. Para obtener más información sobre las interrupciones de la app, también puedes visitar www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">No es posible contactarse con Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Reintentar</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/es-CO.xlb b/starboard/xb1/i18n/es-CO.xlb
new file mode 100644
index 0000000..ea1dcc3
--- /dev/null
+++ b/starboard/xb1/i18n/es-CO.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="es-CO">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Para usar YouTube, accede a una cuenta de miembros de Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Elegir una cuenta</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Salir</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">No se puede establecer conexión con YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Puedes encontrar más información sobre este problema en youtube.com/xb1_help o dejar un comentario en youtube.com/xb1_feedback. Para obtener más información sobre las interrupciones de la app, también puedes visitar www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">No es posible contactarse con Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Reintentar</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/es-MX.xlb b/starboard/xb1/i18n/es-MX.xlb
new file mode 100644
index 0000000..26e3946
--- /dev/null
+++ b/starboard/xb1/i18n/es-MX.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="es-MX">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Para usar YouTube, accede a una cuenta de miembros de Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Elegir una cuenta</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Salir</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">No se puede establecer conexión con YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Puedes encontrar más información sobre este problema en youtube.com/xb1_help o dejar un comentario en youtube.com/xb1_feedback. Para obtener más información sobre las interrupciones de la app, también puedes visitar www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">No es posible contactarse con Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Reintentar</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/es-US.xlb b/starboard/xb1/i18n/es-US.xlb
new file mode 100644
index 0000000..b578686
--- /dev/null
+++ b/starboard/xb1/i18n/es-US.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="es-US">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Para usar YouTube, accede a una cuenta de miembros de Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Elegir una cuenta</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Salir</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">No se puede establecer conexión con YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Puedes encontrar más información sobre este problema en youtube.com/xb1_help o dejar un comentario en youtube.com/xb1_feedback. Para obtener más información sobre las interrupciones de la app, también puedes visitar www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">No es posible contactarse con Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Reintentar</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/es.xlb b/starboard/xb1/i18n/es.xlb
new file mode 100644
index 0000000..a52d178
--- /dev/null
+++ b/starboard/xb1/i18n/es.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="es">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Para utilizar YouTube, inicia sesión en una cuenta de Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Selecciona una cuenta</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Salir</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">No se puede establecer conexión con YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Obtén más información sobre este problema en youtube.com/xb1_help o envía tus sugerencias en youtube.com/xb1_feedback. Si necesitas más información sobre las interrupciones de la aplicación, también puedes ir a www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">No se ha podido establecer contacto con Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Reintentar</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/fi.xlb b/starboard/xb1/i18n/fi.xlb
new file mode 100644
index 0000000..10c55d6
--- /dev/null
+++ b/starboard/xb1/i18n/fi.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="fi">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Jos haluat käyttää YouTubea, kirjaudu sisään Xbox Live -tilillä.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Valitse tili</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Sulje</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">YouTubeen yhdistäminen ei onnistu.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Lisätietoja ongelmasta on osoitteessa youtube.com/xb1_help. Voit myös lähettää palautetta osoitteessa youtube.com/xb1_feedback. Lisätietoja sovellusten käyttökatkoksista on osoitteessa www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Yhteyden muodostaminen Xbox Liveen ei onnistu.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Yritä uudelleen</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/fr-CA.xlb b/starboard/xb1/i18n/fr-CA.xlb
new file mode 100644
index 0000000..43abcbc
--- /dev/null
+++ b/starboard/xb1/i18n/fr-CA.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="fr-CA">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Pour utiliser YouTube, veuillez vous connecter à un compte avec abonnement à Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Sélectionner un compte</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Quitter</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Désolés, la connexion à YouTube est impossible.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Vous pouvez en savoir plus sur ce problème à l'adresse youtube.com/xb1_help, ou nous envoyer vos commentaires sur youtube.com/xb1_feedback. Pour en savoir plus au sujet des pannes d'application, vous pouvez également vous rendre à l'adresse www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Communication impossible avec Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Réessayer</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/fr-CH.xlb b/starboard/xb1/i18n/fr-CH.xlb
new file mode 100644
index 0000000..c5c7887
--- /dev/null
+++ b/starboard/xb1/i18n/fr-CH.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="fr-CH">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Pour utiliser YouTube, veuillez vous connecter à un compte disposant d'un abonnement Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Sélectionner un compte</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Quitter</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Impossible de se connecter à YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Vous pouvez rechercher plus d'informations relatives à ce problème sur youtube.com/xb1_help, ou laisser un commentaire sur youtube.com/xb1_feedback. Pour plus d'informations sur les interruptions d'application, vous pouvez également accéder à www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Impossible de se connecter à Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Réessayer</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/fr.xlb b/starboard/xb1/i18n/fr.xlb
new file mode 100644
index 0000000..32b80a4
--- /dev/null
+++ b/starboard/xb1/i18n/fr.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="fr">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Pour utiliser YouTube, veuillez vous connecter à un compte disposant d'un abonnement Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Sélectionner un compte</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Quitter</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Impossible de se connecter à YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Vous pouvez rechercher plus d'informations relatives à ce problème sur youtube.com/xb1_help, ou laisser un commentaire sur youtube.com/xb1_feedback. Pour plus d'informations sur les interruptions d'application, vous pouvez également accéder à www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Impossible de se connecter à Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Réessayer</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/it.xlb b/starboard/xb1/i18n/it.xlb
new file mode 100644
index 0000000..475b592
--- /dev/null
+++ b/starboard/xb1/i18n/it.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="it">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Per utilizzare YouTube, accedi a un account con l'iscrizione a Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Scegli un account</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Esci</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Impossibile connettersi a YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Puoi trovare ulteriori informazioni su questo problema all'indirizzo youtube.com/xb1_help o lasciare un commento su youtube.com/xb1_feedback. Per maggiori informazioni sulle interruzioni dell'applicazione, puoi visitare la pagina www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Impossibile contattare Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Riprova</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/ja.xlb b/starboard/xb1/i18n/ja.xlb
new file mode 100644
index 0000000..6fb5c9e
--- /dev/null
+++ b/starboard/xb1/i18n/ja.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="ja">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">YouTube を使用するには、Xbox Live メンバーシップのあるアカウントでログインしてください。</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">アカウントを選択</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">終了</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">YouTube に接続できませんでした。</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">この問題について詳しくは youtube.com/xb1_help をご覧ください。また、youtube.com/xb1_feedback からフィードバックを送信してください。アプリケーションのサービス停止については www.xbox.com/status をご覧ください。</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Xbox Live に接続できません。</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">再試行</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/ko.xlb b/starboard/xb1/i18n/ko.xlb
new file mode 100644
index 0000000..cb27060
--- /dev/null
+++ b/starboard/xb1/i18n/ko.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="ko">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">YouTube를 사용하려면 Xbox LIVE 멤버십으로 계정에 로그인하세요.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">계정 선택</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">종료</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">YouTube에 연결할 수 없습니다.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">youtube.com/xb1_help에서 이 문제에 대한 자세한 내용을 확인하거나 youtube.com/xb1_feedback에서 의견을 남길 수 있습니다. 애플리케이션 중단에 대한 자세한 내용은 www.xbox.com/status에서도 확인할 수 있습니다.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Xbox LIVE에 연결할 수 없습니다.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">다시 시도</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/nb.xlb b/starboard/xb1/i18n/nb.xlb
new file mode 100644
index 0000000..5ac3f26
--- /dev/null
+++ b/starboard/xb1/i18n/nb.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="nb">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Hvis du vil bruke YouTube, må du logge deg på en konto med Xbox Live-medlemskap.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Velg en konto</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Avslutt</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Beklager, kunne ikke koble til YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Du kan finne mer informasjon om dette problemet på youtube.com/xb1_help eller gi tilbakemelding på youtube.com/xb1_feedback. Hvis du vil ha mer informasjon om problemer med appen, kan du gå til www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Kan ikke kontakte Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Prøv på nytt</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/nl.xlb b/starboard/xb1/i18n/nl.xlb
new file mode 100644
index 0000000..5d53c43
--- /dev/null
+++ b/starboard/xb1/i18n/nl.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="nl">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Log in op een account met een Xbox Live-lidmaatschap om YouTube te gebruiken.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Een account selecteren</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Afsluiten</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Er kan geen verbinding worden gemaakt met YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Ga voor meer informatie over dit probleem naar youtube.com/xb1_help of laat een reactie achter op youtube.com/xb1_feedback. Meer informatie over problemen met applicaties vind je op www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Kan geen contact maken met Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Opnieuw proberen</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/pl.xlb b/starboard/xb1/i18n/pl.xlb
new file mode 100644
index 0000000..750069f
--- /dev/null
+++ b/starboard/xb1/i18n/pl.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="pl">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Aby korzystać z YouTube, zaloguj się na konto Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Wybierz konto</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Zamknij</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Nie udało się połączyć z YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Więcej informacji o tym problemie znajdziesz na youtube.com/xb1. Możesz także pozostawić swoją opinię na youtube.com/xb1_feedback. Informacje o przerwach w działaniu aplikacji znajdziesz na www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Nie można połączyć się z usługą Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Spróbuj jeszcze raz</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/pt-BR.xlb b/starboard/xb1/i18n/pt-BR.xlb
new file mode 100644
index 0000000..db78a25
--- /dev/null
+++ b/starboard/xb1/i18n/pt-BR.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="pt-BR">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Para usar o YouTube, faça login em uma conta usando a Assinatura Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Escolha uma conta</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Sair</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Infelizmente, não foi possível conectar ao YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Você pode encontrar mais informações sobre este problema em youtube.com/xb1_help ou deixar um feedback em youtube.com/xb1_feedback. Para mais informações sobre falhas no aplicativo, visite também www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Não foi possível contatar o Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Tentar novamente</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/pt-PT.xlb b/starboard/xb1/i18n/pt-PT.xlb
new file mode 100644
index 0000000..aaaeed2
--- /dev/null
+++ b/starboard/xb1/i18n/pt-PT.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="pt-PT">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Para utilizar o YouTube, inicie sessão numa conta com uma subscrição Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Selecione uma conta</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Sair</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Lamentamos, não foi possível estabelecer a ligação ao YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Pode encontrar mais informações acerca deste problema em youtube.com/xb1_help, ou deixar um comentário em youtube.com/xb1_feedback. Para mais informações acerca de falhas da app, também pode visitar www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Não é possível comunicar com o Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Tentar novamente</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/pt.xlb b/starboard/xb1/i18n/pt.xlb
new file mode 100644
index 0000000..92da77a
--- /dev/null
+++ b/starboard/xb1/i18n/pt.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="pt">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Para usar o YouTube, faça login em uma conta usando a Assinatura Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Escolha uma conta</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Sair</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Infelizmente, não foi possível conectar ao YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Você pode encontrar mais informações sobre este problema em youtube.com/xb1_help ou deixar um feedback em youtube.com/xb1_feedback. Para mais informações sobre falhas no aplicativo, visite também www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Não foi possível contatar o Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Tentar novamente</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/ru.xlb b/starboard/xb1/i18n/ru.xlb
new file mode 100644
index 0000000..ae2239f
--- /dev/null
+++ b/starboard/xb1/i18n/ru.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="ru">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Чтобы использовать YouTube, войдите в аккаунт с доступом к Xbox Live.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Выбрать аккаунт</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Выйти</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Не удалось установить соединение с YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Подробнее о проблеме читайте здесь: youtube.com/xb1_help. Если вы хотите оставить отзыв, перейдите на эту страницу: youtube.com/xb1_feedback. О сбоях в работе приложения мы также рассказываем на странице www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Невозможно подключиться к Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Повторить</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/sv.xlb b/starboard/xb1/i18n/sv.xlb
new file mode 100644
index 0000000..ca1ce0a
--- /dev/null
+++ b/starboard/xb1/i18n/sv.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="sv">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">Om du vill använda YouTube loggar du in på ett konto med Xbox Live-medlemskap.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Välj ett konto</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Avsluta</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Det gick inte att ansluta till YouTube.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">Det finns mer information om det här problemet på youtube.com/xb1_help, och du kan skicka feedback på youtube.com/xb1_feedback. Mer information om programavbrott finns på www.xbox.com/status.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">Det går inte att kontakta Xbox Live.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Försök igen</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/tr.xlb b/starboard/xb1/i18n/tr.xlb
new file mode 100644
index 0000000..6f80207
--- /dev/null
+++ b/starboard/xb1/i18n/tr.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="tr">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">YouTube'u kullanmak için lütfen Xbox Live üyeliğine sahip bir hesapta oturum açın.</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">Bir hesap seç</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">Çıkış yap</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">Maalesef YouTube'a bağlanılamadı.</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">youtube.com/xb1_help adresinde bu sorunla ilgili daha fazla bilgi bulabilir veya youtube.com/xb1_feedback adresinde geri bildirim bırakabilirsiniz. Uygulamanın geçici olarak hizmet dışı kalmasıyla ilgili daha fazla bilgi için www.xbox.com/status adresini de ziyaret edebilirsiniz.</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">XBox Live'a erişilemiyor.</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">Tekrar Dene</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/zh-CN.xlb b/starboard/xb1/i18n/zh-CN.xlb
new file mode 100644
index 0000000..8dc3d59
--- /dev/null
+++ b/starboard/xb1/i18n/zh-CN.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="zh-CN">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">要使用YouTube,请以Xbox Live会员身份登录帐号。</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">选择帐号</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">退出</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">抱歉,无法连接到 YouTube。</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">您可以访问 youtube.com/xb1_help 详细了解此问题,或访问 youtube.com/xb1_feedback 提供反馈。有关应用停止运行的详情,您还可访问 www.xbox.com/status。</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">无法联系 Xbox Live。</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">重试</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/zh-HK.xlb b/starboard/xb1/i18n/zh-HK.xlb
new file mode 100644
index 0000000..87a5c92
--- /dev/null
+++ b/starboard/xb1/i18n/zh-HK.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="zh-HK">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">如要使用 YouTube,請登入具有 Xbox Live 會員資格的帳戶。</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">選擇帳戶</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">結束</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">抱歉!無法連結 YouTube。</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">你可以在 www.youtube.com/xb1_help 查看更多資訊,或前往 youtube.com/xb1_feedback 留下意見。如要瞭解更多有關應用程式故障的事宜,你也可以前往:www.xbox.com/status。</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">無法連線至 Xbox Live。</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">重試</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/zh-TW.xlb b/starboard/xb1/i18n/zh-TW.xlb
new file mode 100644
index 0000000..d5343a2
--- /dev/null
+++ b/starboard/xb1/i18n/zh-TW.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="zh-TW">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">如要使用 YouTube,請登入具有 Xbox Live 會員資格的帳戶。</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">選擇帳戶</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">離開</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">很抱歉,無法連線至 YouTube</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">如需進一步瞭解這個問題,請前往 youtube.com/xb1_help;如要提供意見,請前往 youtube.com/xb1_feedback。如要進一步瞭解應用程式暫停服務的相關細節,請瀏覽 www.xbox.com/status。</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">無法連線至 Xbox Live。</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">重試</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/i18n/zh.xlb b/starboard/xb1/i18n/zh.xlb
new file mode 100644
index 0000000..77ae1b3
--- /dev/null
+++ b/starboard/xb1/i18n/zh.xlb
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<localizationbundle locale="zh">
+<messages>
+<msg desc="[XboxOne] This error message is shown to the user when the user is not logged in to an Xbox Live account" name="GOLD_ACCOUNT_REQUIRED">要使用YouTube,请以Xbox Live会员身份登录帐号。</msg>
+<msg desc="This is the text on a button which will activate the Xbox account picker and allow the user to choose another Xbox Live account." name="CHOOSE_ACCOUNT_BUTTON">选择帐号</msg>
+<msg desc="This is the text on a button which will exit the application." name="EXIT_BUTTON">退出</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_1">抱歉,无法连接到 YouTube。</msg>
+<msg desc="This error message is shown to the user when the application is unable to make a request to a service that is required to use the application." name="UNABLE_TO_CONTACT_YOUTUBE_2">您可以访问 youtube.com/xb1_help 详细了解此问题,或访问 youtube.com/xb1_feedback 提供反馈。有关应用停止运行的详情,您还可访问 www.xbox.com/status。</msg>
+<msg desc="This message is shown to users if the application is unable to contact Microsoft's Xbox Live service." name="UNABLE_TO_CONTACT_LIVE">无法联系 Xbox Live。</msg>
+<msg desc="This is the text on a button which will retry a previously attempted action." name="RETRY_BUTTON">重试</msg>
+</messages>
+</localizationbundle>
diff --git a/starboard/xb1/install_target.gni b/starboard/xb1/install_target.gni
new file mode 100644
index 0000000..45ee0c7
--- /dev/null
+++ b/starboard/xb1/install_target.gni
@@ -0,0 +1,168 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/config/win/visual_studio_version.gni")
+import("//starboard/build/toolchain/win/variables.gni")
+
+template("install_target") {
+  not_needed(invoker, [ "type" ])
+  installable_target_name = invoker.installable_target_name
+  should_run_mspdbcmf =
+      installable_target_name == "cobalt" && (is_qa || is_gold)
+
+  if (should_run_mspdbcmf) {
+    # This takes a long time to run and is only necessary for cobalt.
+    create_pdb_file_name = "${installable_target_name}_create_pdb_file"
+    action(create_pdb_file_name) {
+      forward_variables_from(invoker, [ "testonly" ])
+      script = "//starboard/build/run_bash.py"
+      sources = [ "$root_out_dir/${installable_target_name}.exe" ]
+      outputs = [ "$root_out_dir/${installable_target_name}.exe.pdb" ]
+      args = [
+        "$tool_base_path/mspdbcmf.exe",
+        rebase_path(outputs[0], root_build_dir),
+      ]
+      deps = [ ":$installable_target_name" ]
+    }
+  }
+
+  if (is_internal_build) {
+    products = [ "youtube" ]
+    if (installable_target_name == "cobalt") {
+      products += [
+        "youtubetv",
+        "mainappbeta",
+      ]
+    }
+  } else {
+    products = [ "cobalt" ]
+  }
+
+  foreach(product, products) {
+    if (product == "youtube" || product == "cobalt") {
+      target_base_name = target_name
+      appx_output_dir = "$root_out_dir/appx"
+      template_output_dir = "$root_out_dir/templates"
+    } else if (product == "youtubetv") {
+      not_needed([ "target_name" ])
+      target_base_name = product + "_install"
+      appx_output_dir = "$root_out_dir/youtubetv-appx"
+      template_output_dir = "$root_out_dir/youtubetv-templates"
+    } else if (product == "mainappbeta") {
+      not_needed([ "target_name" ])
+      target_base_name = product + "_install"
+      appx_output_dir = "$root_out_dir/mainappbeta-appx"
+      template_output_dir = "$root_out_dir/mainappbeta-templates"
+    } else {
+      assert(
+          false,
+          "|product| must be one of youtube, youtubetv, mainappbeta, or cobalt.")
+    }
+
+    appx_template_dir_src = "//starboard/xb1/templates"
+    application_section_output =
+        "$template_output_dir/ApplicationSection.$installable_target_name.xml"
+    application_template =
+        "$appx_template_dir_src/ApplicationSection.xml.template"
+
+    copy_application_name = "${target_base_name}_copy_exe"
+    copy(copy_application_name) {
+      forward_variables_from(invoker, [ "testonly" ])
+      sources = [ "$root_out_dir/${installable_target_name}.exe" ]
+      outputs = [ "${appx_output_dir}/${installable_target_name}.exe" ]
+      deps = [ ":$installable_target_name" ]
+    }
+
+    copy_winmd_name = "${target_base_name}_copy_winmd_for_appx"
+    action(copy_winmd_name) {
+      forward_variables_from(invoker, [ "testonly" ])
+      sources = [ rebase_path("$root_out_dir/${installable_target_name}.exe") ]
+      outputs = [ "${appx_output_dir}/${installable_target_name}.winmd" ]
+
+      script = "//starboard/build/copy_file.py"
+      args = [
+        rebase_path("$root_out_dir/${installable_target_name}.winmd"),
+        rebase_path(outputs[0], root_build_dir),
+      ]
+      deps = [ ":$installable_target_name" ]
+    }
+
+    generate_application_section_name =
+        "${target_base_name}_generate_application_section"
+    action(generate_application_section_name) {
+      forward_variables_from(invoker, [ "testonly" ])
+      script = "//starboard/xb1/tools/application_section_generator.py"
+
+      inputs = [ application_template ]
+      outputs = [ application_section_output ]
+      args = [
+        "--config",
+        build_type,
+        "--application_template",
+        rebase_path(application_template, root_build_dir),
+        "--application_name",
+        installable_target_name,
+        "--product",
+        product,
+        "--output",
+        rebase_path(outputs[0], root_build_dir),
+      ]
+      deps = [ ":$installable_target_name" ]
+    }
+
+    appx_run_name = "${target_base_name}_appx_run"
+    action(appx_run_name) {
+      forward_variables_from(invoker, [ "testonly" ])
+      script = "//starboard/xb1/tools/appx.py"
+      appx_manifest_template =
+          "$appx_template_dir_src/AppxManifest.xml.template"
+      inputs = [
+        appx_manifest_template,
+        application_section_output,
+      ]
+      outputs = [ "$template_output_dir/${installable_target_name}.should_not_exist.always_run" ]
+      args = [
+        "--config",
+        build_type,
+        "--appx_template",
+        rebase_path(appx_manifest_template, root_build_dir),
+        "--template_directory",
+        rebase_path(template_output_dir, root_build_dir),
+        "--manifest_out",
+        rebase_path("$appx_output_dir/AppxManifest.xml", root_out_dir),
+        "--product",
+        product,
+      ]
+      deps = [ ":$generate_application_section_name" ]
+    }
+
+    group(target_base_name) {
+      forward_variables_from(invoker, [ "testonly" ])
+      deps = invoker.deps + [
+               ":$appx_run_name",
+               ":$copy_application_name",
+               ":$copy_winmd_name",
+               ":$generate_application_section_name",
+               ":$installable_target_name",
+               "//starboard/xb1/install_target:${product}_copy_assets",
+             ]
+      if (is_debug || is_devel) {
+        deps += [ "//starboard/xb1/install_target:${product}_copy_ucrt_dll" ]
+      }
+      if (should_run_mspdbcmf) {
+        deps += [ ":$create_pdb_file_name" ]
+      }
+    }
+  }
+}
diff --git a/starboard/xb1/install_target/BUILD.gn b/starboard/xb1/install_target/BUILD.gn
new file mode 100644
index 0000000..a5fa487
--- /dev/null
+++ b/starboard/xb1/install_target/BUILD.gn
@@ -0,0 +1,64 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+if (is_internal_build) {
+  _products = [
+    "youtube",
+    "youtubetv",
+    "mainappbeta",
+  ]
+} else {
+  _products = [ "cobalt" ]
+}
+foreach(product, _products) {
+  if (product == "youtube") {
+    appx_output_dir = "$root_out_dir/appx"
+    appx_asset_dir_src = "//internal/starboard/xb1/assets"
+  } else if (product == "youtubetv") {
+    appx_output_dir = "$root_out_dir/youtubetv-appx"
+    appx_asset_dir_src = "//internal/starboard/xb1/youtubetv/assets"
+  } else if (product == "mainappbeta") {
+    appx_output_dir = "$root_out_dir/mainappbeta-appx"
+    appx_asset_dir_src = "//starboard/xb1/assets"
+  } else if (product == "cobalt") {
+    appx_output_dir = "$root_out_dir/appx"
+  } else {
+    assert(
+        false,
+        "|product| must be one of youtube, youtubetv, mainappbeta, or cobalt.")
+  }
+
+  if (!is_internal_build) {
+    # Use Cobalt assets for all external builds
+    appx_asset_dir_src = "//starboard/xb1/assets"
+  }
+
+  copy("${product}_copy_assets") {
+    sources = [
+      "$appx_asset_dir_src/Square150x150Logo.scale-100.png",
+      "$appx_asset_dir_src/Square310x310Logo.scale-100.png",
+      "$appx_asset_dir_src/Square44x44Logo.scale-100.png",
+      "$appx_asset_dir_src/Square71x71Logo.scale-100.png",
+      "$appx_asset_dir_src/Wide310x150Logo.scale-100.png",
+    ]
+    outputs = [ "$appx_output_dir/Assets/{{source_file_part}}" ]
+  }
+
+  if (is_debug || is_devel) {
+    copy("${product}_copy_ucrt_dll") {
+      sources = [ "C:/Program Files (x86)/Microsoft SDKs/Windows Kits/10/ExtensionSDKs/Microsoft.UniversalCRT.Debug/$wdk_version/Redist/Debug/x64/ucrtbased.dll" ]
+      outputs = [ "$appx_output_dir/ucrtbased.dll" ]
+    }
+  }
+}
diff --git a/starboard/xb1/launcher.py b/starboard/xb1/launcher.py
new file mode 100644
index 0000000..9be3550
--- /dev/null
+++ b/starboard/xb1/launcher.py
@@ -0,0 +1,77 @@
+#
+# Copyright 2018 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""XB1 implementation of Starboard launcher abstraction."""
+
+from __future__ import print_function
+
+from starboard.tools import abstract_launcher
+from starboard.xb1.tools import uwp_launcher
+from starboard.xb1.tools import xb1_launcher
+
+_UWP_XB1_MESSAGE = '****************************************************\n' + \
+                   '*                    UWP on XB1                    *\n' + \
+                   '****************************************************\n'
+
+_UWP_WIN_MESSAGE = '****************************************************\n' + \
+                   '*                  UWP on Windows                  *\n' + \
+                   '****************************************************\n'
+
+
+# This Launcher delegates either to an xb1 launcher or to a uwp launcher.
+# The xb1 launcher runs tests on the xb1 remote device.
+# The uwp launcher runs tests on the local windows device.
+class Launcher(abstract_launcher.AbstractLauncher):
+  """Run an application on XB1."""
+
+  def __init__(self, platform, target_name, config, device_id, **kwargs):
+    super().__init__(platform, target_name, config, device_id, **kwargs)
+    if not device_id:
+      raise ValueError('\nMissing device_id, please specify --device_id '
+                       '<XboxIP> or --device_id win_uwp (running in Windows).')
+    if device_id == 'win_uwp':
+      self.output_file.write('\n' + _UWP_WIN_MESSAGE)
+      self.delegate = uwp_launcher.Launcher(platform, target_name, config,
+                                            device_id, **kwargs)
+    else:
+      # Assume the address points to an xbox.
+      self.output_file.write('\n' + _UWP_XB1_MESSAGE)
+      # Defer loading because depot_tools does not have the required
+      # python requests library installed.
+      # TODO: Install requests library depot_tools and update.
+      self.delegate = xb1_launcher.Launcher(platform, target_name, config,
+                                            device_id, **kwargs)
+
+  # Run() and Kill() needs to be explicitly implemented per AbstractLauncher.
+  def Run(self):
+    return self.delegate.Run()
+
+  def Kill(self):
+    return self.delegate.Kill()
+
+  # All other functions are automatically delegated using this function.
+  def __getattr__(self, fname):
+
+    def method(*args):
+      f = getattr(self.delegate, fname)
+      return f(*args)
+
+    return method
+
+  def GetDeviceIp(self):
+    """Gets the device IP. TODO: Implement."""
+    return None
+
+  def GetDeviceOutputPath(self):
+    self.delegate.GetDeviceOutputPath()
diff --git a/starboard/xb1/platform_configuration/BUILD.gn b/starboard/xb1/platform_configuration/BUILD.gn
new file mode 100644
index 0000000..5c493ae
--- /dev/null
+++ b/starboard/xb1/platform_configuration/BUILD.gn
@@ -0,0 +1,82 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+config("platform_configuration") {
+  configs = [
+    "//starboard/win/shared/platform_configuration",
+    ":target",
+  ]
+}
+
+config("target") {
+  if (is_internal_build) {
+    include_dirs = [
+      "//third_party/internal/libvpx_xb1",
+      "//third_party/internal/libav1_xb1/libav1",
+      "//third_party/internal/libav1_xb1/libav1/build",
+    ]
+  }
+  libs = []
+  ldflags = [
+    "/MACHINE:x64",
+
+    # Don't send error reports to MS.
+    "/errorReport:none",
+  ]
+  arflags = []
+  cflags = [
+    # The warning "Padding was added at the end of a structure" happens
+    # in the library third_party/internal/libav1_xb1.
+    "/wd4324",
+  ]
+
+  if (is_debug || is_devel) {
+    libs = [
+      "vccorlibd.lib",
+      "msvcrtd.lib",
+      "msvcprtd.lib",
+      "vcruntimed.lib",
+      "ucrtd.lib",
+    ]
+  } else {
+    libs = [
+      "vccorlib.lib",
+      "msvcrt.lib",
+      "msvcprt.lib",
+      "vcruntime.lib",
+      "ucrt.lib",
+    ]
+    ldflags += [ "/DEBUG:FASTLINK" ]
+  }
+
+  ldflags += [ "/NODEFAULTLIB" ]
+  arflags += [ "/NODEFAULTLIB" ]
+  libs += [
+    "d3d12.lib",
+    "dxguid.lib",
+    "iso_stdio_wide_specifiers.lib",
+    "mfplat.lib",
+    "mfuuid.lib",
+    "windowsapp.lib",
+  ]
+  ldflags += [
+    "/SUBSYSTEM:WINDOWS",
+
+    # WinMD file required for UWP.
+    "/WINMD",
+
+    # Required for UWP
+    "/APPCONTAINER",
+  ]
+}
diff --git a/starboard/xb1/platform_configuration/configuration.gni b/starboard/xb1/platform_configuration/configuration.gni
new file mode 100644
index 0000000..44a17e4
--- /dev/null
+++ b/starboard/xb1/platform_configuration/configuration.gni
@@ -0,0 +1,25 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//starboard/win/shared/platform_configuration/configuration.gni")
+
+sb_widevine_platform = "xbox"
+sb_static_contents_output_data_dir = "$root_out_dir/appx/content/data"
+cobalt_font_package = "standard"
+
+install_target_path = "//starboard/xb1/install_target.gni"
+
+platform_i18n_config_path = "//starboard/xb1/i18n:i18n"
+
+platform_tests_path = "//starboard/xb1/shared:starboard_platform_tests"
diff --git a/cobalt/h5vcc/h5vcc_account_info.idl b/starboard/xb1/public_system_properties.cc
similarity index 71%
rename from cobalt/h5vcc/h5vcc_account_info.idl
rename to starboard/xb1/public_system_properties.cc
index 1fc2417..fb8b877 100644
--- a/cobalt/h5vcc/h5vcc_account_info.idl
+++ b/starboard/xb1/public_system_properties.cc
@@ -1,19 +1,18 @@
-// Copyright 2015 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-interface H5vccAccountInfo {
-  readonly attribute DOMString avatarUrl;
-  readonly attribute DOMString username;
-  readonly attribute DOMString userId;
-};
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.

+//

+// Licensed under the Apache License, Version 2.0 (the "License");

+// you may not use this file except in compliance with the License.

+// You may obtain a copy of the License at

+//

+//     http://www.apache.org/licenses/LICENSE-2.0

+//

+// Unless required by applicable law or agreed to in writing, software

+// distributed under the License is distributed on an "AS IS" BASIS,

+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+// See the License for the specific language governing permissions and

+// limitations under the License.

+

+#include "starboard/xb1/system_properties.h"

+

+const char kCertificationScope[] = "";

+const char kBase64EncodedCertificationSecret[] = "";

diff --git a/tools/lbshell/open_source_release/create_tarball.sh b/starboard/xb1/shared/BUILD.gn
old mode 100755
new mode 100644
similarity index 63%
copy from tools/lbshell/open_source_release/create_tarball.sh
copy to starboard/xb1/shared/BUILD.gn
index 79904b4..9fd99b9
--- a/tools/lbshell/open_source_release/create_tarball.sh
+++ b/starboard/xb1/shared/BUILD.gn
@@ -1,5 +1,3 @@
-#!/bin/bash
-#
 # Copyright 2023 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,5 +12,19 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-CURRENT_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-${CURRENT_DIR}/../../../internal/tools/lbshell/open_source_release/create_tarball.sh "$@"
+target(gtest_target_type, "starboard_platform_tests") {
+  testonly = true
+
+  sources = [
+    "//starboard/common/test_main.cc",
+    "//starboard/shared/uwp/system_get_property_test.cc",
+  ]
+
+  configs += [ "//starboard/build/config:starboard_implementation" ]
+
+  deps = [
+    "//starboard",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
+}
diff --git a/starboard/xb1/shared/configuration.cc b/starboard/xb1/shared/configuration.cc
new file mode 100644
index 0000000..3d1d30e
--- /dev/null
+++ b/starboard/xb1/shared/configuration.cc
@@ -0,0 +1,73 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/xb1/shared/configuration.h"
+
+#include "starboard/common/configuration_defaults.h"
+#include "starboard/extension/configuration.h"
+
+namespace starboard {
+namespace xb1 {
+namespace shared {
+
+namespace {
+
+const char* CobaltFallbackSplashScreenUrl() {
+  return "file:///splash_screen/youtube_splash_screen.html";
+}
+
+int CobaltLocalTypefaceCacheSizeInBytes() {
+  // 24MB font cache size is recommended when using the |expanded|
+  // cobalt font package.
+  return 24 * 1024 * 1024;
+}
+
+const CobaltExtensionConfigurationApi kConfigurationApi = {
+    kCobaltExtensionConfigurationName,
+    3,
+    &common::CobaltUserOnExitStrategyDefault,
+    &common::CobaltRenderDirtyRegionOnlyDefault,
+    &common::CobaltEglSwapIntervalDefault,
+    &CobaltFallbackSplashScreenUrl,
+    &common::CobaltEnableQuicDefault,
+    &common::CobaltSkiaCacheSizeInBytesDefault,
+    &common::CobaltOffscreenTargetCacheSizeInBytesDefault,
+    &common::CobaltEncodedImageCacheSizeInBytesDefault,
+    &common::CobaltImageCacheSizeInBytesDefault,
+    &CobaltLocalTypefaceCacheSizeInBytes,
+    &common::CobaltRemoteTypefaceCacheSizeInBytesDefault,
+    &common::CobaltMeshCacheSizeInBytesDefault,
+    &common::CobaltSoftwareSurfaceCacheSizeInBytesDefault,
+    &common::CobaltImageCacheCapacityMultiplierWhenPlayingVideoDefault,
+    &common::CobaltSkiaGlyphAtlasWidthDefault,
+    &common::CobaltSkiaGlyphAtlasHeightDefault,
+    &common::CobaltJsGarbageCollectionThresholdInBytesDefault,
+    &common::CobaltReduceCpuMemoryByDefault,
+    &common::CobaltReduceGpuMemoryByDefault,
+    &common::CobaltGcZealDefault,
+    &common::CobaltRasterizerTypeDefault,
+    &common::CobaltEnableJitDefault,
+    &common::CobaltFallbackSplashScreenTopicsDefault,
+    &common::CobaltCanStoreCompiledJavascriptDefault,
+};
+
+}  // namespace
+
+const void* GetConfigurationApi() {
+  return &kConfigurationApi;
+}
+
+}  // namespace shared
+}  // namespace xb1
+}  // namespace starboard
diff --git a/nb/starboard_aligned_memory_deleter.h b/starboard/xb1/shared/configuration.h
similarity index 66%
rename from nb/starboard_aligned_memory_deleter.h
rename to starboard/xb1/shared/configuration.h
index 4f307c1..6aec4e1 100644
--- a/nb/starboard_aligned_memory_deleter.h
+++ b/starboard/xb1/shared/configuration.h
@@ -12,17 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef NB_STARBOARD_ALIGNED_MEMORY_DELETER_H_
-#define NB_STARBOARD_ALIGNED_MEMORY_DELETER_H_
+#ifndef STARBOARD_XB1_SHARED_CONFIGURATION_H_
+#define STARBOARD_XB1_SHARED_CONFIGURATION_H_
 
-#include "starboard/memory.h"
+namespace starboard {
+namespace xb1 {
+namespace shared {
 
-namespace nb {
+const void* GetConfigurationApi();
 
-struct AlignedMemoryDeleter {
-  void operator()(uint8_t* p) { SbMemoryDeallocateAligned(p); }
-};
+}  // namespace shared
+}  // namespace xb1
+}  // namespace starboard
 
-}  // namespace nb
-
-#endif  // NB_STARBOARD_ALIGNED_MEMORY_DELETER_H_
+#endif  // STARBOARD_XB1_SHARED_CONFIGURATION_H_
diff --git a/starboard/xb1/shared/configuration_constants.cc b/starboard/xb1/shared/configuration_constants.cc
new file mode 100644
index 0000000..5ef6118
--- /dev/null
+++ b/starboard/xb1/shared/configuration_constants.cc
@@ -0,0 +1,141 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This file defines all configuration constants for a platform.
+
+#include "starboard/configuration_constants.h"
+
+// Determines the threshold of allocation size that should be done with mmap
+// (if available), rather than allocated within the core heap.
+const size_t kSbDefaultMmapThreshold = 256 * 1024U;
+
+// The current platform's maximum length of the name of a single directory
+// entry, not including the absolute path.
+const int32_t kSbFileMaxName = 260;
+
+// The current platform's maximum number of files that can be opened at the
+// same time by one process.
+const uint32_t kSbFileMaxOpen = 63;
+
+// The current platform's alternate file path component separator character.
+// This is like SB_FILE_SEP_CHAR, except if your platform supports an alternate
+// character, then you can place that here. For example, on windows machines,
+// the primary separator character is probably '\', but the alternate is '/'.
+const char kSbFileAltSepChar = '/';
+
+// The string form of SB_FILE_ALT_SEP_CHAR.
+const char* kSbFileAltSepString = "/";
+
+// The current platform's maximum length of an absolute path.
+const uint32_t kSbFileMaxPath = 4096;
+
+// The current platform's file path component separator character. This is the
+// character that appears after a directory in a file path. For example, the
+// absolute canonical path of the file "/path/to/a/file.txt" uses '/' as a path
+// component separator character.
+const char kSbFileSepChar = '\\';
+
+// The string form of SB_FILE_SEP_CHAR.
+const char* kSbFileSepString = "\\";
+
+#if SB_API_VERSION < 15
+// Allow ac3 and ec3 support
+const bool kSbHasAc3Audio = true;
+#endif
+
+// Specifies whether this platform has webm/vp9 support.  This should be set to
+// non-zero on platforms with webm/vp9 support.
+const bool kSbHasMediaWebmVp9Support = true;
+
+// Whether the current platform supports thread priorities.
+const bool kSbHasThreadPrioritySupport = true;
+
+// Determines the alignment that allocations should have on this platform.
+const size_t kSbMallocAlignment = 16;
+
+// The maximum number of thread local storage keys supported by this platform.
+const uint32_t kSbMaxThreadLocalKeys = 512;
+
+// The maximum length of a name for a thread, including the NULL-terminator.
+const int32_t kSbMaxThreadNameLength = 16;
+
+// Defines the path where memory debugging logs should be written to.
+const char* kSbMemoryLogPath = "/tmp/starboard";
+
+// The maximum audio bitrate the platform can decode.  The following value
+// equals to 5M bytes per seconds which is more than enough for compressed
+// audio.
+const uint32_t kSbMediaMaxAudioBitrateInBitsPerSecond = 40 * 1024 * 1024;
+
+// The maximum video bitrate the platform can decode.  The following value
+// equals to 25M bytes per seconds which is more than enough for compressed
+// video.
+const uint32_t kSbMediaMaxVideoBitrateInBitsPerSecond = 200 * 1024 * 1024;
+
+// Specifies how video frame buffers must be aligned on this platform.
+const uint32_t kSbMediaVideoFrameAlignment = 256;
+
+// The memory page size, which controls the size of chunks on memory that
+// allocators deal with, and the alignment of those chunks. This doesn't have to
+// be the hardware-defined physical page size, but it should be a multiple of
+// it.
+const size_t kSbMemoryPageSize = 4096;
+
+// Specifies the network receive buffer size in bytes, set via
+// SbSocketSetReceiveBufferSize().
+//
+// Setting this to 0 indicates that SbSocketSetReceiveBufferSize() should
+// not be called. Use this for OSs (such as Linux) where receive buffer
+// auto-tuning is better.
+//
+// On some platforms, this may affect max TCP window size which may
+// dramatically affect throughput in the presence of latency.
+//
+// If your platform does not have a good TCP auto-tuning mechanism,
+// a setting of (128 * 1024) here is recommended.
+const uint32_t kSbNetworkReceiveBufferSize = 0;
+
+// Defines the maximum number of simultaneous threads for this platform. Some
+// platforms require sharing thread handles with other kinds of system handles,
+// like mutexes, so we want to keep this manageable.
+const uint32_t kSbMaxThreads = 90;
+
+// The current platform's search path component separator character. When
+// specifying an ordered list of absolute paths of directories to search for a
+// given reason, this is the character that appears between entries. For
+// example, the search path of "/etc/search/first:/etc/search/second" uses ':'
+// as a search path component separator character.
+#ifdef __cplusplus
+extern "C" {
+#endif
+const char kSbPathSepChar = ';';
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+// The string form of SB_PATH_SEP_CHAR.
+const char* kSbPathSepString = ";";
+
+// Specifies the preferred byte order of color channels in a pixel. Refer to
+// starboard/configuration.h for the possible values. EGL/GLES platforms should
+// generally prefer a byte order of RGBA, regardless of endianness.
+const int kSbPreferredRgbaByteOrder = SB_PREFERRED_RGBA_BYTE_ORDER_RGBA;
+
+// The maximum number of users that can be signed in at the same time.
+const uint32_t kSbUserMaxSignedIn = 1;
+
+#if SB_API_VERSION >= 14
+// The maximum size the cache directory is allowed to use in bytes.
+const uint32_t kSbMaxSystemPathCacheDirectorySize = 24 << 20;  // 24MiB
+#endif
diff --git a/starboard/xb1/shared/configuration_public.h b/starboard/xb1/shared/configuration_public.h
new file mode 100644
index 0000000..a895d46
--- /dev/null
+++ b/starboard/xb1/shared/configuration_public.h
@@ -0,0 +1,176 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Other source files should never include this header directly, but should
+// include the generic "starboard/configuration.h" instead.
+
+#ifndef STARBOARD_XB1_SHARED_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_XB1_SHARED_CONFIGURATION_PUBLIC_H_
+
+// --- Architecture Configuration --------------------------------------------
+
+// --- System Header Configuration -------------------------------------------
+
+// Any system headers listed here that are not provided by the platform will be
+// emulated in starboard/types.h.
+
+// Whether the current platform provides the standard header sys/types.h.
+#define SB_HAS_SYS_TYPES_H 0
+
+// Whether the current platform provides ssize_t.
+#define SB_HAS_SSIZE_T 0
+
+#if !defined(__WCHAR_MAX__)
+#include <wchar.h>
+#define __WCHAR_MAX__ WCHAR_MAX
+#endif
+
+// Type detection for wchar_t.
+#if defined(__WCHAR_MAX__) && \
+    (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff)
+#define SB_IS_WCHAR_T_UTF32 1
+#elif defined(__WCHAR_MAX__) && \
+    (__WCHAR_MAX__ == 0x7fff || __WCHAR_MAX__ == 0xffff)
+#define SB_IS_WCHAR_T_UTF16 1
+#endif
+
+// Chrome only defines this for ARMEL.
+#if defined(__ARMEL__)
+// Chrome has an exclusion for iOS here, we should too when we support iOS.
+#define SB_IS_WCHAR_T_UNSIGNED 1
+#endif
+
+// --- Compiler Configuration ------------------------------------------------
+
+// The platform's annotation for forcing a C function to be inlined.
+//   https://msdn.microsoft.com/en-us/library/bw1hbe6y.aspx#Anchor_1
+#define SB_C_FORCE_INLINE __forceinline
+
+// The platform's annotation for marking a C function as suggested to be
+// inlined.
+#define SB_C_INLINE inline
+
+// The platform's annotation for marking a C function as forcibly not
+// inlined.
+#define SB_C_NOINLINE __declspec(noinline)
+
+// The platform's annotation for marking a symbol as exported outside of the
+// current shared library.
+#define SB_EXPORT_PLATFORM __declspec(dllexport)
+// The platform's annotation for marking a symbol as imported from outside of
+// the current linking unit.
+#define SB_IMPORT_PLATFORM __declspec(dllimport)
+
+// --- Extensions Configuration ----------------------------------------------
+
+// Please use <unordered_map> and <unordered_set> for the hash table types.
+#define SB_HAS_STD_UNORDERED_HASH 1
+
+// GCC/Clang doesn't define a long long hash function, except for Android and
+// Game consoles.
+#define SB_HAS_LONG_LONG_HASH 1
+
+// GCC/Clang doesn't define a string hash function, except for Game Consoles.
+#define SB_HAS_STRING_HASH 1
+
+// Desktop Linux needs a using statement for the hash functions.
+#define SB_HAS_HASH_USING 1
+
+// Set this to 1 if hash functions for custom types can be defined as a
+// hash_value() function. Otherwise, they need to be placed inside a
+// partially-specified hash struct template with an operator().
+#define SB_HAS_HASH_VALUE 1
+
+// Set this to 1 if use of hash_map or hash_set causes a deprecation warning
+// (which then breaks the build).
+#define SB_HAS_HASH_WARNING 1
+#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
+
+// The location to include hash_map on this platform.
+#define SB_HASH_MAP_INCLUDE <hash_map>
+
+// C++'s hash_map and hash_set are often found in different namespaces depending
+// on the compiler.
+#define SB_HASH_NAMESPACE stdext
+
+// The location to include hash_set on this platform.
+#define SB_HASH_SET_INCLUDE <hash_set>
+
+// --- Filesystem Configuration ----------------------------------------------
+
+// --- Graphics Configuration ------------------------------------------------
+
+// Indicates whether or not the given platform supports bilinear filtering.
+// This can be checked to enable/disable renderer tests that verify that this is
+// working properly.
+#define SB_HAS_BILINEAR_FILTERING_SUPPORT 1
+
+// Indicates whether or not the given platform supports rendering of NV12
+// textures. These textures typically originate from video decoders.
+#define SB_HAS_NV12_TEXTURE_SUPPORT 0
+
+#define SB_HAS_VIRTUAL_REALITY 0
+
+// --- I/O Configuration -----------------------------------------------------
+
+// Whether the current platform has speech synthesis.
+#define SB_HAS_SPEECH_SYNTHESIS 0
+
+// --- Media Configuration ---------------------------------------------------
+
+// Whether the current platform uses a media player that relies on a URL.
+#define SB_HAS_PLAYER_WITH_URL 0
+
+// --- Decoder-only Params ---
+
+// --- Memory Configuration --------------------------------------------------
+
+// Whether this platform can map executable memory. Implies the platform can map
+// memory. This is required for platforms that want to JIT.
+#define SB_CAN_MAP_EXECUTABLE_MEMORY 1
+
+// --- Network Configuration -------------------------------------------------
+
+// Specifies whether this platform supports IPV6.
+#define SB_HAS_IPV6 1
+
+// Specifies whether this platform supports pipe.
+#define SB_HAS_PIPE 1
+
+// --- Thread Configuration --------------------------------------------------
+
+// --- Timing API ------------------------------------------------------------
+
+// Whether this platform has an API to retrieve how long the current thread
+// has spent in the executing state.
+#define SB_HAS_TIME_THREAD_NOW 0
+
+// --- Tuneable Parameters ---------------------------------------------------
+
+// --- User Configuration ----------------------------------------------------
+
+// --- Platform Specific Configuration ---------------------------------------
+
+// Whether or not the platform supports socket connection reset.
+#define SB_HAS_SOCKET_ERROR_CONNECTION_RESET_SUPPORT 1
+
+// --- Platform Specific Audits ----------------------------------------------
+
+// --- Platform Specific Quirks ----------------------------------------------
+
+// The implementation is allowed to support kSbMediaAudioSampleTypeInt16 only
+// when this macro is defined.
+#define SB_HAS_QUIRK_SUPPORT_INT16_AUDIO_SAMPLES 1
+
+#endif  // STARBOARD_XB1_SHARED_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/xb1/shared/gpu_base_video_decoder.cc b/starboard/xb1/shared/gpu_base_video_decoder.cc
new file mode 100644
index 0000000..32749b1
--- /dev/null
+++ b/starboard/xb1/shared/gpu_base_video_decoder.cc
@@ -0,0 +1,563 @@
+// Copyright 2021 The Cobalt Authors. All Rights Reserved.

+//

+// Licensed under the Apache License, Version 2.0 (the "License");

+// you may not use this file except in compliance with the License.

+// You may obtain a copy of the License at

+//

+//     http://www.apache.org/licenses/LICENSE-2.0

+//

+// Unless required by applicable law or agreed to in writing, software

+// distributed under the License is distributed on an "AS IS" BASIS,

+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+// See the License for the specific language governing permissions and

+// limitations under the License.

+

+#include "starboard/xb1/shared/gpu_base_video_decoder.h"

+

+#include <d3d11_1.h>

+#include <wrl/client.h>

+

+#include "starboard/shared/uwp/application_uwp.h"

+#include "starboard/shared/uwp/async_utils.h"

+#include "starboard/shared/uwp/decoder_utils.h"

+#include "starboard/shared/uwp/extended_resources_manager.h"

+#include "starboard/shared/win32/decode_target_internal.h"

+#include "starboard/shared/win32/error_utils.h"

+#include "starboard/thread.h"

+#include "third_party/angle/include/EGL/egl.h"

+#include "third_party/angle/include/EGL/eglext.h"

+#include "third_party/angle/include/GLES2/gl2.h"

+#include "third_party/angle/include/GLES2/gl2ext.h"

+#include "third_party/angle/include/angle_hdr.h"

+#if defined(INTERNAL_BUILD)

+#include "third_party/internal/libav1_xb1/libav1/d3dx12.h"

+#endif  // defined(INTERNAL_BUILD)

+

+namespace starboard {

+namespace xb1 {

+namespace shared {

+

+namespace {

+

+using Microsoft::WRL::ComPtr;

+using starboard::shared::starboard::player::JobThread;

+using starboard::shared::starboard::player::filter::VideoFrame;

+using starboard::shared::uwp::ApplicationUwp;

+using starboard::shared::uwp::ExtendedResourcesManager;

+using starboard::shared::uwp::FindByTimestamp;

+using starboard::shared::uwp::RemoveByTimestamp;

+using starboard::shared::uwp::UpdateHdrColorMetadataToCurrentDisplay;

+using Windows::Graphics::Display::Core::HdmiDisplayInformation;

+

+// Limit the number of pending buffers.

+constexpr int kMaxNumberOfPendingBuffers = 8;

+// Limit the cached presenting images.

+constexpr int kNumberOfCachedPresentingImage = 3;

+

+const char kDecoderThreadName[] = "gpu_video_decoder_thread";

+

+}  // namespace

+

+class GpuVideoDecoderBase::GPUDecodeTargetPrivate

+    : public SbDecodeTargetPrivate {

+ public:

+  GPUDecodeTargetPrivate(

+      void* egl_display,

+      void* egl_config,

+      const scoped_refptr<GpuVideoDecoderBase::DecodedImage>& image)

+      : egl_display_(egl_display), egl_config_(egl_config), image_(image) {

+    SB_DCHECK(egl_display_);

+    SB_DCHECK(egl_config);

+

+    if (image->bit_depth() == 8) {

+      info.format = kSbDecodeTargetFormat3PlaneYUVI420;

+    } else {

+      SB_DCHECK(image->bit_depth() == 10);

+#if SB_API_VERSION >= 14

+      info.format = image->is_compacted()

+                        ? kSbDecodeTargetFormat3Plane10BitYUVI420Compact

+                        : kSbDecodeTargetFormat3Plane10BitYUVI420;

+#else   // SB_API_VERSION >= 14

+      SB_DCHECK(!image->is_compacted());

+      info.format = kSbDecodeTargetFormat3Plane10BitYUVI420;

+#endif  // SB_API_VERSION >= 14

+    }

+    info.is_opaque = true;

+    info.width = image->width();

+    info.height = image->height();

+

+    GLuint gl_textures_yuv[kNumberOfPlanes] = {};

+    glGenTextures(kNumberOfPlanes, gl_textures_yuv);

+    SB_DCHECK(glGetError() == GL_NO_ERROR);

+

+    for (unsigned int i = 0; i < kNumberOfPlanes; ++i) {

+      const int stride = image->stride(i);

+      const int subsampling = i > 0;

+      const int width = info.width >> subsampling;

+      const int height = info.height >> subsampling;

+      EGLint texture_attributes[] = {EGL_WIDTH,

+                                     static_cast<EGLint>(stride),

+                                     EGL_HEIGHT,

+                                     static_cast<EGLint>(height),

+                                     EGL_TEXTURE_TARGET,

+                                     EGL_TEXTURE_2D,

+                                     EGL_TEXTURE_FORMAT,

+                                     EGL_TEXTURE_RGBA,

+                                     EGL_NONE};

+      surfaces_[i] = eglCreatePbufferFromClientBuffer(

+          egl_display_, EGL_D3D_TEXTURE_ANGLE, image->texture(i).Get(),

+          egl_config, texture_attributes);

+      SB_DCHECK(glGetError() == GL_NO_ERROR && surfaces_[i] != EGL_NO_SURFACE);

+      glBindTexture(GL_TEXTURE_2D, gl_textures_yuv[i]);

+      SB_DCHECK(glGetError() == GL_NO_ERROR);

+      bool result =

+          eglBindTexImage(egl_display_, surfaces_[i], EGL_BACK_BUFFER);

+      SB_DCHECK(result);

+      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

+      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

+

+      D3D11_TEXTURE2D_DESC tex_desc = {};

+      image->texture(i)->GetDesc(&tex_desc);

+

+      SbDecodeTargetInfoPlane* plane = &info.planes[i];

+      plane->width =

+          image->is_compacted() ? tex_desc.Width * 3 : tex_desc.Width;

+      plane->height = tex_desc.Height;

+      plane->content_region.left = image->texture_corner_left(i);

+      plane->content_region.top = plane->height - image->texture_corner_top(i);

+      plane->content_region.bottom = plane->content_region.top - height;

+      plane->content_region.right = plane->content_region.left + width;

+      plane->texture = gl_textures_yuv[i];

+      plane->gl_texture_target = GL_TEXTURE_2D;

+      plane->gl_texture_format = GL_RED_EXT;

+    }

+  }

+

+  ~GPUDecodeTargetPrivate() override {

+    for (unsigned int i = 0; i < kNumberOfPlanes; ++i) {

+      glDeleteTextures(1, &(info.planes[i].texture));

+      eglReleaseTexImage(egl_display_, surfaces_[i], EGL_BACK_BUFFER);

+      eglDestroySurface(egl_display_, surfaces_[i]);

+    }

+  }

+

+  SbTime timestamp() { return image_->timestamp(); }

+

+  void ReleaseImage() {

+    // Release the codec resource, while the D3D textures are still safe to use.

+    SB_DCHECK(image_);

+    image_ = nullptr;

+  }

+

+ private:

+  // Hold the codec resource until it's not needed in render pipeline to prevent

+  // it being reused and overwritten.

+  scoped_refptr<GpuVideoDecoderBase::DecodedImage> image_;

+  // EGLSurface is defined as void* in "third_party/angle/include/EGL/egl.h".

+  // Use void* directly here to avoid `egl.h` being included broadly.

+  void* surfaces_[kNumberOfPlanes];

+  void* egl_display_;

+  void* egl_config_;

+};

+

+GpuVideoDecoderBase::GpuVideoDecoderBase(

+    SbDecodeTargetGraphicsContextProvider*

+        decode_target_graphics_context_provider,

+    const VideoStreamInfo& video_stream_info,

+    bool is_hdr_video,

+    const ComPtr<ID3D12Device>& d3d12_device,

+    void* d3d12_queue)

+    : decode_target_context_runner_(decode_target_graphics_context_provider),

+      is_hdr_video_(is_hdr_video),

+      d3d12_device_(d3d12_device),

+      d3d12_queue_(d3d12_queue) {

+  SB_DCHECK(d3d12_device_);

+  SB_DCHECK(d3d12_queue_);

+

+  egl_display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY);

+  EGLint attribute_list[] = {EGL_SURFACE_TYPE,  // this must be first

+                             EGL_WINDOW_BIT | EGL_PBUFFER_BIT,

+                             EGL_RED_SIZE,

+                             8,

+                             EGL_GREEN_SIZE,

+                             8,

+                             EGL_BLUE_SIZE,

+                             8,

+                             EGL_ALPHA_SIZE,

+                             8,

+                             EGL_BIND_TO_TEXTURE_RGBA,

+                             EGL_TRUE,

+                             EGL_RENDERABLE_TYPE,

+                             EGL_OPENGL_ES2_BIT,

+                             EGL_NONE};

+  SB_DCHECK(egl_display_);

+  EGLint num_configs;

+  int result = eglChooseConfig(egl_display_, attribute_list, &egl_config_, 1,

+                               &num_configs);

+  SB_DCHECK(result);

+

+  ComPtr<ID3D11Device> d3d11_device =

+      starboard::shared::uwp::GetDirectX11Device(egl_display_);

+  HRESULT hr = d3d11_device.As(&d3d11_device_);

+  SB_DCHECK(SUCCEEDED(hr));

+

+  if (is_hdr_video_) {

+    UpdateHdrMetadata(video_stream_info.color_metadata);

+  }

+  frame_width_ = video_stream_info.frame_width;

+  frame_height_ = video_stream_info.frame_height;

+}

+

+GpuVideoDecoderBase::~GpuVideoDecoderBase() {

+  // Reset() should be already called before ~GpuVideoDecoderBase().

+  SB_DCHECK(!decoder_thread_);

+  SB_DCHECK(pending_inputs_.empty());

+  SB_DCHECK(written_inputs_.empty());

+  SB_DCHECK(output_queue_.empty());

+  SB_DCHECK(decoder_behavior_.load() == kDecodingStopped);

+  // All presenting decode targets should be released.

+  SB_DCHECK(presenting_decode_targets_.empty());

+

+  if (ApplicationUwp::Get()->IsHdrSupported() && IsHdrAngleModeEnabled()) {

+    SetHdrAngleModeEnabled(false);

+    auto hdmi_display_info = HdmiDisplayInformation::GetForCurrentView();

+    starboard::shared::uwp::WaitForComplete(

+        hdmi_display_info->SetDefaultDisplayModeAsync());

+  }

+}

+

+void GpuVideoDecoderBase::Initialize(const DecoderStatusCB& decoder_status_cb,

+                                     const ErrorCB& error_cb) {

+  SB_DCHECK(decoder_status_cb);

+  SB_DCHECK(!decoder_status_cb_);

+  SB_DCHECK(error_cb);

+  SB_DCHECK(!error_cb_);

+  decoder_status_cb_ = decoder_status_cb;

+  error_cb_ = error_cb;

+}

+

+size_t GpuVideoDecoderBase::GetMaxNumberOfCachedFrames() const {

+  return GetMaxNumberOfCachedFramesInternal() -

+         number_of_presenting_decode_targets_;

+}

+

+void GpuVideoDecoderBase::WriteInputBuffers(const InputBuffers& input_buffers) {

+  SB_DCHECK(BelongsToCurrentThread());

+  SB_DCHECK(decoder_status_cb_);

+  SB_DCHECK(input_buffers.size() == 1);

+  SB_DCHECK(input_buffers[0]);

+  SB_DCHECK(decoder_behavior_.load() != kResettingDecoder);

+  SB_DCHECK(decoder_behavior_.load() != kEndingStream);

+

+  if (error_occured_.load()) {

+    return;

+  }

+

+  const auto& input_buffer = input_buffers[0];

+

+  if (!decoder_thread_) {

+    decoder_thread_.reset(new JobThread(kDecoderThreadName));

+    decoder_thread_->job_queue()->Schedule(

+        std::bind(&GpuVideoDecoderBase::InitializeCodecIfNeededInternal, this));

+  }

+

+  bool needs_more_input = false;

+  {

+    ScopedLock pending_inputs_lock(pending_inputs_mutex_);

+    pending_inputs_.push_back(input_buffer);

+    needs_more_input = pending_inputs_.size() < kMaxNumberOfPendingBuffers;

+  }

+  decoder_behavior_.store(kDecodingFrames);

+  decoder_thread_->job_queue()->Schedule(

+      std::bind(&GpuVideoDecoderBase::DecodeOneBuffer, this));

+  if (needs_more_input) {

+    decoder_status_cb_(kNeedMoreInput, nullptr);

+  }

+}

+

+void GpuVideoDecoderBase::WriteEndOfStream() {

+  SB_DCHECK(BelongsToCurrentThread());

+  SB_DCHECK(decoder_status_cb_);

+  SB_DCHECK(decoder_behavior_.load() != kResettingDecoder);

+  SB_DCHECK(decoder_behavior_.load() != kEndingStream);

+

+  if (error_occured_.load()) {

+    return;

+  }

+

+  if (decoder_thread_) {

+    SB_DCHECK(decoder_behavior_.load() == kDecodingFrames);

+    decoder_behavior_.store(kEndingStream);

+    decoder_thread_->job_queue()->Schedule(

+        std::bind(&GpuVideoDecoderBase::DecodeEndOfStream, this));

+    return;

+  }

+

+  SB_DCHECK(decoder_behavior_.load() == kDecodingStopped);

+  decoder_status_cb_(kBufferFull, VideoFrame::CreateEOSFrame());

+}

+

+void GpuVideoDecoderBase::Reset() {

+  SB_DCHECK(BelongsToCurrentThread());

+  SB_DCHECK(decoder_status_cb_);

+  decoder_behavior_.store(kResettingDecoder);

+  if (decoder_thread_) {

+    // Release stored frames to free frame buffers.

+    decoder_status_cb_(kReleaseAllFrames, nullptr);

+    decoder_thread_->job_queue()->Schedule(

+        std::bind(&GpuVideoDecoderBase::DrainDecoder, this));

+    decoder_thread_.reset();

+  }

+  pending_inputs_.clear();

+  written_inputs_.clear();

+  // Release all frames after decoder thread is destroyed.

+  decoder_status_cb_(kReleaseAllFrames, nullptr);

+  {

+    ScopedLock output_queue_lock(output_queue_mutex_);

+    output_queue_.clear();

+  }

+  error_occured_.store(false);

+  decoder_behavior_.store(kDecodingStopped);

+  is_drain_decoder_called_ = false;

+}

+

+SbDecodeTarget GpuVideoDecoderBase::GetCurrentDecodeTarget() {

+  scoped_refptr<DecodedImage> image = nullptr;

+  {

+    ScopedLock output_queue_lock(output_queue_mutex_);

+    if (!output_queue_.empty()) {

+      image = output_queue_.front();

+    }

+  }

+

+  if (!image && presenting_decode_targets_.empty()) {

+    return kSbDecodeTargetInvalid;

+  }

+

+  if (presenting_decode_targets_.empty() ||

+      (image &&

+       image->timestamp() != presenting_decode_targets_.back()->timestamp())) {

+    // Create the new decode target and update hdr meta data.

+    if (is_hdr_video_) {

+      UpdateHdrMetadata(image->color_metadata());

+    }

+    presenting_decode_targets_.push_back(

+        new GPUDecodeTargetPrivate(egl_display_, egl_config_, image));

+    number_of_presenting_decode_targets_++;

+  }

+

+  // Increment the refcount for the returned decode target.

+  presenting_decode_targets_.back()->AddRef();

+

+  // There's a data synchronization issue (b/180532476) between decoder and

+  // render pipelines. If we release the decode target immediately after it's

+  // released on render pipeline (the underllying resources may be reused by the

+  // libvpx/av1 decoder), there's a chance that the rendering frame gets

+  // overwritten. The root cause is still unclear and under investigating. So,

+  // as a workaround, we retain the decode target for longer time until it's no

+  // longer used by the renderer thread.

+  while (presenting_decode_targets_.size() > kNumberOfCachedPresentingImage &&

+         presenting_decode_targets_.front()->refcount == 1) {

+    SbDecodeTargetRelease(presenting_decode_targets_.front());

+    presenting_decode_targets_.pop_front();

+    number_of_presenting_decode_targets_--;

+  }

+  return presenting_decode_targets_.back();

+}

+

+bool GpuVideoDecoderBase::BelongsToDecoderThread() const {

+  return decoder_thread_->job_queue()->BelongsToCurrentThread();

+}

+

+void GpuVideoDecoderBase::OnOutputRetrieved(

+    const scoped_refptr<DecodedImage>& image) {

+  SB_DCHECK(decoder_thread_);

+  SB_DCHECK(decoder_status_cb_);

+  SB_DCHECK(image);

+

+  if (decoder_behavior_.load() == kResettingDecoder || error_occured_) {

+    return;

+  }

+

+  if (!BelongsToDecoderThread()) {

+    decoder_thread_->job_queue()->Schedule(

+        std::bind(&GpuVideoDecoderBase::OnOutputRetrieved, this, image));

+    return;

+  }

+

+  SbTime timestamp = image->timestamp();

+  const auto iter = FindByTimestamp(written_inputs_, timestamp);

+  SB_DCHECK(iter != written_inputs_.cend());

+  if (is_hdr_video_) {

+    image->AttachColorMetadata((*iter)->video_stream_info().color_metadata);

+  }

+  written_inputs_.erase(iter);

+

+  scoped_refptr<VideoFrameImpl> frame(new VideoFrameImpl(

+      timestamp, std::bind(&GpuVideoDecoderBase::DeleteVideoFrame, this,

+                           std::placeholders::_1)));

+  decoder_status_cb_(

+      decoder_behavior_.load() == kEndingStream ? kBufferFull : kNeedMoreInput,

+      frame);

+

+  if (!frame->HasOneRef()) {

+    ScopedLock output_queue_lock(output_queue_mutex_);

+    output_queue_.push_back(image);

+  }

+}

+

+void GpuVideoDecoderBase::OnDecoderDrained() {

+  SB_DCHECK(decoder_thread_);

+  SB_DCHECK(decoder_status_cb_);

+  SB_DCHECK(decoder_behavior_.load() == kEndingStream ||

+            decoder_behavior_.load() == kResettingDecoder);

+

+  if (decoder_behavior_.load() == kResettingDecoder || error_occured_) {

+    return;

+  }

+

+  if (!BelongsToDecoderThread()) {

+    decoder_thread_->job_queue()->Schedule(

+        std::bind(&GpuVideoDecoderBase::OnDecoderDrained, this));

+    return;

+  }

+

+  SB_DCHECK(written_inputs_.empty());

+  if (decoder_behavior_.load() == kEndingStream) {

+    decoder_status_cb_(kBufferFull, VideoFrame::CreateEOSFrame());

+  }

+  decoder_behavior_.store(kDecodingStopped);

+}

+

+void GpuVideoDecoderBase::ClearCachedImages() {

+  SB_DCHECK(output_queue_.empty());

+  // All cached images should be released.

+  decode_target_context_runner_.RunOnGlesContext(

+      std::bind(&GpuVideoDecoderBase::ClearPresentingDecodeTargets, this));

+}

+

+void GpuVideoDecoderBase::ReportError(const SbPlayerError error,

+                                      const std::string& error_message) {

+  SB_DCHECK(error_cb_);

+  if (!error_occured_.exchange(true)) {

+    SB_LOG(ERROR) << error_message << " (error code: " << error << " )";

+    error_cb_(error, error_message);

+  }

+}

+

+bool GpuVideoDecoderBase::IsCacheFull() {

+  SB_DCHECK(decoder_thread_);

+  SB_DCHECK(BelongsToDecoderThread());

+

+  ScopedLock output_queue_lock(output_queue_mutex_);

+  return written_inputs_.size() + output_queue_.size() +

+             number_of_presenting_decode_targets_ >=

+         GetMaxNumberOfCachedFramesInternal();

+}

+

+void GpuVideoDecoderBase::DecodeOneBuffer() {

+  SB_DCHECK(decoder_thread_);

+  SB_DCHECK(BelongsToDecoderThread());

+

+  if (decoder_behavior_.load() == kResettingDecoder || error_occured_) {

+    return;

+  }

+

+  if (IsCacheFull()) {

+    decoder_thread_->job_queue()->Schedule(

+        std::bind(&GpuVideoDecoderBase::DecodeOneBuffer, this),

+        kSbTimeMillisecond);

+    return;

+  }

+

+  {

+    ScopedLock pending_inputs_lock(pending_inputs_mutex_);

+    SB_DCHECK(!pending_inputs_.empty());

+    written_inputs_.push_back(pending_inputs_.front());

+    pending_inputs_.pop_front();

+  }

+  DecodeInternal(written_inputs_.back());

+}

+

+void GpuVideoDecoderBase::DecodeEndOfStream() {

+  SB_DCHECK(decoder_thread_);

+  SB_DCHECK(BelongsToDecoderThread());

+  SB_DCHECK(decoder_status_cb_);

+

+  if (decoder_behavior_.load() == kResettingDecoder || error_occured_) {

+    return;

+  }

+

+  {

+    ScopedLock pending_inputs_lock(pending_inputs_mutex_);

+    if (!pending_inputs_.empty()) {

+      decoder_thread_->job_queue()->Schedule(

+          std::bind(&GpuVideoDecoderBase::DecodeEndOfStream, this),

+          kSbTimeMillisecond);

+      return;

+    }

+  }

+  DrainDecoder();

+}

+

+void GpuVideoDecoderBase::DrainDecoder() {

+  SB_DCHECK(BelongsToDecoderThread());

+  // Use |is_drain_decoder_called_| to prevent calling DrainDecoderInternal()

+  // twice. Theoretically, if Reset() is called during DecodeEndOfStream()

+  // executing, DrainDecoderInternal() could be called twice, one from

+  // DecodeEndOfStream(), and one from Reset().

+  if (!is_drain_decoder_called_) {

+    is_drain_decoder_called_ = true;

+    DrainDecoderInternal();

+  }

+}

+

+void GpuVideoDecoderBase::DeleteVideoFrame(const VideoFrame* video_frame) {

+  ScopedLock output_queue_lock(output_queue_mutex_);

+  RemoveByTimestamp(&output_queue_, video_frame->timestamp());

+}

+

+void GpuVideoDecoderBase::UpdateHdrMetadata(

+    const SbMediaColorMetadata& color_metadata) {

+  SB_DCHECK(is_hdr_video_);

+  if (!ApplicationUwp::Get()->IsHdrSupported()) {

+    ReportError(kSbPlayerErrorCapabilityChanged,

+                "HDR sink lost while HDR video playing.");

+    return;

+  }

+  if (!needs_hdr_metadata_update_) {

+    return;

+  }

+  needs_hdr_metadata_update_ = false;

+  if (!IsHdrAngleModeEnabled()) {

+    SetHdrAngleModeEnabled(true);

+  }

+  if (memcmp(&color_metadata, &last_presented_color_metadata_,

+             sizeof(color_metadata)) != 0) {

+    last_presented_color_metadata_ = color_metadata;

+    UpdateHdrColorMetadataToCurrentDisplay(color_metadata);

+  }

+}

+

+void GpuVideoDecoderBase::ClearPresentingDecodeTargets() {

+  // Delete all unused decode targets.

+  while (!presenting_decode_targets_.empty() &&

+         presenting_decode_targets_.front()->refcount == 1) {

+    SbDecodeTargetRelease(presenting_decode_targets_.front());

+    presenting_decode_targets_.pop_front();

+  }

+  // The remaining decode targets are still used by the render pipeline. Force

+  // to release the underlying image to release the codec resources and

+  // decrement the refcount.

+  for (auto it = presenting_decode_targets_.begin();

+       it != presenting_decode_targets_.end(); ++it) {

+    (*it)->ReleaseImage();

+    SbDecodeTargetRelease(*it);

+  }

+  presenting_decode_targets_.clear();

+  number_of_presenting_decode_targets_ = 0;

+}

+

+}  // namespace shared

+}  // namespace xb1

+}  // namespace starboard

diff --git a/starboard/xb1/shared/gpu_base_video_decoder.h b/starboard/xb1/shared/gpu_base_video_decoder.h
new file mode 100644
index 0000000..e6d2eae
--- /dev/null
+++ b/starboard/xb1/shared/gpu_base_video_decoder.h
@@ -0,0 +1,206 @@
+// Copyright 2021 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_XB1_SHARED_GPU_BASE_VIDEO_DECODER_H_
+#define STARBOARD_XB1_SHARED_GPU_BASE_VIDEO_DECODER_H_
+
+#include <d3d11_1.h>
+#include <d3d12.h>
+#include <wrl/client.h>
+
+#include <atomic>
+#include <deque>
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "starboard/common/atomic.h"
+#include "starboard/common/mutex.h"
+#include "starboard/common/ref_counted.h"
+#include "starboard/common/scoped_ptr.h"
+#include "starboard/shared/starboard/decode_target/decode_target_context_runner.h"
+#include "starboard/shared/starboard/media/media_util.h"
+#include "starboard/shared/starboard/player/filter/video_decoder_internal.h"
+#include "starboard/shared/starboard/player/input_buffer_internal.h"
+#include "starboard/shared/starboard/player/job_thread.h"
+#include "starboard/xb1/shared/video_frame_impl.h"
+
+namespace starboard {
+namespace xb1 {
+namespace shared {
+
+class GpuVideoDecoderBase
+    : public starboard::shared::starboard::player::filter::VideoDecoder,
+      private starboard::shared::starboard::player::JobQueue::JobOwner {
+ public:
+  static constexpr unsigned int kNumberOfPlanes = 3;
+
+  typedef ::starboard::shared::starboard::decode_target::
+      DecodeTargetContextRunner DecodeTargetContextRunner;
+
+  ~GpuVideoDecoderBase() override;
+
+ protected:
+  typedef ::starboard::shared::starboard::media::VideoStreamInfo
+      VideoStreamInfo;
+
+  class DecodedImage : public RefCountedThreadSafe<DecodedImage> {
+   public:
+    virtual ~DecodedImage() {
+      if (release_cb_) {
+        release_cb_();
+      }
+    }
+
+    bool is_compacted() const { return is_compacted_; }
+    unsigned int width() const { return width_; }
+    unsigned int height() const { return height_; }
+    unsigned int bit_depth() const { return bit_depth_; }
+    int texture_corner_left(size_t index) const {
+      SB_DCHECK(index < kNumberOfPlanes);
+      return texture_corner_left_[index];
+    }
+    int texture_corner_top(size_t index) const {
+      SB_DCHECK(index < kNumberOfPlanes);
+      return texture_corner_top_[index];
+    }
+    Microsoft::WRL::ComPtr<ID3D11Texture2D> texture(size_t index) const {
+      SB_DCHECK(index < kNumberOfPlanes);
+      return textures_[index];
+    }
+    int stride(size_t index) const {
+      SB_DCHECK(index < kNumberOfPlanes);
+      return strides_[index];
+    }
+    SbTime timestamp() const { return timestamp_; }
+    const SbMediaColorMetadata& color_metadata() const {
+      return color_metadata_;
+    }
+
+    void AttachColorMetadata(const SbMediaColorMetadata& color_metadata) {
+      color_metadata_ = color_metadata;
+    }
+
+   protected:
+    explicit DecodedImage(const std::function<void(void)>& release_cb = nullptr)
+        : release_cb_(release_cb) {}
+
+    unsigned int width_;
+    unsigned int height_;
+    unsigned int bit_depth_;
+    bool is_compacted_ = false;
+    int texture_corner_left_[kNumberOfPlanes];
+    int texture_corner_top_[kNumberOfPlanes];
+    Microsoft::WRL::ComPtr<ID3D11Texture2D> textures_[kNumberOfPlanes];
+    int strides_[kNumberOfPlanes];
+    SbTime timestamp_;
+    SbMediaColorMetadata color_metadata_;
+    const std::function<void(void)> release_cb_;
+  };
+
+  enum RetrievingBehavior {
+    kDecodingStopped,
+    kDecodingFrames,
+    kResettingDecoder,
+    kEndingStream
+  };
+
+  GpuVideoDecoderBase(SbDecodeTargetGraphicsContextProvider*
+                          decode_target_graphics_context_provider,
+                      const VideoStreamInfo& video_stream_info,
+                      bool is_hdr_video,
+                      const Microsoft::WRL::ComPtr<ID3D12Device>& d3d12_device,
+                      void* d3d12_queue);
+
+  // VideoDecoder methods
+  void Initialize(const DecoderStatusCB& decoder_status_cb,
+                  const ErrorCB& error_cb) final;
+  SbTime GetPrerollTimeout() const final { return kSbTimeMax; }
+  size_t GetMaxNumberOfCachedFrames() const override;
+
+  void WriteInputBuffers(const InputBuffers& input_buffers) final;
+  void WriteEndOfStream() final;
+  void Reset() final;
+  SbDecodeTarget GetCurrentDecodeTarget() final;
+
+  // Methods for inherited classes to implement.
+  virtual size_t GetMaxNumberOfCachedFramesInternal() const = 0;
+  virtual void InitializeCodecIfNeededInternal() = 0;
+  virtual void DecodeInternal(
+      const scoped_refptr<InputBuffer>& input_buffer) = 0;
+  virtual void DrainDecoderInternal() = 0;
+
+  bool BelongsToDecoderThread() const;
+  void OnOutputRetrieved(const scoped_refptr<DecodedImage>& image);
+  void OnDecoderDrained();
+  void ClearCachedImages();
+  void ReportError(const SbPlayerError error, const std::string& error_message);
+
+  const bool is_hdr_video_;
+  int frame_width_;
+  int frame_height_;
+  atomic_integral<RetrievingBehavior> decoder_behavior_{kDecodingStopped};
+  std::atomic_bool error_occured_ = {false};
+
+  // These are platform-specific objects required to create and use a codec.
+  Microsoft::WRL::ComPtr<ID3D11Device1> d3d11_device_;
+  Microsoft::WRL::ComPtr<ID3D12Device> d3d12_device_;
+  void* d3d12_queue_ = nullptr;
+
+ private:
+  class GPUDecodeTargetPrivate;
+
+  bool IsCacheFull();
+  void DecodeOneBuffer();
+  void DecodeEndOfStream();
+  void DrainDecoder();
+  void DeleteVideoFrame(const VideoFrame* video_frame);
+  void UpdateHdrMetadata(const SbMediaColorMetadata& color_metadata);
+  void ClearPresentingDecodeTargets();
+
+  // The following callbacks will be initialized in Initialize() and won't be
+  // changed during the life time of this class.
+  DecoderStatusCB decoder_status_cb_;
+  ErrorCB error_cb_;
+
+  void* egl_config_ = nullptr;
+  void* egl_display_ = nullptr;
+  DecodeTargetContextRunner decode_target_context_runner_;
+
+  scoped_ptr<starboard::shared::starboard::player::JobThread> decoder_thread_;
+
+  // |pending_inputs_| is shared between player main thread and decoder thread.
+  Mutex pending_inputs_mutex_;
+  std::deque<scoped_refptr<InputBuffer>> pending_inputs_;
+  // |written_inputs_| is only accessed on decoder thread.
+  std::vector<scoped_refptr<InputBuffer>> written_inputs_;
+  // |output_queue_| is shared between decoder thread and render thread.
+  Mutex output_queue_mutex_;
+  std::vector<scoped_refptr<DecodedImage>> output_queue_;
+  // |presenting_decode_targets_| is only accessed on render thread.
+  std::deque<GPUDecodeTargetPrivate*> presenting_decode_targets_;
+  std::atomic_int number_of_presenting_decode_targets_ = {0};
+
+  SbMediaColorMetadata last_presented_color_metadata_ = {};
+
+  bool is_drain_decoder_called_ = false;
+
+  bool needs_hdr_metadata_update_ = true;
+};
+
+}  // namespace shared
+}  // namespace xb1
+}  // namespace starboard
+
+#endif  // STARBOARD_XB1_SHARED_GPU_BASE_VIDEO_DECODER_H_
diff --git a/starboard/xb1/shared/internal_shims.h b/starboard/xb1/shared/internal_shims.h
new file mode 100644
index 0000000..9cd7153
--- /dev/null
+++ b/starboard/xb1/shared/internal_shims.h
@@ -0,0 +1,41 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_XB1_SHARED_INTERNAL_SHIMS_H_
+#define STARBOARD_XB1_SHARED_INTERNAL_SHIMS_H_
+
+#include <string>
+#include "starboard/atomic.h"
+#include "starboard/system.h"
+
+namespace starboard {
+namespace xb1 {
+namespace shared {
+
+bool CanAcquire();
+
+Windows::Foundation::IAsyncOperation<bool> ^ Acquire();
+
+void Release();
+
+Platform::String ^ GetCertScope();
+
+void GetSignature(Windows::Storage::Streams::IBuffer ^ message_buffer,
+                  Windows::Storage::Streams::IBuffer ^ *signature);
+
+}  // namespace shared
+}  // namespace xb1
+}  // namespace starboard
+
+#endif  // STARBOARD_XB1_SHARED_INTERNAL_SHIMS_H_
diff --git a/starboard/xb1/shared/internal_stubs.cc b/starboard/xb1/shared/internal_stubs.cc
new file mode 100644
index 0000000..a8f6ba5
--- /dev/null
+++ b/starboard/xb1/shared/internal_stubs.cc
@@ -0,0 +1,42 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/xb1/shared/internal_shims.h"
+
+#include <ppltasks.h>
+
+namespace starboard {
+namespace xb1 {
+namespace shared {
+
+bool CanAcquire() {
+  return false;
+}
+
+// clang-format off
+Windows::Foundation::IAsyncOperation<bool> ^ Acquire() {
+  return concurrency::create_async([] { return false; });
+}
+
+void Release() {}
+
+Platform::String ^ GetCertScope() { return ""; }
+
+void GetSignature(Windows::Storage::Streams::IBuffer ^ message_buffer,
+                  Windows::Storage::Streams::IBuffer ^ *signature) {}
+// clang-format on
+
+}  // namespace shared
+}  // namespace xb1
+}  // namespace starboard
diff --git a/starboard/xb1/shared/playready_license.cc b/starboard/xb1/shared/playready_license.cc
new file mode 100644
index 0000000..33444d4
--- /dev/null
+++ b/starboard/xb1/shared/playready_license.cc
@@ -0,0 +1,371 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <mfidl.h>
+#include <windows.media.protection.playready.h>
+#include <wrl.h>
+#include <wrl/client.h>
+
+#include <string>
+#include <vector>
+
+#include "starboard/common/log.h"
+#include "starboard/common/optional.h"
+#include "starboard/memory.h"
+#include "starboard/shared/win32/drm_system_playready.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/wrm_header.h"
+
+namespace starboard {
+namespace xb1 {
+namespace shared {
+namespace {
+
+using Microsoft::WRL::ComPtr;
+using ::starboard::shared::win32::DrmSystemPlayready;
+using ::starboard::shared::win32::WrmHeader;
+
+class PlayreadyLicense : public DrmSystemPlayready::License {
+ public:
+  PlayreadyLicense(const void* initialization_data,
+                   int initialization_data_size);
+  ~PlayreadyLicense() override;
+
+  GUID key_id() const override { return key_id_; }
+  bool usable() const override { return usable_; }
+  std::string license_challenge() const override { return license_challenge_; }
+  Microsoft::WRL::ComPtr<IMFTransform> decryptor() override {
+    return decryptor_;
+  }
+
+  void UpdateLicense(const void* license, int license_size) override;
+  bool IsHDCPRequired() override;
+
+ private:
+  bool CreateTrustedInputAndTrustedInputAuthority(
+      Microsoft::WRL::ComPtr<IStream> content_header);
+  void GenerateChallenge();
+  void UpdateLicenseInternal();
+
+  WrmHeader wrm_header_;
+  GUID key_id_;
+  Microsoft::WRL::ComPtr<IMFTrustedInput> trusted_input_;
+  Microsoft::WRL::ComPtr<IMFInputTrustAuthority> trusted_input_authority_;
+  Microsoft::WRL::ComPtr<IMFTransform> decryptor_;
+
+  Windows::Media::Protection::PlayReady::IPlayReadyServiceRequest ^
+      service_request_;
+  std::string license_challenge_;
+  bool usable_;
+  optional<bool> hdcp_required_;
+
+  // The following variables are not really instance variables.  They are saved
+  // in the class to simplify the passing of data to functions run on newly
+  // created MTA threads.
+  Platform::Array<unsigned char> ^ license_response_;
+};
+
+typedef void (PlayreadyLicense::*PlayreadyLicenseMemberFunction)();
+
+struct ThreadParam {
+  PlayreadyLicenseMemberFunction function;
+  PlayreadyLicense* license_object;
+};
+
+DWORD WINAPI MTAThreadFunc(void* param) {
+  SB_DCHECK(param);
+
+  CoInitializeEx(NULL, COINIT_MULTITHREADED);
+  ThreadParam* thread_param = static_cast<ThreadParam*>(param);
+  ((*thread_param->license_object).*(thread_param->function))();
+  CoUninitialize();
+
+  return 0;
+}
+
+// Playready licensing functions are required to run in MTA.  This function
+// makes it easy to run a particular member function in MTA synchronously.
+void RunFunctionOnMTA(PlayreadyLicenseMemberFunction function,
+                      PlayreadyLicense* license_object) {
+  DWORD thread_id;
+  ThreadParam param = {function, license_object};
+  // Use plain vanilla Windows thread to avoid any side effect.
+  HANDLE thread = CreateThread(NULL, 0, MTAThreadFunc, &param, 0, &thread_id);
+  WaitForSingleObject(thread, INFINITE);
+  CloseHandle(thread);
+}
+
+PlayreadyLicense::PlayreadyLicense(const void* initialization_data,
+                                   int initialization_data_size)
+    : wrm_header_(initialization_data, initialization_data_size),
+      key_id_(WrmHeader::kInvalidKeyId),
+      service_request_(nullptr),
+      license_response_(nullptr),
+      usable_(false) {
+  SB_DCHECK(wrm_header_.is_valid());
+  if (!wrm_header_.is_valid()) {
+    return;
+  }
+  if (CreateTrustedInputAndTrustedInputAuthority(
+          wrm_header_.content_header())) {
+    RunFunctionOnMTA(&PlayreadyLicense::GenerateChallenge, this);
+    key_id_ = wrm_header_.key_id();
+  }
+}
+
+PlayreadyLicense::~PlayreadyLicense() {
+  decryptor_.Reset();
+  if (trusted_input_authority_) {
+    trusted_input_authority_->Reset();
+  }
+}
+
+bool PlayreadyLicense::CreateTrustedInputAndTrustedInputAuthority(
+    ComPtr<IStream> content_header) {
+  SB_DCHECK(content_header);
+
+  ComPtr<IInspectable> inspectable;
+  ComPtr<IPersistStream> persist_stream;
+
+  HRESULT hr = ::Windows::Foundation::ActivateInstance(
+      ::Microsoft::WRL::Wrappers::HStringReference(
+          L"Windows.Media.Protection.PlayReady."
+          L"PlayReadyWinRTTrustedInput")
+          .Get(),
+      &inspectable);
+  CheckResult(hr);
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  hr = inspectable.As(&persist_stream);
+  CheckResult(hr);
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  hr = persist_stream->Load(content_header.Get());
+  CheckResult(hr);
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  hr = inspectable.As(&trusted_input_);
+  CheckResult(hr);
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  const int kDefaultStreamId = 0;
+  ComPtr<IUnknown> unknown;
+  hr = trusted_input_->GetInputTrustAuthority(kDefaultStreamId,
+                                              IID_IMFInputTrustAuthority,
+                                              unknown.ReleaseAndGetAddressOf());
+  CheckResult(hr);
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  hr = unknown.As(&trusted_input_authority_);
+  CheckResult(hr);
+
+  hr = trusted_input_authority_->GetDecrypter(IID_IMFTransform, &decryptor_);
+  CheckResult(hr);
+
+  return SUCCEEDED(hr);
+}
+
+void PlayreadyLicense::GenerateChallenge() {
+  SB_DCHECK(trusted_input_);
+  SB_DCHECK(trusted_input_authority_);
+  SB_DCHECK(!service_request_);
+  SB_DCHECK(license_challenge_.empty());
+
+  using Windows::Media::Protection::PlayReady::IPlayReadyServiceRequest;
+  using Windows::Media::Protection::PlayReady::PlayReadyContentHeader;
+  using Windows::Media::Protection::PlayReady::
+      PlayReadyLicenseAcquisitionServiceRequest;
+  using Windows::Media::Protection::PlayReady::PlayReadySoapMessage;
+
+  ComPtr<IMFActivate> enabler_activate;
+
+  HRESULT hr = trusted_input_authority_->RequestAccess(
+      PEACTION_PLAY, enabler_activate.GetAddressOf());
+
+  if (SUCCEEDED(hr)) {
+    // The license is usable but we still want to generate a challenge to
+    // ensure that the implementation conforms to the EME spec.
+    PlayReadyLicenseAcquisitionServiceRequest ^ fake_service_request =
+        ref new PlayReadyLicenseAcquisitionServiceRequest;
+
+    std::vector<uint8_t> copy_of_header(wrm_header_.wrm_header());
+    PlayReadyContentHeader ^ content_header =
+        ref new PlayReadyContentHeader(ref new Platform::Array<unsigned char>(
+            copy_of_header.data(), static_cast<DWORD>(copy_of_header.size())));
+    fake_service_request->ContentHeader = content_header;
+
+    PlayReadySoapMessage ^ soap_message =
+        fake_service_request->GenerateManualEnablingChallenge();
+
+    if (soap_message != nullptr) {
+      Platform::Array<unsigned char> ^ challenge =
+          soap_message->GetMessageBody();
+
+      license_challenge_.assign(challenge->begin(), challenge->end());
+      SB_DCHECK(!license_challenge_.empty());
+      SB_LOG(INFO) << "Playready license is already usable, force challenge "
+                   << "generating using license acquisition service request";
+    }
+
+    usable_ = true;
+    return;
+  }
+
+  if (!enabler_activate) {
+    SB_NOTREACHED() << "enabler_activate is NULL but the license isn't usable.";
+    return;
+  }
+
+  hr = enabler_activate->ActivateObject(
+      __uuidof(IPlayReadyServiceRequest ^),
+      reinterpret_cast<LPVOID*>(&service_request_));
+  CheckResult(hr);
+  if (FAILED(hr)) {
+    return;
+  }
+
+  PlayReadySoapMessage ^ soap_message =
+      service_request_->GenerateManualEnablingChallenge();
+
+  if (soap_message != nullptr) {
+    Platform::Array<unsigned char> ^ challenge = soap_message->GetMessageBody();
+
+    license_challenge_.assign(challenge->begin(), challenge->end());
+    SB_DCHECK(!license_challenge_.empty());
+  }
+}
+
+void PlayreadyLicense::UpdateLicense(const void* license, int license_size) {
+  if (!service_request_) {
+    SB_DCHECK(usable_);
+    return;
+  }
+
+  SB_DCHECK(!license_response_);
+
+  // Note that store the response in the object is not an ideal way to exchange
+  // data between the function and the MTA thread but it allows us to easily
+  // unify the RunFunctionOnMTA() interface.
+  unsigned char* license_in_unsigned_char =
+      static_cast<unsigned char*>(const_cast<void*>(license));
+  license_response_ = ref new Platform::Array<unsigned char>(
+      license_in_unsigned_char, license_size);
+  RunFunctionOnMTA(&PlayreadyLicense::UpdateLicenseInternal, this);
+
+  if (!usable_) {
+    SB_LOG(INFO)
+        << "License is not usable, try to re-create the ITA and challenge";
+    if (CreateTrustedInputAndTrustedInputAuthority(
+            wrm_header_.content_header())) {
+      RunFunctionOnMTA(&PlayreadyLicense::GenerateChallenge, this);
+      key_id_ = wrm_header_.key_id();
+    }
+    SB_LOG_IF(INFO, usable_) << "License is usable after retry";
+  }
+}
+
+void PlayreadyLicense::UpdateLicenseInternal() {
+  Windows::Foundation::HResult hresult =
+      service_request_->ProcessManualEnablingResponse(license_response_);
+  SB_LOG_IF(ERROR, FAILED(hresult.Value))
+      << "ProcessManualEnablingResponse() failed with 0x" << std::hex
+      << hresult.Value;
+  SB_DCHECK(SUCCEEDED(hresult.Value));
+
+  ComPtr<IMFActivate> enabler_activate;
+  HRESULT hr = trusted_input_authority_->RequestAccess(
+      PEACTION_PLAY, enabler_activate.GetAddressOf());
+  SB_LOG_IF(ERROR, FAILED(hr))
+      << "RequestAccess() failed after license update with 0x" << std::hex
+      << hr;
+
+  // TODO: It is possible that the above license is invalid and the player will
+  // retry after error status is propagated.  However, consider to generate a
+  // new license message directly using the |enabler_activate| above.
+  usable_ = SUCCEEDED(hr);
+  license_response_ = nullptr;
+  service_request_ = nullptr;
+}
+
+bool PlayreadyLicense::IsHDCPRequired() {
+  if (hdcp_required_.has_engaged()) {
+    return hdcp_required_.value();
+  }
+
+  ComPtr<IMFOutputPolicy> output_policy;
+  HRESULT hr = trusted_input_authority_->GetPolicy(
+      PEACTION_PLAY, output_policy.GetAddressOf());
+  CheckResult(hr);
+
+  ComPtr<IMFCollection> required_schemas;
+  DWORD attributes = MFOUTPUTATTRIBUTE_DIGITAL | MFOUTPUTATTRIBUTE_VIDEO;
+  GUID protection_schema = MFPROTECTION_HDCP;
+
+  hr = output_policy->GenerateRequiredSchemas(attributes, MFCONNECTOR_HDMI,
+                                              &protection_schema, 1,
+                                              required_schemas.GetAddressOf());
+  CheckResult(hr);
+
+  DWORD element_count;
+  hr = required_schemas->GetElementCount(&element_count);
+  CheckResult(hr);
+  hdcp_required_ = false;
+  if (element_count != 1) {
+    SB_DCHECK(element_count == 0);
+    return false;
+  }
+
+  ComPtr<IUnknown> unknown;
+  ComPtr<IMFOutputSchema> output_schema;
+  hr = required_schemas->GetElement(0, unknown.GetAddressOf());
+  CheckResult(hr);
+  hr = unknown.As(&output_schema);
+  CheckResult(hr);
+  GUID schema_id;
+  hr = output_schema->GetSchemaType(&schema_id);
+  CheckResult(hr);
+  SB_DCHECK(schema_id == MFPROTECTION_HDCP);
+  hdcp_required_ = true;
+  return true;
+}
+
+}  // namespace
+}  // namespace shared
+}  // namespace xb1
+}  // namespace starboard
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+scoped_refptr<DrmSystemPlayready::License> DrmSystemPlayready::License::Create(
+    const void* initialization_data,
+    int initialization_data_size) {
+  return new ::starboard::xb1::shared::PlayreadyLicense(
+      initialization_data, initialization_data_size);
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/xb1/shared/system_get_extensions.cc b/starboard/xb1/shared/system_get_extensions.cc
new file mode 100644
index 0000000..009b8d7
--- /dev/null
+++ b/starboard/xb1/shared/system_get_extensions.cc
@@ -0,0 +1,36 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include "starboard/common/string.h"
+#include "starboard/extension/configuration.h"
+#include "starboard/extension/graphics.h"
+#include "starboard/extension/media_session.h"
+#include "starboard/shared/uwp/xb1_media_session_client.h"
+#include "starboard/shared/win32/graphics.h"
+#include "starboard/xb1/shared/configuration.h"
+
+const void* SbSystemGetExtension(const char* name) {
+  if (strcmp(name, kCobaltExtensionGraphicsName) == 0) {
+    return starboard::shared::win32::GetGraphicsApi();
+  }
+  if (strcmp(name, kCobaltExtensionConfigurationName) == 0) {
+    return starboard::xb1::shared::GetConfigurationApi();
+  }
+  if (strcmp(name, kCobaltExtensionMediaSessionName) == 0) {
+    return starboard::shared::uwp::GetMediaSessionApi();
+  }
+  return NULL;
+}
diff --git a/starboard/xb1/shared/system_get_path.cc b/starboard/xb1/shared/system_get_path.cc
new file mode 100644
index 0000000..fd89588
--- /dev/null
+++ b/starboard/xb1/shared/system_get_path.cc
@@ -0,0 +1,228 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <windows.h>
+#include <codecvt>
+#include <cstring>
+#include <locale>
+
+#include "starboard/common/log.h"
+#include "starboard/common/string.h"
+#include "starboard/configuration_constants.h"
+#include "starboard/directory.h"
+#include "starboard/shared/uwp/application_uwp.h"
+#include "starboard/shared/win32/directory_internal.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+using starboard::shared::win32::platformStringToString;
+using starboard::shared::win32::wchar_tToUTF8;
+
+namespace {
+
+std::string GetBinaryName() {
+  const size_t kMaxModuleNameSize = kSbFileMaxName;
+  std::vector<wchar_t> buffer(kMaxModuleNameSize);
+  DWORD result = GetModuleFileName(NULL, buffer.data(), buffer.size());
+  std::string full_binary_path;
+  if (result == 0) {
+    full_binary_path = "unknown";
+  } else {
+    full_binary_path = wchar_tToUTF8(buffer.data(), result).c_str();
+  }
+
+  std::string::size_type index = full_binary_path.rfind(kSbFileSepChar);
+  if (index == std::string::npos) {
+    return full_binary_path;
+  }
+
+  return full_binary_path.substr(index + 1);
+}
+
+// Places up to |path_size| - 1 characters of the path to the current
+// executable in |out_path|, ensuring it is NULL-terminated. Returns success
+// status. The result being greater than |path_size| - 1 characters is a
+// failure. |out_path| may be written to in unsuccessful cases.
+bool GetExecutablePath(char* out_path, int path_size) {
+  if (!out_path || (path_size <= 0)) {
+    return false;
+  }
+  auto folder =
+      Windows::ApplicationModel::Package::Current->InstalledLocation->Path;
+  if (folder->Length() >= static_cast<unsigned int>(path_size) ||
+      folder->Length() < 1) {
+    return false;
+  }
+  auto app_name = Windows::ApplicationModel::Package::Current->Id->Name;
+  if (app_name->Length() >= static_cast<unsigned int>(path_size) ||
+      app_name->Length() < 1) {
+    return false;
+  }
+
+  std::string utf8_string =
+      (platformStringToString(folder) + "\\" + GetBinaryName());
+
+  if (utf8_string.length() > static_cast<unsigned int>(path_size)) {
+    return false;
+  }
+  return starboard::strlcpy(out_path, utf8_string.c_str(), path_size);
+}
+
+// Places up to |path_size| - 1 characters of the path to the directory
+// containing the current executable in |out_path|, ensuring it is
+// NULL-terminated. Returns success status. The result being greater than
+// |path_size| - 1 characters is a failure. |out_path| may be written to in
+// unsuccessful cases.
+bool GetExecutableDirectory(char* out_path, int path_size) {
+  if (!out_path || (path_size <= 0)) {
+    return false;
+  }
+  auto folder =
+      Windows::ApplicationModel::Package::Current->InstalledLocation->Path;
+  if (folder->Length() >= static_cast<unsigned int>(path_size) ||
+      folder->Length() < 1) {
+    return false;
+  }
+  std::string utf8_string =
+      starboard::shared::win32::wchar_tToUTF8(folder->Data(), folder->Length());
+  return starboard::strlcpy(out_path, utf8_string.c_str(), path_size);
+}
+
+// Places up to |path_size| - 1 characters of the path to the content directory
+// in |out_path|, ensuring it is NULL-terminated. Returns success
+// status. The result being greater than |path_size| - 1 characters is a
+// failure. |out_path| may be written to in unsuccessful cases.
+bool GetContentPath(char* out_path, int path_size) {
+  if (!out_path || (path_size <= 0)) {
+    return false;
+  }
+  std::vector<char> file_path(kSbFileMaxPath);
+  file_path[0] = '\0';
+  if (!GetExecutableDirectory(file_path.data(), path_size)) {
+    return false;
+  }
+  if (starboard::strlcat(file_path.data(), "\\content\\data", kSbFileMaxPath) >=
+      path_size) {
+    return false;
+  }
+  return starboard::strlcpy(out_path, file_path.data(), path_size);
+}
+
+// Places up to |path_size| - 1 characters of the path to the temporary
+// directory in |out_path|, ensuring it is NULL-terminated, and creates the
+// directory if necessary. Returns success status. The result being greater than
+// |path_size| - 1 characters is a failure. |out_path| may be written to in
+// unsuccessful cases.
+bool CreateAndGetTempPath(char* out_path, int path_size) {
+  if (!out_path || (path_size <= 0)) {
+    return false;
+  }
+  std::vector<wchar_t> w_file_path(kSbFileMaxPath);
+  w_file_path[0] = L'\0';
+
+  DWORD characters_written = GetTempPathW(kSbFileMaxPath, w_file_path.data());
+  if (static_cast<int>(characters_written) >= (path_size + 1) ||
+      characters_written < 1) {
+    return false;
+  }
+  // Remove the last slash, to match other Starboard implementations.
+  w_file_path[characters_written - 1] = L'\0';
+
+  std::string utf8_string = wchar_tToUTF8(w_file_path.data());
+
+  if (starboard::strlcpy(out_path, utf8_string.c_str(), path_size) >=
+      path_size) {
+    return false;
+  }
+  SbDirectoryCreate(out_path);
+
+  size_t length = strlen(out_path);
+  if (length < 1 || length > path_size) {
+    return false;
+  }
+  return true;
+}
+
+// Places up to |path_size| - 1 characters of the path to the directory in
+// |out_path|, ensuring it is NULL-terminated, and creates the directory if
+// necessary. Returns success status. The result being greater than |path_size|
+// - 1 characters is a failure. |out_path| may be written to in unsuccessful
+// cases.
+bool CreateAndGetApplicationDataFolder(Windows::Storage::StorageFolder ^ folder,
+                                       char* out_path,
+                                       int path_size) {
+  if (!out_path || (path_size <= 0)) {
+    return false;
+  }
+
+  // The caller expects that the output string will only be written if when
+  // true is returned. Therefore we have to buffer the string in case there is a
+  // false condition, such as small memory input size to hold the output
+  // parameter.
+  std::vector<char> out_path_copy(kSbFileMaxPath, 0);
+  std::string local_path = platformStringToString(folder->Path);
+  if (starboard::strlcpy(out_path_copy.data(), local_path.c_str(),
+                         out_path_copy.size()) >= out_path_copy.size()) {
+    return false;
+  }
+
+  size_t length = strlen(out_path_copy.data());
+  if (length < 1 || length > out_path_copy.size()) {
+    return false;
+  }
+
+  // The copy is verified, transfer it over to out_path.
+  size_t len = std::min<size_t>(path_size, kSbFileMaxPath);
+  starboard::strlcpy(out_path, out_path_copy.data(), len);
+
+  return true;
+}
+}  // namespace
+
+// Note: This function is only minimally implemented to allow tests to run.
+bool SbSystemGetPath(SbSystemPathId path_id, char* out_path, int path_size) {
+  if (!out_path || (path_size <= 0)) {
+    return false;
+  }
+
+  switch (path_id) {
+    case kSbSystemPathContentDirectory:
+      return GetContentPath(out_path, path_size);
+    case kSbSystemPathDebugOutputDirectory:
+      // We send debug output to the cache directory instead of the temp
+      // directory, because the temp directory is removed as soon as the
+      // application exits, while also a file can not be opened or copied while
+      // it is still open for writing. Using the cache directory makes it
+      // possible to retrieve the file contents after the application exits.
+      return SbSystemGetPath(kSbSystemPathCacheDirectory, out_path, path_size);
+    case kSbSystemPathExecutableFile:
+      return GetExecutablePath(out_path, path_size);
+    case kSbSystemPathStorageDirectory:
+      return CreateAndGetApplicationDataFolder(
+          Windows::Storage::ApplicationData::Current->LocalFolder, out_path,
+          path_size);
+    case kSbSystemPathTempDirectory:
+      // Note: This temp directory is removed as soon as the application exits.
+      return CreateAndGetTempPath(out_path, path_size);
+    case kSbSystemPathCacheDirectory:
+      return CreateAndGetApplicationDataFolder(
+          Windows::Storage::ApplicationData::Current->LocalCacheFolder,
+          out_path, path_size);
+    // TODO: implement all the other cases.
+    default:
+      SB_NOTIMPLEMENTED();
+      return false;
+  }
+}
diff --git a/starboard/xb1/shared/video_decoder_uwp.cc b/starboard/xb1/shared/video_decoder_uwp.cc
new file mode 100644
index 0000000..279fe0a
--- /dev/null
+++ b/starboard/xb1/shared/video_decoder_uwp.cc
@@ -0,0 +1,96 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/xb1/shared/video_decoder_uwp.h"
+
+#include <windows.h>
+
+#include "starboard/shared/uwp/async_utils.h"
+#include "starboard/shared/uwp/decoder_utils.h"
+#include "third_party/angle/include/angle_hdr.h"
+
+using ::starboard::shared::uwp::ApplicationUwp;
+using ::starboard::shared::uwp::UpdateHdrColorMetadataToCurrentDisplay;
+using ::starboard::shared::uwp::WaitForComplete;
+using Windows::Graphics::Display::Core::HdmiDisplayInformation;
+
+namespace starboard {
+namespace xb1 {
+namespace shared {
+
+const int kXboxeOneXMaxOutputSamples = 5;
+
+VideoDecoderUwp::~VideoDecoderUwp() {
+  if (IsHdrSupported() && IsHdrAngleModeEnabled()) {
+    SetHdrAngleModeEnabled(false);
+    auto hdmi_display_info = HdmiDisplayInformation::GetForCurrentView();
+    WaitForComplete(hdmi_display_info->SetDefaultDisplayModeAsync());
+  }
+}
+
+// static
+bool VideoDecoderUwp::IsHardwareVp9DecoderSupported() {
+  return ::starboard::shared::win32::VideoDecoder::
+      IsHardwareVp9DecoderSupported(ApplicationUwp::Get()->IsHdrSupported());
+}
+
+// static
+bool VideoDecoderUwp::IsHardwareAv1DecoderSupported() {
+  // XboxOneS/Base has av1 mft decoder, but sw av1 decoder
+  // is more preferred for Xbox OneS/Base because of performance.
+  // So to avoid using av1 mft in these devices we test if
+  // the current XBOX has vp9 hw decoder. If it doesn't it means
+  // that there is XboxOneS/Base and we don't use mft av1 decoder.
+  return VideoDecoderUwp::IsHardwareVp9DecoderSupported() &&
+         ::starboard::shared::win32::IsHardwareAv1DecoderSupported();
+}
+
+bool VideoDecoderUwp::TryUpdateOutputForHdrVideo(
+    const VideoStreamInfo& stream_info) {
+  bool is_hdr_video =
+      stream_info.color_metadata.primaries == kSbMediaPrimaryIdBt2020;
+  if (is_hdr_video && !ApplicationUwp::Get()->IsHdrSupported()) {
+    return false;
+  }
+  if (is_first_input_) {
+    is_first_input_ = false;
+    const SbMediaColorMetadata& color_metadata = stream_info.color_metadata;
+    if (is_hdr_video && IsHdrSupported()) {
+      if (!IsHdrAngleModeEnabled()) {
+        SetHdrAngleModeEnabled(true);
+      }
+      if (memcmp(&color_metadata, &current_color_metadata_,
+                 sizeof(color_metadata)) != 0) {
+        current_color_metadata_ = color_metadata;
+        UpdateHdrColorMetadataToCurrentDisplay(color_metadata);
+      }
+    }
+  }
+  return true;
+}
+
+size_t VideoDecoderUwp::GetPrerollFrameCount() const {
+  return GetMaxNumberOfCachedFrames();
+}
+
+size_t VideoDecoderUwp::GetMaxNumberOfCachedFrames() const {
+  return (::starboard::shared::uwp::kXboxOneX ==
+          ::starboard::shared::uwp::GetXboxType())
+             ? kXboxeOneXMaxOutputSamples
+             : ::starboard::shared::win32::VideoDecoder::GetPrerollFrameCount();
+}
+
+}  // namespace shared
+}  // namespace xb1
+}  // namespace starboard
diff --git a/starboard/xb1/shared/video_decoder_uwp.h b/starboard/xb1/shared/video_decoder_uwp.h
new file mode 100644
index 0000000..a7eb582
--- /dev/null
+++ b/starboard/xb1/shared/video_decoder_uwp.h
@@ -0,0 +1,64 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_XB1_SHARED_VIDEO_DECODER_UWP_H_
+#define STARBOARD_XB1_SHARED_VIDEO_DECODER_UWP_H_
+
+#include "starboard/shared/starboard/media/media_util.h"
+#include "starboard/shared/uwp/application_uwp.h"
+#include "starboard/shared/uwp/xb1_get_type.h"
+#include "starboard/shared/win32/video_decoder.h"
+
+namespace starboard {
+namespace xb1 {
+namespace shared {
+
+class VideoDecoderUwp : public ::starboard::shared::win32::VideoDecoder {
+ public:
+  typedef ::starboard::shared::starboard::media::VideoStreamInfo
+      VideoStreamInfo;
+
+  VideoDecoderUwp::VideoDecoderUwp(
+      SbMediaVideoCodec video_codec,
+      SbPlayerOutputMode output_mode,
+      SbDecodeTargetGraphicsContextProvider* graphics_context_provider,
+      SbDrmSystem drm_system)
+      : VideoDecoder(
+            video_codec,
+            output_mode,
+            graphics_context_provider,
+            drm_system,
+            ::starboard::shared::uwp::ApplicationUwp::Get()->IsHdrSupported()) {
+  }
+
+  ~VideoDecoderUwp() override;
+
+  static bool IsHardwareVp9DecoderSupported();
+  static bool IsHardwareAv1DecoderSupported();
+
+  bool TryUpdateOutputForHdrVideo(const VideoStreamInfo& stream_info) override;
+
+  size_t GetPrerollFrameCount() const override;
+  size_t GetMaxNumberOfCachedFrames() const override;
+
+ private:
+  SbMediaColorMetadata current_color_metadata_ = {};
+  bool is_first_input_ = true;
+};
+
+}  // namespace shared
+}  // namespace xb1
+}  // namespace starboard
+
+#endif  // STARBOARD_XB1_SHARED_VIDEO_DECODER_UWP_H_
diff --git a/starboard/xb1/shared/video_frame_impl.h b/starboard/xb1/shared/video_frame_impl.h
new file mode 100644
index 0000000..0f31ff2
--- /dev/null
+++ b/starboard/xb1/shared/video_frame_impl.h
@@ -0,0 +1,46 @@
+// Copyright 2021 The Cobalt Authors. All Rights Reserved.

+//

+// Licensed under the Apache License, Version 2.0 (the "License");

+// you may not use this file except in compliance with the License.

+// You may obtain a copy of the License at

+//

+//     http://www.apache.org/licenses/LICENSE-2.0

+//

+// Unless required by applicable law or agreed to in writing, software

+// distributed under the License is distributed on an "AS IS" BASIS,

+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+// See the License for the specific language governing permissions and

+// limitations under the License.

+

+#ifndef STARBOARD_XB1_SHARED_VIDEO_FRAME_IMPL_H_

+#define STARBOARD_XB1_SHARED_VIDEO_FRAME_IMPL_H_

+

+#include <functional>

+

+#include "starboard/common/log.h"

+#include "starboard/shared/starboard/player/filter/video_frame_internal.h"

+

+namespace starboard {

+namespace xb1 {

+namespace shared {

+

+class VideoFrameImpl

+    : public ::starboard::shared::starboard::player::filter::VideoFrame {

+ public:

+  typedef ::starboard::shared::starboard::player::filter::VideoFrame VideoFrame;

+

+  VideoFrameImpl(SbTime timestamp, std::function<void(VideoFrame*)> release_cb)

+      : VideoFrame(timestamp), release_cb_(release_cb) {

+    SB_DCHECK(release_cb_);

+  }

+  ~VideoFrameImpl() override { release_cb_(this); }

+

+ private:

+  std::function<void(VideoFrame*)> release_cb_;

+};

+

+}  // namespace shared

+}  // namespace xb1

+}  // namespace starboard

+

+#endif  // STARBOARD_XB1_SHARED_VIDEO_FRAME_IMPL_H_

diff --git a/cobalt/h5vcc/h5vcc_account_info.idl b/starboard/xb1/system_properties.h
similarity index 62%
copy from cobalt/h5vcc/h5vcc_account_info.idl
copy to starboard/xb1/system_properties.h
index 1fc2417..a040bf4 100644
--- a/cobalt/h5vcc/h5vcc_account_info.idl
+++ b/starboard/xb1/system_properties.h
@@ -1,19 +1,23 @@
-// Copyright 2015 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-interface H5vccAccountInfo {
-  readonly attribute DOMString avatarUrl;
-  readonly attribute DOMString username;
-  readonly attribute DOMString userId;
-};
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.

+//

+// Licensed under the Apache License, Version 2.0 (the "License");

+// you may not use this file except in compliance with the License.

+// You may obtain a copy of the License at

+//

+//     http://www.apache.org/licenses/LICENSE-2.0

+//

+// Unless required by applicable law or agreed to in writing, software

+// distributed under the License is distributed on an "AS IS" BASIS,

+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+// See the License for the specific language governing permissions and

+// limitations under the License.

+

+#ifndef STARBOARD_XB1_SYSTEM_PROPERTIES_H_

+#define STARBOARD_XB1_SYSTEM_PROPERTIES_H_

+

+#include "starboard/configuration.h"

+

+extern const char kCertificationScope[];

+extern const char kBase64EncodedCertificationSecret[];

+

+#endif  // STARBOARD_XB1_SYSTEM_PROPERTIES_H_

diff --git a/starboard/xb1/templates/ApplicationSection.xml.template b/starboard/xb1/templates/ApplicationSection.xml.template
new file mode 100644
index 0000000..c24e1f0
--- /dev/null
+++ b/starboard/xb1/templates/ApplicationSection.xml.template
@@ -0,0 +1,49 @@
+{% if __IS_COBALT__ %}
+{# Currently, DIAL expects an application ID of "App" to work. #}
+<Application Id="App"
+{% else %}
+<Application Id="{{ __APPLICATION_NAME__|replace('_', '') }}App"
+{% endif %}
+  Executable="{{ __APPLICATION_NAME__ }}.exe"
+  {# EntryPoint must be <start URL with no ? suffix> #}
+  EntryPoint="{{__PRODUCT_SETTINGS__['ENTRYPOINT']}}">
+  <uap:VisualElements
+    {% if __IS_COBALT__ %}
+    DisplayName="{{__PRODUCT_SETTINGS__['APPLICATION_DISPLAY_NAME']}}"
+    Description="{{__PRODUCT_SETTINGS__['APPLICATION_DESCRIPTION']}}"
+    {% else %}
+    DisplayName="{{ __APPLICATION_NAME__ }}"
+    Description="{{ __APPLICATION_NAME__ }}"
+    {% endif %}
+    Square150x150Logo="Assets\Square150x150Logo.scale-100.png"
+    Square44x44Logo="Assets\Square44x44Logo.scale-100.png"
+    BackgroundColor="transparent">
+      <uap:DefaultTile
+        Square310x310Logo="Assets\Square310x310Logo.scale-100.png"
+        Square71x71Logo="Assets\Square71x71Logo.scale-100.png"
+        Wide310x150Logo="Assets\Wide310x150Logo.scale-100.png"/>
+  </uap:VisualElements>
+  <Extensions>
+    {% if __IS_COBALT__ %}
+    {% if 'EXTRA_EXTENSIONS' in __PRODUCT_SETTINGS__ %}
+    {% for line in __PRODUCT_SETTINGS__['EXTRA_EXTENSIONS'] %}
+    {{line}}
+    {% endfor %}
+    {% endif %}
+    {% endif %}
+    {% if __CONFIG__ != 'gold' %}
+    {% if __IS_COBALT__ %}
+    <uap:Extension Category="windows.fileTypeAssociation">
+      <uap:FileTypeAssociation Name="txt">
+        <uap:SupportedFileTypes>
+          <uap:FileType>.txt</uap:FileType>
+        </uap:SupportedFileTypes>
+      </uap:FileTypeAssociation>
+    </uap:Extension>
+    {% endif %}
+    <uap:Extension Category="windows.protocol">
+      <uap:Protocol Name="{{ __APPLICATION_NAME__|replace('_','-') }}-starboard"/>
+    </uap:Extension>
+    {% endif %}
+  </Extensions>
+</Application>
diff --git a/starboard/xb1/templates/AppxManifest.xml.template b/starboard/xb1/templates/AppxManifest.xml.template
new file mode 100644
index 0000000..85b4a30
--- /dev/null
+++ b/starboard/xb1/templates/AppxManifest.xml.template
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
+        xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
+        xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
+        xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
+        {% if 'IGNORABLE_NAMESPACES' in __PRODUCT_SETTINGS__ %}
+        IgnorableNamespaces="{{ __PRODUCT_SETTINGS__['IGNORABLE_NAMESPACES'] }}"
+        {% else %}
+        IgnorableNamespaces="uap mp rescap build"
+        {% endif %}
+        xmlns:build="http://schemas.microsoft.com/developer/appx/2015/build">
+  <Identity Name="{{__PRODUCT_SETTINGS__['IDENTITY_NAME']}}"
+          Publisher="{{__PRODUCT_SETTINGS__['PUBLISHER']}}"
+          Version="{{__APPX_VERSION__}}"
+          ProcessorArchitecture="x64"/>
+  {% if 'PHONE_IDENTITY' in __PRODUCT_SETTINGS__ %}
+  {{ __PRODUCT_SETTINGS__['PHONE_IDENTITY']|indent(2) }}
+  {% endif %}
+  <Properties>
+    <DisplayName>{{__PRODUCT_SETTINGS__['DISPLAY_NAME']}}</DisplayName>
+    <PublisherDisplayName>{{__PRODUCT_SETTINGS__['PUBLISHER_DISPLAY_NAME']}}</PublisherDisplayName>
+    <Logo>Assets\Square44x44Logo.scale-100.png</Logo>
+    <uap:SupportedUsers>single</uap:SupportedUsers>
+  </Properties>
+  <Dependencies>
+          <TargetDeviceFamily
+                  {% if __CONFIG__ == 'gold' %}
+                  Name="Windows.Xbox"
+                  {% else %}
+                  Name="Windows.Universal"
+                  {% endif %}
+                  MinVersion="10.0.22000.0"
+                  MaxVersionTested="10.0.22000.0" />
+          <PackageDependency
+                  {% if __CONFIG__ == 'debug' or __CONFIG__ == 'devel' %}
+                  Name="Microsoft.VCLibs.140.00.Debug"
+                  {% else %}
+                  Name="Microsoft.VCLibs.140.00"
+                  {% endif %}
+                  MinVersion="14.0.24123.0"
+                  Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
+  </Dependencies>
+  <Resources>
+<!-- Note that Windows 10586 does not allow these locales. -->
+<!--    <Resource Language="SR" /> -->
+<!--    <Resource Language="SR-RS" /> -->
+<!--    <Resource Language="ZH" /> -->
+    <Resource Language="AF" />
+    <Resource Language="AF-ZA" />
+    <Resource Language="AM" />
+    <Resource Language="AM-ET" />
+    <Resource Language="AR" />
+    <Resource Language="AR-AE" />
+    <Resource Language="AR-BH" />
+    <Resource Language="AR-DZ" />
+    <Resource Language="AR-IQ" />
+    <Resource Language="AR-JO" />
+    <Resource Language="AR-KW" />
+    <Resource Language="AR-LB" />
+    <Resource Language="AR-LY" />
+    <Resource Language="AR-MA" />
+    <Resource Language="AR-OM" />
+    <Resource Language="AR-QA" />
+    <Resource Language="AR-SA" />
+    <Resource Language="AR-SY" />
+    <Resource Language="AR-TN" />
+    <Resource Language="AR-YE" />
+    <Resource Language="AR-EG" />
+    <Resource Language="BG" />
+    <Resource Language="BG-BG" />
+    <Resource Language="BN" />
+    <Resource Language="BN-BD" />
+    <Resource Language="CA" />
+    <Resource Language="CA-ES" />
+    <Resource Language="CS" />
+    <Resource Language="CS-CZ" />
+    <Resource Language="DA" />
+    <Resource Language="DA-DK" />
+    <Resource Language="DE" />
+    <Resource Language="DE-DE" />
+    <Resource Language="EL" />
+    <Resource Language="EL-GR" />
+    <Resource Language="EN" />
+    <Resource Language="EN-GB" />
+    <Resource Language="EN-US" />
+    <Resource Language="EN-XC" />
+    <Resource Language="ES" />
+    <Resource Language="ES-419" />
+    <Resource Language="ES-AR" />
+    <Resource Language="ES-BO" />
+    <Resource Language="ES-CL" />
+    <Resource Language="ES-CO" />
+    <Resource Language="ES-CR" />
+    <Resource Language="ES-DO" />
+    <Resource Language="ES-EC" />
+    <Resource Language="ES-ES" />
+    <Resource Language="ES-GT" />
+    <Resource Language="ES-HN" />
+    <Resource Language="ES-MX" />
+    <Resource Language="ES-NI" />
+    <Resource Language="ES-PA" />
+    <Resource Language="ES-PE" />
+    <Resource Language="ES-PR" />
+    <Resource Language="ES-PY" />
+    <Resource Language="ES-SV" />
+    <Resource Language="ES-US" />
+    <Resource Language="ES-UY" />
+    <Resource Language="ES-VE" />
+    <Resource Language="ET" />
+    <Resource Language="ET-EE" />
+    <Resource Language="EU" />
+    <Resource Language="EU-ES" />
+    <Resource Language="FA" />
+    <Resource Language="FA-IR" />
+    <Resource Language="FI" />
+    <Resource Language="FI-FI" />
+    <Resource Language="FIL" />
+    <Resource Language="FIL-PH" />
+    <Resource Language="FR" />
+    <Resource Language="FR-CA" />
+    <Resource Language="FR-FR" />
+    <Resource Language="GL" />
+    <Resource Language="GL-ES" />
+    <Resource Language="GU" />
+    <Resource Language="GU-IN" />
+    <Resource Language="HE" />
+    <Resource Language="HI" />
+    <Resource Language="HI-IN" />
+    <Resource Language="HR" />
+    <Resource Language="HR-HR" />
+    <Resource Language="HU" />
+    <Resource Language="HU-HU" />
+    <Resource Language="ID" />
+    <Resource Language="ID-ID" />
+    <Resource Language="IS" />
+    <Resource Language="IS-IS" />
+    <Resource Language="IT" />
+    <Resource Language="IT-IT" />
+    <Resource Language="IW" />
+    <Resource Language="IW-IL" />
+    <Resource Language="JA" />
+    <Resource Language="JA-JP" />
+    <Resource Language="KN" />
+    <Resource Language="KN-IN" />
+    <Resource Language="KO" />
+    <Resource Language="KO-KR" />
+    <Resource Language="LT" />
+    <Resource Language="LT-LT" />
+    <Resource Language="LV" />
+    <Resource Language="LV-LV" />
+    <Resource Language="ML" />
+    <Resource Language="ML-IN" />
+    <Resource Language="MO" />
+    <Resource Language="MR" />
+    <Resource Language="MR-IN" />
+    <Resource Language="MS" />
+    <Resource Language="MS-MY" />
+    <Resource Language="NB" />
+    <Resource Language="NB-NO" />
+    <Resource Language="NL" />
+    <Resource Language="NL-NL" />
+    <Resource Language="NO" />
+    <Resource Language="NO-NO" />
+    <Resource Language="PL" />
+    <Resource Language="PL-PL" />
+    <Resource Language="PT" />
+    <Resource Language="PT-BR" />
+    <Resource Language="PT-PT" />
+    <Resource Language="RO" />
+    <Resource Language="RO-RO" />
+    <Resource Language="RU" />
+    <Resource Language="RU-RU" />
+    <Resource Language="SK" />
+    <Resource Language="SK-SK" />
+    <Resource Language="SL" />
+    <Resource Language="SL-SI" />
+    <Resource Language="SR-CYRL-RS" />
+    <Resource Language="SV" />
+    <Resource Language="SV-SE" />
+    <Resource Language="SW" />
+    <Resource Language="SW-TZ" />
+    <Resource Language="TA" />
+    <Resource Language="TA-IN" />
+    <Resource Language="TE" />
+    <Resource Language="TE-IN" />
+    <Resource Language="TH" />
+    <Resource Language="TH-TH" />
+    <Resource Language="TL" />
+    <Resource Language="TL-PH" />
+    <Resource Language="TR" />
+    <Resource Language="TR-TR" />
+    <Resource Language="UK" />
+    <Resource Language="UK-UA" />
+    <Resource Language="UR" />
+    <Resource Language="UR-PK" />
+    <Resource Language="VI" />
+    <Resource Language="VI-VN" />
+    <Resource Language="ZH-CN" />
+    <Resource Language="ZH-HANS" />
+    <Resource Language="ZH-HANS-CN" />
+    <Resource Language="ZH-HANT" />
+    <Resource Language="ZH-HANT-HK" />
+    <Resource Language="ZH-HANT-TW" />
+    <Resource Language="ZH-HK" />
+    <Resource Language="ZH-TW" />
+    <Resource Language="ZU" />
+    <Resource Language="ZU-ZA" />
+  </Resources>
+  <Applications>
+    {{ __APPLICATIONS__|indent(4) }}
+  </Applications>
+  <Capabilities>
+    {% if __CONFIG__ != 'gold' %}
+    <uap:Capability Name="removableStorage" />
+    <Capability Name="internetClientServer" />
+    {% endif %}
+    <Capability Name="internetClient" />
+    <Capability Name="privateNetworkClientServer" />
+    <Capability Name="codeGeneration" />
+    {% if 'EXTRA_CAPABILITIES' in __PRODUCT_SETTINGS__ %}
+    {% for line in __PRODUCT_SETTINGS__['EXTRA_CAPABILITIES'] %}
+    {{line}}
+    {% endfor %}
+    {% endif %}
+    <DeviceCapability Name="microphone" />
+    <!-- Adds PlayReady capability -->
+    <DeviceCapability Name="6a7e5907-885c-4bcb-b40a-073c067bd3d5" />
+  </Capabilities>
+</Package>
diff --git a/starboard/xb1/test_filters.py b/starboard/xb1/test_filters.py
new file mode 100644
index 0000000..e545d5b
--- /dev/null
+++ b/starboard/xb1/test_filters.py
@@ -0,0 +1,64 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Starboard Xbox One Platform Test Filters."""
+
+import logging
+import os
+
+from starboard.shared.win32 import test_filters as shared_test_filters
+from starboard.tools.testing import test_filter
+
+# pylint: disable=line-too-long
+_FILTERED_TESTS = {
+    'nplb': [
+        # Enable multiplayer tests once it's supported.
+        'MultiplePlayerTests/*',
+        'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.SecondaryPlayerTest/*',
+    ],
+    'player_filter_tests': [
+        'PlayerComponentsTests/PlayerComponentsTest.*',
+        'VideoDecoderTests/VideoDecoderTest.HoldFramesUntilFull/*',
+        ('VideoDecoderTests/VideoDecoderTest'
+         '.MultipleValidInputsAfterInvalidKeyFrame/*'),
+        # AC3/EAC3 use a passthrough audio decoder that is incompatible with
+        # AdaptiveAudioDecoderTests.
+        # b/281740486.
+        'AdaptiveAudioDecoderTests/AdaptiveAudioDecoderTest.MultipleInput/*c3*',
+        'AdaptiveAudioDecoderTests/AdaptiveAudioDecoderTest.SingleInput/*c3*',
+        'AudioDecoderTests/AudioDecoderTest.SingleInputHEAAC/*c3*',
+    ],
+}
+
+
+def CreateTestFilters():
+  return Xb1TestFilters()
+
+
+class Xb1TestFilters(shared_test_filters.TestFilters):
+  """Starboard Xbox One Platform Test Filters."""
+
+  def GetTestFilters(self):
+    """Gets all tests to be excluded from a unit test run.
+
+    Returns:
+      A list of initialized TestFilter objects.
+    """
+    if os.environ.get('COBALT_WIN_BUILDBOT_DISABLE_TESTS', '0') == '1':
+      logging.error('COBALT_WIN_BUILDBOT_DISABLE_TESTS=1, Tests are disabled.')
+      return [test_filter.DISABLE_TESTING]
+
+    filters = super().GetTestFilters()
+    for target, tests in _FILTERED_TESTS.items():
+      filters.extend(test_filter.TestFilter(target, test) for test in tests)
+    return filters
diff --git a/starboard/xb1/toolchain/BUILD.gn b/starboard/xb1/toolchain/BUILD.gn
new file mode 100644
index 0000000..a94a592
--- /dev/null
+++ b/starboard/xb1/toolchain/BUILD.gn
@@ -0,0 +1,31 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/config/win/visual_studio_version.gni")
+import("//build/toolchain/win/msvc_toolchain.gni")
+import("//starboard/build/toolchain/win/variables.gni")
+
+msvc_toolchain("target") {
+  cl = "$tool_base_path/cl.exe"
+  lib = "$tool_base_path/lib.exe"
+  link = "$tool_base_path/link.exe"
+  asm = "$tool_base_path/ml64.exe"
+  sys_lib_flags = "/LIBPATH:\"$msvc_path/lib/x64/store\" " + common_libpaths
+
+  toolchain_args = {
+    is_clang = false
+    current_os = "win"
+    current_cpu = "x64"
+  }
+}
diff --git a/starboard/xb1/tools/__init__.py b/starboard/xb1/tools/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/starboard/xb1/tools/__init__.py
diff --git a/starboard/xb1/tools/application_section_generator.py b/starboard/xb1/tools/application_section_generator.py
new file mode 100644
index 0000000..82276a5
--- /dev/null
+++ b/starboard/xb1/tools/application_section_generator.py
@@ -0,0 +1,126 @@
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Generated the application section for xb1."""
+
+from __future__ import print_function
+
+import argparse
+import os
+import sys
+
+try:
+  from internal.starboard.xb1 import appx_product_settings
+  PRODUCT_SETTINGS = appx_product_settings.PRODUCT_SETTINGS
+except ImportError:
+  from starboard.xb1 import appx_product_settings
+  PRODUCT_SETTINGS = appx_product_settings.PRODUCT_SETTINGS
+
+THIRD_PARTY_PATH = os.path.normpath(
+    os.path.join(
+        os.path.realpath(__file__), os.pardir, os.pardir, os.pardir, os.pardir,
+        'third_party'))
+sys.path.append(THIRD_PARTY_PATH)
+from jinja2 import Template  # pylint: disable=wrong-import-position
+
+#pylint: disable=anomalous-backslash-in-string
+
+
+def _GenerateApplicationSection(application_name, application_template_filename,
+                                config, product):
+  """Uses templates to generate an application section for 1 application in the
+  appx xml file.
+
+  Example input: 'cobalt', 'application.template', 'extension.template'
+  Example output:
+     <Application Id="cobalt"
+                  Executable="cobalt.exe"
+                  EntryPoint="foo.bar">
+       <uap:VisualElements
+         DisplayName="cobalt"
+         Description="cobalt"
+         Square150x150Logo="Assets\Square150x150Logo.scale-100.png"
+         Square44x44Logo="Assets\Square44x44Logo.scale-100.png"
+         BackgroundColor="transparent"/>
+       <Extensions>
+         <uap:Extension Category="windows.dialProtocol">
+           <uap:DialProtocol Name="cobalt.foo"/>
+         </uap:Extension>
+         <uap:Extension Category="windows.protocol">
+           <uap:Protocol Name="cobalt-starboard"/>
+         </uap:Extension>
+       </Extensions>
+     </Application>
+  """
+  if product not in PRODUCT_SETTINGS:
+    raise ValueError(
+        f'Unknown product value: {product}. '
+        'Product settings must be defined in appx_product_settings.py')
+
+  with open(application_template_filename, 'r', encoding='utf-8') as fileobj:
+    application_template = Template(
+        fileobj.read(), trim_blocks=True, lstrip_blocks=True)
+
+  return application_template.render(
+      __APPLICATION_NAME__=application_name,
+      __CONFIG__=config,
+      __IS_COBALT__=application_name == 'cobalt',
+      __PRODUCT_SETTINGS__=PRODUCT_SETTINGS[product])
+
+
+def main():
+  parser = argparse.ArgumentParser()
+  parser.add_argument(
+      '--application_name',
+      dest='application_name',
+      required=True,
+      help='application name',
+      type=str)
+  parser.add_argument(
+      '--application_template',
+      dest='application_template',
+      required=True,
+      help='path to the application section template',
+      type=str)
+  parser.add_argument(
+      '--product',
+      dest='product',
+      required=False,
+      default='cobalt',
+      help='Name of product being built (e.g. cobalt/youtube/youtubetv)',
+      type=str)
+  parser.add_argument(
+      '--output',
+      dest='output',
+      required=True,
+      help='output filename',
+      type=str)
+  parser.add_argument(
+      '--config',
+      dest='config',
+      required=True,
+      help='config (e.g. debug/devel/qa/gold)',
+      type=str)
+  if len(sys.argv) == 1:
+    parser.print_help()
+    sys.exit(1)
+  options = parser.parse_args(sys.argv[1:])
+  with open(options.output, 'w', encoding='utf-8') as outfile:
+    outfile.write(
+        _GenerateApplicationSection(options.application_name,
+                                    options.application_template,
+                                    options.config, options.product))
+
+
+if __name__ == '__main__':
+  main()
diff --git a/starboard/xb1/tools/appx.py b/starboard/xb1/tools/appx.py
new file mode 100644
index 0000000..9a75101
--- /dev/null
+++ b/starboard/xb1/tools/appx.py
@@ -0,0 +1,200 @@
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+"""Deploy script for UWP. Generates AppxManifest.xml"""
+
+from __future__ import print_function
+
+import argparse
+import datetime
+import glob
+import os
+import sys
+import time
+import msvcrt
+
+try:
+  from internal.starboard.xb1 import appx_product_settings
+  PRODUCT_SETTINGS = appx_product_settings.PRODUCT_SETTINGS
+except ImportError:
+  from starboard.xb1 import appx_product_settings
+  PRODUCT_SETTINGS = appx_product_settings.PRODUCT_SETTINGS
+
+# Sometimes we must up the appx version number even if 24 hours have not
+# elapsed.
+# This number must not exceed floor((999 - 537) / 10) = 46, or the resulting
+# version would exceed the XML schema limit of 999 for that version field.
+_MANUAL_APPX_VERSION_OFFSET = 0
+
+THIRD_PARTY_PATH = os.path.normpath(
+    os.path.join(
+        os.path.realpath(__file__), os.pardir, os.pardir, os.pardir, os.pardir,
+        'third_party'))
+sys.path.append(THIRD_PARTY_PATH)
+
+from jinja2 import Template  # pylint: disable=wrong-import-position
+
+_APPLICATION_SECTION_REGEX = 'ApplicationSection.*.xml'
+
+
+def _GenerateAppxManifestContent(appx_template, template_directory, config,
+                                 product):
+  """ Generates content of the AppxManifest.
+
+  This function finds all files that match |_APPLICATION_SECTION_REGEX| in
+  |template_directory|, and uses them to create the body that will replace
+  __APPLICATIONS__.  It then generates the content for AppxManifest by
+  parsing |appx_template|.
+
+  Args:
+    appx_template: Path to AppxManifest.xml.template
+    template_directory: Path to directory containing files with Application
+      section of AppxManifest
+    config: Current config being built.  E.g. gold, devel, or qa  Reads
+      AppxManifest.xml.template from |appx_template|, and then in the generates
+      the new content by replacing __APPLICATIONS__.
+  """
+  if product not in PRODUCT_SETTINGS:
+    raise ValueError(
+        f'Unknown product value: {product}. '
+        'Product settings must be defined in appx_product_settings.py')
+  application_sections = []
+  search_path = os.path.join(template_directory, _APPLICATION_SECTION_REGEX)
+  for filename in glob.glob(search_path):
+    with open(filename, encoding='utf-8') as f:
+      application_sections.append(f.read())
+  application_section = '\n'.join(application_sections)
+
+  today = datetime.datetime.utcnow().isocalendar()
+  # The appx version number is formatted as a dotted-quad like
+  # "a.b.c.d" where a!=0, d==0, and the other elements must be 0-999
+  # In order to generate a distinct one every day, we set 'b' to
+  # the year since 2017 and 'c' to ((week_number*10) + (day_of_week) +
+  # config_build_offset). The reference for Identity can be found here:
+  # https://docs.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-identity
+  # Note that MS Partner Center mandates the revision number must be 0.
+  config_build_offsets = {'debug': 0, 'devel': 1, 'qa': 2, 'gold': 3}
+  if config not in config_build_offsets:
+    raise ValueError(f'Unknown config value: {config}')
+  config_build_offset = config_build_offsets[config]
+  build_number = ((today[1] * 10) + today[2] +
+                  (_MANUAL_APPX_VERSION_OFFSET * 10) + config_build_offset)
+  major_version = today[0] - 2017
+  appx_version = f'1.{major_version}.{build_number}.0'
+
+  with open(appx_template, encoding='utf-8') as source:
+    manifest_template = Template(
+        source.read(), trim_blocks=True, lstrip_blocks=True)
+    return manifest_template.render(
+        __APPX_VERSION__=appx_version,
+        __CONFIG__=config,
+        __APPLICATIONS__=application_section,
+        __PRODUCT_SETTINGS__=PRODUCT_SETTINGS[product])
+
+
+def _WriteAppxManifest(out_filename, appx_template, template_directory, config,
+                       product):
+  """ Generate AppxManifest and write the contents to |out_filename|.
+
+  Args:
+    out_filename: Name of the destination AppxManifest file.
+    appx_template: Path to AppxManifest.xml.template
+    template_directory: Path to directory containing files with Application
+      section of AppxManifest
+    config: Current |config| being built, e.g. gold, debug, etc
+  """
+  num_bytes_to_lock = 1
+
+  with open(out_filename, 'w', encoding='utf-8') as dest:
+    # Sometimes, we're building tens of targets, and the retry logic
+    # in msvcrt.locking is not enough.  Thus, additional waits
+    # are added, with backoffs to help each task finish.
+
+    # Wait longer between retries.  These times are in seconds.
+    for retry_time in [3, 5, 10, 20]:
+      try:
+        # According to the documentation, this will retry the lock up to 10
+        # times, and wait 1 second between each retry.  If this fails, an
+        # IOError exception is raised.  Source:
+        # https://docs.python.org/2/library/msvcrt.html
+        msvcrt.locking(dest.fileno(), msvcrt.LK_LOCK, num_bytes_to_lock)
+        break
+      except IOError:
+        print(
+            f'Unable to lock {out_filename}. Retrying in {retry_time} seconds.')
+        time.sleep(retry_time)
+    else:
+      # Try one last time, this time without a try/catch block,
+      # so that the exception can propagate.
+      msvcrt.locking(dest.fileno(), msvcrt.LK_LOCK, num_bytes_to_lock)
+
+    try:
+      # Note that both the manifest generation, and writing
+      # the content are done under a lock.
+      manifest_content = _GenerateAppxManifestContent(appx_template,
+                                                      template_directory,
+                                                      config, product)
+      dest.write(manifest_content)
+    finally:
+      # Writing to the appx manifest moves the current file position.
+      # Therefore, seek to position 0, as that is the locked position.
+      dest.seek(0)
+      msvcrt.locking(dest.fileno(), msvcrt.LK_UNLCK, num_bytes_to_lock)
+
+
+def main():
+  parser = argparse.ArgumentParser()
+  parser.add_argument(
+      '--manifest_out',
+      dest='manifest_out',
+      required=True,
+      help='output manifest filename',
+      type=str)
+  parser.add_argument(
+      '--config',
+      dest='config',
+      required=True,
+      help='config (e.g. debug/devel/qa/gold)',
+      type=str)
+  parser.add_argument(
+      '--appx_template',
+      dest='appx_template',
+      required=True,
+      help='Path to AppxManifest.xml.template',
+      type=str)
+  parser.add_argument(
+      '--template_directory',
+      dest='template_directory',
+      required=True,
+      help='Path to directory containing files with Application section of '
+      'AppxManifest',
+      type=str)
+  parser.add_argument(
+      '--product',
+      dest='product',
+      required=False,
+      default='cobalt',
+      help='Name of product being built (e.g. cobalt/youtube/youtubetv)',
+      type=str)
+  if len(sys.argv) == 1:
+    parser.print_help()
+    sys.exit(1)
+  options = parser.parse_args(sys.argv[1:])
+  _WriteAppxManifest(options.manifest_out, options.appx_template,
+                     options.template_directory, options.config,
+                     options.product)
+
+
+if __name__ == '__main__':
+  main()
diff --git a/starboard/xb1/tools/list_apps_in_uwp_package.ps1 b/starboard/xb1/tools/list_apps_in_uwp_package.ps1
new file mode 100644
index 0000000..f09ce5a
--- /dev/null
+++ b/starboard/xb1/tools/list_apps_in_uwp_package.ps1
@@ -0,0 +1,30 @@
+# Copyright 2018 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+$PackageName = $args[0]
+
+Write-Verbose "Getting AppX package information for $PackageName"
+$Apps = Get-AppxPackage -Name "*$PackageName*"
+foreach ($Package in $Apps) {
+  [xml]$AppXManifest = $Package | Get-AppxPackageManifest
+  $Applications = ($AppXManifest.Package.Applications)
+
+  foreach ($a in $Applications.Application) {
+    foreach ($e in $a.Extensions.Extension) {
+      if ($e.Category -eq 'windows.protocol') {
+        Write-Output ("^:" + $Package.Name + ":" + $a.id + ":" + $a.Executable + ":" + $e.Protocol.Name)
+      }
+    }
+  }
+}
diff --git a/tools/lbshell/open_source_release/create_tarball.sh b/starboard/xb1/tools/list_running_processes.ps1
old mode 100755
new mode 100644
similarity index 71%
copy from tools/lbshell/open_source_release/create_tarball.sh
copy to starboard/xb1/tools/list_running_processes.ps1
index 79904b4..861af32
--- a/tools/lbshell/open_source_release/create_tarball.sh
+++ b/starboard/xb1/tools/list_running_processes.ps1
@@ -1,6 +1,4 @@
-#!/bin/bash
-#
-# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+# Copyright 2018 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -14,5 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-CURRENT_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-${CURRENT_DIR}/../../../internal/tools/lbshell/open_source_release/create_tarball.sh "$@"
+foreach ($p in Get-Process) {
+  Write-Output ("" + $p.Id + ":" + $p.ProcessName)
+}
diff --git a/tools/lbshell/open_source_release/create_tarball.sh b/starboard/xb1/tools/list_uwp_packages.ps1
old mode 100755
new mode 100644
similarity index 71%
copy from tools/lbshell/open_source_release/create_tarball.sh
copy to starboard/xb1/tools/list_uwp_packages.ps1
index 79904b4..845e020
--- a/tools/lbshell/open_source_release/create_tarball.sh
+++ b/starboard/xb1/tools/list_uwp_packages.ps1
@@ -1,6 +1,4 @@
-#!/bin/bash
-#
-# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+# Copyright 2018 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -14,5 +12,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-CURRENT_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-${CURRENT_DIR}/../../../internal/tools/lbshell/open_source_release/create_tarball.sh "$@"
+(get-appxpackage)
diff --git a/starboard/xb1/tools/packager.py b/starboard/xb1/tools/packager.py
new file mode 100644
index 0000000..9503f20
--- /dev/null
+++ b/starboard/xb1/tools/packager.py
@@ -0,0 +1,297 @@
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Generate a xb1 package.
+
+  Generates a xb1 package from the loose files.
+  Called by package_application.py
+"""
+
+import argparse
+import logging
+import os
+import platform
+import shutil
+import subprocess
+import sys
+from xml.etree import ElementTree as ET
+import zipfile
+
+from starboard.tools import package
+
+_INTERNAL_CERT_PATH = os.path.join(
+    os.path.dirname(os.path.realpath(__file__)), os.pardir, os.pardir,
+    os.pardir, 'internal', 'starboard', 'xb1', 'cert', 'youtube.pfx')
+_EXTERNAL_CERT_PATH = os.path.join(
+    os.path.dirname(os.path.realpath(__file__)), os.pardir, os.pardir,
+    os.pardir, 'starboard', 'xb1', 'cert', 'cobalt.pfx')
+_APPX_MANIFEST_XML_NAMESPACE = \
+    'http://schemas.microsoft.com/appx/manifest/foundation/windows10'
+_NAMESPACE_DICT = {'appx': _APPX_MANIFEST_XML_NAMESPACE}
+_PUBLISHER_XPATH = './appx:Identity[@Publisher]'
+_PRODUCT_APPX_NAME = {
+    'cobalt': 'cobalt',
+    'youtube': 'cobalt',
+    'mainappbeta': 'mainappbeta',
+    'youtubetv': 'youtubetv'
+}
+_PRODUCT_CERT_PATH = {
+    'cobalt': _EXTERNAL_CERT_PATH,
+    'youtube': _INTERNAL_CERT_PATH,
+    'mainappbeta': _INTERNAL_CERT_PATH,
+    'youtubetv': _INTERNAL_CERT_PATH,
+}
+_DEFAULT_SDK_BIN_DIR = 'C:\\Program Files (x86)\\Windows Kits\\10\\bin'
+_DEFAULT_WIN_SDK_VERSION = '10.0.22000.0'
+_SOURCE_SPLASH_SCREEN_SUB_PATH = os.path.join('internal', 'cobalt', 'browser',
+                                              'splash_screen')
+# The splash screen file referenced in starboard/xb1/shared/configuration.cc
+# must be in appx/content/data/web/ to be found at runtime.
+_DESTINATION__SPLASH_SCREEN_SUB_PATH = os.path.join('appx', 'content', 'data',
+                                                    'web', 'splash_screen')
+_SPLASH_SCREEN_FILE = {
+    'cobalt': '',
+    'youtube': 'youtube_splash_screen.html',
+    'youtubetv': 'ytv_splash_screen.html',
+    'mainappbeta': 'youtube_splash_screen.html',
+}
+
+
+def _SelectBestPath(os_var_name, path):
+  if os_var_name in os.environ:
+    return os.environ[os_var_name]
+  if os.path.exists(path):
+    return path
+  new_path = path.replace('Program Files (x86)', 'mappedProgramFiles')
+  if os.path.exists(new_path):
+    return new_path
+  return path
+
+
+def _GetSourceSplashScreenDir():
+  # Relative to this file, the path is
+  # "../../../internal/cobalt/browser/splash_screen".
+  src_dir = os.path.join(
+      os.path.dirname(__file__), os.pardir, os.pardir, os.pardir)
+  return os.path.join(src_dir, _SOURCE_SPLASH_SCREEN_SUB_PATH)
+
+
+class Package(package.PackageBase):
+  """A class representing an installable UWP Appx package."""
+
+  @classmethod
+  def AddArguments(cls, arg_parser):
+    """Add xb1-specific command-line arguments to the ArgumentParser."""
+    super(Package, cls).AddArguments(arg_parser)
+    arg_parser.add_argument(
+        '-p',
+        '--publisher',
+        dest='publisher',
+        default=None,
+        help='Publisher Identity in Package.')
+
+  @classmethod
+  def ExtractArguments(cls, options):
+    kwargs = super(Package, cls).ExtractArguments(options)
+    kwargs['publisher'] = options.publisher
+    kwargs['product'] = options.product
+    return kwargs
+
+  def _GetDestinationSplashScreenDir(self):
+    return os.path.join(self.source_dir, _DESTINATION__SPLASH_SCREEN_SUB_PATH)
+
+  def _CleanSplashScreenDir(self):
+    splash_screen_dir = self._GetDestinationSplashScreenDir()
+
+    if not os.path.exists(splash_screen_dir):
+      return
+
+    shutil.rmtree(splash_screen_dir)
+
+  def _CopySplashScreen(self):
+    splash_screen_dir = self._GetDestinationSplashScreenDir()
+    # Create the splash screen directory if necessary.
+    if not os.path.exists(splash_screen_dir):
+      try:
+        os.makedirs(splash_screen_dir)
+      except OSError as e:
+        raise RuntimeError(f'Failed to create {splash_screen_dir}: {e}') from e
+    # Copy the correct splash screen for the current product into content.
+    splash_screen_file = _SPLASH_SCREEN_FILE[self.product]
+    src_splash_screen_dir = _GetSourceSplashScreenDir()
+    src_splash_screen_file = os.path.join(src_splash_screen_dir,
+                                          splash_screen_file)
+    if not os.path.exists(src_splash_screen_file):
+      logging.error('Failed to find splash screen file in source : %s',
+                    src_splash_screen_file)
+      return
+    shutil.copy(src_splash_screen_file, splash_screen_dir)
+
+  @classmethod
+  def SupportedPlatforms(cls):
+    if platform.system() == 'Windows':
+      return ['xb1']
+    else:
+      return []
+
+  def __init__(self, publisher, product, **kwargs):
+    windows_sdk_bin_dir = _SelectBestPath('WindowsSdkBinPath',
+                                          _DEFAULT_SDK_BIN_DIR)
+    self.windows_sdk_host_tools = os.path.join(windows_sdk_bin_dir,
+                                               _DEFAULT_WIN_SDK_VERSION, 'x64')
+    self.publisher = publisher
+    self.product = product
+    super().__init__(**kwargs)
+
+    if not os.path.exists(self.source_dir):
+      raise RuntimeError(
+          f'Package source directory {self.source_dir} not found.')
+
+    logging.debug('Building package')
+    if self.publisher:
+      self._UpdateAppxManifestPublisher(publisher)
+
+    # Remove any previous splash screen from content.
+    self._CleanSplashScreenDir()
+    # Copy the correct splash screen into content.
+    self._CopySplashScreen()
+
+    self.package = self._BuildPackage()
+    if not os.path.exists(self.package):
+      raise RuntimeError(f'Package file {self.package} does not exist.')
+
+    appxsym_out_file = self.appxsym_location
+    with zipfile.ZipFile(appxsym_out_file, 'w', zipfile.ZIP_DEFLATED) as z:
+      if os.path.isfile(os.path.join(self.source_dir, 'cobalt.exe.pdb')):
+        z.write(os.path.join(self.source_dir, 'cobalt.exe.pdb'))
+
+    with zipfile.ZipFile(self.appxupload_location, 'w',
+                         zipfile.ZIP_DEFLATED) as z:
+      z.write(appxsym_out_file)
+      z.write(self.appx_location)
+
+    logging.info('Finished.')
+
+  def _UpdateAppxManifestPublisher(self, publisher):
+    logging.info('Updating Appx with publisher [%s]', publisher)
+    tree = ET.parse(self.appxmanifest_location)
+    for element in tree.findall(_PUBLISHER_XPATH, _NAMESPACE_DICT):
+      assert 'Publisher' in element.attrib
+      element.attrib['Publisher'] = publisher
+    tree.write(self.appxmanifest_location)
+
+  def Install(self, targets=None):
+    # TODO: implement
+    pass
+
+  @property
+  def appx_folder_location(self):
+    product_locations = {
+        'cobalt': 'appx',
+        'youtube': 'appx',
+        'mainappbeta': 'mainappbeta-appx',
+        'youtubetv': 'youtubetv-appx'
+    }
+    return os.path.join(self.source_dir, product_locations[self.product])
+
+  @property
+  def appx_location(self):
+    return os.path.join(self.output_dir,
+                        _PRODUCT_APPX_NAME[self.product] + '.appx')
+
+  @property
+  def appxsym_location(self):
+    return os.path.join(self.output_dir,
+                        _PRODUCT_APPX_NAME[self.product] + '.appxsym')
+
+  @property
+  def appxupload_location(self):
+    return os.path.join(self.output_dir,
+                        _PRODUCT_APPX_NAME[self.product] + '.appxupload')
+
+  @property
+  def appxmanifest_location(self):
+    return os.path.join(self.appx_folder_location, 'AppxManifest.xml')
+
+  def _BuildPackage(self):
+    """Build the package for XB1.
+
+    Raises:
+      RuntimeError: if packaging or verification (if requested) fails.
+    Returns:
+      path to package location.
+    """
+
+    logging.info('Creating the package at: %s', self.appx_location)
+
+    tools_path = self.windows_sdk_host_tools
+
+    makeappx_args = [
+        os.path.join(tools_path, 'makeappx.exe'), 'pack', '/l', '/o', '/d',
+        self.appx_folder_location, '/p', self.appx_location
+    ]
+    logging.info('Running %s', ' '.join(makeappx_args))
+    subprocess.check_call(makeappx_args)
+
+    cert_path = _PRODUCT_CERT_PATH[self.product]
+
+    try:
+      signtool_args = [
+          os.path.join(tools_path, 'signtool.exe'), 'sign', '/fd', 'SHA256',
+          '/a', '/f', cert_path, '/v', '/debug', self.appx_location
+      ]
+      logging.info('Running %s', ' '.join(signtool_args))
+      subprocess.check_call(signtool_args)
+    except subprocess.CalledProcessError as sub_err:
+      if '0x80070070' in str(sub_err):
+        print('\n\n*** ERROR CAUSED BY LOW DISK SPACE!! ***\n\n')
+      raise  # Rethrow original error with original stack trace.
+
+    return self.appx_location
+
+
+def main():
+  parser = argparse.ArgumentParser()
+  parser.add_argument(
+      '-s',
+      '--source',
+      required=True,
+      help='Source directory from which to create a package.')
+  parser.add_argument(
+      '-o',
+      '--output',
+      default=os.path.join(
+          os.path.dirname(os.path.realpath(__file__)), 'package'),
+      help='Output directory to place the packaged app. Defaults to ./package/')
+  parser.add_argument(
+      '-p',
+      '--product',
+      default='cobalt',
+      help=(
+          'Product name. This must be one of [cobalt, youtube, youtubetv,'
+          'mainappbeta]. Any builds that are not internal to YouTube should use'
+          'cobalt.'))
+  args, _ = parser.parse_known_args()
+
+  if not os.path.exists(args.output):
+    os.makedirs(args.output)
+
+  Package(
+      publisher=None,
+      product=args.product,
+      source_dir=args.source,
+      output_dir=args.output)
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/tools/lbshell/open_source_release/create_tarball.sh b/starboard/xb1/tools/register_uwp_package.ps1
old mode 100755
new mode 100644
similarity index 71%
copy from tools/lbshell/open_source_release/create_tarball.sh
copy to starboard/xb1/tools/register_uwp_package.ps1
index 79904b4..da5d797
--- a/tools/lbshell/open_source_release/create_tarball.sh
+++ b/starboard/xb1/tools/register_uwp_package.ps1
@@ -1,6 +1,4 @@
-#!/bin/bash
-#
-# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+# Copyright 2018 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -14,5 +12,5 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-CURRENT_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-${CURRENT_DIR}/../../../internal/tools/lbshell/open_source_release/create_tarball.sh "$@"
+$AppxManifestPath = $args[0]
+add-appxpackage -register "$AppxManifestPath" -ForceApplicationShutdown
diff --git a/tools/lbshell/open_source_release/create_tarball.sh b/starboard/xb1/tools/remove_uwp_package.ps1
old mode 100755
new mode 100644
similarity index 71%
copy from tools/lbshell/open_source_release/create_tarball.sh
copy to starboard/xb1/tools/remove_uwp_package.ps1
index 79904b4..1b90b5f
--- a/tools/lbshell/open_source_release/create_tarball.sh
+++ b/starboard/xb1/tools/remove_uwp_package.ps1
@@ -1,6 +1,4 @@
-#!/bin/bash
-#
-# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+# Copyright 2018 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -14,5 +12,5 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-CURRENT_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-${CURRENT_DIR}/../../../internal/tools/lbshell/open_source_release/create_tarball.sh "$@"
+$PackageName = $args[0]
+get-appxpackage "$PackageName" | remove-appxpackage
diff --git a/tools/lbshell/open_source_release/create_tarball.sh b/starboard/xb1/tools/stop_process_by_id.ps1
old mode 100755
new mode 100644
similarity index 71%
copy from tools/lbshell/open_source_release/create_tarball.sh
copy to starboard/xb1/tools/stop_process_by_id.ps1
index 79904b4..2ae614d
--- a/tools/lbshell/open_source_release/create_tarball.sh
+++ b/starboard/xb1/tools/stop_process_by_id.ps1
@@ -1,6 +1,4 @@
-#!/bin/bash
-#
-# Copyright 2023 The Cobalt Authors. All Rights Reserved.
+# Copyright 2018 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -14,5 +12,5 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-CURRENT_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-${CURRENT_DIR}/../../../internal/tools/lbshell/open_source_release/create_tarball.sh "$@"
+$ProcessId = $args[0]
+Stop-Process -Id "$ProcessId"
diff --git a/starboard/xb1/tools/uwp_api.py b/starboard/xb1/tools/uwp_api.py
new file mode 100644
index 0000000..345c224
--- /dev/null
+++ b/starboard/xb1/tools/uwp_api.py
@@ -0,0 +1,443 @@
+#!/usr/bin/python
+# Copyright 2018 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""UWP API."""
+
+from __future__ import print_function
+
+from glob import glob
+import os
+import pprint
+from six.moves import input
+import subprocess
+import sys
+
+
+_PS_SCRIPT_LIST_APPS_IN_PACKAGE = \
+    os.path.realpath(os.path.join(
+        os.path.dirname(__file__), 'list_apps_in_uwp_package.ps1'))
+
+_PS_SCRIPT_LIST_RUNNING_PROCESSES = \
+    os.path.realpath(os.path.join(
+        os.path.dirname(__file__), 'list_running_processes.ps1'))
+
+_PS_SCRIPT_REMOVE_UWP_PACKAGE = \
+    os.path.realpath(os.path.join(
+        os.path.dirname(__file__), 'remove_uwp_package.ps1'))
+
+_PS_SCRIPT_REGISTER_UWP_PACKAGE = \
+    os.path.realpath(os.path.join(
+        os.path.dirname(__file__), 'register_uwp_package.ps1'))
+
+_PS_SCRIPT_LIST_UWP_PACKAGES = \
+    os.path.realpath(os.path.join(
+        os.path.dirname(__file__), 'list_uwp_packages.ps1'))
+
+_PS_SCRIPT_STOP_PROCESS_BY_ID = \
+    os.path.realpath(os.path.join(
+        os.path.dirname(__file__), 'stop_process_by_id.ps1'))
+
+
+def ExecutePowershellScript(script_file, args_str=''):
+  try:
+    cmd = 'powershell ' + os.path.abspath(script_file)
+    if args_str:
+      cmd += ' ' + args_str
+    out = subprocess.check_output(cmd, shell=True, universal_newlines=True)
+  except Exception as e:
+    raise e
+  return out
+
+
+#----------- Command Generation
+def GetPackageDir(package_full_name):
+  """ Queries the os to get the directory for the given package name. """
+  return os.path.join(
+      os.path.expandvars('%LocalAppData%'), 'Packages', package_full_name)
+
+
+def GetPackageAppMap(package_filter='', app_name_filter=''):
+  """Returns a map of {full_package_name: { AppName0: { ...
+
+  }, ...}} |package_filter| is an optional parameter, only packages
+  containing the package_filter name will be returned.
+
+  |app_name_filter| is an optional parameter, only app names, aliases or ids
+  containing app_name_filter will be returned.
+  """
+  result = ExecutePowershellScript(_PS_SCRIPT_LIST_APPS_IN_PACKAGE,
+                                   package_filter)
+  package_map = {}
+  for line in result.split('\n'):
+    try:
+      if not line:
+        continue
+      vals = line.split(':')
+      if len(vals) != 5:
+        continue
+
+      # Note that valid lines start with '^' so that errors may be filtered out.
+      if vals[0] != '^':
+        continue
+      (unused_anchor, package_name, id_, executable_name, alias_name) = vals
+
+      if len(package_filter) > 0:
+        if not package_filter in package_name:
+          continue
+
+      if len(app_name_filter) > 0:
+        app_found = (app_name_filter in id_) or \
+                    (app_name_filter in executable_name) or \
+                    (app_name_filter in alias_name)
+
+        if not app_found:
+          continue
+
+      app_map = package_map.setdefault(package_name, {})
+      props = app_map.setdefault(id_, {})
+      props.setdefault('exe', executable_name)
+      props.setdefault('aliases', []).append(alias_name)
+    except Exception as e:  # pylint: disable=broad-except
+      print(str(e) + ' for line "' + line + '"')
+  return package_map
+
+
+def GetRunningProcessMap(exe_name_filter=''):
+  """Returns a dictionary mapping of int(process_id) -> str(exe_name).
+
+  Note that many process id's may have the same exe_name!
+  """
+  lines = ExecutePowershellScript(_PS_SCRIPT_LIST_RUNNING_PROCESSES)
+
+  if exe_name_filter is None:
+    exe_name_filter = ''
+  exe_name_filter = exe_name_filter.lower()
+  exe_name_filter = RemoveSuffix(exe_name_filter, '.exe')
+
+  process_map = {}
+  for line in lines.split('\n'):
+    try:
+      if not line:
+        continue
+      (pid, name) = line.split(':')
+      name = name.lower()
+      if exe_name_filter and name != exe_name_filter:
+        continue
+      process_map[int(pid)] = name
+    except Exception as e:  # pylint: disable=broad-except
+      print(str(e) + ' for line "' + line + '"')
+  return process_map
+
+
+def RemoveSuffix(name, suffix_str):
+  if name is None:
+    return name
+  if not name.lower().endswith(suffix_str):
+    return name
+  return name[0:-len(suffix_str)]
+
+
+#############################################################
+# UwpApi acts wraps Windows10 shell commands in a friendly api.
+class UwpApi:
+  """UWP API class."""
+
+  def __init__(self, logger):
+    self.logger = logger
+    #self.cached_installed_apps = {}
+
+  def GetAllInstalledPackageNames(self):
+    infos = self.GetInstalledPackageInfos()
+    names = []
+    for props in infos.values():
+      try:
+        names.append(props['Name'])
+      except KeyError as ke:
+        print(ke)
+        continue
+    return names
+
+  # Resolves to the best possible package name, given the partial_package_name.
+  def ResolveFullPackageName(self, partial_package_name):
+    package_map = GetPackageAppMap(partial_package_name)
+    best_package_match = None
+    for package_name in package_map:
+      if not best_package_match:
+        best_package_match = package_name
+      else:
+        diff_curr = abs(len(package_name) - len(partial_package_name))
+        diff_prev = abs(len(best_package_match) - len(partial_package_name))
+        if diff_curr < diff_prev:
+          # Smallest possible match allowed.
+          best_package_match = package_name
+    return best_package_match
+
+  def GetRunningProcesses(self, exe_filter_name=None):
+    return GetRunningProcessMap(exe_filter_name)
+
+  def GetProcessIds(self, exe_name):
+    exe_name = exe_name.lower()
+    exe_name = RemoveSuffix(exe_name, '.exe')
+    proc_map = GetRunningProcessMap(exe_name)
+    out_ids = []
+    for id_, name in proc_map.items():
+      if name == exe_name:
+        out_ids.append(id_)
+    return out_ids
+
+  def IsExeRunning(self, exe_name):
+    ids = self.GetProcessIds(exe_name)
+    return len(ids) > 0
+
+  def ResolveExeNameToAliases(self, partial_package_name, exe_name):
+    packages = GetPackageAppMap(partial_package_name)
+
+    for apps_dict in packages.values():
+      for props in apps_dict.values():
+        try:
+          if exe_name == props.get('exe', ''):
+            aliases = props.get('aliases', [])
+            return aliases
+        except KeyError:
+          pass
+    return None
+
+  def GetAppsInPackage(self, package_name):
+    package_app_map = GetPackageAppMap(package_name)
+    output = []
+    for apps_dict in package_app_map.values():
+      for app_name in apps_dict:  # key is app name
+        output.append(app_name)
+    return output
+
+  def GetAppsExesInPackage(self, package_name):
+    package_app_map = GetPackageAppMap(package_name)
+    output = []
+    for apps_dict in package_app_map.values():
+      for app_dict in apps_dict.values():  # key is app name
+        try:
+          output.append(app_dict['exe'])
+        except KeyError:
+          pass
+    return output
+
+  def GetAppAliasesInPackage(self, package_name):
+    package_app_map = GetPackageAppMap(package_name)
+    output = []
+    for apps_dict in package_app_map.values():
+      for app_name in apps_dict:  # key is app name
+        try:
+          aliases = apps_dict[app_name]['aliases']
+          output.extend(aliases)
+        except Exception:  # pylint: disable=broad-except
+          pass
+    return output
+
+  def IsAppInstalled(self, package_name, id_):
+    return id_ in self.GetAppsInPackage(package_name)
+
+  def GetPackageInfo(self, package_name):
+    infos = self.GetInstalledPackageInfos()
+    for key, val in infos.items():
+      if package_name in key:
+        return val
+    return None
+
+  def GetInstalledPackageInfos(self):
+    """Finds all the app packages and returns all their info.
+
+    Doesn't include the installed app names."""
+
+    def GetKeyVal(line):
+      try:
+        key, val = line.split(':', 1)
+        key = key.strip()
+        val = val.strip()
+      except ValueError:
+        return '', ''
+      return key, val
+
+    output = ExecutePowershellScript(_PS_SCRIPT_LIST_UWP_PACKAGES)
+    infos = []
+    current = {}
+
+    for line in output.splitlines():
+      key, val = GetKeyVal(line)
+      if key == 'Name':
+        if len(current) > 0:
+          infos.append(current)
+          current = {}
+      if key and val:
+        current[key] = val
+    infos.append(current)
+
+    output = {}
+    for info in infos:
+      output[info['PackageFullName']] = info
+    return output
+
+  # Will throw subprocess.CalledProcessError if any folders/files are
+  # locked.
+  def RemovePackage(self, package_name):
+    package_name = '*' + package_name.replace('_', '*') + '*'
+    ExecutePowershellScript(_PS_SCRIPT_REMOVE_UWP_PACKAGE, package_name)
+
+  def InstallPackage(self, package_path):
+    if not package_path:
+      raise IOError('Could not find starboard directory.')
+    full_path = os.path.join(package_path, 'AppxManifest.xml')
+    ExecutePowershellScript(_PS_SCRIPT_REGISTER_UWP_PACKAGE, full_path)
+
+  def StartAppByAliasName(self, app_alias_name, args):
+    cmd = 'start ' + app_alias_name + ':' + ';'.join(args)
+    self.Log('\nExecute command:\n  ' + cmd + '\n')
+    subprocess.Popen(cmd, shell=True)  # pylint: disable=consider-using-with
+    self.Log('  ...Process started\n')
+
+  def KillAppByExeName(self, exe_name):
+    for id_ in self.GetProcessIds(exe_name):
+      self.KillAppByProcessId(id_)
+
+  def KillAppByProcessId(self, proc_id):
+    ExecutePowershellScript(_PS_SCRIPT_STOP_PROCESS_BY_ID, str(proc_id))
+
+  # Private section
+  # Sends to the test framework output file.
+  def Log(self, s):
+    if self.logger:
+      self.logger.write(str(s))
+      self.logger.flush()
+    else:
+      print(str(s), end='')
+
+  def LogLn(self, s):
+    self.Log(str(s) + '\n')
+
+
+#############################################################
+def InteractiveCommandLineMode():
+  api = UwpApi(logger=None)  # Prints to stdout
+
+  def PrintInstalledExecutables():
+    package_name = input('Which package? ')
+    package_map = GetPackageAppMap(package_name)
+
+    pprint.pprint(package_map)
+
+  def PrintInstalledPackages():
+    v = input('Just names (y) or full package infos (n)?')
+    if 'y' in v or 'Y' in v:
+      package_names = api.GetAllInstalledPackageNames()
+      print('Installed Packages:')
+      for name in sorted(package_names, key=lambda s: s.lower()):
+        print('  ' + name)
+      return
+    else:
+      infos = api.GetInstalledPackageInfos()
+      for key in sorted(infos, key=lambda s: s.lower()):
+        print(key + ':')
+        pprint.pprint(infos[key])
+        print('')
+
+  def PrintInspectPackage():
+    package_name = input('Which package? ')
+    info = api.GetPackageInfo(package_name)
+    pprint.pprint(info)
+
+  def PrintFilesInPackage():
+    package_name = input('Which package? ')
+    info = api.GetPackageInfo(package_name)
+    if not info:
+      print('ERROR could not find package name ' + package_name)
+    pprint.pprint(glob(os.path.join(info['InstallLocation'], '*')))
+
+  def InstallPackage():
+    appx_dir = input('Path to appx directory: ')
+    try:
+      api.InstallPackage(appx_dir)
+    except Exception:  # pylint: disable=broad-except
+      print('Failed to install ' + appx_dir + ', maybe uninstall first?')
+
+  def UninstallPackage():
+    package_name = input('Which package: ')
+    api.RemovePackage(package_name)
+
+  def KillRunningProgramByNameOrId():
+    answer = input('By (i)d or by (n)ame: ')
+    if 'i' in answer:
+      id_ = input('process id: ')
+      api.KillAppByProcessId(id_)
+    elif 'n' in answer:
+      app_name = input('Exe name: ')
+      api.KillAppByExeName(app_name)
+    else:
+      print('Unexpected response: ' + answer)
+
+  def PrintRunningProcesses():
+    filter_name = None
+    if 'y' in input('filter by name (y/n)?: '):
+      filter_name = input('exe name: ')
+    running_procs = api.GetRunningProcesses(filter_name)
+
+    if len(running_procs) < 1:
+      print('No running processes found.')
+    else:
+      print('Found processes:')
+      for key in sorted(running_procs):
+        print(f'  {key}: {running_procs[key]}')
+
+  while True:
+    print('What would you like to do?')
+    print('  [0] Show all installed packages.')
+    print('  [1] See all installed executables in an installed package')
+    print('  [2] Inspect a package by name')
+    print('  [3] List directories and files in the package')
+    print('  [4] Install package')
+    print('  [5] Uninstall package')
+    print('  [6] Run from alias')
+    print('  [7] Kill process by exe name or id')
+    print('  [8] Show all running processes')
+    print('  [q] Quit')
+    val = input('> ')
+
+    if val in ('', 'q'):
+      print('quitting.')
+      sys.exit(0)
+    elif '0' == val:
+      PrintInstalledPackages()
+    elif '1' == val:
+      PrintInstalledExecutables()
+    elif '2' == val:
+      PrintInspectPackage()
+    elif '3' == val:
+      PrintFilesInPackage()
+    elif '4' == val:
+      InstallPackage()
+    elif '5' == val:
+      UninstallPackage()
+    elif '6' == val:
+      alias_name = input('Which app alias: ')
+      args = input('Args: ')
+      api.StartAppByAliasName(alias_name, args)
+    elif '7' == val:
+      KillRunningProgramByNameOrId()
+    elif '8' == val:
+      PrintRunningProcesses()
+    else:
+      print('Unexpected answer: ' + val)
+    input('press the return key to continue....')
+
+
+if __name__ == '__main__':
+  InteractiveCommandLineMode()
diff --git a/starboard/xb1/tools/uwp_launcher.py b/starboard/xb1/tools/uwp_launcher.py
new file mode 100644
index 0000000..cff2918
--- /dev/null
+++ b/starboard/xb1/tools/uwp_launcher.py
@@ -0,0 +1,273 @@
+#!/usr/bin/python
+#
+# Copyright 2018 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""UWP implementation of Starboard launcher abstraction."""
+
+from __future__ import print_function
+
+import fnmatch
+import os
+import subprocess
+import sys
+import time
+
+from starboard.shared.win32 import mini_dump_printer
+from starboard.tools import abstract_launcher
+from starboard.xb1.tools import uwp_api
+
+APPX_NAME = 'YouTube'
+PACKAGE_NAME = 'GoogleInc.YouTube'
+PACKAGE_FULL_NAME = PACKAGE_NAME + '_yfg5n0ztvskxp'
+
+
+#----------- Global Functions
+def GlobalVars():
+  return GlobalVars.__dict__
+
+
+# First call returns True, otherwise return false.
+def FirstRun():
+  v = GlobalVars()
+  if 'first_run' in v:
+    return False
+  v['first_run'] = False
+  return True
+
+
+# Repeatedly tests to see if a file path exists. Returns True
+# on success, or else False after timeout time with no success
+# has elapsed.
+def WaitForFileToAppear(file_path, timeout):
+  start_time = time.process_time()
+  while True:
+    if os.path.exists(file_path):
+      return True
+    if (time.process_time() - start_time) > timeout:
+      return False
+    time.sleep(.01)
+
+
+def FindAppxDirectoryOrRaise(target_dir):
+  appx_paths = [target_dir, os.path.join(target_dir, 'appx')]
+
+  final_path = None
+  for p in appx_paths:
+    if os.path.exists(os.path.join(p, 'AppxManifest.xml')):
+      final_path = p
+      break
+
+  if not final_path or not os.path.exists(final_path):
+    msg = ('Could not find AppxManifest in paths ' + str(appx_paths) + '.' +
+           '\nPlease run again with --out_directory <APPX_DIR>')
+    raise IOError(msg)
+  return final_path
+
+
+# Input:  "--url=https://www.youtube.com/tv?v=1FmJdQiKy_w,--install=True"
+# Output: {'url': 'https://www.youtube.com/tv?v=1FmJdQiKy_w', 'install': 'True'}
+def CommandArgsToDict(s):
+  if not s:
+    return {}
+
+  array = s.split(',')
+  out = {}
+  for v in array:
+    elems = v.split('=', 1)
+    if len(elems) < 1:
+      continue
+    key = elems[0]
+
+    if key.startswith('--'):
+      key = key[2:]
+    val = None
+    if len(elems) > 1:
+      val = elems[1]
+    out[key] = val
+  return out
+
+
+# Returns full names.
+def GlobFiles(dir_path, file_pattern):
+  if not os.path.exists(dir_path):
+    return []
+  files = [
+      os.path.join(dir_path, f)
+      for f in os.listdir(dir_path)
+      if fnmatch.fnmatch(f, file_pattern)
+  ]
+  return files
+
+
+###########################################################################
+class Launcher(abstract_launcher.AbstractLauncher):
+  """Run an application on UWP target."""
+
+  def __init__(self, platform, target_name, config, device_id, **kwargs):
+    super().__init__(platform, target_name, config, device_id, **kwargs)
+
+    self.UwpApi = uwp_api.UwpApi(None)  # pylint: disable=invalid-name
+    self.package_dir = uwp_api.GetPackageDir(PACKAGE_FULL_NAME)
+    local_cache_path = os.path.join(self.package_dir, 'LocalCache')
+    self.executable = self.GetTargetPath()
+    self.kill_called = False
+
+    self.stdout_file_name = target_name + '_stdout.txt'
+    self.stdout_file_path = os.path.join(local_cache_path,
+                                         self.stdout_file_name)
+    self.uwp_app_exe_name = self.target_name + '.exe'
+    self.uwp_app_exe_path = self.GetTargetPath() + '.exe'
+
+    self.uwp_dump_file_pattern = '*' + self.uwp_app_exe_name + '*.dmp'
+
+    self.uwp_app_dmp_path = os.path.join(os.environ['LOCALAPPDATA'],
+                                         'CrashDumps')
+
+    # Clear out dump files from a previous run.
+    self.DeleteFiles(self.uwp_app_dmp_path, self.uwp_dump_file_pattern)
+
+    self.args = ['--xb1_log_file=' + self.stdout_file_name]
+
+    # Merge target params into the user_params.
+    user_params = kwargs.get('target_params', '')
+    if user_params and len(user_params) > 0:
+      user_params_dict = CommandArgsToDict(','.join(user_params))
+      for key, val in user_params_dict.items():
+        if val:
+          self.args.append('--' + str(key) + '=' + str(val))
+        else:
+          self.args.append('--' + str(key))
+
+    if FirstRun():
+      self.InitInstallAppxPackage()
+      # Hack to prevent UWP app from launching a window that will block
+      # progress in unit tests.
+      first_run_file = os.path.join(local_cache_path, 'first_run')
+      dirname = os.path.dirname(first_run_file)
+      if not os.path.exists(dirname):
+        os.makedirs(dirname)
+      with open(first_run_file, 'w', encoding='utf-8') as _:
+        pass
+
+  # Install Appx Package.
+  def InitInstallAppxPackage(self):
+    target_dir = os.path.dirname(self.GetTargetPath())
+    final_path = FindAppxDirectoryOrRaise(target_dir)
+    self.Output('final_appx path: ' + final_path)
+    try:
+      self.UwpApi.RemovePackage(PACKAGE_NAME)
+      self.UwpApi.InstallPackage(final_path)
+    except subprocess.CalledProcessError as e:
+      msg = ('Could not complete remove / install cycle for \n' +
+             PACKAGE_FULL_NAME + '.\n' + 'This error is usually ' +
+             'caused by a file being open in the package ' +
+             'directory which is currently:\n  ' +
+             os.path.abspath(self.package_dir))
+      raise IOError(msg) from e
+
+  # Sends to the test framework output file.
+  def Output(self, s):
+    self.output_file.write(str(s))
+    self.output_file.flush()
+
+  # Waits for the test execution to finish by inspecting the watchdog_log_path.
+  # On error, this function will throw an IOError.
+  def WaitForExecutionCompletion(self, exe_name, log_path):
+    if not WaitForFileToAppear(log_path, 30):
+      raise IOError('----> ERROR - expected log file ' + log_path +
+                    ' was not generated')
+
+    log_file = None
+    try:
+      log_file = open(log_path, 'r', encoding='utf-8')  # pylint: disable=consider-using-with
+
+      while self.UwpApi.IsExeRunning(exe_name) and not self.kill_called:
+        self.Output(''.join(log_file.readlines()))
+    except Exception as e:
+      raise IOError(str(e)) from e
+
+    finally:
+      time.sleep(.5)  # Give time for the |log_file| to finish writing.
+      if log_file:
+        self.Output(''.join(log_file.readlines()))
+        log_file.close()
+
+  # Note that alias resolving is done in the launcher since it
+  # appears that multiple aliases are linked to the same binary.
+  # However, only the aliases with '-starboard' seem to work.
+  def ResolveAliasName(self, exe_name):
+    app_aliases = self.UwpApi.ResolveExeNameToAliases(PACKAGE_NAME, exe_name)
+    if not app_aliases:
+      return []
+    # Prefer alias names that have "-starboard" in them. Other alias names
+    # that map to the same binary seem not to work.
+    for name in app_aliases:
+      if '-starboard' in name:
+        return name
+    return app_aliases[0]
+
+  def Run(self):
+    crashed = False
+    app_alias = self.ResolveAliasName(self.uwp_app_exe_name)
+    if not app_alias:
+      msg = ('ERROR - "' + self.uwp_app_exe_name + '" is not installed.\n' +
+             'Installed Apps:\n' + '  ' +
+             str(self.UwpApi.GetAppsExesInPackage(PACKAGE_NAME)) + '\n' +
+             'Maybe you need to build and/or deploy ' + self.uwp_app_exe_name +
+             ' first?')
+      raise IOError(msg)
+
+    try:
+      self.UwpApi.StartAppByAliasName(app_alias, self.args)
+      self.WaitForExecutionCompletion(self.uwp_app_exe_name,
+                                      self.stdout_file_path)
+    except KeyboardInterrupt:
+      self.Output('ctrl-c captured, quitting app...')
+    except IOError as io_err:
+      self.Output('IOError while running ' + app_alias + ', reason: ' +
+                  str(io_err))
+    except KeyError as key_err:
+      self.Output('Error while running app ' + app_alias + ': ' + str(key_err))
+    finally:
+      self.UwpApi.KillAppByExeName(self.uwp_app_exe_name)
+      crashed = self.DetectAndHandleCrashDump()
+    return crashed
+
+  def Kill(self):
+    self.kill_called = True
+    sys.stderr.write('\n***Killing UWP Launcher***\n')
+    self.UwpApi.KillAppByExeName(self.uwp_app_exe_name)
+
+  def DeleteFiles(self, dir_path, glob_pattern):
+    dump_files = GlobFiles(dir_path, glob_pattern)
+    for f in dump_files:
+      try:
+        os.remove(f)
+        self.Output('Removed ' + f)
+      except Exception as err:  # pylint: disable=broad-except
+        self.Output(f'Failed to remove {f} error:{err!r}')
+
+  def DetectAndHandleCrashDump(self):
+    dump_files = GlobFiles(self.uwp_app_dmp_path, self.uwp_dump_file_pattern)
+    for dmp_file in dump_files:
+      mini_dump_printer.PrintMiniDump(dmp_file, self.output_file)
+    return len(dump_files) > 0
+
+  def GetDeviceIp(self):
+    """Gets the device IP. TODO: Implement."""
+    return None
+
+  def GetDeviceOutputPath(self):
+    # TODO: Implement
+    return None
diff --git a/starboard/xb1/tools/xb1_launcher.py b/starboard/xb1/tools/xb1_launcher.py
new file mode 100644
index 0000000..969a5ae
--- /dev/null
+++ b/starboard/xb1/tools/xb1_launcher.py
@@ -0,0 +1,581 @@
+#!/usr/bin/python
+#
+"""This script uses the UWP Device Portal API [1] to run unit tests on the Xbox.
+
+This module is designed to be integrated with the abstract_launcher framework.
+It does the following when it is asked to run an app:
+    1.  Uninstall existing appx.
+    2.  Upload and install new application.
+    3.  Wait for the install to finish
+    4.  Run the application
+    5.  Wait for the application to finish running
+    6.  Fetch the content and write it to the appropriate place.
+
+When combined with starboard/tools/example/app_launcher_client.py, this module
+enables changing target names (e.g. nplb), the Xbox used for testing, and
+
+Examples:
+python starboard/tools/example/app_launcher_client.py --p xb1 -t nplb
+  -c debug -d 172.31.164.179 --target_params="--gtest_filter=*SbSocket*ait*"
+
+python starboard/tools/example/app_launcher_client.py --p xb1 -t nplb
+  -c debug -d 172.31.164.179
+  --target_params="--gtest_filter=*Sb*Win*"
+
+Caveats:
+  Since we cannot launch write to a location any of the user directories like
+LocalCache before the application is run for the first time, we have to bake
+in the commandline arguments at install time.  Thus, we have to reinstall
+the package each time we want to run the binary with different arguments.
+
+Sample output (truncated for brevity):
+  Uninstalling App (if it exists).
+  Uninstall successfully started
+  Installing on NAVREETXB1
+  Uploading 6 files in appx/...Done.
+  .
+  .
+  Uploading 80 files in appx/content/data/icu/icudt56l/zone...Done.
+  Skipping appx/microsoft.system.package.metadata since it has 0 files.
+  Done uploading.
+  Uploading args. [ --gtest_filter=*Sb*Win*; ]
+  Uploading 1 files in appx/content/data/arguments...Done.
+  Done uploading.
+  Done registering.
+  Installation is running..
+  Installation complete.
+  Starting GoogleInc.YouTube::nplb
+  App started successfully.
+  nplb is running.
+  nplb is running.
+  Fetching log..
+  Found 12 installed apps.
+  [1800:61781033300:INFO:application_uwp.cc(465)] Starting nplb.exe
+  Note: Google Test filter = *Sb*Win*
+  [==========] Running 7 tests from 4 test cases.
+  [----------] Global test environment set-up.
+  [----------] 2 tests from SbWindowCreateTest
+  [ RUN      ] SbWindowCreateTest.SunnyDayDefault
+  [       OK ] SbWindowCreateTest.SunnyDayDefault (1 ms)
+  .
+  .
+  .
+  [----------] Global test environment tear-down
+  [==========] 7 tests from 4 test cases ran. (5644 ms total)
+  [  PASSED  ] 7 tests.
+  Killing Process (if running).
+  Found 12 installed apps.
+  Log file found. Deleting.
+
+[1]
+https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal-api-core
+"""
+
+from __future__ import print_function
+
+import os
+import subprocess
+import sys
+import time
+
+from starboard.shared.win32 import mini_dump_printer
+from starboard.tools import abstract_launcher
+from starboard.tools import net_args
+from starboard.tools import net_log
+from starboard.xb1.tools import packager
+from starboard.xb1.tools import xb1_network_api
+
+_ARGS_DIRECTORY = 'content/data/arguments'
+_STARBOARD_ARGUMENTS_FILE = 'starboard_arguments.txt'
+_DEFAULT_PACKAGE_NAME = 'GoogleInc.YouTube'
+_DEFAULT_APPX_NAME = 'cobalt.appx'
+_DEFAULT_STAGING_APP_NAME = 'appx'
+_XB1_LOG_FILE_PARAM = 'xb1_log_file'
+_XB1_PORT = 11443
+_XB1_NET_LOG_PORT = 49353
+_XB1_NET_ARG_PORT = 49355
+
+_PROCESS_TIMEOUT = 60 * 5.0
+_PROCESS_KILL_TIMEOUT_SECONDS = 5.0
+
+_RESTART_TIMEOUT = 180
+
+
+def ToAppxFriendlyName(app_name):
+  if app_name == 'cobalt':
+    app_name = 'App'
+  else:
+    app_name = app_name.replace('_', '') + 'App'
+  return app_name
+
+
+def GlobalVars():
+  return GlobalVars.__dict__
+
+
+# First call returns True, otherwise return false.
+def FirstRun():
+  v = GlobalVars()
+  if 'first_run' in v:
+    return False
+  v['first_run'] = False
+  return True
+
+
+def GetXb1NetworkApiFor(device_id, port):
+  v = GlobalVars()
+  network_key = str(device_id) + str(port)
+  if network_key not in v:
+    v[network_key] = xb1_network_api.Xb1NetworkApi(device_id, port)
+  return v[network_key]
+
+
+def TryGetAppxDirectory(target_dir):
+  appx_path = os.path.join(target_dir, _DEFAULT_STAGING_APP_NAME)
+  if os.path.exists(os.path.join(appx_path, 'AppxManifest.xml')):
+    return appx_path
+  return None
+
+
+def TryGetTargetPath(appx_path, target_name):
+  if not appx_path:
+    return None
+  target_path = os.path.join(appx_path, target_name + '.exe')
+  if os.path.exists(target_path):
+    return target_path
+  return None
+
+
+def TryGetPackagedBinary(target_path):
+  path = os.path.join(target_path, 'package', _DEFAULT_APPX_NAME)
+  if os.path.exists(path):
+    return path
+  return None
+
+
+def CheckEnvironment():
+  v = GlobalVars()
+  if 'os_checked' not in v:
+    v['os_checked'] = True
+    path = os.path.abspath(__file__)
+    if path.startswith('/cygdrive'):
+      # os.path.abspath() does not work in cygwin, maybe other
+      # path operations don't work either.
+      raise OSError('\n  **** cygwin not supported ****')
+
+
+# Input:  "--url=https://www.youtube.com/tv?v=1FmJdQiKy_w,--install=True"
+# Output: {'url': 'https://www.youtube.com/tv?v=1FmJdQiKy_w', 'install': 'True'}
+def CommandArgsToDict(s):
+  if not s:
+    return {}
+
+  array = s.split(',')
+  out = {}
+  for v in array:
+    elems = v.split('=', 1)
+    if len(elems) < 1:
+      continue
+    key = elems[0]
+
+    if key.startswith('--'):
+      key = key[2:]
+    val = None
+    if len(elems) > 1:
+      val = elems[1]
+    out[key] = val
+  return out
+
+
+def Str2Bool(s):
+  if not s:
+    return False
+  s = s.lower()
+  return s in ('true', '1')
+
+
+class Launcher(abstract_launcher.AbstractLauncher):
+  """Class for launching Cobalt/tools on Xbox."""
+
+  def __init__(self, platform, target_name, config, device_id, **kwargs):
+    """Launcher constructor.
+
+    Args:
+      platform: Platform name (e.g. xb1, or xb1-future)
+      target_name: Target name (e.g. "nplb")
+      config: Config name (e.g. debug, devel, qa, gold)
+      device_id: IP address of the device (e.g. 172.2.3.4)
+    """
+    super().__init__(platform, target_name, config, device_id, **kwargs)
+
+    CheckEnvironment()
+    self._network_api = GetXb1NetworkApiFor(device_id, _XB1_PORT)
+    self._network_api.SetLoggingFunction(self._Log)
+    self._logfile_name = target_name + '_stdout.txt'
+    # Global argument will be visible to every launched application.
+    # --net_args_wait_for_connection will instruct the app to wait
+    # until net_args can connect via a socket and receive the command
+    # arguments.
+    # --net_log_wait_for_connection will instruct the app to wait until
+    # the netlog attaches.
+    self._global_args = (';--net_args_wait_for_connection'
+                         ';--net_log_wait_for_connection')
+    # Once net_args is connected, the following _target_args will be sent
+    # over the wire.
+    self._target_args = ['--' + _XB1_LOG_FILE_PARAM + '=' + self._logfile_name]
+    self._do_deploy = True
+    self._do_restart = True
+    self._do_run = True
+    self._device_id = device_id
+    self._platform = platform
+    self._config = config
+
+    # Note that target_params is an array of strings, not a string.
+    user_params = kwargs.get('target_params', '')
+    if user_params and len(user_params) > 0:
+      self.InitTargetParams(','.join(user_params))
+
+    self._package_root_dir = os.path.split(self.GetTargetPath())[0]
+
+    # Ensure that target is built and ready to be packaged.
+    self._source_appx_path = TryGetAppxDirectory(self._package_root_dir)
+    self._source_exe_path = TryGetTargetPath(self._source_appx_path,
+                                             target_name)
+    if not self._source_exe_path:
+      raise IOError(f'Target {target_name} not found in appx directory.')
+
+  def InitTargetParams(self, user_params_str):
+    args_dict = CommandArgsToDict(user_params_str)
+    # If --restart is present, consume the field
+    self._do_restart = Str2Bool(args_dict.pop('restart', 'True'))
+
+    # If --deploy is present, then consume the value and
+    # remove from the rest of the arguments.
+    if 'deploy' in args_dict:
+      val = args_dict['deploy']
+      del args_dict['deploy']
+      if val is not None:
+        self._do_deploy = Str2Bool(val)
+
+    # If --run is present, then consume the value and
+    # remove from the rest of the arguments.
+    if 'run' in args_dict:
+      val = args_dict['run']
+      del args_dict['run']
+      if val is not None:
+        self._do_run = Str2Bool(val)
+    # If there are still arguments then add them to the target
+    # args.
+    if len(args_dict) > 0:
+      args = []
+      for key, val in args_dict.items():
+        entry = '--' + key
+        if val is not None:
+          entry += '=' + val
+        args.append(entry)
+      self._target_args.extend(args)
+
+  def _Log(self, s):
+    try:
+      self.output_file.write(s)
+    except UnicodeEncodeError:
+      s = s.encode('ascii', 'replace').decode()
+      self.output_file.write(s)
+    self.output_file.flush()
+
+  def _LogLn(self, s):
+    try:
+      # Attempt to convert to a string if the type is bytes.
+      s = s.decode()
+    except (UnicodeDecodeError, AttributeError):
+      pass
+    self._Log(s + '\n')
+
+  def InstallStarboardArgument(self, global_args):
+    args_path = [self._source_appx_path]
+    args_path.extend(_ARGS_DIRECTORY.split('/'))
+    args_path.append(_STARBOARD_ARGUMENTS_FILE)
+    args_path = os.path.join(*args_path)  # splat args_path into flat list.
+
+    args_dir_path = os.path.dirname(args_path)
+    if not os.path.exists(args_dir_path):
+      os.makedirs(args_dir_path)
+
+    if not global_args:
+      if os.path.exists(args_path):
+        os.remove(args_path)
+        self._LogLn('Removed global command argument file: ' + args_path)
+    else:
+      with open(args_path, 'w', encoding='utf-8') as fd:
+        fd.write(global_args)
+      self._LogLn('Installed global command arguments: \"' + global_args +
+                  '\" to:\n' + os.path.realpath(args_path))
+
+  def GetSerial(self):
+    try:
+      poll = self._network_api.GetDeviceInfo()
+      return poll['SerialNumber']
+    except IOError:
+      return ''
+
+  def RestartDevkit(self):
+    dev_info = self._network_api.GetDeviceInfo()
+    serial = dev_info['SerialNumber']
+    console_type = dev_info['ConsoleType']
+    self._Log('Connected to: ')
+    self._LogLn(self._network_api.ComputerName() + ' Type:' + console_type +
+                ' Serial:' + serial + ', triggering restart')
+    start = time.time()
+    self._network_api.Restart()
+
+    while self.GetSerial():  # Wait for at least one failed poll
+      time.sleep(1)
+
+    while self.GetSerial() != serial:
+      elapsed = int(time.time() - start)
+      if elapsed > _RESTART_TIMEOUT:
+        raise RuntimeError('Timed out waiting for restart, '
+                           f'timeout:{_RESTART_TIMEOUT}')
+      self._LogLn(f'Waiting for restart, elapsed seconds:{elapsed} '
+                  f'( timeout: {_RESTART_TIMEOUT} )')
+      time.sleep(1)
+
+    time.sleep(10)
+    self._Log('Restart complete: ')
+    self._LogLn(self._network_api.ComputerName())
+
+  def SignIn(self):
+    self._Log('Connected to: ')
+    self._LogLn(self._network_api.ComputerName())
+
+    users = self._network_api.GetXboxLiveUserInfos().get('Users', [])
+
+    if len(users) == 0:
+      raise IOError('Please add at least one user to the test accounts on\n' +
+                    'the Xbox developer homescreen.')
+
+    # If we find an existing user that is signed in, then use that.
+    for user in users:
+      if user.get('SignedIn', False):
+        return
+
+    # Else, sign in the first user.
+    self._network_api.SetXboxLiveSignedInUserState(users[0]['EmailAddress'],
+                                                   True)
+
+  def WinAppDeployCmd(self, command):
+    try:
+      out = subprocess.check_output('WinAppDeployCmd ' + command + ' -ip ' +
+                                    self.GetDeviceIp()).decode()
+    except subprocess.CalledProcessError as e:
+      self._LogLn(e.output)
+      raise e
+
+    return out
+
+  def PackageCobalt(self):
+    # Package all targets into an appx.
+    package_parameters = {
+        'source_dir': self.out_directory,
+        'output_dir': os.path.join(self.out_directory, 'package'),
+        'publisher': None,
+        'product': 'youtube',
+    }
+    if not os.path.exists(package_parameters['output_dir']):
+      os.makedirs(package_parameters['output_dir'])
+    packager.Package(**package_parameters)
+
+  def UninstallSubPackages(self):
+    # Check for sub-packages left over. Force uninstall any that exist.
+    uninstalled_packages = []
+    packages = self._network_api.GetInstalledPackages()
+    for package in packages:
+      try:
+        package_full_name = package['PackageFullName']
+        if package_full_name.find(_DEFAULT_PACKAGE_NAME) != -1:
+          if package_full_name not in uninstalled_packages:
+            self._LogLn('Existing YouTube app found on device. Uninstalling: ' +
+                        package_full_name)
+            uninstalled_packages.append(package_full_name)
+            self.WinAppDeployCmd('uninstall -package ' + package_full_name)
+      except KeyError:
+        # Some packages don't include all fields. Ignore those.
+        pass
+      except subprocess.CalledProcessError as err:
+        self._LogLn(err.output)
+
+  def Deploy(self):
+    # starboard_arguments.txt is packaged with the appx. It instructs the app
+    # to wait for the NetArgs thread to send command-line args via the socket.
+    self.InstallStarboardArgument(self._global_args)
+
+    self.PackageCobalt()
+    appx_package_file = TryGetPackagedBinary(self._package_root_dir)
+    if not appx_package_file:
+      raise IOError('Packaged appx not found in package directory. Perhaps '
+                    'package_cobalt script did not complete successfully.')
+
+    existing_package = self.CheckPackageIsDeployed()
+    if existing_package:
+      self._LogLn('Existing YouTube app found on device. Uninstalling.')
+      self.WinAppDeployCmd('uninstall -package ' + existing_package)
+
+    self._LogLn('Deleting temporary files')
+    self._network_api.ClearTempFiles()
+
+    try:
+      self._LogLn('Installing appx file ' + appx_package_file)
+      self.WinAppDeployCmd('install -file ' + appx_package_file)
+    except subprocess.CalledProcessError:
+      # Install exited with non-zero status code, clear everything out, restart,
+      # and attempt another install.
+      self._LogLn('Error installing appx. Attempting a clean install...')
+      self.UninstallSubPackages()
+      self.RestartDevkit()
+      self.WinAppDeployCmd('install -file ' + appx_package_file)
+
+    # Cleanup starboard arguments file.
+    self.InstallStarboardArgument(None)
+
+  # Validate that app was installed correctly by checking to make sure
+  # that the full package name can now be found.
+  def CheckPackageIsDeployed(self):
+    package_list = self.WinAppDeployCmd('list')
+    package_index = package_list.find(_DEFAULT_PACKAGE_NAME)
+    if package_index == -1:
+      return False
+    return package_list[package_index:].split('\n')[0].strip()
+
+  def Run(self):
+    # Only upload and install Appx on the first run.
+    if FirstRun():
+      if self._do_restart:
+        self.RestartDevkit()
+
+      if not self._network_api.IsInDevMode():
+        raise IOError('\n\n**** Please set the XBOX at ' + self._device_id +
+                      ' to dev mode!!!! ****\n')
+      self.SignIn()
+      if self._do_deploy:
+        self.Deploy()
+      else:
+        self._LogLn('Skipping deploy step.')
+
+      if not self.CheckPackageIsDeployed():
+        raise IOError('Could not resolve ' + _DEFAULT_PACKAGE_NAME + ' to\n' +
+                      'it\'s full package name after install! This means that' +
+                      '\n the package is not deployed correctly!\n\n')
+
+    if not self._do_run:
+      self._LogLn('Skipping running step.')
+      return 0
+
+    try:
+      self.Kill()  # Kill existing running app.
+
+      # These threads must start before the app executes or else it is possible
+      # the app will hang at _network_api.ExecuteBinary()
+      self.net_args_thread = net_args.NetArgsThread(self.device_id,
+                                                    _XB1_NET_ARG_PORT,
+                                                    self._target_args)
+      # While binary is running, extract the net log and stream it to
+      # the output.
+      self.net_log_thread = net_log.NetLogThread(self.device_id,
+                                                 _XB1_NET_LOG_PORT)
+
+      appx_name = ToAppxFriendlyName(self.target_name)
+
+      self._network_api.ExecuteBinary(_DEFAULT_PACKAGE_NAME, appx_name)
+
+      while self._network_api.IsBinaryRunning(self.target_name):
+        self._Log(self.net_log_thread.GetLog())
+
+      self._Log(self.net_log_thread.GetLog())
+      self._LogLn('Program Exited...')
+
+    except KeyboardInterrupt:
+      self._LogLn('User cancelled...')
+    except IOError as io_err:
+      _, _, exc_tb = sys.exc_info()
+      fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
+      msg = (f'Exception happened at {fname}({exc_tb.tb_lineno}) during '
+             f'to run cycle of {self.target_name} this '
+             'is common if no one is signed in to the xbox.\n'
+             f'  Error: {repr(io_err)}')
+      raise IOError(msg) from io_err
+    finally:
+      if hasattr(self, 'net_args_thread'):
+        self.net_args_thread.join()
+      if hasattr(self, 'net_log_thread'):
+        self.net_log_thread.join()
+
+    self.Kill()
+    self._LogLn('Finished running...')
+    crashed = self._DetectAndHandleAnyCrashes(self.target_name)
+    return crashed
+
+  def _DetectAndHandleAnyCrashes(self, target_name):
+    crashes_detected = False
+    (files,
+     _) = self._network_api.ListPackageFilesAndDirs(_DEFAULT_PACKAGE_NAME, 'AC')
+    for f in files:
+      if f.startswith(target_name) and f.endswith('dmp'):
+        self._LogLn('\n***** Application ' + target_name +
+                    ' crashed! *****\nDump file: ' + f)
+        crashes_detected = True
+        data = self._network_api.FetchPackageFile(
+            _DEFAULT_PACKAGE_NAME,
+            'AC/' + f,
+            raise_on_failure=True,
+            is_text=False)
+        # Ensure that directory exists.
+        dump_dir_path = os.path.join(os.environ['LOCALAPPDATA'], 'CrashDumps',
+                                     'xbox_remote')
+        if not os.path.exists(dump_dir_path):
+          os.makedirs(dump_dir_path)
+
+        dump_file_path = os.path.join(dump_dir_path, f)
+        # Clean previous dump file, if it exists.
+        if os.path.exists(dump_file_path):
+          try:
+            os.remove(dump_file_path)
+          except IOError as io_err:
+            self._LogLn('Error, could not remove old file ' + str(io_err))
+
+        try:
+          with open(dump_file_path, 'wb') as fp:
+            fp.write(data)
+          self._LogLn('Copied dump to ' + dump_file_path)
+          mini_dump_printer.PrintMiniDump(dump_file_path, self.output_file)
+        except Exception as err:  # pylint: disable=broad-except
+          self._LogLn('Failed to dump file ' + dump_file_path + ' because: ' +
+                      str(err))
+    return crashes_detected
+
+  def Kill(self):
+    self._Log('Killing Process (if running).\n')
+    running_processes = self._network_api.GetRunningProcesses()
+    exe_name = self.target_name + '.exe'
+    filtered_processes = list(
+        filter(lambda p: p['ImageName'] == exe_name, running_processes))
+    if len(filtered_processes) == 0:
+      return
+    process_under_test = filtered_processes[0]
+    if not process_under_test['IsRunning']:
+      return
+    pid = process_under_test['ProcessId']
+    self._Log('Going to kill pid ' + str(pid) + '\n')
+
+    self._network_api.KillProcess(pid)
+    self._Log('Kill signal sent. Waiting for the process to die.\n')
+    self._network_api.WaitForBinaryToFinishRunning(
+        self.target_name, _PROCESS_KILL_TIMEOUT_SECONDS)
+    self._Log('Done killing.\n')
+
+  def GetDeviceIp(self):
+    """Gets the device IP."""
+    return self.device_id
+
+  def GetDeviceOutputPath(self):
+    # TODO: Implement
+    return None
diff --git a/starboard/xb1/tools/xb1_network_api.py b/starboard/xb1/tools/xb1_network_api.py
new file mode 100644
index 0000000..093218e
--- /dev/null
+++ b/starboard/xb1/tools/xb1_network_api.py
@@ -0,0 +1,843 @@
+#!/usr/bin/python
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+""" This script provides an API for the Xbox REST API. """
+
+from __future__ import print_function
+
+import base64
+import os
+import pprint
+import sys
+import time
+import traceback
+
+from distutils.util import strtobool  # pylint: disable=deprecated-module
+import requests
+from requests.compat import urljoin
+# This helps the script run in an consistent way across multiple different
+# library versions(requests) and python runtime versions.
+try:
+  from requests.packages import urllib3
+except ImportError:
+  import urllib3
+try:
+  from urllib3.exceptions import InsecureRequestWarning
+  urllib3.disable_warnings(InsecureRequestWarning)
+except ImportError:
+  pass
+
+try:
+  input_fn = raw_input
+except NameError:
+  input_fn = input
+
+_DEFAULT_URL_FORMAT = 'https://{}:{}}/'
+
+_APPX_RELATIVE_PATH = 'appx'
+_DEVELOPMENT_FILES = 'DevelopmentFiles'
+_LOCAL_APP_DATA = 'LocalAppData'
+_LOCAL_CACHE_FOLDERNAME = r'\\LocalCache'
+_TEMP_FILE_FOLDERNAME = r'\\WdpTempWebFolder'
+_DEFAULT_STAGING_APP_NAME = 'appx'
+
+_APP_INSTALLATION_STATUS_ENDPOINT = '/api/app/packagemanager/state'
+_DELETE_APP_ENDPOINT = '/api/app/packagemanager/package'
+_DELETE_FILE_ENDPOINT = '/api/filesystem/apps/file'
+_DEVICE_INFO_ENDPOINT = '/ext/xbox/info'
+_EXT_USER_ENDPOINT = '/ext/user'
+_GET_FILE_ENDPOINT = '/api/filesystem/apps/file'
+_GET_FILES_ENDPOINT = '/api/filesystem/apps/files'
+_KILL_PROCESS_ENDPOINT = 'api/taskmanager/process'
+_LIST_ALL_APPS_ENDPOINT = '/api/app/packagemanager/packages'
+_MACHINENAME_ENDPOINT = '/api/os/machinename'
+_NETWORK_CREDS_ENDPOINT = '/ext/networkcredential'
+_REGISTER_ENDPOINT = 'api/app/packagemanager/register'
+_RESOURCE_MANAGER_PROCESSES_ENDPOINT = 'api/resourcemanager/processes'
+_SANDBOX_ENDPOINT = '/ext/xboxlive/sandbox'
+_SETTINGS_ENDPOINT = '/ext/settings'
+_OS_UPDATE_ENDPOINT = '/ext/settings/osupdatepolicy'
+_TASKMANAGER_ENDPOINT = '/api/taskmanager/app'
+_UPLOAD_FILE_ENDPOINT = '/api/filesystem/apps/file'
+_UPLOAD_FOLDER_ENDPOINT = '/api/app/packagemanager/upload'
+_DEPLOY_INFO_ENDPOINT = '/ext/app/deployinfo'
+_DEVELOPER_FOLDER_ENDPOINT = '/ext/smb/developerfolder'
+
+# This header is required for all non-GET requests for windows
+# dev portal.  It must be populated with the value of a specific cookie.
+_CSRF_TOKEN_HEADER = 'X-CSRF-Token'
+
+_INSTALL_FINISH_TIMEOUT_SECONDS = 90.0
+_PROCESS_RUN_TIMEOUT_SECONDS = 300.0
+_PROCESS_KILL_TIMEOUT_SECONDS = 20.0
+
+# Wait time to use when polling the same API repeatedly.
+_API_RETRY_SECONDS = 2.0
+
+
+# Returns a dictionary of "directory_name" -> [file_paths,...]
+def GetFilesRecursively(path):
+  path = os.path.abspath(path)
+
+  all_file_paths = []
+  for root, _, filenames in os.walk(path):
+    for filename in filenames:
+      all_file_paths.append(os.path.join(root, filename))
+
+  out = {}
+  for file_path in all_file_paths:
+    if os.path.isdir(file_path):
+      continue
+    dir_name = os.path.dirname(file_path)
+    if dir_name not in out:
+      out[dir_name] = []
+    out[dir_name].append(file_path)
+
+  return out
+
+
+def _PrintAndRaiseIfError(response):
+  """If http response is not OK (200), then print information and raise error
+
+  If the response is not http "OK", then an exception is raised by
+  |raise_for_status|, and this function will print additional information
+  such as the request url, the response headers, and the response content.
+  After that the exception is re-raised so that it can be handled at a higher
+  level.  This function is mainly useful for debugging failed requests.
+
+  Args:
+    response: Server's response to our http request.
+
+  Raises:
+    requests.exceptions.HTTPError
+  Returns:
+    None
+  """
+  try:
+    #The following line only raises on a response that is not status OK(200).
+    response.raise_for_status()
+  except Exception as e:
+    print('URL:', response.url)
+    print('status_code: ' + str(response.status_code))
+    print('Headers:')
+    pprint.pprint(dict(response.headers))
+    print('Response:')
+    try:
+      pprint.pprint(response.json())
+    except Exception:  #pylint: disable=broad-except
+      print(response.text)
+    raise e
+
+
+class MissingDependencyError(Exception):
+  pass
+
+
+# Xb1NetworkApi allows an interface for communicating with a remote xbox
+# device.
+class Xb1NetworkApi:
+  """ This header is required for all non-GET requests for windows
+  dev portal.  It must be populated with the value of a specific cookie."""
+  _CSRF_TOKEN_HEADER = 'X-CSRF-Token'
+
+  def __init__(self, device_id, port):
+    #? self.out_directory = os.path.split(self.GetTargetPath())[0]
+    self.web_portal_url = f'https://{device_id}:{port}/'
+    self._logfile_name = None
+    self._csrf_token = None
+    self._cookie_jar = None
+    self.logging_function = None
+    self.cached_package_name_map = {}
+    self._AuthenticateOnce()
+
+  def SetLoggingFunction(self, logging_function):
+    self.logging_function = logging_function
+
+  def Log(self, s):
+    if self.logging_function:
+      self.logging_function(s)
+    else:
+      print(s, end='')
+
+  def LogLn(self, s):
+    self.Log(s + '\n')
+
+  def ComputerName(self):
+    return self._DoJsonRequest('GET', _MACHINENAME_ENDPOINT)['ComputerName']
+
+  def GetInstalledPackages(self):
+    installed_apps_response = self._DoJsonRequest('GET',
+                                                  _LIST_ALL_APPS_ENDPOINT)
+    return installed_apps_response['InstalledPackages']
+
+  # Returns all running processes in the app.
+  def GetRunningProcesses(self):
+    response_decoded = self._DoJsonRequest(
+        'GET', _RESOURCE_MANAGER_PROCESSES_ENDPOINT)
+    if 'Processes' in response_decoded:
+      return response_decoded['Processes']
+    return {}
+
+  def GetSettings(self):
+    val = self._DoJsonRequest('GET', _SETTINGS_ENDPOINT)
+    return val.get('Settings', [])
+
+  def IsPendingOSUpdate(self):
+    """Detects whether there is a pending OS update."""
+    try:
+      self._DoRequest('GET', _OS_UPDATE_ENDPOINT)
+      # Value returned is: <Response [200]>
+      # So no pending update.
+      return False
+    except ValueError:
+      # If there is a pending OS update then the following exception is
+      # generated:
+      # URL: https://172.31.165.44:11443/ext/settings/osupdatepolicy
+      # status_code: 500
+      # Headers:
+      # {'Content-Length': '0',
+      #  'Content-Type': 'text/plain',
+      #  'Date': 'Thu, 09 May 2019 18:10:59 GMT',
+      #  'Server': 'Microsoft-HTTPAPI/2.0',
+      #  'Set-Cookie': 'CSRF-Token=YNsSUe/7hKTHsW/o/goM1opGEnYb6gi/'}
+      # In this case there is a response code with error 500.
+      return True
+    except Exception as err:  #pylint: disable=broad-except
+      traceback.print_exc()
+      print(f'Unexpected {err}')
+      return True
+
+  def GetSetting(self, name):
+    settings = self.GetSettings()
+    for setting in settings:
+      if setting.get('Name', '') == name:
+        return setting
+    return {}
+
+  def IsInDevMode(self):
+    setting = self.GetSetting('DefaultApp')
+    return setting.get('Value', '') == 'Dev Home'
+
+  def GetDeviceInfo(self):
+    return self._DoJsonRequest('GET', _DEVICE_INFO_ENDPOINT)
+
+  def GetLiveSandboxInfo(self):
+    return self._DoRequest('GET', _SANDBOX_ENDPOINT).text
+
+  def GetNetworkCredentials(self):
+    val = self._DoJsonRequest('GET', _NETWORK_CREDS_ENDPOINT)
+    if val.get('Credentials'):
+      return (val['Username'], val['Password'], val['Path'])
+    return ()
+
+  def AddNetworkCredentials(self, username, password, path):
+    p = {'Username': username, 'Password': password, 'NetworkPath': path}
+    return self._DoJsonRequest('POST', _NETWORK_CREDS_ENDPOINT, params=p)
+
+  def GetSandbox(self):
+    return self._DoRequest('GET', '/ext/xboxlive/sandbox')
+
+  def GetXboxLiveUserInfos(self):
+    return self._DoJsonRequest('GET', _EXT_USER_ENDPOINT)
+
+  def GetUserId(self, email_address):
+    email_address = email_address.lower()
+    users = self.GetXboxLiveUserInfos().get('Users', [])
+
+    if not users:
+      self.LogLn('Error - no users logged in')
+      return
+
+    for user in users:
+      if user.get('EmailAddress', '').lower() == email_address:
+        return user.get('UserId', None)
+
+  def Restart(self):
+    return self._DoRequest('POST', '/api/control/restart')
+
+  def SetXboxLiveSignedInUserState(self, user_email, is_signed_in):
+    user_id = self.GetUserId(user_email)
+    if not user_id:
+      self.LogLn('Could not find any users registered on this device')
+      return
+
+    creds = {
+        'Users': [{
+            'UserId': int(user_id),
+            'SignedIn': bool(strtobool(str(is_signed_in))),
+        },]
+    }
+    rtn = self._DoRequest('PUT', _EXT_USER_ENDPOINT, json=creds)
+    return rtn
+
+  def GetXboxLiveUserIsLoggedIn(self, user_email):
+    user_email = user_email.lower()
+    infos = self.GetXboxLiveUserInfos().get('Users', [])
+
+    for info in infos:
+      if info.get('EmailAddress', '').lower() == user_email:
+        return info.get('SignedIn', False)
+    return False
+
+  def GetDeveloperFolderCredentials(self):
+    d = self._DoJsonRequest('GET', _DEVELOPER_FOLDER_ENDPOINT)
+    return (d['Username'], d['Password'], d['Path'])
+
+  def GetDeploymentInfo(self, partial_package_name):
+    full_package_name = self.ResolvePackageFullName(partial_package_name)
+
+    if not full_package_name:
+      self.LogLn('Could not get deployment info for ' + partial_package_name)
+      full_package_name = partial_package_name
+      return None
+
+    body = {
+        'DeployInfo': [{
+            'PackageFullName': full_package_name
+        },],
+    }
+
+    val = self._DoJsonRequest('POST', _DEPLOY_INFO_ENDPOINT, json=body)
+    return val
+
+  def IsBinaryRunning(self, target_name):
+    response_decoded = self._DoJsonRequest(
+        'GET', _RESOURCE_MANAGER_PROCESSES_ENDPOINT)
+    running_processes = response_decoded['Processes']
+    exe_name = target_name + '.exe'
+    filtered_processes = \
+        list(filter(lambda p: p['ImageName'] == exe_name, running_processes))
+    if len(filtered_processes) == 0:
+      return False
+    process_under_test = filtered_processes[0]
+    return process_under_test.get('IsRunning', False)
+
+  def KillProcess(self, pid):
+    self._DoJsonRequest('DELETE', _KILL_PROCESS_ENDPOINT, params={'pid': pid})
+
+  def WaitForBinaryToFinishRunning(self, target_name, timeout_seconds):
+    """Waits up to |timeout_seconds| for |self.target_name| to finish running.
+
+    Args:
+      timeout_seconds: Timeout in seconds.
+    """
+    assert isinstance(timeout_seconds, float)
+    current_time = time.time()
+    max_time = current_time + timeout_seconds
+    while current_time <= max_time:
+      if not self.IsBinaryRunning(target_name):
+        return
+      time.sleep(_API_RETRY_SECONDS)
+    if self.IsBinaryRunning(target_name):
+      raise RuntimeError('Waiting for process to end timed out.')
+
+  def FetchFileContent(self, filename_to_grab):
+    """Fetch a file from device and returns the content
+
+    This function fetches a file named |filename_to_grab|,
+    within the |_LOCAL_APP_DATA| folder.
+
+    Args:
+      filename_to_grab: name of the file to fetch.
+    """
+    self.LogLn('Fetching log..')
+    package_full_name = self._GetPackageFullName()
+    if not package_full_name:
+      return
+
+    fetch_log_request = requests.get(  # pylint: disable=missing-timeout
+        urljoin(self.web_portal_url, self._GET_FILE_ENDPOINT),
+        verify=False,
+        params={
+            'knownfolderid': self._LOCAL_APP_DATA,
+            'packagefullname': package_full_name,
+            'filename': filename_to_grab,
+            'path': self._LOCAL_CACHE_FOLDERNAME
+        })
+    _PrintAndRaiseIfError(fetch_log_request)
+    return fetch_log_request.text
+
+  # Fetch a file given the package and file path.
+  def FetchPackageFile(self,
+                       package_name,
+                       path_to_file,
+                       raise_on_failure=True,
+                       is_text=True):
+    """Fetch a file from device and returns the content
+
+    Note that files associated with a running process will
+    fail to be fetched.
+
+    Args:
+      path_to_file: name of the file to fetch.
+      raise_on_failure: when True, failure to fetch the file will result in an
+        raised exception.
+    """
+    filename = os.path.basename(path_to_file)
+    path = os.path.dirname(path_to_file)
+    package_full_name = self.ResolvePackageFullName(package_name)
+
+    if path:
+      path = '\\\\' + path
+    filename = '' + filename
+
+    url = urljoin(self.web_portal_url, _GET_FILE_ENDPOINT)
+
+    f = requests.get(  # pylint: disable=missing-timeout
+        url,
+        verify=False,
+        params={
+            'knownfolderid': _LOCAL_APP_DATA,
+            'packagefullname': package_full_name,
+            'filename': filename,
+            'path': path
+        })
+
+    if raise_on_failure:
+      _PrintAndRaiseIfError(f)
+      if is_text:
+        return f.text
+      else:
+        return f.content
+    else:
+      try:
+        if is_text:
+          return f.text
+        else:
+          return f.content
+      except Exception:  #pylint: disable=broad-except
+        return None
+    return None
+
+  def ExecuteBinary(self, partial_package_name, app_alias_name):
+    default_relative_name = self._GetDefaultRelativeId(partial_package_name)
+    if not default_relative_name or not '!' in default_relative_name:
+      raise IOError('Could not resolve package name "' + partial_package_name +
+                    '"')
+
+    relative_package_name = default_relative_name.split('!')[0]
+    package_relative_id = relative_package_name + '!' + app_alias_name
+    appid_64 = base64.b64encode(package_relative_id.encode('UTF-8'))
+    package_64 = base64.b64encode(default_relative_name.encode('UTF-8'))
+
+    retry_count = 4
+    # Time to wait between tries.
+    retry_wait_s = 8
+    try:
+      while retry_count > 0:
+        self.LogLn('Executing: ' + package_relative_id)
+        response = self._DoJsonRequest(
+            'POST',
+            _TASKMANAGER_ENDPOINT,
+            params={
+                'appid': appid_64,
+                'package': package_64
+            },
+            raise_on_failure=False)
+        if not response or response == requests.codes.OK:
+          self.LogLn('Execution successful')
+          break
+        self.LogLn('Execution not successful: ' + str(response))
+        self.LogLn('Retrying with ' + str(retry_count) + ' attempts remaining.')
+        time.sleep(retry_wait_s)
+        retry_count -= 1
+        # Double the wait time until the next attempt.
+        retry_wait_s *= 2
+    except Exception as err:
+      err_msg = '\n  Failed to run:\n  ' + package_relative_id + \
+                '\n  because of:\n' + str(err)
+      raise IOError(err_msg) from err
+
+  # Given a package name, return all files + directories.
+  # Throws IOError if the app is locked.
+  def ListFilesAndDirs(self, package_name, knownfolderid, sub_path):
+    args = {}
+    if sub_path:
+      args['path'] = '\\\\' + sub_path
+    if package_name:
+      args['packagefullname'] = self.ResolvePackageFullName(package_name)
+      # Per api, knownfolder id must 'LocalAppData' whenever package
+      # name is used.
+      assert knownfolderid == 'LocalAppData'
+    # 'knownfolderid' is required
+    args['knownfolderid'] = '' + knownfolderid
+
+    response = self._DoRequest(
+        'GET',
+        '/api/filesystem/apps/files',
+        params=args,
+        raise_on_failure=False)
+
+    if response.status_code == 403:
+      raise IOError('Could not list files for ' + package_name +
+                    ': permission denied.\n' + str(response))
+
+    response_json = response.json()
+
+    sub_files = []
+    sub_dirs = []
+    if 'Items' in response_json:
+      for item in response_json['Items']:
+        name = item['Name']
+        sub_path = item['SubPath']
+        if sub_path.endswith(name):
+          sub_dirs.append(name)
+        else:
+          sub_files.append(name)
+    return sub_files, sub_dirs
+
+  def ListPackageFilesAndDirs(self, package_name, sub_path=None):
+    return self.ListFilesAndDirs(package_name, 'LocalAppData', sub_path)
+
+  # Returns files, dirs
+  def ListPackageFilesAndDirsRecursive(self,
+                                       package_name,
+                                       list_empty_dirs=True):
+    package_name = self.ResolvePackageFullName(package_name)
+
+    def RecursiveStep(curr_dir_stack, found_files, found_dirs):
+      curr_dir = '/'.join(curr_dir_stack)
+      files, dirs = self.ListPackageFilesAndDirs(
+          package_name, sub_path=curr_dir)
+
+      add_curr_dir = curr_dir and (files or list_empty_dirs)
+      if add_curr_dir:
+        found_dirs.append(curr_dir)
+
+      for f in files:
+        tmp_path = curr_dir_stack[:]
+        tmp_path.append(f)
+        tmp_path = '/'.join(tmp_path)
+        found_files.append(tmp_path)
+      for d in dirs:
+        next_dir_stack = curr_dir_stack[:]  # Copy by value.
+        next_dir_stack.append(d)
+        RecursiveStep(next_dir_stack, found_files, found_dirs)
+
+    curr_dir_stack = []
+    found_files = []
+    found_dirs = []
+
+    RecursiveStep(curr_dir_stack, found_files, found_dirs)
+    return found_files, found_dirs
+
+  def DeleteFile(self, known_folder_id, path, filename_to_delete):
+    """Deletes a file named |file|.
+
+    This function deletes a file.
+
+    Args:
+      known_folder_id: name of the top level known folder
+      path: path to the directory containing filename_to_delete
+      filename_to_delete: name of the file to delete
+    """
+    self.LogLn(f'Deleting [{filename_to_delete}]')
+    file_listing = self._DoJsonRequest(
+        'GET',
+        _GET_FILES_ENDPOINT,
+        params={
+            'knownfolderid': known_folder_id,
+            'path': path
+        })
+    for item in file_listing['Items']:
+      if item['Name'] == filename_to_delete:
+        break
+    else:
+      self.LogLn(filename_to_delete + ' was not found.  Skipping delete step.')
+      return
+
+    self.LogLn('File found. Deleting.')
+    self._DoJsonRequest(
+        'DELETE',
+        _DELETE_FILE_ENDPOINT,
+        params={
+            'knownfolderid': known_folder_id,
+            'filename': filename_to_delete,
+            'path': path
+        })
+
+  def ClearTempFiles(self):
+    file_listing = self._DoJsonRequest(
+        'GET',
+        _GET_FILES_ENDPOINT,
+        params={
+            'knownfolderid': _DEVELOPMENT_FILES,
+            'path': _TEMP_FILE_FOLDERNAME
+        })
+    for file in file_listing['Items']:
+      self.DeleteFile(_DEVELOPMENT_FILES, _TEMP_FILE_FOLDERNAME, file['Name'])
+
+  def FindPackage(self, package_name):
+    all_packages = self.GetInstalledPackages()
+
+    for package in all_packages:
+      if package_name in package['PackageRelativeId']:
+        return package
+
+    for package in all_packages:
+      if package_name in package['PackageFullName']:
+        return package
+
+    for package in all_packages:
+      if package_name in package['PackageFamilyName']:
+        return package
+    return None
+
+  def ResolvePackageFullName(self, package_name):
+    if package_name not in self.cached_package_name_map:
+      package = self.FindPackage(package_name)
+      full_package_name = None
+      if package:
+        full_package_name = package['PackageFullName']
+      self.cached_package_name_map[package_name] = full_package_name
+    return self.cached_package_name_map[package_name]
+
+  def _GetDefaultRelativeId(self, partial_package_name):
+    package = self.FindPackage(partial_package_name)
+    if package is None:
+      return None
+    return package.get('PackageRelativeId', None)
+
+  def _DoRequest(self, method, endpoint, **kwargs):
+    url_to_request = urljoin(self.web_portal_url, endpoint)
+    headers = {}
+    raise_on_failure = True
+
+    if 'headers' in kwargs:
+      headers = kwargs['headers']
+      del kwargs['headers']
+
+    if 'raise_on_failure' in kwargs:
+      raise_on_failure = kwargs['raise_on_failure']
+      del kwargs['raise_on_failure']
+
+    cookie_jar = None
+    if method != 'GET':
+      cookie_jar = self._cookie_jar
+      if not self._csrf_token:
+        raise RuntimeError('CSRF token is required for all non-GET requests.')
+      headers.update({_CSRF_TOKEN_HEADER: self._csrf_token})
+
+    request_info = requests.request(
+        method,
+        url_to_request,
+        verify=False,
+        timeout=(60, 60),
+        cookies=cookie_jar,
+        headers=headers,
+        **kwargs)
+    if raise_on_failure:
+      _PrintAndRaiseIfError(request_info)
+
+    if request_info.cookies:
+      self._cookie_jar = request_info.cookies
+      self._csrf_token = self._cookie_jar['CSRF-Token']
+    return request_info
+
+  def _DoJsonRequest(self, method, endpoint, **kwargs):
+    response = self._DoRequest(method, endpoint, **kwargs)
+    if response is None:
+      return {}
+    try:
+      return response.json()
+    except ValueError:
+      return {}
+
+  def _AuthenticateOnce(self):
+    if self._csrf_token:
+      return
+    # Cookies / Authentication is a side effect of calling _DoRequest()
+    self._DoRequest('GET', _MACHINENAME_ENDPOINT)
+    if not self._csrf_token:
+      raise RuntimeError('Authentication failed.')
+
+
+############################################
+# A little tester to test + inspect packages
+def InteractiveCommandLineMode():
+
+  # Local functions used in this test.
+  def PrintCurrentlyRunningProcesses(network_api):
+    running_processes = network_api.GetRunningProcesses()
+    print('Found ' + str(len(running_processes)) + ' processes:')
+
+    columns = ['ImageName', 'UserName', 'PageFileUsage', 'ProcessId']
+    size_dict = {}
+
+    for p in running_processes:
+      for key in columns:
+        val = p[key]
+        prev_val_size = size_dict.get(key, 0)
+        val_size = len(str(val))
+        if prev_val_size <= val_size:
+          size_dict[key] = val_size
+
+    header = ''
+    for key in columns:
+      n_size = max(len(key), size_dict.get(key, 0)) + 2
+      size_dict[key] = n_size
+      header += key.upper().rjust(n_size)
+    print(header)
+    for _ in range(0, len(header)):
+      print('-', end='')
+    print()
+    for p in running_processes:
+      msg = ''
+      for key in columns:
+        val = p[key]
+        msg += str(val).rjust(size_dict[key])
+      print(msg)
+
+  def PrintInstalledPackage(network_api):
+    packages = network_api.GetInstalledPackages()
+    print('Apps currently installed:')
+    for p in packages:
+      print('  ' + p['PackageFamilyName'])
+
+  def FindThenPrintPackage(network_api):
+    package_name = input_fn('Package name to inspect: ')
+    package = network_api.FindPackage(package_name)
+    if package is None:
+      print('Could not find package ' + package_name)
+    else:
+      pprint.pprint(package)
+
+  def ListFilesAndDirsInPackage(network_api):
+    package_name = input_fn('Package name: ')
+    package = network_api.FindPackage(package_name)
+    if package is None:
+      print('Could not find package ' + package_name)
+    else:
+      try:
+        files, dirs = network_api.ListPackageFilesAndDirs(package_name)
+        print(f'Files in {package_name}:\n')
+        pprint.pprint({'files': files, 'dirs': dirs})
+      except IOError as ioe:
+        print(ioe)
+
+  def PromptAndRunExecutable(network_api):
+    package_name = input_fn('Package name: ')
+    app_name = input_fn('App name: ')
+    try:
+      print('Attempting to run: ' + app_name + ' in ' + package_name)
+      network_api.ExecuteBinary(package_name, app_name)
+    except Exception as e:  #pylint: disable=broad-except
+      print('Could not run binary because: ' + str(e))
+
+  def PromptAndSignInUserToXboxLive(network_api):
+    network_api.GetXboxLiveUserInfos()
+    email_addr = input_fn('User EmailAddress: ')
+    signed_in_state = input_fn('SignInState: ')
+    network_api.SetXboxLiveSignedInUserState(email_addr, signed_in_state)
+
+  def PromptPackageAndListFilesAndDirsRecursively(network_api):
+    package_name = input_fn('Package name: ')
+    files, dirs = network_api.ListPackageFilesAndDirsRecursive(package_name)
+    if files:
+      print('Files:')
+      for f in files:
+        print('  ' + f)
+    if dirs:
+      print('Directories:')
+      for d in dirs:
+        print('  ' + d)
+
+  # Begin Test.
+  ip = input_fn('IP Address of XBOX: ')
+  if len(ip.split('.')) != 4:
+    print('Expected ip to have a 4 numbers')
+    return
+
+  port = input_fn('port(default is 11443): ')
+  if len(port) == 0:
+    port = '11443'
+
+  network_api = Xb1NetworkApi(ip, port)
+
+  while True:
+    print('What would you like to do?')
+    print('  [0] See all currently running processes.')
+    print('  [1] Run executable.')
+    print('  [2] Find all installed packages.')
+    print('  [3] Inspect a package by name.')
+    print('  [4] List root directories and files in a package.')
+    print('  [5] Recursive list all files in package.')
+    print('  [6] Print System Settings.')
+    print('  [7] Print Device Info.')
+    print('  [8] Print Xbox Live Sandbox Mode.')
+    print('  [9] Print Network Credentials.')
+    print('  [10] XboxLive: Print signed in users.')
+    print('  [11] XboxLive: Sign in user.')
+    print('  [12] Print Network Credentials.')
+    print('  [13] Update Network Credentials.')
+    print('  [14] Print Deployment Info.')
+    print('  [15] Print whether OS Update is pending.')
+    print('  [q] Quit.')
+    val = input_fn('> ')
+
+    if val in ('', 'q'):
+      print('quitting.')
+      sys.exit(0)
+    elif '0' == val:
+      PrintCurrentlyRunningProcesses(network_api)
+    elif '1' == val:
+      PromptAndRunExecutable(network_api)
+    elif '2' == val:
+      PrintInstalledPackage(network_api)
+    elif '3' == val:
+      FindThenPrintPackage(network_api)
+    elif '4' == val:
+      ListFilesAndDirsInPackage(network_api)
+    elif '5' == val:
+      PromptPackageAndListFilesAndDirsRecursively(network_api)
+    elif '6' == val:
+      pprint.pprint(network_api.GetSettings())
+    elif '7' == val:
+      pprint.pprint(network_api.GetDeviceInfo())
+    elif '8' == val:
+      pprint.pprint(network_api.GetLiveSandboxInfo())
+    elif '9' == val:
+      pprint.pprint(network_api.GetNetworkCredentials())
+    elif '10' == val:
+      pprint.pprint(network_api.GetXboxLiveUserInfos())
+    elif '11' == val:
+      PromptAndSignInUserToXboxLive(network_api)
+    elif '12' == val:
+      pprint.pprint(network_api.GetNetworkCredentials())
+    elif '13' == val:
+      user_name = input_fn('username: ')
+      password = input_fn('password: ')
+      path = input_fn(
+          'path (blank = "D:\\DevelopmentFiles\\LooseApps\\appx"?): ')
+      if not path:
+        path = 'D:\\DevelopmentFiles\\LooseApps\\appx'
+      pprint.pprint(
+          network_api.AddNetworkCredentials(user_name, password, path))
+    elif '14' == val:
+      package_name = input_fn('Package Name: ')
+      pprint.pprint(network_api.GetDeploymentInfo(package_name))
+    elif '15' == val:
+      val = network_api.IsPendingOSUpdate()
+      if val:
+        print('----> OS has a pending update.\n')
+      else:
+        print('----> OS does NOT have a pending update.\n')
+    else:
+      print('Unexpected answer: ' + val)
+    input_fn('press the return key to continue....')
+
+
+if __name__ == '__main__':
+  InteractiveCommandLineMode()
diff --git a/starboard_configuration.py b/starboard_configuration.py
index cff7294..513eb97 100644
--- a/starboard_configuration.py
+++ b/starboard_configuration.py
@@ -16,12 +16,8 @@
 # List of paths to directories in which Starboard ports are located. Each path
 # should be represented as a list of directory names whose locations are
 # relative to the location of this file.
-PORT_ROOTS = [
-    ["starboard"],
-    ["starboard", "contrib"],
-    ["starboard", "port"],
-    ["third_party", "starboard"]
-]
+PORT_ROOTS = [["starboard"], ["starboard", "contrib"], ["starboard", "port"],
+              ["third_party", "starboard"]]
 
 # A Mapping of application names to cross-platform ApplicationConfiguration
 # subclasses (or factory functions).
diff --git a/testing/android/AndroidManifest.xml b/testing/android/AndroidManifest.xml
index f8c03ea..283ebb9 100644
--- a/testing/android/AndroidManifest.xml
+++ b/testing/android/AndroidManifest.xml
@@ -10,7 +10,7 @@
       android:versionCode="1"
       android:versionName="1.0">
 
-    <uses-sdk android:minSdkVersion="L" android:targetSdkVersion="L" />
+    <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="33" />
 
     <application android:label="ChromeNativeTests">
         <activity android:name=".ChromeNativeTestActivity"
diff --git a/testing/android/native_test_launcher.cc b/testing/android/native_test_launcher.cc
index 4218398..e0d4c41 100644
--- a/testing/android/native_test_launcher.cc
+++ b/testing/android/native_test_launcher.cc
@@ -176,10 +176,9 @@
                      jobject obj,
                      jstring jfiles_dir,
                      jobject app_context) {
-#if !defined(__LB_ANDROID__)
   // Our MainHook creates this.
   base::AtExitManager exit_manager;
-#endif
+
   // Command line initialized basically, will be fully initialized later.
   static const char* const kInitialArgv[] = { "ChromeTestActivity" };
   CommandLine::Init(arraysize(kInitialArgv), kInitialArgv);
diff --git a/testing/gmock/codereview.settings b/testing/gmock/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/testing/gmock/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/testing/gtest/codereview.settings b/testing/gtest/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/testing/gtest/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/QR-Code-generator/codereview.settings b/third_party/QR-Code-generator/codereview.settings
deleted file mode 100644
index d7c8d39..0000000
--- a/third_party/QR-Code-generator/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: chromium-review.googlesource.com
-GERRIT_PORT: 29418
-CODE_REVIEW_SERVER: chromium-review.googlesource.com
diff --git a/third_party/angle/BUILD.gn b/third_party/angle/BUILD.gn
index 089cc85..0b2272a 100644
--- a/third_party/angle/BUILD.gn
+++ b/third_party/angle/BUILD.gn
@@ -104,11 +104,11 @@
   defines = []
 
   if (!is_starboard) {
-    if (angle_64bit_current_cpu) {
-      defines += [ "ANGLE_IS_64_BIT_CPU" ]
-    } else {
-      defines += [ "ANGLE_IS_32_BIT_CPU" ]
-    }
+  if (angle_64bit_current_cpu) {
+    defines += [ "ANGLE_IS_64_BIT_CPU" ]
+  } else {
+    defines += [ "ANGLE_IS_32_BIT_CPU" ]
+  }
   }
 
   if (angle_enable_trace) {
@@ -282,7 +282,6 @@
 if (is_starboard) {
   config("starboard_angle_config") {
     if (is_win) {
-      configs = [ "//build/config/win:visual_studio_version_compat" ]
       cflags = [
         "/wd4200",
       ]
@@ -1174,108 +1173,108 @@
       ]
     }
   } else {
-    target(library_type, library_name) {
-      sources = util_sources
-      deps = [
-        ":angle_common",
-        ":angle_util_loader_headers",
+  target(library_type, library_name) {
+    sources = util_sources
+    deps = [
+      ":angle_common",
+      ":angle_util_loader_headers",
+    ]
+    public_deps = []
+    libs = []
+
+    if (is_win && !angle_is_winuwp) {
+      sources += util_win_sources
+      deps += [ ":angle_stack_walker" ]
+    }
+
+    if (is_linux) {
+      sources += util_linux_sources
+      libs += [
+        "rt",
+        "dl",
       ]
-      public_deps = []
-      libs = []
+    }
+
+    if (is_mac) {
+      sources += util_osx_sources
+      libs += [
+        "AppKit.framework",
+        "QuartzCore.framework",
+      ]
+    }
+
+    if (angle_use_x11) {
+      sources += util_x11_sources
+    }
+
+    if (is_android) {
+      sources += util_android_sources
+      libs += [
+        "android",
+        "log",
+      ]
+    }
+
+    configs += [ ":debug_annotations_config" ]
+
+    public_configs += [ ":angle_util_config" ]
+
+    if (is_fuchsia) {
+      sources += util_fuchsia_sources
+      public_deps += [
+        "src/common/fuchsia_egl",
+        "//third_party/fuchsia-sdk/sdk:async_loop_cpp",
+        "//third_party/fuchsia-sdk/sdk:async_loop_default",
+        "//third_party/fuchsia-sdk/sdk:fdio",
+        "//third_party/fuchsia-sdk/sdk:images",
+        "//third_party/fuchsia-sdk/sdk:scenic_cpp",
+        "//third_party/fuchsia-sdk/sdk:ui_policy",
+        "//third_party/fuchsia-sdk/sdk:ui_scenic",
+        "//third_party/fuchsia-sdk/sdk:ui_views",
+      ]
+    } else if (use_ozone) {
+      sources += util_ozone_sources
+    }
+
+    if (is_shared_library) {
+      defines = [ "LIBANGLE_UTIL_IMPLEMENTATION" ]
 
       if (is_win && !angle_is_winuwp) {
-        sources += util_win_sources
-        deps += [ ":angle_stack_walker" ]
+        sources += util_win_shared_sources
       }
 
-      if (is_linux) {
-        sources += util_linux_sources
-        libs += [
-          "rt",
-          "dl",
+      public_deps += [ ":angle_util_loader" ]
+
+      if (is_mac && !is_component_build) {
+        ldflags = [
+          "-install_name",
+          "@rpath/libangle_util.dylib",
         ]
       }
-
-      if (is_mac) {
-        sources += util_osx_sources
-        libs += [
-          "AppKit.framework",
-          "QuartzCore.framework",
-        ]
-      }
-
-      if (angle_use_x11) {
-        sources += util_x11_sources
-      }
-
-      if (is_android) {
-        sources += util_android_sources
-        libs += [
-          "android",
-          "log",
-        ]
-      }
-
-      configs += [ ":debug_annotations_config" ]
-
-      public_configs += [ ":angle_util_config" ]
-
-      if (is_fuchsia) {
-        sources += util_fuchsia_sources
-        public_deps += [
-          "src/common/fuchsia_egl",
-          "//third_party/fuchsia-sdk/sdk:async_loop_cpp",
-          "//third_party/fuchsia-sdk/sdk:async_loop_default",
-          "//third_party/fuchsia-sdk/sdk:fdio",
-          "//third_party/fuchsia-sdk/sdk:images",
-          "//third_party/fuchsia-sdk/sdk:scenic_cpp",
-          "//third_party/fuchsia-sdk/sdk:ui_policy",
-          "//third_party/fuchsia-sdk/sdk:ui_scenic",
-          "//third_party/fuchsia-sdk/sdk:ui_views",
-        ]
-      } else if (use_ozone) {
-        sources += util_ozone_sources
-      }
-
-      if (is_shared_library) {
-        defines = [ "LIBANGLE_UTIL_IMPLEMENTATION" ]
-
-        if (is_win && !angle_is_winuwp) {
-          sources += util_win_shared_sources
-        }
-
-        public_deps += [ ":angle_util_loader" ]
-
-        if (is_mac && !is_component_build) {
-          ldflags = [
-            "-install_name",
-            "@rpath/libangle_util.dylib",
-          ]
-        }
-      } else {
-        public_configs += [
-          ":angle_static",
-          ":gl_prototypes",
-        ]
-      }
+    } else {
+      public_configs += [
+        ":angle_static",
+        ":gl_prototypes",
+      ]
     }
   }
+  }
 }
 
 if (!is_starboard) {
-  # Convenience targets for some of the samples so they can be built
-  # with Chromium's toolchain.
-  angle_executable("angle_shader_translator") {
-    testonly = true
+# Convenience targets for some of the samples so they can be built
+# with Chromium's toolchain.
+angle_executable("angle_shader_translator") {
+  testonly = true
 
-    sources = [
-      "samples/shader_translator/shader_translator.cpp",
-    ]
+  sources = [
+    "samples/shader_translator/shader_translator.cpp",
+  ]
 
-    deps = [
-      ":translator",
-    ]
-  }
+  deps = [
+    ":translator",
+  ]
+}
 }
 
 if (angle_has_build && !is_starboard) {
diff --git a/third_party/angle/METADATA b/third_party/angle/METADATA
index d20e493..97086c4 100644
--- a/third_party/angle/METADATA
+++ b/third_party/angle/METADATA
@@ -7,11 +7,12 @@
     type: GIT
     value: "https://chromium.googlesource.com/angle/angle"
   }
-  version: "c1776c61e5c3722cb2de95aac1119289ff822469"
+  version: "362168eb695d0ac0a2bee85dd356232c9c20d0ef"
+  # from https://chromium.googlesource.com/chromium/src/+/80.0.3987.165/DEPS#188
   last_upgrade_date {
-    year: 2019
-    month: 11
-    day: 20
+    year: 2020
+    month: 2
+    day: 18
   }
   license_type: NOTICE
 }
diff --git a/third_party/angle/src/common/utilities.cpp b/third_party/angle/src/common/utilities.cpp
index 95f75fe..2345148 100644
--- a/third_party/angle/src/common/utilities.cpp
+++ b/third_party/angle/src/common/utilities.cpp
@@ -12,7 +12,6 @@
 #include "common/mathutil.h"
 #include "common/platform.h"
 
-#include <cstdlib>
 #include <set>
 
 #if defined(ANGLE_ENABLE_WINDOWS_UWP)
diff --git a/third_party/angle/src/compiler/translator/FunctionLookup.cpp b/third_party/angle/src/compiler/translator/FunctionLookup.cpp
index 9f4743a..8b574e9 100644
--- a/third_party/angle/src/compiler/translator/FunctionLookup.cpp
+++ b/third_party/angle/src/compiler/translator/FunctionLookup.cpp
@@ -8,7 +8,6 @@
 //
 
 #include "compiler/translator/FunctionLookup.h"
-
 #include "compiler/translator/ImmutableStringBuilder.h"
 
 namespace sh
diff --git a/third_party/angle/src/compiler/translator/ImmutableString.h b/third_party/angle/src/compiler/translator/ImmutableString.h
index 8dc5b6a..f172708 100644
--- a/third_party/angle/src/compiler/translator/ImmutableString.h
+++ b/third_party/angle/src/compiler/translator/ImmutableString.h
@@ -140,4 +140,4 @@
 
 std::ostream &operator<<(std::ostream &os, const sh::ImmutableString &str);
 
-#endif  // COMPILER_TRANSLATOR_IMMUTABLESTRING_H_
\ No newline at end of file
+#endif  // COMPILER_TRANSLATOR_IMMUTABLESTRING_H_
diff --git a/third_party/angle/src/compiler/translator/ImmutableString_ESSL_autogen.cpp b/third_party/angle/src/compiler/translator/ImmutableString_ESSL_autogen.cpp
index 42ae520..4072c6f 100644
--- a/third_party/angle/src/compiler/translator/ImmutableString_ESSL_autogen.cpp
+++ b/third_party/angle/src/compiler/translator/ImmutableString_ESSL_autogen.cpp
@@ -18,7 +18,7 @@
 }
 
 #if defined(_MSC_VER)
-#pragma warning(disable : 4309)  // truncation of constant value
+#    pragma warning(disable : 4309)  // truncation of constant value
 #endif
 
 namespace
@@ -200,7 +200,8 @@
 
     return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 287;
 }
-}
+
+}  // namespace
 
 namespace sh
 {
diff --git a/third_party/angle/src/compiler/translator/ImmutableString_autogen.cpp b/third_party/angle/src/compiler/translator/ImmutableString_autogen.cpp
index 98c793a..a56cdb2 100644
--- a/third_party/angle/src/compiler/translator/ImmutableString_autogen.cpp
+++ b/third_party/angle/src/compiler/translator/ImmutableString_autogen.cpp
@@ -18,7 +18,7 @@
 }
 
 #if defined(_MSC_VER)
-#pragma warning(disable : 4309)  // truncation of constant value
+#    pragma warning(disable : 4309)  // truncation of constant value
 #endif
 
 namespace
@@ -352,7 +352,8 @@
 
     return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 382;
 }
-}
+
+}  // namespace
 
 namespace sh
 {
diff --git a/third_party/angle/src/compiler/translator/SymbolTable_ESSL_autogen.cpp b/third_party/angle/src/compiler/translator/SymbolTable_ESSL_autogen.cpp
index c265106..8f0a3e2 100644
--- a/third_party/angle/src/compiler/translator/SymbolTable_ESSL_autogen.cpp
+++ b/third_party/angle/src/compiler/translator/SymbolTable_ESSL_autogen.cpp
@@ -2,7 +2,7 @@
 // Generated by gen_builtin_symbols.py using data from builtin_variables.json and
 // builtin_function_declarations.txt.
 //
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Copyright 2019 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
diff --git a/third_party/angle/src/compiler/translator/SymbolTable_autogen.cpp b/third_party/angle/src/compiler/translator/SymbolTable_autogen.cpp
index decb818..fd1010e 100644
--- a/third_party/angle/src/compiler/translator/SymbolTable_autogen.cpp
+++ b/third_party/angle/src/compiler/translator/SymbolTable_autogen.cpp
@@ -2,7 +2,7 @@
 // Generated by gen_builtin_symbols.py using data from builtin_variables.json and
 // builtin_function_declarations.txt.
 //
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Copyright 2019 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
diff --git a/third_party/angle/src/compiler/translator/Types.cpp b/third_party/angle/src/compiler/translator/Types.cpp
index b076a2d..a6d7ba9 100644
--- a/third_party/angle/src/compiler/translator/Types.cpp
+++ b/third_party/angle/src/compiler/translator/Types.cpp
@@ -19,6 +19,7 @@
 
 namespace sh
 {
+
 const char *getBasicString(TBasicType t)
 {
     switch (t)
diff --git a/third_party/angle/src/compiler/translator/Types.h b/third_party/angle/src/compiler/translator/Types.h
index 7fa52aa..22a475e 100644
--- a/third_party/angle/src/compiler/translator/Types.h
+++ b/third_party/angle/src/compiler/translator/Types.h
@@ -242,7 +242,6 @@
         }
         return static_cast<char>('A' + sizeKey - 10);
     }
-
     const char *getMangledName() const;
 
     bool sameNonArrayType(const TType &right) const;
diff --git a/third_party/angle/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h b/third_party/angle/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h
index 606fe12..edc0c83 100644
--- a/third_party/angle/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h
+++ b/third_party/angle/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h
@@ -2,7 +2,7 @@
 // Generated by gen_builtin_symbols.py using data from builtin_variables.json and
 // builtin_function_declarations.txt.
 //
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Copyright 2019 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
diff --git a/third_party/angle/src/compiler/translator/tree_util/BuiltIn_complete_autogen.h b/third_party/angle/src/compiler/translator/tree_util/BuiltIn_complete_autogen.h
index 2056ee4..3a17201 100644
--- a/third_party/angle/src/compiler/translator/tree_util/BuiltIn_complete_autogen.h
+++ b/third_party/angle/src/compiler/translator/tree_util/BuiltIn_complete_autogen.h
@@ -2,7 +2,7 @@
 // Generated by gen_builtin_symbols.py using data from builtin_variables.json and
 // builtin_function_declarations.txt.
 //
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Copyright 2019 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
diff --git a/third_party/angle/src/gpu_info_util/SystemInfo_win.cpp b/third_party/angle/src/gpu_info_util/SystemInfo_win.cpp
index 6724a85..f4bb137 100644
--- a/third_party/angle/src/gpu_info_util/SystemInfo_win.cpp
+++ b/third_party/angle/src/gpu_info_util/SystemInfo_win.cpp
@@ -8,15 +8,14 @@
 
 #include "gpu_info_util/SystemInfo_internal.h"
 
+#include "common/debug.h"
+#include "common/string_utils.h"
+
 // Windows.h needs to be included first
 #include <windows.h>
 
 #include <dxgi.h>
 
-#include "common/debug.h"
-#include "common/string_utils.h"
-
-
 #include <array>
 #include <sstream>
 
diff --git a/third_party/angle/src/libANGLE/LoggingAnnotator.cpp b/third_party/angle/src/libANGLE/LoggingAnnotator.cpp
index b3721ac..d44b452 100644
--- a/third_party/angle/src/libANGLE/LoggingAnnotator.cpp
+++ b/third_party/angle/src/libANGLE/LoggingAnnotator.cpp
@@ -56,7 +56,7 @@
     }
     else
     {
-        gl::Trace(msg.getSeverity(), msg.getMessage().c_str());
+    gl::Trace(msg.getSeverity(), msg.getMessage().c_str());
     }
 }
 
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h b/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h
index f5c8dda..6e2e08f 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h
@@ -118,6 +118,7 @@
 
     HANDLE mShareHandle;
     IUnknown *mD3DTexture;
+
     EGLenum mBuftype;
     bool mBindChroma;
 };
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
index e7026ff..dcf186b 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
@@ -243,13 +243,11 @@
 // StateManager11::ViewCache Implementation.
 template <typename ViewType, typename DescType>
 StateManager11::ViewCache<ViewType, DescType>::ViewCache() : mHighestUsedView(0)
-{
-}
+{}
 
 template <typename ViewType, typename DescType>
 StateManager11::ViewCache<ViewType, DescType>::~ViewCache()
-{
-}
+{}
 
 template <typename ViewType, typename DescType>
 void StateManager11::ViewCache<ViewType, DescType>::update(size_t resourceIndex, ViewType *view)
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h
index a494996..d359a8b 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h
@@ -29,8 +29,6 @@
     bool getClientRect(LPRECT rect) const override;
     bool isIconic() const override;
 
-    // Note that argument UINT samples was added here to make this actually
-    // override the createSwapChain method in the base class NativeWindow11.
     HRESULT createSwapChain(ID3D11Device *device,
                             IDXGIFactory *factory,
                             DXGI_FORMAT format,
diff --git a/third_party/angle/src/libANGLE/renderer/gl/glx/SurfaceGLX.h b/third_party/angle/src/libANGLE/renderer/gl/glx/SurfaceGLX.h
index a90ecea..6895d2f 100644
--- a/third_party/angle/src/libANGLE/renderer/gl/glx/SurfaceGLX.h
+++ b/third_party/angle/src/libANGLE/renderer/gl/glx/SurfaceGLX.h
@@ -15,8 +15,6 @@
 namespace rx
 {
 
-class FunctionsGLX;
-
 class SurfaceGLX : public SurfaceGL
 {
   public:
diff --git a/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp b/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
index fa61555..f85855a 100644
--- a/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
+++ b/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
@@ -625,12 +625,14 @@
     {
         return egl::EglNotInitialized() << "Could not retrieve D3D11CreateDevice address.";
     }
+
     HRESULT result = d3d11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0,
                                        D3D11_SDK_VERSION, &mD3D11Device, nullptr, nullptr);
     if (FAILED(result))
     {
         return egl::EglNotInitialized() << "Could not create D3D11 device, " << gl::FmtHR(result);
     }
+
     return registerD3DDevice(mD3D11Device, &mD3D11DeviceHandle);
 }
 
diff --git a/third_party/angle/src/third_party/libXNVCtrl/libXNVCtrl.gyp b/third_party/angle/src/third_party/libXNVCtrl/libXNVCtrl.gyp
new file mode 100644
index 0000000..dc0df78
--- /dev/null
+++ b/third_party/angle/src/third_party/libXNVCtrl/libXNVCtrl.gyp
@@ -0,0 +1,18 @@
+# Copyright 2016 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+{
+    'targets':
+    [{
+        'target_name': 'libXNVCtrl',
+        'type': 'static_library',
+        'sources':
+        [
+            'NVCtrl.c',
+            'NVCtrl.h',
+            'NVCtrlLib.h',
+            'nv_control.h',
+        ],
+    }],
+}
diff --git a/third_party/boringssl/BUILD.gn b/third_party/boringssl/BUILD.gn
index c652096..f90940c 100644
--- a/third_party/boringssl/BUILD.gn
+++ b/third_party/boringssl/BUILD.gn
@@ -102,7 +102,7 @@
     configs -= [ "//starboard/build/config:size" ]
     configs += [ "//starboard/build/config:speed" ]
 
-    if (sb_is_evergreen) {
+    if (sb_is_modular) {
       calling_convention = sabi_variables.calling_convention
       if ((calling_convention != "aarch64" && calling_convention != "eabi" &&
            calling_convention != "sysv" && calling_convention != "windows") ||
diff --git a/third_party/boringssl/src/codereview.settings b/third_party/boringssl/src/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/third_party/boringssl/src/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/boringssl/src/crypto/cpu-starboard.c b/third_party/boringssl/src/crypto/cpu-starboard.c
index 4979d40..335cd91 100644
--- a/third_party/boringssl/src/crypto/cpu-starboard.c
+++ b/third_party/boringssl/src/crypto/cpu-starboard.c
@@ -113,7 +113,7 @@
 void OPENSSL_cpuid_setup_starboard(void) {
     if (!starboard_cpuid_setup_arm() ||
         !starboard_cpuid_setup_x86() ) {
-#if !SB_IS(EVERGREEN)
+#if !SB_IS(MODULAR)
             // Fall back on original implementation if the platform
             // does not yet support Starboard CPU detection
             OPENSSL_cpuid_setup();
diff --git a/third_party/boringssl_next/src/codereview.settings b/third_party/boringssl_next/src/codereview.settings
deleted file mode 100644
index 934cc7e..0000000
--- a/third_party/boringssl_next/src/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by "git cl" to get repository specific information.
-GERRIT_HOST: True
-GERRIT_PORT: True
-CODE_REVIEW_SERVER: https://boringssl-review.googlesource.com
diff --git a/third_party/brotli/.gitattributes b/third_party/brotli/.gitattributes
index 8915918..ae55bc9 100644
--- a/third_party/brotli/.gitattributes
+++ b/third_party/brotli/.gitattributes
@@ -1,54 +1,2 @@
 tests/testdata/* binary
 
-# Exclude everything
-**/** export-ignore
-
-# Add top-level files
-bootstrap !export-ignore
-BUILD !export-ignore
-CMakeLists.txt !export-ignore
-compiler_config_setting.bzl !export-ignore
-configure !export-ignore
-configure-cmake !export-ignore
-configure.ac !export-ignore
-CONTRIBUTING.md !export-ignore
-LICENSE !export-ignore
-Makefile !export-ignore
-Makefile.am !export-ignore
-MANIFEST.in !export-ignore
-premake5.lua !export-ignore
-README !export-ignore
-README.md !export-ignore
-setup.py !export-ignore
-setup.cfg !export-ignore
-WORKSPACE !export-ignore
-
-# Add sources
-c !export-ignore
-c/** !export-ignore
-c/common/dictionary.bin* export-ignore
-c/fuzz export-ignore
-
-# Add man pages
-docs !export-ignore
-docs/** !export-ignore
-docs/brotli-comparison-study-2015-09-22.pdf export-ignore
-
-# Add python bindings + tests
-python !export-ignore
-python/** !export-ignore
-
-# Add more build files.
-scripts !export-ignore
-scripts/sources.lst !export-ignore
-scripts/libbrotli*.pc.in !export-ignore
-
-# Add testdata
-tests !export-ignore
-tests/*.sh !export-ignore
-tests/*.cmake !export-ignore
-tests/testdata !export-ignore
-tests/testdata/empty !export-ignore
-tests/testdata/empty.compressed !export-ignore
-tests/testdata/ukkonooa !export-ignore
-tests/testdata/ukkonooa.compressed !export-ignore
diff --git a/third_party/brotli/codereview.settings b/third_party/brotli/codereview.settings
deleted file mode 100644
index acbc431..0000000
--- a/third_party/brotli/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
\ No newline at end of file
diff --git a/third_party/crashpad/codereview.settings b/third_party/crashpad/codereview.settings
deleted file mode 100644
index 976f8e5..0000000
--- a/third_party/crashpad/codereview.settings
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-GERRIT_HOST: True
-CODE_REVIEW_SERVER: https://chromium-review.googlesource.com/
-VIEW_VC: https://chromium.googlesource.com/crashpad/crashpad/+/
-PROJECT: crashpad
-BUG_PREFIX: crashpad:
diff --git a/third_party/devtools/codereview.settings b/third_party/devtools/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/third_party/devtools/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/flac/codereview.settings b/third_party/flac/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/third_party/flac/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/flac/src/libFLAC/bitreader.c b/third_party/flac/src/libFLAC/bitreader.c
index 29d64a0..94a4476 100644
--- a/third_party/flac/src/libFLAC/bitreader.c
+++ b/third_party/flac/src/libFLAC/bitreader.c
@@ -70,7 +70,7 @@
 #if defined(_MSC_VER) && !defined(COBALT)
 #define SWAP_BE_WORD_TO_HOST(x) local_swap32_(x)
 #elif defined(STARBOARD)
-#include "starboard/byte_swap.h"
+#include "starboard/common/byte_swap.h"
 #define SWAP_BE_WORD_TO_HOST(x) SB_NET_TO_HOST_U32(x)
 #else
 #define SWAP_BE_WORD_TO_HOST(x) ntohl(x)
diff --git a/third_party/flac/src/libFLAC/bitwriter.c b/third_party/flac/src/libFLAC/bitwriter.c
index f1c54cf..3ff0f47 100644
--- a/third_party/flac/src/libFLAC/bitwriter.c
+++ b/third_party/flac/src/libFLAC/bitwriter.c
@@ -46,7 +46,6 @@
 #include <netinet/in.h> /* for ntohl() */
 #endif
 #else  // STARBOARD
-#include "starboard/byte_swap.h"
 #include "starboard/client_porting/poem/stdio_poem.h"
 #endif  // STARBOARD
 
@@ -72,7 +71,7 @@
 #if defined(_MSC_VER) && !defined(COBALT)
 #define SWAP_BE_WORD_TO_HOST(x) local_swap32_(x)
 #elif defined(STARBOARD)
-#include "starboard/byte_swap.h"
+#include "starboard/common/byte_swap.h"
 #define SWAP_BE_WORD_TO_HOST(x) SB_NET_TO_HOST_U32(x)
 #else
 #define SWAP_BE_WORD_TO_HOST(x) ntohl(x)
diff --git a/third_party/freetype2/codereview.settings b/third_party/freetype2/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/third_party/freetype2/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/glm/codereview.settings b/third_party/glm/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/third_party/glm/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/googletest/src/googletest/src/gtest.cc b/third_party/googletest/src/googletest/src/gtest.cc
index 76a0f72..9b84415 100644
--- a/third_party/googletest/src/googletest/src/gtest.cc
+++ b/third_party/googletest/src/googletest/src/gtest.cc
@@ -1152,7 +1152,10 @@
 // Timer instead.
 TimeInMillis GetTimeInMillis() {
 #if GTEST_OS_STARBOARD
-  return SbTimeGetNow() / kSbTimeMillisecond;
+  // Use EzTime to get millis from posix epoch.
+  EzTimeValue time_value;
+  EzTimeValueGetNow(&time_value, NULL);
+  return time_value.tv_sec * 1000 + time_value.tv_usec / 1000;
 #else
   return std::chrono::duration_cast<std::chrono::milliseconds>(
              std::chrono::system_clock::now() -
@@ -3862,6 +3865,7 @@
   }
 }
 
+#if !GTEST_OS_STARBOARD
 void BriefUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
                                                     int /*iteration*/) {
   ColoredPrintf(GTestColor::kGreen, "[==========] ");
@@ -3893,6 +3897,62 @@
   // Ensure that Google Test output is printed before, e.g., heapchecker output.
   internal::posix::Flush();
 }
+#else  // !GTEST_OS_STARBOARD
+void BriefUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                    int /*iteration*/) {
+  // Due to the test processes relying on regex-parsing of GTEST test result
+  // summary output, we modify this step to atomically output the logs to stdout
+  // to avoid other external SbLogRaw calls from being inserted between calls to
+  // posix:PrintF().
+  // This batching guarantees that the output is well-formatted s.t. the test
+  // runner scripts received expected output despite reentrant logging.
+  // See b/251827741
+  std::stringstream out_stream;
+  out_stream << "[==========] ";
+
+  out_stream << FormatTestCount(unit_test.test_to_run_count()).c_str()
+             << " from "
+             << FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str()
+             << " ran.";
+
+  if (GTEST_FLAG_GET(print_time)) {
+    out_stream << " ("
+               << internal::StreamableToString(unit_test.elapsed_time()).c_str()
+               << " ms total)";
+  }
+
+  out_stream << std::endl;
+
+  out_stream << "[  PASSED  ] "
+             << FormatTestCount(unit_test.successful_test_count()).c_str()
+             << "."
+             << std::endl;
+
+  const int skipped_test_count = unit_test.skipped_test_count();
+  if (skipped_test_count > 0) {
+    out_stream << "[  SKIPPED ] ";
+    out_stream << FormatTestCount(skipped_test_count).c_str()
+               << "."
+               << std::endl;
+  }
+
+  const int num_disabled = unit_test.reportable_disabled_test_count();
+  if (num_disabled && !GTEST_FLAG_GET(also_run_disabled_tests)) {
+    if (unit_test.Passed()) {
+      out_stream << std::endl;  // Add a spacer if no FAILURE banner is displayed.
+    }
+    out_stream << "  YOU HAVE "
+               << num_disabled
+               << " DISABLED "
+               << (num_disabled == 1 ? "TEST" : "TESTS")
+               << std::endl
+               << std::endl;
+  }
+  // Ensure that Google Test output is printed before, e.g., heapchecker output.
+  internal::posix::PrintF("%s", out_stream.str().c_str());
+  internal::posix::Flush();
+}
+#endif  // !GTEST_OS_STARBOARD
 
 // End BriefUnitTestResultPrinter
 
diff --git a/third_party/icu/codereview.settings b/third_party/icu/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/third_party/icu/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/inspector_protocol/codereview.settings b/third_party/inspector_protocol/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/third_party/inspector_protocol/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/inspector_protocol/crdtp/json_platform.cc b/third_party/inspector_protocol/crdtp/json_platform.cc
index 21e26ce..facc7c8 100644
--- a/third_party/inspector_protocol/crdtp/json_platform.cc
+++ b/third_party/inspector_protocol/crdtp/json_platform.cc
@@ -16,7 +16,7 @@
 namespace json {
 namespace platform {
 bool StrToD(const char* str, double* result) {
-#if SB_IS(EVERGREEN)
+#if SB_IS(MODULAR)
 #error "The std::locale::classic() is not supported for Evergreen. Please use base::StringToDouble()."
 #endif
   std::istringstream is(str);
@@ -26,7 +26,8 @@
 }
 
 std::string DToStr(double value) {
-#if SB_IS(EVERGREEN)
+  //Ask Kaido/Yavor if this is needed.
+#if SB_IS(MODULAR)
 #error "The std::locale::classic() is not supported for Evergreen. Please use base::NumberToString()."
 #endif
   std::stringstream ss;
diff --git a/third_party/khronos/codereview.settings b/third_party/khronos/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/third_party/khronos/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/libevent/BUILD.gn b/third_party/libevent/BUILD.gn
index 7d1fb6b..de69df0 100644
--- a/third_party/libevent/BUILD.gn
+++ b/third_party/libevent/BUILD.gn
@@ -72,45 +72,46 @@
     cflags_c = [ "-Wno-unused-function" ]
     public_deps = [ "//starboard/common" ]
   } else {
-    if (is_mac || is_ios) {
-      sources += [
-        "kqueue.c",
-        "mac/config.h",
-        "mac/event-config.h",
-      ]
-      include_dirs = [ "mac" ]
-    } else if (is_linux) {
-      sources += [
-        "epoll.c",
-        "linux/config.h",
-        "linux/event-config.h",
-      ]
-      include_dirs = [ "linux" ]
-    } else if (is_android) {
-      sources += [
-        "android/config.h",
-        "android/event-config.h",
-        "epoll.c",
-      ]
-      include_dirs = [ "android" ]
-    } else if (is_nacl_nonsfi) {
-      sources -= [
-        "evdns.c",
-        "event_tagging.c",
-        "evrpc.c",
-        "http.c",
-        "select.c",
-        "signal.c",
-      ]
-      sources += [
-        "nacl_nonsfi/config.h",
-        "nacl_nonsfi/event-config.h",
-        "nacl_nonsfi/random.c",
-        "nacl_nonsfi/signal_stub.c",
-      ]
-      include_dirs = [ "nacl_nonsfi" ]
-    }
-    configs -= [ "//build/config/compiler:chromium_code" ]
+  if (is_mac || is_ios) {
+    sources += [
+      "kqueue.c",
+      "mac/config.h",
+      "mac/event-config.h",
+    ]
+    include_dirs = [ "mac" ]
+  } else if (is_linux) {
+    sources += [
+      "epoll.c",
+      "linux/config.h",
+      "linux/event-config.h",
+    ]
+    include_dirs = [ "linux" ]
+  } else if (is_android) {
+    sources += [
+      "android/config.h",
+      "android/event-config.h",
+      "epoll.c",
+    ]
+    include_dirs = [ "android" ]
+  } else if (is_nacl_nonsfi) {
+    sources -= [
+      "evdns.c",
+      "event_tagging.c",
+      "evrpc.c",
+      "http.c",
+      "select.c",
+      "signal.c",
+    ]
+    sources += [
+      "nacl_nonsfi/config.h",
+      "nacl_nonsfi/event-config.h",
+      "nacl_nonsfi/random.c",
+      "nacl_nonsfi/signal_stub.c",
+    ]
+    include_dirs = [ "nacl_nonsfi" ]
+  }
+
+  configs -= [ "//build/config/compiler:chromium_code" ]
   }
 
   configs += [ "//build/config/compiler:no_chromium_code" ]
diff --git a/third_party/libevent/METADATA b/third_party/libevent/METADATA
index 9e0ca2c..7f520d1 100644
--- a/third_party/libevent/METADATA
+++ b/third_party/libevent/METADATA
@@ -6,13 +6,15 @@
 third_party {
   url {
     type: GIT
-    value: "https://github.com/libevent/libevent.git"
+    value: "https://chromium.googlesource.com/chromium/src"
+    # Chromium probably uses https://github.com/libevent/libevent but see README.chromium.
   }
-  version: "3e9aad72214519ac2ad6f5f023af48136d0dd50d"
+  version: "70.0.3538.124"
+  # This is "Version: 1.4.15" according to README.chromium.
   last_upgrade_date {
-    year: 2015
-    month: 1
-    day: 5
+    year: 2023
+    month: 7
+    day: 29
   }
   license_type: NOTICE
 }
diff --git a/third_party/libevent/Makefile.in b/third_party/libevent/Makefile.in
deleted file mode 100644
index 4d96c74..0000000
--- a/third_party/libevent/Makefile.in
+++ /dev/null
@@ -1,976 +0,0 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = .
-DIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \
-	$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/config.h.in $(top_srcdir)/configure ChangeLog \
-	config.guess config.sub devpoll.c epoll.c epoll_sub.c evport.c \
-	install-sh kqueue.c ltmain.sh missing mkinstalldirs poll.c \
-	select.c signal.c
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
-	"$(DESTDIR)$(man3dir)" "$(DESTDIR)$(includedir)" \
-	"$(DESTDIR)$(includedir)"
-libLTLIBRARIES_INSTALL = $(INSTALL)
-LTLIBRARIES = $(lib_LTLIBRARIES)
-am__DEPENDENCIES_1 =
-libevent_la_DEPENDENCIES = @LTLIBOBJS@ $(am__DEPENDENCIES_1)
-am__libevent_la_SOURCES_DIST = event.c buffer.c evbuffer.c log.c \
-	evutil.c WIN32-Code/win32.c event_tagging.c http.c evhttp.h \
-	http-internal.h evdns.c evdns.h evrpc.c evrpc.h \
-	evrpc-internal.h strlcpy.c strlcpy-internal.h
-@BUILD_WIN32_TRUE@am__objects_1 = win32.lo
-am__objects_2 = event.lo buffer.lo evbuffer.lo log.lo evutil.lo \
-	$(am__objects_1)
-am__objects_3 = event_tagging.lo http.lo evdns.lo evrpc.lo strlcpy.lo
-am_libevent_la_OBJECTS = $(am__objects_2) $(am__objects_3)
-libevent_la_OBJECTS = $(am_libevent_la_OBJECTS)
-libevent_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(libevent_la_LDFLAGS) $(LDFLAGS) -o $@
-libevent_core_la_DEPENDENCIES = @LTLIBOBJS@ $(am__DEPENDENCIES_1)
-am__libevent_core_la_SOURCES_DIST = event.c buffer.c evbuffer.c log.c \
-	evutil.c WIN32-Code/win32.c
-am_libevent_core_la_OBJECTS = $(am__objects_2)
-libevent_core_la_OBJECTS = $(am_libevent_core_la_OBJECTS)
-libevent_core_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(libevent_core_la_LDFLAGS) $(LDFLAGS) -o $@
-libevent_extra_la_DEPENDENCIES = @LTLIBOBJS@ $(am__DEPENDENCIES_1)
-am_libevent_extra_la_OBJECTS = $(am__objects_3)
-libevent_extra_la_OBJECTS = $(am_libevent_extra_la_OBJECTS)
-libevent_extra_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(libevent_extra_la_LDFLAGS) $(LDFLAGS) -o $@
-binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-SCRIPTS = $(bin_SCRIPTS)
-DEFAULT_INCLUDES = -I.@am__isrc@
-depcomp =
-am__depfiles_maybe =
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(libevent_la_SOURCES) $(libevent_core_la_SOURCES) \
-	$(libevent_extra_la_SOURCES)
-DIST_SOURCES = $(am__libevent_la_SOURCES_DIST) \
-	$(am__libevent_core_la_SOURCES_DIST) \
-	$(libevent_extra_la_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-man3dir = $(mandir)/man3
-NROFF = nroff
-MANS = $(man_MANS)
-includeHEADERS_INSTALL = $(INSTALL_HEADER)
-nodist_includeHEADERS_INSTALL = $(INSTALL_HEADER)
-HEADERS = $(include_HEADERS) $(nodist_include_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = . sample test
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  { test ! -d $(distdir) \
-    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr $(distdir); }; }
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIBTOOL_DEPS = @LIBTOOL_DEPS@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NMEDIT = @NMEDIT@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AUTOMAKE_OPTIONS = foreign no-dependencies
-
-# This is the point release for libevent.  It shouldn't include any
-# a/b/c/d/e notations.
-RELEASE = 1.4
-
-# This is the version info for the libevent binary API.  It has three
-# numbers:
-#   Current  -- the number of the binary API that we're implementing
-#   Revision -- which iteration of the implementation of the binary
-#               API are we supplying?
-#   Age      -- How many previous binary API versions do we also
-#               support?
-#
-# If we release a new version that does not change the binary API,
-# increment Revision.
-#
-# If we release a new version that changes the binary API, but does
-# not break programs compiled against the old binary API, increment
-# Current and Age.  Set Revision to 0, since this is the first
-# implementation of the new API.
-#
-# Otherwise, we're changing the binary API and breaking bakward
-# compatibility with old binaries.  Increment Current.  Set Age to 0,
-# since we're backward compatible with no previous APIs.  Set Revision
-# to 0 too.
-
-# History:
-#  Libevent 1.4.1 was 2:0:0
-#  Libevent 1.4.2 should be 3:0:0
-#  Libevent 1.4.5 is 3:0:1 (we forgot to increment in the past)
-VERSION_INFO = 3:3:1
-bin_SCRIPTS = event_rpcgen.py
-EXTRA_DIST = autogen.sh event.h event-internal.h log.h evsignal.h evdns.3 \
-	evrpc.h evrpc-internal.h min_heap.h \
-	event.3 \
-	Doxyfile \
-	kqueue.c epoll_sub.c epoll.c select.c poll.c signal.c \
-	evport.c devpoll.c event_rpcgen.py \
-	sample/Makefile.am sample/Makefile.in sample/event-test.c \
-	sample/signal-test.c sample/time-test.c \
-	test/Makefile.am test/Makefile.in test/bench.c test/regress.c \
-	test/test-eof.c test/test-weof.c test/test-time.c \
-	test/test-init.c test/test.sh \
-	compat/sys/queue.h compat/sys/_libevent_time.h \
-	WIN32-Code/config.h \
-	WIN32-Code/event-config.h \
-	WIN32-Code/win32.c \
-	WIN32-Code/tree.h \
-	WIN32-Prj/event_test/event_test.dsp \
-	WIN32-Prj/event_test/test.txt WIN32-Prj/libevent.dsp \
-	WIN32-Prj/libevent.dsw WIN32-Prj/signal_test/signal_test.dsp \
-	WIN32-Prj/time_test/time_test.dsp WIN32-Prj/regress/regress.vcproj \
-	WIN32-Prj/libevent.sln WIN32-Prj/libevent.vcproj
-
-lib_LTLIBRARIES = libevent.la libevent_core.la libevent_extra.la
-@BUILD_WIN32_FALSE@SUBDIRS = . sample test
-@BUILD_WIN32_TRUE@SUBDIRS = . sample
-@BUILD_WIN32_FALSE@SYS_LIBS = 
-@BUILD_WIN32_TRUE@SYS_LIBS = -lws2_32
-@BUILD_WIN32_FALSE@SYS_SRC = 
-@BUILD_WIN32_TRUE@SYS_SRC = WIN32-Code/win32.c
-@BUILD_WIN32_FALSE@SYS_INCLUDES = 
-@BUILD_WIN32_TRUE@SYS_INCLUDES = -IWIN32-Code
-BUILT_SOURCES = event-config.h
-CORE_SRC = event.c buffer.c evbuffer.c log.c evutil.c $(SYS_SRC)
-EXTRA_SRC = event_tagging.c http.c evhttp.h http-internal.h evdns.c \
-	evdns.h evrpc.c evrpc.h evrpc-internal.h \
-	strlcpy.c strlcpy-internal.h strlcpy-internal.h
-
-libevent_la_SOURCES = $(CORE_SRC) $(EXTRA_SRC)
-libevent_la_LIBADD = @LTLIBOBJS@ $(SYS_LIBS)
-libevent_la_LDFLAGS = -release $(RELEASE) -version-info $(VERSION_INFO)
-libevent_core_la_SOURCES = $(CORE_SRC)
-libevent_core_la_LIBADD = @LTLIBOBJS@ $(SYS_LIBS)
-libevent_core_la_LDFLAGS = -release $(RELEASE) -version-info $(VERSION_INFO)
-libevent_extra_la_SOURCES = $(EXTRA_SRC)
-libevent_extra_la_LIBADD = @LTLIBOBJS@ $(SYS_LIBS)
-libevent_extra_la_LDFLAGS = -release $(RELEASE) -version-info $(VERSION_INFO)
-include_HEADERS = event.h evhttp.h evdns.h evrpc.h evutil.h
-nodist_include_HEADERS = event-config.h
-INCLUDES = -I$(srcdir)/compat $(SYS_INCLUDES)
-man_MANS = event.3 evdns.3
-DISTCLEANFILES = *~ event-config.h
-all: $(BUILT_SOURCES) config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-am--refresh:
-	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
-	      cd $(srcdir) && $(AUTOMAKE) --foreign  \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-
-config.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
-	else :; fi
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in:  $(am__configure_deps) 
-	cd $(top_srcdir) && $(AUTOHEADER)
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  if test -f $$p; then \
-	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
-	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
-	  else :; fi; \
-	done
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libevent.la: $(libevent_la_OBJECTS) $(libevent_la_DEPENDENCIES) 
-	$(libevent_la_LINK) -rpath $(libdir) $(libevent_la_OBJECTS) $(libevent_la_LIBADD) $(LIBS)
-libevent_core.la: $(libevent_core_la_OBJECTS) $(libevent_core_la_DEPENDENCIES) 
-	$(libevent_core_la_LINK) -rpath $(libdir) $(libevent_core_la_OBJECTS) $(libevent_core_la_LIBADD) $(LIBS)
-libevent_extra.la: $(libevent_extra_la_OBJECTS) $(libevent_extra_la_DEPENDENCIES) 
-	$(libevent_extra_la_LINK) -rpath $(libdir) $(libevent_extra_la_OBJECTS) $(libevent_extra_la_LIBADD) $(LIBS)
-install-binSCRIPTS: $(bin_SCRIPTS)
-	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	    $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
-	  else :; fi; \
-	done
-
-uninstall-binSCRIPTS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
-	done
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.c.o:
-	$(COMPILE) -c $<
-
-.c.obj:
-	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-	$(LTCOMPILE) -c -o $@ $<
-
-win32.lo: WIN32-Code/win32.c
-	$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o win32.lo `test -f 'WIN32-Code/win32.c' || echo '$(srcdir)/'`WIN32-Code/win32.c
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-install-man3: $(man3_MANS) $(man_MANS)
-	@$(NORMAL_INSTALL)
-	test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)"
-	@list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.3*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
-	  else file=$$i; fi; \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    3*) ;; \
-	    *) ext='3' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
-	  $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \
-	done
-uninstall-man3:
-	@$(NORMAL_UNINSTALL)
-	@list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.3*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    3*) ;; \
-	    *) ext='3' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \
-	  rm -f "$(DESTDIR)$(man3dir)/$$inst"; \
-	done
-install-includeHEADERS: $(include_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
-	@list='$(include_HEADERS)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
-	  $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
-	done
-
-uninstall-includeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(include_HEADERS)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(includedir)/$$f"; \
-	done
-install-nodist_includeHEADERS: $(nodist_include_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
-	@list='$(nodist_include_HEADERS)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(nodist_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
-	  $(nodist_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
-	done
-
-uninstall-nodist_includeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(nodist_include_HEADERS)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(includedir)/$$f"; \
-	done
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	$(am__remove_distdir)
-	test -d $(distdir) || mkdir $(distdir)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(MKDIR_P) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r $(distdir)
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-dist-lzma: distdir
-	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
-	$(am__remove_distdir)
-
-dist-tarZ: distdir
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__remove_distdir)
-
-dist-shar: distdir
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__remove_distdir)
-
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__remove_distdir)
-
-dist dist-all: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.lzma*) \
-	  unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
-	mkdir $(distdir)/_build
-	mkdir $(distdir)/_inst
-	chmod a-w $(distdir)
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && cd $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
-	$(am__remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
-	@cd $(distuninstallcheck_dir) \
-	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
-check-am: all-am
-check: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) check-recursive
-all-am: Makefile $(LTLIBRARIES) $(SCRIPTS) $(MANS) $(HEADERS) config.h
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-clean: clean-recursive
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
-	mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-hdr distclean-libtool distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-includeHEADERS install-man \
-	install-nodist_includeHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-exec-am: install-binSCRIPTS install-libLTLIBRARIES
-
-install-html: install-html-recursive
-
-install-info: install-info-recursive
-
-install-man: install-man3
-
-install-pdf: install-pdf-recursive
-
-install-ps: install-ps-recursive
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-binSCRIPTS uninstall-includeHEADERS \
-	uninstall-libLTLIBRARIES uninstall-man \
-	uninstall-nodist_includeHEADERS
-
-uninstall-man: uninstall-man3
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am am--refresh check check-am clean clean-generic \
-	clean-libLTLIBRARIES clean-libtool ctags ctags-recursive dist \
-	dist-all dist-bzip2 dist-gzip dist-lzma dist-shar dist-tarZ \
-	dist-zip distcheck distclean distclean-compile \
-	distclean-generic distclean-hdr distclean-libtool \
-	distclean-tags distcleancheck distdir distuninstallcheck dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-binSCRIPTS install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-includeHEADERS install-info \
-	install-info-am install-libLTLIBRARIES install-man \
-	install-man3 install-nodist_includeHEADERS install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
-	uninstall-binSCRIPTS uninstall-includeHEADERS \
-	uninstall-libLTLIBRARIES uninstall-man uninstall-man3 \
-	uninstall-nodist_includeHEADERS
-
-
-event-config.h: config.h
-	echo '/* event-config.h' > $@
-	echo ' * Generated by autoconf; post-processed by libevent.' >> $@
-	echo ' * Do not edit this file.' >> $@
-	echo ' * Do not rely on macros in this file existing in later versions.'>> $@
-	echo ' */' >> $@
-	echo '#ifndef _EVENT_CONFIG_H_' >> $@
-	echo '#define _EVENT_CONFIG_H_' >> $@
-
-	sed -e 's/#define /#define _EVENT_/' \
-	    -e 's/#undef /#undef _EVENT_/' \
-	    -e 's/#ifndef /#ifndef _EVENT_/' < config.h >> $@
-	echo "#endif" >> $@
-
-verify: libevent.la
-	cd test && make verify
-
-doxygen: FORCE
-	doxygen $(srcdir)/Doxyfile
-FORCE:
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/libevent/aclocal.m4 b/third_party/libevent/aclocal.m4
deleted file mode 100644
index 4af9376..0000000
--- a/third_party/libevent/aclocal.m4
+++ /dev/null
@@ -1,7498 +0,0 @@
-# generated automatically by aclocal 1.10.1 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(AC_AUTOCONF_VERSION, [2.63],,
-[m4_warning([this file was generated for autoconf 2.63.
-You have another version of autoconf.  It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-
-# serial 52 AC_PROG_LIBTOOL
-
-
-# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
-# -----------------------------------------------------------
-# If this macro is not defined by Autoconf, define it here.
-m4_ifdef([AC_PROVIDE_IFELSE],
-         [],
-         [m4_define([AC_PROVIDE_IFELSE],
-	         [m4_ifdef([AC_PROVIDE_$1],
-		           [$2], [$3])])])
-
-
-# AC_PROG_LIBTOOL
-# ---------------
-AC_DEFUN([AC_PROG_LIBTOOL],
-[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
-dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
-dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
-  AC_PROVIDE_IFELSE([AC_PROG_CXX],
-    [AC_LIBTOOL_CXX],
-    [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
-  ])])
-dnl And a similar setup for Fortran 77 support
-  AC_PROVIDE_IFELSE([AC_PROG_F77],
-    [AC_LIBTOOL_F77],
-    [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
-])])
-
-dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
-dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
-dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
-  AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-    [AC_LIBTOOL_GCJ],
-    [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-      [AC_LIBTOOL_GCJ],
-      [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
-	[AC_LIBTOOL_GCJ],
-      [ifdef([AC_PROG_GCJ],
-	     [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
-       ifdef([A][M_PROG_GCJ],
-	     [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
-       ifdef([LT_AC_PROG_GCJ],
-	     [define([LT_AC_PROG_GCJ],
-		defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
-])])# AC_PROG_LIBTOOL
-
-
-# _AC_PROG_LIBTOOL
-# ----------------
-AC_DEFUN([_AC_PROG_LIBTOOL],
-[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
-AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
-AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
-AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-# Prevent multiple expansion
-define([AC_PROG_LIBTOOL], [])
-])# _AC_PROG_LIBTOOL
-
-
-# AC_LIBTOOL_SETUP
-# ----------------
-AC_DEFUN([AC_LIBTOOL_SETUP],
-[AC_PREREQ(2.50)dnl
-AC_REQUIRE([AC_ENABLE_SHARED])dnl
-AC_REQUIRE([AC_ENABLE_STATIC])dnl
-AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_LD])dnl
-AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
-AC_REQUIRE([AC_PROG_NM])dnl
-
-AC_REQUIRE([AC_PROG_LN_S])dnl
-AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
-# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
-AC_REQUIRE([AC_OBJEXT])dnl
-AC_REQUIRE([AC_EXEEXT])dnl
-dnl
-AC_LIBTOOL_SYS_MAX_CMD_LEN
-AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
-AC_LIBTOOL_OBJDIR
-
-AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
-_LT_AC_PROG_ECHO_BACKSLASH
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e 1s/^X//'
-[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
-
-# Same as above, but do not quote variable references.
-[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-# Constants:
-rm="rm -f"
-
-# Global variables:
-default_ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-ltmain="$ac_aux_dir/ltmain.sh"
-ofile="$default_ofile"
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-AC_CHECK_TOOL(AR, ar, false)
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-AC_CHECK_TOOL(STRIP, strip, :)
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-test -z "$AS" && AS=as
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-test -z "$LD" && LD=ld
-test -z "$LN_S" && LN_S="ln -s"
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-test -z "$NM" && NM=nm
-test -z "$SED" && SED=sed
-test -z "$OBJDUMP" && OBJDUMP=objdump
-test -z "$RANLIB" && RANLIB=:
-test -z "$STRIP" && STRIP=:
-test -z "$ac_objext" && ac_objext=o
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    AC_PATH_MAGIC
-  fi
-  ;;
-esac
-
-_LT_REQUIRED_DARWIN_CHECKS
-
-AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
-AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
-enable_win32_dll=yes, enable_win32_dll=no)
-
-AC_ARG_ENABLE([libtool-lock],
-    [AC_HELP_STRING([--disable-libtool-lock],
-	[avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-AC_ARG_WITH([pic],
-    [AC_HELP_STRING([--with-pic],
-	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [pic_mode="$withval"],
-    [pic_mode=default])
-test -z "$pic_mode" && pic_mode=default
-
-# Use C for the default configuration in the libtool script
-tagname=
-AC_LIBTOOL_LANG_C_CONFIG
-_LT_AC_TAGCONFIG
-])# AC_LIBTOOL_SETUP
-
-
-# _LT_AC_SYS_COMPILER
-# -------------------
-AC_DEFUN([_LT_AC_SYS_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_AC_SYS_COMPILER
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
-AC_DEFUN([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-])
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-AC_DEFUN([_LT_COMPILER_BOILERPLATE],
-[AC_REQUIRE([LT_AC_PROG_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$rm conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-AC_DEFUN([_LT_LINKER_BOILERPLATE],
-[AC_REQUIRE([LT_AC_PROG_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$rm -r conftest*
-])# _LT_LINKER_BOILERPLATE
-
-# _LT_REQUIRED_DARWIN_CHECKS
-# --------------------------
-# Check for some things on darwin
-AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[
-  case $host_os in
-    rhapsody* | darwin*)
-    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
-    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
-
-    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
-      [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-   # By default we will add the -single_module flag. You can override
-   # by either setting the environment variable LT_MULTI_MODULE
-   # non-empty at configure time, or by adding -multi_module to the
-   # link flags.
-   echo "int foo(void){return 1;}" > conftest.c
-   $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-     -dynamiclib ${wl}-single_module conftest.c
-   if test -f libconftest.dylib; then
-     lt_cv_apple_cc_single_mod=yes
-     rm -rf libconftest.dylib*
-   fi
-   rm conftest.c
-      fi])
-    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
-      [lt_cv_ld_exported_symbols_list],
-      [lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-   [lt_cv_ld_exported_symbols_list=yes],
-   [lt_cv_ld_exported_symbols_list=no])
-   LDFLAGS="$save_LDFLAGS"
-    ])
-    case $host_os in
-    rhapsody* | darwin1.[[0123]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-     _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*)
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-   10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-     _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-   10.[[012]]*)
-     _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-   10.*)
-     _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}"
-    fi
-    if test "$DSYMUTIL" != ":"; then
-      _lt_dsymutil="~$DSYMUTIL \$lib || :"
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-])
-
-# _LT_AC_SYS_LIBPATH_AIX
-# ----------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
-[AC_REQUIRE([LT_AC_PROG_SED])dnl
-AC_LINK_IFELSE(AC_LANG_PROGRAM,[
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi],[])
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-])# _LT_AC_SYS_LIBPATH_AIX
-
-
-# _LT_AC_SHELL_INIT(ARG)
-# ----------------------
-AC_DEFUN([_LT_AC_SHELL_INIT],
-[ifdef([AC_DIVERSION_NOTICE],
-	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
-	 [AC_DIVERT_PUSH(NOTICE)])
-$1
-AC_DIVERT_POP
-])# _LT_AC_SHELL_INIT
-
-
-# _LT_AC_PROG_ECHO_BACKSLASH
-# --------------------------
-# Add some code to the start of the generated configure script which
-# will find an echo command which doesn't interpret backslashes.
-AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
-[_LT_AC_SHELL_INIT([
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$ECHO in
-X*--fallback-echo)
-  # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
-  ;;
-esac
-
-echo=${ECHO-echo}
-if test "X[$]1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X[$]1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $echo works!
-  :
-else
-  # Restart under the correct shell.
-  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
-fi
-
-if test "X[$]1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<EOF
-[$]*
-EOF
-  exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$ECHO"; then
-if test "X${echo_test_string+set}" != Xset; then
-# find a string as large as possible, as long as the shell can cope with it
-  for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
-    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-    if (echo_test_string=`eval $cmd`) 2>/dev/null &&
-       echo_test_string=`eval $cmd` &&
-       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
-    then
-      break
-    fi
-  done
-fi
-
-if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
-   test "X$echo_testing_string" = "X$echo_test_string"; then
-  :
-else
-  # The Solaris, AIX, and Digital Unix default echo programs unquote
-  # backslashes.  This makes it impossible to quote backslashes using
-  #   echo "$something" | sed 's/\\/\\\\/g'
-  #
-  # So, first we look for a working echo in the user's PATH.
-
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for dir in $PATH /usr/ucb; do
-    IFS="$lt_save_ifs"
-    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-       test "X$echo_testing_string" = "X$echo_test_string"; then
-      echo="$dir/echo"
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-
-  if test "X$echo" = Xecho; then
-    # We didn't find a better echo, so look for alternatives.
-    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
-       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
-       test "X$echo_testing_string" = "X$echo_test_string"; then
-      # This shell has a builtin print -r that does the trick.
-      echo='print -r'
-    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
-	 test "X$CONFIG_SHELL" != X/bin/ksh; then
-      # If we have ksh, try running configure again with it.
-      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-      export ORIGINAL_CONFIG_SHELL
-      CONFIG_SHELL=/bin/ksh
-      export CONFIG_SHELL
-      exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
-    else
-      # Try using printf.
-      echo='printf %s\n'
-      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
-	 test "X$echo_testing_string" = "X$echo_test_string"; then
-	# Cool, printf works
-	:
-      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-	   test "X$echo_testing_string" = 'X\t' &&
-	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-	export CONFIG_SHELL
-	SHELL="$CONFIG_SHELL"
-	export SHELL
-	echo="$CONFIG_SHELL [$]0 --fallback-echo"
-      elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-	   test "X$echo_testing_string" = 'X\t' &&
-	   echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	echo="$CONFIG_SHELL [$]0 --fallback-echo"
-      else
-	# maybe with a smaller string...
-	prev=:
-
-	for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
-	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
-	  then
-	    break
-	  fi
-	  prev="$cmd"
-	done
-
-	if test "$prev" != 'sed 50q "[$]0"'; then
-	  echo_test_string=`eval $prev`
-	  export echo_test_string
-	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
-	else
-	  # Oops.  We lost completely, so just stick with echo.
-	  echo=echo
-	fi
-      fi
-    fi
-  fi
-fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-ECHO=$echo
-if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
-   ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
-fi
-
-AC_SUBST(ECHO)
-])])# _LT_AC_PROG_ECHO_BACKSLASH
-
-
-# _LT_AC_LOCK
-# -----------
-AC_DEFUN([_LT_AC_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
-    [AC_HELP_STRING([--disable-libtool-lock],
-	[avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.$ac_objext` in
-    *ELF-32*)
-      HPUX_IA64_MODE="32"
-      ;;
-    *ELF-64*)
-      HPUX_IA64_MODE="64"
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-   if test "$lt_cv_prog_gnu_ld" = yes; then
-    case `/usr/bin/file conftest.$ac_objext` in
-    *32-bit*)
-      LD="${LD-ld} -melf32bsmip"
-      ;;
-    *N32*)
-      LD="${LD-ld} -melf32bmipn32"
-      ;;
-    *64-bit*)
-      LD="${LD-ld} -melf64bmip"
-      ;;
-    esac
-   else
-    case `/usr/bin/file conftest.$ac_objext` in
-    *32-bit*)
-      LD="${LD-ld} -32"
-      ;;
-    *N32*)
-      LD="${LD-ld} -n32"
-      ;;
-    *64-bit*)
-      LD="${LD-ld} -64"
-      ;;
-    esac
-   fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *32-bit*)
-      case $host in
-        x86_64-*kfreebsd*-gnu)
-          LD="${LD-ld} -m elf_i386_fbsd"
-          ;;
-        x86_64-*linux*)
-          LD="${LD-ld} -m elf_i386"
-          ;;
-        ppc64-*linux*|powerpc64-*linux*)
-          LD="${LD-ld} -m elf32ppclinux"
-          ;;
-        s390x-*linux*)
-          LD="${LD-ld} -m elf_s390"
-          ;;
-        sparc64-*linux*)
-          LD="${LD-ld} -m elf32_sparc"
-          ;;
-      esac
-      ;;
-    *64-bit*)
-      case $host in
-        x86_64-*kfreebsd*-gnu)
-          LD="${LD-ld} -m elf_x86_64_fbsd"
-          ;;
-        x86_64-*linux*)
-          LD="${LD-ld} -m elf_x86_64"
-          ;;
-        ppc*-*linux*|powerpc*-*linux*)
-          LD="${LD-ld} -m elf64ppc"
-          ;;
-        s390*-*linux*)
-          LD="${LD-ld} -m elf64_s390"
-          ;;
-        sparc*-*linux*)
-          LD="${LD-ld} -m elf64_sparc"
-          ;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_LANG_PUSH(C)
-     AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-     AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-        if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
-[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
-  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-  AC_CHECK_TOOL(AS, as, false)
-  AC_CHECK_TOOL(OBJDUMP, objdump, false)
-  ;;
-  ])
-esac
-
-need_locks="$enable_libtool_lock"
-
-])# _LT_AC_LOCK
-
-
-# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
-[AC_REQUIRE([LT_AC_PROG_SED])
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-  ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       $2=yes
-     fi
-   fi
-   $rm conftest*
-])
-
-if test x"[$]$2" = xyes; then
-    ifelse([$5], , :, [$5])
-else
-    ifelse([$6], , :, [$6])
-fi
-])# AC_LIBTOOL_COMPILER_OPTION
-
-
-# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#                          [ACTION-SUCCESS], [ACTION-FAILURE])
-# ------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
-[AC_REQUIRE([LT_AC_PROG_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $3"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         $2=yes
-       fi
-     else
-       $2=yes
-     fi
-   fi
-   $rm -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
-    ifelse([$4], , :, [$4])
-else
-    ifelse([$5], , :, [$5])
-fi
-])# AC_LIBTOOL_LINKER_OPTION
-
-
-# AC_LIBTOOL_SYS_MAX_CMD_LEN
-# --------------------------
-AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
-[# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-  i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ 	]]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
-	       = "XX$teststring") >/dev/null 2>&1 &&
-	      new_result=`expr "X$teststring" : ".*" 2>&1` &&
-	      lt_cv_sys_max_cmd_len=$new_result &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on massive
-      # amounts of additional arguments before passing them to the linker.
-      # It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
-  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
-  AC_MSG_RESULT(none)
-fi
-])# AC_LIBTOOL_SYS_MAX_CMD_LEN
-
-
-# _LT_AC_CHECK_DLFCN
-# ------------------
-AC_DEFUN([_LT_AC_CHECK_DLFCN],
-[AC_CHECK_HEADERS(dlfcn.h)dnl
-])# _LT_AC_CHECK_DLFCN
-
-
-# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-#                           ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ---------------------------------------------------------------------
-AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
-[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
-  [$4]
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<EOF
-[#line __oline__ "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-#ifdef __cplusplus
-extern "C" void exit (int);
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-    exit (status);
-}]
-EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) $1 ;;
-      x$lt_dlneed_uscore) $2 ;;
-      x$lt_dlunknown|x*) $3 ;;
-    esac
-  else :
-    # compilation failed
-    $3
-  fi
-fi
-rm -fr conftest*
-])# _LT_AC_TRY_DLOPEN_SELF
-
-
-# AC_LIBTOOL_DLOPEN_SELF
-# ----------------------
-AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
-[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-   ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-   ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ])
-   ;;
-
-  *)
-    AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
-      [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
-	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
-	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
-	      ])
-	    ])
-	  ])
-	])
-      ])
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    AC_CACHE_CHECK([whether a program can dlopen itself],
-	  lt_cv_dlopen_self, [dnl
-	  _LT_AC_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-    ])
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-    	  lt_cv_dlopen_self_static, [dnl
-	  _LT_AC_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
-      ])
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-])# AC_LIBTOOL_DLOPEN_SELF
-
-
-# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
-# ---------------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler
-AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
-[AC_REQUIRE([LT_AC_PROG_SED])dnl
-AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-  [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-  [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-   $rm -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-     fi
-   fi
-   chmod u+w . 2>&AS_MESSAGE_LOG_FD
-   $rm conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
-   $rm out/* && rmdir out
-   cd ..
-   rmdir conftest
-   $rm conftest*
-])
-])# AC_LIBTOOL_PROG_CC_C_O
-
-
-# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
-# -----------------------------------------
-# Check to see if we can do hard links to lock some files if needed
-AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
-[AC_REQUIRE([_LT_AC_LOCK])dnl
-
-hard_links="nottested"
-if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  AC_MSG_CHECKING([if we can lock with hard links])
-  hard_links=yes
-  $rm conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
-
-
-# AC_LIBTOOL_OBJDIR
-# -----------------
-AC_DEFUN([AC_LIBTOOL_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-])# AC_LIBTOOL_OBJDIR
-
-
-# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
-# ----------------------------------------------
-# Check hardcoding attributes.
-AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_AC_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
-   test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
-   test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
-  # We can hardcode non-existant directories.
-  if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
-    # Linking always hardcodes the temporary library directory.
-    _LT_AC_TAGVAR(hardcode_action, $1)=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    _LT_AC_TAGVAR(hardcode_action, $1)=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
-
-
-# AC_LIBTOOL_SYS_LIB_STRIP
-# ------------------------
-AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
-[striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-   darwin*)
-       if test -n "$STRIP" ; then
-         striplib="$STRIP -x"
-         old_striplib="$STRIP -S"
-         AC_MSG_RESULT([yes])
-       else
-  AC_MSG_RESULT([no])
-fi
-       ;;
-   *)
-  AC_MSG_RESULT([no])
-    ;;
-  esac
-fi
-])# AC_LIBTOOL_SYS_LIB_STRIP
-
-
-# AC_LIBTOOL_SYS_DYNAMIC_LINKER
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
-[AC_REQUIRE([LT_AC_PROG_SED])dnl
-AC_MSG_CHECKING([dynamic linker characteristics])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-m4_if($1,[],[
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    lt_search_path_spec=`echo "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
-  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
-}'`
-  sys_lib_search_path_spec=`echo $lt_search_path_spec`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[[4-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[[01]] | aix4.[[01]].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  library_names_spec='$libname.ixlibrary $libname.a'
-  # Create ${libname}_ixlibrary.a entries in /sys/libs.
-  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[[45]]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $rm \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-  m4_if([$1], [],[
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) 
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[[123]]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
-  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-   hppa*64*)
-     shrext_cmds='.sl'
-     hardcode_into_libs=yes
-     dynamic_linker="$host_os dld.sl"
-     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-     soname_spec='${libname}${release}${shared_ext}$major'
-     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-     ;;
-   *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
-
-interix[[3-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ 	]*hwcap[ 	]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-nto-qnx*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      export_dynamic_flag_spec='${wl}-Blargedynsym'
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-    shlibpath_overrides_runpath=no
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    shlibpath_overrides_runpath=yes
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-AC_CACHE_VAL([lt_cv_sys_lib_search_path_spec],
-[lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"])
-sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-AC_CACHE_VAL([lt_cv_sys_lib_dlsearch_path_spec],
-[lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"])
-sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
-
-
-# _LT_AC_TAGCONFIG
-# ----------------
-AC_DEFUN([_LT_AC_TAGCONFIG],
-[AC_REQUIRE([LT_AC_PROG_SED])dnl
-AC_ARG_WITH([tags],
-    [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
-        [include additional configurations @<:@automatic@:>@])],
-    [tagnames="$withval"])
-
-if test -f "$ltmain" && test -n "$tagnames"; then
-  if test ! -f "${ofile}"; then
-    AC_MSG_WARN([output file `$ofile' does not exist])
-  fi
-
-  if test -z "$LTCC"; then
-    eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
-    if test -z "$LTCC"; then
-      AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
-    else
-      AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
-    fi
-  fi
-  if test -z "$LTCFLAGS"; then
-    eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
-  fi
-
-  # Extract list of available tagged configurations in $ofile.
-  # Note that this assumes the entire list is on one line.
-  available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
-
-  lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-  for tagname in $tagnames; do
-    IFS="$lt_save_ifs"
-    # Check whether tagname contains only valid characters
-    case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
-    "") ;;
-    *)  AC_MSG_ERROR([invalid tag name: $tagname])
-	;;
-    esac
-
-    if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
-    then
-      AC_MSG_ERROR([tag name \"$tagname\" already exists])
-    fi
-
-    # Update the list of available tags.
-    if test -n "$tagname"; then
-      echo appending configuration tag \"$tagname\" to $ofile
-
-      case $tagname in
-      CXX)
-	if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-	    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-	    (test "X$CXX" != "Xg++"))) ; then
-	  AC_LIBTOOL_LANG_CXX_CONFIG
-	else
-	  tagname=""
-	fi
-	;;
-
-      F77)
-	if test -n "$F77" && test "X$F77" != "Xno"; then
-	  AC_LIBTOOL_LANG_F77_CONFIG
-	else
-	  tagname=""
-	fi
-	;;
-
-      GCJ)
-	if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
-	  AC_LIBTOOL_LANG_GCJ_CONFIG
-	else
-	  tagname=""
-	fi
-	;;
-
-      RC)
-	AC_LIBTOOL_LANG_RC_CONFIG
-	;;
-
-      *)
-	AC_MSG_ERROR([Unsupported tag name: $tagname])
-	;;
-      esac
-
-      # Append the new tag name to the list of available tags.
-      if test -n "$tagname" ; then
-      available_tags="$available_tags $tagname"
-    fi
-    fi
-  done
-  IFS="$lt_save_ifs"
-
-  # Now substitute the updated list of available tags.
-  if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
-    mv "${ofile}T" "$ofile"
-    chmod +x "$ofile"
-  else
-    rm -f "${ofile}T"
-    AC_MSG_ERROR([unable to update list of available tagged configurations.])
-  fi
-fi
-])# _LT_AC_TAGCONFIG
-
-
-# AC_LIBTOOL_DLOPEN
-# -----------------
-# enable checks for dlopen support
-AC_DEFUN([AC_LIBTOOL_DLOPEN],
- [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
-])# AC_LIBTOOL_DLOPEN
-
-
-# AC_LIBTOOL_WIN32_DLL
-# --------------------
-# declare package support for building win32 DLLs
-AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
-])# AC_LIBTOOL_WIN32_DLL
-
-
-# AC_ENABLE_SHARED([DEFAULT])
-# ---------------------------
-# implement the --enable-shared flag
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-AC_DEFUN([AC_ENABLE_SHARED],
-[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
-AC_ARG_ENABLE([shared],
-    [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
-	[build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_shared=]AC_ENABLE_SHARED_DEFAULT)
-])# AC_ENABLE_SHARED
-
-
-# AC_DISABLE_SHARED
-# -----------------
-# set the default shared flag to --disable-shared
-AC_DEFUN([AC_DISABLE_SHARED],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-AC_ENABLE_SHARED(no)
-])# AC_DISABLE_SHARED
-
-
-# AC_ENABLE_STATIC([DEFAULT])
-# ---------------------------
-# implement the --enable-static flag
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-AC_DEFUN([AC_ENABLE_STATIC],
-[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
-AC_ARG_ENABLE([static],
-    [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
-	[build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_static=]AC_ENABLE_STATIC_DEFAULT)
-])# AC_ENABLE_STATIC
-
-
-# AC_DISABLE_STATIC
-# -----------------
-# set the default static flag to --disable-static
-AC_DEFUN([AC_DISABLE_STATIC],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-AC_ENABLE_STATIC(no)
-])# AC_DISABLE_STATIC
-
-
-# AC_ENABLE_FAST_INSTALL([DEFAULT])
-# ---------------------------------
-# implement the --enable-fast-install flag
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-AC_DEFUN([AC_ENABLE_FAST_INSTALL],
-[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
-AC_ARG_ENABLE([fast-install],
-    [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
-    [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT)
-])# AC_ENABLE_FAST_INSTALL
-
-
-# AC_DISABLE_FAST_INSTALL
-# -----------------------
-# set the default to --disable-fast-install
-AC_DEFUN([AC_DISABLE_FAST_INSTALL],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-AC_ENABLE_FAST_INSTALL(no)
-])# AC_DISABLE_FAST_INSTALL
-
-
-# AC_LIBTOOL_PICMODE([MODE])
-# --------------------------
-# implement the --with-pic flag
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
-AC_DEFUN([AC_LIBTOOL_PICMODE],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-pic_mode=ifelse($#,1,$1,default)
-])# AC_LIBTOOL_PICMODE
-
-
-# AC_PROG_EGREP
-# -------------
-# This is predefined starting with Autoconf 2.54, so this conditional
-# definition can be removed once we require Autoconf 2.54 or later.
-m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
-[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
-   [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
-    then ac_cv_prog_egrep='grep -E'
-    else ac_cv_prog_egrep='egrep'
-    fi])
- EGREP=$ac_cv_prog_egrep
- AC_SUBST([EGREP])
-])])
-
-
-# AC_PATH_TOOL_PREFIX
-# -------------------
-# find a file program which can recognize shared library
-AC_DEFUN([AC_PATH_TOOL_PREFIX],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word.  This closes a longstanding sh security hole.
-  ac_dummy="ifelse([$2], , $PATH, [$2])"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  AC_MSG_RESULT($MAGIC_CMD)
-else
-  AC_MSG_RESULT(no)
-fi
-])# AC_PATH_TOOL_PREFIX
-
-
-# AC_PATH_MAGIC
-# -------------
-# find a file program which can recognize a shared library
-AC_DEFUN([AC_PATH_MAGIC],
-[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
-  else
-    MAGIC_CMD=:
-  fi
-fi
-])# AC_PATH_MAGIC
-
-
-# AC_PROG_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([AC_PROG_LD],
-[AC_ARG_WITH([gnu-ld],
-    [AC_HELP_STRING([--with-gnu-ld],
-	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])
-AC_REQUIRE([LT_AC_PROG_SED])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
-      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-AC_PROG_LD_GNU
-])# AC_PROG_LD
-
-
-# AC_PROG_LD_GNU
-# --------------
-AC_DEFUN([AC_PROG_LD_GNU],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# AC_PROG_LD_GNU
-
-
-# AC_PROG_LD_RELOAD_FLAG
-# ----------------------
-# find reload flag for linker
-#   -- PORTME Some linkers may need a different reload flag.
-AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
-[AC_CACHE_CHECK([for $LD option to reload object files],
-  lt_cv_ld_reload_flag,
-  [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-])# AC_PROG_LD_RELOAD_FLAG
-
-
-# AC_DEPLIBS_CHECK_METHOD
-# -----------------------
-# how to check for library dependencies
-#  -- PORTME fill in with the dynamic library characteristics
-AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
-[AC_CACHE_CHECK([how to recognize dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[[4-9]]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[[45]]*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  if ( file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[[3-9]]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-nto-qnx*)
-  lt_cv_deplibs_check_method=unknown
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-])
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-])# AC_DEPLIBS_CHECK_METHOD
-
-
-# AC_PROG_NM
-# ----------
-# find the pathname to a BSD-compatible name lister
-AC_DEFUN([AC_PROG_NM],
-[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
-[if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
-fi])
-NM="$lt_cv_path_NM"
-])# AC_PROG_NM
-
-
-# AC_CHECK_LIBM
-# -------------
-# check for math library
-AC_DEFUN([AC_CHECK_LIBM],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
-  # These system don't have libm, or don't need it
-  ;;
-*-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
-  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
-  ;;
-*)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
-  ;;
-esac
-])# AC_CHECK_LIBM
-
-
-# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
-# -----------------------------------
-# sets LIBLTDL to the link flags for the libltdl convenience library and
-# LTDLINCL to the include flags for the libltdl header and adds
-# --enable-ltdl-convenience to the configure arguments.  Note that
-# AC_CONFIG_SUBDIRS is not called here.  If DIRECTORY is not provided,
-# it is assumed to be `libltdl'.  LIBLTDL will be prefixed with
-# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/'
-# (note the single quotes!).  If your package is not flat and you're not
-# using automake, define top_builddir and top_srcdir appropriately in
-# the Makefiles.
-AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-  case $enable_ltdl_convenience in
-  no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
-  "") enable_ltdl_convenience=yes
-      ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
-  esac
-  LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
-  LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
-  # For backwards non-gettext consistent compatibility...
-  INCLTDL="$LTDLINCL"
-])# AC_LIBLTDL_CONVENIENCE
-
-
-# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
-# -----------------------------------
-# sets LIBLTDL to the link flags for the libltdl installable library and
-# LTDLINCL to the include flags for the libltdl header and adds
-# --enable-ltdl-install to the configure arguments.  Note that
-# AC_CONFIG_SUBDIRS is not called here.  If DIRECTORY is not provided,
-# and an installed libltdl is not found, it is assumed to be `libltdl'.
-# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with
-# '${top_srcdir}/' (note the single quotes!).  If your package is not
-# flat and you're not using automake, define top_builddir and top_srcdir
-# appropriately in the Makefiles.
-# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
-AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-  AC_CHECK_LIB(ltdl, lt_dlinit,
-  [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
-  [if test x"$enable_ltdl_install" = xno; then
-     AC_MSG_WARN([libltdl not installed, but installation disabled])
-   else
-     enable_ltdl_install=yes
-   fi
-  ])
-  if test x"$enable_ltdl_install" = x"yes"; then
-    ac_configure_args="$ac_configure_args --enable-ltdl-install"
-    LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
-    LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
-  else
-    ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
-    LIBLTDL="-lltdl"
-    LTDLINCL=
-  fi
-  # For backwards non-gettext consistent compatibility...
-  INCLTDL="$LTDLINCL"
-])# AC_LIBLTDL_INSTALLABLE
-
-
-# AC_LIBTOOL_CXX
-# --------------
-# enable support for C++ libraries
-AC_DEFUN([AC_LIBTOOL_CXX],
-[AC_REQUIRE([_LT_AC_LANG_CXX])
-])# AC_LIBTOOL_CXX
-
-
-# _LT_AC_LANG_CXX
-# ---------------
-AC_DEFUN([_LT_AC_LANG_CXX],
-[AC_REQUIRE([AC_PROG_CXX])
-AC_REQUIRE([_LT_AC_PROG_CXXCPP])
-_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
-])# _LT_AC_LANG_CXX
-
-# _LT_AC_PROG_CXXCPP
-# ------------------
-AC_DEFUN([_LT_AC_PROG_CXXCPP],
-[
-AC_REQUIRE([AC_PROG_CXX])
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-fi
-])# _LT_AC_PROG_CXXCPP
-
-# AC_LIBTOOL_F77
-# --------------
-# enable support for Fortran 77 libraries
-AC_DEFUN([AC_LIBTOOL_F77],
-[AC_REQUIRE([_LT_AC_LANG_F77])
-])# AC_LIBTOOL_F77
-
-
-# _LT_AC_LANG_F77
-# ---------------
-AC_DEFUN([_LT_AC_LANG_F77],
-[AC_REQUIRE([AC_PROG_F77])
-_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
-])# _LT_AC_LANG_F77
-
-
-# AC_LIBTOOL_GCJ
-# --------------
-# enable support for GCJ libraries
-AC_DEFUN([AC_LIBTOOL_GCJ],
-[AC_REQUIRE([_LT_AC_LANG_GCJ])
-])# AC_LIBTOOL_GCJ
-
-
-# _LT_AC_LANG_GCJ
-# ---------------
-AC_DEFUN([_LT_AC_LANG_GCJ],
-[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
-  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
-    [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
-      [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
-	 [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
-	   [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
-_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
-])# _LT_AC_LANG_GCJ
-
-
-# AC_LIBTOOL_RC
-# -------------
-# enable support for Windows resource files
-AC_DEFUN([AC_LIBTOOL_RC],
-[AC_REQUIRE([LT_AC_PROG_RC])
-_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
-])# AC_LIBTOOL_RC
-
-
-# AC_LIBTOOL_LANG_C_CONFIG
-# ------------------------
-# Ensure that the configuration vars for the C compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
-AC_DEFUN([_LT_AC_LANG_C_CONFIG],
-[lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
-AC_LIBTOOL_PROG_COMPILER_PIC($1)
-AC_LIBTOOL_PROG_CC_C_O($1)
-AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
-AC_LIBTOOL_PROG_LD_SHLIBS($1)
-AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
-AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
-AC_LIBTOOL_SYS_LIB_STRIP
-AC_LIBTOOL_DLOPEN_SELF
-
-# Report which library types will actually be built
-AC_MSG_CHECKING([if libtool supports shared libraries])
-AC_MSG_RESULT([$can_build_shared])
-
-AC_MSG_CHECKING([whether to build shared libraries])
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case $host_os in
-aix3*)
-  test "$enable_shared" = yes && enable_static=no
-  if test -n "$RANLIB"; then
-    archive_cmds="$archive_cmds~\$RANLIB \$lib"
-    postinstall_cmds='$RANLIB $lib'
-  fi
-  ;;
-
-aix[[4-9]]*)
-  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-    test "$enable_shared" = yes && enable_static=no
-  fi
-    ;;
-esac
-AC_MSG_RESULT([$enable_shared])
-
-AC_MSG_CHECKING([whether to build static libraries])
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-AC_MSG_RESULT([$enable_static])
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_POP
-CC="$lt_save_CC"
-])# AC_LIBTOOL_LANG_C_CONFIG
-
-
-# AC_LIBTOOL_LANG_CXX_CONFIG
-# --------------------------
-# Ensure that the configuration vars for the C compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
-AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
-[AC_LANG_PUSH(C++)
-AC_REQUIRE([AC_PROG_CXX])
-AC_REQUIRE([_LT_AC_PROG_CXXCPP])
-
-_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_AC_TAGVAR(allow_undefined_flag, $1)=
-_LT_AC_TAGVAR(always_export_symbols, $1)=no
-_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
-_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_AC_TAGVAR(hardcode_direct, $1)=no
-_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
-_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_AC_TAGVAR(hardcode_automatic, $1)=no
-_LT_AC_TAGVAR(module_cmds, $1)=
-_LT_AC_TAGVAR(module_expsym_cmds, $1)=
-_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_AC_TAGVAR(no_undefined_flag, $1)=
-_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Dependencies to place before and after the object being linked:
-_LT_AC_TAGVAR(predep_objects, $1)=
-_LT_AC_TAGVAR(postdep_objects, $1)=
-_LT_AC_TAGVAR(predeps, $1)=
-_LT_AC_TAGVAR(postdeps, $1)=
-_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
-_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)=
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_LD=$LD
-lt_save_GCC=$GCC
-GCC=$GXX
-lt_save_with_gnu_ld=$with_gnu_ld
-lt_save_path_LD=$lt_cv_path_LD
-if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-  lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-else
-  $as_unset lt_cv_prog_gnu_ld
-fi
-if test -n "${lt_cv_path_LDCXX+set}"; then
-  lt_cv_path_LD=$lt_cv_path_LDCXX
-else
-  $as_unset lt_cv_path_LD
-fi
-test -z "${LDCXX+set}" || LD=$LDCXX
-CC=${CXX-"c++"}
-compiler=$CC
-_LT_AC_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-
-# We don't want -fno-exception wen compiling C++ code, so set the
-# no_builtin_flag separately
-if test "$GXX" = yes; then
-  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-else
-  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-fi
-
-if test "$GXX" = yes; then
-  # Set up default GNU C++ configuration
-
-  AC_PROG_LD
-
-  # Check if GNU C++ uses GNU ld as the underlying linker, since the
-  # archiving commands below assume that GNU ld is being used.
-  if test "$with_gnu_ld" = yes; then
-    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-    #     investigate it a little bit more. (MM)
-    wlarc='${wl}'
-
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
-	grep 'no-whole-archive' > /dev/null; then
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    with_gnu_ld=no
-    wlarc=
-
-    # A generic and very simple default shared library creation
-    # command for GNU C++ for the case where it uses the native
-    # linker, instead of GNU ld.  If possible, this setting should
-    # overridden to take advantage of the native linker features on
-    # the platform it is being used on.
-    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-  fi
-
-  # Commands to make compiler produce verbose output that lists
-  # what "hidden" libraries, object files and flags are used when
-  # linking a shared library.
-  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
-
-else
-  GXX=no
-  with_gnu_ld=no
-  wlarc=
-fi
-
-# PORTME: fill in a description of your system's C++ link characteristics
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-_LT_AC_TAGVAR(ld_shlibs, $1)=yes
-case $host_os in
-  aix3*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  aix[[4-9]]*)
-    if test "$host_cpu" = ia64; then
-      # On IA64, the linker does run time linking by default, so we don't
-      # have to do anything special.
-      aix_use_runtimelinking=no
-      exp_sym_flag='-Bexport'
-      no_entry_flag=""
-    else
-      aix_use_runtimelinking=no
-
-      # Test if we are trying to use run time linking or normal
-      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-      # need to do runtime linking.
-      case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	for ld_flag in $LDFLAGS; do
-	  case $ld_flag in
-	  *-brtl*)
-	    aix_use_runtimelinking=yes
-	    break
-	    ;;
-	  esac
-	done
-	;;
-      esac
-
-      exp_sym_flag='-bexport'
-      no_entry_flag='-bnoentry'
-    fi
-
-    # When large executables or shared objects are built, AIX ld can
-    # have problems creating the table of contents.  If linking a library
-    # or program results in "error TOC overflow" add -mminimal-toc to
-    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-    _LT_AC_TAGVAR(archive_cmds, $1)=''
-    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
-    _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-
-    if test "$GXX" = yes; then
-      case $host_os in aix4.[[012]]|aix4.[[012]].*)
-      # We only want to do this on AIX 4.2 and lower, the check
-      # below for broken collect2 doesn't work under 4.3+
-	collect2name=`${CC} -print-prog-name=collect2`
-	if test -f "$collect2name" && \
-	   strings "$collect2name" | grep resolve_lib_name >/dev/null
-	then
-	  # We have reworked collect2
-	  :
-	else
-	  # We have old collect2
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-	fi
-	;;
-      esac
-      shared_flag='-shared'
-      if test "$aix_use_runtimelinking" = yes; then
-	shared_flag="$shared_flag "'${wl}-G'
-      fi
-    else
-      # not using gcc
-      if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	shared_flag='-G'
-      else
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag='${wl}-G'
-	else
-	  shared_flag='${wl}-bM:SRE'
-	fi
-      fi
-    fi
-
-    # It seems that -bexpall does not export symbols beginning with
-    # underscore (_), so it is better to generate a list of symbols to export.
-    _LT_AC_TAGVAR(always_export_symbols, $1)=yes
-    if test "$aix_use_runtimelinking" = yes; then
-      # Warning - without using the other runtime loading flags (-brtl),
-      # -berok will link without error, but may produce a broken library.
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
-      # Determine the default libpath from the value encoded in an empty executable.
-      _LT_AC_SYS_LIBPATH_AIX
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-     else
-      if test "$host_cpu" = ia64; then
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-      else
-	# Determine the default libpath from the value encoded in an empty executable.
-	_LT_AC_SYS_LIBPATH_AIX
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	# Warning - without using the other run time loading flags,
-	# -berok will link without error, but may produce a broken library.
-	_LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	# Exported symbols can be pulled into shared objects from archives
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
-	# This is similar to how AIX traditionally builds its shared libraries.
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-      fi
-    fi
-    ;;
-
-  beos*)
-    if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-      # support --undefined.  This deserves some investigation.  FIXME
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-    else
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    fi
-    ;;
-
-  chorus*)
-    case $cc_basename in
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-
-  cygwin* | mingw* | pw32*)
-    # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-    # as there is no search path for DLLs.
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-    _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-    _LT_AC_TAGVAR(always_export_symbols, $1)=no
-    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-    if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      # If the export-symbols file already is a .def file (1st line
-      # is EXPORTS), use it as is; otherwise, prepend...
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	cp $export_symbols $output_objdir/$soname.def;
-      else
-	echo EXPORTS > $output_objdir/$soname.def;
-	cat $export_symbols >> $output_objdir/$soname.def;
-      fi~
-      $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-    else
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    fi
-  ;;
-      darwin* | rhapsody*)
-      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_AC_TAGVAR(hardcode_direct, $1)=no
-      _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
-      if test "$GXX" = yes ; then
-      output_verbose_link_cmd='echo'
-      _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-      _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-      _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-      if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-        _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-        _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-      fi
-      else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
-          _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-          _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         _LT_AC_TAGVAR(ld_shlibs, $1)=no
-          ;;
-      esac
-      fi
-        ;;
-
-  dgux*)
-    case $cc_basename in
-      ec++*)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      ghcx*)
-	# Green Hills C++ Compiler
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-  freebsd[[12]]*)
-    # C++ shared libraries reported to be fairly broken before switch to ELF
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  freebsd-elf*)
-    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-    ;;
-  freebsd* | dragonfly*)
-    # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-    # conventions
-    _LT_AC_TAGVAR(ld_shlibs, $1)=yes
-    ;;
-  gnu*)
-    ;;
-  hpux9*)
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-    _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-				# but as the default
-				# location of the library.
-
-    case $cc_basename in
-    CC*)
-      # FIXME: insert proper C++ library support
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    aCC*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      #
-      # There doesn't appear to be a way to prevent this compiler from
-      # explicitly linking system object files so we need to strip them
-      # from the output so that they don't get included in the library
-      # dependencies.
-      output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-      ;;
-    *)
-      if test "$GXX" = yes; then
-        _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-        # FIXME: insert proper C++ library support
-        _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-    ;;
-  hpux10*|hpux11*)
-    if test $with_gnu_ld = no; then
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-      case $host_cpu in
-      hppa*64*|ia64*) ;;
-      *)
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-        ;;
-      esac
-    fi
-    case $host_cpu in
-    hppa*64*|ia64*)
-      _LT_AC_TAGVAR(hardcode_direct, $1)=no
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-    *)
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-					      # but as the default
-					      # location of the library.
-      ;;
-    esac
-
-    case $cc_basename in
-      CC*)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      aCC*)
-	case $host_cpu in
-	hppa*64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  ;;
-	esac
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes; then
-	  if test $with_gnu_ld = no; then
-	    case $host_cpu in
-	    hppa*64*)
-	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    ia64*)
-	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    *)
-	      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      ;;
-	    esac
-	  fi
-	else
-	  # FIXME: insert proper C++ library support
-	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-    esac
-    ;;
-  interix[[3-9]]*)
-    _LT_AC_TAGVAR(hardcode_direct, $1)=no
-    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-    # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-    # Instead, shared libraries are loaded at an image base (0x10000000 by
-    # default) and relocated if they conflict, which is a slow very memory
-    # consuming and fragmenting process.  To avoid this, we pick a random,
-    # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-    # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-    ;;
-  irix5* | irix6*)
-    case $cc_basename in
-      CC*)
-	# SGI C++
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	# Archives containing C++ object files must be created using
-	# "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	# necessary to make sure instantiated templates are included
-	# in the archive.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	;;
-      *)
-	if test "$GXX" = yes; then
-	  if test "$with_gnu_ld" = no; then
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	  else
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
-	  fi
-	fi
-	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-	;;
-    esac
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-    ;;
-  linux* | k*bsd*-gnu)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-	# Archives containing C++ object files must be created using
-	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-	;;
-      icpc*)
-	# Intel C++
-	with_gnu_ld=yes
-	# version 8.0 and above of icpc choke on multiply defined symbols
-	# if we add $predep_objects and $postdep_objects, however 7.1 and
-	# earlier do not add the objects themselves.
-	case `$CC -V 2>&1` in
-	*"Version 7."*)
-  	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-  	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  ;;
-	*)  # Version 8.0 or newer
-	  tmp_idyn=
-	  case $host_cpu in
-	    ia64*) tmp_idyn=' -i_dynamic';;
-	  esac
-  	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  ;;
-	esac
-	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	;;
-      pgCC* | pgcpp*)
-        # Portland Group C++ compiler
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-  	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-        ;;
-      cxx*)
-	# Compaq C++
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	runpath_var=LD_RUN_PATH
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)
-	  # Sun C++ 5.9
-	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-
-	  # Not sure whether something based on
-	  # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	  # would be better.
-	  output_verbose_link_cmd='echo'
-
-	  # Archives containing C++ object files must be created using
-	  # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	  # necessary to make sure instantiated templates are included
-	  # in the archive.
-	  _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	  ;;
-	esac
-	;;
-    esac
-    ;;
-  lynxos*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  m88k*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  mvs*)
-    case $cc_basename in
-      cxx*)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-  netbsd*)
-    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-      wlarc=
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    fi
-    # Workaround some broken pre-1.5 toolchains
-    output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-    ;;
-  openbsd2*)
-    # C++ shared libraries are fairly broken
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  openbsd*)
-    if test -f /usr/libexec/ld.so; then
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-      fi
-      output_verbose_link_cmd='echo'
-    else
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    fi
-    ;;
-  osf3*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Archives containing C++ object files must be created using
-	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-
-	;;
-      RCC*)
-	# Rational C++ 2.4.1
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      cxx*)
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	  # Commands to make compiler produce verbose output that lists
-	  # what "hidden" libraries, object files and flags are used when
-	  # linking a shared library.
-	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
-
-	else
-	  # FIXME: insert proper C++ library support
-	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-    esac
-    ;;
-  osf4* | osf5*)
-    case $cc_basename in
-      KCC*)
-	# Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	# KCC will only create a shared library if the output file
-	# ends with ".so" (or ".sl" for HP-UX), so rename the library
-	# to its proper name (with version) after linking.
-	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Archives containing C++ object files must be created using
-	# the KAI C++ compiler.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
-	;;
-      RCC*)
-	# Rational C++ 2.4.1
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      cxx*)
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	  echo "-hidden">> $lib.exp~
-	  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp  `test -n "$verstring" && echo -set_version	$verstring` -update_registry ${output_objdir}/so_locations -o $lib~
-	  $rm $lib.exp'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	# Commands to make compiler produce verbose output that lists
-	# what "hidden" libraries, object files and flags are used when
-	# linking a shared library.
-	#
-	# There doesn't appear to be a way to prevent this compiler from
-	# explicitly linking system object files so we need to strip them
-	# from the output so that they don't get included in the library
-	# dependencies.
-	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
-	;;
-      *)
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	 _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	  # Commands to make compiler produce verbose output that lists
-	  # what "hidden" libraries, object files and flags are used when
-	  # linking a shared library.
-	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
-
-	else
-	  # FIXME: insert proper C++ library support
-	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-    esac
-    ;;
-  psos*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  sunos4*)
-    case $cc_basename in
-      CC*)
-	# Sun C++ 4.x
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      lcc*)
-	# Lucid
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-  solaris*)
-    case $cc_basename in
-      CC*)
-	# Sun C++ 4.2, 5.x and Centerline C++
-        _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes
-	_LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	$CC -G${allow_undefined_flag}  ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-	case $host_os in
-	  solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	  *)
-	    # The compiler driver will combine and reorder linker options,
-	    # but understands `-z linker_flag'.
-	    # Supported since Solaris 2.6 (maybe 2.5.1?)
-	    _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	    ;;
-	esac
-	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-
-	output_verbose_link_cmd='echo'
-
-	# Archives containing C++ object files must be created using
-	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	# necessary to make sure instantiated templates are included
-	# in the archive.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	;;
-      gcx*)
-	# Green Hills C++ Compiler
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	# The C++ compiler must be used to create the archive.
-	_LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	;;
-      *)
-	# GNU C++ compiler with Solaris linker
-	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
-	  if $CC --version | grep -v '^2\.7' > /dev/null; then
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-		$CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
-	  else
-	    # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	    # platform.
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-		$CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
-	  fi
-
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
-	  case $host_os in
-	  solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	  *)
-	    _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	    ;;
-	  esac
-	fi
-	;;
-    esac
-    ;;
-  sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-    _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    runpath_var='LD_RUN_PATH'
-
-    case $cc_basename in
-      CC*)
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-      *)
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-    esac
-    ;;
-  sysv5* | sco3.2v5* | sco5v6*)
-    # Note: We can NOT use -z defs as we might desire, because we do not
-    # link with -lc, and that would cause any symbols used from libc to
-    # always be unresolved, which means just about no library would
-    # ever link correctly.  If we're not using GNU ld we use -z text
-    # though, which does catch some bad symbols but isn't as heavy-handed
-    # as -z defs.
-    # For security reasons, it is highly recommended that you always
-    # use absolute paths for naming shared libraries, and exclude the
-    # DT_RUNPATH tag from executables and libraries.  But doing so
-    # requires that you compile everything twice, which is a pain.
-    # So that behaviour is only enabled if SCOABSPATH is set to a
-    # non-empty value in the environment.  Most likely only useful for
-    # creating official distributions of packages.
-    # This is a hack until libtool officially supports absolute path
-    # names for shared libraries.
-    _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-    _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-    _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
-    _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-    runpath_var='LD_RUN_PATH'
-
-    case $cc_basename in
-      CC*)
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-      *)
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	;;
-    esac
-    ;;
-  tandem*)
-    case $cc_basename in
-      NCC*)
-	# NonStop-UX NCC 3.20
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-      *)
-	# FIXME: insert proper C++ library support
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	;;
-    esac
-    ;;
-  vxworks*)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-  *)
-    # FIXME: insert proper C++ library support
-    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-    ;;
-esac
-AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
-test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_AC_TAGVAR(GCC, $1)="$GXX"
-_LT_AC_TAGVAR(LD, $1)="$LD"
-
-AC_LIBTOOL_POSTDEP_PREDEP($1)
-AC_LIBTOOL_PROG_COMPILER_PIC($1)
-AC_LIBTOOL_PROG_CC_C_O($1)
-AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
-AC_LIBTOOL_PROG_LD_SHLIBS($1)
-AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
-AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_POP
-CC=$lt_save_CC
-LDCXX=$LD
-LD=$lt_save_LD
-GCC=$lt_save_GCC
-with_gnu_ldcxx=$with_gnu_ld
-with_gnu_ld=$lt_save_with_gnu_ld
-lt_cv_path_LDCXX=$lt_cv_path_LD
-lt_cv_path_LD=$lt_save_path_LD
-lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-])# AC_LIBTOOL_LANG_CXX_CONFIG
-
-# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
-# ------------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],
-[AC_REQUIRE([LT_AC_PROG_SED])dnl
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library.  It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
-int a;
-void foo (void) { a = 0; }
-EOF
-],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-EOF
-],[$1],[F77],[cat > conftest.$ac_ext <<EOF
-      subroutine foo
-      implicit none
-      integer*4 a
-      a=0
-      return
-      end
-EOF
-],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
-public class foo {
-  private int a;
-  public void bar (void) {
-    a = 0;
-  }
-};
-EOF
-])
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  # The `*' in the case matches for architectures that use `case' in
-  # $output_verbose_cmd can trigger glob expansion during the loop
-  # eval without this substitution.
-  output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
-
-  for p in `eval $output_verbose_link_cmd`; do
-    case $p in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" \
-	  || test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
-	   else
-	     _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$_LT_AC_TAGVAR(postdeps, $1)"; then
-	   _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
-	 else
-	   _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
-	 fi
-       fi
-       ;;
-
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$_LT_AC_TAGVAR(predep_objects, $1)"; then
-	   _LT_AC_TAGVAR(predep_objects, $1)="$p"
-	 else
-	   _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
-	 fi
-       else
-	 if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
-	   _LT_AC_TAGVAR(postdep_objects, $1)="$p"
-	 else
-	   _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_TAGVAR(postdep_objects, $1) $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$rm -f confest.$objext
-
-_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)=
-if test -n "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
-  _LT_AC_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_AC_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-
-# PORTME: override above test on systems where it is broken
-ifelse([$1],[CXX],
-[case $host_os in
-interix[[3-9]]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  _LT_AC_TAGVAR(predep_objects,$1)=
-  _LT_AC_TAGVAR(postdep_objects,$1)=
-  _LT_AC_TAGVAR(postdeps,$1)=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-    #
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-])
-case " $_LT_AC_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
-])# AC_LIBTOOL_POSTDEP_PREDEP
-
-# AC_LIBTOOL_LANG_F77_CONFIG
-# --------------------------
-# Ensure that the configuration vars for the C compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
-AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
-[AC_REQUIRE([AC_PROG_F77])
-AC_LANG_PUSH(Fortran 77)
-
-_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_AC_TAGVAR(allow_undefined_flag, $1)=
-_LT_AC_TAGVAR(always_export_symbols, $1)=no
-_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
-_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_AC_TAGVAR(hardcode_direct, $1)=no
-_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
-_LT_AC_TAGVAR(hardcode_automatic, $1)=no
-_LT_AC_TAGVAR(module_cmds, $1)=
-_LT_AC_TAGVAR(module_expsym_cmds, $1)=
-_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_AC_TAGVAR(no_undefined_flag, $1)=
-_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="\
-      program t
-      end
-"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${F77-"f77"}
-compiler=$CC
-_LT_AC_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-
-AC_MSG_CHECKING([if libtool supports shared libraries])
-AC_MSG_RESULT([$can_build_shared])
-
-AC_MSG_CHECKING([whether to build shared libraries])
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case $host_os in
-aix3*)
-  test "$enable_shared" = yes && enable_static=no
-  if test -n "$RANLIB"; then
-    archive_cmds="$archive_cmds~\$RANLIB \$lib"
-    postinstall_cmds='$RANLIB $lib'
-  fi
-  ;;
-aix[[4-9]]*)
-  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-    test "$enable_shared" = yes && enable_static=no
-  fi
-  ;;
-esac
-AC_MSG_RESULT([$enable_shared])
-
-AC_MSG_CHECKING([whether to build static libraries])
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-AC_MSG_RESULT([$enable_static])
-
-_LT_AC_TAGVAR(GCC, $1)="$G77"
-_LT_AC_TAGVAR(LD, $1)="$LD"
-
-AC_LIBTOOL_PROG_COMPILER_PIC($1)
-AC_LIBTOOL_PROG_CC_C_O($1)
-AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
-AC_LIBTOOL_PROG_LD_SHLIBS($1)
-AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
-AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_POP
-CC="$lt_save_CC"
-])# AC_LIBTOOL_LANG_F77_CONFIG
-
-
-# AC_LIBTOOL_LANG_GCJ_CONFIG
-# --------------------------
-# Ensure that the configuration vars for the C compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
-AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
-[AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${GCJ-"gcj"}
-compiler=$CC
-_LT_AC_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-
-AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
-AC_LIBTOOL_PROG_COMPILER_PIC($1)
-AC_LIBTOOL_PROG_CC_C_O($1)
-AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
-AC_LIBTOOL_PROG_LD_SHLIBS($1)
-AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
-AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_RESTORE
-CC="$lt_save_CC"
-])# AC_LIBTOOL_LANG_GCJ_CONFIG
-
-
-# AC_LIBTOOL_LANG_RC_CONFIG
-# -------------------------
-# Ensure that the configuration vars for the Windows resource compiler are
-# suitably defined.  Those variables are subsequently used by
-# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
-AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
-AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
-[AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_AC_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_AC_SYS_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-CC=${RC-"windres"}
-compiler=$CC
-_LT_AC_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-AC_LIBTOOL_CONFIG($1)
-
-AC_LANG_RESTORE
-CC="$lt_save_CC"
-])# AC_LIBTOOL_LANG_RC_CONFIG
-
-
-# AC_LIBTOOL_CONFIG([TAGNAME])
-# ----------------------------
-# If TAGNAME is not passed, then create an initial libtool script
-# with a default configuration from the untagged config vars.  Otherwise
-# add code to config.status for appending the configuration named by
-# TAGNAME from the matching tagged config vars.
-AC_DEFUN([AC_LIBTOOL_CONFIG],
-[# The else clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
-  # See if we are running on zsh, and set the options which allow our commands through
-  # without removal of \ escapes.
-  if test -n "${ZSH_VERSION+set}" ; then
-    setopt NO_GLOB_SUBST
-  fi
-  # Now quote all the things that may contain metacharacters while being
-  # careful not to overquote the AC_SUBSTed values.  We take copies of the
-  # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
-    SED SHELL STRIP \
-    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
-    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
-    deplibs_check_method reload_flag reload_cmds need_locks \
-    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
-    lt_cv_sys_global_symbol_to_c_name_address \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    old_postinstall_cmds old_postuninstall_cmds \
-    _LT_AC_TAGVAR(compiler, $1) \
-    _LT_AC_TAGVAR(CC, $1) \
-    _LT_AC_TAGVAR(LD, $1) \
-    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
-    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
-    _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
-    _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
-    _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
-    _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
-    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
-    _LT_AC_TAGVAR(old_archive_cmds, $1) \
-    _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
-    _LT_AC_TAGVAR(predep_objects, $1) \
-    _LT_AC_TAGVAR(postdep_objects, $1) \
-    _LT_AC_TAGVAR(predeps, $1) \
-    _LT_AC_TAGVAR(postdeps, $1) \
-    _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
-    _LT_AC_TAGVAR(compiler_lib_search_dirs, $1) \
-    _LT_AC_TAGVAR(archive_cmds, $1) \
-    _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
-    _LT_AC_TAGVAR(postinstall_cmds, $1) \
-    _LT_AC_TAGVAR(postuninstall_cmds, $1) \
-    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
-    _LT_AC_TAGVAR(allow_undefined_flag, $1) \
-    _LT_AC_TAGVAR(no_undefined_flag, $1) \
-    _LT_AC_TAGVAR(export_symbols_cmds, $1) \
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
-    _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
-    _LT_AC_TAGVAR(hardcode_automatic, $1) \
-    _LT_AC_TAGVAR(module_cmds, $1) \
-    _LT_AC_TAGVAR(module_expsym_cmds, $1) \
-    _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
-    _LT_AC_TAGVAR(fix_srcfile_path, $1) \
-    _LT_AC_TAGVAR(exclude_expsyms, $1) \
-    _LT_AC_TAGVAR(include_expsyms, $1); do
-
-    case $var in
-    _LT_AC_TAGVAR(old_archive_cmds, $1) | \
-    _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
-    _LT_AC_TAGVAR(archive_cmds, $1) | \
-    _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
-    _LT_AC_TAGVAR(module_cmds, $1) | \
-    _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
-    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
-    _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
-    extract_expsyms_cmds | reload_cmds | finish_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
-    *)
-      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
-      ;;
-    esac
-  done
-
-  case $lt_echo in
-  *'\[$]0 --fallback-echo"')
-    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
-    ;;
-  esac
-
-ifelse([$1], [],
-  [cfgfile="${ofile}T"
-  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
-  $rm -f "$cfgfile"
-  AC_MSG_NOTICE([creating $ofile])],
-  [cfgfile="$ofile"])
-
-  cat <<__EOF__ >> "$cfgfile"
-ifelse([$1], [],
-[#! $SHELL
-
-# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
-# Free Software Foundation, Inc.
-#
-# This file is part of GNU Libtool:
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="$SED -e 1s/^X//"
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-# The names of the tagged configurations supported by this script.
-available_tags=
-
-# ### BEGIN LIBTOOL CONFIG],
-[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
-
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
-
-# Whether or not to disallow shared libs when runtime libs are static
-allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# A C compiler.
-LTCC=$lt_LTCC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_LTCFLAGS
-
-# A language-specific compiler.
-CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
-
-# Is the compiler the GNU C compiler?
-with_gcc=$_LT_AC_TAGVAR(GCC, $1)
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# The linker used to build libraries.
-LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
-
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
-
-# A BSD-compatible nm program.
-NM=$lt_NM
-
-# A symbol stripping program
-STRIP=$lt_STRIP
-
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
-
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
-
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
-
-# Used on cygwin: assembler.
-AS="$AS"
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# How to pass a linker flag through the compiler.
-wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
-
-# Object file suffix (normally "o").
-objext="$ac_objext"
-
-# Old archive suffix (normally "a").
-libext="$libext"
-
-# Shared library suffix (normally ".so").
-shrext_cmds='$shrext_cmds'
-
-# Executable file suffix (normally "").
-exeext="$exeext"
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
-pic_mode=$pic_mode
-
-# What is the maximum length of a command?
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
-
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
-
-# Library versioning type.
-version_type=$version_type
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
-
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
-archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to build a loadable module (assumed same as above if empty)
-module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
-module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
-
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
-
-# Dependencies to place before the objects being linked to create a
-# shared library.
-predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
-
-# Dependencies to place after the objects being linked to create a
-# shared library.
-postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
-
-# The directories searched by this compiler when creating a shared
-# library
-compiler_lib_search_dirs=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
-
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
-
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
-
-# If ld is used when linking, flag to hardcode \$libdir into
-# a binary during linking. This must work even if \$libdir does
-# not exist.
-hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
-
-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
-
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
-
-# Set to yes if building a shared library automatically hardcodes DIR into the library
-# and all subsequent libraries and executables linked against it.
-hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1)
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
-
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path
-
-# Set to yes if exported symbols are required.
-always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
-
-# Symbols that must always be exported.
-include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
-
-ifelse([$1],[],
-[# ### END LIBTOOL CONFIG],
-[# ### END LIBTOOL TAG CONFIG: $tagname])
-
-__EOF__
-
-ifelse([$1],[], [
-  case $host_os in
-  aix3*)
-    cat <<\EOF >> "$cfgfile"
-
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-EOF
-    ;;
-  esac
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" || \
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-])
-else
-  # If there is no Makefile yet, we rely on a make rule to execute
-  # `config.status --recheck' to rerun these tests and create the
-  # libtool script then.
-  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
-  if test -f "$ltmain_in"; then
-    test -f Makefile && make "$ltmain"
-  fi
-fi
-])# AC_LIBTOOL_CONFIG
-
-
-# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------------------
-AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
-[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
-
-_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
-  _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-
-  AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
-    lt_cv_prog_compiler_rtti_exceptions,
-    [-fno-rtti -fno-exceptions], [],
-    [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
-
-
-# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
-# ---------------------------------
-AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
-[AC_REQUIRE([AC_CANONICAL_HOST])
-AC_REQUIRE([LT_AC_PROG_SED])
-AC_REQUIRE([AC_PROG_NM])
-AC_REQUIRE([AC_OBJEXT])
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Transform an extracted symbol line into a proper C declaration
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[[BCDT]]'
-  ;;
-cygwin* | mingw* | pw32*)
-  symcode='[[ABCDGISTW]]'
-  ;;
-hpux*) # Its linker distinguishes data from code symbols
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDEGRST]]'
-  fi
-  lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-  lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-  ;;
-linux* | k*bsd*-gnu)
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDGIRSTW]]'
-    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[[BCDEGRST]]'
-  ;;
-osf*)
-  symcode='[[BCDEGQRST]]'
-  ;;
-solaris*)
-  symcode='[[BDRT]]'
-  ;;
-sco3.2v5*)
-  symcode='[[DT]]'
-  ;;
-sysv4.2uw2*)
-  symcode='[[DT]]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[[ABDT]]'
-  ;;
-sysv4)
-  symcode='[[DFNSTU]]'
-  ;;
-esac
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Try without a prefix undercore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ 	]]\($symcode$symcode*\)[[ 	]][[ 	]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-EOF
-
-  if AC_TRY_EVAL(ac_compile); then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if grep ' nm_test_var$' "$nlist" >/dev/null; then
-	if grep ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
-
-	  cat <<EOF >> conftest.$ac_ext
-#if defined (__STDC__) && __STDC__
-# define lt_ptr_t void *
-#else
-# define lt_ptr_t char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-const struct {
-  const char *name;
-  lt_ptr_t address;
-}
-lt_preloaded_symbols[[]] =
-{
-EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
-	  cat <<\EOF >> conftest.$ac_ext
-  {0, (lt_ptr_t) 0}
-};
-
-#ifdef __cplusplus
-}
-#endif
-EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
-    fi
-  else
-    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  AC_MSG_RESULT(failed)
-else
-  AC_MSG_RESULT(ok)
-fi
-]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
-
-
-# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
-# ---------------------------------------
-AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
-[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
-
-AC_MSG_CHECKING([for $compiler option to produce PIC])
- ifelse([$1],[CXX],[
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-      ;;
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-      ;;
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	;;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-    *)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[[4-9]]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	else
-	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-       darwin*)
-         # PIC is the default on this platform
-         # Common symbols not allowed in MH_DYLIB files
-         case $cc_basename in
-           xlc*)
-           _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
-           _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-           ;;
-         esac
-       ;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    ;;
-	  icpc* | ecpc*)
-	    # Intel C++
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler.
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-	;;
-    esac
-  fi
-],
-[
-  if test "$GCC" = yes; then
-    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      # FIXME: we need at least 68020 code to build shared libraries, but
-      # adding the `-m68020' flag to GCC prevents building anything better,
-      # like `-m68040'.
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      enable_shared=no
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-
-    hpux*)
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-
-    *)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      else
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-      darwin*)
-        # PIC is the default on this platform
-        # Common symbols not allowed in MH_DYLIB files
-       case $cc_basename in
-         xlc*)
-         _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
-         _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-         ;;
-       esac
-       ;;
-
-    mingw* | cygwin* | pw32* | os2*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      m4_if([$1], [GCJ], [],
-	[_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC (with -KPIC) is the default.
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    newsos6)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    linux* | k*bsd*-gnu)
-      case $cc_basename in
-      icc* | ecc*)
-	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-        ;;
-      ccc*)
-        _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-        # All Alpha code is PIC.
-        _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-        ;;
-      *)
-        case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)
-	  # Sun C 5.9
-	  _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  ;;
-	*Sun\ F*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=''
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    osf3* | osf4* | osf5*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # All OSF/1 code is PIC.
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    rdos*)
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    solaris*)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
-      *)
-	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
-	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    unicos*)
-      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-
-    uts4*)
-      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *)
-      _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-    esac
-  fi
-])
-AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
-  AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
-    _LT_AC_TAGVAR(lt_cv_prog_compiler_pic_works, $1),
-    [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
-    [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
-     "" | " "*) ;;
-     *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
-     esac],
-    [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-     _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
-    ;;
-  *)
-    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
-    ;;
-esac
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\"
-AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
-  _LT_AC_TAGVAR(lt_cv_prog_compiler_static_works, $1),
-  $lt_tmp_static_flag,
-  [],
-  [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
-])
-
-
-# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
-# ------------------------------------
-# See if the linker supports building shared libraries.
-AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
-[AC_REQUIRE([LT_AC_PROG_SED])dnl
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-ifelse([$1],[CXX],[
-  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  case $host_os in
-  aix[[4-9]]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
-    else
-      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-  ;;
-  cygwin* | mingw*)
-    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
-  ;;
-  *)
-    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  esac
-  _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-],[
-  runpath_var=
-  _LT_AC_TAGVAR(allow_undefined_flag, $1)=
-  _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-  _LT_AC_TAGVAR(archive_cmds, $1)=
-  _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
-  _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
-  _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
-  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
-  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-  _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
-  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-  _LT_AC_TAGVAR(hardcode_direct, $1)=no
-  _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
-  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
-  _LT_AC_TAGVAR(hardcode_automatic, $1)=no
-  _LT_AC_TAGVAR(module_cmds, $1)=
-  _LT_AC_TAGVAR(module_expsym_cmds, $1)=
-  _LT_AC_TAGVAR(always_export_symbols, $1)=no
-  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  _LT_AC_TAGVAR(include_expsyms, $1)=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-dnl Note also adjust exclude_expsyms for C++ above.
-  extract_expsyms_cmds=
-  # Just being paranoid about ensuring that cc_basename is set.
-  _LT_CC_BASENAME([$compiler])
-  case $host_os in
-  cygwin* | mingw* | pw32*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  _LT_AC_TAGVAR(ld_shlibs, $1)=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-    _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
-	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-      else
-  	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>/dev/null` in
-      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[[3-9]]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	cat <<EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-EOF
-      fi
-      ;;
-
-    amigaos*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-
-      # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
-      # that the semantics of dynamic libraries on AmigaOS, at least up
-      # to version 4, is to share data among multiple programs linked
-      # with the same dynamic library.  Since this doesn't match the
-      # behavior of shared libraries on other platforms, we can't use
-      # them.
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32*)
-      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-      # as there is no search path for DLLs.
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_AC_TAGVAR(always_export_symbols, $1)=no
-      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    interix[[3-9]]*)
-      _LT_AC_TAGVAR(hardcode_direct, $1)=no
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | k*bsd*-gnu)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	tmp_addflag=
-	case $cc_basename,$host_cpu in
-	pgcc*)				# Portland Group C compiler
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	*)
-	  tmp_sharedflag='-shared' ;;
-	esac
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-	if test $supports_anon_versioning = yes; then
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~
-  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-  $echo "local: *; };" >> $output_objdir/$libname.ver~
-	  $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	fi
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	cat <<EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-EOF
-      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
-	    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
-	    _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
-	  else
-	    _LT_AC_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-
-    if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then
-      runpath_var=
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_AC_TAGVAR(always_export_symbols, $1)=yes
-      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	_LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
-      fi
-      ;;
-
-    aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
-	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
-	else
-	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	  for ld_flag in $LDFLAGS; do
-  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-  	    aix_use_runtimelinking=yes
-  	    break
-  	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      _LT_AC_TAGVAR(archive_cmds, $1)=''
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[[012]]|aix4.[[012]].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" && \
-  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
-	  then
-  	  # We have reworked collect2
-  	  :
-	  else
-  	  # We have old collect2
-  	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
-  	  # It fails to find uninstalled libraries when the uninstalled
-  	  # path is not listed in the libpath.  Setting hardcode_minus_L
-  	  # to unsupported forces relinking
-  	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-  	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-  	  _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-  	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      _LT_AC_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
-       # Determine the default libpath from the value encoded in an empty executable.
-       _LT_AC_SYS_LIBPATH_AIX
-       _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-       else
-	if test "$host_cpu" = ia64; then
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	  _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an empty executable.
-	 _LT_AC_SYS_LIBPATH_AIX
-	 _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      # see comment about different semantics on the GNU ld section
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    bsdi[[45]]*)
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
-      # FIXME: Should let the user specify the lib program.
-      _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
-      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      ;;
-
-    darwin* | rhapsody*)
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
-      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_AC_TAGVAR(hardcode_direct, $1)=no
-      _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-    if test "$GCC" = yes ; then
-    	output_verbose_link_cmd='echo'
-        _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-        _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-        _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-        _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-    else
-      case $cc_basename in
-        xlc*)
-         output_verbose_link_cmd='echo'
-         _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
-         _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
-          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
-         _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
-          ;;
-       *)
-         _LT_AC_TAGVAR(ld_shlibs, $1)=no
-          ;;
-      esac
-    fi
-      ;;
-
-    dgux*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    freebsd1*)
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	_LT_AC_TAGVAR(hardcode_direct, $1)=yes
-	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	_LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
-	  _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  ;;
-	*)
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    newsos6)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	_LT_AC_TAGVAR(hardcode_direct, $1)=yes
-	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-	if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-        fi
-      else
-	_LT_AC_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    os2*)
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      else
-	_LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
-	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    solaris*)
-      _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
-      else
-	wlarc=''
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      case $host_os in
-      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
- 	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
-      _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=no
-        ;;
-	motorola)
-	  _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4.3*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	_LT_AC_TAGVAR(ld_shlibs, $1)=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      _LT_AC_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    esac
-  fi
-])
-AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
-test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
-  # Assume -lc should be added
-  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $_LT_AC_TAGVAR(archive_cmds, $1) in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
-      $rm conftest*
-      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
-	pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
-        _LT_AC_TAGVAR(allow_undefined_flag, $1)=
-        if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
-        then
-	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
-        else
-	  _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
-        fi
-        _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $rm conftest*
-      AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
-      ;;
-    esac
-  fi
-  ;;
-esac
-])# AC_LIBTOOL_PROG_LD_SHLIBS
-
-
-# _LT_AC_FILE_LTDLL_C
-# -------------------
-# Be careful that the start marker always follows a newline.
-AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
-# /* ltdll.c starts here */
-# #define WIN32_LEAN_AND_MEAN
-# #include <windows.h>
-# #undef WIN32_LEAN_AND_MEAN
-# #include <stdio.h>
-#
-# #ifndef __CYGWIN__
-# #  ifdef __CYGWIN32__
-# #    define __CYGWIN__ __CYGWIN32__
-# #  endif
-# #endif
-#
-# #ifdef __cplusplus
-# extern "C" {
-# #endif
-# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
-# #ifdef __cplusplus
-# }
-# #endif
-#
-# #ifdef __CYGWIN__
-# #include <cygwin/cygwin_dll.h>
-# DECLARE_CYGWIN_DLL( DllMain );
-# #endif
-# HINSTANCE __hDllInstance_base;
-#
-# BOOL APIENTRY
-# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
-# {
-#   __hDllInstance_base = hInst;
-#   return TRUE;
-# }
-# /* ltdll.c ends here */
-])# _LT_AC_FILE_LTDLL_C
-
-
-# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
-# ---------------------------------
-AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
-
-
-# old names
-AC_DEFUN([AM_PROG_LIBTOOL],   [AC_PROG_LIBTOOL])
-AC_DEFUN([AM_ENABLE_SHARED],  [AC_ENABLE_SHARED($@)])
-AC_DEFUN([AM_ENABLE_STATIC],  [AC_ENABLE_STATIC($@)])
-AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-AC_DEFUN([AM_PROG_LD],        [AC_PROG_LD])
-AC_DEFUN([AM_PROG_NM],        [AC_PROG_NM])
-
-# This is just to silence aclocal about the macro not being used
-ifelse([AC_DISABLE_FAST_INSTALL])
-
-AC_DEFUN([LT_AC_PROG_GCJ],
-[AC_CHECK_TOOL(GCJ, gcj, no)
-  test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
-  AC_SUBST(GCJFLAGS)
-])
-
-AC_DEFUN([LT_AC_PROG_RC],
-[AC_CHECK_TOOL(RC, windres, no)
-])
-
-
-# Cheap backport of AS_EXECUTABLE_P and required macros
-# from Autoconf 2.59; we should not use $as_executable_p directly.
-
-# _AS_TEST_PREPARE
-# ----------------
-m4_ifndef([_AS_TEST_PREPARE],
-[m4_defun([_AS_TEST_PREPARE],
-[if test -x / >/dev/null 2>&1; then
-  as_executable_p='test -x'
-else
-  as_executable_p='test -f'
-fi
-])])# _AS_TEST_PREPARE
-
-# AS_EXECUTABLE_P
-# ---------------
-# Check whether a file is executable.
-m4_ifndef([AS_EXECUTABLE_P],
-[m4_defun([AS_EXECUTABLE_P],
-[AS_REQUIRE([_AS_TEST_PREPARE])dnl
-$as_executable_p $1[]dnl
-])])# AS_EXECUTABLE_P
-
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-# LT_AC_PROG_SED
-# --------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible.  Prefer GNU sed if found.
-AC_DEFUN([LT_AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if AS_EXECUTABLE_P(["$as_dir/$lt_ac_prog$ac_exec_ext"]); then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.10'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.10.1], [],
-      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too.  Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.10.1])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 8
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery.  Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
-               [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_$1_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
-  fi
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    case $depmode in
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    none) break ;;
-    esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
-    if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_$1_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-])
-
-# Generate code to set up dependency tracking.              -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 3
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[for mf in $CONFIG_FILES; do
-  # Strip MF so we end up with the name of the file.
-  mf=`echo "$mf" | sed -e 's/:.*$//'`
-  # Check whether this is an Automake generated Makefile or not.
-  # We used to match only the files named `Makefile.in', but
-  # some people rename them; so instead we look at the file content.
-  # Grep'ing the first line is not enough: some people post-process
-  # each Makefile.in and add a new line on top of each file to say so.
-  # Grep'ing the whole file is not good either: AIX grep has a line
-  # limit of 2048, but all sed's we know have understand at least 4000.
-  if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-    dirpart=`AS_DIRNAME("$mf")`
-  else
-    continue
-  fi
-  # Extract the definition of DEPDIR, am__include, and am__quote
-  # from the Makefile without running `make'.
-  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-  test -z "$DEPDIR" && continue
-  am__include=`sed -n 's/^am__include = //p' < "$mf"`
-  test -z "am__include" && continue
-  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-  # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n 's/^U = //p' < "$mf"`
-  # Find all dependency output files, they are included files with
-  # $(DEPDIR) in their names.  We invoke sed twice because it is the
-  # simplest approach to changing $(DEPDIR) to its actual value in the
-  # expansion.
-  for file in `sed -n "
-    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-    # Make sure the directory exists.
-    test -f "$dirpart/$file" && continue
-    fdir=`AS_DIRNAME(["$file"])`
-    AS_MKDIR_P([$dirpart/$fdir])
-    # echo "creating $dirpart/$file"
-    echo '# dummy' > "$dirpart/$file"
-  done
-done
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
-     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 8
-
-# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
-AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 13
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.60])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
-  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AM_PROG_INSTALL_SH
-AM_PROG_INSTALL_STRIP
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-	      		     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-                  [_AM_DEPENDENCIES(CC)],
-                  [define([AC_PROG_CC],
-                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-                  [_AM_DEPENDENCIES(CXX)],
-                  [define([AC_PROG_CXX],
-                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-                  [_AM_DEPENDENCIES(OBJC)],
-                  [define([AC_PROG_OBJC],
-                          defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
-AC_SUBST(install_sh)])
-
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot.  For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
-# Check to see how 'make' treats includes.	            -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 3
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo done
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# We grep out `Entering directory' and `Leaving directory'
-# messages which can occur if `w' ends up in MAKEFLAGS.
-# In particular we don't look at `^make:' because GNU make might
-# be invoked under some other name (usually "gmake"), in which
-# case it prints its new name instead of `make'.
-if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
-   am__include=include
-   am__quote=
-   _am_result=GNU
-fi
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
-      am__include=.include
-      am__quote="\""
-      _am_result=BSD
-   fi
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 3
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# ------------------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t $srcdir/configure conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
diff --git a/third_party/libevent/autogen.sh b/third_party/libevent/autogen.sh
old mode 100644
new mode 100755
diff --git a/third_party/libevent/compat/sys/_time.h b/third_party/libevent/compat/sys/_time.h
deleted file mode 100644
index 8cabb0d..0000000
--- a/third_party/libevent/compat/sys/_time.h
+++ /dev/null
@@ -1,163 +0,0 @@
-/*	$OpenBSD: time.h,v 1.11 2000/10/10 13:36:48 itojun Exp $	*/
-/*	$NetBSD: time.h,v 1.18 1996/04/23 10:29:33 mycroft Exp $	*/
-
-/*
- * Copyright (c) 1982, 1986, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)time.h	8.2 (Berkeley) 7/10/94
- */
-
-#ifndef _SYS_TIME_H_
-#define _SYS_TIME_H_
-
-#include <sys/types.h>
-
-/*
- * Structure returned by gettimeofday(2) system call,
- * and used in other calls.
- */
-struct timeval {
-	long	tv_sec;		/* seconds */
-	long	tv_usec;	/* and microseconds */
-};
-
-/*
- * Structure defined by POSIX.1b to be like a timeval.
- */
-struct timespec {
-	time_t	tv_sec;		/* seconds */
-	long	tv_nsec;	/* and nanoseconds */
-};
-
-#define	TIMEVAL_TO_TIMESPEC(tv, ts) {					\
-	(ts)->tv_sec = (tv)->tv_sec;					\
-	(ts)->tv_nsec = (tv)->tv_usec * 1000;				\
-}
-#define	TIMESPEC_TO_TIMEVAL(tv, ts) {					\
-	(tv)->tv_sec = (ts)->tv_sec;					\
-	(tv)->tv_usec = (ts)->tv_nsec / 1000;				\
-}
-
-struct timezone {
-	int	tz_minuteswest;	/* minutes west of Greenwich */
-	int	tz_dsttime;	/* type of dst correction */
-};
-#define	DST_NONE	0	/* not on dst */
-#define	DST_USA		1	/* USA style dst */
-#define	DST_AUST	2	/* Australian style dst */
-#define	DST_WET		3	/* Western European dst */
-#define	DST_MET		4	/* Middle European dst */
-#define	DST_EET		5	/* Eastern European dst */
-#define	DST_CAN		6	/* Canada */
-
-/* Operations on timevals. */
-#define	timerclear(tvp)		(tvp)->tv_sec = (tvp)->tv_usec = 0
-#define	timerisset(tvp)		((tvp)->tv_sec || (tvp)->tv_usec)
-#define	timercmp(tvp, uvp, cmp)						\
-	(((tvp)->tv_sec == (uvp)->tv_sec) ?				\
-	    ((tvp)->tv_usec cmp (uvp)->tv_usec) :			\
-	    ((tvp)->tv_sec cmp (uvp)->tv_sec))
-#define	timeradd(tvp, uvp, vvp)						\
-	do {								\
-		(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;		\
-		(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec;	\
-		if ((vvp)->tv_usec >= 1000000) {			\
-			(vvp)->tv_sec++;				\
-			(vvp)->tv_usec -= 1000000;			\
-		}							\
-	} while (0)
-#define	timersub(tvp, uvp, vvp)						\
-	do {								\
-		(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;		\
-		(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;	\
-		if ((vvp)->tv_usec < 0) {				\
-			(vvp)->tv_sec--;				\
-			(vvp)->tv_usec += 1000000;			\
-		}							\
-	} while (0)
-
-/* Operations on timespecs. */
-#define	timespecclear(tsp)		(tsp)->tv_sec = (tsp)->tv_nsec = 0
-#define	timespecisset(tsp)		((tsp)->tv_sec || (tsp)->tv_nsec)
-#define	timespeccmp(tsp, usp, cmp)					\
-	(((tsp)->tv_sec == (usp)->tv_sec) ?				\
-	    ((tsp)->tv_nsec cmp (usp)->tv_nsec) :			\
-	    ((tsp)->tv_sec cmp (usp)->tv_sec))
-#define	timespecadd(tsp, usp, vsp)					\
-	do {								\
-		(vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec;		\
-		(vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec;	\
-		if ((vsp)->tv_nsec >= 1000000000L) {			\
-			(vsp)->tv_sec++;				\
-			(vsp)->tv_nsec -= 1000000000L;			\
-		}							\
-	} while (0)
-#define	timespecsub(tsp, usp, vsp)					\
-	do {								\
-		(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec;		\
-		(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec;	\
-		if ((vsp)->tv_nsec < 0) {				\
-			(vsp)->tv_sec--;				\
-			(vsp)->tv_nsec += 1000000000L;			\
-		}							\
-	} while (0)
-
-/*
- * Names of the interval timers, and structure
- * defining a timer setting.
- */
-#define	ITIMER_REAL	0
-#define	ITIMER_VIRTUAL	1
-#define	ITIMER_PROF	2
-
-struct	itimerval {
-	struct	timeval it_interval;	/* timer interval */
-	struct	timeval it_value;	/* current value */
-};
-
-/*
- * Getkerninfo clock information structure
- */
-struct clockinfo {
-	int	hz;		/* clock frequency */
-	int	tick;		/* micro-seconds per hz tick */
-	int	tickadj;	/* clock skew rate for adjtime() */
-	int	stathz;		/* statistics clock frequency */
-	int	profhz;		/* profiling clock frequency */
-};
-
-#define CLOCK_REALTIME	0
-#define CLOCK_VIRTUAL	1
-#define CLOCK_PROF	2
-
-#define TIMER_RELTIME	0x0	/* relative timer */
-#define TIMER_ABSTIME	0x1	/* absolute timer */
-
-/* --- stuff got cut here - niels --- */
-
-#endif /* !_SYS_TIME_H_ */
diff --git a/third_party/libevent/config.guess b/third_party/libevent/config.guess
deleted file mode 100644
index f32079a..0000000
--- a/third_party/libevent/config.guess
+++ /dev/null
@@ -1,1526 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
-#   Free Software Foundation, Inc.
-
-timestamp='2008-01-23'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner <per@bothner.com>.
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    sh5el) machine=sh5le-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep __ELF__ >/dev/null
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-	        os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
-	case "$ALPHA_CPU_TYPE" in
-	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
-	esac
-	# A Pn.n version is a patched version.
-	# A Vn.n version is a released version.
-	# A Tn.n version is a released field test version.
-	# A Xn.n version is an unreleased experimental baselevel.
-	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	exit ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-        echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	exit ;;
-    sun*:*:4.2BSD:*)
-	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
- 	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[456])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-                        esac ;;
-                    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
-
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
-EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
-		    test -z "$HP_ARCH" && HP_ARCH=hppa
-		fi ;;
-	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep __LP64__ >/dev/null
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-        exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-        exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-        exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-        exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-        exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit ;;
-    5000:UNIX_System_V:4.*:*)
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    *:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    *:Interix*:[3456]*)
-    	case ${UNAME_MACHINE} in
-	    x86)
-		echo i586-pc-interix${UNAME_RELEASE}
-		exit ;;
-	    EM64T | authenticamd)
-		echo x86_64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	    IA64)
-		echo ia64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	exit ;;
-    *:GNU/*:*:*)
-	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    arm*:Linux:*:*)
-	eval $set_cc_for_build
-	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
-	    | grep -q __ARM_EABI__
-	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
-	else
-	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
-	fi
-	exit ;;
-    avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    cris:Linux:*:*)
-	echo cris-axis-linux-gnu
-	exit ;;
-    crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
-	exit ;;
-    frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    mips:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips
-	#undef mipsel
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mipsel
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^CPU/{
-		s: ::g
-		p
-	    }'`"
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips64
-	#undef mips64el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mips64el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips64
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^CPU/{
-		s: ::g
-		p
-	    }'`"
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
-	esac
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
-	exit ;;
-    x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
-	exit ;;
-    xtensa*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    i*86:Linux:*:*)
-	# The BFD linker knows what the default object file format is, so
-	# first see if it will tell us. cd to the root directory to prevent
-	# problems with other programs or directories called `ld' in the path.
-	# Set LC_ALL=C to ensure ld outputs messages in English.
-	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
-			 | sed -ne '/supported targets:/!d
-				    s/[ 	][ 	]*/ /g
-				    s/.*supported targets: *//
-				    s/ .*//
-				    p'`
-        case "$ld_supported_targets" in
-	  elf32-i386)
-		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
-		;;
-	  a.out-i386-linux)
-		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-		exit ;;
-	  coff-i386)
-		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-		exit ;;
-	  "")
-		# Either a pre-BFD a.out linker (linux-gnuoldld) or
-		# one that does not give us useful --help.
-		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
-		exit ;;
-	esac
-	# Determine whether the default compiler is a.out or elf
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <features.h>
-	#ifdef __ELF__
-	# ifdef __GLIBC__
-	#  if __GLIBC__ >= 2
-	LIBC=gnu
-	#  else
-	LIBC=gnulibc1
-	#  endif
-	# else
-	LIBC=gnulibc1
-	# endif
-	#else
-	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
-	LIBC=gnu
-	#else
-	LIBC=gnuaout
-	#endif
-	#endif
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^LIBC/{
-		s: ::g
-		p
-	    }'`"
-	test x"${LIBC}" != x && {
-		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-		exit
-	}
-	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
-	;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i386.
-	echo i386-pc-msdosdjgpp
-        exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes@openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
-	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-        exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-7:SUPER-UX:*:*)
-	echo sx7-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8:SUPER-UX:*:*)
-	echo sx8-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8R:SUPER-UX:*:*)
-	echo sx8r-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "uname -m" is not consistent, so use $cputype instead. 386
-	# is converted to i386 for consistency with other x86
-	# operating systems.
-	if test "$cputype" = "386"; then
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-    i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/third_party/libevent/config.h.in b/third_party/libevent/config.h.in
deleted file mode 100644
index 149942c..0000000
--- a/third_party/libevent/config.h.in
+++ /dev/null
@@ -1,265 +0,0 @@
-/* config.h.in.  Generated from configure.in by autoheader.  */
-
-/* Define if clock_gettime is available in libc */
-#undef DNS_USE_CPU_CLOCK_FOR_ID
-
-/* Define is no secure id variant is available */
-#undef DNS_USE_GETTIMEOFDAY_FOR_ID
-
-/* Define to 1 if you have the `clock_gettime' function. */
-#undef HAVE_CLOCK_GETTIME
-
-/* Define if /dev/poll is available */
-#undef HAVE_DEVPOLL
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define if your system supports the epoll system calls */
-#undef HAVE_EPOLL
-
-/* Define to 1 if you have the `epoll_ctl' function. */
-#undef HAVE_EPOLL_CTL
-
-/* Define if your system supports event ports */
-#undef HAVE_EVENT_PORTS
-
-/* Define to 1 if you have the `fcntl' function. */
-#undef HAVE_FCNTL
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#undef HAVE_FCNTL_H
-
-/* Define to 1 if the system has the type `fd_mask'. */
-#undef HAVE_FD_MASK
-
-/* Define to 1 if you have the `getaddrinfo' function. */
-#undef HAVE_GETADDRINFO
-
-/* Define to 1 if you have the `getegid' function. */
-#undef HAVE_GETEGID
-
-/* Define to 1 if you have the `geteuid' function. */
-#undef HAVE_GETEUID
-
-/* Define to 1 if you have the `getnameinfo' function. */
-#undef HAVE_GETNAMEINFO
-
-/* Define to 1 if you have the `gettimeofday' function. */
-#undef HAVE_GETTIMEOFDAY
-
-/* Define to 1 if you have the `inet_ntop' function. */
-#undef HAVE_INET_NTOP
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the `issetugid' function. */
-#undef HAVE_ISSETUGID
-
-/* Define to 1 if you have the `kqueue' function. */
-#undef HAVE_KQUEUE
-
-/* Define to 1 if you have the `nsl' library (-lnsl). */
-#undef HAVE_LIBNSL
-
-/* Define to 1 if you have the `resolv' library (-lresolv). */
-#undef HAVE_LIBRESOLV
-
-/* Define to 1 if you have the `rt' library (-lrt). */
-#undef HAVE_LIBRT
-
-/* Define to 1 if you have the `socket' library (-lsocket). */
-#undef HAVE_LIBSOCKET
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the <netinet/in6.h> header file. */
-#undef HAVE_NETINET_IN6_H
-
-/* Define to 1 if you have the `poll' function. */
-#undef HAVE_POLL
-
-/* Define to 1 if you have the <poll.h> header file. */
-#undef HAVE_POLL_H
-
-/* Define to 1 if you have the `port_create' function. */
-#undef HAVE_PORT_CREATE
-
-/* Define to 1 if you have the <port.h> header file. */
-#undef HAVE_PORT_H
-
-/* Define to 1 if you have the `select' function. */
-#undef HAVE_SELECT
-
-/* Define if F_SETFD is defined in <fcntl.h> */
-#undef HAVE_SETFD
-
-/* Define to 1 if you have the `sigaction' function. */
-#undef HAVE_SIGACTION
-
-/* Define to 1 if you have the `signal' function. */
-#undef HAVE_SIGNAL
-
-/* Define to 1 if you have the <signal.h> header file. */
-#undef HAVE_SIGNAL_H
-
-/* Define to 1 if you have the <stdarg.h> header file. */
-#undef HAVE_STDARG_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the `strlcpy' function. */
-#undef HAVE_STRLCPY
-
-/* Define to 1 if you have the `strsep' function. */
-#undef HAVE_STRSEP
-
-/* Define to 1 if you have the `strtok_r' function. */
-#undef HAVE_STRTOK_R
-
-/* Define to 1 if you have the `strtoll' function. */
-#undef HAVE_STRTOLL
-
-/* Define to 1 if the system has the type `struct in6_addr'. */
-#undef HAVE_STRUCT_IN6_ADDR
-
-/* Define to 1 if you have the <sys/devpoll.h> header file. */
-#undef HAVE_SYS_DEVPOLL_H
-
-/* Define to 1 if you have the <sys/epoll.h> header file. */
-#undef HAVE_SYS_EPOLL_H
-
-/* Define to 1 if you have the <sys/event.h> header file. */
-#undef HAVE_SYS_EVENT_H
-
-/* Define to 1 if you have the <sys/ioctl.h> header file. */
-#undef HAVE_SYS_IOCTL_H
-
-/* Define to 1 if you have the <sys/param.h> header file. */
-#undef HAVE_SYS_PARAM_H
-
-/* Define to 1 if you have the <sys/queue.h> header file. */
-#undef HAVE_SYS_QUEUE_H
-
-/* Define to 1 if you have the <sys/select.h> header file. */
-#undef HAVE_SYS_SELECT_H
-
-/* Define to 1 if you have the <sys/socket.h> header file. */
-#undef HAVE_SYS_SOCKET_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#undef HAVE_SYS_TIME_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define if TAILQ_FOREACH is defined in <sys/queue.h> */
-#undef HAVE_TAILQFOREACH
-
-/* Define if timeradd is defined in <sys/time.h> */
-#undef HAVE_TIMERADD
-
-/* Define if timerclear is defined in <sys/time.h> */
-#undef HAVE_TIMERCLEAR
-
-/* Define if timercmp is defined in <sys/time.h> */
-#undef HAVE_TIMERCMP
-
-/* Define if timerisset is defined in <sys/time.h> */
-#undef HAVE_TIMERISSET
-
-/* Define to 1 if the system has the type `uint16_t'. */
-#undef HAVE_UINT16_T
-
-/* Define to 1 if the system has the type `uint32_t'. */
-#undef HAVE_UINT32_T
-
-/* Define to 1 if the system has the type `uint64_t'. */
-#undef HAVE_UINT64_T
-
-/* Define to 1 if the system has the type `uint8_t'. */
-#undef HAVE_UINT8_T
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to 1 if you have the `vasprintf' function. */
-#undef HAVE_VASPRINTF
-
-/* Define if kqueue works correctly with pipes */
-#undef HAVE_WORKING_KQUEUE
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* The size of `int', as computed by sizeof. */
-#undef SIZEOF_INT
-
-/* The size of `long', as computed by sizeof. */
-#undef SIZEOF_LONG
-
-/* The size of `long long', as computed by sizeof. */
-#undef SIZEOF_LONG_LONG
-
-/* The size of `short', as computed by sizeof. */
-#undef SIZEOF_SHORT
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#undef TIME_WITH_SYS_TIME
-
-/* Version number of package */
-#undef VERSION
-
-/* Define to appropriate substitue if compiler doesnt have __func__ */
-#undef __func__
-
-/* Define to empty if `const' does not conform to ANSI C. */
-#undef const
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
-   calls it, or to nothing if 'inline' is not supported under any name.  */
-#ifndef __cplusplus
-#undef inline
-#endif
-
-/* Define to `int' if <sys/types.h> does not define. */
-#undef pid_t
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-#undef size_t
-
-/* Define to unsigned int if you dont have it */
-#undef socklen_t
diff --git a/third_party/libevent/config.sub b/third_party/libevent/config.sub
deleted file mode 100644
index 6759825..0000000
--- a/third_party/libevent/config.sub
+++ /dev/null
@@ -1,1658 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
-#   Free Software Foundation, Inc.
-
-timestamp='2008-01-16'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray)
-		os=
-		basic_machine=$1
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
- 	-chorusrdb)
- 		os=-chorusrdb
-		basic_machine=$1
- 		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| fido | fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64vr | mips64vrel \
-	| mips64orion | mips64orionel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| mt \
-	| msp430 \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
-	| pyramid \
-	| score \
-	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu | strongarm \
-	| tahoe | thumb | tic4x | tic80 | tron \
-	| v850 | v850e \
-	| we32k \
-	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
-	| z8k)
-		basic_machine=$basic_machine-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12)
-		# Motorola 68HC11/12.
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* | avr32-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
-	| pyramid-* \
-	| romp-* | rs6000-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tron-* \
-	| v850-* | v850e-* | vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa*-* \
-	| ymp-* \
-	| z8k-*)
-		;;
-	# Recognize the basic CPU types without company name, with glob match.
-	xtensa*)
-		basic_machine=$basic_machine-unknown
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-    	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	blackfin)
-		basic_machine=bfin-unknown
-		os=-linux
-		;;
-	blackfin-*)
-		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16)
-		basic_machine=cr16-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m68knommu)
-		basic_machine=m68k-unknown
-		os=-linux
-		;;
-	m68knommu-*)
-		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	mingw32ce)
-		basic_machine=arm-unknown
-		os=-mingw32ce
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	parisc)
-		basic_machine=hppa-unknown
-		os=-linux
-		;;
-	parisc-*)
-		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc)	basic_machine=powerpc-unknown
-		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sde)
-		basic_machine=mipsisa32-sde
-		os=-elf
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh5el)
-		basic_machine=sh5le-unknown
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-	tic54x | c54x*)
-		basic_machine=tic54x-unknown
-		os=-coff
-		;;
-	tic55x | c55x*)
-		basic_machine=tic55x-unknown
-		os=-coff
-		;;
-	tic6x | c6x*)
-		basic_machine=tic6x-unknown
-		os=-coff
-		;;
-	tile*)
-		basic_machine=tile-unknown
-		os=-linux-gnu
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-        -os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-        -tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-        score-*)
-		os=-elf
-		;;
-        spu-*)
-		os=-elf
-		;;
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-        c4x-* | tic4x-*)
-        	os=-coff
-		;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-        mep-*)
-		os=-elf
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-    	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/third_party/libevent/configure b/third_party/libevent/configure
deleted file mode 100755
index c98d1ff..0000000
--- a/third_party/libevent/configure
+++ /dev/null
Binary files differ
diff --git a/third_party/libevent/epoll.c b/third_party/libevent/epoll.c
index f9f5a79..94dcc9b 100644
--- a/third_party/libevent/epoll.c
+++ b/third_party/libevent/epoll.c
@@ -55,9 +55,8 @@
 #include <sys/_libevent_time.h>
 #endif
 #include <sys/queue.h>
-#include <signal.h>
 #include <sys/epoll.h>
-#include <sys/resource.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
diff --git a/third_party/libevent/evdns.c b/third_party/libevent/evdns.c
index d72fdaa..780d6b1 100644
--- a/third_party/libevent/evdns.c
+++ b/third_party/libevent/evdns.c
@@ -2496,9 +2496,12 @@
 static char *
 search_make_new(const struct search_state *const state, int n, const char *const base_name) {
 	const int base_len = strlen(base_name);
-	const char need_to_append_dot = base_name[base_len - 1] == '.' ? 0 : 1;
+	char need_to_append_dot;
 	struct search_domain *dom;
 
+	if (!base_len) return NULL;
+	need_to_append_dot = base_name[base_len - 1] == '.' ? 0 : 1;
+
 	for (dom = state->head; dom; dom = dom->next) {
 		if (!n--) {
 			/* this is the postfix we want */
diff --git a/third_party/libevent/event-config.h b/third_party/libevent/event-config.h
index 943b242..e66e23b 100644
--- a/third_party/libevent/event-config.h
+++ b/third_party/libevent/event-config.h
@@ -11,7 +11,7 @@
 #include "nacl_nonsfi/event-config.h"
 #elif defined(__APPLE__)
 #include "mac/event-config.h"
-#elif defined(ANDROID) || defined(__LB_ANDROID__)
+#elif defined(ANDROID)
 #include "android/event-config.h"
 #elif defined(__linux__)
 #include "linux/event-config.h"
diff --git a/third_party/libevent/evutil.c b/third_party/libevent/evutil.c
index 2de4dae..a5633c8 100644
--- a/third_party/libevent/evutil.c
+++ b/third_party/libevent/evutil.c
@@ -66,6 +66,7 @@
 #endif
 #include <stdio.h>
 #include <signal.h>
+
 #include <sys/queue.h>
 #endif
 
diff --git a/third_party/libevent/install-sh b/third_party/libevent/install-sh
deleted file mode 100644
index 89fc9b0..0000000
--- a/third_party/libevent/install-sh
+++ /dev/null
@@ -1,238 +0,0 @@
-#! /bin/sh
-#
-# install - install a program, script, or datafile
-# This comes from X11R5.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-#
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-tranformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
-    case $1 in
-	-c) instcmd="$cpprog"
-	    shift
-	    continue;;
-
-	-d) dir_arg=true
-	    shift
-	    continue;;
-
-	-m) chmodcmd="$chmodprog $2"
-	    shift
-	    shift
-	    continue;;
-
-	-o) chowncmd="$chownprog $2"
-	    shift
-	    shift
-	    continue;;
-
-	-g) chgrpcmd="$chgrpprog $2"
-	    shift
-	    shift
-	    continue;;
-
-	-s) stripcmd="$stripprog"
-	    shift
-	    continue;;
-
-	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
-	    shift
-	    continue;;
-
-	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
-	    shift
-	    continue;;
-
-	*)  if [ x"$src" = x ]
-	    then
-		src=$1
-	    else
-		# this colon is to work around a 386BSD /bin/sh bug
-		:
-		dst=$1
-	    fi
-	    shift
-	    continue;;
-    esac
-done
-
-if [ x"$src" = x ]
-then
-	echo "install:	no input file specified"
-	exit 1
-else
-	true
-fi
-
-if [ x"$dir_arg" != x ]; then
-	dst=$src
-	src=""
-	
-	if [ -d $dst ]; then
-		instcmd=:
-	else
-		instcmd=mkdir
-	fi
-else
-
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad 
-# if $src (and thus $dsttmp) contains '*'.
-
-	if [ -f $src -o -d $src ]
-	then
-		true
-	else
-		echo "install:  $src does not exist"
-		exit 1
-	fi
-	
-	if [ x"$dst" = x ]
-	then
-		echo "install:	no destination specified"
-		exit 1
-	else
-		true
-	fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
-	if [ -d $dst ]
-	then
-		dst="$dst"/`basename $src`
-	else
-		true
-	fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-#  this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='	
-'
-IFS="${IFS-${defaultIFS}}"
-
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
-
-pathcomp=''
-
-while [ $# -ne 0 ] ; do
-	pathcomp="${pathcomp}${1}"
-	shift
-
-	if [ ! -d "${pathcomp}" ] ;
-        then
-		$mkdirprog "${pathcomp}"
-	else
-		true
-	fi
-
-	pathcomp="${pathcomp}/"
-done
-fi
-
-if [ x"$dir_arg" != x ]
-then
-	$doit $instcmd $dst &&
-
-	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
-	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
-else
-
-# If we're going to rename the final executable, determine the name now.
-
-	if [ x"$transformarg" = x ] 
-	then
-		dstfile=`basename $dst`
-	else
-		dstfile=`basename $dst $transformbasename | 
-			sed $transformarg`$transformbasename
-	fi
-
-# don't allow the sed command to completely eliminate the filename
-
-	if [ x"$dstfile" = x ] 
-	then
-		dstfile=`basename $dst`
-	else
-		true
-	fi
-
-# Make a temp file name in the proper directory.
-
-	dsttmp=$dstdir/#inst.$$#
-
-# Move or copy the file name to the temp name
-
-	$doit $instcmd $src $dsttmp &&
-
-	trap "rm -f ${dsttmp}" 0 &&
-
-# and set any options; do chmod last to preserve setuid bits
-
-# If any of these fail, we abort the whole thing.  If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
-
-	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
-	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
-
-# Now rename the file to the real destination.
-
-	$doit $rmcmd -f $dstdir/$dstfile &&
-	$doit $mvcmd $dsttmp $dstdir/$dstfile 
-
-fi &&
-
-
-exit 0
diff --git a/third_party/libevent/log.c b/third_party/libevent/log.c
index 435599d..b4b9d43 100644
--- a/third_party/libevent/log.c
+++ b/third_party/libevent/log.c
@@ -74,6 +74,7 @@
 #endif  // STARBOARD
 
 #include "event.h"
+
 #include "log.h"
 #include "evutil.h"
 
diff --git a/third_party/libevent/ltmain.sh b/third_party/libevent/ltmain.sh
deleted file mode 100644
index 27d498a..0000000
--- a/third_party/libevent/ltmain.sh
+++ /dev/null
@@ -1,6956 +0,0 @@
-# ltmain.sh - Provide generalized library-building support services.
-# NOTE: Changing this file will not affect anything until you rerun configure.
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008  Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-basename="s,^.*/,,g"
-
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
-
-# The name of this program:
-progname=`echo "$progpath" | $SED $basename`
-modename="$progname"
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-
-PROGRAM=ltmain.sh
-PACKAGE=libtool
-VERSION=1.5.26
-TIMESTAMP=" (1.1220.2.492 2008/01/30 06:40:56)"
-
-# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE).
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Check that we have a working $echo.
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
-  # Yippee, $echo works!
-  :
-else
-  # Restart under the correct shell, and then maybe $echo will work.
-  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<EOF
-$*
-EOF
-  exit $EXIT_SUCCESS
-fi
-
-default_mode=
-help="Try \`$progname --help' for more information."
-magic="%%%MAGIC variable%%%"
-mkdir="mkdir"
-mv="mv -f"
-rm="rm -f"
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  SP2NL='tr \040 \012'
-  NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  SP2NL='tr \100 \n'
-  NL2SP='tr \r\n \100\100'
-  ;;
-esac
-
-# NLS nuisances.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-# We save the old values to restore during execute mode.
-lt_env=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-do
-  eval "if test \"\${$lt_var+set}\" = set; then
-	  save_$lt_var=\$$lt_var
-	  lt_env=\"$lt_var=\$$lt_var \$lt_env\"
-	  $lt_var=C
-	  export $lt_var
-	fi"
-done
-
-if test -n "$lt_env"; then
-  lt_env="env $lt_env"
-fi
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
-
-if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-  $echo "$modename: not configured to build any kind of library" 1>&2
-  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
-  exit $EXIT_FAILURE
-fi
-
-# Global variables.
-mode=$default_mode
-nonopt=
-prev=
-prevopt=
-run=
-show="$echo"
-show_help=
-execute_dlfiles=
-duplicate_deps=no
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
-
-#####################################
-# Shell function definitions:
-# This seems to be the best place for them
-
-# func_mktempdir [string]
-# Make a temporary directory that won't clash with other running
-# libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
-func_mktempdir ()
-{
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
-
-    if test "$run" = ":"; then
-      # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
-    else
-
-      # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
-
-      if test ! -d "$my_tmpdir"; then
-	# Failing that, at least try and use $RANDOM to avoid a race
-	my_tmpdir="${my_template}-${RANDOM-0}$$"
-
-	save_mktempdir_umask=`umask`
-	umask 0077
-	$mkdir "$my_tmpdir"
-	umask $save_mktempdir_umask
-      fi
-
-      # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || {
-        $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2
-	exit $EXIT_FAILURE
-      }
-    fi
-
-    $echo "X$my_tmpdir" | $Xsed
-}
-
-
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-func_win32_libid ()
-{
-  win32_libid_type="unknown"
-  win32_fileres=`file -L $1 2>/dev/null`
-  case $win32_fileres in
-  *ar\ archive\ import\ library*) # definitely import
-    win32_libid_type="x86 archive import"
-    ;;
-  *ar\ archive*) # could be an import, or static
-    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
-      $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
-      win32_nmres=`eval $NM -f posix -A $1 | \
-	$SED -n -e '1,100{
-		/ I /{
-			s,.*,import,
-			p
-			q
-			}
-		}'`
-      case $win32_nmres in
-      import*)  win32_libid_type="x86 archive import";;
-      *)        win32_libid_type="x86 archive static";;
-      esac
-    fi
-    ;;
-  *DLL*)
-    win32_libid_type="x86 DLL"
-    ;;
-  *executable*) # but shell scripts are "executable" too...
-    case $win32_fileres in
-    *MS\ Windows\ PE\ Intel*)
-      win32_libid_type="x86 DLL"
-      ;;
-    esac
-    ;;
-  esac
-  $echo $win32_libid_type
-}
-
-
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
-{
-    if test -n "$available_tags" && test -z "$tagname"; then
-      CC_quoted=
-      for arg in $CC; do
-	case $arg in
-	  *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	  arg="\"$arg\""
-	  ;;
-	esac
-	CC_quoted="$CC_quoted $arg"
-      done
-      case $@ in
-      # Blanks in the command may have been stripped by the calling shell,
-      # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
-      # Blanks at the start of $base_compile will cause this to fail
-      # if we don't check for them as well.
-      *)
-	for z in $available_tags; do
-	  if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
-	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
-	    CC_quoted=
-	    for arg in $CC; do
-	    # Double-quote args containing other shell metacharacters.
-	    case $arg in
-	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	      arg="\"$arg\""
-	      ;;
-	    esac
-	    CC_quoted="$CC_quoted $arg"
-	  done
-	    case "$@ " in
-	      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
-	      # The compiler in the base compile command matches
-	      # the one in the tagged configuration.
-	      # Assume this is the tagged configuration we want.
-	      tagname=$z
-	      break
-	      ;;
-	    esac
-	  fi
-	done
-	# If $tagname still isn't set, then no tagged configuration
-	# was found and let the user know that the "--tag" command
-	# line option must be used.
-	if test -z "$tagname"; then
-	  $echo "$modename: unable to infer tagged configuration"
-	  $echo "$modename: specify a tag with \`--tag'" 1>&2
-	  exit $EXIT_FAILURE
-#        else
-#          $echo "$modename: using $tagname tagged configuration"
-	fi
-	;;
-      esac
-    fi
-}
-
-
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
-{
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-
-    $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
-    $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
-    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
-     :
-    else
-      $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
-      exit $EXIT_FAILURE
-    fi
-}
-
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
-{
-    my_gentop="$1"; shift
-    my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
-    my_status=""
-
-    $show "${rm}r $my_gentop"
-    $run ${rm}r "$my_gentop"
-    $show "$mkdir $my_gentop"
-    $run $mkdir "$my_gentop"
-    my_status=$?
-    if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then
-      exit $my_status
-    fi
-
-    for my_xlib in $my_oldlibs; do
-      # Extract the objects.
-      case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
-	*) my_xabs=`pwd`"/$my_xlib" ;;
-      esac
-      my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'`
-      my_xlib_u=$my_xlib
-      while :; do
-        case " $extracted_archives " in
-	*" $my_xlib_u "*)
-	  extracted_serial=`expr $extracted_serial + 1`
-	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
-	*) break ;;
-	esac
-      done
-      extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
-
-      $show "${rm}r $my_xdir"
-      $run ${rm}r "$my_xdir"
-      $show "$mkdir $my_xdir"
-      $run $mkdir "$my_xdir"
-      exit_status=$?
-      if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then
-	exit $exit_status
-      fi
-      case $host in
-      *-darwin*)
-	$show "Extracting $my_xabs"
-	# Do not bother doing anything if just a dry run
-	if test -z "$run"; then
-	  darwin_orig_dir=`pwd`
-	  cd $my_xdir || exit $?
-	  darwin_archive=$my_xabs
-	  darwin_curdir=`pwd`
-	  darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'`
-	  darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null`
-	  if test -n "$darwin_arches"; then 
-	    darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'`
-	    darwin_arch=
-	    $show "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
-	      cd "$darwin_curdir"
-	      $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
-	    done # $darwin_arches
-      ## Okay now we have a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP`
-	    darwin_file=
-	    darwin_files=
-	    for darwin_file in $darwin_filelist; do
-	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
-	      lipo -create -output "$darwin_file" $darwin_files
-	    done # $darwin_filelist
-	    ${rm}r unfat-$$
-	    cd "$darwin_orig_dir"
-	  else
-	    cd "$darwin_orig_dir"
- 	    func_extract_an_archive "$my_xdir" "$my_xabs"
-	  fi # $darwin_arches
-	fi # $run
-	;;
-      *)
-        func_extract_an_archive "$my_xdir" "$my_xabs"
-        ;;
-      esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
-    done
-    func_extract_archives_result="$my_oldobjs"
-}
-# End of Shell function definitions
-#####################################
-
-# Darwin sucks
-eval std_shrext=\"$shrext_cmds\"
-
-disable_libs=no
-
-# Parse our command line options once, thoroughly.
-while test "$#" -gt 0
-do
-  arg="$1"
-  shift
-
-  case $arg in
-  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) optarg= ;;
-  esac
-
-  # If the previous option needs an argument, assign it.
-  if test -n "$prev"; then
-    case $prev in
-    execute_dlfiles)
-      execute_dlfiles="$execute_dlfiles $arg"
-      ;;
-    tag)
-      tagname="$arg"
-      preserve_args="${preserve_args}=$arg"
-
-      # Check whether tagname contains only valid characters
-      case $tagname in
-      *[!-_A-Za-z0-9,/]*)
-	$echo "$progname: invalid tag name: $tagname" 1>&2
-	exit $EXIT_FAILURE
-	;;
-      esac
-
-      case $tagname in
-      CC)
-	# Don't test for the "default" C tag, as we know, it's there, but
-	# not specially marked.
-	;;
-      *)
-	if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
-	  taglist="$taglist $tagname"
-	  # Evaluate the configuration.
-	  eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
-	else
-	  $echo "$progname: ignoring unknown tag $tagname" 1>&2
-	fi
-	;;
-      esac
-      ;;
-    *)
-      eval "$prev=\$arg"
-      ;;
-    esac
-
-    prev=
-    prevopt=
-    continue
-  fi
-
-  # Have we seen a non-optional argument yet?
-  case $arg in
-  --help)
-    show_help=yes
-    ;;
-
-  --version)
-    echo "\
-$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP
-
-Copyright (C) 2008  Free Software Foundation, Inc.
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-    exit $?
-    ;;
-
-  --config)
-    ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
-    # Now print the configurations for the tags.
-    for tagname in $taglist; do
-      ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
-    done
-    exit $?
-    ;;
-
-  --debug)
-    $echo "$progname: enabling shell trace mode"
-    set -x
-    preserve_args="$preserve_args $arg"
-    ;;
-
-  --dry-run | -n)
-    run=:
-    ;;
-
-  --features)
-    $echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
-      $echo "enable shared libraries"
-    else
-      $echo "disable shared libraries"
-    fi
-    if test "$build_old_libs" = yes; then
-      $echo "enable static libraries"
-    else
-      $echo "disable static libraries"
-    fi
-    exit $?
-    ;;
-
-  --finish) mode="finish" ;;
-
-  --mode) prevopt="--mode" prev=mode ;;
-  --mode=*) mode="$optarg" ;;
-
-  --preserve-dup-deps) duplicate_deps="yes" ;;
-
-  --quiet | --silent)
-    show=:
-    preserve_args="$preserve_args $arg"
-    ;;
-
-  --tag)
-    prevopt="--tag"
-    prev=tag
-    preserve_args="$preserve_args --tag"
-    ;;
-  --tag=*)
-    set tag "$optarg" ${1+"$@"}
-    shift
-    prev=tag
-    preserve_args="$preserve_args --tag"
-    ;;
-
-  -dlopen)
-    prevopt="-dlopen"
-    prev=execute_dlfiles
-    ;;
-
-  -*)
-    $echo "$modename: unrecognized option \`$arg'" 1>&2
-    $echo "$help" 1>&2
-    exit $EXIT_FAILURE
-    ;;
-
-  *)
-    nonopt="$arg"
-    break
-    ;;
-  esac
-done
-
-if test -n "$prevopt"; then
-  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
-  $echo "$help" 1>&2
-  exit $EXIT_FAILURE
-fi
-
-case $disable_libs in
-no) 
-  ;;
-shared)
-  build_libtool_libs=no
-  build_old_libs=yes
-  ;;
-static)
-  build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-  ;;
-esac
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-if test -z "$show_help"; then
-
-  # Infer the operation mode.
-  if test -z "$mode"; then
-    $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
-    $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2
-    case $nonopt in
-    *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
-      mode=link
-      for arg
-      do
-	case $arg in
-	-c)
-	   mode=compile
-	   break
-	   ;;
-	esac
-      done
-      ;;
-    *db | *dbx | *strace | *truss)
-      mode=execute
-      ;;
-    *install*|cp|mv)
-      mode=install
-      ;;
-    *rm)
-      mode=uninstall
-      ;;
-    *)
-      # If we have no mode, but dlfiles were specified, then do execute mode.
-      test -n "$execute_dlfiles" && mode=execute
-
-      # Just use the default operation mode.
-      if test -z "$mode"; then
-	if test -n "$nonopt"; then
-	  $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
-	else
-	  $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
-	fi
-      fi
-      ;;
-    esac
-  fi
-
-  # Only execute mode is allowed to have -dlopen flags.
-  if test -n "$execute_dlfiles" && test "$mode" != execute; then
-    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
-    $echo "$help" 1>&2
-    exit $EXIT_FAILURE
-  fi
-
-  # Change the help message to a mode-specific one.
-  generic_help="$help"
-  help="Try \`$modename --help --mode=$mode' for more information."
-
-  # These modes are in order of execution frequency so that they run quickly.
-  case $mode in
-  # libtool compile mode
-  compile)
-    modename="$modename: compile"
-    # Get the compilation command and the source file.
-    base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
-    suppress_opt=yes
-    suppress_output=
-    arg_mode=normal
-    libobj=
-    later=
-
-    for arg
-    do
-      case $arg_mode in
-      arg  )
-	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
-	arg_mode=normal
-	;;
-
-      target )
-	libobj="$arg"
-	arg_mode=normal
-	continue
-	;;
-
-      normal )
-	# Accept any command-line options.
-	case $arg in
-	-o)
-	  if test -n "$libobj" ; then
-	    $echo "$modename: you cannot specify \`-o' more than once" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	  arg_mode=target
-	  continue
-	  ;;
-
-	-static | -prefer-pic | -prefer-non-pic)
-	  later="$later $arg"
-	  continue
-	  ;;
-
-	-no-suppress)
-	  suppress_opt=no
-	  continue
-	  ;;
-
-	-Xcompiler)
-	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
-	  continue      #  The current "srcfile" will either be retained or
-	  ;;            #  replaced later.  I would guess that would be a bug.
-
-	-Wc,*)
-	  args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
-	  lastarg=
-	  save_ifs="$IFS"; IFS=','
- 	  for arg in $args; do
-	    IFS="$save_ifs"
-
-	    # Double-quote args containing other shell metacharacters.
-	    # Many Bourne shells cannot handle close brackets correctly
-	    # in scan sets, so we specify it separately.
-	    case $arg in
-	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	      arg="\"$arg\""
-	      ;;
-	    esac
-	    lastarg="$lastarg $arg"
-	  done
-	  IFS="$save_ifs"
-	  lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
-
-	  # Add the arguments to base_compile.
-	  base_compile="$base_compile $lastarg"
-	  continue
-	  ;;
-
-	* )
-	  # Accept the current argument as the source file.
-	  # The previous "srcfile" becomes the current argument.
-	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
-	  ;;
-	esac  #  case $arg
-	;;
-      esac    #  case $arg_mode
-
-      # Aesthetically quote the previous argument.
-      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
-
-      case $lastarg in
-      # Double-quote args containing other shell metacharacters.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, and some SunOS ksh mistreat backslash-escaping
-      # in scan sets (worked around with variable expansion),
-      # and furthermore cannot handle '|' '&' '(' ')' in scan sets 
-      # at all, so we specify them separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	lastarg="\"$lastarg\""
-	;;
-      esac
-
-      base_compile="$base_compile $lastarg"
-    done # for arg
-
-    case $arg_mode in
-    arg)
-      $echo "$modename: you must specify an argument for -Xcompile"
-      exit $EXIT_FAILURE
-      ;;
-    target)
-      $echo "$modename: you must specify a target with \`-o'" 1>&2
-      exit $EXIT_FAILURE
-      ;;
-    *)
-      # Get the name of the library object.
-      [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
-      ;;
-    esac
-
-    # Recognize several different file suffixes.
-    # If the user specifies -o file.o, it is replaced with file.lo
-    xform='[cCFSifmso]'
-    case $libobj in
-    *.ada) xform=ada ;;
-    *.adb) xform=adb ;;
-    *.ads) xform=ads ;;
-    *.asm) xform=asm ;;
-    *.c++) xform=c++ ;;
-    *.cc) xform=cc ;;
-    *.ii) xform=ii ;;
-    *.class) xform=class ;;
-    *.cpp) xform=cpp ;;
-    *.cxx) xform=cxx ;;
-    *.[fF][09]?) xform=[fF][09]. ;;
-    *.for) xform=for ;;
-    *.java) xform=java ;;
-    *.obj) xform=obj ;;
-    *.sx) xform=sx ;;
-    esac
-
-    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
-
-    case $libobj in
-    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
-    *)
-      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
-      exit $EXIT_FAILURE
-      ;;
-    esac
-
-    func_infer_tag $base_compile
-
-    for arg in $later; do
-      case $arg in
-      -static)
-	build_old_libs=yes
-	continue
-	;;
-
-      -prefer-pic)
-	pic_mode=yes
-	continue
-	;;
-
-      -prefer-non-pic)
-	pic_mode=no
-	continue
-	;;
-      esac
-    done
-
-    qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"`
-    case $qlibobj in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	qlibobj="\"$qlibobj\"" ;;
-    esac
-    test "X$libobj" != "X$qlibobj" \
-	&& $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' 	&()|`$[]' \
-	&& $echo "$modename: libobj name \`$libobj' may not contain shell special characters."
-    objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
-    xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
-    if test "X$xdir" = "X$obj"; then
-      xdir=
-    else
-      xdir=$xdir/
-    fi
-    lobj=${xdir}$objdir/$objname
-
-    if test -z "$base_compile"; then
-      $echo "$modename: you must specify a compilation command" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
-      removelist="$obj $lobj $libobj ${libobj}T"
-    else
-      removelist="$lobj $libobj ${libobj}T"
-    fi
-
-    $run $rm $removelist
-    trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
-
-    # On Cygwin there's no "real" PIC flag so we must build both object types
-    case $host_os in
-    cygwin* | mingw* | pw32* | os2*)
-      pic_mode=default
-      ;;
-    esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
-      # non-PIC code in shared libraries is not supported
-      pic_mode=default
-    fi
-
-    # Calculate the filename of the output object if compiler does
-    # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
-      removelist="$removelist $output_obj $lockfile"
-      trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
-    else
-      output_obj=
-      need_locks=no
-      lockfile=
-    fi
-
-    # Lock this critical section if it is needed
-    # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
-      until $run ln "$progpath" "$lockfile" 2>/dev/null; do
-	$show "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    elif test "$need_locks" = warn; then
-      if test -f "$lockfile"; then
-	$echo "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$run $rm $removelist
-	exit $EXIT_FAILURE
-      fi
-      $echo "$srcfile" > "$lockfile"
-    fi
-
-    if test -n "$fix_srcfile_path"; then
-      eval srcfile=\"$fix_srcfile_path\"
-    fi
-    qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"`
-    case $qsrcfile in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-      qsrcfile="\"$qsrcfile\"" ;;
-    esac
-
-    $run $rm "$libobj" "${libobj}T"
-
-    # Create a libtool object file (analogous to a ".la" file),
-    # but don't create it if we're doing a dry run.
-    test -z "$run" && cat > ${libobj}T <<EOF
-# $libobj - a libtool object file
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-EOF
-
-    # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
-      # Without this assignment, base_compile gets emptied.
-      fbsd_hideous_sh_bug=$base_compile
-
-      if test "$pic_mode" != no; then
-	command="$base_compile $qsrcfile $pic_flag"
-      else
-	# Don't build PIC code
-	command="$base_compile $qsrcfile"
-      fi
-
-      if test ! -d "${xdir}$objdir"; then
-	$show "$mkdir ${xdir}$objdir"
-	$run $mkdir ${xdir}$objdir
-	exit_status=$?
-	if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then
-	  exit $exit_status
-	fi
-      fi
-
-      if test -z "$output_obj"; then
-	# Place PIC objects in $objdir
-	command="$command -o $lobj"
-      fi
-
-      $run $rm "$lobj" "$output_obj"
-
-      $show "$command"
-      if $run eval $lt_env "$command"; then :
-      else
-	test -n "$output_obj" && $run $rm $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$echo "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$run $rm $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed, then go on to compile the next one
-      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
-	$show "$mv $output_obj $lobj"
-	if $run $mv $output_obj $lobj; then :
-	else
-	  error=$?
-	  $run $rm $removelist
-	  exit $error
-	fi
-      fi
-
-      # Append the name of the PIC object to the libtool object file.
-      test -z "$run" && cat >> ${libobj}T <<EOF
-pic_object='$objdir/$objname'
-
-EOF
-
-      # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
-        suppress_output=' >/dev/null 2>&1'
-      fi
-    else
-      # No PIC object so indicate it doesn't exist in the libtool
-      # object file.
-      test -z "$run" && cat >> ${libobj}T <<EOF
-pic_object=none
-
-EOF
-    fi
-
-    # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
-	# Don't build PIC code
-	command="$base_compile $qsrcfile"
-      else
-	command="$base_compile $qsrcfile $pic_flag"
-      fi
-      if test "$compiler_c_o" = yes; then
-	command="$command -o $obj"
-      fi
-
-      # Suppress compiler output if we already did a PIC compilation.
-      command="$command$suppress_output"
-      $run $rm "$obj" "$output_obj"
-      $show "$command"
-      if $run eval $lt_env "$command"; then :
-      else
-	$run $rm $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$echo "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$run $rm $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed
-      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
-	$show "$mv $output_obj $obj"
-	if $run $mv $output_obj $obj; then :
-	else
-	  error=$?
-	  $run $rm $removelist
-	  exit $error
-	fi
-      fi
-
-      # Append the name of the non-PIC object the libtool object file.
-      # Only append if the libtool object file exists.
-      test -z "$run" && cat >> ${libobj}T <<EOF
-# Name of the non-PIC object.
-non_pic_object='$objname'
-
-EOF
-    else
-      # Append the name of the non-PIC object the libtool object file.
-      # Only append if the libtool object file exists.
-      test -z "$run" && cat >> ${libobj}T <<EOF
-# Name of the non-PIC object.
-non_pic_object=none
-
-EOF
-    fi
-
-    $run $mv "${libobj}T" "${libobj}"
-
-    # Unlock the critical section if it was locked
-    if test "$need_locks" != no; then
-      $run $rm "$lockfile"
-    fi
-
-    exit $EXIT_SUCCESS
-    ;;
-
-  # libtool link mode
-  link | relink)
-    modename="$modename: link"
-    case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invocation.
-      # allow_undefined=no
-
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    libtool_args="$nonopt"
-    base_compile="$nonopt $@"
-    compile_command="$nonopt"
-    finalize_command="$nonopt"
-
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    old_deplibs=
-    compiler_flags=
-    linker_flags=
-    dllsearchpath=
-    lib_search_path=`pwd`
-    inst_prefix_dir=
-
-    avoid_version=no
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    ltlibs=
-    module=no
-    no_install=no
-    objs=
-    non_pic_objects=
-    notinst_path= # paths that contain not-installed libtool libraries
-    precious_files_regex=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-    vinfo_number=no
-    single_module="${wl}-single_module"
-
-    func_infer_tag $base_compile
-
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case $arg in
-      -all-static | -static | -static-libtool-libs)
-	case $arg in
-	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-	    $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
-	  fi
-	  if test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	-static)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=built
-	  ;;
-	-static-libtool-libs)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	esac
-	build_libtool_libs=no
-	build_old_libs=yes
-	break
-	;;
-      esac
-    done
-
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
-    # Go through the arguments, transforming them on the way.
-    while test "$#" -gt 0; do
-      arg="$1"
-      shift
-      case $arg in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
-	;;
-      *) qarg=$arg ;;
-      esac
-      libtool_args="$libtool_args $qarg"
-
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-	case $prev in
-	output)
-	  compile_command="$compile_command @OUTPUT@"
-	  finalize_command="$finalize_command @OUTPUT@"
-	  ;;
-	esac
-
-	case $prev in
-	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
-	    # Add the symbol object into the linking commands.
-	    compile_command="$compile_command @SYMFILE@"
-	    finalize_command="$finalize_command @SYMFILE@"
-	    preload=yes
-	  fi
-	  case $arg in
-	  *.la | *.lo) ;;  # We handle these cases below.
-	  force)
-	    if test "$dlself" = no; then
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  self)
-	    if test "$prev" = dlprefiles; then
-	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-	      dlself=yes
-	    else
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  *)
-	    if test "$prev" = dlfiles; then
-	      dlfiles="$dlfiles $arg"
-	    else
-	      dlprefiles="$dlprefiles $arg"
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  esac
-	  ;;
-	expsyms)
-	  export_symbols="$arg"
-	  if test ! -f "$arg"; then
-	    $echo "$modename: symbol file \`$arg' does not exist"
-	    exit $EXIT_FAILURE
-	  fi
-	  prev=
-	  continue
-	  ;;
-	expsyms_regex)
-	  export_symbols_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	inst_prefix)
-	  inst_prefix_dir="$arg"
-	  prev=
-	  continue
-	  ;;
-	precious_regex)
-	  precious_files_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	release)
-	  release="-$arg"
-	  prev=
-	  continue
-	  ;;
-	objectlist)
-	  if test -f "$arg"; then
-	    save_arg=$arg
-	    moreargs=
-	    for fil in `cat $save_arg`
-	    do
-#	      moreargs="$moreargs $fil"
-	      arg=$fil
-	      # A libtool-controlled object.
-
-	      # Check to see that this really is a libtool object.
-	      if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-		pic_object=
-		non_pic_object=
-
-		# Read the .lo file
-		# If there is no directory component, then add one.
-		case $arg in
-		*/* | *\\*) . $arg ;;
-		*) . ./$arg ;;
-		esac
-
-		if test -z "$pic_object" || \
-		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none && \
-		   test "$non_pic_object" = none; then
-		  $echo "$modename: cannot find name of object for \`$arg'" 1>&2
-		  exit $EXIT_FAILURE
-		fi
-
-		# Extract subdirectory from the argument.
-		xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-		if test "X$xdir" = "X$arg"; then
-		  xdir=
-		else
-		  xdir="$xdir/"
-		fi
-
-		if test "$pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
-
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		      dlfiles="$dlfiles $pic_object"
-		      prev=
-		      continue
-		    else
-		      # If libtool objects are unsupported, then we need to preload.
-		      prev=dlprefiles
-		    fi
-		  fi
-
-		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
-		    # Preload the old-style object.
-		    dlprefiles="$dlprefiles $pic_object"
-		    prev=
-		  fi
-
-		  # A PIC object.
-		  libobjs="$libobjs $pic_object"
-		  arg="$pic_object"
-		fi
-
-		# Non-PIC object.
-		if test "$non_pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
-
-		  # A standard non-PIC object
-		  non_pic_objects="$non_pic_objects $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
-		  fi
-		else
-		  # If the PIC object exists, use it instead.
-		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
-		  non_pic_objects="$non_pic_objects $non_pic_object"
-		fi
-	      else
-		# Only an error if not doing a dry-run.
-		if test -z "$run"; then
-		  $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
-		  exit $EXIT_FAILURE
-		else
-		  # Dry-run case.
-
-		  # Extract subdirectory from the argument.
-		  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-		  if test "X$xdir" = "X$arg"; then
-		    xdir=
-		  else
-		    xdir="$xdir/"
-		  fi
-
-		  pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
-		  non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
-		  libobjs="$libobjs $pic_object"
-		  non_pic_objects="$non_pic_objects $non_pic_object"
-		fi
-	      fi
-	    done
-	  else
-	    $echo "$modename: link input file \`$save_arg' does not exist"
-	    exit $EXIT_FAILURE
-	  fi
-	  arg=$save_arg
-	  prev=
-	  continue
-	  ;;
-	rpath | xrpath)
-	  # We need an absolute path.
-	  case $arg in
-	  [\\/]* | [A-Za-z]:[\\/]*) ;;
-	  *)
-	    $echo "$modename: only absolute run-paths are allowed" 1>&2
-	    exit $EXIT_FAILURE
-	    ;;
-	  esac
-	  if test "$prev" = rpath; then
-	    case "$rpath " in
-	    *" $arg "*) ;;
-	    *) rpath="$rpath $arg" ;;
-	    esac
-	  else
-	    case "$xrpath " in
-	    *" $arg "*) ;;
-	    *) xrpath="$xrpath $arg" ;;
-	    esac
-	  fi
-	  prev=
-	  continue
-	  ;;
-	xcompiler)
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  compile_command="$compile_command $qarg"
-	  finalize_command="$finalize_command $qarg"
-	  continue
-	  ;;
-	xlinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $wl$qarg"
-	  prev=
-	  compile_command="$compile_command $wl$qarg"
-	  finalize_command="$finalize_command $wl$qarg"
-	  continue
-	  ;;
-	xcclinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  compile_command="$compile_command $qarg"
-	  finalize_command="$finalize_command $qarg"
-	  continue
-	  ;;
-	shrext)
-  	  shrext_cmds="$arg"
-	  prev=
-	  continue
-	  ;;
-	darwin_framework|darwin_framework_skip)
-	  test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg"
-	  compile_command="$compile_command $arg"
-	  finalize_command="$finalize_command $arg"
-	  prev=
-	  continue
-	  ;;
-	*)
-	  eval "$prev=\"\$arg\""
-	  prev=
-	  continue
-	  ;;
-	esac
-      fi # test -n "$prev"
-
-      prevarg="$arg"
-
-      case $arg in
-      -all-static)
-	if test -n "$link_static_flag"; then
-	  compile_command="$compile_command $link_static_flag"
-	  finalize_command="$finalize_command $link_static_flag"
-	fi
-	continue
-	;;
-
-      -allow-undefined)
-	# FIXME: remove this flag sometime in the future.
-	$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
-	continue
-	;;
-
-      -avoid-version)
-	avoid_version=yes
-	continue
-	;;
-
-      -dlopen)
-	prev=dlfiles
-	continue
-	;;
-
-      -dlpreopen)
-	prev=dlprefiles
-	continue
-	;;
-
-      -export-dynamic)
-	export_dynamic=yes
-	continue
-	;;
-
-      -export-symbols | -export-symbols-regex)
-	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  $echo "$modename: more than one -exported-symbols argument is not allowed"
-	  exit $EXIT_FAILURE
-	fi
-	if test "X$arg" = "X-export-symbols"; then
-	  prev=expsyms
-	else
-	  prev=expsyms_regex
-	fi
-	continue
-	;;
-
-      -framework|-arch|-isysroot)
-	case " $CC " in
-	  *" ${arg} ${1} "* | *" ${arg}	${1} "*) 
-		prev=darwin_framework_skip ;;
-	  *) compiler_flags="$compiler_flags $arg"
-	     prev=darwin_framework ;;
-	esac
-	compile_command="$compile_command $arg"
-	finalize_command="$finalize_command $arg"
-	continue
-	;;
-
-      -inst-prefix-dir)
-	prev=inst_prefix
-	continue
-	;;
-
-      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
-      # so, if we see these flags be careful not to treat them like -L
-      -L[A-Z][A-Z]*:*)
-	case $with_gcc/$host in
-	no/*-*-irix* | /*-*-irix*)
-	  compile_command="$compile_command $arg"
-	  finalize_command="$finalize_command $arg"
-	  ;;
-	esac
-	continue
-	;;
-
-      -L*)
-	dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  absdir=`cd "$dir" && pwd`
-	  if test -z "$absdir"; then
-	    $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
-	    absdir="$dir"
-	    notinst_path="$notinst_path $dir"
-	  fi
-	  dir="$absdir"
-	  ;;
-	esac
-	case "$deplibs " in
-	*" -L$dir "*) ;;
-	*)
-	  deplibs="$deplibs -L$dir"
-	  lib_search_path="$lib_search_path $dir"
-	  ;;
-	esac
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
-	  testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$dir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$dir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-	continue
-	;;
-
-      -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*)
-	    # These systems don't actually have a C or math library (as such)
-	    continue
-	    ;;
-	  *-*-os2*)
-	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C and math libraries are in the System framework
-	    deplibs="$deplibs -framework System"
-	    continue
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  esac
-	elif test "X$arg" = "X-lc_r"; then
-	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	   # Do not include libc_r directly, use -pthread flag.
-	   continue
-	   ;;
-	 esac
-	fi
-	deplibs="$deplibs $arg"
-	continue
-	;;
-
-      # Tru64 UNIX uses -model [arg] to determine the layout of C++
-      # classes, name mangling, and exception handling.
-      -model)
-	compile_command="$compile_command $arg"
-	compiler_flags="$compiler_flags $arg"
-	finalize_command="$finalize_command $arg"
-	prev=xcompiler
-	continue
-	;;
-
-     -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	compiler_flags="$compiler_flags $arg"
-	compile_command="$compile_command $arg"
-	finalize_command="$finalize_command $arg"
-	continue
-	;;
-
-      -multi_module)
-	single_module="${wl}-multi_module"
-	continue
-	;;
-
-      -module)
-	module=yes
-	continue
-	;;
-
-      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
-      # -r[0-9][0-9]* specifies the processor on the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
-      # +DA*, +DD* enable 64-bit mode on the HP compiler
-      # -q* pass through compiler args for the IBM compiler
-      # -m* pass through architecture-specific compiler args for GCC
-      # -m*, -t[45]*, -txscale* pass through architecture-specific
-      # compiler args for GCC
-      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
-      # -F/path gives path to uninstalled frameworks, gcc on darwin
-      # @file GCC response files
-      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
-
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-	case $arg in
-	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	  arg="\"$arg\""
-	  ;;
-	esac
-        compile_command="$compile_command $arg"
-        finalize_command="$finalize_command $arg"
-        compiler_flags="$compiler_flags $arg"
-        continue
-        ;;
-
-      -shrext)
-	prev=shrext
-	continue
-	;;
-
-      -no-fast-install)
-	fast_install=no
-	continue
-	;;
-
-      -no-install)
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*)
-	  # The PATH hackery in wrapper scripts is required on Windows
-	  # and Darwin in order for the loader to find any dlls it needs.
-	  $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
-	  $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
-	  fast_install=no
-	  ;;
-	*) no_install=yes ;;
-	esac
-	continue
-	;;
-
-      -no-undefined)
-	allow_undefined=no
-	continue
-	;;
-
-      -objectlist)
-	prev=objectlist
-	continue
-	;;
-
-      -o) prev=output ;;
-
-      -precious-files-regex)
-	prev=precious_regex
-	continue
-	;;
-
-      -release)
-	prev=release
-	continue
-	;;
-
-      -rpath)
-	prev=rpath
-	continue
-	;;
-
-      -R)
-	prev=xrpath
-	continue
-	;;
-
-      -R*)
-	dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  $echo "$modename: only absolute run-paths are allowed" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
-	case "$xrpath " in
-	*" $dir "*) ;;
-	*) xrpath="$xrpath $dir" ;;
-	esac
-	continue
-	;;
-
-      -static | -static-libtool-libs)
-	# The effects of -static are defined in a previous loop.
-	# We used to do the same as -all-static on platforms that
-	# didn't have a PIC flag, but the assumption that the effects
-	# would be equivalent was wrong.  It would break on at least
-	# Digital Unix and AIX.
-	continue
-	;;
-
-      -thread-safe)
-	thread_safe=yes
-	continue
-	;;
-
-      -version-info)
-	prev=vinfo
-	continue
-	;;
-      -version-number)
-	prev=vinfo
-	vinfo_number=yes
-	continue
-	;;
-
-      -Wc,*)
-	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-	  case $flag in
-	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	    flag="\"$flag\""
-	    ;;
-	  esac
-	  arg="$arg $wl$flag"
-	  compiler_flags="$compiler_flags $flag"
-	done
-	IFS="$save_ifs"
-	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
-	;;
-
-      -Wl,*)
-	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-	  case $flag in
-	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	    flag="\"$flag\""
-	    ;;
-	  esac
-	  arg="$arg $wl$flag"
-	  compiler_flags="$compiler_flags $wl$flag"
-	  linker_flags="$linker_flags $flag"
-	done
-	IFS="$save_ifs"
-	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
-	;;
-
-      -Xcompiler)
-	prev=xcompiler
-	continue
-	;;
-
-      -Xlinker)
-	prev=xlinker
-	continue
-	;;
-
-      -XCClinker)
-	prev=xcclinker
-	continue
-	;;
-
-      # Some other compiler flag.
-      -* | +*)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-	case $arg in
-	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	  arg="\"$arg\""
-	  ;;
-	esac
-	;;
-
-      *.$objext)
-	# A standard object.
-	objs="$objs $arg"
-	;;
-
-      *.lo)
-	# A libtool-controlled object.
-
-	# Check to see that this really is a libtool object.
-	if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	  pic_object=
-	  non_pic_object=
-
-	  # Read the .lo file
-	  # If there is no directory component, then add one.
-	  case $arg in
-	  */* | *\\*) . $arg ;;
-	  *) . ./$arg ;;
-	  esac
-
-	  if test -z "$pic_object" || \
-	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none && \
-	     test "$non_pic_object" = none; then
-	    $echo "$modename: cannot find name of object for \`$arg'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-
-	  # Extract subdirectory from the argument.
-	  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-	  if test "X$xdir" = "X$arg"; then
-	    xdir=
- 	  else
-	    xdir="$xdir/"
-	  fi
-
-	  if test "$pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
-
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		dlfiles="$dlfiles $pic_object"
-		prev=
-		continue
-	      else
-		# If libtool objects are unsupported, then we need to preload.
-		prev=dlprefiles
-	      fi
-	    fi
-
-	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
-	      # Preload the old-style object.
-	      dlprefiles="$dlprefiles $pic_object"
-	      prev=
-	    fi
-
-	    # A PIC object.
-	    libobjs="$libobjs $pic_object"
-	    arg="$pic_object"
-	  fi
-
-	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
-
-	    # A standard non-PIC object
-	    non_pic_objects="$non_pic_objects $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
-	    fi
-	  else
-	    # If the PIC object exists, use it instead.
-	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
-	    non_pic_objects="$non_pic_objects $non_pic_object"
-	  fi
-	else
-	  # Only an error if not doing a dry-run.
-	  if test -z "$run"; then
-	    $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
-	    exit $EXIT_FAILURE
-	  else
-	    # Dry-run case.
-
-	    # Extract subdirectory from the argument.
-	    xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-	    if test "X$xdir" = "X$arg"; then
-	      xdir=
-	    else
-	      xdir="$xdir/"
-	    fi
-
-	    pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
-	    non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
-	    libobjs="$libobjs $pic_object"
-	    non_pic_objects="$non_pic_objects $non_pic_object"
-	  fi
-	fi
-	;;
-
-      *.$libext)
-	# An archive.
-	deplibs="$deplibs $arg"
-	old_deplibs="$old_deplibs $arg"
-	continue
-	;;
-
-      *.la)
-	# A libtool-controlled library.
-
-	if test "$prev" = dlfiles; then
-	  # This library was specified with -dlopen.
-	  dlfiles="$dlfiles $arg"
-	  prev=
-	elif test "$prev" = dlprefiles; then
-	  # The library was specified with -dlpreopen.
-	  dlprefiles="$dlprefiles $arg"
-	  prev=
-	else
-	  deplibs="$deplibs $arg"
-	fi
-	continue
-	;;
-
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-	case $arg in
-	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	  arg="\"$arg\""
-	  ;;
-	esac
-	;;
-      esac # arg
-
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	compile_command="$compile_command $arg"
-	finalize_command="$finalize_command $arg"
-      fi
-    done # argument parsing loop
-
-    if test -n "$prev"; then
-      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval arg=\"$export_dynamic_flag_spec\"
-      compile_command="$compile_command $arg"
-      finalize_command="$finalize_command $arg"
-    fi
-
-    oldlibs=
-    # calculate the name of the file, without its directory
-    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
-    libobjs_save="$libobjs"
-
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
-    else
-      shlib_search_path=
-    fi
-    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
-    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-
-    output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
-    if test "X$output_objdir" = "X$output"; then
-      output_objdir="$objdir"
-    else
-      output_objdir="$output_objdir/$objdir"
-    fi
-    # Create the object directory.
-    if test ! -d "$output_objdir"; then
-      $show "$mkdir $output_objdir"
-      $run $mkdir $output_objdir
-      exit_status=$?
-      if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then
-	exit $exit_status
-      fi
-    fi
-
-    # Determine the type of output
-    case $output in
-    "")
-      $echo "$modename: you must specify an output file" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-      ;;
-    *.$libext) linkmode=oldlib ;;
-    *.lo | *.$objext) linkmode=obj ;;
-    *.la) linkmode=lib ;;
-    *) linkmode=prog ;; # Anything else should be a program.
-    esac
-
-    case $host in
-    *cygwin* | *mingw* | *pw32*)
-      # don't eliminate duplications in $postdeps and $predeps
-      duplicate_compiler_generated_deps=yes
-      ;;
-    *)
-      duplicate_compiler_generated_deps=$duplicate_deps
-      ;;
-    esac
-    specialdeplibs=
-
-    libs=
-    # Find all interdependent deplibs by searching for libraries
-    # that are linked more than once (e.g. -la -lb -la)
-    for deplib in $deplibs; do
-      if test "X$duplicate_deps" = "Xyes" ; then
-	case "$libs " in
-	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	esac
-      fi
-      libs="$libs $deplib"
-    done
-
-    if test "$linkmode" = lib; then
-      libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
-      # Compute libraries that are listed more than once in $predeps
-      # $postdeps and mark them as special (i.e., whose duplicates are
-      # not to be eliminated).
-      pre_post_deps=
-      if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
-	for pre_post_dep in $predeps $postdeps; do
-	  case "$pre_post_deps " in
-	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
-	  esac
-	  pre_post_deps="$pre_post_deps $pre_post_dep"
-	done
-      fi
-      pre_post_deps=
-    fi
-
-    deplibs=
-    newdependency_libs=
-    newlib_search_path=
-    need_relink=no # whether we're linking any uninstalled libtool libraries
-    notinst_deplibs= # not-installed libtool libraries
-    case $linkmode in
-    lib)
-	passes="conv link"
-	for file in $dlfiles $dlprefiles; do
-	  case $file in
-	  *.la) ;;
-	  *)
-	    $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
-	    exit $EXIT_FAILURE
-	    ;;
-	  esac
-	done
-	;;
-    prog)
-	compile_deplibs=
-	finalize_deplibs=
-	alldeplibs=no
-	newdlfiles=
-	newdlprefiles=
-	passes="conv scan dlopen dlpreopen link"
-	;;
-    *)  passes="conv"
-	;;
-    esac
-    for pass in $passes; do
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
-	deplibs=
-      fi
-      if test "$linkmode" = prog; then
-	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
-	esac
-      fi
-      if test "$pass" = dlopen; then
-	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
-	deplibs=
-      fi
-      for deplib in $libs; do
-	lib=
-	found=no
-	case $deplib in
-	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    compiler_flags="$compiler_flags $deplib"
-	  fi
-	  continue
-	  ;;
-	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
-	    continue
-	  fi
-	  name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
-	  if test "$linkmode" = lib; then
-	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
-	  else
-	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
-	  fi
-	  for searchdir in $searchdirs; do
-	    for search_ext in .la $std_shrext .so .a; do
-	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
-	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
-		else
-		  found=no
-		fi
-		break 2
-	      fi
-	    done
-	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
-	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
-	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	      case " $predeps $postdeps " in
-	      *" $deplib "*)
-		if (${SED} -e '2q' $lib |
-                    grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-		  library_names=
-		  old_library=
-		  case $lib in
-		  */* | *\\*) . $lib ;;
-		  *) . ./$lib ;;
-		  esac
-		  for l in $old_library $library_names; do
-		    ll="$l"
-		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
-		    ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
-		    test "X$ladir" = "X$lib" && ladir="."
-		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
-		      compile_deplibs="$deplib $compile_deplibs"
-		      finalize_deplibs="$deplib $finalize_deplibs"
-		    else
-		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-		    fi
-		    continue
-		  fi
-		fi
-	        ;;
-	      *) ;;
-	      esac
-	    fi
-	  fi
-	  ;; # -l
-	-L*)
-	  case $linkmode in
-	  lib)
-	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
-	    newdependency_libs="$deplib $newdependency_libs"
-	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
-	    ;;
-	  prog)
-	    if test "$pass" = conv; then
-	      deplibs="$deplib $deplibs"
-	      continue
-	    fi
-	    if test "$pass" = scan; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
-	    ;;
-	  *)
-	    $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
-	    ;;
-	  esac # linkmode
-	  continue
-	  ;; # -L
-	-R*)
-	  if test "$pass" = link; then
-	    dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
-	    # Make sure the xrpath contains only unique directories.
-	    case "$xrpath " in
-	    *" $dir "*) ;;
-	    *) xrpath="$xrpath $dir" ;;
-	    esac
-	  fi
-	  deplibs="$deplib $deplibs"
-	  continue
-	  ;;
-	*.la) lib="$deplib" ;;
-	*.$libext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	    continue
-	  fi
-	  case $linkmode in
-	  lib)
-	    valid_a_lib=no
-	    case $deplibs_check_method in
-	      match_pattern*)
-		set dummy $deplibs_check_method
-	        match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
-		if eval $echo \"$deplib\" 2>/dev/null \
-		    | $SED 10q \
-		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		  valid_a_lib=yes
-		fi
-		;;
-	      pass_all)
-		valid_a_lib=yes
-		;;
-            esac
-	    if test "$valid_a_lib" != yes; then
-	      $echo
-	      $echo "*** Warning: Trying to link with static lib archive $deplib."
-	      $echo "*** I have the capability to make that library automatically link in when"
-	      $echo "*** you link to this library.  But I can only do this if you have a"
-	      $echo "*** shared version of the library, which you do not appear to have"
-	      $echo "*** because the file extensions .$libext of this argument makes me believe"
-	      $echo "*** that it is just a static archive that I should not used here."
-	    else
-	      $echo
-	      $echo "*** Warning: Linking the shared library $output against the"
-	      $echo "*** static library $deplib is not portable!"
-	      deplibs="$deplib $deplibs"
-	    fi
-	    continue
-	    ;;
-	  prog)
-	    if test "$pass" != link; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    continue
-	    ;;
-	  esac # linkmode
-	  ;; # *.$libext
-	*.lo | *.$objext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
-	      # If there is no dlopen support or we're linking statically,
-	      # we need to preload.
-	      newdlprefiles="$newdlprefiles $deplib"
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      newdlfiles="$newdlfiles $deplib"
-	    fi
-	  fi
-	  continue
-	  ;;
-	%DEPLIBS%)
-	  alldeplibs=yes
-	  continue
-	  ;;
-	esac # case $deplib
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-
-	# Check to see that this really is a libtool archive.
-	if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-	else
-	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-
-	ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
-	test "X$ladir" = "X$lib" && ladir="."
-
-	dlname=
-	dlopen=
-	dlpreopen=
-	libdir=
-	library_names=
-	old_library=
-	# If the library was installed with an old release of libtool,
-	# it will not redefine variables installed, or shouldnotlink
-	installed=yes
-	shouldnotlink=no
-	avoidtemprpath=
-
-
-	# Read the .la file
-	case $lib in
-	*/* | *\\*) . $lib ;;
-	*) . ./$lib ;;
-	esac
-
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
-	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
-	fi
-
-	if test "$pass" = conv; then
-	  # Only check for convenience libraries
-	  deplibs="$lib $deplibs"
-	  if test -z "$libdir"; then
-	    if test -z "$old_library"; then
-	      $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
-	      exit $EXIT_FAILURE
-	    fi
-	    # It is a libtool convenience library, so add in its objects.
-	    convenience="$convenience $ladir/$objdir/$old_library"
-	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
-	    tmp_libs=
-	    for deplib in $dependency_libs; do
-	      deplibs="$deplib $deplibs"
-              if test "X$duplicate_deps" = "Xyes" ; then
-	        case "$tmp_libs " in
-	        *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	        esac
-              fi
-	      tmp_libs="$tmp_libs $deplib"
-	    done
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    $echo "$modename: \`$lib' is not a convenience library" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	  continue
-	fi # $pass = conv
-
-
-	# Get the name of the library we link against.
-	linklib=
-	for l in $old_library $library_names; do
-	  linklib="$l"
-	done
-	if test -z "$linklib"; then
-	  $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-
-	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking
-	    # statically, we need to preload.  We also need to preload any
-	    # dependent libraries so libltdl's deplib preloader doesn't
-	    # bomb out in the load deplibs phase.
-	    dlprefiles="$dlprefiles $lib $dependency_libs"
-	  else
-	    newdlfiles="$newdlfiles $lib"
-	  fi
-	  continue
-	fi # $pass = dlopen
-
-	# We need an absolute path.
-	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
-	*)
-	  abs_ladir=`cd "$ladir" && pwd`
-	  if test -z "$abs_ladir"; then
-	    $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
-	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
-	    abs_ladir="$ladir"
-	  fi
-	  ;;
-	esac
-	laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
-
-	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
-	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    $echo "$modename: warning: library \`$lib' was moved." 1>&2
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
-	  else
-	    dir="$libdir"
-	    absdir="$libdir"
-	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
-	else
-	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  fi
-	fi # $installed = yes
-	name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
-
-	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir"; then
-	    $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	  # Prefer using a static library (so that no silly _DYNAMIC symbols
-	  # are required to link).
-	  if test -n "$old_library"; then
-	    newdlprefiles="$newdlprefiles $dir/$old_library"
-	  # Otherwise, use the dlname, so that lt_dlopen finds it.
-	  elif test -n "$dlname"; then
-	    newdlprefiles="$newdlprefiles $dir/$dlname"
-	  else
-	    newdlprefiles="$newdlprefiles $dir/$linklib"
-	  fi
-	fi # $pass = dlpreopen
-
-	if test -z "$libdir"; then
-	  # Link the convenience library
-	  if test "$linkmode" = lib; then
-	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$dir/$old_library $compile_deplibs"
-	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
-	  else
-	    deplibs="$lib $deplibs" # used for prog,scan pass
-	  fi
-	  continue
-	fi
-
-
-	if test "$linkmode" = prog && test "$pass" != link; then
-	  newlib_search_path="$newlib_search_path $ladir"
-	  deplibs="$lib $deplibs"
-
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
-	  fi
-
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    case $deplib in
-	    -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
-	    esac
-	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      # Need to hardcode shared library paths
-	      # or/and link against static libraries
-	      newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    if test "X$duplicate_deps" = "Xyes" ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done # for deplib
-	  continue
-	fi # $linkmode = prog...
-
-	if test "$linkmode,$pass" = "prog,link"; then
-	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-		 test "$prefer_static_libs,$installed" = "built,yes"; } ||
-	       test -z "$old_library"; }; then
-	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
-	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath " in
-	      *" $dir "*) ;;
-	      *" $absdir "*) ;;
-	      *) temp_rpath="$temp_rpath $absdir" ;;
-	      esac
-	    fi
-
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi # $linkmode,$pass = prog,link...
-
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
-		 test -n "$library_names"; }; }; then
-	    # We only need to search for static libraries
-	    continue
-	  fi
-	fi
-
-	link_static=no # Whether the deplib will be linked statically
-	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes ; then
-	  use_static_libs=no
-	fi
-	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
-	  if test "$installed" = no; then
-	    notinst_deplibs="$notinst_deplibs $lib"
-	    need_relink=yes
-	  fi
-	  # This is a shared library
-
-	  # Warn about portability, can't link against -module's on
-	  # some systems (darwin)
-	  if test "$shouldnotlink" = yes && test "$pass" = link ; then
-	    $echo
-	    if test "$linkmode" = prog; then
-	      $echo "*** Warning: Linking the executable $output against the loadable module"
-	    else
-	      $echo "*** Warning: Linking the shared library $output against the loadable module"
-	    fi
-	    $echo "*** $linklib is not portable!"
-	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi
-
-	  if test -n "$old_archive_from_expsyms_cmds"; then
-	    # figure out the soname
-	    set dummy $library_names
-	    realname="$2"
-	    shift; shift
-	    libname=`eval \\$echo \"$libname_spec\"`
-	    # use dlname if we got it. it's perfectly good, no?
-	    if test -n "$dlname"; then
-	      soname="$dlname"
-	    elif test -n "$soname_spec"; then
-	      # bleh windows
-	      case $host in
-	      *cygwin* | mingw*)
-		major=`expr $current - $age`
-		versuffix="-$major"
-		;;
-	      esac
-	      eval soname=\"$soname_spec\"
-	    else
-	      soname="$realname"
-	    fi
-
-	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
-	    soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
-	    newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
-
-	    # If the library has no export list, then create one now
-	    if test -f "$output_objdir/$soname-def"; then :
-	    else
-	      $show "extracting exported symbol list from \`$soname'"
-	      save_ifs="$IFS"; IFS='~'
-	      cmds=$extract_expsyms_cmds
-	      for cmd in $cmds; do
-		IFS="$save_ifs"
-		eval cmd=\"$cmd\"
-		$show "$cmd"
-		$run eval "$cmd" || exit $?
-	      done
-	      IFS="$save_ifs"
-	    fi
-
-	    # Create $newlib
-	    if test -f "$output_objdir/$newlib"; then :; else
-	      $show "generating import library for \`$soname'"
-	      save_ifs="$IFS"; IFS='~'
-	      cmds=$old_archive_from_expsyms_cmds
-	      for cmd in $cmds; do
-		IFS="$save_ifs"
-		eval cmd=\"$cmd\"
-		$show "$cmd"
-		$run eval "$cmd" || exit $?
-	      done
-	      IFS="$save_ifs"
-	    fi
-	    # make sure the library variables are pointing to the new library
-	    dir=$output_objdir
-	    linklib=$newlib
-	  fi # test -n "$old_archive_from_expsyms_cmds"
-
-	  if test "$linkmode" = prog || test "$mode" != relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    lib_linked=yes
-	    case $hardcode_action in
-	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
-		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
-		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
-		  *-*-darwin* )
-		    # if the lib is a module then we can not link against
-		    # it, someone is ignoring the new warnings I added
-		    if /usr/bin/file -L $add 2> /dev/null |
-                      $EGREP ": [^:]* bundle" >/dev/null ; then
-		      $echo "** Warning, lib $linklib is a module, not a shared library"
-		      if test -z "$old_library" ; then
-		        $echo
-		        $echo "** And there doesn't seem to be a static archive available"
-		        $echo "** The link will probably fail, sorry"
-		      else
-		        add="$dir/$old_library"
-		      fi
-		    fi
-		esac
-	      elif test "$hardcode_minus_L" = no; then
-		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
-		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    relink)
-	      if test "$hardcode_direct" = yes; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$dir"
-		# Try looking first in the location we're being installed to.
-		if test -n "$inst_prefix_dir"; then
-		  case $libdir in
-		    [\\/]*)
-		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		      ;;
-		  esac
-		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    *) lib_linked=no ;;
-	    esac
-
-	    if test "$lib_linked" != yes; then
-	      $echo "$modename: configuration error: unsupported hardcode properties"
-	      exit $EXIT_FAILURE
-	    fi
-
-	    if test -n "$add_shlibpath"; then
-	      case :$compile_shlibpath: in
-	      *":$add_shlibpath:"*) ;;
-	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
-	      esac
-	    fi
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
-	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes && \
-		 test "$hardcode_minus_L" != yes && \
-		 test "$hardcode_shlibpath_var" = yes; then
-		case :$finalize_shlibpath: in
-		*":$libdir:"*) ;;
-		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-		esac
-	      fi
-	    fi
-	  fi
-
-	  if test "$linkmode" = prog || test "$mode" = relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case :$finalize_shlibpath: in
-	      *":$libdir:"*) ;;
-	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
-	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-	        add="$inst_prefix_dir$libdir/$linklib"
-	      else
-	        add="$libdir/$linklib"
-	      fi
-	    else
-	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
-	      # Try looking first in the location we're being installed to.
-	      if test -n "$inst_prefix_dir"; then
-		case $libdir in
-		  [\\/]*)
-		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		    ;;
-		esac
-	      fi
-	      add="-l$name"
-	    fi
-
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
-	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	    fi
-	  fi
-	elif test "$linkmode" = prog; then
-	  # Here we assume that one of hardcode_direct or hardcode_minus_L
-	  # is not unsupported.  This is valid on all known static and
-	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
-	    compile_deplibs="$dir/$linklib $compile_deplibs"
-	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
-	  else
-	    compile_deplibs="-l$name -L$dir $compile_deplibs"
-	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
-	  fi
-	elif test "$build_libtool_libs" = yes; then
-	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
-	    # We're trying link a shared library against a static one
-	    # but the system doesn't support it.
-
-	    # Just print a warning and add the library to dependency_libs so
-	    # that the program can be linked against the static library.
-	    $echo
-	    $echo "*** Warning: This system can not link to static lib archive $lib."
-	    $echo "*** I have the capability to make that library automatically link in when"
-	    $echo "*** you link to this library.  But I can only do this if you have a"
-	    $echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
-	      $echo "*** But as you try to build a module library, libtool will still create "
-	      $echo "*** a static module, that should work as long as the dlopening application"
-	      $echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
-	      if test -z "$global_symbol_pipe"; then
-		$echo
-		$echo "*** However, this would only work if libtool was able to extract symbol"
-		$echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-		$echo "*** not find such a program.  So, this module is probably useless."
-		$echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	      fi
-	      if test "$build_old_libs" = no; then
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  else
-	    deplibs="$dir/$old_library $deplibs"
-	    link_static=yes
-	  fi
-	fi # link shared/static library?
-
-	if test "$linkmode" = lib; then
-	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
-	    # Extract -R from dependency_libs
-	    temp_deplibs=
-	    for libdir in $dependency_libs; do
-	      case $libdir in
-	      -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
-		   case " $xrpath " in
-		   *" $temp_xrpath "*) ;;
-		   *) xrpath="$xrpath $temp_xrpath";;
-		   esac;;
-	      *) temp_deplibs="$temp_deplibs $libdir";;
-	      esac
-	    done
-	    dependency_libs="$temp_deplibs"
-	  fi
-
-	  newlib_search_path="$newlib_search_path $absdir"
-	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
-	  # ... and its dependency_libs
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    newdependency_libs="$deplib $newdependency_libs"
-	    if test "X$duplicate_deps" = "Xyes" ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
-
-	  if test "$link_all_deplibs" != no; then
-	    # Add the search paths of all dependency libraries
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      -L*) path="$deplib" ;;
-	      *.la)
-		dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
-		test "X$dir" = "X$deplib" && dir="."
-		# We need an absolute path.
-		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-		*)
-		  absdir=`cd "$dir" && pwd`
-		  if test -z "$absdir"; then
-		    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
-		    absdir="$dir"
-		  fi
-		  ;;
-		esac
-		if grep "^installed=no" $deplib > /dev/null; then
-		  path="$absdir/$objdir"
-		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  if test -z "$libdir"; then
-		    $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
-		    exit $EXIT_FAILURE
-		  fi
-		  if test "$absdir" != "$libdir"; then
-		    $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
-		  fi
-		  path="$absdir"
-		fi
-		depdepl=
-		case $host in
-		*-*-darwin*)
-		  # we do not want to link against static libs,
-		  # but need to link against shared
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
-		      depdepl=$tmp
-		    done
-		    if test -f "$deplibdir/$depdepl" ; then
-		      depdepl="$deplibdir/$depdepl"
-	      	    elif test -f "$path/$depdepl" ; then
-		      depdepl="$path/$depdepl"
-		    else
-		      # Can't find it, oh well...
-		      depdepl=
-		    fi
-		    # do not add paths which are already there
-		    case " $newlib_search_path " in
-		    *" $path "*) ;;
-		    *) newlib_search_path="$newlib_search_path $path";;
-		    esac
-		  fi
-		  path=""
-		  ;;
-		*)
-		  path="-L$path"
-		  ;;
-		esac
-		;;
-	      -l*)
-		case $host in
-		*-*-darwin*)
-		  # Again, we only want to link against shared libraries
-		  eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
-		  for tmp in $newlib_search_path ; do
-		    if test -f "$tmp/lib$tmp_libs.dylib" ; then
-		      eval depdepl="$tmp/lib$tmp_libs.dylib"
-		      break
-		    fi
-		  done
-		  path=""
-		  ;;
-		*) continue ;;
-		esac
-		;;
-	      *) continue ;;
-	      esac
-	      case " $deplibs " in
-	      *" $path "*) ;;
-	      *) deplibs="$path $deplibs" ;;
-	      esac
-	      case " $deplibs " in
-	      *" $depdepl "*) ;;
-	      *) deplibs="$depdepl $deplibs" ;;
-	      esac
-	    done
-	  fi # link_all_deplibs != no
-	fi # linkmode = lib
-      done # for deplib in $libs
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
-	# Link the dlpreopened libraries before other libraries
-	for deplib in $save_deplibs; do
-	  deplibs="$deplib $deplibs"
-	done
-      fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
-	  # Make sure lib_search_path contains only unique directories.
-	  lib_search_path=
-	  for dir in $newlib_search_path; do
-	    case "$lib_search_path " in
-	    *" $dir "*) ;;
-	    *) lib_search_path="$lib_search_path $dir" ;;
-	    esac
-	  done
-	  newlib_search_path=
-	fi
-
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
-	  vars="compile_deplibs finalize_deplibs"
-	fi
-	for var in $vars dependency_libs; do
-	  # Add libraries to $var in reverse order
-	  eval tmp_libs=\"\$$var\"
-	  new_libs=
-	  for deplib in $tmp_libs; do
-	    # FIXME: Pedantically, this is the right thing to do, so
-	    #        that some nasty dependency loop isn't accidentally
-	    #        broken:
-	    #new_libs="$deplib $new_libs"
-	    # Pragmatically, this seems to cause very few problems in
-	    # practice:
-	    case $deplib in
-	    -L*) new_libs="$deplib $new_libs" ;;
-	    -R*) ;;
-	    *)
-	      # And here is the reason: when a library appears more
-	      # than once as an explicit dependence of a library, or
-	      # is implicitly linked in more than once by the
-	      # compiler, it is considered special, and multiple
-	      # occurrences thereof are not removed.  Compare this
-	      # with having the same library being listed as a
-	      # dependency of multiple other libraries: in this case,
-	      # we know (pedantically, we assume) the library does not
-	      # need to be listed more than once, so we keep only the
-	      # last copy.  This is not always right, but it is rare
-	      # enough that we require users that really mean to play
-	      # such unportable linking tricks to link the library
-	      # using -Wl,-lname, so that libtool does not consider it
-	      # for duplicate removal.
-	      case " $specialdeplibs " in
-	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
-	      *)
-		case " $new_libs " in
-		*" $deplib "*) ;;
-		*) new_libs="$deplib $new_libs" ;;
-		esac
-		;;
-	      esac
-	      ;;
-	    esac
-	  done
-	  tmp_libs=
-	  for deplib in $new_libs; do
-	    case $deplib in
-	    -L*)
-	      case " $tmp_libs " in
-	      *" $deplib "*) ;;
-	      *) tmp_libs="$tmp_libs $deplib" ;;
-	      esac
-	      ;;
-	    *) tmp_libs="$tmp_libs $deplib" ;;
-	    esac
-	  done
-	  eval $var=\"$tmp_libs\"
-	done # for var
-      fi
-      # Last step: remove runtime libs from dependency_libs
-      # (they stay in deplibs)
-      tmp_libs=
-      for i in $dependency_libs ; do
-	case " $predeps $postdeps $compiler_lib_search_path " in
-	*" $i "*)
-	  i=""
-	  ;;
-	esac
-	if test -n "$i" ; then
-	  tmp_libs="$tmp_libs $i"
-	fi
-      done
-      dependency_libs=$tmp_libs
-    done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
-      dlprefiles="$newdlprefiles"
-    fi
-
-    case $linkmode in
-    oldlib)
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;;
-      esac
-
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
-      fi
-
-      if test -n "$rpath"; then
-	$echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
-      fi
-
-      if test -n "$xrpath"; then
-	$echo "$modename: warning: \`-R' is ignored for archives" 1>&2
-      fi
-
-      if test -n "$vinfo"; then
-	$echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
-      fi
-
-      if test -n "$release"; then
-	$echo "$modename: warning: \`-release' is ignored for archives" 1>&2
-      fi
-
-      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	$echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
-      fi
-
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      objs="$objs$old_deplibs"
-      ;;
-
-    lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case $outputname in
-      lib*)
-	name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
-	eval shared_ext=\"$shrext_cmds\"
-	eval libname=\"$libname_spec\"
-	;;
-      *)
-	if test "$module" = no; then
-	  $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-	if test "$need_lib_prefix" != no; then
-	  # Add the "lib" prefix for modules if required
-	  name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
-	  eval shared_ext=\"$shrext_cmds\"
-	  eval libname=\"$libname_spec\"
-	else
-	  libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
-	fi
-	;;
-      esac
-
-      if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
-	  exit $EXIT_FAILURE
-	else
-	  $echo
-	  $echo "*** Warning: Linking the shared library $output against the non-libtool"
-	  $echo "*** objects $objs is not portable!"
-	  libobjs="$libobjs $objs"
-	fi
-      fi
-
-      if test "$dlself" != no; then
-	$echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
-      fi
-
-      set dummy $rpath
-      if test "$#" -gt 2; then
-	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
-      fi
-      install_libdir="$2"
-
-      oldlibs=
-      if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
-	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
-	  # convenience libraries should have the same extension an
-	  # archive normally would.
-	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
-	  build_libtool_libs=convenience
-	  build_old_libs=yes
-	fi
-
-	if test -n "$vinfo"; then
-	  $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
-	fi
-
-	if test -n "$release"; then
-	  $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
-	fi
-      else
-
-	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
-	set dummy $vinfo 0 0 0
-	IFS="$save_ifs"
-
-	if test -n "$8"; then
-	  $echo "$modename: too many parameters to \`-version-info'" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-
-	# convert absolute version numbers to libtool ages
-	# this retains compatibility with .la files and attempts
-	# to make the code below a bit more comprehensible
-
-	case $vinfo_number in
-	yes)
-	  number_major="$2"
-	  number_minor="$3"
-	  number_revision="$4"
-	  #
-	  # There are really only two kinds -- those that
-	  # use the current revision as the major version
-	  # and those that subtract age and use age as
-	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
-	  #
-	  case $version_type in
-	  darwin|linux|osf|windows|none)
-	    current=`expr $number_major + $number_minor`
-	    age="$number_minor"
-	    revision="$number_revision"
-	    ;;
-	  freebsd-aout|freebsd-elf|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
-	    ;;
-	  irix|nonstopux)
-	    current=`expr $number_major + $number_minor`
-	    age="$number_minor"
-	    revision="$number_minor"
-	    lt_irix_increment=no
-	    ;;
-	  esac
-	  ;;
-	no)
-	  current="$2"
-	  revision="$3"
-	  age="$4"
-	  ;;
-	esac
-
-	# Check that each of the things are valid numbers.
-	case $current in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2
-	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
-
-	case $revision in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2
-	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
-
-	case $age in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2
-	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
-
-	if test "$age" -gt "$current"; then
-	  $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
-	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-
-	# Calculate the version variables.
-	major=
-	versuffix=
-	verstring=
-	case $version_type in
-	none) ;;
-
-	darwin)
-	  # Like Linux, but with the current version available in
-	  # verstring for coding it into the library header
-	  major=.`expr $current - $age`
-	  versuffix="$major.$age.$revision"
-	  # Darwin ld doesn't like 0 for these options...
-	  minor_current=`expr $current + 1`
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
-	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
-	  ;;
-
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
-
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current";
-	  ;;
-
-	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
-	    major=`expr $current - $age`
-	  else
-	    major=`expr $current - $age + 1`
-	  fi
-	  case $version_type in
-	    nonstopux) verstring_prefix=nonstopux ;;
-	    *)         verstring_prefix=sgi ;;
-	  esac
-	  verstring="$verstring_prefix$major.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$revision
-	  while test "$loop" -ne 0; do
-	    iface=`expr $revision - $loop`
-	    loop=`expr $loop - 1`
-	    verstring="$verstring_prefix$major.$iface:$verstring"
-	  done
-
-	  # Before this point, $major must not contain `.'.
-	  major=.$major
-	  versuffix="$major.$revision"
-	  ;;
-
-	linux)
-	  major=.`expr $current - $age`
-	  versuffix="$major.$age.$revision"
-	  ;;
-
-	osf)
-	  major=.`expr $current - $age`
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$age
-	  while test "$loop" -ne 0; do
-	    iface=`expr $current - $loop`
-	    loop=`expr $loop - 1`
-	    verstring="$verstring:${iface}.0"
-	  done
-
-	  # Make executables depend on our current version.
-	  verstring="$verstring:${current}.0"
-	  ;;
-
-	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
-	  ;;
-
-	windows)
-	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
-	  major=`expr $current - $age`
-	  versuffix="-$major"
-	  ;;
-
-	*)
-	  $echo "$modename: unknown library version type \`$version_type'" 1>&2
-	  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
-
-	# Clear the version info if we defaulted, and they specified a release.
-	if test -z "$vinfo" && test -n "$release"; then
-	  major=
-	  case $version_type in
-	  darwin)
-	    # we can't check for "0.0" in archive_cmds due to quoting
-	    # problems, so we reset it completely
-	    verstring=
-	    ;;
-	  *)
-	    verstring="0.0"
-	    ;;
-	  esac
-	  if test "$need_version" = no; then
-	    versuffix=
-	  else
-	    versuffix=".0.0"
-	  fi
-	fi
-
-	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
-	  major=
-	  versuffix=
-	  verstring=""
-	fi
-
-	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
-	    build_libtool_libs=no
-	    build_old_libs=yes
-	  fi
-	else
-	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
-	fi
-      fi
-
-      if test "$mode" != relink; then
-	# Remove our outputs, but don't remove object files since they
-	# may have been created when compiling PIC objects.
-	removelist=
-	tempremovelist=`$echo "$output_objdir/*"`
-	for p in $tempremovelist; do
-	  case $p in
-	    *.$objext)
-	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
-	         if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
-	         then
-		   continue
-		 fi
-	       fi
-	       removelist="$removelist $p"
-	       ;;
-	    *) ;;
-	  esac
-	done
-	if test -n "$removelist"; then
-	  $show "${rm}r $removelist"
-	  $run ${rm}r $removelist
-	fi
-      fi
-
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-	oldlibs="$oldlibs $output_objdir/$libname.$libext"
-
-	# Transform .lo files to .o files.
-	oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
-      fi
-
-      # Eliminate all temporary directories.
-      #for path in $notinst_path; do
-      #	lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"`
-      #	deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"`
-      #	dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"`
-      #done
-
-      if test -n "$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  temp_xrpath="$temp_xrpath -R$libdir"
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
-	  dependency_libs="$temp_xrpath $dependency_libs"
-	fi
-      fi
-
-      # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
-      dlfiles=
-      for lib in $old_dlfiles; do
-	case " $dlprefiles $dlfiles " in
-	*" $lib "*) ;;
-	*) dlfiles="$dlfiles $lib" ;;
-	esac
-      done
-
-      # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
-      dlprefiles=
-      for lib in $old_dlprefiles; do
-	case "$dlprefiles " in
-	*" $lib "*) ;;
-	*) dlprefiles="$dlprefiles $lib" ;;
-	esac
-      done
-
-      if test "$build_libtool_libs" = yes; then
-	if test -n "$rpath"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
-	    # these systems don't actually have a c library (as such)!
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C library is in the System framework
-	    deplibs="$deplibs -framework System"
-	    ;;
-	  *-*-netbsd*)
-	    # Don't link with libc until the a.out ld.so is fixed.
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    ;;
- 	  *)
-	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
-	      deplibs="$deplibs -lc"
-	    fi
-	    ;;
-	  esac
-	fi
-
-	# Transform deplibs into only deplibs that can be linked in shared.
-	name_save=$name
-	libname_save=$libname
-	release_save=$release
-	versuffix_save=$versuffix
-	major_save=$major
-	# I'm not sure if I'm treating the release correctly.  I think
-	# release should show up in the -l (ie -lgmp5) so we don't want to
-	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
-	newdeplibs=
-	droppeddeps=no
-	case $deplibs_check_method in
-	pass_all)
-	  # Don't check for shared/static.  Everything works.
-	  # This might be a little naive.  We might want to check
-	  # whether the library exists or not.  But this is on
-	  # osf3 & osf4 and I'm not really sure... Just
-	  # implementing what was already the behavior.
-	  newdeplibs=$deplibs
-	  ;;
-	test_compile)
-	  # This code stresses the "libraries are programs" paradigm to its
-	  # limits. Maybe even breaks it.  We compile a program, linking it
-	  # against the deplibs as a proxy for the library.  Then we can check
-	  # whether they linked in statically or dynamically with ldd.
-	  $rm conftest.c
-	  cat > conftest.c <<EOF
-	  int main() { return 0; }
-EOF
-	  $rm conftest
-	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
-	    ldd_output=`ldd conftest`
-	    for i in $deplibs; do
-	      name=`expr $i : '-l\(.*\)'`
-	      # If $name is empty we are operating on a -L argument.
-              if test "$name" != "" && test "$name" != "0"; then
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		  case " $predeps $postdeps " in
-		  *" $i "*)
-		    newdeplibs="$newdeplibs $i"
-		    i=""
-		    ;;
-		  esac
-	        fi
-		if test -n "$i" ; then
-		  libname=`eval \\$echo \"$libname_spec\"`
-		  deplib_matches=`eval \\$echo \"$library_names_spec\"`
-		  set dummy $deplib_matches
-		  deplib_match=$2
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		    newdeplibs="$newdeplibs $i"
-		  else
-		    droppeddeps=yes
-		    $echo
-		    $echo "*** Warning: dynamic linker does not accept needed library $i."
-		    $echo "*** I have the capability to make that library automatically link in when"
-		    $echo "*** you link to this library.  But I can only do this if you have a"
-		    $echo "*** shared version of the library, which I believe you do not have"
-		    $echo "*** because a test_compile did reveal that the linker did not use it for"
-		    $echo "*** its dynamic dependency list that programs get resolved with at runtime."
-		  fi
-		fi
-	      else
-		newdeplibs="$newdeplibs $i"
-	      fi
-	    done
-	  else
-	    # Error occurred in the first compile.  Let's try to salvage
-	    # the situation: Compile a separate program for each library.
-	    for i in $deplibs; do
-	      name=`expr $i : '-l\(.*\)'`
-	      # If $name is empty we are operating on a -L argument.
-              if test "$name" != "" && test "$name" != "0"; then
-		$rm conftest
-		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
-		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		    case " $predeps $postdeps " in
-		    *" $i "*)
-		      newdeplibs="$newdeplibs $i"
-		      i=""
-		      ;;
-		    esac
-		  fi
-		  if test -n "$i" ; then
-		    libname=`eval \\$echo \"$libname_spec\"`
-		    deplib_matches=`eval \\$echo \"$library_names_spec\"`
-		    set dummy $deplib_matches
-		    deplib_match=$2
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		      newdeplibs="$newdeplibs $i"
-		    else
-		      droppeddeps=yes
-		      $echo
-		      $echo "*** Warning: dynamic linker does not accept needed library $i."
-		      $echo "*** I have the capability to make that library automatically link in when"
-		      $echo "*** you link to this library.  But I can only do this if you have a"
-		      $echo "*** shared version of the library, which you do not appear to have"
-		      $echo "*** because a test_compile did reveal that the linker did not use this one"
-		      $echo "*** as a dynamic dependency that programs can get resolved with at runtime."
-		    fi
-		  fi
-		else
-		  droppeddeps=yes
-		  $echo
-		  $echo "*** Warning!  Library $i is needed by this library but I was not able to"
-		  $echo "*** make it link in!  You will probably need to install it or some"
-		  $echo "*** library that it depends on before this library will be fully"
-		  $echo "*** functional.  Installing it before continuing would be even better."
-		fi
-	      else
-		newdeplibs="$newdeplibs $i"
-	      fi
-	    done
-	  fi
-	  ;;
-	file_magic*)
-	  set dummy $deplibs_check_method
-	  file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    name=`expr $a_deplib : '-l\(.*\)'`
-	    # If $name is empty we are operating on a -L argument.
-            if test "$name" != "" && test  "$name" != "0"; then
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval \\$echo \"$libname_spec\"`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		      # Follow soft links.
-		      if ls -lLd "$potent_lib" 2>/dev/null \
-			 | grep " -> " >/dev/null; then
-			continue
-		      fi
-		      # The statement above tries to avoid entering an
-		      # endless loop below, in case of cyclic links.
-		      # We might still enter an endless loop, since a link
-		      # loop can be closed while we follow links,
-		      # but so what?
-		      potlib="$potent_lib"
-		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
-			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
-			esac
-		      done
-		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
-			 | ${SED} 10q \
-			 | $EGREP "$file_magic_regex" > /dev/null; then
-			newdeplibs="$newdeplibs $a_deplib"
-			a_deplib=""
-			break 2
-		      fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		$echo
-		$echo "*** Warning: linker path does not have real file for library $a_deplib."
-		$echo "*** I have the capability to make that library automatically link in when"
-		$echo "*** you link to this library.  But I can only do this if you have a"
-		$echo "*** shared version of the library, which you do not appear to have"
-		$echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $echo "*** with $libname but no candidates were found. (...for file magic test)"
-		else
-		  $echo "*** with $libname and none of the candidates passed a file format test"
-		  $echo "*** using a file magic. Last file checked: $potlib"
-		fi
-	      fi
-	    else
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	    fi
-	  done # Gone through all deplibs.
-	  ;;
-	match_pattern*)
-	  set dummy $deplibs_check_method
-	  match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    name=`expr $a_deplib : '-l\(.*\)'`
-	    # If $name is empty we are operating on a -L argument.
-	    if test -n "$name" && test "$name" != "0"; then
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval \\$echo \"$libname_spec\"`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
-		    if eval $echo \"$potent_lib\" 2>/dev/null \
-		        | ${SED} 10q \
-		        | $EGREP "$match_pattern_regex" > /dev/null; then
-		      newdeplibs="$newdeplibs $a_deplib"
-		      a_deplib=""
-		      break 2
-		    fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		$echo
-		$echo "*** Warning: linker path does not have real file for library $a_deplib."
-		$echo "*** I have the capability to make that library automatically link in when"
-		$echo "*** you link to this library.  But I can only do this if you have a"
-		$echo "*** shared version of the library, which you do not appear to have"
-		$echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $echo "*** with $libname but no candidates were found. (...for regex pattern test)"
-		else
-		  $echo "*** with $libname and none of the candidates passed a file format test"
-		  $echo "*** using a regex pattern. Last file checked: $potlib"
-		fi
-	      fi
-	    else
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	    fi
-	  done # Gone through all deplibs.
-	  ;;
-	none | unknown | *)
-	  newdeplibs=""
-	  tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
-	    -e 's/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
-	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
-	    done
-	  fi
-	  if $echo "X $tmp_deplibs" | $Xsed -e 's/[ 	]//g' \
-	    | grep . >/dev/null; then
-	    $echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
-	      $echo "*** Warning: inter-library dependencies are not supported in this platform."
-	    else
-	      $echo "*** Warning: inter-library dependencies are not known to be supported."
-	    fi
-	    $echo "*** All declared inter-library dependencies are being dropped."
-	    droppeddeps=yes
-	  fi
-	  ;;
-	esac
-	versuffix=$versuffix_save
-	major=$major_save
-	release=$release_save
-	libname=$libname_save
-	name=$name_save
-
-	case $host in
-	*-*-rhapsody* | *-*-darwin1.[012])
-	  # On Rhapsody replace the C library is the System framework
-	  newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
-	  ;;
-	esac
-
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
-	    $echo
-	    $echo "*** Warning: libtool could not satisfy all declared inter-library"
-	    $echo "*** dependencies of module $libname.  Therefore, libtool will create"
-	    $echo "*** a static module, that should work as long as the dlopening"
-	    $echo "*** application is linked with the -dlopen flag."
-	    if test -z "$global_symbol_pipe"; then
-	      $echo
-	      $echo "*** However, this would only work if libtool was able to extract symbol"
-	      $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-	      $echo "*** not find such a program.  So, this module is probably useless."
-	      $echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
-	      build_libtool_libs=module
-	      build_old_libs=yes
-	    else
-	      build_libtool_libs=no
-	    fi
-	  else
-	    $echo "*** The inter-library dependencies that have been dropped here will be"
-	    $echo "*** automatically added whenever a program is linked with this library"
-	    $echo "*** or is declared to -dlopen it."
-
-	    if test "$allow_undefined" = no; then
-	      $echo
-	      $echo "*** Since this library must not contain undefined symbols,"
-	      $echo "*** because either the platform does not support them or"
-	      $echo "*** it was explicitly requested with -no-undefined,"
-	      $echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  fi
-	fi
-	# Done checking deplibs!
-	deplibs=$newdeplibs
-      fi
-
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      deplibs="$new_libs"
-
-
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
-
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	if test "$hardcode_into_libs" = yes; then
-	  # Hardcode the library paths
-	  hardcode_libdirs=
-	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$mode" != relink && rpath="$compile_rpath$rpath"
-	  for libdir in $rpath; do
-	    if test -n "$hardcode_libdir_flag_spec"; then
-	      if test -n "$hardcode_libdir_separator"; then
-		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
-		else
-		  # Just accumulate the unique libdirs.
-		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		    ;;
-		  *)
-		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		    ;;
-		  esac
-		fi
-	      else
-		eval flag=\"$hardcode_libdir_flag_spec\"
-		dep_rpath="$dep_rpath $flag"
-	      fi
-	    elif test -n "$runpath_var"; then
-	      case "$perm_rpath " in
-	      *" $libdir "*) ;;
-	      *) perm_rpath="$perm_rpath $libdir" ;;
-	      esac
-	    fi
-	  done
-	  # Substitute the hardcoded libdirs into the rpath.
-	  if test -n "$hardcode_libdir_separator" &&
-	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
-	    if test -n "$hardcode_libdir_flag_spec_ld"; then
-	      case $archive_cmds in
-	      *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;;
-	      *)      eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;;
-	      esac
-	    else
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
-	    fi
-	  fi
-	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
-	    # We should set the runpath_var.
-	    rpath=
-	    for dir in $perm_rpath; do
-	      rpath="$rpath$dir:"
-	    done
-	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
-	  fi
-	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
-	fi
-
-	shlibpath="$finalize_shlibpath"
-	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
-	if test -n "$shlibpath"; then
-	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
-	fi
-
-	# Get the real and link names of the library.
-	eval shared_ext=\"$shrext_cmds\"
-	eval library_names=\"$library_names_spec\"
-	set dummy $library_names
-	realname="$2"
-	shift; shift
-
-	if test -n "$soname_spec"; then
-	  eval soname=\"$soname_spec\"
-	else
-	  soname="$realname"
-	fi
-	if test -z "$dlname"; then
-	  dlname=$soname
-	fi
-
-	lib="$output_objdir/$realname"
-	linknames=
-	for link
-	do
-	  linknames="$linknames $link"
-	done
-
-	# Use standard objects if they are pic
-	test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-
-	# Prepare the list of exported symbols
-	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    $show "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $run $rm $export_symbols
-	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $cmds; do
-	      IFS="$save_ifs"
-	      eval cmd=\"$cmd\"
-	      if len=`expr "X$cmd" : ".*"` &&
-	       test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	        $show "$cmd"
-	        $run eval "$cmd" || exit $?
-	        skipped_export=false
-	      else
-	        # The command line is too long to execute in one step.
-	        $show "using reloadable object file for export list..."
-	        skipped_export=:
-		# Break out early, otherwise skipped_export may be
-		# set to false by a later but shorter cmd.
-		break
-	      fi
-	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex"; then
-	      $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
-	      $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      $show "$mv \"${export_symbols}T\" \"$export_symbols\""
-	      $run eval '$mv "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-	fi
-
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
-	fi
-
-	tmp_deplibs=
-	for test_deplib in $deplibs; do
-		case " $convenience " in
-		*" $test_deplib "*) ;;
-		*)
-			tmp_deplibs="$tmp_deplibs $test_deplib"
-			;;
-		esac
-	done
-	deplibs="$tmp_deplibs"
-
-	if test -n "$convenience"; then
-	  if test -n "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	  else
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
-
-	    func_extract_archives $gentop $convenience
-	    libobjs="$libobjs $func_extract_archives_result"
-	  fi
-	fi
-	
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-	  eval flag=\"$thread_safe_flag_spec\"
-	  linker_flags="$linker_flags $flag"
-	fi
-
-	# Make a backup of the uninstalled library when relinking
-	if test "$mode" = relink; then
-	  $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
-	fi
-
-	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
-	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	    eval test_cmds=\"$module_expsym_cmds\"
-	    cmds=$module_expsym_cmds
-	  else
-	    eval test_cmds=\"$module_cmds\"
-	    cmds=$module_cmds
-	  fi
-	else
-	if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	  eval test_cmds=\"$archive_expsym_cmds\"
-	  cmds=$archive_expsym_cmds
-	else
-	  eval test_cmds=\"$archive_cmds\"
-	  cmds=$archive_cmds
-	  fi
-	fi
-
-	if test "X$skipped_export" != "X:" &&
-	   len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
-	   test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  :
-	else
-	  # The command line is too long to link in one step, link piecewise.
-	  $echo "creating reloadable object files..."
-
-	  # Save the value of $output and $libobjs because we want to
-	  # use them later.  If we have whole_archive_flag_spec, we
-	  # want to use save_libobjs as it was before
-	  # whole_archive_flag_spec was expanded, because we can't
-	  # assume the linker understands whole_archive_flag_spec.
-	  # This may have to be revisited, in case too many
-	  # convenience libraries get linked in and end up exceeding
-	  # the spec.
-	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	  fi
-	  save_output=$output
-	  output_la=`$echo "X$output" | $Xsed -e "$basename"`
-
-	  # Clear the reloadable object creation command queue and
-	  # initialize k to one.
-	  test_cmds=
-	  concat_cmds=
-	  objlist=
-	  delfiles=
-	  last_robj=
-	  k=1
-	  output=$output_objdir/$output_la-${k}.$objext
-	  # Loop over the list of objects to be linked.
-	  for obj in $save_libobjs
-	  do
-	    eval test_cmds=\"$reload_cmds $objlist $last_robj\"
-	    if test "X$objlist" = X ||
-	       { len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
-		 test "$len" -le "$max_cmd_len"; }; then
-	      objlist="$objlist $obj"
-	    else
-	      # The command $test_cmds is almost too long, add a
-	      # command to the queue.
-	      if test "$k" -eq 1 ; then
-		# The first file doesn't have a previous command to add.
-		eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
-	      else
-		# All subsequent reloadable object files will link in
-		# the last one created.
-		eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
-	      fi
-	      last_robj=$output_objdir/$output_la-${k}.$objext
-	      k=`expr $k + 1`
-	      output=$output_objdir/$output_la-${k}.$objext
-	      objlist=$obj
-	      len=1
-	    fi
-	  done
-	  # Handle the remaining objects by creating one last
-	  # reloadable object file.  All subsequent reloadable object
-	  # files will link in the last one created.
-	  test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	  eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
-
-	  if ${skipped_export-false}; then
-	    $show "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $run $rm $export_symbols
-	    libobjs=$output
-	    # Append the command to create the export file.
-	    eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
-          fi
-
-	  # Set up a command to remove the reloadable object files
-	  # after they are used.
-	  i=0
-	  while test "$i" -lt "$k"
-	  do
-	    i=`expr $i + 1`
-	    delfiles="$delfiles $output_objdir/$output_la-${i}.$objext"
-	  done
-
-	  $echo "creating a temporary reloadable object file: $output"
-
-	  # Loop through the commands generated above and execute them.
-	  save_ifs="$IFS"; IFS='~'
-	  for cmd in $concat_cmds; do
-	    IFS="$save_ifs"
-	    $show "$cmd"
-	    $run eval "$cmd" || exit $?
-	  done
-	  IFS="$save_ifs"
-
-	  libobjs=$output
-	  # Restore the value of output.
-	  output=$save_output
-
-	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	  fi
-	  # Expand the library linking commands again to reset the
-	  # value of $libobjs for piecewise linking.
-
-	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
-	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	      cmds=$module_expsym_cmds
-	    else
-	      cmds=$module_cmds
-	    fi
-	  else
-	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	    cmds=$archive_expsym_cmds
-	  else
-	    cmds=$archive_cmds
-	    fi
-	  fi
-
-	  # Append the command to remove the reloadable object files
-	  # to the just-reset $cmds.
-	  eval cmds=\"\$cmds~\$rm $delfiles\"
-	fi
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $show "$cmd"
-	  $run eval "$cmd" || {
-	    lt_exit=$?
-
-	    # Restore the uninstalled library and exit
-	    if test "$mode" = relink; then
-	      $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
-	    fi
-
-	    exit $lt_exit
-	  }
-	done
-	IFS="$save_ifs"
-
-	# Restore the uninstalled library and exit
-	if test "$mode" = relink; then
-	  $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
-
-	  if test -n "$convenience"; then
-	    if test -z "$whole_archive_flag_spec"; then
-	      $show "${rm}r $gentop"
-	      $run ${rm}r "$gentop"
-	    fi
-	  fi
-
-	  exit $EXIT_SUCCESS
-	fi
-
-	# Create links to the real library.
-	for linkname in $linknames; do
-	  if test "$realname" != "$linkname"; then
-	    $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
-	    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
-	  fi
-	done
-
-	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
-	  # On all known operating systems, these are identical.
-	  dlname="$soname"
-	fi
-      fi
-      ;;
-
-    obj)
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;;
-      esac
-
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
-      fi
-
-      if test -n "$rpath"; then
-	$echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
-      fi
-
-      if test -n "$xrpath"; then
-	$echo "$modename: warning: \`-R' is ignored for objects" 1>&2
-      fi
-
-      if test -n "$vinfo"; then
-	$echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
-      fi
-
-      if test -n "$release"; then
-	$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
-      fi
-
-      case $output in
-      *.lo)
-	if test -n "$objs$old_deplibs"; then
-	  $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-	libobj="$output"
-	obj=`$echo "X$output" | $Xsed -e "$lo2o"`
-	;;
-      *)
-	libobj=
-	obj="$output"
-	;;
-      esac
-
-      # Delete the old objects.
-      $run $rm $obj $libobj
-
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
-      if test -n "$convenience"; then
-	if test -n "$whole_archive_flag_spec"; then
-	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-	  reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
-	else
-	  gentop="$output_objdir/${obj}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $convenience
-	  reload_conv_objs="$reload_objs $func_extract_archives_result"
-	fi
-      fi
-
-      # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
-      output="$obj"
-      cmds=$reload_cmds
-      save_ifs="$IFS"; IFS='~'
-      for cmd in $cmds; do
-	IFS="$save_ifs"
-	eval cmd=\"$cmd\"
-	$show "$cmd"
-	$run eval "$cmd" || exit $?
-      done
-      IFS="$save_ifs"
-
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-	if test -n "$gentop"; then
-	  $show "${rm}r $gentop"
-	  $run ${rm}r $gentop
-	fi
-
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$build_libtool_libs" != yes; then
-	if test -n "$gentop"; then
-	  $show "${rm}r $gentop"
-	  $run ${rm}r $gentop
-	fi
-
-	# Create an invalid libtool object if no PIC, so that we don't
-	# accidentally link it into a program.
-	# $show "echo timestamp > $libobj"
-	# $run eval "echo timestamp > $libobj" || exit $?
-	exit $EXIT_SUCCESS
-      fi
-
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
-	# Only do commands if we really have different PIC objects.
-	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
-	cmds=$reload_cmds
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $show "$cmd"
-	  $run eval "$cmd" || exit $?
-	done
-	IFS="$save_ifs"
-      fi
-
-      if test -n "$gentop"; then
-	$show "${rm}r $gentop"
-	$run ${rm}r $gentop
-      fi
-
-      exit $EXIT_SUCCESS
-      ;;
-
-    prog)
-      case $host in
-	*cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
-      esac
-      if test -n "$vinfo"; then
-	$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
-      fi
-
-      if test -n "$release"; then
-	$echo "$modename: warning: \`-release' is ignored for programs" 1>&2
-      fi
-
-      if test "$preload" = yes; then
-	if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
-	   test "$dlopen_self_static" = unknown; then
-	  $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
-	fi
-      fi
-
-      case $host in
-      *-*-rhapsody* | *-*-darwin1.[012])
-	# On Rhapsody replace the C library is the System framework
-	compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
-	finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
-	;;
-      esac
-
-      case $host in
-      *darwin*)
-        # Don't allow lazy linking, it breaks C++ global constructors
-        if test "$tagname" = CXX ; then
-        compile_command="$compile_command ${wl}-bind_at_load"
-        finalize_command="$finalize_command ${wl}-bind_at_load"
-        fi
-        ;;
-      esac
-
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $compile_deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $compile_deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      compile_deplibs="$new_libs"
-
-
-      compile_command="$compile_command $compile_deplibs"
-      finalize_command="$finalize_command $finalize_deplibs"
-
-      if test -n "$rpath$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	for libdir in $rpath $xrpath; do
-	  # This is the magic to use -rpath.
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-      fi
-
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) perm_rpath="$perm_rpath $libdir" ;;
-	  esac
-	fi
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
-	  testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$libdir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$libdir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      compile_rpath="$rpath"
-
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$finalize_perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
-	  esac
-	fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      finalize_rpath="$rpath"
-
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-	# Transform all the library objects into standard objects.
-	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-      fi
-
-      dlsyms=
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	  dlsyms="${outputname}S.c"
-	else
-	  $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
-	fi
-      fi
-
-      if test -n "$dlsyms"; then
-	case $dlsyms in
-	"") ;;
-	*.c)
-	  # Discover the nlist of each of the dlfiles.
-	  nlist="$output_objdir/${outputname}.nm"
-
-	  $show "$rm $nlist ${nlist}S ${nlist}T"
-	  $run $rm "$nlist" "${nlist}S" "${nlist}T"
-
-	  # Parse the name list into a source file.
-	  $show "creating $output_objdir/$dlsyms"
-
-	  test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
-/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
-/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-/* Prevent the only kind of declaration conflicts we can make. */
-#define lt_preloaded_symbols some_other_symbol
-
-/* External symbol declarations for the compiler. */\
-"
-
-	  if test "$dlself" = yes; then
-	    $show "generating symbol list for \`$output'"
-
-	    test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
-
-	    # Add our own program objects to the symbol list.
-	    progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	    for arg in $progfiles; do
-	      $show "extracting global C symbols from \`$arg'"
-	      $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
-	    done
-
-	    if test -n "$exclude_expsyms"; then
-	      $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
-	      $run eval '$mv "$nlist"T "$nlist"'
-	    fi
-
-	    if test -n "$export_symbols_regex"; then
-	      $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
-	      $run eval '$mv "$nlist"T "$nlist"'
-	    fi
-
-	    # Prepare the list of exported symbols
-	    if test -z "$export_symbols"; then
-	      export_symbols="$output_objdir/$outputname.exp"
-	      $run $rm $export_symbols
-	      $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
-              case $host in
-              *cygwin* | *mingw* )
-	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-		$run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
-                ;;
-              esac
-	    else
-	      $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
-	      $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
-	      $run eval 'mv "$nlist"T "$nlist"'
-              case $host in
-              *cygwin* | *mingw* )
-	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-		$run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
-                ;;
-              esac
-	    fi
-	  fi
-
-	  for arg in $dlprefiles; do
-	    $show "extracting global C symbols from \`$arg'"
-	    name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
-	    $run eval '$echo ": $name " >> "$nlist"'
-	    $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
-	  done
-
-	  if test -z "$run"; then
-	    # Make sure we have at least an empty file.
-	    test -f "$nlist" || : > "$nlist"
-
-	    if test -n "$exclude_expsyms"; then
-	      $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	      $mv "$nlist"T "$nlist"
-	    fi
-
-	    # Try sorting and uniquifying the output.
-	    if grep -v "^: " < "$nlist" |
-		if sort -k 3 </dev/null >/dev/null 2>&1; then
-		  sort -k 3
-		else
-		  sort +2
-		fi |
-		uniq > "$nlist"S; then
-	      :
-	    else
-	      grep -v "^: " < "$nlist" > "$nlist"S
-	    fi
-
-	    if test -f "$nlist"S; then
-	      eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
-	    else
-	      $echo '/* NONE */' >> "$output_objdir/$dlsyms"
-	    fi
-
-	    $echo >> "$output_objdir/$dlsyms" "\
-
-#undef lt_preloaded_symbols
-
-#if defined (__STDC__) && __STDC__
-# define lt_ptr void *
-#else
-# define lt_ptr char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-"
-
-	    case $host in
-	    *cygwin* | *mingw* )
-	  $echo >> "$output_objdir/$dlsyms" "\
-/* DATA imports from DLLs on WIN32 can't be const, because
-   runtime relocations are performed -- see ld's documentation
-   on pseudo-relocs */
-struct {
-"
-	      ;;
-	    * )
-	  $echo >> "$output_objdir/$dlsyms" "\
-const struct {
-"
-	      ;;
-	    esac
-
-
-	  $echo >> "$output_objdir/$dlsyms" "\
-  const char *name;
-  lt_ptr address;
-}
-lt_preloaded_symbols[] =
-{\
-"
-
-	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
-
-	    $echo >> "$output_objdir/$dlsyms" "\
-  {0, (lt_ptr) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
-	  fi
-
-	  pic_flag_for_symtable=
-	  case $host in
-	  # compiling the symbol table file with pic_flag works around
-	  # a FreeBSD bug that causes programs to crash when -lm is
-	  # linked before any other PIC object.  But we must not use
-	  # pic_flag when linking with -static.  The problem exists in
-	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-	    case "$compile_command " in
-	    *" -static "*) ;;
-	    *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
-	    esac;;
-	  *-*-hpux*)
-	    case "$compile_command " in
-	    *" -static "*) ;;
-	    *) pic_flag_for_symtable=" $pic_flag";;
-	    esac
-	  esac
-
-	  # Now compile the dynamic symbol file.
-	  $show "(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
-	  $run eval '(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
-
-	  # Clean up the generated files.
-	  $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
-	  $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
-
-	  # Transform the symbol file into the correct name.
-          case $host in
-          *cygwin* | *mingw* )
-            if test -f "$output_objdir/${outputname}.def" ; then
-              compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP`
-              finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP`
-            else
-              compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
-              finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
-             fi
-            ;;
-          * )
-            compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
-            finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
-            ;;
-          esac
-	  ;;
-	*)
-	  $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
-      else
-	# We keep going just in case the user didn't refer to
-	# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-	# really was required.
-
-	# Nullify the symbol file.
-	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP`
-	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP`
-      fi
-
-      if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-	# Replace the output file specification.
-	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP`
-	link_command="$compile_command$compile_rpath"
-
-	# We have no uninstalled library dependencies, so finalize right now.
-	$show "$link_command"
-	$run eval "$link_command"
-	exit_status=$?
-
-	# Delete the generated files.
-	if test -n "$dlsyms"; then
-	  $show "$rm $output_objdir/${outputname}S.${objext}"
-	  $run $rm "$output_objdir/${outputname}S.${objext}"
-	fi
-
-	exit $exit_status
-      fi
-
-      if test -n "$shlibpath_var"; then
-	# We should set the shlibpath_var
-	rpath=
-	for dir in $temp_rpath; do
-	  case $dir in
-	  [\\/]* | [A-Za-z]:[\\/]*)
-	    # Absolute path.
-	    rpath="$rpath$dir:"
-	    ;;
-	  *)
-	    # Relative path: add a thisdir entry.
-	    rpath="$rpath\$thisdir/$dir:"
-	    ;;
-	  esac
-	done
-	temp_rpath="$rpath"
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
-
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-	if test -n "$perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-	if test -n "$finalize_perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $finalize_perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-      fi
-
-      if test "$no_install" = yes; then
-	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
-	# Replace the output file specification.
-	link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
-	# Delete the old output file.
-	$run $rm $output
-	# Link the executable and exit
-	$show "$link_command"
-	$run eval "$link_command" || exit $?
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
-
-	$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
-	$echo "$modename: \`$output' will be relinked during installation" 1>&2
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
-
-      # Replace the output file specification.
-      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
-      # Delete the old output files.
-      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
-      $show "$link_command"
-      $run eval "$link_command" || exit $?
-
-      # Now create the wrapper script.
-      $show "creating $output"
-
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-	# Preserve any variables that may affect compiler behavior
-	for var in $variables_saved_for_relink; do
-	  if eval test -z \"\${$var+set}\"; then
-	    relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
-	  elif eval var_value=\$$var; test -z "$var_value"; then
-	    relink_command="$var=; export $var; $relink_command"
-	  else
-	    var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
-	    relink_command="$var=\"$var_value\"; export $var; $relink_command"
-	  fi
-	done
-	relink_command="(cd `pwd`; $relink_command)"
-	relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP`
-      fi
-
-      # Quote $echo for shipping.
-      if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
-	case $progpath in
-	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
-	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
-	esac
-	qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
-      else
-	qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if our run command is non-null.
-      if test -z "$run"; then
-	# win32 will think the script is a binary if it has
-	# a .exe suffix, so we strip it off here.
-	case $output in
-	  *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
-	esac
-	# test for cygwin because mv fails w/o .exe extensions
-	case $host in
-	  *cygwin*)
-	    exeext=.exe
-	    outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
-	  *) exeext= ;;
-	esac
-	case $host in
-	  *cygwin* | *mingw* )
-            output_name=`basename $output`
-            output_path=`dirname $output`
-            cwrappersource="$output_path/$objdir/lt-$output_name.c"
-            cwrapper="$output_path/$output_name.exe"
-            $rm $cwrappersource $cwrapper
-            trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
-	    cat > $cwrappersource <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-
-   The $output program cannot be directly executed until all the libtool
-   libraries that it depends on are installed.
-
-   This wrapper executable should never be moved out of the build directory.
-   If it is, it will not operate correctly.
-
-   Currently, it simply execs the wrapper *script* "/bin/sh $output",
-   but could eventually absorb all of the scripts functionality and
-   exec $objdir/$outputname directly.
-*/
-EOF
-	    cat >> $cwrappersource<<"EOF"
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <sys/stat.h>
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
-
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
-
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# ifndef DIR_SEPARATOR_2
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-#  define PATH_SEPARATOR_2 ';'
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
-        (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
-
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
-
-#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
-
-/* -DDEBUG is fairly common in CFLAGS.  */
-#undef DEBUG
-#if defined DEBUGWRAPPER
-# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__)
-#else
-# define DEBUG(format, ...)
-#endif
-
-const char *program_name = NULL;
-
-void * xmalloc (size_t num);
-char * xstrdup (const char *string);
-const char * base_name (const char *name);
-char * find_executable(const char *wrapper);
-int    check_executable(const char *path);
-char * strendzap(char *str, const char *pat);
-void lt_fatal (const char *message, ...);
-
-int
-main (int argc, char *argv[])
-{
-  char **newargz;
-  int i;
-
-  program_name = (char *) xstrdup (base_name (argv[0]));
-  DEBUG("(main) argv[0]      : %s\n",argv[0]);
-  DEBUG("(main) program_name : %s\n",program_name);
-  newargz = XMALLOC(char *, argc+2);
-EOF
-
-            cat >> $cwrappersource <<EOF
-  newargz[0] = (char *) xstrdup("$SHELL");
-EOF
-
-            cat >> $cwrappersource <<"EOF"
-  newargz[1] = find_executable(argv[0]);
-  if (newargz[1] == NULL)
-    lt_fatal("Couldn't find %s", argv[0]);
-  DEBUG("(main) found exe at : %s\n",newargz[1]);
-  /* we know the script has the same name, without the .exe */
-  /* so make sure newargz[1] doesn't end in .exe */
-  strendzap(newargz[1],".exe");
-  for (i = 1; i < argc; i++)
-    newargz[i+1] = xstrdup(argv[i]);
-  newargz[argc+1] = NULL;
-
-  for (i=0; i<argc+1; i++)
-  {
-    DEBUG("(main) newargz[%d]   : %s\n",i,newargz[i]);
-    ;
-  }
-
-EOF
-
-            case $host_os in
-              mingw*)
-                cat >> $cwrappersource <<EOF
-  execv("$SHELL",(char const **)newargz);
-EOF
-              ;;
-              *)
-                cat >> $cwrappersource <<EOF
-  execv("$SHELL",newargz);
-EOF
-              ;;
-            esac
-
-            cat >> $cwrappersource <<"EOF"
-  return 127;
-}
-
-void *
-xmalloc (size_t num)
-{
-  void * p = (void *) malloc (num);
-  if (!p)
-    lt_fatal ("Memory exhausted");
-
-  return p;
-}
-
-char *
-xstrdup (const char *string)
-{
-  return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
-;
-}
-
-const char *
-base_name (const char *name)
-{
-  const char *base;
-
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  /* Skip over the disk name in MSDOS pathnames. */
-  if (isalpha ((unsigned char)name[0]) && name[1] == ':')
-    name += 2;
-#endif
-
-  for (base = name; *name; name++)
-    if (IS_DIR_SEPARATOR (*name))
-      base = name + 1;
-  return base;
-}
-
-int
-check_executable(const char * path)
-{
-  struct stat st;
-
-  DEBUG("(check_executable)  : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!");
-  if ((!path) || (!*path))
-    return 0;
-
-  if ((stat (path, &st) >= 0) &&
-      (
-        /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
-#if defined (S_IXOTH)
-       ((st.st_mode & S_IXOTH) == S_IXOTH) ||
-#endif
-#if defined (S_IXGRP)
-       ((st.st_mode & S_IXGRP) == S_IXGRP) ||
-#endif
-       ((st.st_mode & S_IXUSR) == S_IXUSR))
-      )
-    return 1;
-  else
-    return 0;
-}
-
-/* Searches for the full path of the wrapper.  Returns
-   newly allocated full path name if found, NULL otherwise */
-char *
-find_executable (const char* wrapper)
-{
-  int has_slash = 0;
-  const char* p;
-  const char* p_next;
-  /* static buffer for getcwd */
-  char tmp[LT_PATHMAX + 1];
-  int tmp_len;
-  char* concat_name;
-
-  DEBUG("(find_executable)  : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
-
-  if ((wrapper == NULL) || (*wrapper == '\0'))
-    return NULL;
-
-  /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':')
-  {
-    concat_name = xstrdup (wrapper);
-    if (check_executable(concat_name))
-      return concat_name;
-    XFREE(concat_name);
-  }
-  else
-  {
-#endif
-    if (IS_DIR_SEPARATOR (wrapper[0]))
-    {
-      concat_name = xstrdup (wrapper);
-      if (check_executable(concat_name))
-        return concat_name;
-      XFREE(concat_name);
-    }
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  }
-#endif
-
-  for (p = wrapper; *p; p++)
-    if (*p == '/')
-    {
-      has_slash = 1;
-      break;
-    }
-  if (!has_slash)
-  {
-    /* no slashes; search PATH */
-    const char* path = getenv ("PATH");
-    if (path != NULL)
-    {
-      for (p = path; *p; p = p_next)
-      {
-        const char* q;
-        size_t p_len;
-        for (q = p; *q; q++)
-          if (IS_PATH_SEPARATOR(*q))
-            break;
-        p_len = q - p;
-        p_next = (*q == '\0' ? q : q + 1);
-        if (p_len == 0)
-        {
-          /* empty path: current directory */
-          if (getcwd (tmp, LT_PATHMAX) == NULL)
-            lt_fatal ("getcwd failed");
-          tmp_len = strlen(tmp);
-          concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
-          memcpy (concat_name, tmp, tmp_len);
-          concat_name[tmp_len] = '/';
-          strcpy (concat_name + tmp_len + 1, wrapper);
-        }
-        else
-        {
-          concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1);
-          memcpy (concat_name, p, p_len);
-          concat_name[p_len] = '/';
-          strcpy (concat_name + p_len + 1, wrapper);
-        }
-        if (check_executable(concat_name))
-          return concat_name;
-        XFREE(concat_name);
-      }
-    }
-    /* not found in PATH; assume curdir */
-  }
-  /* Relative path | not found in path: prepend cwd */
-  if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal ("getcwd failed");
-  tmp_len = strlen(tmp);
-  concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
-  memcpy (concat_name, tmp, tmp_len);
-  concat_name[tmp_len] = '/';
-  strcpy (concat_name + tmp_len + 1, wrapper);
-
-  if (check_executable(concat_name))
-    return concat_name;
-  XFREE(concat_name);
-  return NULL;
-}
-
-char *
-strendzap(char *str, const char *pat)
-{
-  size_t len, patlen;
-
-  assert(str != NULL);
-  assert(pat != NULL);
-
-  len = strlen(str);
-  patlen = strlen(pat);
-
-  if (patlen <= len)
-  {
-    str += len - patlen;
-    if (strcmp(str, pat) == 0)
-      *str = '\0';
-  }
-  return str;
-}
-
-static void
-lt_error_core (int exit_status, const char * mode,
-          const char * message, va_list ap)
-{
-  fprintf (stderr, "%s: %s: ", program_name, mode);
-  vfprintf (stderr, message, ap);
-  fprintf (stderr, ".\n");
-
-  if (exit_status >= 0)
-    exit (exit_status);
-}
-
-void
-lt_fatal (const char *message, ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
-  va_end (ap);
-}
-EOF
-          # we should really use a build-platform specific compiler
-          # here, but OTOH, the wrappers (shell script and this C one)
-          # are only useful if you want to execute the "real" binary.
-          # Since the "real" binary is built for $host, then this
-          # wrapper might as well be built for $host, too.
-          $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource
-          ;;
-        esac
-        $rm $output
-        trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
-
-	$echo > $output "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='${SED} -e 1s/^X//'
-sed_quote_subst='$sed_quote_subst'
-
-# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE).
-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variable:
-  notinst_deplibs='$notinst_deplibs'
-else
-  # When we are sourced in execute mode, \$file and \$echo are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    echo=\"$qecho\"
-    file=\"\$0\"
-    # Make sure echo works.
-    if test \"X\$1\" = X--no-reexec; then
-      # Discard the --no-reexec flag, and continue.
-      shift
-    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
-      # Yippee, \$echo works!
-      :
-    else
-      # Restart under the correct shell, and then maybe \$echo will work.
-      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
-    fi
-  fi\
-"
-	$echo >> $output "\
-
-  # Find the directory that this script lives in.
-  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
-
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
-
-    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
-  done
-
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
-	if test "$fast_install" = yes; then
-	  $echo >> $output "\
-  program=lt-'$outputname'$exeext
-  progdir=\"\$thisdir/$objdir\"
-
-  if test ! -f \"\$progdir/\$program\" || \\
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
-    file=\"\$\$-\$program\"
-
-    if test ! -d \"\$progdir\"; then
-      $mkdir \"\$progdir\"
-    else
-      $rm \"\$progdir/\$file\"
-    fi"
-
-	  $echo >> $output "\
-
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
-      else
-	$echo \"\$relink_command_output\" >&2
-	$rm \"\$progdir/\$file\"
-	exit $EXIT_FAILURE
-      fi
-    fi
-
-    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $rm \"\$progdir/\$program\";
-      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $rm \"\$progdir/\$file\"
-  fi"
-	else
-	  $echo >> $output "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
-	fi
-
-	$echo >> $output "\
-
-  if test -f \"\$progdir/\$program\"; then"
-
-	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-	  $echo >> $output "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
-
-    export $shlibpath_var
-"
-	fi
-
-	# fixup the dll searchpath if we need to.
-	if test -n "$dllsearchpath"; then
-	  $echo >> $output "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
-	fi
-
-	$echo >> $output "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-"
-	case $host in
-	# Backslashes separate directories on plain windows
-	*-*-mingw | *-*-os2*)
-	  $echo >> $output "\
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-	  ;;
-
-	*)
-	  $echo >> $output "\
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-	  ;;
-	esac
-	$echo >> $output "\
-      \$echo \"\$0: cannot exec \$program \$*\"
-      exit $EXIT_FAILURE
-    fi
-  else
-    # The program doesn't exist.
-    \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
-    \$echo \"This script is just a wrapper for \$program.\" 1>&2
-    $echo \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit $EXIT_FAILURE
-  fi
-fi\
-"
-	chmod +x $output
-      fi
-      exit $EXIT_SUCCESS
-      ;;
-    esac
-
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
-
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
-	  build_libtool_libs=no
-	else
-	  oldobjs="$old_deplibs $non_pic_objects"
-	fi
-	addlibs="$old_convenience"
-      fi
-
-      if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
-	generated="$generated $gentop"
-
-	func_extract_archives $gentop $addlibs
-	oldobjs="$oldobjs $func_extract_archives_result"
-      fi
-
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-       cmds=$old_archive_from_new_cmds
-      else
-	# POSIX demands no paths to be encoded in archives.  We have
-	# to avoid creating archives with duplicate basenames if we
-	# might have to extract them afterwards, e.g., when creating a
-	# static archive out of a convenience library, or when linking
-	# the entirety of a libtool archive into another (currently
-	# not supported by libtool).
-	if (for obj in $oldobjs
-	    do
-	      $echo "X$obj" | $Xsed -e 's%^.*/%%'
-	    done | sort | sort -uc >/dev/null 2>&1); then
-	  :
-	else
-	  $echo "copying selected object files to avoid basename conflicts..."
-
-	  if test -z "$gentop"; then
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
-
-	    $show "${rm}r $gentop"
-	    $run ${rm}r "$gentop"
-	    $show "$mkdir $gentop"
-	    $run $mkdir "$gentop"
-	    exit_status=$?
-	    if test "$exit_status" -ne 0 && test ! -d "$gentop"; then
-	      exit $exit_status
-	    fi
-	  fi
-
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  counter=1
-	  for obj in $save_oldobjs
-	  do
-	    objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
-	    case " $oldobjs " in
-	    " ") oldobjs=$obj ;;
-	    *[\ /]"$objbase "*)
-	      while :; do
-		# Make sure we don't pick an alternate name that also
-		# overlaps.
-		newobj=lt$counter-$objbase
-		counter=`expr $counter + 1`
-		case " $oldobjs " in
-		*[\ /]"$newobj "*) ;;
-		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
-		esac
-	      done
-	      $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-	      $run ln "$obj" "$gentop/$newobj" ||
-	      $run cp "$obj" "$gentop/$newobj"
-	      oldobjs="$oldobjs $gentop/$newobj"
-	      ;;
-	    *) oldobjs="$oldobjs $obj" ;;
-	    esac
-	  done
-	fi
-
-	eval cmds=\"$old_archive_cmds\"
-
-	if len=`expr "X$cmds" : ".*"` &&
-	     test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  cmds=$old_archive_cmds
-	else
-	  # the command line is too long to link in one step, link in parts
-	  $echo "using piecewise archive linking..."
-	  save_RANLIB=$RANLIB
-	  RANLIB=:
-	  objlist=
-	  concat_cmds=
-	  save_oldobjs=$oldobjs
-
-	  # Is there a better way of finding the last object in the list?
-	  for obj in $save_oldobjs
-	  do
-	    last_oldobj=$obj
-	  done
-	  for obj in $save_oldobjs
-	  do
-	    oldobjs="$objlist $obj"
-	    objlist="$objlist $obj"
-	    eval test_cmds=\"$old_archive_cmds\"
-	    if len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
-	       test "$len" -le "$max_cmd_len"; then
-	      :
-	    else
-	      # the above command should be used before it gets too long
-	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
-	        RANLIB=$save_RANLIB
-	      fi
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
-	      objlist=
-	    fi
-	  done
-	  RANLIB=$save_RANLIB
-	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
-	    eval cmds=\"\$concat_cmds\"
-	  else
-	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
-	  fi
-	fi
-      fi
-      save_ifs="$IFS"; IFS='~'
-      for cmd in $cmds; do
-        eval cmd=\"$cmd\"
-	IFS="$save_ifs"
-	$show "$cmd"
-	$run eval "$cmd" || exit $?
-      done
-      IFS="$save_ifs"
-    done
-
-    if test -n "$generated"; then
-      $show "${rm}r$generated"
-      $run ${rm}r$generated
-    fi
-
-    # Now create the libtool archive.
-    case $output in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      $show "creating $output"
-
-      # Preserve any variables that may affect compiler behavior
-      for var in $variables_saved_for_relink; do
-	if eval test -z \"\${$var+set}\"; then
-	  relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
-	elif eval var_value=\$$var; test -z "$var_value"; then
-	  relink_command="$var=; export $var; $relink_command"
-	else
-	  var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
-	  relink_command="$var=\"$var_value\"; export $var; $relink_command"
-	fi
-      done
-      # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP`
-      if test "$hardcode_automatic" = yes ; then
-	relink_command=
-      fi
-
-
-      # Only create the output if not a dry run.
-      if test -z "$run"; then
-	for installed in no yes; do
-	  if test "$installed" = yes; then
-	    if test -z "$install_libdir"; then
-	      break
-	    fi
-	    output="$output_objdir/$outputname"i
-	    # Replace all uninstalled libtool libraries with the installed ones
-	    newdependency_libs=
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      *.la)
-		name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		if test -z "$libdir"; then
-		  $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
-		  exit $EXIT_FAILURE
-		fi
-		newdependency_libs="$newdependency_libs $libdir/$name"
-		;;
-	      *) newdependency_libs="$newdependency_libs $deplib" ;;
-	      esac
-	    done
-	    dependency_libs="$newdependency_libs"
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
-	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-	      if test -z "$libdir"; then
-		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-		exit $EXIT_FAILURE
-	      fi
-	      newdlfiles="$newdlfiles $libdir/$name"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
-	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-	      if test -z "$libdir"; then
-		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-		exit $EXIT_FAILURE
-	      fi
-	      newdlprefiles="$newdlprefiles $libdir/$name"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  else
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlfiles="$newdlfiles $abs"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlprefiles="$newdlprefiles $abs"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  fi
-	  $rm $output
-	  # place dlname in correct position for cygwin
-	  tdlname=$dlname
-	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
-	  esac
-	  $echo > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
-	    $echo >> $output "\
-relink_command=\"$relink_command\""
-	  fi
-	done
-      fi
-
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
-      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
-      ;;
-    esac
-    exit $EXIT_SUCCESS
-    ;;
-
-  # libtool install mode
-  install)
-    modename="$modename: install"
-
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
-       # Allow the use of GNU shtool's install command.
-       $echo "X$nonopt" | grep shtool > /dev/null; then
-      # Aesthetically quote it.
-      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
-      case $arg in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	arg="\"$arg\""
-	;;
-      esac
-      install_prog="$arg "
-      arg="$1"
-      shift
-    else
-      install_prog=
-      arg=$nonopt
-    fi
-
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-    case $arg in
-    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-      arg="\"$arg\""
-      ;;
-    esac
-    install_prog="$install_prog$arg"
-
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    for arg
-    do
-      if test -n "$dest"; then
-	files="$files $dest"
-	dest=$arg
-	continue
-      fi
-
-      case $arg in
-      -d) isdir=yes ;;
-      -f) 
-      	case " $install_prog " in
-	*[\\\ /]cp\ *) ;;
-	*) prev=$arg ;;
-	esac
-	;;
-      -g | -m | -o) prev=$arg ;;
-      -s)
-	stripme=" -s"
-	continue
-	;;
-      -*)
-	;;
-      *)
-	# If the previous option needed an argument, then skip it.
-	if test -n "$prev"; then
-	  prev=
-	else
-	  dest=$arg
-	  continue
-	fi
-	;;
-      esac
-
-      # Aesthetically quote the argument.
-      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-      case $arg in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-	arg="\"$arg\""
-	;;
-      esac
-      install_prog="$install_prog $arg"
-    done
-
-    if test -z "$install_prog"; then
-      $echo "$modename: you must specify an install program" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    if test -n "$prev"; then
-      $echo "$modename: the \`$prev' option requires an argument" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-	$echo "$modename: no file or destination specified" 1>&2
-      else
-	$echo "$modename: you must specify a destination" 1>&2
-      fi
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    # Strip any trailing slash from the destination.
-    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
-
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
-      test "X$destdir" = "X$dest" && destdir=.
-      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
-
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files
-      if test "$#" -gt 2; then
-	$echo "$modename: \`$dest' is not a directory" 1>&2
-	$echo "$help" 1>&2
-	exit $EXIT_FAILURE
-      fi
-    fi
-    case $destdir in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-	case $file in
-	*.lo) ;;
-	*)
-	  $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
-      done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
-
-      # Do each installation.
-      case $file in
-      *.$libext)
-	# Do the static libraries later.
-	staticlibs="$staticlibs $file"
-	;;
-
-      *.la)
-	# Check to see that this really is a libtool archive.
-	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-	else
-	  $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-
-	library_names=
-	old_library=
-	relink_command=
-	# If there is no directory component, then add one.
-	case $file in
-	*/* | *\\*) . $file ;;
-	*) . ./$file ;;
-	esac
-
-	# Add the libdir to current_libdirs if it is the destination.
-	if test "X$destdir" = "X$libdir"; then
-	  case "$current_libdirs " in
-	  *" $libdir "*) ;;
-	  *) current_libdirs="$current_libdirs $libdir" ;;
-	  esac
-	else
-	  # Note the libdir as a future libdir.
-	  case "$future_libdirs " in
-	  *" $libdir "*) ;;
-	  *) future_libdirs="$future_libdirs $libdir" ;;
-	  esac
-	fi
-
-	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
-	test "X$dir" = "X$file/" && dir=
-	dir="$dir$objdir"
-
-	if test -n "$relink_command"; then
-	  # Determine the prefix the user has applied to our future dir.
-	  inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
-
-	  # Don't allow the user to place us outside of our expected
-	  # location b/c this prevents finding dependent libraries that
-	  # are installed to the same prefix.
-	  # At present, this check doesn't affect windows .dll's that
-	  # are installed into $libdir/../bin (currently, that works fine)
-	  # but it's something to keep an eye on.
-	  if test "$inst_prefix_dir" = "$destdir"; then
-	    $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-
-	  if test -n "$inst_prefix_dir"; then
-	    # Stick the inst_prefix_dir data into the link command.
-	    relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP`
-	  else
-	    relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP`
-	  fi
-
-	  $echo "$modename: warning: relinking \`$file'" 1>&2
-	  $show "$relink_command"
-	  if $run eval "$relink_command"; then :
-	  else
-	    $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	fi
-
-	# See the names of the shared library.
-	set dummy $library_names
-	if test -n "$2"; then
-	  realname="$2"
-	  shift
-	  shift
-
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
-
-	  # Install the shared library and build the symlinks.
-	  $show "$install_prog $dir/$srcname $destdir/$realname"
-	  $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
-	  if test -n "$stripme" && test -n "$striplib"; then
-	    $show "$striplib $destdir/$realname"
-	    $run eval "$striplib $destdir/$realname" || exit $?
-	  fi
-
-	  if test "$#" -gt 0; then
-	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
-	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
-	    # so we also need to try rm && ln -s.
-	    for linkname
-	    do
-	      if test "$linkname" != "$realname"; then
-                $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
-                $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
-	      fi
-	    done
-	  fi
-
-	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
-	  cmds=$postinstall_cmds
-	  save_ifs="$IFS"; IFS='~'
-	  for cmd in $cmds; do
-	    IFS="$save_ifs"
-	    eval cmd=\"$cmd\"
-	    $show "$cmd"
-	    $run eval "$cmd" || {
-	      lt_exit=$?
-
-	      # Restore the uninstalled library and exit
-	      if test "$mode" = relink; then
-		$run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
-	      fi
-
-	      exit $lt_exit
-	    }
-	  done
-	  IFS="$save_ifs"
-	fi
-
-	# Install the pseudo-library for information purposes.
-	name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-	instname="$dir/$name"i
-	$show "$install_prog $instname $destdir/$name"
-	$run eval "$install_prog $instname $destdir/$name" || exit $?
-
-	# Maybe install the static library, too.
-	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
-	;;
-
-      *.lo)
-	# Install (i.e. copy) a libtool object.
-
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-	  destfile="$destdir/$destfile"
-	fi
-
-	# Deduce the name of the destination old-style object file.
-	case $destfile in
-	*.lo)
-	  staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
-	  ;;
-	*.$objext)
-	  staticdest="$destfile"
-	  destfile=
-	  ;;
-	*)
-	  $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	  ;;
-	esac
-
-	# Install the libtool object if requested.
-	if test -n "$destfile"; then
-	  $show "$install_prog $file $destfile"
-	  $run eval "$install_prog $file $destfile" || exit $?
-	fi
-
-	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
-	  # Deduce the name of the old-style object file.
-	  staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
-
-	  $show "$install_prog $staticobj $staticdest"
-	  $run eval "$install_prog \$staticobj \$staticdest" || exit $?
-	fi
-	exit $EXIT_SUCCESS
-	;;
-
-      *)
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-	  destfile="$destdir/$destfile"
-	fi
-
-	# If the file is missing, and there is a .exe on the end, strip it
-	# because it is most likely a libtool script we actually want to
-	# install
-	stripped_ext=""
-	case $file in
-	  *.exe)
-	    if test ! -f "$file"; then
-	      file=`$echo $file|${SED} 's,.exe$,,'`
-	      stripped_ext=".exe"
-	    fi
-	    ;;
-	esac
-
-	# Do a test to see if this is really a libtool program.
-	case $host in
-	*cygwin*|*mingw*)
-	    wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
-	    ;;
-	*)
-	    wrapper=$file
-	    ;;
-	esac
-	if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
-	  notinst_deplibs=
-	  relink_command=
-
-	  # Note that it is not necessary on cygwin/mingw to append a dot to
-	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
-	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
-	  # `FILE.' does not work on cygwin managed mounts.
-	  #
-	  # If there is no directory component, then add one.
-	  case $wrapper in
-	  */* | *\\*) . ${wrapper} ;;
-	  *) . ./${wrapper} ;;
-	  esac
-
-	  # Check the variables that should have been set.
-	  if test -z "$notinst_deplibs"; then
-	    $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-
-	  finalize=yes
-	  for lib in $notinst_deplibs; do
-	    # Check to see that each library is installed.
-	    libdir=
-	    if test -f "$lib"; then
-	      # If there is no directory component, then add one.
-	      case $lib in
-	      */* | *\\*) . $lib ;;
-	      *) . ./$lib ;;
-	      esac
-	    fi
-	    libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
-	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
-	      finalize=no
-	    fi
-	  done
-
-	  relink_command=
-	  # Note that it is not necessary on cygwin/mingw to append a dot to
-	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
-	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
-	  # `FILE.' does not work on cygwin managed mounts.
-	  #
-	  # If there is no directory component, then add one.
-	  case $wrapper in
-	  */* | *\\*) . ${wrapper} ;;
-	  *) . ./${wrapper} ;;
-	  esac
-
-	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
-	    if test "$finalize" = yes && test -z "$run"; then
-	      tmpdir=`func_mktempdir`
-	      file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
-	      outputname="$tmpdir/$file"
-	      # Replace the output file specification.
-	      relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP`
-
-	      $show "$relink_command"
-	      if $run eval "$relink_command"; then :
-	      else
-		$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
-		${rm}r "$tmpdir"
-		continue
-	      fi
-	      file="$outputname"
-	    else
-	      $echo "$modename: warning: cannot relink \`$file'" 1>&2
-	    fi
-	  else
-	    # Install the binary that we compiled earlier.
-	    file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
-	  fi
-	fi
-
-	# remove .exe since cygwin /usr/bin/install will append another
-	# one anyway 
-	case $install_prog,$host in
-	*/usr/bin/install*,*cygwin*)
-	  case $file:$destfile in
-	  *.exe:*.exe)
-	    # this is ok
-	    ;;
-	  *.exe:*)
-	    destfile=$destfile.exe
-	    ;;
-	  *:*.exe)
-	    destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
-	    ;;
-	  esac
-	  ;;
-	esac
-	$show "$install_prog$stripme $file $destfile"
-	$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
-	test -n "$outputname" && ${rm}r "$tmpdir"
-	;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
-
-      $show "$install_prog $file $oldlib"
-      $run eval "$install_prog \$file \$oldlib" || exit $?
-
-      if test -n "$stripme" && test -n "$old_striplib"; then
-	$show "$old_striplib $oldlib"
-	$run eval "$old_striplib $oldlib" || exit $?
-      fi
-
-      # Do each command in the postinstall commands.
-      cmds=$old_postinstall_cmds
-      save_ifs="$IFS"; IFS='~'
-      for cmd in $cmds; do
-	IFS="$save_ifs"
-	eval cmd=\"$cmd\"
-	$show "$cmd"
-	$run eval "$cmd" || exit $?
-      done
-      IFS="$save_ifs"
-    done
-
-    if test -n "$future_libdirs"; then
-      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
-    fi
-
-    if test -n "$current_libdirs"; then
-      # Maybe just do a dry run.
-      test -n "$run" && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
-    else
-      exit $EXIT_SUCCESS
-    fi
-    ;;
-
-  # libtool finish mode
-  finish)
-    modename="$modename: finish"
-    libdirs="$nonopt"
-    admincmds=
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for dir
-      do
-	libdirs="$libdirs $dir"
-      done
-
-      for libdir in $libdirs; do
-	if test -n "$finish_cmds"; then
-	  # Do each command in the finish commands.
-	  cmds=$finish_cmds
-	  save_ifs="$IFS"; IFS='~'
-	  for cmd in $cmds; do
-	    IFS="$save_ifs"
-	    eval cmd=\"$cmd\"
-	    $show "$cmd"
-	    $run eval "$cmd" || admincmds="$admincmds
-       $cmd"
-	  done
-	  IFS="$save_ifs"
-	fi
-	if test -n "$finish_eval"; then
-	  # Do the single finish_eval.
-	  eval cmds=\"$finish_eval\"
-	  $run eval "$cmds" || admincmds="$admincmds
-       $cmds"
-	fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    test "$show" = : && exit $EXIT_SUCCESS
-
-    $echo "X----------------------------------------------------------------------" | $Xsed
-    $echo "Libraries have been installed in:"
-    for libdir in $libdirs; do
-      $echo "   $libdir"
-    done
-    $echo
-    $echo "If you ever happen to want to link against installed libraries"
-    $echo "in a given directory, LIBDIR, you must either use libtool, and"
-    $echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
-    $echo "flag during linking and do at least one of the following:"
-    if test -n "$shlibpath_var"; then
-      $echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-      $echo "     during execution"
-    fi
-    if test -n "$runpath_var"; then
-      $echo "   - add LIBDIR to the \`$runpath_var' environment variable"
-      $echo "     during linking"
-    fi
-    if test -n "$hardcode_libdir_flag_spec"; then
-      libdir=LIBDIR
-      eval flag=\"$hardcode_libdir_flag_spec\"
-
-      $echo "   - use the \`$flag' linker flag"
-    fi
-    if test -n "$admincmds"; then
-      $echo "   - have your system administrator run these commands:$admincmds"
-    fi
-    if test -f /etc/ld.so.conf; then
-      $echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-    fi
-    $echo
-    $echo "See any operating system documentation about shared libraries for"
-    $echo "more information, such as the ld(1) and ld.so(8) manual pages."
-    $echo "X----------------------------------------------------------------------" | $Xsed
-    exit $EXIT_SUCCESS
-    ;;
-
-  # libtool execute mode
-  execute)
-    modename="$modename: execute"
-
-    # The first argument is the command name.
-    cmd="$nonopt"
-    if test -z "$cmd"; then
-      $echo "$modename: you must specify a COMMAND" 1>&2
-      $echo "$help"
-      exit $EXIT_FAILURE
-    fi
-
-    # Handle -dlopen flags immediately.
-    for file in $execute_dlfiles; do
-      if test ! -f "$file"; then
-	$echo "$modename: \`$file' is not a file" 1>&2
-	$echo "$help" 1>&2
-	exit $EXIT_FAILURE
-      fi
-
-      dir=
-      case $file in
-      *.la)
-	# Check to see that this really is a libtool archive.
-	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-	else
-	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-	  $echo "$help" 1>&2
-	  exit $EXIT_FAILURE
-	fi
-
-	# Read the libtool library.
-	dlname=
-	library_names=
-
-	# If there is no directory component, then add one.
-	case $file in
-	*/* | *\\*) . $file ;;
-	*) . ./$file ;;
-	esac
-
-	# Skip this library if it cannot be dlopened.
-	if test -z "$dlname"; then
-	  # Warn if it was a shared library.
-	  test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
-	  continue
-	fi
-
-	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-	test "X$dir" = "X$file" && dir=.
-
-	if test -f "$dir/$objdir/$dlname"; then
-	  dir="$dir/$objdir"
-	else
-	  if test ! -f "$dir/$dlname"; then
-	    $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
-	    exit $EXIT_FAILURE
-	  fi
-	fi
-	;;
-
-      *.lo)
-	# Just add the directory containing the .lo file.
-	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-	test "X$dir" = "X$file" && dir=.
-	;;
-
-      *)
-	$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
-	continue
-	;;
-      esac
-
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
-
-      # Now add the directory to shlibpath_var.
-      if eval "test -z \"\$$shlibpath_var\""; then
-	eval "$shlibpath_var=\"\$dir\""
-      else
-	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
-      fi
-    done
-
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
-
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case $file in
-      -*) ;;
-      *)
-	# Do a test to see if this is really a libtool program.
-	if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	  # If there is no directory component, then add one.
-	  case $file in
-	  */* | *\\*) . $file ;;
-	  *) . ./$file ;;
-	  esac
-
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	fi
-	;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
-      args="$args \"$file\""
-    done
-
-    if test -z "$run"; then
-      if test -n "$shlibpath_var"; then
-	# Export the shlibpath_var.
-	eval "export $shlibpath_var"
-      fi
-
-      # Restore saved environment variables
-      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-      do
-	eval "if test \"\${save_$lt_var+set}\" = set; then
-		$lt_var=\$save_$lt_var; export $lt_var
-	      fi"
-      done
-
-      # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
-	$echo "export $shlibpath_var"
-      fi
-      $echo "$cmd$args"
-      exit $EXIT_SUCCESS
-    fi
-    ;;
-
-  # libtool clean and uninstall mode
-  clean | uninstall)
-    modename="$modename: $mode"
-    rm="$nonopt"
-    files=
-    rmforce=
-    exit_status=0
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    for arg
-    do
-      case $arg in
-      -f) rm="$rm $arg"; rmforce=yes ;;
-      -*) rm="$rm $arg" ;;
-      *) files="$files $arg" ;;
-      esac
-    done
-
-    if test -z "$rm"; then
-      $echo "$modename: you must specify an RM program" 1>&2
-      $echo "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    rmdirs=
-
-    origobjdir="$objdir"
-    for file in $files; do
-      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-      if test "X$dir" = "X$file"; then
-	dir=.
-	objdir="$origobjdir"
-      else
-	objdir="$dir/$origobjdir"
-      fi
-      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-      test "$mode" = uninstall && objdir="$dir"
-
-      # Remember objdir for removal later, being careful to avoid duplicates
-      if test "$mode" = clean; then
-	case " $rmdirs " in
-	  *" $objdir "*) ;;
-	  *) rmdirs="$rmdirs $objdir" ;;
-	esac
-      fi
-
-      # Don't error if the file doesn't exist and rm -f was used.
-      if (test -L "$file") >/dev/null 2>&1 \
-	|| (test -h "$file") >/dev/null 2>&1 \
-	|| test -f "$file"; then
-	:
-      elif test -d "$file"; then
-	exit_status=1
-	continue
-      elif test "$rmforce" = yes; then
-	continue
-      fi
-
-      rmfiles="$file"
-
-      case $name in
-      *.la)
-	# Possibly a libtool archive, so verify it.
-	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	  . $dir/$name
-
-	  # Delete the libtool libraries and symlinks.
-	  for n in $library_names; do
-	    rmfiles="$rmfiles $objdir/$n"
-	  done
-	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
-
-	  case "$mode" in
-	  clean)
-	    case "  $library_names " in
-	    # "  " in the beginning catches empty $dlname
-	    *" $dlname "*) ;;
-	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
-	    esac
-	     test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
-	    ;;
-	  uninstall)
-	    if test -n "$library_names"; then
-	      # Do each command in the postuninstall commands.
-	      cmds=$postuninstall_cmds
-	      save_ifs="$IFS"; IFS='~'
-	      for cmd in $cmds; do
-		IFS="$save_ifs"
-		eval cmd=\"$cmd\"
-		$show "$cmd"
-		$run eval "$cmd"
-		if test "$?" -ne 0 && test "$rmforce" != yes; then
-		  exit_status=1
-		fi
-	      done
-	      IFS="$save_ifs"
-	    fi
-
-	    if test -n "$old_library"; then
-	      # Do each command in the old_postuninstall commands.
-	      cmds=$old_postuninstall_cmds
-	      save_ifs="$IFS"; IFS='~'
-	      for cmd in $cmds; do
-		IFS="$save_ifs"
-		eval cmd=\"$cmd\"
-		$show "$cmd"
-		$run eval "$cmd"
-		if test "$?" -ne 0 && test "$rmforce" != yes; then
-		  exit_status=1
-		fi
-	      done
-	      IFS="$save_ifs"
-	    fi
-	    # FIXME: should reinstall the best remaining shared library.
-	    ;;
-	  esac
-	fi
-	;;
-
-      *.lo)
-	# Possibly a libtool object, so verify it.
-	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-
-	  # Read the .lo file
-	  . $dir/$name
-
-	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" \
-	     && test "$pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$pic_object"
-	  fi
-
-	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" \
-	     && test "$non_pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$non_pic_object"
-	  fi
-	fi
-	;;
-
-      *)
-	if test "$mode" = clean ; then
-	  noexename=$name
-	  case $file in
-	  *.exe)
-	    file=`$echo $file|${SED} 's,.exe$,,'`
-	    noexename=`$echo $name|${SED} 's,.exe$,,'`
-	    # $file with .exe has already been added to rmfiles,
-	    # add $file without .exe
-	    rmfiles="$rmfiles $file"
-	    ;;
-	  esac
-	  # Do a test to see if this is a libtool program.
-	  if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	    relink_command=
-	    . $dir/$noexename
-
-	    # note $name still contains .exe if it was in $file originally
-	    # as does the version of $file that was added into $rmfiles
-	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
-	      rmfiles="$rmfiles $objdir/lt-$name"
-	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
-	    fi
-	  fi
-	fi
-	;;
-      esac
-      $show "$rm $rmfiles"
-      $run $rm $rmfiles || exit_status=1
-    done
-    objdir="$origobjdir"
-
-    # Try to remove the ${objdir}s in the directories where we deleted files
-    for dir in $rmdirs; do
-      if test -d "$dir"; then
-	$show "rmdir $dir"
-	$run rmdir $dir >/dev/null 2>&1
-      fi
-    done
-
-    exit $exit_status
-    ;;
-
-  "")
-    $echo "$modename: you must specify a MODE" 1>&2
-    $echo "$generic_help" 1>&2
-    exit $EXIT_FAILURE
-    ;;
-  esac
-
-  if test -z "$exec_cmd"; then
-    $echo "$modename: invalid operation mode \`$mode'" 1>&2
-    $echo "$generic_help" 1>&2
-    exit $EXIT_FAILURE
-  fi
-fi # test -z "$show_help"
-
-if test -n "$exec_cmd"; then
-  eval exec $exec_cmd
-  exit $EXIT_FAILURE
-fi
-
-# We need to display help for each of the modes.
-case $mode in
-"") $echo \
-"Usage: $modename [OPTION]... [MODE-ARG]...
-
-Provide generalized library-building support services.
-
-    --config          show all configuration variables
-    --debug           enable verbose shell tracing
--n, --dry-run         display commands without modifying any files
-    --features        display basic configuration information and exit
-    --finish          same as \`--mode=finish'
-    --help            display this help message and exit
-    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
-    --quiet           same as \`--silent'
-    --silent          don't print informational messages
-    --tag=TAG         use configuration variables from tag TAG
-    --version         print version information
-
-MODE must be one of the following:
-
-      clean           remove files from the build directory
-      compile         compile a source file into a libtool object
-      execute         automatically set library path, then run a program
-      finish          complete the installation of libtool libraries
-      install         install libraries or executables
-      link            create a library or an executable
-      uninstall       remove libraries from an installed directory
-
-MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
-a more detailed description of MODE.
-
-Report bugs to <bug-libtool@gnu.org>."
-  exit $EXIT_SUCCESS
-  ;;
-
-clean)
-  $echo \
-"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
-  ;;
-
-compile)
-  $echo \
-"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -prefer-pic       try to building PIC objects only
-  -prefer-non-pic   try to building non-PIC objects only
-  -static           always build a \`.o' file suitable for static linking
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-  ;;
-
-execute)
-  $echo \
-"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-  ;;
-
-finish)
-  $echo \
-"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-  ;;
-
-install)
-  $echo \
-"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-  ;;
-
-link)
-  $echo \
-"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-                    try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-                    try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-fast-install  disable the fast-install mode
-  -no-install       link a not-installable executable
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
-  -precious-files-regex REGEX
-                    don't remove output files matching REGEX
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -static           do not do any dynamic linking of uninstalled libtool libraries
-  -static-libtool-libs
-                    do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-                    specify library version info [each variable defaults to 0]
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-  ;;
-
-uninstall)
-  $echo \
-"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-  ;;
-
-*)
-  $echo "$modename: invalid operation mode \`$mode'" 1>&2
-  $echo "$help" 1>&2
-  exit $EXIT_FAILURE
-  ;;
-esac
-
-$echo
-$echo "Try \`$modename --help' for more information about other modes."
-
-exit $?
-
-# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
-# choices, we go for a static library, that is the most portable,
-# since we can't tell whether shared libraries were disabled because
-# the user asked for that or because the platform doesn't support
-# them.  This is particularly important on AIX, because we don't
-# support having both static and shared libraries enabled at the same
-# time on that platform, so we default to a shared-only configuration.
-# If a disable-shared tag is given, we'll fallback to a static-only
-# configuration.  But we'll never go from static-only to shared-only.
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-disable_libs=shared
-# ### END LIBTOOL TAG CONFIG: disable-shared
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-static
-disable_libs=static
-# ### END LIBTOOL TAG CONFIG: disable-static
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
diff --git a/third_party/libevent/missing b/third_party/libevent/missing
deleted file mode 100644
index e7ef83a..0000000
--- a/third_party/libevent/missing
+++ /dev/null
@@ -1,360 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2003-09-02.23
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 
-#   Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-run=:
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case "$1" in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case "$1" in
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  tar          try tar, gnutar, gtar, then tar without non-portable flags
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Send bug reports to <bug-automake@gnu.org>."
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing $scriptversion (GNU Automake)"
-    ;;
-
-  -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
-    exit 1
-    ;;
-
-  aclocal*)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    fi
-
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    fi
-
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    fi
-
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case "$f" in
-      *:*) touch_files="$touch_files "`echo "$f" |
-				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    fi
-
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-	   sed 's/\.am$/.in/' |
-	   while read f; do touch "$f"; done
-    ;;
-
-  autom4te)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    fi
-
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
-    test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo "#! /bin/sh"
-	echo "# Created by GNU Automake missing as a replacement of"
-	echo "#  $ $@"
-	echo "exit 0"
-	chmod +x $file
-	exit 1
-    fi
-    ;;
-
-  bison|yacc)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if [ $# -ne 1 ]; then
-        eval LASTARG="\${$#}"
-	case "$LASTARG" in
-	*.y)
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if [ -f "$SRCFILE" ]; then
-	         cp "$SRCFILE" y.tab.c
-	    fi
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if [ -f "$SRCFILE" ]; then
-	         cp "$SRCFILE" y.tab.h
-	    fi
-	  ;;
-	esac
-    fi
-    if [ ! -f y.tab.h ]; then
-	echo >y.tab.h
-    fi
-    if [ ! -f y.tab.c ]; then
-	echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex|flex)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if [ $# -ne 1 ]; then
-        eval LASTARG="\${$#}"
-	case "$LASTARG" in
-	*.l)
-	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if [ -f "$SRCFILE" ]; then
-	         cp "$SRCFILE" lex.yy.c
-	    fi
-	  ;;
-	esac
-    fi
-    if [ ! -f lex.yy.c ]; then
-	echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    fi
-
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-	 you modified a dependency of a manual page.  You may need the
-	 \`Help2man' package in order for those modifications to take
-	 effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
-    if test -z "$file"; then
-	file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
-    fi
-    if [ -f "$file" ]; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo ".ab help2man is required to generate this page"
-	exit 1
-    fi
-    ;;
-
-  makeinfo)
-    if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
-       # We have makeinfo, but it failed.
-       exit 1
-    fi
-
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
-    if test -z "$file"; then
-      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
-    fi
-    touch $file
-    ;;
-
-  tar)
-    shift
-    if test -n "$run"; then
-      echo 1>&2 "ERROR: \`tar' requires --run"
-      exit 1
-    fi
-
-    # We have already tried tar in the generic part.
-    # Look for gnutar/gtar before invocation to avoid ugly error
-    # messages.
-    if (gnutar --version > /dev/null 2>&1); then
-       gnutar "$@" && exit 0
-    fi
-    if (gtar --version > /dev/null 2>&1); then
-       gtar "$@" && exit 0
-    fi
-    firstarg="$1"
-    if shift; then
-	case "$firstarg" in
-	*o*)
-	    firstarg=`echo "$firstarg" | sed s/o//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-	case "$firstarg" in
-	*h*)
-	    firstarg=`echo "$firstarg" | sed s/h//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-    fi
-
-    echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
-         You may want to install GNU tar or Free paxutils, or check the
-         command line arguments."
-    exit 1
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/third_party/libevent/mkinstalldirs b/third_party/libevent/mkinstalldirs
deleted file mode 100644
index 56d6671..0000000
--- a/third_party/libevent/mkinstalldirs
+++ /dev/null
@@ -1,40 +0,0 @@
-#! /bin/sh
-# mkinstalldirs --- make directory hierarchy
-# Author: Noah Friedman <friedman@prep.ai.mit.edu>
-# Created: 1993-05-16
-# Public domain
-
-# $Id: mkinstalldirs 11 2002-04-09 17:52:23Z nprovos $
-
-errstatus=0
-
-for file
-do
-   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
-   shift
-
-   pathcomp=
-   for d
-   do
-     pathcomp="$pathcomp$d"
-     case "$pathcomp" in
-       -* ) pathcomp=./$pathcomp ;;
-     esac
-
-     if test ! -d "$pathcomp"; then
-        echo "mkdir $pathcomp"
-
-        mkdir "$pathcomp" || lasterr=$?
-
-        if test ! -d "$pathcomp"; then
-  	  errstatus=$lasterr
-        fi
-     fi
-
-     pathcomp="$pathcomp/"
-   done
-done
-
-exit $errstatus
-
-# mkinstalldirs ends here
diff --git a/third_party/libevent/sample/Makefile.in b/third_party/libevent/sample/Makefile.in
deleted file mode 100644
index 793752a..0000000
--- a/third_party/libevent/sample/Makefile.in
+++ /dev/null
@@ -1,442 +0,0 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-noinst_PROGRAMS = event-test$(EXEEXT) time-test$(EXEEXT) \
-	signal-test$(EXEEXT)
-subdir = sample
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-event_test_SOURCES = event-test.c
-event_test_OBJECTS = event-test.$(OBJEXT)
-event_test_LDADD = $(LDADD)
-event_test_DEPENDENCIES = ../libevent.la
-signal_test_SOURCES = signal-test.c
-signal_test_OBJECTS = signal-test.$(OBJEXT)
-signal_test_LDADD = $(LDADD)
-signal_test_DEPENDENCIES = ../libevent.la
-time_test_SOURCES = time-test.c
-time_test_OBJECTS = time-test.$(OBJEXT)
-time_test_LDADD = $(LDADD)
-time_test_DEPENDENCIES = ../libevent.la
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = event-test.c signal-test.c time-test.c
-DIST_SOURCES = event-test.c signal-test.c time-test.c
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIBTOOL_DEPS = @LIBTOOL_DEPS@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NMEDIT = @NMEDIT@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AUTOMAKE_OPTIONS = foreign no-dependencies
-LDADD = ../libevent.la
-AM_CFLAGS = -I$(top_srcdir) -I$(top_srcdir)/compat
-event_test_sources = event-test.c
-time_test_sources = time-test.c
-signal_test_sources = signal-test.c
-DISTCLEANFILES = *~
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  sample/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  sample/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; for p in $$list; do \
-	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  echo " rm -f $$p $$f"; \
-	  rm -f $$p $$f ; \
-	done
-event-test$(EXEEXT): $(event_test_OBJECTS) $(event_test_DEPENDENCIES) 
-	@rm -f event-test$(EXEEXT)
-	$(LINK) $(event_test_OBJECTS) $(event_test_LDADD) $(LIBS)
-signal-test$(EXEEXT): $(signal_test_OBJECTS) $(signal_test_DEPENDENCIES) 
-	@rm -f signal-test$(EXEEXT)
-	$(LINK) $(signal_test_OBJECTS) $(signal_test_LDADD) $(LIBS)
-time-test$(EXEEXT): $(time_test_OBJECTS) $(time_test_DEPENDENCIES) 
-	@rm -f time-test$(EXEEXT)
-	$(LINK) $(time_test_OBJECTS) $(time_test_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.c.o:
-	$(COMPILE) -c $<
-
-.c.obj:
-	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-	$(LTCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS)
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-info: install-info-am
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-ps: install-ps-am
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-noinstPROGRAMS ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags uninstall uninstall-am
-
-
-verify:
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/libevent/test/Makefile.in b/third_party/libevent/test/Makefile.in
deleted file mode 100644
index c2d5b31..0000000
--- a/third_party/libevent/test/Makefile.in
+++ /dev/null
@@ -1,487 +0,0 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-noinst_PROGRAMS = test-init$(EXEEXT) test-eof$(EXEEXT) \
-	test-weof$(EXEEXT) test-time$(EXEEXT) regress$(EXEEXT) \
-	bench$(EXEEXT)
-subdir = test
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_bench_OBJECTS = bench.$(OBJEXT)
-bench_OBJECTS = $(am_bench_OBJECTS)
-bench_DEPENDENCIES = ../libevent.la
-am_regress_OBJECTS = regress.$(OBJEXT) regress_http.$(OBJEXT) \
-	regress_dns.$(OBJEXT) regress_rpc.$(OBJEXT) \
-	regress.gen.$(OBJEXT)
-regress_OBJECTS = $(am_regress_OBJECTS)
-regress_DEPENDENCIES = ../libevent.la
-am_test_eof_OBJECTS = test-eof.$(OBJEXT)
-test_eof_OBJECTS = $(am_test_eof_OBJECTS)
-test_eof_DEPENDENCIES = ../libevent_core.la
-am_test_init_OBJECTS = test-init.$(OBJEXT)
-test_init_OBJECTS = $(am_test_init_OBJECTS)
-test_init_DEPENDENCIES = ../libevent_core.la
-am_test_time_OBJECTS = test-time.$(OBJEXT)
-test_time_OBJECTS = $(am_test_time_OBJECTS)
-test_time_DEPENDENCIES = ../libevent_core.la
-am_test_weof_OBJECTS = test-weof.$(OBJEXT)
-test_weof_OBJECTS = $(am_test_weof_OBJECTS)
-test_weof_DEPENDENCIES = ../libevent_core.la
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(bench_SOURCES) $(regress_SOURCES) $(test_eof_SOURCES) \
-	$(test_init_SOURCES) $(test_time_SOURCES) $(test_weof_SOURCES)
-DIST_SOURCES = $(bench_SOURCES) $(regress_SOURCES) $(test_eof_SOURCES) \
-	$(test_init_SOURCES) $(test_time_SOURCES) $(test_weof_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIBTOOL_DEPS = @LIBTOOL_DEPS@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NMEDIT = @NMEDIT@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AUTOMAKE_OPTIONS = foreign no-dependencies
-AM_CFLAGS = -I$(top_srcdir) -I$(top_srcdir)/compat
-EXTRA_DIST = regress.rpc regress.gen.h regress.gen.c
-BUILT_SOURCES = regress.gen.c regress.gen.h
-test_init_SOURCES = test-init.c
-test_init_LDADD = ../libevent_core.la
-test_eof_SOURCES = test-eof.c
-test_eof_LDADD = ../libevent_core.la
-test_weof_SOURCES = test-weof.c
-test_weof_LDADD = ../libevent_core.la
-test_time_SOURCES = test-time.c
-test_time_LDADD = ../libevent_core.la
-regress_SOURCES = regress.c regress.h regress_http.c regress_dns.c \
-	regress_rpc.c \
-	regress.gen.c regress.gen.h
-
-regress_LDADD = ../libevent.la
-bench_SOURCES = bench.c
-bench_LDADD = ../libevent.la
-DISTCLEANFILES = *~
-all: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  test/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  test/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; for p in $$list; do \
-	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  echo " rm -f $$p $$f"; \
-	  rm -f $$p $$f ; \
-	done
-bench$(EXEEXT): $(bench_OBJECTS) $(bench_DEPENDENCIES) 
-	@rm -f bench$(EXEEXT)
-	$(LINK) $(bench_OBJECTS) $(bench_LDADD) $(LIBS)
-regress$(EXEEXT): $(regress_OBJECTS) $(regress_DEPENDENCIES) 
-	@rm -f regress$(EXEEXT)
-	$(LINK) $(regress_OBJECTS) $(regress_LDADD) $(LIBS)
-test-eof$(EXEEXT): $(test_eof_OBJECTS) $(test_eof_DEPENDENCIES) 
-	@rm -f test-eof$(EXEEXT)
-	$(LINK) $(test_eof_OBJECTS) $(test_eof_LDADD) $(LIBS)
-test-init$(EXEEXT): $(test_init_OBJECTS) $(test_init_DEPENDENCIES) 
-	@rm -f test-init$(EXEEXT)
-	$(LINK) $(test_init_OBJECTS) $(test_init_LDADD) $(LIBS)
-test-time$(EXEEXT): $(test_time_OBJECTS) $(test_time_DEPENDENCIES) 
-	@rm -f test-time$(EXEEXT)
-	$(LINK) $(test_time_OBJECTS) $(test_time_LDADD) $(LIBS)
-test-weof$(EXEEXT): $(test_weof_OBJECTS) $(test_weof_DEPENDENCIES) 
-	@rm -f test-weof$(EXEEXT)
-	$(LINK) $(test_weof_OBJECTS) $(test_weof_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.c.o:
-	$(COMPILE) -c $<
-
-.c.obj:
-	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-	$(LTCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) check-am
-all-am: Makefile $(PROGRAMS)
-installdirs:
-install: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-info: install-info-am
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-ps: install-ps-am
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-noinstPROGRAMS ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags uninstall uninstall-am
-
-
-regress.gen.c regress.gen.h: regress.rpc $(top_srcdir)/event_rpcgen.py
-	$(top_srcdir)/event_rpcgen.py $(srcdir)/regress.rpc || echo "No Python installed"
-
-test: test-init test-eof test-weof test-time regress
-
-verify: test
-	@$(srcdir)/test.sh
-
-bench test-init test-eof test-weof test-time: ../libevent.la
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/libevent/test/regress.gen.c b/third_party/libevent/test/regress.gen.c
deleted file mode 100644
index 0918fc0..0000000
--- a/third_party/libevent/test/regress.gen.c
+++ /dev/null
@@ -1,878 +0,0 @@
-/*
- * Automatically generated from ./regress.rpc
- * by event_rpcgen.py/0.1.  DO NOT EDIT THIS FILE.
- */
-
-#include <sys/types.h>
-#ifdef _EVENT_HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#define EVENT_NO_STRUCT
-#include <event.h>
-
-#ifdef _EVENT___func__
-#define __func__ _EVENT___func__
-#endif
-
-#include "./regress.gen.h"
-
-void event_err(int eval, const char *fmt, ...);
-void event_warn(const char *fmt, ...);
-void event_errx(int eval, const char *fmt, ...);
-void event_warnx(const char *fmt, ...);
-
-
-/*
- * Implementation of msg
- */
-
-static struct msg_access_ __msg_base = {
-  msg_from_name_assign,
-  msg_from_name_get,
-  msg_to_name_assign,
-  msg_to_name_get,
-  msg_attack_assign,
-  msg_attack_get,
-  msg_run_assign,
-  msg_run_get,
-  msg_run_add,
-};
-
-struct msg *
-msg_new(void)
-{
-  struct msg *tmp;
-  if ((tmp = malloc(sizeof(struct msg))) == NULL) {
-    event_warn("%s: malloc", __func__);
-    return (NULL);
-  }
-  tmp->base = &__msg_base;
-
-  tmp->from_name_data = NULL;
-  tmp->from_name_set = 0;
-
-  tmp->to_name_data = NULL;
-  tmp->to_name_set = 0;
-
-  tmp->attack_data = NULL;
-  tmp->attack_set = 0;
-
-  tmp->run_data = NULL;
-  tmp->run_length = 0;
-  tmp->run_num_allocated = 0;
-  tmp->run_set = 0;
-
-  return (tmp);
-}
-
-
-
-
-struct run *
-msg_run_add(struct msg *msg)
-{
-  if (++msg->run_length >= msg->run_num_allocated) {
-    int tobe_allocated = msg->run_num_allocated;
-    struct run ** new_data = NULL;
-    tobe_allocated = !tobe_allocated ? 1 : tobe_allocated << 1;
-    new_data = (struct run **) realloc(msg->run_data,
-        tobe_allocated * sizeof(struct run *));
-    if (new_data == NULL)
-      goto error;
-    msg->run_data = new_data;
-    msg->run_num_allocated = tobe_allocated;
-  }
-  msg->run_data[msg->run_length - 1] = run_new();
-  if (msg->run_data[msg->run_length - 1] == NULL)
-    goto error;
-  msg->run_set = 1;
-  return (msg->run_data[msg->run_length - 1]);
-error:
-  --msg->run_length;
-  return (NULL);
-}
-        
-
-int
-msg_from_name_assign(struct msg *msg,
-    const char * value)
-{
-  if (msg->from_name_data != NULL)
-    free(msg->from_name_data);
-  if ((msg->from_name_data = strdup(value)) == NULL)
-    return (-1);
-  msg->from_name_set = 1;
-  return (0);
-}
-
-int
-msg_to_name_assign(struct msg *msg,
-    const char * value)
-{
-  if (msg->to_name_data != NULL)
-    free(msg->to_name_data);
-  if ((msg->to_name_data = strdup(value)) == NULL)
-    return (-1);
-  msg->to_name_set = 1;
-  return (0);
-}
-
-int
-msg_attack_assign(struct msg *msg,
-    const struct kill* value)
-{
-   struct evbuffer *tmp = NULL;
-   if (msg->attack_set) {
-     kill_clear(msg->attack_data);
-     msg->attack_set = 0;
-   } else {
-     msg->attack_data = kill_new();
-     if (msg->attack_data == NULL) {
-       event_warn("%s: kill_new()", __func__);
-       goto error;
-     }
-   }
-   if ((tmp = evbuffer_new()) == NULL) {
-     event_warn("%s: evbuffer_new()", __func__);
-     goto error;
-   }
-   kill_marshal(tmp, value);
-   if (kill_unmarshal(msg->attack_data, tmp) == -1) {
-     event_warnx("%s: kill_unmarshal", __func__);
-     goto error;
-   }
-   msg->attack_set = 1;
-   evbuffer_free(tmp);
-   return (0);
- error:
-   if (tmp != NULL)
-     evbuffer_free(tmp);
-   if (msg->attack_data != NULL) {
-     kill_free(msg->attack_data);
-     msg->attack_data = NULL;
-   }
-   return (-1);
-}
-
-int
-msg_run_assign(struct msg *msg, int off,
-    const struct run * value)
-{
-  struct evbuffer *tmp = NULL;
-  if (!msg->run_set || off < 0 || off >= msg->run_length)
-    return (-1);
-  run_clear(msg->run_data[off]);
-  if ((tmp = evbuffer_new()) == NULL) {
-    event_warn("%s: evbuffer_new()", __func__);
-    goto error;
-  }
-  run_marshal(tmp, value);
-  if (run_unmarshal(msg->run_data[off], tmp) == -1) {
-    event_warnx("%s: run_unmarshal", __func__);
-    goto error;
-  }
-  evbuffer_free(tmp);
-  return (0);
-error:
-  if (tmp != NULL)
-    evbuffer_free(tmp);
-  run_clear(msg->run_data[off]);
-  return (-1);
-}
-
-int
-msg_from_name_get(struct msg *msg, char * *value)
-{
-  if (msg->from_name_set != 1)
-    return (-1);
-  *value = msg->from_name_data;
-  return (0);
-}
-
-int
-msg_to_name_get(struct msg *msg, char * *value)
-{
-  if (msg->to_name_set != 1)
-    return (-1);
-  *value = msg->to_name_data;
-  return (0);
-}
-
-int
-msg_attack_get(struct msg *msg, struct kill* *value)
-{
-  if (msg->attack_set != 1) {
-    msg->attack_data = kill_new();
-    if (msg->attack_data == NULL)
-      return (-1);
-    msg->attack_set = 1;
-  }
-  *value = msg->attack_data;
-  return (0);
-}
-
-int
-msg_run_get(struct msg *msg, int offset,
-    struct run * *value)
-{
-  if (!msg->run_set || offset < 0 || offset >= msg->run_length)
-    return (-1);
-  *value = msg->run_data[offset];
-  return (0);
-}
-
-void
-msg_clear(struct msg *tmp)
-{
-  if (tmp->from_name_set == 1) {
-    free (tmp->from_name_data);
-    tmp->from_name_data = NULL;
-    tmp->from_name_set = 0;
-  }
-  if (tmp->to_name_set == 1) {
-    free (tmp->to_name_data);
-    tmp->to_name_data = NULL;
-    tmp->to_name_set = 0;
-  }
-  if (tmp->attack_set == 1) {
-    kill_free(tmp->attack_data);
-    tmp->attack_data = NULL;
-    tmp->attack_set = 0;
-  }
-  if (tmp->run_set == 1) {
-    int i;
-    for (i = 0; i < tmp->run_length; ++i) {
-      run_free(tmp->run_data[i]);
-    }
-    free(tmp->run_data);
-    tmp->run_data = NULL;
-    tmp->run_set = 0;
-    tmp->run_length = 0;
-    tmp->run_num_allocated = 0;
-  }
-}
-
-void
-msg_free(struct msg *tmp)
-{
-  if (tmp->from_name_data != NULL)
-      free (tmp->from_name_data); 
-  if (tmp->to_name_data != NULL)
-      free (tmp->to_name_data); 
-  if (tmp->attack_data != NULL)
-      kill_free(tmp->attack_data); 
-  if (tmp->run_data != NULL) {
-    int i;
-    for (i = 0; i < tmp->run_length; ++i) {
-      run_free(tmp->run_data[i]); 
-      tmp->run_data[i] = NULL;
-    }
-    free(tmp->run_data);
-    tmp->run_data = NULL;
-    tmp->run_length = 0;
-    tmp->run_num_allocated = 0;
-  }
-  free(tmp);
-}
-
-void
-msg_marshal(struct evbuffer *evbuf, const struct msg *tmp){
-  evtag_marshal_string(evbuf, MSG_FROM_NAME, tmp->from_name_data);
-  evtag_marshal_string(evbuf, MSG_TO_NAME, tmp->to_name_data);
-  if (tmp->attack_set) {
-    evtag_marshal_kill(evbuf, MSG_ATTACK, tmp->attack_data);
-  }
-  {
-    int i;
-    for (i = 0; i < tmp->run_length; ++i) {
-      evtag_marshal_run(evbuf, MSG_RUN, tmp->run_data[i]);
-    }
-  }
-}
-
-int
-msg_unmarshal(struct msg *tmp,  struct evbuffer *evbuf)
-{
-  ev_uint32_t tag;
-  while (EVBUFFER_LENGTH(evbuf) > 0) {
-    if (evtag_peek(evbuf, &tag) == -1)
-      return (-1);
-    switch (tag) {
-
-      case MSG_FROM_NAME:
-
-        if (tmp->from_name_set)
-          return (-1);
-        if (evtag_unmarshal_string(evbuf, MSG_FROM_NAME, &tmp->from_name_data) == -1) {
-          event_warnx("%s: failed to unmarshal from_name", __func__);
-          return (-1);
-        }
-        tmp->from_name_set = 1;
-        break;
-
-      case MSG_TO_NAME:
-
-        if (tmp->to_name_set)
-          return (-1);
-        if (evtag_unmarshal_string(evbuf, MSG_TO_NAME, &tmp->to_name_data) == -1) {
-          event_warnx("%s: failed to unmarshal to_name", __func__);
-          return (-1);
-        }
-        tmp->to_name_set = 1;
-        break;
-
-      case MSG_ATTACK:
-
-        if (tmp->attack_set)
-          return (-1);
-        tmp->attack_data = kill_new();
-        if (tmp->attack_data == NULL)
-          return (-1);
-        if (evtag_unmarshal_kill(evbuf, MSG_ATTACK, tmp->attack_data) == -1) {
-          event_warnx("%s: failed to unmarshal attack", __func__);
-          return (-1);
-        }
-        tmp->attack_set = 1;
-        break;
-
-      case MSG_RUN:
-
-        if (msg_run_add(tmp) == NULL)
-          return (-1);
-        if (evtag_unmarshal_run(evbuf, MSG_RUN,
-          tmp->run_data[tmp->run_length - 1]) == -1) {
-          --tmp->run_length;
-          event_warnx("%s: failed to unmarshal run", __func__);
-          return (-1);
-        }
-        tmp->run_set = 1;
-        break;
-
-      default:
-        return -1;
-    }
-  }
-
-  if (msg_complete(tmp) == -1)
-    return (-1);
-  return (0);
-}
-
-int
-msg_complete(struct msg *msg)
-{
-  if (!msg->from_name_set)
-    return (-1);
-  if (!msg->to_name_set)
-    return (-1);
-  if (msg->attack_set && kill_complete(msg->attack_data) == -1)
-    return (-1);
-  {
-    int i;
-    for (i = 0; i < msg->run_length; ++i) {
-      if (run_complete(msg->run_data[i]) == -1)
-        return (-1);
-    }
-  }
-  return (0);
-}
-
-int
-evtag_unmarshal_msg(struct evbuffer *evbuf, ev_uint32_t need_tag, struct msg *msg)
-{
-  ev_uint32_t tag;
-  int res = -1;
-
-  struct evbuffer *tmp = evbuffer_new();
-
-  if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
-    goto error;
-
-  if (msg_unmarshal(msg, tmp) == -1)
-    goto error;
-
-  res = 0;
-
- error:
-  evbuffer_free(tmp);
-  return (res);
-}
-
-void
-evtag_marshal_msg(struct evbuffer *evbuf, ev_uint32_t tag, const struct msg *msg)
-{
-  struct evbuffer *_buf = evbuffer_new();
-  assert(_buf != NULL);
-  evbuffer_drain(_buf, -1);
-  msg_marshal(_buf, msg);
-  evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
-  evbuffer_free(_buf);
-}
-
-/*
- * Implementation of kill
- */
-
-static struct kill_access_ __kill_base = {
-  kill_weapon_assign,
-  kill_weapon_get,
-  kill_action_assign,
-  kill_action_get,
-  kill_how_often_assign,
-  kill_how_often_get,
-};
-
-struct kill *
-kill_new(void)
-{
-  struct kill *tmp;
-  if ((tmp = malloc(sizeof(struct kill))) == NULL) {
-    event_warn("%s: malloc", __func__);
-    return (NULL);
-  }
-  tmp->base = &__kill_base;
-
-  tmp->weapon_data = NULL;
-  tmp->weapon_set = 0;
-
-  tmp->action_data = NULL;
-  tmp->action_set = 0;
-
-  tmp->how_often_data = 0;
-  tmp->how_often_set = 0;
-
-  return (tmp);
-}
-
-
-
-
-int
-kill_weapon_assign(struct kill *msg,
-    const char * value)
-{
-  if (msg->weapon_data != NULL)
-    free(msg->weapon_data);
-  if ((msg->weapon_data = strdup(value)) == NULL)
-    return (-1);
-  msg->weapon_set = 1;
-  return (0);
-}
-
-int
-kill_action_assign(struct kill *msg,
-    const char * value)
-{
-  if (msg->action_data != NULL)
-    free(msg->action_data);
-  if ((msg->action_data = strdup(value)) == NULL)
-    return (-1);
-  msg->action_set = 1;
-  return (0);
-}
-
-int
-kill_how_often_assign(struct kill *msg, const ev_uint32_t value)
-{
-  msg->how_often_set = 1;
-  msg->how_often_data = value;
-  return (0);
-}
-
-int
-kill_weapon_get(struct kill *msg, char * *value)
-{
-  if (msg->weapon_set != 1)
-    return (-1);
-  *value = msg->weapon_data;
-  return (0);
-}
-
-int
-kill_action_get(struct kill *msg, char * *value)
-{
-  if (msg->action_set != 1)
-    return (-1);
-  *value = msg->action_data;
-  return (0);
-}
-
-int
-kill_how_often_get(struct kill *msg, ev_uint32_t *value)
-{
-  if (msg->how_often_set != 1)
-    return (-1);
-  *value = msg->how_often_data;
-  return (0);
-}
-
-void
-kill_clear(struct kill *tmp)
-{
-  if (tmp->weapon_set == 1) {
-    free (tmp->weapon_data);
-    tmp->weapon_data = NULL;
-    tmp->weapon_set = 0;
-  }
-  if (tmp->action_set == 1) {
-    free (tmp->action_data);
-    tmp->action_data = NULL;
-    tmp->action_set = 0;
-  }
-  tmp->how_often_set = 0;
-}
-
-void
-kill_free(struct kill *tmp)
-{
-  if (tmp->weapon_data != NULL)
-      free (tmp->weapon_data); 
-  if (tmp->action_data != NULL)
-      free (tmp->action_data); 
-  free(tmp);
-}
-
-void
-kill_marshal(struct evbuffer *evbuf, const struct kill *tmp){
-  evtag_marshal_string(evbuf, KILL_WEAPON, tmp->weapon_data);
-  evtag_marshal_string(evbuf, KILL_ACTION, tmp->action_data);
-  if (tmp->how_often_set) {
-    evtag_marshal_int(evbuf, KILL_HOW_OFTEN, tmp->how_often_data);
-  }
-}
-
-int
-kill_unmarshal(struct kill *tmp,  struct evbuffer *evbuf)
-{
-  ev_uint32_t tag;
-  while (EVBUFFER_LENGTH(evbuf) > 0) {
-    if (evtag_peek(evbuf, &tag) == -1)
-      return (-1);
-    switch (tag) {
-
-      case KILL_WEAPON:
-
-        if (tmp->weapon_set)
-          return (-1);
-        if (evtag_unmarshal_string(evbuf, KILL_WEAPON, &tmp->weapon_data) == -1) {
-          event_warnx("%s: failed to unmarshal weapon", __func__);
-          return (-1);
-        }
-        tmp->weapon_set = 1;
-        break;
-
-      case KILL_ACTION:
-
-        if (tmp->action_set)
-          return (-1);
-        if (evtag_unmarshal_string(evbuf, KILL_ACTION, &tmp->action_data) == -1) {
-          event_warnx("%s: failed to unmarshal action", __func__);
-          return (-1);
-        }
-        tmp->action_set = 1;
-        break;
-
-      case KILL_HOW_OFTEN:
-
-        if (tmp->how_often_set)
-          return (-1);
-        if (evtag_unmarshal_int(evbuf, KILL_HOW_OFTEN, &tmp->how_often_data) == -1) {
-          event_warnx("%s: failed to unmarshal how_often", __func__);
-          return (-1);
-        }
-        tmp->how_often_set = 1;
-        break;
-
-      default:
-        return -1;
-    }
-  }
-
-  if (kill_complete(tmp) == -1)
-    return (-1);
-  return (0);
-}
-
-int
-kill_complete(struct kill *msg)
-{
-  if (!msg->weapon_set)
-    return (-1);
-  if (!msg->action_set)
-    return (-1);
-  return (0);
-}
-
-int
-evtag_unmarshal_kill(struct evbuffer *evbuf, ev_uint32_t need_tag, struct kill *msg)
-{
-  ev_uint32_t tag;
-  int res = -1;
-
-  struct evbuffer *tmp = evbuffer_new();
-
-  if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
-    goto error;
-
-  if (kill_unmarshal(msg, tmp) == -1)
-    goto error;
-
-  res = 0;
-
- error:
-  evbuffer_free(tmp);
-  return (res);
-}
-
-void
-evtag_marshal_kill(struct evbuffer *evbuf, ev_uint32_t tag, const struct kill *msg)
-{
-  struct evbuffer *_buf = evbuffer_new();
-  assert(_buf != NULL);
-  evbuffer_drain(_buf, -1);
-  kill_marshal(_buf, msg);
-  evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
-  evbuffer_free(_buf);
-}
-
-/*
- * Implementation of run
- */
-
-static struct run_access_ __run_base = {
-  run_how_assign,
-  run_how_get,
-  run_some_bytes_assign,
-  run_some_bytes_get,
-  run_fixed_bytes_assign,
-  run_fixed_bytes_get,
-};
-
-struct run *
-run_new(void)
-{
-  struct run *tmp;
-  if ((tmp = malloc(sizeof(struct run))) == NULL) {
-    event_warn("%s: malloc", __func__);
-    return (NULL);
-  }
-  tmp->base = &__run_base;
-
-  tmp->how_data = NULL;
-  tmp->how_set = 0;
-
-  tmp->some_bytes_data = NULL;
-  tmp->some_bytes_length = 0;
-  tmp->some_bytes_set = 0;
-
-  memset(tmp->fixed_bytes_data, 0, sizeof(tmp->fixed_bytes_data));
-  tmp->fixed_bytes_set = 0;
-
-  return (tmp);
-}
-
-
-
-
-int
-run_how_assign(struct run *msg,
-    const char * value)
-{
-  if (msg->how_data != NULL)
-    free(msg->how_data);
-  if ((msg->how_data = strdup(value)) == NULL)
-    return (-1);
-  msg->how_set = 1;
-  return (0);
-}
-
-int
-run_some_bytes_assign(struct run *msg, const ev_uint8_t * value, ev_uint32_t len)
-{
-  if (msg->some_bytes_data != NULL)
-    free (msg->some_bytes_data);
-  msg->some_bytes_data = malloc(len);
-  if (msg->some_bytes_data == NULL)
-    return (-1);
-  msg->some_bytes_set = 1;
-  msg->some_bytes_length = len;
-  memcpy(msg->some_bytes_data, value, len);
-  return (0);
-}
-
-int
-run_fixed_bytes_assign(struct run *msg, const ev_uint8_t *value)
-{
-  msg->fixed_bytes_set = 1;
-  memcpy(msg->fixed_bytes_data, value, 24);
-  return (0);
-}
-
-int
-run_how_get(struct run *msg, char * *value)
-{
-  if (msg->how_set != 1)
-    return (-1);
-  *value = msg->how_data;
-  return (0);
-}
-
-int
-run_some_bytes_get(struct run *msg, ev_uint8_t * *value, ev_uint32_t *plen)
-{
-  if (msg->some_bytes_set != 1)
-    return (-1);
-  *value = msg->some_bytes_data;
-  *plen = msg->some_bytes_length;
-  return (0);
-}
-
-int
-run_fixed_bytes_get(struct run *msg, ev_uint8_t **value)
-{
-  if (msg->fixed_bytes_set != 1)
-    return (-1);
-  *value = msg->fixed_bytes_data;
-  return (0);
-}
-
-void
-run_clear(struct run *tmp)
-{
-  if (tmp->how_set == 1) {
-    free (tmp->how_data);
-    tmp->how_data = NULL;
-    tmp->how_set = 0;
-  }
-  if (tmp->some_bytes_set == 1) {
-    free (tmp->some_bytes_data);
-    tmp->some_bytes_data = NULL;
-    tmp->some_bytes_length = 0;
-    tmp->some_bytes_set = 0;
-  }
-  tmp->fixed_bytes_set = 0;
-  memset(tmp->fixed_bytes_data, 0, sizeof(tmp->fixed_bytes_data));
-}
-
-void
-run_free(struct run *tmp)
-{
-  if (tmp->how_data != NULL)
-      free (tmp->how_data); 
-  if (tmp->some_bytes_data != NULL)
-      free (tmp->some_bytes_data); 
-  free(tmp);
-}
-
-void
-run_marshal(struct evbuffer *evbuf, const struct run *tmp){
-  evtag_marshal_string(evbuf, RUN_HOW, tmp->how_data);
-  if (tmp->some_bytes_set) {
-    evtag_marshal(evbuf, RUN_SOME_BYTES, tmp->some_bytes_data, tmp->some_bytes_length);
-  }
-  evtag_marshal(evbuf, RUN_FIXED_BYTES, tmp->fixed_bytes_data, sizeof(tmp->fixed_bytes_data));
-}
-
-int
-run_unmarshal(struct run *tmp,  struct evbuffer *evbuf)
-{
-  ev_uint32_t tag;
-  while (EVBUFFER_LENGTH(evbuf) > 0) {
-    if (evtag_peek(evbuf, &tag) == -1)
-      return (-1);
-    switch (tag) {
-
-      case RUN_HOW:
-
-        if (tmp->how_set)
-          return (-1);
-        if (evtag_unmarshal_string(evbuf, RUN_HOW, &tmp->how_data) == -1) {
-          event_warnx("%s: failed to unmarshal how", __func__);
-          return (-1);
-        }
-        tmp->how_set = 1;
-        break;
-
-      case RUN_SOME_BYTES:
-
-        if (tmp->some_bytes_set)
-          return (-1);
-        if (evtag_payload_length(evbuf, &tmp->some_bytes_length) == -1)
-          return (-1);
-        if (tmp->some_bytes_length > EVBUFFER_LENGTH(evbuf))
-          return (-1);
-        if ((tmp->some_bytes_data = malloc(tmp->some_bytes_length)) == NULL)
-          return (-1);
-        if (evtag_unmarshal_fixed(evbuf, RUN_SOME_BYTES, tmp->some_bytes_data, tmp->some_bytes_length) == -1) {
-          event_warnx("%s: failed to unmarshal some_bytes", __func__);
-          return (-1);
-        }
-        tmp->some_bytes_set = 1;
-        break;
-
-      case RUN_FIXED_BYTES:
-
-        if (tmp->fixed_bytes_set)
-          return (-1);
-        if (evtag_unmarshal_fixed(evbuf, RUN_FIXED_BYTES, tmp->fixed_bytes_data, sizeof(tmp->fixed_bytes_data)) == -1) {
-          event_warnx("%s: failed to unmarshal fixed_bytes", __func__);
-          return (-1);
-        }
-        tmp->fixed_bytes_set = 1;
-        break;
-
-      default:
-        return -1;
-    }
-  }
-
-  if (run_complete(tmp) == -1)
-    return (-1);
-  return (0);
-}
-
-int
-run_complete(struct run *msg)
-{
-  if (!msg->how_set)
-    return (-1);
-  if (!msg->fixed_bytes_set)
-    return (-1);
-  return (0);
-}
-
-int
-evtag_unmarshal_run(struct evbuffer *evbuf, ev_uint32_t need_tag, struct run *msg)
-{
-  ev_uint32_t tag;
-  int res = -1;
-
-  struct evbuffer *tmp = evbuffer_new();
-
-  if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
-    goto error;
-
-  if (run_unmarshal(msg, tmp) == -1)
-    goto error;
-
-  res = 0;
-
- error:
-  evbuffer_free(tmp);
-  return (res);
-}
-
-void
-evtag_marshal_run(struct evbuffer *evbuf, ev_uint32_t tag, const struct run *msg)
-{
-  struct evbuffer *_buf = evbuffer_new();
-  assert(_buf != NULL);
-  evbuffer_drain(_buf, -1);
-  run_marshal(_buf, msg);
-  evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
-  evbuffer_free(_buf);
-}
-
diff --git a/third_party/libevent/test/regress.gen.h b/third_party/libevent/test/regress.gen.h
deleted file mode 100644
index b1feacd..0000000
--- a/third_party/libevent/test/regress.gen.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Automatically generated from ./regress.rpc
- */
-
-#ifndef ___REGRESS_RPC_
-#define ___REGRESS_RPC_
-
-#include <event-config.h>
-#ifdef _EVENT_HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#define EVTAG_HAS(msg, member) ((msg)->member##_set == 1)
-#ifdef __GNUC__
-#define EVTAG_ASSIGN(msg, member, args...) (*(msg)->base->member##_assign)(msg, ## args)
-#define EVTAG_GET(msg, member, args...) (*(msg)->base->member##_get)(msg, ## args)
-#else
-#define EVTAG_ASSIGN(msg, member, ...) (*(msg)->base->member##_assign)(msg, ## __VA_ARGS__)
-#define EVTAG_GET(msg, member, ...) (*(msg)->base->member##_get)(msg, ## __VA_ARGS__)
-#endif
-#define EVTAG_ADD(msg, member) (*(msg)->base->member##_add)(msg)
-#define EVTAG_LEN(msg, member) ((msg)->member##_length)
-
-struct msg;
-struct kill;
-struct run;
-
-/* Tag definition for msg */
-enum msg_ {
-  MSG_FROM_NAME=1,
-  MSG_TO_NAME=2,
-  MSG_ATTACK=3,
-  MSG_RUN=4,
-  MSG_MAX_TAGS
-};
-
-/* Structure declaration for msg */
-struct msg_access_ {
-  int (*from_name_assign)(struct msg *, const char *);
-  int (*from_name_get)(struct msg *, char * *);
-  int (*to_name_assign)(struct msg *, const char *);
-  int (*to_name_get)(struct msg *, char * *);
-  int (*attack_assign)(struct msg *, const struct kill*);
-  int (*attack_get)(struct msg *, struct kill* *);
-  int (*run_assign)(struct msg *, int, const struct run *);
-  int (*run_get)(struct msg *, int, struct run * *);
-  struct run * (*run_add)(struct msg *);
-};
-
-struct msg {
-  struct msg_access_ *base;
-
-  char *from_name_data;
-  char *to_name_data;
-  struct kill* attack_data;
-  struct run **run_data;
-  int run_length;
-  int run_num_allocated;
-
-  ev_uint8_t from_name_set;
-  ev_uint8_t to_name_set;
-  ev_uint8_t attack_set;
-  ev_uint8_t run_set;
-};
-
-struct msg *msg_new(void);
-void msg_free(struct msg *);
-void msg_clear(struct msg *);
-void msg_marshal(struct evbuffer *, const struct msg *);
-int msg_unmarshal(struct msg *, struct evbuffer *);
-int msg_complete(struct msg *);
-void evtag_marshal_msg(struct evbuffer *, ev_uint32_t, 
-    const struct msg *);
-int evtag_unmarshal_msg(struct evbuffer *, ev_uint32_t,
-    struct msg *);
-int msg_from_name_assign(struct msg *, const char *);
-int msg_from_name_get(struct msg *, char * *);
-int msg_to_name_assign(struct msg *, const char *);
-int msg_to_name_get(struct msg *, char * *);
-int msg_attack_assign(struct msg *, const struct kill*);
-int msg_attack_get(struct msg *, struct kill* *);
-int msg_run_assign(struct msg *, int, const struct run *);
-int msg_run_get(struct msg *, int, struct run * *);
-struct run * msg_run_add(struct msg *);
-/* --- msg done --- */
-
-/* Tag definition for kill */
-enum kill_ {
-  KILL_WEAPON=65825,
-  KILL_ACTION=2,
-  KILL_HOW_OFTEN=3,
-  KILL_MAX_TAGS
-};
-
-/* Structure declaration for kill */
-struct kill_access_ {
-  int (*weapon_assign)(struct kill *, const char *);
-  int (*weapon_get)(struct kill *, char * *);
-  int (*action_assign)(struct kill *, const char *);
-  int (*action_get)(struct kill *, char * *);
-  int (*how_often_assign)(struct kill *, const ev_uint32_t);
-  int (*how_often_get)(struct kill *, ev_uint32_t *);
-};
-
-struct kill {
-  struct kill_access_ *base;
-
-  char *weapon_data;
-  char *action_data;
-  ev_uint32_t how_often_data;
-
-  ev_uint8_t weapon_set;
-  ev_uint8_t action_set;
-  ev_uint8_t how_often_set;
-};
-
-struct kill *kill_new(void);
-void kill_free(struct kill *);
-void kill_clear(struct kill *);
-void kill_marshal(struct evbuffer *, const struct kill *);
-int kill_unmarshal(struct kill *, struct evbuffer *);
-int kill_complete(struct kill *);
-void evtag_marshal_kill(struct evbuffer *, ev_uint32_t, 
-    const struct kill *);
-int evtag_unmarshal_kill(struct evbuffer *, ev_uint32_t,
-    struct kill *);
-int kill_weapon_assign(struct kill *, const char *);
-int kill_weapon_get(struct kill *, char * *);
-int kill_action_assign(struct kill *, const char *);
-int kill_action_get(struct kill *, char * *);
-int kill_how_often_assign(struct kill *, const ev_uint32_t);
-int kill_how_often_get(struct kill *, ev_uint32_t *);
-/* --- kill done --- */
-
-/* Tag definition for run */
-enum run_ {
-  RUN_HOW=1,
-  RUN_SOME_BYTES=2,
-  RUN_FIXED_BYTES=3,
-  RUN_MAX_TAGS
-};
-
-/* Structure declaration for run */
-struct run_access_ {
-  int (*how_assign)(struct run *, const char *);
-  int (*how_get)(struct run *, char * *);
-  int (*some_bytes_assign)(struct run *, const ev_uint8_t *, ev_uint32_t);
-  int (*some_bytes_get)(struct run *, ev_uint8_t * *, ev_uint32_t *);
-  int (*fixed_bytes_assign)(struct run *, const ev_uint8_t *);
-  int (*fixed_bytes_get)(struct run *, ev_uint8_t **);
-};
-
-struct run {
-  struct run_access_ *base;
-
-  char *how_data;
-  ev_uint8_t *some_bytes_data;
-  ev_uint32_t some_bytes_length;
-  ev_uint8_t fixed_bytes_data[24];
-
-  ev_uint8_t how_set;
-  ev_uint8_t some_bytes_set;
-  ev_uint8_t fixed_bytes_set;
-};
-
-struct run *run_new(void);
-void run_free(struct run *);
-void run_clear(struct run *);
-void run_marshal(struct evbuffer *, const struct run *);
-int run_unmarshal(struct run *, struct evbuffer *);
-int run_complete(struct run *);
-void evtag_marshal_run(struct evbuffer *, ev_uint32_t, 
-    const struct run *);
-int evtag_unmarshal_run(struct evbuffer *, ev_uint32_t,
-    struct run *);
-int run_how_assign(struct run *, const char *);
-int run_how_get(struct run *, char * *);
-int run_some_bytes_assign(struct run *, const ev_uint8_t *, ev_uint32_t);
-int run_some_bytes_get(struct run *, ev_uint8_t * *, ev_uint32_t *);
-int run_fixed_bytes_assign(struct run *, const ev_uint8_t *);
-int run_fixed_bytes_get(struct run *, ev_uint8_t **);
-/* --- run done --- */
-
-#endif  /* ___REGRESS_RPC_ */
diff --git a/third_party/libevent/test/test.sh b/third_party/libevent/test/test.sh
old mode 100644
new mode 100755
diff --git a/third_party/libjpeg-turbo/BUILD.gn b/third_party/libjpeg-turbo/BUILD.gn
index 0630c11..4373115 100644
--- a/third_party/libjpeg-turbo/BUILD.gn
+++ b/third_party/libjpeg-turbo/BUILD.gn
@@ -145,9 +145,9 @@
 }
 
 # TODO(b/206642994): look into whether we should condition on the
-# floating_point_fpu SABI variable, rather than sb_is_evergreen, here as we did
+# floating_point_fpu SABI variable, rather than sb_is_modular, here as we did
 # in third_party/libjpeg-turbo/libjpeg.gyp.
-if (is_starboard && sb_is_evergreen && current_cpu == "arm" && arm_use_neon) {
+if (is_starboard && sb_is_modular && current_cpu == "arm" && arm_use_neon) {
   config("simd_arm_config") {
     cflags = [ "-mfpu=neon" ]
   }
@@ -205,7 +205,7 @@
     }
     configs += [ "//build/config/compiler:optimize_speed" ]
 
-    if (is_starboard && sb_is_evergreen && current_cpu == "arm") {
+    if (is_starboard && sb_is_modular && current_cpu == "arm") {
       configs += [ ":simd_arm_config" ]
     }
   } else {
@@ -316,7 +316,7 @@
   # TODO(b/236258535): Enable neon instructions once the code is updated
   # to use SbCPUFeatures() at runtime.
   if ((is_msan && (current_cpu == "x86" || current_cpu == "x64")) ||
-      (is_starboard && sb_is_evergreen)) {
+      (is_starboard && sb_is_modular)) {
     sources += [ "jsimd_none.c" ]
   } else {
     public_deps += [ ":simd" ]
diff --git a/third_party/libjpeg-turbo/codereview.settings b/third_party/libjpeg-turbo/codereview.settings
deleted file mode 100644
index 53afc0f..0000000
--- a/third_party/libjpeg-turbo/codereview.settings
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file is used by git-cl to get repository specific information.
-CC_LIST: chromium-reviews@chromium.org
-CODE_REVIEW_SERVER: codereview.chromium.org
-GERRIT_HOST: True
-PROJECT: libjpeg_turbo
-STATUS: http://chromium-status.appspot.com/status
-VIEW_VC: https://chromium.googlesource.com/chromium/deps/libjpeg_turbo/+/
diff --git a/third_party/libvpx/codereview.settings b/third_party/libvpx/codereview.settings
deleted file mode 100644
index ccba2ee..0000000
--- a/third_party/libvpx/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by git cl to get repository specific information.
-GERRIT_HOST: True
-CODE_REVIEW_SERVER: chromium-review.googlesource.com
-GERRIT_SQUASH_UPLOADS: False
diff --git a/third_party/libwebp/.cmake-format.py b/third_party/libwebp/.cmake-format.py
new file mode 100644
index 0000000..71043af
--- /dev/null
+++ b/third_party/libwebp/.cmake-format.py
@@ -0,0 +1,240 @@
+# ----------------------------------
+# Options affecting listfile parsing
+# ----------------------------------
+with section("parse"):
+
+  # Specify structure for custom cmake functions
+  additional_commands = { 'foo': { 'flags': ['BAR', 'BAZ'],
+             'kwargs': {'DEPENDS': '*', 'HEADERS': '*', 'SOURCES': '*'}}}
+
+  # Override configurations per-command where available
+  override_spec = {}
+
+  # Specify variable tags.
+  vartags = []
+
+  # Specify property tags.
+  proptags = []
+
+# -----------------------------
+# Options affecting formatting.
+# -----------------------------
+with section("format"):
+
+  # Disable formatting entirely, making cmake-format a no-op
+  disable = False
+
+  # How wide to allow formatted cmake files
+  line_width = 80
+
+  # How many spaces to tab for indent
+  tab_size = 2
+
+  # If true, lines are indented using tab characters (utf-8 0x09) instead of
+  # <tab_size> space characters (utf-8 0x20). In cases where the layout would
+  # require a fractional tab character, the behavior of the  fractional
+  # indentation is governed by <fractional_tab_policy>
+  use_tabchars = False
+
+  # If <use_tabchars> is True, then the value of this variable indicates how
+  # fractional indentions are handled during whitespace replacement. If set to
+  # 'use-space', fractional indentation is left as spaces (utf-8 0x20). If set
+  # to `round-up` fractional indentation is replaced with a single tab character
+  # (utf-8 0x09) effectively shifting the column to the next tabstop
+  fractional_tab_policy = 'use-space'
+
+  # If an argument group contains more than this many sub-groups (parg or kwarg
+  # groups) then force it to a vertical layout.
+  max_subgroups_hwrap = 3
+
+  # If a positional argument group contains more than this many arguments, then
+  # force it to a vertical layout.
+  max_pargs_hwrap = 6
+
+  # If a cmdline positional group consumes more than this many lines without
+  # nesting, then invalidate the layout (and nest)
+  max_rows_cmdline = 2
+
+  # If true, separate flow control names from their parentheses with a space
+  separate_ctrl_name_with_space = False
+
+  # If true, separate function names from parentheses with a space
+  separate_fn_name_with_space = False
+
+  # If a statement is wrapped to more than one line, than dangle the closing
+  # parenthesis on its own line.
+  dangle_parens = False
+
+  # If the trailing parenthesis must be 'dangled' on its on line, then align it
+  # to this reference: `prefix`: the start of the statement,  `prefix-indent`:
+  # the start of the statement, plus one indentation  level, `child`: align to
+  # the column of the arguments
+  dangle_align = 'prefix'
+
+  # If the statement spelling length (including space and parenthesis) is
+  # smaller than this amount, then force reject nested layouts.
+  min_prefix_chars = 4
+
+  # If the statement spelling length (including space and parenthesis) is larger
+  # than the tab width by more than this amount, then force reject un-nested
+  # layouts.
+  max_prefix_chars = 10
+
+  # If a candidate layout is wrapped horizontally but it exceeds this many
+  # lines, then reject the layout.
+  max_lines_hwrap = 2
+
+  # What style line endings to use in the output.
+  line_ending = 'unix'
+
+  # Format command names consistently as 'lower' or 'upper' case
+  command_case = 'canonical'
+
+  # Format keywords consistently as 'lower' or 'upper' case
+  keyword_case = 'unchanged'
+
+  # A list of command names which should always be wrapped
+  always_wrap = []
+
+  # If true, the argument lists which are known to be sortable will be sorted
+  # lexicographicall
+  enable_sort = True
+
+  # If true, the parsers may infer whether or not an argument list is sortable
+  # (without annotation).
+  autosort = False
+
+  # By default, if cmake-format cannot successfully fit everything into the
+  # desired linewidth it will apply the last, most agressive attempt that it
+  # made. If this flag is True, however, cmake-format will print error, exit
+  # with non-zero status code, and write-out nothing
+  require_valid_layout = False
+
+  # A dictionary mapping layout nodes to a list of wrap decisions. See the
+  # documentation for more information.
+  layout_passes = {}
+
+# ------------------------------------------------
+# Options affecting comment reflow and formatting.
+# ------------------------------------------------
+with section("markup"):
+
+  # What character to use for bulleted lists
+  bullet_char = '*'
+
+  # What character to use as punctuation after numerals in an enumerated list
+  enum_char = '.'
+
+  # If comment markup is enabled, don't reflow the first comment block in each
+  # listfile. Use this to preserve formatting of your copyright/license
+  # statements.
+  first_comment_is_literal = True
+
+  # If comment markup is enabled, don't reflow any comment block which matches
+  # this (regex) pattern. Default is `None` (disabled).
+  literal_comment_pattern = None
+
+  # Regular expression to match preformat fences in comments default=
+  # ``r'^\s*([`~]{3}[`~]*)(.*)$'``
+  fence_pattern = '^\\s*([`~]{3}[`~]*)(.*)$'
+
+  # Regular expression to match rulers in comments default=
+  # ``r'^\s*[^\w\s]{3}.*[^\w\s]{3}$'``
+  ruler_pattern = '^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$'
+
+  # If a comment line matches starts with this pattern then it is explicitly a
+  # trailing comment for the preceeding argument. Default is '#<'
+  explicit_trailing_pattern = '#<'
+
+  # If a comment line starts with at least this many consecutive hash
+  # characters, then don't lstrip() them off. This allows for lazy hash rulers
+  # where the first hash char is not separated by space
+  hashruler_min_length = 10
+
+  # If true, then insert a space between the first hash char and remaining hash
+  # chars in a hash ruler, and normalize its length to fill the column
+  canonicalize_hashrulers = True
+
+  # enable comment markup parsing and reflow
+  enable_markup = True
+
+# ----------------------------
+# Options affecting the linter
+# ----------------------------
+with section("lint"):
+
+  # a list of lint codes to disable
+  disabled_codes = []
+
+  # regular expression pattern describing valid function names
+  function_pattern = '[0-9a-z_]+'
+
+  # regular expression pattern describing valid macro names
+  macro_pattern = '[0-9A-Z_]+'
+
+  # regular expression pattern describing valid names for variables with global
+  # (cache) scope
+  global_var_pattern = '[A-Z][0-9A-Z_]+'
+
+  # regular expression pattern describing valid names for variables with global
+  # scope (but internal semantic)
+  internal_var_pattern = '_[A-Z][0-9A-Z_]+'
+
+  # regular expression pattern describing valid names for variables with local
+  # scope
+  local_var_pattern = '[a-z][a-z0-9_]+'
+
+  # regular expression pattern describing valid names for privatedirectory
+  # variables
+  private_var_pattern = '_[0-9a-z_]+'
+
+  # regular expression pattern describing valid names for public directory
+  # variables
+  public_var_pattern = '[A-Z][0-9A-Z_]+'
+
+  # regular expression pattern describing valid names for function/macro
+  # arguments and loop variables.
+  argument_var_pattern = '[a-z][a-z0-9_]+'
+
+  # regular expression pattern describing valid names for keywords used in
+  # functions or macros
+  keyword_pattern = '[A-Z][0-9A-Z_]+'
+
+  # In the heuristic for C0201, how many conditionals to match within a loop in
+  # before considering the loop a parser.
+  max_conditionals_custom_parser = 2
+
+  # Require at least this many newlines between statements
+  min_statement_spacing = 1
+
+  # Require no more than this many newlines between statements
+  max_statement_spacing = 2
+  max_returns = 6
+  max_branches = 12
+  max_arguments = 5
+  max_localvars = 15
+  max_statements = 50
+
+# -------------------------------
+# Options affecting file encoding
+# -------------------------------
+with section("encode"):
+
+  # If true, emit the unicode byte-order mark (BOM) at the start of the file
+  emit_byteorder_mark = False
+
+  # Specify the encoding of the input file. Defaults to utf-8
+  input_encoding = 'utf-8'
+
+  # Specify the encoding of the output file. Defaults to utf-8. Note that cmake
+  # only claims to support utf-8 so be careful when using anything else
+  output_encoding = 'utf-8'
+
+# -------------------------------------
+# Miscellaneous configurations options.
+# -------------------------------------
+with section("misc"):
+
+  # A dictionary containing any per-command configuration overrides. Currently
+  # only `command_case` is supported.
+  per_command = {}
diff --git a/third_party/libwebp/.gitattributes b/third_party/libwebp/.gitattributes
deleted file mode 100644
index 8873ffd..0000000
--- a/third_party/libwebp/.gitattributes
+++ /dev/null
@@ -1,5 +0,0 @@
-.gitattributes export-ignore
-.gitignore export-ignore
-.mailmap export-ignore
-*.pdf -text -diff
-*.ppm -text -diff
diff --git a/third_party/libwebp/.gitignore b/third_party/libwebp/.gitignore
deleted file mode 100644
index fe2fc0c..0000000
--- a/third_party/libwebp/.gitignore
+++ /dev/null
@@ -1,41 +0,0 @@
-*.l[ao]
-*.[ao]
-*.pc
-.deps
-.libs
-/aclocal.m4
-/ar-lib
-/autom4te.cache
-/compile
-/config.*
-/configure
-/depcomp
-/dist
-/install-sh
-/libtool
-/ltmain.sh
-/missing
-/mkinstalldirs
-/stamp-h1
-Makefile
-Makefile.in
-examples/anim_diff
-examples/[cdv]webp
-examples/gif2webp
-examples/img2webp
-examples/webpmux
-src/webp/config.h*
-src/webp/stamp-h1
-/output
-/doc/output
-*.idb
-*.pdb
-/iosbuild
-/WebP.framework
-CMakeCache.txt
-CMakeFiles/
-cmake_install.cmake
-.gradle
-/build
-extras/get_disto
-extras/webp_quality
diff --git a/third_party/libwebp/.mailmap b/third_party/libwebp/.mailmap
deleted file mode 100644
index b4242a8..0000000
--- a/third_party/libwebp/.mailmap
+++ /dev/null
@@ -1,12 +0,0 @@
-<johann.koenig@duck.com> <johannkoenig@google.com>
-Mikołaj Zalewski <mikolajz@google.com>
-Pascal Massimino <pascal.massimino@gmail.com>
-<pascal.massimino@gmail.com> <skal@google.com>
-Vikas Arora <vikasa@google.com>
-<vikasa@google.com> <vikasa@gmail.com>
-<vikasa@google.com> <vikaas.arora@gmail.com>
-<slobodan.prijic@imgtec.com> <Slobodan.Prijic@imgtec.com>
-<vrabaud@google.com> <vincent.rabaud@gmail.com>
-Tamar Levy <tamar.levy@intel.com>
-<qrczak@google.com> <qrczak>
-Hui Su <huisu@google.com>
diff --git a/third_party/libwebp/.pylintrc b/third_party/libwebp/.pylintrc
new file mode 100644
index 0000000..4658b84
--- /dev/null
+++ b/third_party/libwebp/.pylintrc
@@ -0,0 +1,441 @@
+# This Pylint rcfile contains a best-effort configuration to uphold the
+# best-practices and style described in the Google Python style guide:
+#   https://google.github.io/styleguide/pyguide.html
+#
+# Its canonical open-source location is:
+#   https://google.github.io/styleguide/pylintrc
+
+[MASTER]
+
+# Files or directories to be skipped. They should be base names, not paths.
+ignore=third_party
+
+# Files or directories matching the regex patterns are skipped. The regex
+# matches against base names, not paths.
+ignore-patterns=
+
+# Pickle collected data for later comparisons.
+persistent=no
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+# Use multiple processes to speed up Pylint.
+jobs=4
+
+# Allow loading of arbitrary C extensions. Extensions are imported into the
+# active Python interpreter and may run arbitrary code.
+unsafe-load-any-extension=no
+
+
+[MESSAGES CONTROL]
+
+# Only show warnings with the listed confidence levels. Leave empty to show
+# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
+confidence=
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time (only on the command line, not in the configuration file where
+# it should appear only once). See also the "--disable" option for examples.
+#enable=
+
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifiers separated by comma (,) or put this
+# option multiple times (only on the command line, not in the configuration
+# file where it should appear only once).You can also use "--disable=all" to
+# disable everything first and then reenable specific checks. For example, if
+# you want to run only the similarities checker, you can use "--disable=all
+# --enable=similarities". If you want to run only the classes checker, but have
+# no Warning level messages displayed, use"--disable=all --enable=classes
+# --disable=W"
+disable=abstract-method,
+        apply-builtin,
+        arguments-differ,
+        attribute-defined-outside-init,
+        backtick,
+        bad-option-value,
+        basestring-builtin,
+        buffer-builtin,
+        c-extension-no-member,
+        consider-using-enumerate,
+        cmp-builtin,
+        cmp-method,
+        coerce-builtin,
+        coerce-method,
+        delslice-method,
+        div-method,
+        duplicate-code,
+        eq-without-hash,
+        execfile-builtin,
+        file-builtin,
+        filter-builtin-not-iterating,
+        fixme,
+        getslice-method,
+        global-statement,
+        hex-method,
+        idiv-method,
+        implicit-str-concat-in-sequence,
+        import-error,
+        import-self,
+        import-star-module-level,
+        inconsistent-return-statements,
+        input-builtin,
+        intern-builtin,
+        invalid-str-codec,
+        locally-disabled,
+        long-builtin,
+        long-suffix,
+        map-builtin-not-iterating,
+        misplaced-comparison-constant,
+        missing-function-docstring,
+        metaclass-assignment,
+        next-method-called,
+        next-method-defined,
+        no-absolute-import,
+        no-else-break,
+        no-else-continue,
+        no-else-raise,
+        no-else-return,
+        no-init,  # added
+        no-member,
+        no-name-in-module,
+        no-self-use,
+        nonzero-method,
+        oct-method,
+        old-division,
+        old-ne-operator,
+        old-octal-literal,
+        old-raise-syntax,
+        parameter-unpacking,
+        print-statement,
+        raising-string,
+        range-builtin-not-iterating,
+        raw_input-builtin,
+        rdiv-method,
+        reduce-builtin,
+        relative-import,
+        reload-builtin,
+        round-builtin,
+        setslice-method,
+        signature-differs,
+        standarderror-builtin,
+        suppressed-message,
+        sys-max-int,
+        too-few-public-methods,
+        too-many-ancestors,
+        too-many-arguments,
+        too-many-boolean-expressions,
+        too-many-branches,
+        too-many-instance-attributes,
+        too-many-locals,
+        too-many-nested-blocks,
+        too-many-public-methods,
+        too-many-return-statements,
+        too-many-statements,
+        trailing-newlines,
+        unichr-builtin,
+        unicode-builtin,
+        unnecessary-pass,
+        unpacking-in-except,
+        useless-else-on-loop,
+        useless-object-inheritance,
+        useless-suppression,
+        using-cmp-argument,
+        wrong-import-order,
+        xrange-builtin,
+        zip-builtin-not-iterating,
+
+
+[REPORTS]
+
+# Set the output format. Available formats are text, parseable, colorized, msvs
+# (visual studio) and html. You can also give a reporter class, eg
+# mypackage.mymodule.MyReporterClass.
+output-format=text
+
+# Put messages in a separate file for each module / package specified on the
+# command line instead of printing them on stdout. Reports (if any) will be
+# written in a file name "pylint_global.[txt|html]". This option is deprecated
+# and it will be removed in Pylint 2.0.
+files-output=no
+
+# Tells whether to display a full report or only the messages
+reports=no
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note). You have access to the variables errors warning, statement which
+# respectively contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (RP0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Template used to display messages. This is a python new-style format string
+# used to format the message information. See doc for all details
+#msg-template=
+
+
+[BASIC]
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=main,_,PRESUBMIT
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=
+
+# Colon-delimited sets of names that determine each other's naming style when
+# the name regexes allow several styles.
+name-group=
+
+# Include a hint for the correct naming format with invalid-name
+include-naming-hint=no
+
+# List of decorators that produce properties, such as abc.abstractproperty. Add
+# to this list to register other decorators that produce valid properties.
+property-classes=abc.abstractproperty,cached_property.cached_property,cached_property.threaded_cached_property,cached_property.cached_property_with_ttl,cached_property.threaded_cached_property_with_ttl
+
+# Regular expression matching correct function names
+function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*)|(?P<snake_case>_?[a-z][a-z0-9_]*))$
+
+# Regular expression matching correct variable names
+variable-rgx=^[a-z][a-z0-9_]*$
+
+# Regular expression matching correct constant names
+const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$
+
+# Regular expression matching correct attribute names
+attr-rgx=^_{0,2}[a-z][a-z0-9_]*$
+
+# Regular expression matching correct argument names
+argument-rgx=^[a-z][a-z0-9_]*$
+
+# Regular expression matching correct class attribute names
+class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$
+
+# Regular expression matching correct inline iteration names
+inlinevar-rgx=^[a-z][a-z0-9_]*$
+
+# Regular expression matching correct class names
+class-rgx=^_?[A-Z][a-zA-Z0-9]*$
+
+# Regular expression matching correct module names
+module-rgx=^(_?[a-z][a-z0-9_]*|__init__)$
+
+# Regular expression matching correct method names
+method-rgx=(?x)^(?:(?P<exempt>_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass|(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next)|(?P<camel_case>_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P<snake_case>_{0,2}[a-z][a-z0-9_]*))$
+
+# Regular expression which should only match function or class names that do
+# not require a docstring.
+no-docstring-rgx=(__.*__|main|test.*|.*test|.*Test)$
+
+# Minimum line length for functions/classes that require docstrings, shorter
+# ones are exempt.
+docstring-min-length=10
+
+
+[TYPECHECK]
+
+# List of decorators that produce context managers, such as
+# contextlib.contextmanager. Add to this list to register other decorators that
+# produce valid context managers.
+contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager
+
+# Tells whether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# List of module names for which member attributes should not be checked
+# (useful for modules/projects where namespaces are manipulated during runtime
+# and thus existing member attributes cannot be deduced by static analysis. It
+# supports qualified module names, as well as Unix pattern matching.
+ignored-modules=
+
+# List of class names for which member attributes should not be checked (useful
+# for classes with dynamically set attributes). This supports the use of
+# qualified names.
+ignored-classes=optparse.Values,thread._local,_thread._local
+
+# List of members which are set dynamically and missed by pylint inference
+# system, and so shouldn't trigger E1101 when accessed. Python regular
+# expressions are accepted.
+generated-members=
+
+
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=80
+
+# TODO(https://github.com/PyCQA/pylint/issues/3352): Direct pylint to exempt
+# lines made too long by directives to pytype.
+
+# Regexp for a line that is allowed to be longer than the limit.
+ignore-long-lines=(?x)(
+  ^\s*(\#\ )?<?https?://\S+>?$|
+  ^\s*(from\s+\S+\s+)?import\s+.+$)
+
+# Allow the body of an if to be on the same line as the test if there is no
+# else.
+single-line-if-stmt=yes
+
+# List of optional constructs for which whitespace checking is disabled. `dict-
+# separator` is used to allow tabulation in dicts, etc.: {1  : 1,\n222: 2}.
+# `trailing-comma` allows a space between comma and closing bracket: (a, ).
+# `empty-line` allows space-only lines.
+no-space-check=
+
+# Maximum number of lines in a module
+max-module-lines=99999
+
+# String used as indentation unit.  The internal Google style guide mandates 2
+# spaces.  Google's externaly-published style guide says 4, consistent with
+# PEP 8.  Here, we use 2 spaces, for conformity with many open-sourced Google
+# projects (like TensorFlow).
+indent-string='  '
+
+# Number of spaces of indent required inside a hanging  or continued line.
+indent-after-paren=4
+
+# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
+expected-line-ending-format=
+
+
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=TODO
+
+
+[STRING]
+
+# This flag controls whether inconsistent-quotes generates a warning when the
+# character used as a quote delimiter is used inconsistently within a module.
+check-quote-consistency=yes
+
+
+[VARIABLES]
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching the name of dummy variables (i.e. expectedly
+# not used).
+dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_)
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+# List of strings which can identify a callback function by name. A callback
+# name must start or end with one of those strings.
+callbacks=cb_,_cb
+
+# List of qualified module names which can have objects that can redefine
+# builtins.
+redefining-builtins-modules=six,six.moves,past.builtins,future.builtins,functools
+
+
+[LOGGING]
+
+# Logging modules to check that the string format arguments are in logging
+# function parameter format
+logging-modules=logging,absl.logging,tensorflow.io.logging
+
+
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
+
+# Ignore imports when computing similarities.
+ignore-imports=no
+
+
+[SPELLING]
+
+# Spelling dictionary name. Available dictionaries: none. To make it working
+# install python-enchant package.
+spelling-dict=
+
+# List of comma separated words that should not be checked.
+spelling-ignore-words=
+
+# A path to a file that contains private dictionary; one word per line.
+spelling-private-dict-file=
+
+# Tells whether to store unknown words to indicated private dictionary in
+# --spelling-private-dict-file option instead of raising a message.
+spelling-store-unknown-words=no
+
+
+[IMPORTS]
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=regsub,
+                   TERMIOS,
+                   Bastion,
+                   rexec,
+                   sets
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report RP0402 must not be disabled)
+import-graph=
+
+# Create a graph of external dependencies in the given file (report RP0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of internal dependencies in the given file (report RP0402 must
+# not be disabled)
+int-import-graph=
+
+# Force import order to recognize a module as part of the standard
+# compatibility libraries.
+known-standard-library=
+
+# Force import order to recognize a module as part of a third party library.
+known-third-party=enchant, absl
+
+# Analyse import fallback blocks. This can be used to support both Python 2 and
+# 3 compatible code, which means that the block might have code that exists
+# only in one or another interpreter, leading to false positives when analysed.
+analyse-fallback-blocks=no
+
+
+[CLASSES]
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,
+                      __new__,
+                      setUp
+
+# List of member names, which should be excluded from the protected access
+# warning.
+exclude-protected=_asdict,
+                  _fields,
+                  _replace,
+                  _source,
+                  _make
+
+# List of valid names for the first argument in a class method.
+valid-classmethod-first-arg=cls,
+                            class_
+
+# List of valid names for the first argument in a metaclass class method.
+valid-metaclass-classmethod-first-arg=mcs
+
+
+[EXCEPTIONS]
+
+# Exceptions that will emit a warning when being caught. Defaults to
+# "Exception"
+overgeneral-exceptions=StandardError,
+                       Exception,
+                       BaseException
diff --git a/third_party/libwebp/.style.yapf b/third_party/libwebp/.style.yapf
new file mode 100644
index 0000000..0be981a
--- /dev/null
+++ b/third_party/libwebp/.style.yapf
@@ -0,0 +1,2 @@
+[style]
+based_on_style = yapf
\ No newline at end of file
diff --git a/third_party/libwebp/AUTHORS b/third_party/libwebp/AUTHORS
index 83c7b9c..8359b20 100644
--- a/third_party/libwebp/AUTHORS
+++ b/third_party/libwebp/AUTHORS
@@ -1,28 +1,45 @@
 Contributors:
+- Aidan O'Loan (aidanol at gmail dot com)
+- Alan Browning (browning at google dot com)
+- Alexandru Ardelean (ardeleanalex at gmail dot com)
+- Brian Ledger (brianpl at google dot com)
 - Charles Munger (clm at google dot com)
+- Cheng Yi (cyi at google dot com)
 - Christian Duvivier (cduvivier at google dot com)
+- Christopher Degawa (ccom at randomderp dot com)
+- Clement Courbet (courbet at google dot com)
 - Djordje Pesut (djordje dot pesut at imgtec dot com)
+- Frank Barchard (fbarchard at google dot com)
 - Hui Su (huisu at google dot com)
+- H. Vetinari (h dot vetinari at gmx dot com)
+- Ilya Kurdyukov (jpegqs at gmail dot com)
+- Ingvar Stepanyan (rreverser at google dot com)
 - James Zern (jzern at google dot com)
 - Jan Engelhardt (jengelh at medozas dot de)
 - Jehan (jehan at girinstud dot io)
-- Johann (johann dot koenig at duck dot com)
+- Jeremy Maitin-Shepard (jbms at google dot com)
+- Johann Koenig (johann dot koenig at duck dot com)
 - Jovan Zelincevic (jovan dot zelincevic at imgtec dot com)
 - Jyrki Alakuijala (jyrki at google dot com)
+- Konstantin Ivlev (tomskside at gmail dot com)
 - Lode Vandevenne (lode at google dot com)
 - Lou Quillio (louquillio at google dot com)
 - Mans Rullgard (mans at mansr dot com)
 - Marcin Kowalczyk (qrczak at google dot com)
 - Martin Olsson (mnemo at minimum dot se)
+- Maryla Ustarroz-Calonge (maryla at google dot com)
 - Mikołaj Zalewski (mikolajz at google dot com)
 - Mislav Bradac (mislavm at google dot com)
 - Nico Weber (thakis at chromium dot org)
 - Noel Chromium (noel at chromium dot org)
+- Nozomi Isozaki (nontan at pixiv dot co dot jp)
+- Oliver Wolff (oliver dot wolff at qt dot io)
 - Owen Rodley (orodley at google dot com)
 - Parag Salasakar (img dot mips1 at gmail dot com)
 - Pascal Massimino (pascal dot massimino at gmail dot com)
 - Paweł Hajdan, Jr (phajdan dot jr at chromium dot org)
 - Pierre Joye (pierre dot php at gmail dot com)
+- Roberto Alanis (alanisbaez at google dot com)
 - Sam Clegg (sbc at chromium dot org)
 - Scott Hancher (seh at google dot com)
 - Scott LaVarnway (slavarnway at google dot com)
@@ -31,9 +48,13 @@
 - Somnath Banerjee (somnath dot banerjee at gmail dot com)
 - Sriraman Tallam (tmsriram at google dot com)
 - Tamar Levy (tamar dot levy at intel dot com)
+- Thiago Perrotta (tperrotta at google dot com)
 - Timothy Gu (timothygu99 at gmail dot com)
 - Urvang Joshi (urvang at google dot com)
 - Vikas Arora (vikasa at google dot com)
 - Vincent Rabaud (vrabaud at google dot com)
 - Vlad Tsyrklevich (vtsyrklevich at chromium dot org)
+- Wan-Teh Chang (wtc at google dot com)
 - Yang Zhang (yang dot zhang at arm dot com)
+- Yannis Guyon (yguyon at google dot com)
+- Zhi An Ng (zhin at chromium dot org)
diff --git a/third_party/libwebp/Android.mk b/third_party/libwebp/Android.mk
index 6752f77..9d16f08 100644
--- a/third_party/libwebp/Android.mk
+++ b/third_party/libwebp/Android.mk
@@ -1,3 +1,5 @@
+# Ignore this file during non-NDK builds.
+ifdef NDK_ROOT
 LOCAL_PATH := $(call my-dir)
 
 WEBP_CFLAGS := -Wall -DANDROID -DHAVE_MALLOC_H -DHAVE_PTHREAD -DWEBP_USE_THREAD
@@ -33,6 +35,15 @@
   NEON := c
 endif
 
+sharpyuv_srcs := \
+    sharpyuv/sharpyuv.c \
+    sharpyuv/sharpyuv_cpu.c \
+    sharpyuv/sharpyuv_csp.c \
+    sharpyuv/sharpyuv_dsp.c \
+    sharpyuv/sharpyuv_gamma.c \
+    sharpyuv/sharpyuv_neon.$(NEON) \
+    sharpyuv/sharpyuv_sse2.c \
+
 dec_srcs := \
     src/dec/alpha_dec.c \
     src/dec/buffer_dec.c \
@@ -74,6 +85,7 @@
     src/dsp/lossless_msa.c \
     src/dsp/lossless_neon.$(NEON) \
     src/dsp/lossless_sse2.c \
+    src/dsp/lossless_sse41.c \
     src/dsp/rescaler.c \
     src/dsp/rescaler_mips32.c \
     src/dsp/rescaler_mips_dsp_r2.c \
@@ -97,9 +109,9 @@
     src/dsp/cost.c \
     src/dsp/cost_mips32.c \
     src/dsp/cost_mips_dsp_r2.c \
+    src/dsp/cost_neon.$(NEON) \
     src/dsp/cost_sse2.c \
     src/dsp/enc.c \
-    src/dsp/enc_avx2.c \
     src/dsp/enc_mips32.c \
     src/dsp/enc_mips_dsp_r2.c \
     src/dsp/enc_msa.c \
@@ -174,7 +186,7 @@
     $(utils_dec_srcs) \
 
 LOCAL_CFLAGS := $(WEBP_CFLAGS)
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
+LOCAL_EXPORT_C_INCLUDES += $(LOCAL_PATH)/src
 
 # prefer arm over thumb mode for performance gains
 LOCAL_ARM_MODE := arm
@@ -203,12 +215,13 @@
 include $(CLEAR_VARS)
 
 LOCAL_SRC_FILES := \
+    $(sharpyuv_srcs) \
     $(dsp_enc_srcs) \
     $(enc_srcs) \
     $(utils_enc_srcs) \
 
 LOCAL_CFLAGS := $(WEBP_CFLAGS)
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
+LOCAL_EXPORT_C_INCLUDES += $(LOCAL_PATH)/src $(LOCAL_PATH)
 
 # prefer arm over thumb mode for performance gains
 LOCAL_ARM_MODE := arm
@@ -231,7 +244,7 @@
 LOCAL_SRC_FILES := $(demux_srcs)
 
 LOCAL_CFLAGS := $(WEBP_CFLAGS)
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
+LOCAL_EXPORT_C_INCLUDES += $(LOCAL_PATH)/src
 
 # prefer arm over thumb mode for performance gains
 LOCAL_ARM_MODE := arm
@@ -254,7 +267,7 @@
 LOCAL_SRC_FILES := $(mux_srcs)
 
 LOCAL_CFLAGS := $(WEBP_CFLAGS)
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
+LOCAL_EXPORT_C_INCLUDES += $(LOCAL_PATH)/src
 
 # prefer arm over thumb mode for performance gains
 LOCAL_ARM_MODE := arm
@@ -278,3 +291,4 @@
 ifeq ($(USE_CPUFEATURES),yes)
   $(call import-module,android/cpufeatures)
 endif
+endif  # NDK_ROOT
diff --git a/third_party/libwebp/BUILD.gn b/third_party/libwebp/BUILD.gn
index 94c0d14..537325c 100644
--- a/third_party/libwebp/BUILD.gn
+++ b/third_party/libwebp/BUILD.gn
@@ -13,6 +13,9 @@
 # limitations under the License.
 
 import("//third_party/libwebp/libwebp.gni")
+if (current_cpu == "arm" || current_cpu == "arm64") {
+  import("//build/config/arm.gni")
+}
 
 template("libwebp_lib") {
   static_library(target_name) {
@@ -22,6 +25,14 @@
       "//starboard/build/config:speed",
       ":libwebp_direct_config",
     ]
+    if (is_win) {
+      cflags_c = [ "/wd4312" ]  # warning C4312: 'type cast': conversion from 'int' to 'int *'
+    } else {
+      cflags_c = [
+        "-Wno-implicit-function-declaration",
+        "-Wno-int-to-pointer-cast",
+      ]
+    }
   }
 }
 
@@ -43,6 +54,9 @@
     ":libwebp_dsp_dec_sse2",
     ":libwebp_dsp_dec_sse41",
   ]
+  if (is_starboard) {
+    deps += [ "//starboard:starboard_headers_only" ]
+  }
 }
 
 libwebp_lib("libwebp_dsp_dec_msa") {
@@ -77,6 +91,11 @@
   sources = libwebp_enc_sources
 }
 
+libwebp_lib("libwebp_sharpyuv") {
+  sources = libwebp_sharpyuv_sources
+  deps = [ ":libwebp_dsp_dec_common" ]
+}
+
 libwebp_lib("libwebp_dsp_enc") {
   sources = libwebp_dsp_enc_sources
 }
@@ -87,6 +106,31 @@
 
 config("libwebp_direct_config") {
   include_dirs = [ "." ]
+  if (is_starboard && (target_os == "android" || target_os == "linux")) {
+    if (current_cpu == "x64" || current_cpu == "x86") {
+      cflags = [
+        "-msse2",
+        "-msse4.1",
+      ]
+      defines = [
+        "WEBP_HAVE_SSE2",
+        "WEBP_HAVE_SSE41",
+      ]
+    }
+
+    # This crashes on x86/Atom, enable on 64-bit only.
+    if (current_cpu == "x64") {
+      cflags += [
+        "-mavx",
+        "-mavx2",
+      ]
+      defines += [ "WEBP_HAVE_AVX2" ]
+    }
+    if ((current_cpu == "arm" || current_cpu == "arm64") && arm_use_neon ) {
+      defines = [ "WEBP_HAVE_NEON" ]
+      cflags = [ "-mfpu=neon" ]
+    }
+  }
 }
 
 group("libwebp") {
@@ -97,6 +141,7 @@
     ":libwebp_dsp_dec_common",
     ":libwebp_dsp_enc",
     ":libwebp_enc",
+    ":libwebp_sharpyuv",
     ":libwebp_utils_dec",
     ":libwebp_utils_enc",
   ]
diff --git a/third_party/libwebp/CMakeLists.txt b/third_party/libwebp/CMakeLists.txt
index ea263b3..ad5e14c 100644
--- a/third_party/libwebp/CMakeLists.txt
+++ b/third_party/libwebp/CMakeLists.txt
@@ -1,79 +1,219 @@
-cmake_minimum_required(VERSION 2.8.7)
+#  Copyright (c) 2020 Google LLC.
+#
+#  Use of this source code is governed by a BSD-style license
+#  that can be found in the LICENSE file in the root of the source
+#  tree. An additional intellectual property rights grant can be found
+#  in the file PATENTS.  All contributing project authors may
+#  be found in the AUTHORS file in the root of the source tree.
 
-project(libwebp C)
-
-# Options for coder / decoder executables.
-option(WEBP_ENABLE_SIMD "Enable any SIMD optimization." ON)
-option(WEBP_BUILD_CWEBP "Build the cwebp command line tool." OFF)
-option(WEBP_BUILD_DWEBP "Build the dwebp command line tool." OFF)
-option(WEBP_BUILD_GIF2WEBP "Build the gif2webp conversion tool." OFF)
-option(WEBP_BUILD_IMG2WEBP "Build the img2webp animation tool." OFF)
-option(WEBP_BUILD_WEBPINFO "Build the webpinfo command line tool." OFF)
-option(WEBP_BUILD_WEBP_JS "Emscripten build of webp.js." OFF)
-option(WEBP_NEAR_LOSSLESS "Enable near-lossless encoding" ON)
-option(WEBP_ENABLE_SWAP_16BIT_CSP "Enable byte swap for 16 bit colorspaces." OFF)
-
-if(WEBP_BUILD_WEBP_JS)
-  set(WEBP_ENABLE_SIMD OFF)
+if(APPLE)
+  cmake_minimum_required(VERSION 3.17)
+else()
+  cmake_minimum_required(VERSION 3.7)
 endif()
 
+if(POLICY CMP0072)
+  cmake_policy(SET CMP0072 NEW)
+endif()
+
+project(WebP C)
+
+# Options for coder / decoder executables.
+if(BUILD_SHARED_LIBS)
+  set(WEBP_LINK_STATIC_DEFAULT OFF)
+else()
+  set(WEBP_LINK_STATIC_DEFAULT ON)
+endif()
+option(WEBP_LINK_STATIC
+       "Link using static libraries. If OFF, use dynamic libraries."
+       ${WEBP_LINK_STATIC_DEFAULT})
+if(NOT EMSCRIPTEN)
+  # Disable SIMD on Emscripten by default, as it's a new unstable Wasm feature.
+  # Users can still explicitly opt-in to make a SIMD-enabled build.
+  set(WEBP_ENABLE_SIMD_DEFAULT ON)
+endif()
+option(WEBP_ENABLE_SIMD "Enable any SIMD optimization."
+       ${WEBP_ENABLE_SIMD_DEFAULT})
+option(WEBP_BUILD_ANIM_UTILS "Build animation utilities." ON)
+option(WEBP_BUILD_CWEBP "Build the cwebp command line tool." ON)
+option(WEBP_BUILD_DWEBP "Build the dwebp command line tool." ON)
+option(WEBP_BUILD_GIF2WEBP "Build the gif2webp conversion tool." ON)
+option(WEBP_BUILD_IMG2WEBP "Build the img2webp animation tool." ON)
+option(WEBP_BUILD_VWEBP "Build the vwebp viewer tool." ON)
+option(WEBP_BUILD_WEBPINFO "Build the webpinfo command line tool." ON)
+option(WEBP_BUILD_LIBWEBPMUX "Build the libwebpmux library." ON)
+option(WEBP_BUILD_WEBPMUX "Build the webpmux command line tool." ON)
+option(WEBP_BUILD_EXTRAS "Build extras." ON)
+option(WEBP_BUILD_WEBP_JS "Emscripten build of webp.js." OFF)
+option(WEBP_USE_THREAD "Enable threading support" ON)
+option(WEBP_NEAR_LOSSLESS "Enable near-lossless encoding" ON)
+option(WEBP_ENABLE_SWAP_16BIT_CSP "Enable byte swap for 16 bit colorspaces."
+       OFF)
+set(WEBP_BITTRACE "0" CACHE STRING "Bit trace mode (0=none, 1=bit, 2=bytes)")
+set_property(CACHE WEBP_BITTRACE PROPERTY STRINGS 0 1 2)
+
+if(WEBP_LINK_STATIC)
+  if(WIN32)
+    set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
+  else()
+    set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
+  endif()
+  set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+  # vwebp does not compile on Ubuntu with static libraries so disabling it for
+  # now.
+  set(WEBP_BUILD_VWEBP OFF)
+endif()
+
+# Option needed for handling Unicode file names on Windows.
+if(WIN32)
+  option(WEBP_UNICODE "Build Unicode executables." ON)
+endif()
+
+if(WEBP_BUILD_WEBP_JS)
+  set(WEBP_BUILD_ANIM_UTILS OFF)
+  set(WEBP_BUILD_CWEBP OFF)
+  set(WEBP_BUILD_DWEBP OFF)
+  set(WEBP_BUILD_GIF2WEBP OFF)
+  set(WEBP_BUILD_IMG2WEBP OFF)
+  set(WEBP_BUILD_VWEBP OFF)
+  set(WEBP_BUILD_WEBPINFO OFF)
+  set(WEBP_BUILD_WEBPMUX OFF)
+  set(WEBP_BUILD_EXTRAS OFF)
+  set(WEBP_USE_THREAD OFF)
+
+  if(WEBP_ENABLE_SIMD)
+    message(NOTICE
+            "wasm2js does not support SIMD, disabling webp.js generation.")
+  endif()
+endif()
+
+set(SHARPYUV_DEP_LIBRARIES)
+set(SHARPYUV_DEP_INCLUDE_DIRS)
 set(WEBP_DEP_LIBRARIES)
 set(WEBP_DEP_INCLUDE_DIRS)
 
 if(NOT CMAKE_BUILD_TYPE)
-  set(CMAKE_BUILD_TYPE "Release" CACHE
-    "Build type: Release, Debug or RelWithDebInfo" STRING FORCE
-  )
+  set(CMAKE_BUILD_TYPE "Release"
+      CACHE STRING "Build type: Release, Debug, MinSizeRel or RelWithDebInfo"
+            FORCE)
 endif()
 
 # Include dependencies.
+if(WEBP_BUILD_ANIM_UTILS
+   OR WEBP_BUILD_CWEBP
+   OR WEBP_BUILD_DWEBP
+   OR WEBP_BUILD_EXTRAS
+   OR WEBP_BUILD_GIF2WEBP
+   OR WEBP_BUILD_IMG2WEBP)
+  set(WEBP_FIND_IMG_LIBS TRUE)
+else()
+  set(WEBP_FIND_IMG_LIBS FALSE)
+endif()
 include(cmake/deps.cmake)
+include(GNUInstallDirs)
 
-################################################################################
+if(BUILD_SHARED_LIBS AND NOT DEFINED CMAKE_INSTALL_RPATH)
+  # Set the rpath to match autoconf/libtool behavior. Note this must be set
+  # before target creation.
+  set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
+endif()
+
+# ##############################################################################
 # Options.
 if(WEBP_ENABLE_SWAP_16BIT_CSP)
   add_definitions(-DWEBP_SWAP_16BIT_CSP=1)
 endif()
 
-################################################################################
+if(NOT WEBP_BITTRACE STREQUAL "0")
+  add_definitions(-DBITTRACE=${WEBP_BITTRACE})
+endif()
+
+if(WEBP_UNICODE)
+  # Windows recommends setting both UNICODE and _UNICODE.
+  add_definitions(-DUNICODE -D_UNICODE)
+endif()
+
+if(MSVC AND BUILD_SHARED_LIBS)
+  add_definitions(-DWEBP_DLL)
+endif()
+
+# pkg-config variables used by *.pc.in.
+set(prefix ${CMAKE_INSTALL_PREFIX})
+set(exec_prefix "\${prefix}")
+if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}")
+  set(libdir "${CMAKE_INSTALL_LIBDIR}")
+else()
+  set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
+endif()
+if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
+  set(includedir "${CMAKE_INSTALL_INCLUDEDIR}")
+else()
+  set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
+endif()
+set(PTHREAD_LIBS ${CMAKE_THREAD_LIBS_INIT})
+set(INSTALLED_LIBRARIES)
+
+if(MSVC)
+  # match the naming convention used by nmake
+  set(webp_libname_prefix "lib")
+  set(CMAKE_SHARED_LIBRARY_PREFIX "${webp_libname_prefix}")
+  set(CMAKE_IMPORT_LIBRARY_PREFIX "${webp_libname_prefix}")
+  set(CMAKE_STATIC_LIBRARY_PREFIX "${webp_libname_prefix}")
+endif()
+
+set(CMAKE_C_VISIBILITY_PRESET hidden)
+
+# ##############################################################################
 # Android only.
 if(ANDROID)
   include_directories(${ANDROID_NDK}/sources/android/cpufeatures)
-  add_library(cpufeatures STATIC
-    ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c
-  )
-  target_link_libraries(cpufeatures dl)
-  set(WEBP_DEP_LIBRARIES ${WEBP_DEP_LIBRARIES} cpufeatures)
-  set(WEBP_DEP_INCLUDE_DIRS ${WEBP_DEP_INCLUDE_DIRS}
-    ${ANDROID_NDK}/sources/android/cpufeatures
-  )
+  add_library(cpufeatures-webp STATIC
+              ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c)
+  list(APPEND INSTALLED_LIBRARIES cpufeatures-webp)
+  target_link_libraries(cpufeatures-webp dl)
+  set(SHARPYUV_DEP_LIBRARIES ${SHARPYUV_DEP_LIBRARIES} cpufeatures-webp)
+  set(WEBP_DEP_LIBRARIES ${WEBP_DEP_LIBRARIES} cpufeatures-webp)
+  set(cpufeatures_include_dir ${ANDROID_NDK}/sources/android/cpufeatures)
+  set(SHARPYUV_DEP_INCLUDE_DIRS ${SHARPYUV_DEP_INCLUDE_DIRS}
+                                ${cpufeatures_include_dir})
+  set(WEBP_DEP_INCLUDE_DIRS ${WEBP_DEP_INCLUDE_DIRS} ${cpufeatures_include_dir})
   add_definitions(-DHAVE_CPU_FEATURES_H=1)
   set(HAVE_CPU_FEATURES_H 1)
 else()
   set(HAVE_CPU_FEATURES_H 0)
 endif()
 
-################################################################################
-# WebP source files.
-# Read the Makefile.am to get the source files.
+function(configure_pkg_config FILE)
+  configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.in"
+                 "${CMAKE_CURRENT_BINARY_DIR}/${FILE}" @ONLY)
 
-# We expect the Makefiles to define the sources as defined in
-# the first regex. E.g.:
-# libimagedec_la_SOURCES  = image_dec.c image_dec.h
+  if(HAVE_MATH_LIBRARY)
+    # MSVC doesn't have libm
+    file(READ ${CMAKE_CURRENT_BINARY_DIR}/${FILE} data)
+    string(REPLACE "-lm" "" data ${data})
+    file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${FILE} ${data})
+  endif()
+
+  install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${FILE}"
+          DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
+endfunction()
+
+# ##############################################################################
+# WebP source files. Read the Makefile.am to get the source files.
+
+# We expect the Makefiles to define the sources as defined in the first regex.
+# E.g.: libimagedec_la_SOURCES  = image_dec.c image_dec.h
 function(parse_Makefile_am FOLDER VAR SRC_REGEX)
   file(READ ${FOLDER}/Makefile.am MAKEFILE_AM)
   string(REGEX MATCHALL "${SRC_REGEX}_SOURCES[ ]*\\+?=[ ]+[0-9a-z\\._ ]*"
-    FILES_PER_LINE ${MAKEFILE_AM}
-  )
+               FILES_PER_LINE ${MAKEFILE_AM})
   set(SRCS ${${VAR}})
   foreach(FILES ${FILES_PER_LINE})
     string(FIND ${FILES} "=" OFFSET)
     math(EXPR OFFSET "${OFFSET} + 2")
     string(SUBSTRING ${FILES} ${OFFSET} -1 FILES)
     if(FILES)
-      string(REGEX MATCHALL "[0-9a-z\\._]+"
-        FILES ${FILES}
-      )
+      string(REGEX MATCHALL "[0-9a-z\\._]+" FILES ${FILES})
       foreach(FILE ${FILES})
         list(APPEND SRCS ${FOLDER}/${FILE})
       endforeach()
@@ -83,16 +223,16 @@
 endfunction()
 
 set(WEBP_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
-parse_Makefile_am(${WEBP_SRC_DIR}/dec "WEBP_DEC_SRCS" "")
-parse_Makefile_am(${WEBP_SRC_DIR}/demux "WEBP_DEMUX_SRCS" "")
-parse_Makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_COMMON_SRCS" "COMMON")
-parse_Makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_ENC_SRCS" "ENC")
-parse_Makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_ENC_SRCS" "dsp_[^ ]*")
-parse_Makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_DEC_SRCS" "decode_[^ ]*")
-parse_Makefile_am(${WEBP_SRC_DIR}/enc "WEBP_ENC_SRCS" "")
-parse_Makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_COMMON_SRCS" "COMMON")
-parse_Makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_ENC_SRCS" "ENC")
-parse_Makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_DEC_SRCS" "decode_[^ ]*")
+parse_makefile_am(${WEBP_SRC_DIR}/dec "WEBP_DEC_SRCS" "")
+parse_makefile_am(${WEBP_SRC_DIR}/demux "WEBP_DEMUX_SRCS" "")
+parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_COMMON_SRCS" "COMMON")
+parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_ENC_SRCS" "ENC")
+parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_ENC_SRCS" "dsp_[^ ]*")
+parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_DEC_SRCS" "decode_[^ ]*")
+parse_makefile_am(${WEBP_SRC_DIR}/enc "WEBP_ENC_SRCS" "")
+parse_makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_COMMON_SRCS" "COMMON")
+parse_makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_ENC_SRCS" "ENC")
+parse_makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_DEC_SRCS" "decode_[^ ]*")
 
 # Remove the files specific to SIMD we don't use.
 foreach(FILE ${WEBP_SIMD_FILES_NOT_TO_INCLUDE})
@@ -100,262 +240,555 @@
   list(REMOVE_ITEM WEBP_DSP_DEC_SRCS ${FILE})
 endforeach()
 
-### Define the mandatory libraries.
+# Generate the config.h file.
+configure_file(${CMAKE_CURRENT_LIST_DIR}/cmake/config.h.in
+               ${CMAKE_CURRENT_BINARY_DIR}/src/webp/config.h @ONLY)
+add_definitions(-DHAVE_CONFIG_H)
+
+# Set the version numbers.
+macro(set_version FILE TARGET_NAME NAME_IN_MAKEFILE)
+  file(READ ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} SOURCE_FILE)
+  string(REGEX MATCH
+               "${NAME_IN_MAKEFILE}_la_LDFLAGS[^\n]* -version-info [0-9:]+" TMP
+               ${SOURCE_FILE})
+  string(REGEX MATCH "[0-9:]+" TMP ${TMP})
+  string(REGEX REPLACE ":" " " LT_VERSION ${TMP})
+
+  # See the libtool docs for more information:
+  # https://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info
+  #
+  # c=<current>, a=<age>, r=<revision>
+  #
+  # libtool generates a .so file as .so.[c-a].a.r, while -version-info c:r:a is
+  # passed to libtool.
+  #
+  # We set FULL = [c-a].a.r and MAJOR = [c-a].
+  separate_arguments(LT_VERSION)
+  list(GET LT_VERSION 0 LT_CURRENT)
+  list(GET LT_VERSION 1 LT_REVISION)
+  list(GET LT_VERSION 2 LT_AGE)
+  math(EXPR LT_CURRENT_MINUS_AGE "${LT_CURRENT} - ${LT_AGE}")
+
+  set_target_properties(
+    ${TARGET_NAME}
+    PROPERTIES VERSION ${LT_CURRENT_MINUS_AGE}.${LT_AGE}.${LT_REVISION}
+               SOVERSION ${LT_CURRENT_MINUS_AGE})
+  if(APPLE)
+    # For compatibility, set MACHO_COMPATIBILITY_VERSION and
+    # MACHO_CURRENT_VERSION to match libtool. These properties were introduced
+    # in 3.17:
+    # https://cmake.org/cmake/help/latest/prop_tgt/MACHO_COMPATIBILITY_VERSION.html
+    math(EXPR LIBWEBP_MACHO_COMPATIBILITY_VERSION "${LT_CURRENT} + 1")
+    set_target_properties(
+      ${TARGET_NAME}
+      PROPERTIES MACHO_COMPATIBILITY_VERSION
+                 ${LIBWEBP_MACHO_COMPATIBILITY_VERSION}
+                 MACHO_CURRENT_VERSION
+                 ${LIBWEBP_MACHO_COMPATIBILITY_VERSION}.${LT_REVISION})
+  endif()
+endmacro()
+
+# ##############################################################################
 # Build the webpdecoder library.
+
+# Creates a source file with an unused stub function in $CMAKE_BINARY_DIR and
+# adds it to the specified target. Currently used only with Xcode.
+#
+# See also:
+# https://cmake.org/cmake/help/v3.18/command/add_library.html#object-libraries
+# "Some native build systems (such as Xcode) may not like targets that have only
+# object files, so consider adding at least one real source file to any target
+# that references $<TARGET_OBJECTS:objlib>."
+function(libwebp_add_stub_file TARGET)
+  set(stub_source_dir "${CMAKE_BINARY_DIR}")
+  set(stub_source_file "${stub_source_dir}/libwebp_${TARGET}_stub.c")
+  set(stub_source_code
+      "// Generated file. DO NOT EDIT!\n"
+      "// C source file created for target ${TARGET}.\n"
+      "void libwebp_${TARGET}_stub_function(void)\;\n"
+      "void libwebp_${TARGET}_stub_function(void) {}\n")
+  file(WRITE "${stub_source_file}" ${stub_source_code})
+
+  target_sources(${TARGET} PRIVATE ${stub_source_file})
+endfunction()
+
+parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv "WEBP_SHARPYUV_SRCS" "")
+add_library(sharpyuv ${WEBP_SHARPYUV_SRCS})
+target_link_libraries(sharpyuv ${SHARPYUV_DEP_LIBRARIES})
+set_version(sharpyuv/Makefile.am sharpyuv sharpyuv)
+target_include_directories(
+  sharpyuv PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
+                   ${CMAKE_CURRENT_SOURCE_DIR}/src)
+set_target_properties(
+  sharpyuv
+  PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv/sharpyuv.h;\
+${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv/sharpyuv_csp.h")
+configure_pkg_config("sharpyuv/libsharpyuv.pc")
+install(
+  TARGETS sharpyuv
+  EXPORT ${PROJECT_NAME}Targets
+  PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/webp/sharpyuv
+  INCLUDES
+  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+  ${CMAKE_INSTALL_INCLUDEDIR}/webp
+  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+
 if(MSVC)
   # avoid security warnings for e.g., fopen() used in the examples.
   add_definitions(-D_CRT_SECURE_NO_WARNINGS)
 else()
-  add_definitions(-Wall)
+  add_compile_options(-Wall)
 endif()
-include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${WEBP_DEP_INCLUDE_DIRS})
+include_directories(${WEBP_DEP_INCLUDE_DIRS})
 add_library(webpdecode OBJECT ${WEBP_DEC_SRCS})
+target_include_directories(webpdecode PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
+                                              ${CMAKE_CURRENT_SOURCE_DIR})
 add_library(webpdspdecode OBJECT ${WEBP_DSP_COMMON_SRCS} ${WEBP_DSP_DEC_SRCS})
+target_include_directories(webpdspdecode PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
+                                                 ${CMAKE_CURRENT_SOURCE_DIR})
 add_library(webputilsdecode OBJECT ${WEBP_UTILS_COMMON_SRCS}
-  ${WEBP_UTILS_DEC_SRCS})
-add_library(webpdecoder $<TARGET_OBJECTS:webpdecode>
-  $<TARGET_OBJECTS:webpdspdecode> $<TARGET_OBJECTS:webputilsdecode>)
+                                   ${WEBP_UTILS_DEC_SRCS})
+target_include_directories(webputilsdecode PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
+                                                   ${CMAKE_CURRENT_SOURCE_DIR})
+add_library(
+  webpdecoder $<TARGET_OBJECTS:webpdecode> $<TARGET_OBJECTS:webpdspdecode>
+              $<TARGET_OBJECTS:webputilsdecode>)
+if(XCODE)
+  libwebp_add_stub_file(webpdecoder)
+endif()
 target_link_libraries(webpdecoder ${WEBP_DEP_LIBRARIES})
+target_include_directories(
+  webpdecoder PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
+  INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+            $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
+set_target_properties(
+  webpdecoder
+  PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\
+${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h")
+
+configure_pkg_config("src/libwebpdecoder.pc")
 
 # Build the webp library.
 add_library(webpencode OBJECT ${WEBP_ENC_SRCS})
+target_include_directories(
+  webpencode PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
+                     ${CMAKE_CURRENT_SOURCE_DIR}/src)
 add_library(webpdsp OBJECT ${WEBP_DSP_COMMON_SRCS} ${WEBP_DSP_DEC_SRCS}
-  ${WEBP_DSP_ENC_SRCS})
+                           ${WEBP_DSP_ENC_SRCS})
+target_include_directories(webpdsp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
+                                           ${CMAKE_CURRENT_SOURCE_DIR})
 add_library(webputils OBJECT ${WEBP_UTILS_COMMON_SRCS} ${WEBP_UTILS_DEC_SRCS}
-  ${WEBP_UTILS_ENC_SRCS})
+                             ${WEBP_UTILS_ENC_SRCS})
+target_include_directories(webputils PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
+                                             ${CMAKE_CURRENT_SOURCE_DIR})
 add_library(webp $<TARGET_OBJECTS:webpdecode> $<TARGET_OBJECTS:webpdsp>
-  $<TARGET_OBJECTS:webpencode> $<TARGET_OBJECTS:webputils>)
+                 $<TARGET_OBJECTS:webpencode> $<TARGET_OBJECTS:webputils>)
+target_link_libraries(webp sharpyuv)
+if(XCODE)
+  libwebp_add_stub_file(webp)
+endif()
 target_link_libraries(webp ${WEBP_DEP_LIBRARIES})
+target_include_directories(
+  webp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}
+  PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
+         $<INSTALL_INTERFACE:include>)
+set_target_properties(
+  webp
+  PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\
+${CMAKE_CURRENT_SOURCE_DIR}/src/webp/encode.h;\
+${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h")
 
-# Make sure the OBJECT libraries are built with position independent code
-# (it is not ON by default).
-set_target_properties(webpdecode webpdspdecode webputilsdecode
-  webpencode webpdsp webputils PROPERTIES POSITION_INDEPENDENT_CODE ON)
+# Make sure the OBJECT libraries are built with position independent code (it is
+# not ON by default).
+set_target_properties(webpdecode webpdspdecode webputilsdecode webpencode
+                      webpdsp webputils PROPERTIES POSITION_INDEPENDENT_CODE ON)
+configure_pkg_config("src/libwebp.pc")
 
 # Build the webp demux library.
 add_library(webpdemux ${WEBP_DEMUX_SRCS})
 target_link_libraries(webpdemux webp)
+target_include_directories(
+  webpdemux PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}
+  PUBLIC $<INSTALL_INTERFACE:include>)
+set_target_properties(
+  webpdemux
+  PROPERTIES
+    PUBLIC_HEADER
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\
+${CMAKE_CURRENT_SOURCE_DIR}/src/webp/demux.h;\
+${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux_types.h;\
+${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h")
 
-# Set the version numbers.
-function(parse_version FILE NAME VAR)
-  file(READ ${CMAKE_CURRENT_SOURCE_DIR}/src/${FILE} SOURCE_FILE)
-  string(REGEX MATCH "${NAME}_la_LDFLAGS[^\n]* -version-info [0-9:]+" TMP
-    ${SOURCE_FILE})
-  string(REGEX MATCH "[0-9:]+" TMP ${TMP})
-  string(REGEX REPLACE ":" "." VERSION ${TMP})
-  set(${VAR} "${VERSION}" PARENT_SCOPE)
-endfunction()
-parse_version(Makefile.am webp WEBP_WEBP_SOVERSION)
-set_target_properties(webp PROPERTIES VERSION ${PACKAGE_VERSION}
-  SOVERSION ${WEBP_WEBP_SOVERSION})
-parse_version(Makefile.am webpdecoder WEBP_DECODER_SOVERSION)
-set_target_properties(webpdecoder PROPERTIES VERSION ${PACKAGE_VERSION}
-  SOVERSION ${WEBP_DECODER_SOVERSION})
-parse_version(demux/Makefile.am webpdemux WEBP_DEMUX_SOVERSION)
-set_target_properties(webpdemux PROPERTIES VERSION ${PACKAGE_VERSION}
-  SOVERSION ${WEBP_DEMUX_SOVERSION})
+configure_pkg_config("src/demux/libwebpdemux.pc")
+
+set_version(src/Makefile.am webp webp)
+set_version(src/Makefile.am webpdecoder webpdecoder)
+set_version(src/demux/Makefile.am webpdemux webpdemux)
+file(READ ${CMAKE_CURRENT_SOURCE_DIR}/configure.ac CONFIGURE_FILE)
+string(REGEX MATCH "AC_INIT\\([^\n]*\\[[0-9\\.]+\\]" TMP ${CONFIGURE_FILE})
+string(REGEX MATCH "[0-9\\.]+" PROJECT_VERSION ${TMP})
 
 # Define the libraries to install.
-set(INSTALLED_LIBRARIES webpdecoder webp webpdemux)
+list(APPEND INSTALLED_LIBRARIES webpdecoder webp webpdemux)
 
-### Deal with SIMD.
-# Change the compile flags for SIMD files we use.
+# Deal with SIMD. Change the compile flags for SIMD files we use.
 list(LENGTH WEBP_SIMD_FILES_TO_INCLUDE WEBP_SIMD_FILES_TO_INCLUDE_LENGTH)
 math(EXPR WEBP_SIMD_FILES_TO_INCLUDE_RANGE
-  "${WEBP_SIMD_FILES_TO_INCLUDE_LENGTH}-1"
-)
+     "${WEBP_SIMD_FILES_TO_INCLUDE_LENGTH}-1")
 
 foreach(I_FILE RANGE ${WEBP_SIMD_FILES_TO_INCLUDE_RANGE})
   list(GET WEBP_SIMD_FILES_TO_INCLUDE ${I_FILE} FILE)
   list(GET WEBP_SIMD_FLAGS_TO_INCLUDE ${I_FILE} SIMD_COMPILE_FLAG)
-  set_source_files_properties(${FILE} PROPERTIES
-    COMPILE_FLAGS ${SIMD_COMPILE_FLAG}
-  )
+  set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS
+                                                 ${SIMD_COMPILE_FLAG})
 endforeach()
 
-# Build the executables if asked for.
-if(WEBP_BUILD_CWEBP OR WEBP_BUILD_DWEBP OR
-   WEBP_BUILD_GIF2WEBP OR WEBP_BUILD_IMG2WEBP OR WEBP_BUILD_WEBP_JS)
-  # Example utility library.
-  parse_Makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "EXAMPLEUTIL_SRCS"
-    "example_util_[^ ]*")
-  list(APPEND EXAMPLEUTIL_SRCS
-    ${CMAKE_CURRENT_SOURCE_DIR}/examples/stopwatch.h)
-  add_library(exampleutil ${EXAMPLEUTIL_SRCS})
+if(NOT WEBP_BUILD_LIBWEBPMUX)
+  set(WEBP_BUILD_GIF2WEBP OFF)
+  set(WEBP_BUILD_IMG2WEBP OFF)
+  set(WEBP_BUILD_WEBPMUX OFF)
+endif()
 
-  parse_Makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEIOUTILS_SRCS"
-    "imageio_util_[^ ]*")
-  add_library(imageioutil ${IMAGEIOUTILS_SRCS})
+if(WEBP_BUILD_GIF2WEBP AND NOT GIF_FOUND)
+  set(WEBP_BUILD_GIF2WEBP OFF)
+endif()
+
+if(WEBP_BUILD_ANIM_UTILS AND NOT GIF_FOUND)
+  set(WEBP_BUILD_ANIM_UTILS OFF)
+endif()
+
+# Build the executables if asked for.
+if(WEBP_BUILD_ANIM_UTILS
+   OR WEBP_BUILD_CWEBP
+   OR WEBP_BUILD_DWEBP
+   OR WEBP_BUILD_GIF2WEBP
+   OR WEBP_BUILD_IMG2WEBP
+   OR WEBP_BUILD_VWEBP
+   OR WEBP_BUILD_WEBPMUX
+   OR WEBP_BUILD_WEBPINFO)
+  # Example utility library.
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "EXAMPLEUTIL_SRCS"
+                    "example_util_[^ ]*")
+  list(APPEND EXAMPLEUTIL_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/examples/stopwatch.h)
+  add_library(exampleutil STATIC ${EXAMPLEUTIL_SRCS})
+  target_include_directories(
+    exampleutil PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>)
+
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEIOUTILS_SRCS"
+                    "imageio_util_[^ ]*")
+  add_library(imageioutil STATIC ${IMAGEIOUTILS_SRCS})
   target_link_libraries(imageioutil webp)
+  target_link_libraries(exampleutil imageioutil)
 
   # Image-decoding utility library.
-  parse_Makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEDEC_SRCS"
-    "imagedec_[^ ]*")
-  add_library(imagedec ${IMAGEDEC_SRCS})
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEDEC_SRCS"
+                    "imagedec_[^ ]*")
+  add_library(imagedec STATIC ${IMAGEDEC_SRCS})
   target_link_libraries(imagedec imageioutil webpdemux webp
-    ${WEBP_DEP_IMG_LIBRARIES})
+                        ${WEBP_DEP_IMG_LIBRARIES})
 
   # Image-encoding utility library.
-  parse_Makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEENC_SRCS"
-    "imageenc_[^ ]*")
-  add_library(imageenc ${IMAGEENC_SRCS})
-  target_link_libraries(imageenc webp)
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEENC_SRCS"
+                    "imageenc_[^ ]*")
+  add_library(imageenc STATIC ${IMAGEENC_SRCS})
+  target_link_libraries(imageenc imageioutil webp)
 
-  set_property(TARGET exampleutil imageioutil imagedec imageenc
-    PROPERTY INCLUDE_DIRECTORIES
-    ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src)
+  set_property(
+    TARGET exampleutil imageioutil imagedec imageenc
+    PROPERTY INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/src
+             ${CMAKE_CURRENT_BINARY_DIR}/src)
 endif()
 
 if(WEBP_BUILD_DWEBP)
   # dwebp
-  include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS})
-  parse_Makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "DWEBP_SRCS"
-    "dwebp")
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "DWEBP_SRCS" "dwebp")
   add_executable(dwebp ${DWEBP_SRCS})
-  target_link_libraries(dwebp exampleutil imagedec imageenc webpdecoder)
-  install(TARGETS dwebp RUNTIME DESTINATION bin)
-  set_property(TARGET dwebp PROPERTY INCLUDE_DIRECTORIES
-    ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src)
+  target_link_libraries(dwebp exampleutil imagedec imageenc)
+  target_include_directories(dwebp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src)
+  install(TARGETS dwebp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
 endif()
 
 if(WEBP_BUILD_CWEBP)
   # cwebp
-  include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS})
-  parse_Makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "CWEBP_SRCS"
-    "cwebp")
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "CWEBP_SRCS" "cwebp")
   add_executable(cwebp ${CWEBP_SRCS})
   target_link_libraries(cwebp exampleutil imagedec webp)
-  install(TARGETS cwebp RUNTIME DESTINATION bin)
-  set_property(TARGET cwebp PROPERTY INCLUDE_DIRECTORIES
-    ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src)
+  target_include_directories(cwebp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src
+                                           ${CMAKE_CURRENT_SOURCE_DIR})
+  install(TARGETS cwebp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
 endif()
 
-if(WEBP_BUILD_GIF2WEBP AND NOT GIF_FOUND)
-  unset(WEBP_BUILD_GIF2WEBP CACHE)
-endif()
-
-if(WEBP_BUILD_GIF2WEBP OR WEBP_BUILD_IMG2WEBP)
-  parse_Makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/src/mux "WEBP_MUX_SRCS"
-    "")
-  add_library(webpmux ${WEBP_MUX_SRCS})
-  target_link_libraries(webpmux webp)
-  parse_version(mux/Makefile.am webpmux WEBP_MUX_SOVERSION)
-  set_target_properties(webpmux PROPERTIES VERSION ${PACKAGE_VERSION}
-    SOVERSION ${WEBP_MUX_SOVERSION})
-  list(APPEND INSTALLED_LIBRARIES webpmux)
+if(WEBP_BUILD_LIBWEBPMUX)
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/src/mux "WEBP_MUX_SRCS" "")
+  add_library(libwebpmux ${WEBP_MUX_SRCS})
+  target_link_libraries(libwebpmux webp)
+  target_include_directories(libwebpmux PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
+                                                ${CMAKE_CURRENT_SOURCE_DIR})
+  set_version(src/mux/Makefile.am libwebpmux webpmux)
+  set_target_properties(
+    libwebpmux
+    PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux.h;\
+${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux_types.h;\
+${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h;")
+  set_target_properties(libwebpmux PROPERTIES OUTPUT_NAME webpmux)
+  list(APPEND INSTALLED_LIBRARIES libwebpmux)
+  configure_pkg_config("src/mux/libwebpmux.pc")
 endif()
 
 if(WEBP_BUILD_GIF2WEBP)
   # gif2webp
   include_directories(${WEBP_DEP_GIF_INCLUDE_DIRS})
-  parse_Makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "GIF2WEBP_SRCS"
-    "gif2webp")
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "GIF2WEBP_SRCS"
+                    "gif2webp")
   add_executable(gif2webp ${GIF2WEBP_SRCS})
-  target_link_libraries(gif2webp exampleutil imageioutil webp webpmux
-    ${WEBP_DEP_GIF_LIBRARIES})
-  install(TARGETS gif2webp RUNTIME DESTINATION bin)
-  set_property(TARGET gif2webp PROPERTY INCLUDE_DIRECTORIES
-    ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src)
+  target_link_libraries(gif2webp exampleutil imageioutil webp libwebpmux
+                        ${WEBP_DEP_GIF_LIBRARIES})
+  target_include_directories(gif2webp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src)
+  install(TARGETS gif2webp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
 endif()
 
 if(WEBP_BUILD_IMG2WEBP)
   # img2webp
   include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS})
-  parse_Makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "IMG2WEBP_SRCS"
-    "img2webp")
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "IMG2WEBP_SRCS"
+                    "img2webp")
   add_executable(img2webp ${IMG2WEBP_SRCS})
-  target_link_libraries(img2webp exampleutil imagedec imageioutil webp webpmux)
-  install(TARGETS img2webp RUNTIME DESTINATION bin)
-  set_property(TARGET img2webp PROPERTY INCLUDE_DIRECTORIES
-    ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src)
+  target_link_libraries(img2webp exampleutil imagedec imageioutil webp
+                        libwebpmux)
+  target_include_directories(img2webp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src
+                                              ${CMAKE_CURRENT_SOURCE_DIR})
+  install(TARGETS img2webp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
 endif()
 
-if (WEBP_BUILD_WEBPINFO)
+if(WEBP_BUILD_VWEBP)
+  # vwebp
+  find_package(GLUT)
+  if(GLUT_FOUND)
+    include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS})
+    parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "VWEBP_SRCS" "vwebp")
+    add_executable(vwebp ${VWEBP_SRCS})
+    target_link_libraries(
+      vwebp
+      ${OPENGL_LIBRARIES}
+      exampleutil
+      GLUT::GLUT
+      imageioutil
+      webp
+      webpdemux)
+    target_include_directories(
+      vwebp PRIVATE ${GLUT_INCLUDE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src
+                    ${OPENGL_INCLUDE_DIR})
+    install(TARGETS vwebp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+    if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
+      check_c_compiler_flag("-Wno-deprecated-declarations" HAS_NO_DEPRECATED)
+      if(HAS_NO_DEPRECATED)
+        target_compile_options(vwebp PRIVATE "-Wno-deprecated-declarations")
+      endif()
+    endif()
+  endif()
+endif()
+
+if(WEBP_BUILD_WEBPINFO)
   # webpinfo
   include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS})
-  parse_Makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "WEBPINFO_SRCS"
-    "webpinfo")
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "WEBPINFO_SRCS"
+                    "webpinfo")
   add_executable(webpinfo ${WEBPINFO_SRCS})
   target_link_libraries(webpinfo exampleutil imageioutil)
-  install(TARGETS webpinfo RUNTIME DESTINATION bin)
-  set_property(TARGET webpinfo PROPERTY INCLUDE_DIRECTORIES
-    ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src)
+  target_include_directories(webpinfo PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src
+                                              ${CMAKE_CURRENT_SOURCE_DIR}/src)
+  install(TARGETS webpinfo RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+endif()
+
+if(WEBP_BUILD_WEBPMUX)
+  # webpmux
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "WEBPMUX_SRCS"
+                    "webpmux")
+  add_executable(webpmux ${WEBPMUX_SRCS})
+  target_link_libraries(webpmux exampleutil imageioutil libwebpmux webp)
+  target_include_directories(webpmux PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src)
+  install(TARGETS webpmux RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+endif()
+
+if(WEBP_BUILD_EXTRAS)
+  set(EXTRAS_MAKEFILE "${CMAKE_CURRENT_SOURCE_DIR}/extras")
+  parse_makefile_am(${EXTRAS_MAKEFILE} "WEBP_EXTRAS_SRCS" "libwebpextras_la")
+  parse_makefile_am(${EXTRAS_MAKEFILE} "GET_DISTO_SRCS" "get_disto")
+  parse_makefile_am(${EXTRAS_MAKEFILE} "WEBP_QUALITY_SRCS" "webp_quality")
+  parse_makefile_am(${EXTRAS_MAKEFILE} "VWEBP_SDL_SRCS" "vwebp_sdl")
+
+  # libextras
+  add_library(extras STATIC ${WEBP_EXTRAS_SRCS})
+  target_include_directories(
+    extras PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
+                   ${CMAKE_CURRENT_SOURCE_DIR}/src)
+
+  # get_disto
+  add_executable(get_disto ${GET_DISTO_SRCS})
+  target_link_libraries(get_disto imagedec)
+  target_include_directories(get_disto PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+                                               ${CMAKE_CURRENT_BINARY_DIR}/src)
+
+  # webp_quality
+  add_executable(webp_quality ${WEBP_QUALITY_SRCS})
+  target_link_libraries(webp_quality exampleutil imagedec extras)
+  target_include_directories(webp_quality PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+                                                  ${CMAKE_CURRENT_BINARY_DIR})
+
+  # vwebp_sdl
+  find_package(SDL)
+  if(WEBP_BUILD_VWEBP AND SDL_FOUND)
+    add_executable(vwebp_sdl ${VWEBP_SDL_SRCS})
+    target_link_libraries(vwebp_sdl ${SDL_LIBRARY} imageioutil webp)
+    target_include_directories(
+      vwebp_sdl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}
+                        ${CMAKE_CURRENT_BINARY_DIR}/src ${SDL_INCLUDE_DIR})
+    set(WEBP_HAVE_SDL 1)
+    target_compile_definitions(vwebp_sdl PUBLIC WEBP_HAVE_SDL)
+  endif()
 endif()
 
 if(WEBP_BUILD_WEBP_JS)
-  # JavaScript version
-  add_executable(webp_js
-                 ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c)
-  target_link_libraries(webp_js webpdecoder SDL)
-  set(WEBP_HAVE_SDL 1)
-  set_target_properties(webp_js PROPERTIES LINK_FLAGS
-      "-s EXPORTED_FUNCTIONS='[\"_WebpToSDL\"]' -s INVOKE_RUN=0 \
-       -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"cwrap\"]'")
-  set_target_properties(webp_js PROPERTIES OUTPUT_NAME webp)
-  target_compile_definitions(webp_js PUBLIC EMSCRIPTEN WEBP_HAVE_SDL)
+  # The default stack size changed from 5MB to 64KB in 3.1.27. See
+  # https://crbug.com/webp/614.
+  if(EMSCRIPTEN_VERSION VERSION_GREATER_EQUAL "3.1.27")
+    # TOTAL_STACK size was renamed to STACK_SIZE in 3.1.27. The old name was
+    # kept for compatibility, but prefer the new one in case it is removed in
+    # the future.
+    set(emscripten_stack_size "-sSTACK_SIZE=5MB")
+  else()
+    set(emscripten_stack_size "-sTOTAL_STACK=5MB")
+  endif()
+  # wasm2js does not support SIMD.
+  if(NOT WEBP_ENABLE_SIMD)
+    # JavaScript version
+    add_executable(webp_js ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c)
+    target_link_libraries(webp_js webpdecoder SDL)
+    target_include_directories(webp_js PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
+    set(WEBP_HAVE_SDL 1)
+    set_target_properties(
+      webp_js
+      PROPERTIES LINK_FLAGS "-sWASM=0 ${emscripten_stack_size} \
+         -sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \
+         -sEXPORTED_RUNTIME_METHODS=cwrap")
+    set_target_properties(webp_js PROPERTIES OUTPUT_NAME webp)
+    target_compile_definitions(webp_js PUBLIC EMSCRIPTEN WEBP_HAVE_SDL)
+  endif()
 
   # WASM version
-  add_executable(webp_wasm
-                 ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c)
+  add_executable(webp_wasm ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c)
   target_link_libraries(webp_wasm webpdecoder SDL)
-  set_target_properties(webp_wasm PROPERTIES LINK_FLAGS
-      "-s WASM=1 -s 'BINARYEN_METHOD=\"native-wasm\"' \
-       -s EXPORTED_FUNCTIONS='[\"_WebpToSDL\"]' -s INVOKE_RUN=0 \
-       -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"cwrap\"]'")
+  target_include_directories(webp_wasm PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
+  set_target_properties(
+    webp_wasm
+    PROPERTIES LINK_FLAGS "-sWASM=1 ${emscripten_stack_size} \
+       -sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \
+       -sEXPORTED_RUNTIME_METHODS=cwrap")
   target_compile_definitions(webp_wasm PUBLIC EMSCRIPTEN WEBP_HAVE_SDL)
 
-  target_compile_definitions(webpdecoder PUBLIC EMSCRIPTEN)
+  target_compile_definitions(webpdspdecode PUBLIC EMSCRIPTEN)
 endif()
 
-# Generate the config.h file.
-configure_file(${CMAKE_CURRENT_LIST_DIR}/cmake/config.h.in
-  ${CMAKE_CURRENT_BINARY_DIR}/src/webp/config.h)
-add_definitions(-DHAVE_CONFIG_H)
-# The webp folder is included as we reference config.h as
-# ../webp/config.h or webp/config.h
-include_directories(${CMAKE_CURRENT_BINARY_DIR})
+if(WEBP_BUILD_ANIM_UTILS)
+  # anim_diff
+  include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS} ${WEBP_DEP_GIF_INCLUDE_DIRS})
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "ANIM_DIFF_SRCS"
+                    "anim_diff")
+  add_executable(anim_diff ${ANIM_DIFF_SRCS})
+  target_link_libraries(
+    anim_diff
+    exampleutil
+    imagedec
+    imageenc
+    imageioutil
+    webp
+    webpdemux
+    ${WEBP_DEP_GIF_LIBRARIES})
+  target_include_directories(anim_diff PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src)
+
+  # anim_dump
+  include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS} ${WEBP_DEP_GIF_INCLUDE_DIRS})
+  parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "ANIM_DUMP_SRCS"
+                    "anim_dump")
+  add_executable(anim_dump ${ANIM_DUMP_SRCS})
+  target_link_libraries(
+    anim_dump
+    exampleutil
+    imagedec
+    imageenc
+    imageioutil
+    webp
+    webpdemux
+    ${WEBP_DEP_GIF_LIBRARIES})
+  target_include_directories(anim_dump PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src)
+endif()
 
 # Install the different headers and libraries.
-install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h
-              ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/demux.h
-              ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/encode.h
-              ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux.h
-              ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux_types.h
-              ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h
-        DESTINATION include/webp)
-install(TARGETS ${INSTALLED_LIBRARIES}
-        LIBRARY DESTINATION lib
-        ARCHIVE DESTINATION lib)
+install(
+  TARGETS ${INSTALLED_LIBRARIES}
+  EXPORT ${PROJECT_NAME}Targets
+  PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/webp
+  INCLUDES
+  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+set(ConfigPackageLocation ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/cmake/)
+install(EXPORT ${PROJECT_NAME}Targets NAMESPACE ${PROJECT_NAME}::
+        DESTINATION ${ConfigPackageLocation})
 
 # Create the CMake version file.
 include(CMakePackageConfigHelpers)
 write_basic_package_version_file(
   "${CMAKE_CURRENT_BINARY_DIR}/WebPConfigVersion.cmake"
-  VERSION ${PACKAGE_VERSION}
-  COMPATIBILITY AnyNewerVersion
-)
+  VERSION ${PACKAGE_VERSION} COMPATIBILITY AnyNewerVersion)
 
 # Create the Config file.
 include(CMakePackageConfigHelpers)
-set(ConfigPackageLocation share/WebP/cmake/)
+# Fix libwebpmux reference. The target name libwebpmux is used for compatibility
+# purposes, but the library mentioned in WebPConfig.cmake should be the
+# unprefixed version. Note string(...) can be replaced with list(TRANSFORM ...)
+# if cmake_minimum_required is >= 3.12.
+string(REGEX REPLACE "libwebpmux" "webpmux" INSTALLED_LIBRARIES
+                     "${INSTALLED_LIBRARIES}")
+
+if(MSVC)
+  # For compatibility with nmake, MSVC builds use a custom prefix (lib) that
+  # needs to be included in the library name.
+  string(REGEX REPLACE "[A-Za-z0-9_]+" "${CMAKE_STATIC_LIBRARY_PREFIX}\\0"
+                       INSTALLED_LIBRARIES "${INSTALLED_LIBRARIES}")
+endif()
+
 configure_package_config_file(
   ${CMAKE_CURRENT_SOURCE_DIR}/cmake/WebPConfig.cmake.in
   ${CMAKE_CURRENT_BINARY_DIR}/WebPConfig.cmake
   INSTALL_DESTINATION ${ConfigPackageLocation}
-)
+  PATH_VARS CMAKE_INSTALL_INCLUDEDIR)
 
 # Install the generated CMake files.
-install(
-  FILES "${CMAKE_CURRENT_BINARY_DIR}/WebPConfigVersion.cmake"
-        "${CMAKE_CURRENT_BINARY_DIR}/WebPConfig.cmake"
-  DESTINATION ${ConfigPackageLocation}
-)
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/WebPConfigVersion.cmake"
+              "${CMAKE_CURRENT_BINARY_DIR}/WebPConfig.cmake"
+        DESTINATION ${ConfigPackageLocation})
 
 # Install the man pages.
-set(MAN_PAGES cwebp.1 dwebp.1 gif2webp.1 img2webp.1 vwebp.1 webpmux.1
-  webpinfo.1)
-set(EXEC_BUILDS "CWEBP" "DWEBP" "GIF2WEBP" "IMG2WEBP" "VWEBP" "WEBPMUX"
-  "WEBPINFO")
+set(MAN_PAGES
+    cwebp.1
+    dwebp.1
+    gif2webp.1
+    img2webp.1
+    vwebp.1
+    webpmux.1
+    webpinfo.1)
+set(EXEC_BUILDS
+    "CWEBP"
+    "DWEBP"
+    "GIF2WEBP"
+    "IMG2WEBP"
+    "VWEBP"
+    "WEBPMUX"
+    "WEBPINFO")
 list(LENGTH MAN_PAGES MAN_PAGES_LENGTH)
 math(EXPR MAN_PAGES_RANGE "${MAN_PAGES_LENGTH} - 1")
 
@@ -364,8 +797,6 @@
   if(WEBP_BUILD_${EXEC_BUILD})
     list(GET MAN_PAGES ${I_MAN} MAN_PAGE)
     install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/man/${MAN_PAGE}
-      DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man/man1
-      COMPONENT doc
-    )
+            DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT doc)
   endif()
 endforeach()
diff --git a/third_party/libwebp/CONTRIBUTING.md b/third_party/libwebp/CONTRIBUTING.md
new file mode 100644
index 0000000..9540f34
--- /dev/null
+++ b/third_party/libwebp/CONTRIBUTING.md
@@ -0,0 +1,78 @@
+# How to Contribute
+
+We'd love to accept your patches and contributions to this project. There are
+just a few small guidelines you need to follow.
+
+## Contributor License Agreement
+
+Contributions to this project must be accompanied by a Contributor License
+Agreement. You (or your employer) retain the copyright to your contribution;
+this simply gives us permission to use and redistribute your contributions as
+part of the project. Head over to <https://cla.developers.google.com/> to see
+your current agreements on file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already submitted one
+(even if it was for a different project), you probably don't need to do it
+again.
+
+## Code reviews
+
+All submissions, including submissions by project members, require review. We
+use a [Gerrit](https://www.gerritcodereview.com) instance hosted at
+https://chromium-review.googlesource.com for this purpose.
+
+## Sending patches
+
+The basic git workflow for modifying libwebp code and sending for review is:
+
+1.  Get the latest version of the repository locally:
+
+    ```sh
+    git clone https://chromium.googlesource.com/webm/libwebp && cd libwebp
+    ```
+
+2.  Copy the commit-msg script into ./git/hooks (this will add an ID to all of
+    your commits):
+
+    ```sh
+    curl -Lo .git/hooks/commit-msg https://chromium-review.googlesource.com/tools/hooks/commit-msg && chmod u+x .git/hooks/commit-msg
+    ```
+
+3.  Modify the local copy of libwebp. Make sure the code
+    [builds successfully](https://chromium.googlesource.com/webm/libwebp/+/HEAD/doc/building.md#cmake).
+
+4.  Choose a short and representative commit message:
+
+    ```sh
+    git commit -a -m "Set commit message here"
+    ```
+
+5.  Send the patch for review:
+
+    ```sh
+    git push https://chromium-review.googlesource.com/webm/libwebp HEAD:refs/for/main
+    ```
+
+    Go to https://chromium-review.googlesource.com to view your patch and
+    request a review from the maintainers.
+
+See the
+[WebM Project page](https://www.webmproject.org/code/contribute/submitting-patches/)
+for additional details.
+
+## Code Style
+
+The C code style is based on the
+[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) and
+`clang-format --style=Google`, though this project doesn't use the tool to
+enforce the formatting.
+
+CMake files are formatted with
+[cmake-format](https://cmake-format.readthedocs.io/en/latest/). `cmake-format
+-i` can be used to format individual files, it will use the settings from
+`.cmake-format.py`.
+
+## Community Guidelines
+
+This project follows
+[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
diff --git a/third_party/libwebp/ChangeLog b/third_party/libwebp/ChangeLog
index 9fd9acf..5e85875 100644
--- a/third_party/libwebp/ChangeLog
+++ b/third_party/libwebp/ChangeLog
@@ -1,23 +1,793 @@
+e1adea50 update NEWS
+43393320 enc/*: normalize WebPEncodingSetError() calls
+287fdefe enc/*: add missing WebPEncodingSetError() calls
+c3bd7cff EncodeAlphaInternal: add missing error check
+d49cfbb3 vp8l_enc,WriteImage: add missing error check
+2e5a9ec3 muxread,MuxImageParse: add missing error checks
+ebb6f949 cmake,emscripten: explicitly set stack size
+59a2b1f9 WebPDecodeYUV: check u/v/stride/uv_stride ptrs
+8e965ccb Call png_get_channels() to see if image has alpha
+7f0a3419 update ChangeLog (tag: v1.3.1-rc1)
+bab7efbe update NEWS
+7138bf8f bump version to 1.3.1
+435b4ded update AUTHORS
+47351229 update .mailmap
+ff6c7f4e CONTRIBUTING.md: add C style / cmake-format notes
+dd530437 add .cmake-format.py
+adbe2cb1 cmake,cosmetics: apply cmake-format
+15b36508 doc/webp-container-spec: rm future codec comment
+c369c4bf doc/webp-lossless-bitstream-spec: improve link text
+1de35f47 doc/webp-container-spec: don't use 'currently'
+bb06a16e doc/webp-container-spec: prefer present tense
+9f38b71e doc/webp-lossless-bitstream-spec: prefer present tense
+7acb6b82 doc/webp-container-spec: avoid i.e. & e.g.
+4967e7cd doc/webp-lossless-bitstream-spec: avoid i.e. & e.g.
+e3366659 Merge "Do not find_package image libraries if not needed." into main
+428588ef clarify single leaf node trees and use of canonical prefix coding
+709ec152 Do not find_package image libraries if not needed.
+8dd80ef8 fuzz_utils.h: lower kFuzzPxLimit w/ASan
+8f187b9f Clean message calls in CMake
+cba30078 WebPConfig.cmake.in: use calculated include path
+6cf9a76a Merge "webp-lossless-bitstream-spec: remove use of 'dynamics'" into main
+740943b2 Merge "Specialize and optimize ITransform_SSE2 using do_two" into main
+2d547e24 Compare kFuzzPxLimit to max_num_operations
+ac42dde1 Specialize and optimize ITransform_SSE2 using do_two
+17e0ef1d webp-lossless-bitstream-spec: remove use of 'dynamics'
+ed274371 neon.h,cosmetics: clear a couple lint warnings
+3fb82947 cpu.h,cosmetics: segment defines
+0c496a4f cpu.h: add WEBP_AARCH64
+8151f388 move VP8GetCPUInfo declaration to cpu.c
+916548c2 Make kFuzzPxLimit sanitizer dependent
+4070b271 advanced_api_fuzzer: reduce scaling limit
+761f49c3 Merge "webp-lossless-bitstream-spec: add missing bits to ABNF" into main
+84d04c48 webp-lossless-bitstream-spec: add missing bits to ABNF
+0696e1a7 advanced_api_fuzzer: reduce scaling limit
+93d88aa2 Merge "deps.cmake: remove unneeded header checks" into main
+118e0035 deps.cmake: remove unneeded header checks
+4c3d7018 webp-lossless-bitstream-spec: condense normal-prefix-code
+a6a09b32 webp-lossless-bitstream-spec: fix 2 code typos
+50ac4f7c Merge "cpu.h: enable NEON w/_M_ARM64EC" into main
+4b7d7b4f Add contribution instructions
+0afbd97b cpu.h: enable NEON w/_M_ARM64EC
+349f4353 Merge changes Ibd89e56b,Ic57e7f84,I89096614 into main
+8f7513b7 upsampling_neon.c: fix WEBP_SWAP_16BIT_CSP check
+cbf624b5 advanced_api_fuzzer: reduce scaling limit
+89edfdd1 Skip slow scaling in libwebp advanced_api_fuzzer
+859f19f7 Reduce libwebp advanced_api_fuzzer threshold
+a4f04835 Merge changes Ic389aaa2,I329ccd79 into main
+1275fac8 Makefile.vc: fix img2webp link w/dynamic cfg
+2fe27bb9 img2webp: normalize help output
+24bed3d9 cwebp: reflow -near_lossless help text
+0825faa4 img2webp: add -sharp_yuv/-near_lossless
+d64e6d7d Merge "PaletteSortModifiedZeng: fix leak on error" into main
+0e12a22d Merge "EncodeAlphaInternal: clear result->bw on error" into main
+0edbb6ea PaletteSortModifiedZeng: fix leak on error
+41ffe04e Merge "Update yapf style from "chromium" to "yapf"" into main
+2d9d9265 Update yapf style from "chromium" to "yapf"
+a486d800 EncodeAlphaInternal: clear result->bw on error
+1347a32d Skip big scaled advanced_api_fuzzer
+52b6f067 Fix scaling limit in advanced_api_fuzzer.c
+73618428 Limit scaling in libwebp advanced_api_fuzzer.c
+b54d21a0 Merge "CMakeLists.txt: allow CMAKE_INSTALL_RPATH to be set empty" into main
+31c28db5 libwebp{,demux,mux}.pc.in: Requires -> Requires.private
+d9a505ff CMakeLists.txt: allow CMAKE_INSTALL_RPATH to be set empty
+bdf33d03 Merge tag 'v1.3.0'
+b5577769 update ChangeLog (tag: v1.3.0-rc1, tag: v1.3.0)
+0ba77244 update NEWS
+e763eb1e bump version to 1.3.0
+2a8686fc update AUTHORS
+106a57c1 Merge "*/Android.mk: add a check for NDK_ROOT" into main
+c5e841c4 Merge "extras: WebpToSDL -> WebPToSDL" into main
+dbc30715 Merge "xcframeworkbuild.sh: bump MACOSX_CATALYST_MIN_VERSION" into main
+6fc1a9f9 */Android.mk: add a check for NDK_ROOT
+d3e151fc doc/api.md,webp_js/README.md: Webp -> WebP
+ed92a626 extras: WebpToSDL -> WebPToSDL
+6eb0189b xcframeworkbuild.sh: bump MACOSX_CATALYST_MIN_VERSION
+1d58575b CMake: align .pc variables with autoconf
+e5fe2cfc webp-lossless-bitstream-spec,cosmetics: reflow paragraphs
+0ceeeab9 webp-lossless-bitstream-spec: add amendment note
+607611cd Merge "webp-container-spec: normalize section title case" into main
+f853685e lossless: SUBTRACT_GREEN -> SUBTRACT_GREEN_TRANSFORM
+786497e4 webp-lossless-bitstream-spec: fix inv color txfm description
+c6ac672d webp-lossless-bitstream-spec: fix num_code_lengths check
+b5700efb webp-lossless-bitstream-spec,cosmetics: grammar/capitalization
+d8ed8c11 webp-container-spec: normalize section title case
+52ec0b8f Merge changes Ie975dbb5,Ifc8c93af,I6ca7c5d6,I2e8d66f5,I152477b8 into main
+5097ef62 webp-container-spec,cosmetics: grammar/capitalization
+e3ba2b1f webp-lossless-bitstream-spec,cosmetics: reflow abstract
+1e8e3ded webp-lossless-bitstream-spec: reword abstract re alpha
+017cb6fa webp-container-spec,cosmetics: normalize range syntax
+f6a4684b webp-lossless-bitstream-spec,cosmetics: normalize range syntax
+54ebd5a3 webp-lossless-bitstream-spec: limit dist map lut to 69 cols
+44741f9c webp-lossless-bitstream-spec: fix dist mapping example
+fad0ece7 pnmdec.c: use snprintf instead of sprintf
+3f73e8f7 sharpyuv: add SharpYuvGetVersion()
+ce2f2d66 SharpYuvConvert: fix a race on SharpYuvGetCPUInfo
+a458e308 sharpyuv_dsp.h: restore sharpyuv_cpu.h include
+9ba800a7 Merge changes Id72fbf3b,Ic59d23a2 into main
+979c0ebb sharpyuv: add SharpYuvGetCPUInfo
+8bab09a4 Merge "*.pc.in: rename lib_prefix to webp_libname_prefix" into main
+769387c5 cpu.c,cosmetics: fix a typo
+a02978c2 sharpyuv/Makefile.am+cmake: add missing -lm
+28aedcb9 *.pc.in: rename lib_prefix to webp_libname_prefix
+c42e6d5a configure.ac: export an empty lib_prefix variable
+dfc843aa Merge "*.pc.in: add lib prefix to lib names w/MSVC" into main
+2498209b *.pc.in: add lib prefix to lib names w/MSVC
+ac252b61 Merge "analysis_enc.c: fix a dead store warning" into main
+56944762 analysis_enc.c: fix a dead store warning
+d34f9b99 Merge "webp-lossless-bitstream-spec: convert BNF to ABNF" into main
+dc05b4db Merge changes I96bc063c,I45880467,If9e18e5a,I6ee938e4,I0a410b28, ... into main
+83270c7f webp-container-spec: add prose for rendering process
+73b19b64 webp-container-spec: note reserved fields MUST be ignored
+57101d3f webp-lossless-bitstream-spec: improve 'small' color table stmt
+dfd32e45 webp-container-spec: remove redundant sentence
+8a6185dd doc/webp-*: fix some punctuation, grammar
+72776530 webp-lossless-bitstream-spec: convert BNF to ABNF
+d992bb08 cmake: rename cpufeatures target to cpufeatures-webp
+3ed2b275 webp-container-spec: clarify background color note
+951c292d webp-container-spec: come too late -> out of order
+902dd787 webp-container-spec: prefer hex literals
+a8f6b5ee webp-container-spec: change SHOULD to MUST w/ANIM chunk
+1dc59435 webp-container-spec: add unknown fields MUST be ignored
+280a810f webp-container-spec: make padding byte=0 a MUST
+41f0bf68 webp-container-spec: update note on trailing data
+6bdd36db webp-container-spec: clarify Chunk Size is in bytes
+87e36c48 Merge "webp_js/README.md,cosmetics: reflow some lines" into main
+5b01f321 Merge "Update Windows makefile to build libsharpyuv library." into main
+19b1a71c webp_js/README.md,cosmetics: reflow some lines
+780db756 Update Windows makefile to build libsharpyuv library.
+e407d4b3 CMakeLists.txt: replace GLUT_glut_LIBRARY w/GLUT::GLUT
+abf73d62 Merge "WebPConfig.cmake.in: add find_dependency(Threads)" into main
+25807fb4 Merge "cmake: restore compatibility with cmake < 3.12" into main
+5dbc4bfa WebPConfig.cmake.in: add find_dependency(Threads)
+b2a175dd Merge "Update wasm instructions." into main
+cb90f76b Update wasm instructions.
+02d15258 cmake: restore compatibility with cmake < 3.12
+5ba046e2 CMake: add_definitions -> add_compile_options
+e68765af dsp,neon: use vaddv in a few more places
+e8f83de2 Set libsharpyuv include dir to 'webp' subdirectory.
+15a91ab1 cmake,cosmetics: apply cmake-format
+0dd49d1a CMakeLists.txt: set @ONLY in configure_file() calls
+62b1bfe8 Merge changes I2877e7bb,I777cad70,I15af7d1a,I686e6740,If10538a9, ... into main
+95c8fe5f Merge changes Iecea3603,I9dc228ab into main
+e7c805cf picture_csp_enc.c: remove SafeInitSharpYuv
+6af8845a sharpyuv: prefer webp/types.h
+639619ce cmake: fix dll exports
+782ed48c sharpyuv,SharpYuvInit: add mutex protection when available
+cad0d5ad sharyuv_{neon,sse2}.c: merge WEBP_USE_* sections
+ef70ee06 add a few missing <stddef.h> includes for NULL
+f0f9eda4 sharpyuv.h: remove <inttypes.h>
+9b902cba Merge "picture_csp_enc.c,CheckNonOpaque: rm unneeded local" into main
+9c1d457c cmake/cpu.cmake: remove unused variable
+9ac25bcb CMakeLists.txt,win32: match naming convention used by nmake
+76c353ba picture_csp_enc.c,CheckNonOpaque: rm unneeded local
+5000de54 Merge "cwebp: fix WebPPictureHasTransparency call" into main
+e1729309 Merge "WebPPictureHasTransparency: add missing pointer check" into main
+00ff988a vp8l_enc,AddSingleSubGreen: clear int sanitizer warnings
+e2fecc22 dsp/lossless_enc.c: clear int sanitizer warnings
+129cf9e9 dsp/lossless.c: clear int sanitizer warnings
+ad7d1753 dsp/lossless_enc.c: clear int sanitizer warnings
+5037220e VP8LSubtractGreenFromBlueAndRed_C: clear int sanitizer warnings
+2ee786c7 upsampling_sse2.c: clear int sanitizer warnings
+4cc157d4 ParseOptionalChunks: clear int sanitizer warning
+892cf033 BuildHuffmanTable: clear int sanitizer warning
+3a9a4d45 VP8GetSigned: clear int sanitizer warnings
+704a3d0a dsp/lossless.c: quiet int sanitizer warnings
+1a6c109c WebPPictureHasTransparency: add missing pointer check
+c626e7d5 cwebp: fix WebPPictureHasTransparency call
+866e349c Merge tag 'v1.2.4'
+c170df38 Merge "Create libsharpyuv.a in makefile.unix." into main
+9d7ff74a Create libsharpyuv.a in makefile.unix.
+0d1f1254 update ChangeLog (tag: v1.2.4)
+fcbc2d78 Merge "doc/*.txt: restrict code to 69 columns" into main
+4ad0e189 Merge "webp-container-spec.txt: normalize fourcc spelling" into main
+980d2488 update NEWS
+9fde8127 bump version to 1.2.4
+7a0a9935 doc/*.txt: restrict code to 69 columns
+c040a615 webp-container-spec.txt: normalize fourcc spelling
+aff1c546 dsp,x86: normalize types w/_mm_cvtsi128_si32 calls
+ab540ae0 dsp,x86: normalize types w/_mm_cvtsi32_si128 calls
+8980362e dsp,x86: normalize types w/_mm_set* calls (2)
+e626925c lossless: fix crunch mode w/WEBP_REDUCE_SIZE
+83539239 dsp,x86: normalize types w/_mm_set* calls
+8a4576ce webp-container-spec.txt: replace &amp; with &
+db870881 Merge "webp-container-spec.txt: make reserved 0 values a MUST" into main
+01d7d378 webp-lossless-bitstream-spec: number all sections
+337cf69f webp-lossless-bitstream-spec: mv Nomenclature after Intro
+79be856e Merge changes I7111d1f7,I872cd62c into main
+5b87983a webp-container-spec.txt: make reserved 0 values a MUST
+bd939123 Merge changes I7a25b1a6,I51b2c2a0,I87d0cbcf,I6ec60af6,I0a3fe9dc into main
+04764b56 libwebp.pc: add libsharpyuv to requires
+7deee810 libsharpyuv: add pkg-config file
+1a64a7e6 webp-container-spec.txt: clarify some SHOULDs
+bec2c88a webp-container-spec.txt: move ChunkHeader to terminology
+c9359332 webp-container-spec.txt: clarify 'VP8 '/'XMP ' fourccs
+70fe3063 webp-container-spec.txt: rightsize table entries
+ddbf3f3f webp-container-spec.txt: update 'key words' text
+c151e95b utils.h,WEBP_ALIGN: make bitmask unsigned
+748e92bb add WebPInt32ToMem
+3fe15b67 Merge "Build libsharpyuv as a full installable library." into main
+4f402f34 add WebPMemToInt32
+a3b68c19 Build libsharpyuv as a full installable library.
+b4994eaa CMake: set rpath for shared objects
+94cd7117 Merge "CMake: fix dylib versioning" into main
+e91451b6 Fix the lossless specs a bit more.
+231bdfb7 CMake: fix dylib versioning
+bfad7ab5 CMakeLists.txt: correct libwebpmux name in WebPConfig.cmake
+c2e3fd30 Revert "cmake: fix webpmux lib name for cmake linking"
+7366f7f3 Merge "lossless: fix crunch mode w/WEBP_REDUCE_SIZE" into main
+84163d9d lossless: fix crunch mode w/WEBP_REDUCE_SIZE
+d01c1eb3 webp-lossless-bitstream-spec,cosmetics: normalize capitalization
+8813ca8e Merge tag 'v1.2.3'
+3c4a0fbf update ChangeLog (tag: v1.2.3)
+56a480e8 dsp/cpu.h: add missing extern "C"
+62b45bdd update ChangeLog (tag: v1.2.3-rc1)
+8764ec7a Merge changes Idb037953,Id582e395 into 1.2.3
+bcb872c3 vwebp: fix file name display in windows unicode build
+67c44ac5 webpmux: fix -frame option in windows unicode build
+8278825a makefile.unix: add sharpyuv objects to clean target
+14a49e01 update NEWS
+34b1dc33 bump version to 1.2.3
+0b397fda update AUTHORS
+c16488ac update .mailmap
+5a2d929c Merge "unicode.h: set console mode before using wprintf" into main
+169f867f unicode.h: set console mode before using wprintf
+a94b855c Merge "libsharpyuv: add version defines" into main
+f83bdb52 libsharpyuv: add version defines
+bef0d797 unicode_gif.h: fix -Wdeclaration-after-statement
+404c1622 Rename Huffman coding to prefix coding in the bitstream spec
+8895f8a3 Merge "run_static_analysis.sh: fix scan-build archive path" into main
+92a673d2 Merge "Add -fvisibility=hidden flag in CMakeLists." into main
+67c1d722 Merge "add WEBP_MSAN" into main
+1124ff66 Add -fvisibility=hidden flag in CMakeLists.
+e15b3560 add WEBP_MSAN
+ec9e782a sharpyuv: remove minimum image size from sharpyuv library
+7bd07f3b run_static_analysis.sh: fix scan-build archive path
+5ecee06f Merge "sharpyuv: increase precision of gamma<->linear conversion" into main
+f81dd7d6 Merge changes I3d17d529,I53026880,I1bd61639,I6bd4b25d,Icfec8fba into main
+2d607ee6 sharpyuv: increase precision of gamma<->linear conversion
+266cbbc5 sharpyuv: add 32bit version of SharpYuvFilterRow.
+9fc12274 CMake: add src to webpinfo includes
+7d18f40a CMake: add WEBP_BUILD_WEBPINFO to list of checks for exampleutil
+11309aa5 CMake: add WEBP_BUILD_WEBPMUX to list of checks for exampleutil
+4bc762f7 CMake: link imageioutil to exampleutil after defined
+0d1b9bc4 WEBP_DEP_LIBRARIES: use Threads::Threads
+20ef48f0 Merge "sharpyuv: add support for 10/12/16 bit rgb and 10/12 bit yuv." into main
+93c54371 sharpyuv: add support for 10/12/16 bit rgb and 10/12 bit yuv.
+53cf2b49 normalize WebPValidatePicture declaration w/definition
+d3006f4b sharpyuv: slightly improve precision
+ea967098 Merge changes Ia01bd397,Ibf3771af into main
+11bc8410 Merge changes I2d317c4b,I9e77f6db into main
+30453ea4 Add an internal WebPValidatePicture.
+6c43219a Some renamings for consistency.
+4f59fa73 update .mailmap
+e74f8a62 webp-lossless-bitstream-spec,cosmetics: normalize range syntax
+5a709ec0 webp-lossless-bitstream-spec,cosmetics: fix code typo
+a2093acc webp-lossless-bitstream-spec: add amendment note
+86c66930 webp-lossless-bitstream-spec: fix BNF
+232f22da webp-lossless-bitstream-spec: fix 'simple code' snippet
+44dd765d webp-lossless-bitstream-spec: fix ColorTransform impl
+7a7e33e9 webp-lossless-bitstream-spec: fix TR-pixel right border note
+86f94ee0 Update lossless spec with Huffman codes.
+a3927cc8 sharpyuv.c,cosmetics: fix indent
+6c45cef7 Make sure the stride has a minimum value in the importer.
+0c8b0e67 sharpyuv: cleanup/cosmetic changes
+dc3841e0 {histogram,predictor}_enc: quiet int -> float warnings
+a19a25bb Replace doubles by floats in lossless misc cost estimations.
+42888f6c Add an option to enable static builds.
+7efcf3cc Merge "Fix typo in color constants: Marix -> Matrix" into main
+8f4b5c62 Fix typo in color constants: Marix -> Matrix
+90084d84 Merge "demux,IsValidExtendedFormat: remove unused variable" into main
+ed643f61 Merge changes I452d2485,Ic6d75475 into main
+8fa053d1 Rename SharpYUV to SharpYuv for consistency.
+99a87562 SharpYuvComputeConversionMatrix: quiet int->float warnings
+deb426be Makefile.vc: add sharpyuv_csp.obj to SHARPYUV_OBJS
+779597d4 demux,IsValidExtendedFormat: remove unused variable
+40e8aa57 Merge "libsharpyuv: add colorspace utilities" into main
+01a05de1 libsharpyuv: add colorspace utilities
+2de4b05a Merge changes Id9890a60,I376d81e6,I1c958838 into main
+b8bca81f Merge "configure.ac: use LT_INIT if available" into main
+e8e77b9c Merge changes I479bc487,I39864691,I5d486c2c,I186d13be into main
+7e7d5d50 Merge ".gitignore: add Android Studio & VS code dirs" into main
+10c50848 normalize label indent
+89f774e6 mux{edit,internal}: fix leaks on error
+2d3293ad ExUtilInitCommandLineArguments: fix leak on error
+ec34fd70 anim_util: fix leaks on error
+e4717287 gif2webp: fix segfault on OOM
+e3cfafaf GetBackwardReferences: fail on alloc error
+a828a59b BackwardReferencesHashChainDistanceOnly: fix segfault on OOM
+fe153fae VP8LEncodeStream: fix segfault on OOM
+919acc0e .gitignore: add Android Studio & VS code dirs
+efa0731b configure.ac: use LT_INIT if available
+0957fd69 tiffdec: add grayscale support
+e685feef Merge "Make libsharpyuv self-contained by removing dependency on cpu.c" into main
+841960b6 Make libsharpyuv self-contained by removing dependency on cpu.c
+617cf036 image_dec: add WebPGetEnabledInputFileFormats()
+7a68afaa Let SharpArgbToYuv caller pass in an RGB>YUV conversion matrix.
+34bb332c man/cwebp.1: add note about crop/resize order
+f0e9351c webp-lossless-bitstream-spec,cosmetics: fix some typos
+5ccbd6ed vp8l_dec.c,cosmetics: fix a few typos
+c3d0c2d7 fix ios build scripts after sharpyuv dep added
+d0d2292e Merge "Make libwebp depend on libsharpyuv." into main
+03d12190 alpha_processing_neon.c: fix 0x01... typo
+d55d447c Make libwebp depend on libsharpyuv.
+e4cbcdd2 Fix lossless encoding for MIPS.
+924e7ca6 alpha_processing_neon.c: fix Dispatch/ExtractAlpha_NEON
+0fa0ea54 Makefile.vc: use /MANIFEST:EMBED
+29cc95ce Basic version of libsharpyuv in libwebp, in C.
+a30f2190 examples/webpmux.c: fix a couple of typos
+66b3ce23 Fix bad overflow check in ReadTIFF()
+54e61a38 Markdownify libwebp docs and reorganize them.
+b4533deb CMakeLists.txt,cosmetics: break long line
+b9d2f9cd quant_enc.c: use WEBP_RESTRICT qualifier
+ec178f2c Add progress hook granularity in lossless
+26139c73 Rename MAX_COST to MAX_BIT_COST in histogram_enc.c
+13b82816 cmake: fix webpmux lib name for cmake linking
+88b6a396 webp-container-spec.txt,cosmetics: normalize formatting
+6f496540 Merge tag 'v1.2.2'
+4074acf8 dsp.h: bump msvc arm64 version requirement to 16.6
+b0a86089 update ChangeLog (tag: v1.2.2)
+6db8248c libwebp: Fix VP8EncTokenLoop() progress
+827a307f BMP enc: fix the transparency case
+db25f1b4 libwebp: Fix VP8EncTokenLoop() progress
+286e7fce libwebp: do not destroy jpeg codec twice on error
+6e8a4126 libwebp: do not destroy jpeg codec twice on error
+faf21968 Merge "BMP enc: fix the transparency case" into main
+480cd51d BMP enc: fix the transparency case
+9195ea05 update ChangeLog (tag: v1.2.2-rc2)
+4acae017 update NEWS
+883f0633 man/img2webp.1: update date
+567e1f44 Reword img2webp synopsis command line
+1b0c15db man/img2webp.1: update date
+17bade38 Merge "Reword img2webp synopsis command line" into main
+a80954a1 Reword img2webp synopsis command line
+f084244d anim_decode: fix alpha blending with big-endian
+b217b4ff webpinfo: fix fourcc comparison w/big-endian
+ec497b75 Merge "anim_decode: fix alpha blending with big-endian" into main
+e4886716 anim_decode: fix alpha blending with big-endian
+e3cb052c webpinfo: fix fourcc comparison w/big-endian
+a510fedb patch-check: detect duplicated files
+f035d2e4 update ChangeLog (tag: v1.2.2-rc1)
+7031946a update NEWS
+973390b6 bump version to 1.2.2
+abd6664f update AUTHORS
+5b7e7930 Merge "add missing USE_{MSA,NEON} checks in headers" into main
+02ca04c3 add missing USE_{MSA,NEON} checks in headers
+e94716e2 xcframeworkbuild.sh: place headers in a subdir
+c846efd8 patch-check: commit subject length check
+b6f756e8 update http links
+8f5cb4c1 update rfc links
+8ea81561 change VP8LPredictorFunc signature to avoid reading 'left'
+6b1d18c3 webpmux: fix the -bgcolor description
+3368d876 Merge "webpmux: add "-set bgcolor A,R,G,B"" into main
+f213abf6 webpinfo: print the number of warnings
+50c97c30 webpmux: add "-set bgcolor A,R,G,B"
+2c206aaf Remove CMakeLists.txt check in compile.sh
+96e3dfef Merge "infra/common.sh: add shard_should_run()" into main
+0e0f74b7 infra/common.sh: add shard_should_run()
+35b7436a Jenkins scripts port: update shell function comments
+21d24b4c webp-container-spec.txt: remove 'experimental' markers
+cdcf8902 Merge "Port Jenkins script: compile" into main
+dc683cde Jenkins scripts port: static analysis
+0858494e Port Jenkins script: compile
+c2cf6a93 Jenkins scripts port: android compilation
+df0e808f presubmit: Add pylint-2.7 and .pylintrc
+676c57db patch-check: shfmt
+7bb7f747 patch-check: Add shellcheck
+abcd1797 Reformat docstrings and imports
+edaf0895 Port Jenkins scripts: compile js
+b9622063 Set CheckPatchFormatted flags to fail on diffs
+e23cd548 dsp.h: enable NEON w/VS2019+ ARM64 targets
+3875c7de CMakeLists.txt: set minimum version to 3.7
+1a8f0d45 Have a hard-coded value for memset in TrellisQuantizeBlock.
+93480160 Speed up TrellisQuantizeBlock
+45eaacc9 Convert deprecated uint32 to uint32_t.
+42592af8 webp,cmake: Remove unnecessary include dirs
+e298e05f Add patch-check steps in PRESUBMIT.py
+29148919 Merge tag 'v1.2.1'
+9ce5843d update ChangeLog (tag: v1.2.1)
+d9191588 fuzzer/*: normalize src/ includes
+c5bc3624 fuzzer/*: normalize src/ includes
+53b6f762 fix indent
+d2caaba4 fix indent
+731246ba update ChangeLog (tag: v1.2.1-rc2)
+d250f01d dsp/*: use WEBP_HAVE_* to determine Init availability
+1fe31625 dsp/*: use WEBP_HAVE_* to determine Init availability
+3a4d3ecd update NEWS
+b2bc8093 bump version to 1.2.1
+e542fc7a update AUTHORS
+e0241154 Merge "libwebp/CMake: Add <BUILD_INTERFACE> to webp incl" into main
+edea6444 libwebp/CMake: Add <BUILD_INTERFACE> to webp incl
+ece18e55 dsp.h: respect --disable-sse2/sse4.1/neon
+a89a3230 wicdec: support alpha from WebP WIC decoder
+26f4aa01 Merge "alpha_processing: fix visual studio warnings" into main
+8f594663 alpha_processing: fix visual studio warnings
+46d844e6 Merge "cpu.cmake: fix compiler flag detection w/3.17.0+" into main
+298d26ea Merge changes I593adf92,If20675e7,Ifac68eac into main
+a1e5dae0 alpha_processing*: use WEBP_RESTRICT qualifier
+327ef24f cpu.cmake: fix compiler flag detection w/3.17.0+
+f70819de configure: enable libwebpmux by default
+dc7e2b42 configure: add informational notices when disabling binaries
+9df23ddd configure: move lib flag checks before binaries
+a2e18f10 Merge "WebPConfig.config.in: correct WEBP_INCLUDE_DIRS" into main
+e1a8d4f3 Merge "bit_reader_inl_utils: uniformly apply WEBP_RESTRICT" into main
+4de35f43 rescaler.c: fix alignment
+0f13eec7 bit_reader_inl_utils: uniformly apply WEBP_RESTRICT
+277d3074 Fix size_t overflow in  WebPRescalerInit
+97adbba5 WebPConfig.config.in: correct WEBP_INCLUDE_DIRS
+b60d4603 advanced_api_fuzzer: add extreme config value coverage
+72fe52f6 anim_encode.c,cosmetics: normalize indent
+116d235c anim_encode: Fix encoded_frames_[] overflow
+6f445b3e CMake: set CMP0072 to NEW
+b1cf887f define WEBP_RESTRICT for MSVC
+3e265136 Add WEBP_RESTRICT & use it in VP8BitReader
+f6d29247 vp8l_dec::ProcessRows: fix int overflow in multiply
+de3b4ba8 CMake: add WEBP_BUILD_LIBWEBPMUX
+7f09d3d1 CMakeLists.txt: rm libwebpmux dep from anim_{diff,dump}
+4edea4a6 Init{RGB,YUV}Rescaler: fix a few more int overflows
+c9e26bdb rescaler_utils: set max valid scaled w/h to INT_MAX/2
+28d488e6 utils.h: add SizeOverflow()
+695bdaa2 Export/EmitRescaledRowsRGBA: fix pointer offset int overflow
+685d073e Init{RGB,YUV}Rescaler: fix int overflows in multiplication
+d38bd0dd WebPFlipBuffer: fix integer overflow
+109ff0f1 utils: allow MALLOC_LIMIT to indicate a max
+a2fce867 WebPRescalerImportRowExpand_C: promote some vals before multiply
+776983d4 AllocateBuffer: fix int multiplication overflow check
+315abbd6 Merge "Revert "Do not use a palette for one color images.""
+eae815d0 Merge changes Ica3bbf75,I82f82954
+afbca5a1 Require Emscripten 2.0.18
+3320416b CMakeLists,emscripten: use EXPORTED_RUNTIME_METHODS
+29145ed6 Update README instructions for using Emscripten
+1f579139 cosmetics: remove use of 'sanity' / 'master'
+29b6129c WebPAnimEncoderNewInternal: remove some unnecessary inits
+b60869a1 Revert "Do not use a palette for one color images."
+6fb4cddc demux: move padded size calc post unpadded validation
+05b72d42 vp8l_enc.c: normalize index types
+b6513fba Do not use a palette for one color images.
+98bbe35b Fix multi-threading with palettes.
+b1674240 Add modified Zeng's method to palette sorting.
+88c90c45 add CONTRIBUTING.md
+6a9916d7 WebPRescalerInit: add missing int64_t promotion
+b6cf52d5 WebPIoInitFromOptions: treat use_scaling as a bool
+3b12b7f4 WebPIoInitFromOptions: treat use_cropping as a bool
+595fa13f add WebPCheckCropDimensions()
+8fdaecb0 Disable cross-color when palette is used.
+8933bac2 WebPIoInitFromOptions: respect incoming bypass_filtering val
+7d416ff0 webpdec,cosmetics: match error text to function call
+ec6cfeb5 Fix typo on WebPPictureAlloc() in README
+7e58a1a2 *.cmake: add license header
+5651a6b2 cmake: fix .so versioning
+25ae67b3 xcframeworkbuild.sh: add arm64 simulator target
+5d4ee4c3 cosmetics: remove use of the term 'dummy'
+01b38ee1 faster CollectColorXXXTransforms_SSE41
+652aa344 Merge "Use BitCtz for FastSLog2Slow_C"
+0320e1e3 add the missing default BitsCtz() code
+8886f620 Use BitCtz for FastSLog2Slow_C
+fae41617 faster CombinedShannonEntropy_SSE2
+5bd2704e Introduce the BitCtz() function.
+fee64287 Merge "wicdec,icc: treat unsupported op as non-fatal"
+33ddb894 lossless_sse{2,41}: remove some unneeded includes
+b27ea852 wicdec,icc: treat unsupported op as non-fatal
+b78494a9 Merge "Fix undefined signed shift."
+e79974cd Fix undefined signed shift.
+a8853394 SSE4.1 versions of BGRA to RGB/BGR color-space conversions
+a09a6472 SSE4.1 version of TransformColorInverse
+401da22b Merge "pngdec: check version before using png_get_chunk_malloc_max"
+26907822 pngdec: check version before using png_get_chunk_malloc_max
+06c1e72e Code cleanup
+8f0d41aa Merge changes Id135bbf4,I99e59797
+373eb170 gif2webp: don't store loop-count if there's only 1 frame
+759b9d5a cmake: add WEBP_USE_THREAD option
+926ce921 cmake: don't install binaries from extras/
+9c367bc6 WebPAnimDecoderNewInternal: validate bitstream before alloc
+47f64f6e filters_sse2: import Chromium change
+cc3577e9 fuzzer/*: use src/ based include paths
+004d77ff Merge tag 'v1.2.0'
+fedac6cc update ChangeLog (tag: v1.2.0-rc3, tag: v1.2.0)
+170a8712 Fix check_c_source_compiles with pthread.
+ceddb5fc Fix check_c_source_compiles with pthread.
+85995719 disable CombinedShannonEntropy_SSE2 on x86
+289757fe TiffDec: enforce stricter mem/dimension limit on tiles
+8af7436f Merge "{ios,xcframework}build.sh: make min version(s) more visible" into 1.2.0
+e56c3c5b pngdec: raise memory limit if needed
+8696147d pngdec: raise memory limit if needed
+13b8e9fe {ios,xcframework}build.sh: make min version(s) more visible
+a9225410 animdecoder_fuzzer: fix memory leak
+d6c2285d update gradle to 6.1.1
+8df77fb1 animdecoder_fuzzer: fix memory leak
+52ce6333 update NEWS
+28c49820 bump version to 1.2.0
+7363dff2 webp/encode.h: restore WEBP_ENCODER_ABI_VERSION to v1.1.0
+826aafa5 update AUTHORS
+63258823 animdecoder_fuzzer: validate canvas size
+9eb26381 CMake: remove duplicate "include(GNUInstallDirs)"
+2e7bed79 WebPPicture: clarify the ownership of user-owned data.
+cccf5e33 webpmux: add an '-set loop <value>' option
+c9a3f6a1 Merge changes Ie29f9867,I289c54c4
+319f56f1 iosbuild.sh: sync some aspects of xcframeworkbuild.sh
+e8e8db98 add xcframeworkbuild.sh
+ae545534 dsp.h: allow config.h to override MSVC SIMD autodetection
+fef789f3 Merge "cmake: fix per-file assembly flags"
+fc14fc03 Have C encoding predictors use decoding predictors.
+7656f0b3 README,cosmetics: fix a couple typos
+d2e245ea cmake: disable webp.js if WEBP_ENABLE_SIMD=1
+96099a79 cmake: fix per-file assembly flags
+5abb5582 Merge "cmake: fix compilation w/Xcode generator"
+8484a120 cmake: fix compilation w/Xcode generator
+d7bf01c9 Merge changes Ifcae0f38,Iee2d7401
+36c81ff6 WASM-SIMD: port 2 patches from rreverser@'s tree
+988b02ab Merge "Couple of fixes to allow SIMD on Emscripten"
+26faf770 wicdec: fail with animated images
+ab2d08a8 [cd]webp: document lack of animated webp support
+52273943 Couple of fixes to allow SIMD on Emscripten
+8870ba7f Fix skia bug #10952
+4b3c6953 Detect if StoreFrame read more than anmf_payload_size bytes
+17fd4ba8 webp/decode.h,cosmetics: normalize 'flip' comment
+411d3677 remove some unreachable break statements
+3700ffd7 WebPPictureHasTransparency: remove unreachable return
+83604bf3 {animencoder,enc_dec}_fuzzer: convert some abort()s to returns
+eb44119c Merge changes I8ae09473,I678c8b1e
+9f6055fc fuzz_utils.h: rename max() to Max()
+695788e7 fuzz_utils.h: make functions WEBP_INLINE
+906c1fcd make ImgIoUtilReadFile use WebPMalloc instead of malloc
+8cb7e536 rename demux_api_fuzzer.c -> mux_demux_api_fuzzer.c
+443db47d add animdecoder_fuzzer.cc
+36a6eea3 Merge "import fuzzers from oss-fuzz/chromium"
+ec5f12c1 Makefile.vc: remove deprecated /Gm option
+64425a08 picture_tools_enc: fix windows build warning
+bd94090a import fuzzers from oss-fuzz/chromium
+cf847cba use WEBP_DSP_INIT_FUNC for Init{GammaTables*,GetCoeffs}
+55a080e5 Add WebPReplaceTransparentPixels() in dsp
+84739717 GetBackgroundColorGIF: promote to uint32_t before << 24
+def64e92 cwebp: Fix -print_psnr for near_lossless
+cf2f88b3 Add palette and spatial for q >= 75 and -m 5
+f0110bae Add no-color cache configuration to the cruncher
+749a8b99 Better estimate of the cache cost.
+4f9f00cc Use spatial predictors on top of palette no matter what.
+7658c686 Add spatial prediction on top of palette in cruncher.
+133ff0e3 webp_js: force WASM=0 option explicitly
+e3c259a2 Fix integer overflow in EmitFancyRGB.
+b3ff0bde man/{gif2,img2}webp,webpmux: normalize some wording
+f9b30586 fix ABI breakage introduced by 6a0ff358
+1d58dcfc README.webp_js: update note about emscripten version
+44070266 README.webp_js: s/fastcomp/upstream/
+2565fa8f README.webp_js: update cmake command
+47309ef5 webp: WEBP_OFFSET_PTR()
+687ab00e DC{4,8,16}_NEON: replace vmovl w/vaddl
+1b92fe75 DC16_NEON,aarch64: use vaddlv
+53f3d8cf dec_neon,DC8_NEON: use vaddlv instead of movl+vaddv
+27d08240 Fix integer overflow in WebPAnimDecoderGetNext()
+69776e38 Merge "remove call to MBAnalyzeBestIntra4Mode for method >= 5"
+a99078c1 remove call to MBAnalyzeBestIntra4Mode for method >= 5
+22e404cc CMakeLists.txt: fix set(CACHE) argument order
+71690b52 fix MSVC warning
+6a0ff358 Enc: add a qmin / qmax range for quality factor
+0fa56f30 Merge tag 'v1.1.0'
+6cf504d0 PNM decoding: handle max_value != 255
+d7844e97 update ChangeLog (tag: v1.1.0-rc2, tag: v1.1.0)
+7f006436 Makefile.vc: fix webp_quality.exe link
+cf047e83 Makefile.vc: fix webp_quality.exe link
+c074c653 update NEWS
+30f09551 bump version to 1.1.0
+a76694a1 update AUTHORS
+6e3ef7b3 extras: fix WEBP_SWAP_16BIT_CSP check
+47178dbd extras: add WebPUnmultiplyARGB() convenience function
+22cbae33 idec_dec: fix 0 offset of NULL pointer
+290dd0b4 muxread: fix 0 offset of NULL pointer
+0df474ac Merge "lossless_(enc_|)sse2: avoid offsetting a NULL pointer"
+c6b75a19 lossless_(enc_|)sse2: avoid offsetting a NULL pointer
+295e5e38 fix UBSAN warning
+e2575e05 DC8_NEON,aarch64: use vaddv
+b0e09e34 dec_neon: Fix build failure under some toolchains
+cf0e903c dsp/lossless: Fix non gcc ARM builds
+bb7bc40b Remove ubsan errors.
+78881b76 CMake: fix GLUT library link
+9f750f7a cmake: fix BUILD_SHARED_LIBS build on mac
+17850e74 libwebp: Remove char-subscripts warning in pnmdec.c
+2fa2552d Merge "Expose WebPMalloc() in addition to WebPFree()"
+a4df4aae Expose WebPMalloc() in addition to WebPFree()
+853ea3d8 imageio/tiff: Return error before allocating bad tile size
+af650c0b Fix a Wxor-used-as-pow false positive
+601ef17c libwebp.py: update to swig 3.0.12
+0e48d889 bugfix: last alpha rows were incorrectly decoded
+24d2ccb4 webp: Fix imageio ReadPNM() TUPLTYPE
+fab8f9cf cosmetics: normalize '*' association
+94138e0e update .gitignore
+0fe1a89d update ChangeLog (tag: v1.0.3-rc1, tag: v1.0.3)
+2ad0916d update NEWS
+1287362b bump version to 1.0.3
+7b968cc2 update AUTHORS
+9d6988f4 Fix the oscillating prediction problem at low quality
+312f74d0 makefile.unix: allow *_LIBS to be overridden w/EXTRA_LIBS
+92dbf237 filters_sse2,cosmetics: shorten some long lines
+a277d197 filters_sse2.c: quiet integer sanitizer warnings
+804540f1 Fix cpufeatures in CMake.
+bf00c15b Add CMake option for bittrace.
+a788b498 filters_sse2.c: quiet integer sanitizer warnings
+e6a92c5e filters.c: quiet integer sanitizer warnings
+ec1cc40a lossless.c: remove U32 -> S8 conversion warnings
+1106478f remove conversion U32 -> S8 warnings
+812a6b49 lossless_enc: fix some conversion warning
+4627c1c9 lossless_enc,TransformColorBlue: quiet uint32_t conv warning
+c84673a6 lossless_enc_sse{2,41}: quiet signed conv warnings
+776a7757 dec_sse2: quiet signed conv warnings
+bd39c063 Merge "thread_utils: release mutex before signaling"
+0550576f Merge "(alpha_processing,enc}_sse2: quiet signed conv warnings"
+6682f2c4 thread_utils: release mutex before signaling
+e78dea75 (alpha_processing,enc}_sse2: quiet signed conv warnings
+9acf18ba iosbuild.sh: add WebP{Demux,Mux}.framework
+b9be7e65 vwebp: remove the -fit option (and make it default)
+1394a2bb Merge "README.webp_js: update Emscripten.cmake note"
+dd3e7f8a README.webp_js: update Emscripten.cmake note
+32cf8801 predictor_enc,GetBestGreenRedToBlue: quiet implicit conv warnings
+e1c8acb5 Merge "vwebp: add a -fit option"
+cbd23dd5 vwebp: add a -fit option
+2e672351 bit_writer_utils,Flush: quiet implicit conversion warnings
+1326988d swig: update libwebp_python_wrap.c
+0e7f8548 update generated swig files
+17ed1438 Merge "PutLE{16,24}: quiet implicit conversion warnings"
+24686538 PutLE{16,24}: quiet implicit conversion warnings
+153bb3a0 fix some clang-7 warnings:
+ab2dc893 Rescaler: fix rounding error
+aa65f89a HistogramCombineStochastic: fix free of uninit value
+af0bac64 Merge "encode.h: mention 'exact' default in WebPEncodeLossless*"
+6d2e11ec encode.h: mention 'exact' default in WebPEncodeLossless*
+8c3f04fe AndroidCPUInfo: reorder terms in conditional
+fcfd9c71 BitTrace: if BITTRACE is > 0, record and print syntax bits used
+067031ea Speedups for unused Huffman groups.
+01ac46ba libwebp: Display "libjpeg error:" in imageio/jpegdec
+d9a662e1 WebPRescalerGetScaledDimensions: round scaled dimension up
+62eb3f08 libwebp: Fix missing '{' in README
+e05f785a Merge "unicode,INIT_WARGV: add missing cast"
+63c9a69f tag the VP8LHashPix() function for potential uint roll-over
+2b7214ab unicode,INIT_WARGV: add missing cast
+bf424b46 tag the GetPixPairHash64() function for potential uint roll-over
+7d05d6ca Have the color cache computation be u32-bit only.
+6bcf8769 Remove BINARYEN_METHOD in wasm settings.
+2b98df90 update ChangeLog (tag: v1.0.2-rc1, tag: v1.0.2)
+61e372b7 update NEWS
+7ae658a0 bump version to 1.0.2
+51c4907d update AUTHORS
+666bd6c6 man/cwebp.1: refine near-lossless text
+561cdce5 Clarify the doc about GetFeatures.
+aec2cf02 near_lossless: fix fuzzing-detected integer overflow
+928a75de webp: Fix VP8LBitWriterClone() bug
+5173d4ee neon IsFlat
+5b081219 IsFlat: inline when possible
+381b7b54 IsFlat: use int for thresh
+6ed15ea1 fix unprobable leak in webp_sdl.c
+22bbb24e Merge "IsFlat: return int"
+8b3fb238 Merge tag 'v1.0.1'
+f435de95 IsFlat: return int
+41521aed utils.h: only define WEBP_NEED_LOG_TABLE_8BIT when needed
+9f4d4a3f neon: GetResidualCost
+0fd7514b neon: SetResidualCoeffs
+f95a996c Simpler histogram clustering.
+e85d3313 update ChangeLog (tag: v1.0.1-rc2, tag: v1.0.1)
+fa8210e4 Fix pair update in stochastic entropy merging.
+fd198f73 add codereview.settings
+825389ac README.mux: add a reference to the AnimDecoder API
+3be698c3 CMake: fix webp_js compilation
+485ff86f Fix pair update in stochastic entropy merging.
+4cd0582d CMake: fix webp_js compilation
+4cbb4caf update NEWS
+f5a5918d bump version to 1.0.1
+d61385db Speed-up: Make sure we only initialize histograms when needed.
+6752904b Speed-up: Make sure we only initialize histograms when needed.
+0c570316 update AUTHORS
+301a2dda img2webp: add help note about arguments from a file
+f0abab92 Speedups for empty histograms.
+f2dfd925 Split HistogramAdd to only have the high level logic in C.
+06b7bc7d Fix compilation on windows and clang-cl+ninja.
+b6284d82 img2webp: add help note about arguments from a file
+decf6f6b Speedups for empty histograms.
+dea3e899 Split HistogramAdd to only have the high level logic in C.
+632798ae Merge "Fix compilation on windows and clang-cl+ninja."
+dc1a9518 Merge "libwebp: Unicode command tools on Windows"
+9cf9841b libwebp: Unicode command tools on Windows
+98179495 remove some minor TODOs
+a376e7b9 Fix compilation on windows and clang-cl+ninja.
+cbf82cc0 Remove AVX2 files.
+5030e902 Merge "TIFF decoder: remove unused KINV definition"
+ac543311 Remove a few more useless #defines
+123d3306 TIFF decoder: remove unused KINV definition
+ef1094b0 Merge "- install pkg-config files during the CMake build"
+b911fbc9 libwebp: Remove duplicate GIFDisplayError in anim_util
+eee00b66 - install pkg-config files during the CMake build
+ac3ec8c9 Merge "Clean-up the common sources in dsp."
+3e13da7b Clean-up the common sources in dsp.
+5c395f1d libwebp: cmake-format all
+e7a69729 libwebp: Add extras targets in CMakeLists.txt
+e52485d6 libwebp: Rename macros in webpmux.c
+92dc0f09 clean-up MakeInputImageCopy()
+39952de2 VP8IteratorImport: add missing 'const'
+382af7a2 clean-up WebPBlendAlpha
+14d020f6 libwebp: Use ExUtilGet*() in anim_diff
+0d92ff25 libwebp: remove useless variable in gif2webp
+556cb1b4 Merge "CMake: Set WEBP_BUILD_GIF2WEBP to off"
+da26ee49 CMake: Set WEBP_BUILD_GIF2WEBP to off
+b2a867c0 cwebp: Don't premultiply during -resize if -exact
+637141bc pngdec: fix build w/libpng < 1.4.x
+bc5092b1 pngdec: set memory functions
+50d8345a Fix CMake math library.
+6aa3e8aa Fix math library on Visual Studio.
+d71df4e2 Fix math library finding in CMake.
+de08d727 cosmetics: normalize include guard comment
+009562b4 vwebp: Fix bug when Dispose then NoBlend frames
+423f2579 Fix up CMake to create targets.
+907208f9 Wait for all threads to be done in DecodeRemaining.
+4649b3c4 vwebp: Add background color display option
+78ad57a3 Fix bad glClearColor parameters
+da96d8d9 Allow for a non-initialized alpha decompressor in DoRemap.
+2563db47 fix rescaling rounding inaccuracy
+211f37ee fix endian problems in pattern copy
+5f0f5c07 Make sure partition #0 is read before VP8 data in IDecode.
+de98732b fix GetColorf() bug
+4338cd36 misc fixes in libwebpmux
+e00af13e fix signatures after a9ceda7ff1
+a9ceda7f Speed-up chunk list operations.
+2281bbf6 Merge "Better handling of bogus Huffman codes."
+39cb9aad Better handling of bogus Huffman codes.
+89cc9d37 Merge "fix read-overflow while parsing VP8X chunk"
+95fd6507 fix read-overflow while parsing VP8X chunk
+9e729fe1 Fix VP8IoTeardownHook being called twice on worker sync failure
+29fb8562 Merge "muxread,anmf: fail on multiple image chunks"
+eb82ce76 muxread,anmf: fail on multiple image chunks
+1344a2e9 fix alpha-filtering crash when image width is larger than radius
+be738c6d muxread,ChunkVerifyAndAssign: validate chunk_size
+2c70ad76 muxread,CreateInternal: fix riff size checks
+569001f1 Fix for thread race heap-use-after-free
+c56a02d9 Android.mk: use LOCAL_EXPORT_C_INCLUDES w/public libs
+15795596 CMakeLists.txt,cosmetics: normalize if() formatting
+1a44c233 Merge "cmake: add support for webpmux"
+e9569ad7 Merge "configure,*am,cosmetics: s/WANT_/BUILD_/"
+35c7de6f cmake: add support for webpmux
+0f25e61c WebpToSDL(): fix the return value in case of error
+5d8985de configure,*am,cosmetics: s/WANT_/BUILD_/
+895fd28f Merge "man/Makefile.am: add img2webp.1"
+5cf3e2af man/Makefile.am: add img2webp.1
+2a9de5b9 Add build rules for anim_diff & anim_dump utils.
+71ed73cf fix invalid check for buffer size
+af0e4fbb gif2webp: fix transcode of loop count=65535
+dce5d764 Limit memory allocation when reading invalid Huffman codes.
+f9df0081 Merge "cmake: quiet glut deprecation warnings on OS X"
+dc39b16f webpmux.1: correct grammar
+c7aa1264 cwebp.c: fix a missing \n
+53aa51e9 Merge tag 'v1.0.0'
+698b8844 update ChangeLog (tag: v1.0.0)
 8d510751 webp-container-spec: correct frame duration=0 note
 e6b2164e vwebp: Copy Chrome's behavior w/frame duration == 0
+094b3b28 cmake: quiet glut deprecation warnings on OS X
+71c39a06 webp-container-spec: correct frame duration=0 note
+fd3d5756 vwebp: Copy Chrome's behavior w/frame duration == 0
+b0c966fb Build vwebp from CMake.
 d20b7707 update ChangeLog (tag: v1.0.0-rc3)
 0d5fad46 add WEBP_DSP_INIT / WEBP_DSP_INIT_FUNC
+d77bf512 add WEBP_DSP_INIT / WEBP_DSP_INIT_FUNC
 c1cb86af fix 16b overflow in SSE2
 e577feb7 makefile.unix: add DEBUG flag for compiling w/ debug-symbol
 99be34b3 cwebp,get_disto: fix bpp output
+e122e511 cwebp,get_disto: fix bpp output
 f5565ca8 cmake: Make sure we use near-lossless by default.
 d898dc14 fix bug in WebPImport565: alpha value was not set
+1c8f358d Fix CMake with WASM.
+a0215fb7 webp_js: fix webp_js demo html
 882784b0 update ChangeLog (tag: v1.0.0-rc2)
 2f930e08 Revert "Use proper targets for CMake."
 8165e8fb Use proper targets for CMake.
 3f157dd5 Remove some very hard TODOs.
+abb47760 Merge "Use proper targets for CMake."
 cd758a17 {de,}mux/Makefile.am: add missing headers
+e155dda0 Use proper targets for CMake.
 b892b8ba makefile.unix,dist: use ascii for text output
 64a57d05 add -version option to anim_dump,anim_diff and img2webp
+994be82d Merge "Remove some very hard TODOs."
+4033e1d7 Remove some very hard TODOs.
 fc1b8e3a webp_js: fix webp_js demo html
 15aa48d9 update ChangeLog (tag: v1.0.0-rc1)
 e607dabc update AUTHORS
 38410c08 [CFI] Remove function pointer casts
+978eec25 [CFI] Remove function pointer casts
 c57b2736 bump version to 1.0.0
 cba28853 update NEWS
 c909d531 Merge "remove some deprecation warning on MacOSX"
@@ -362,7 +1132,7 @@
 6524fcd6 vwebp_sdl: simple viewer based on SDL
 6cf24a24 get_disto: fix reference file read
 43d472aa Merge tag 'v0.6.0'
-50d1a848 update ChangeLog (tag: v0.6.0, origin/0.6.0, 0.6.0)
+50d1a848 update ChangeLog (tag: v0.6.0, origin/0.6.0)
 20a7fea0 extras/Makefile.am: fix libwebpextras.la reference
 415f3ffe update ChangeLog (tag: v0.6.0-rc3)
 3c6d1224 update NEWS
@@ -439,7 +1209,7 @@
 f04eb376 Merge tag 'v0.5.2'
 341d711c NEON: 5% faster conversion to RGB565 and RGBA4444
 abb54827 remove Clang warnings with unused arch arguments.
-ece9684f update ChangeLog (tag: v0.5.2-rc2, tag: v0.5.2, origin/0.5.2, 0.5.2)
+ece9684f update ChangeLog (tag: v0.5.2-rc2, tag: v0.5.2, origin/0.5.2)
 aa7744ca anim_util: quiet implicit conv warnings in 32-bit
 d9120271 jpegdec: correct ContextFill signature
 24eb3940 Remove some errors when compiling the code as C++.
@@ -726,7 +1496,7 @@
 c0991a14 io,EmitRescaledAlphaYUV: factor out a common expr
 48bf5ed1 build.gradle: remove tab
 bfef6c9f Merge tag 'v0.5.1'
-3d97bb75 update ChangeLog (tag: v0.5.1, origin/0.5.1, 0.5.1)
+3d97bb75 update ChangeLog (tag: v0.5.1, origin/0.5.1)
 deb54d91 Clarify the expected 'config' lifespan in WebPIDecode()
 435308e0 Add MSA optimized encoder transform functions
 dce64bfa Add MSA optimized alpha filter functions
@@ -920,7 +1690,7 @@
 6c1d7631 avoid Yoda style for comparison
 8ce975ac SSE optimization for vector mismatch.
 7db53831 Merge tag 'v0.5.0'
-37f04949 update ChangeLog (tag: v0.5.0-rc1, tag: v0.5.0, origin/0.5.0, 0.5.0)
+37f04949 update ChangeLog (tag: v0.5.0-rc1, tag: v0.5.0, origin/0.5.0)
 7e7b6ccc faster rgb565/rgb4444/argb output
 4c7f565f update NEWS
 1f62b6b2 update AUTHORS
@@ -1704,7 +2474,7 @@
 0524d9e5 dsp: detect mips64 & disable mips32 code
 d3485d96 cwebp.1: fix quality description placement
 29a9fe22 Merge tag 'v0.4.1'
-8af27718 update ChangeLog (tag: v0.4.1, origin/0.4.1, 0.4.1)
+8af27718 update ChangeLog (tag: v0.4.1, origin/0.4.1)
 e09e9ff6 Record & log the image pre-processing time.
 f59c0b4b iosbuild.sh: specify optimization flags
 8d34ea3e update ChangeLog (tag: v0.4.1-rc1)
@@ -2089,7 +2859,7 @@
 effcb0fd Merge tag 'v0.4.0'
 7c76255d autoconf: update ax_pthread.m4
 fff2a11b make -short work with -print_ssim, -print_psnr, etc.
-68e7901d update ChangeLog (tag: v0.4.0-rc1, tag: v0.4.0, origin/0.4.0, 0.4.0)
+68e7901d update ChangeLog (tag: v0.4.0-rc1, tag: v0.4.0, origin/0.4.0)
 256e4333 update NEWS description with new general features
 29625340 Merge "gif2webp: don't use C99 %zu" into 0.4.0
 3b9f9dd0 gif2webp: don't use C99 %zu
@@ -2865,7 +3635,7 @@
 a0770727 mux struct naming
 6c66dde8 Merge "Tune Lossless encoder"
 ab5ea217 Tune Lossless encoder
-74fefc8c Update ChangeLog (tag: v0.2.1, origin/0.2.0, 0.2.0)
+74fefc8c Update ChangeLog (tag: v0.2.1, origin/0.2.0)
 92f8059c Rename some chunks:
 3bb4bbeb Merge "Mux API change:"
 d0c79f05 Mux API change:
diff --git a/third_party/libwebp/METADATA b/third_party/libwebp/METADATA
index 51d741c..28bfad1 100644
--- a/third_party/libwebp/METADATA
+++ b/third_party/libwebp/METADATA
@@ -11,11 +11,11 @@
     type: GIT
     value: "https://chromium.googlesource.com/webm/libwebp"
   }
-  version: "698b8844e38a0c5ca50bb20f866e71291bfc3b36"
+  version: "v1.3.1"
   last_upgrade_date {
-    year: 2018
-    month: 4
-    day: 21
+    year: 2023
+    month: 7
+    day: 6
   }
   license_type: NOTICE
 }
diff --git a/third_party/libwebp/Makefile.am b/third_party/libwebp/Makefile.am
index 3f73b13..e1c1dd4 100644
--- a/third_party/libwebp/Makefile.am
+++ b/third_party/libwebp/Makefile.am
@@ -1,8 +1,8 @@
 ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = src imageio man
+SUBDIRS = sharpyuv src imageio man
 EXTRA_DIST = COPYING autogen.sh
 
-if WANT_EXTRAS
+if BUILD_EXTRAS
   SUBDIRS += extras
 endif
 
diff --git a/third_party/libwebp/Makefile.vc b/third_party/libwebp/Makefile.vc
index 5d1bf86..cb6b7a9 100644
--- a/third_party/libwebp/Makefile.vc
+++ b/third_party/libwebp/Makefile.vc
@@ -5,6 +5,7 @@
 LIBWEBP_BASENAME = libwebp
 LIBWEBPMUX_BASENAME = libwebpmux
 LIBWEBPDEMUX_BASENAME = libwebpdemux
+LIBSHARPYUV_BASENAME = libsharpyuv
 
 !IFNDEF ARCH
 !IF ! [ cl 2>&1 | find "x86" > NUL ]
@@ -28,15 +29,14 @@
 
 NOLOGO     = /nologo
 CCNODBG    = cl.exe $(NOLOGO) /O2 /DNDEBUG
-CCDEBUG    = cl.exe $(NOLOGO) /Od /Gm /Zi /D_DEBUG /RTC1
+CCDEBUG    = cl.exe $(NOLOGO) /Od /Zi /D_DEBUG /RTC1
 CFLAGS     = /I. /Isrc $(NOLOGO) /W3 /EHsc /c
 CFLAGS     = $(CFLAGS) /DWIN32 /D_CRT_SECURE_NO_WARNINGS /DWIN32_LEAN_AND_MEAN
-LDFLAGS    = /LARGEADDRESSAWARE /MANIFEST /NXCOMPAT /DYNAMICBASE
+LDFLAGS    = /LARGEADDRESSAWARE /MANIFEST:EMBED /NXCOMPAT /DYNAMICBASE
 LDFLAGS    = $(LDFLAGS) $(PLATFORM_LDFLAGS)
 LNKDLL     = link.exe /DLL $(NOLOGO)
 LNKEXE     = link.exe $(NOLOGO)
 LNKLIB     = lib.exe $(NOLOGO)
-MT         = mt.exe $(NOLOGO)
 RCNODBG    = rc.exe $(NOLOGO) /l"0x0409"  # 0x409 = U.S. English
 RCDEBUG    = $(RCNODBG) /D_DEBUG
 
@@ -53,11 +53,6 @@
 OUTDIR = $(OBJDIR)
 !ENDIF
 
-!IF "$(HAVE_AVX2)" == "1"
-CFLAGS = $(CFLAGS) /DWEBP_HAVE_AVX2
-AVX2_FLAGS = /arch:AVX2
-!ENDIF
-
 ##############################################################
 # Runtime library configuration
 !IF "$(RTLIBCFG)" == "static"
@@ -87,6 +82,7 @@
               $(DIROBJ)\extras \
               $(DIROBJ)\imageio \
               $(DIROBJ)\mux \
+              $(DIROBJ)\sharpyuv \
               $(DIROBJ)\utils \
 
 # Target configuration
@@ -101,6 +97,7 @@
 LIBWEBP_BASENAME = $(LIBWEBP_BASENAME)_debug
 LIBWEBPMUX_BASENAME = $(LIBWEBPMUX_BASENAME)_debug
 LIBWEBPDEMUX_BASENAME = $(LIBWEBPDEMUX_BASENAME)_debug
+LIBSHARPYUV_BASENAME = $(LIBSHARPYUV_BASENAME)_debug
 !ELSE IF "$(CFG)" == "release-dynamic"
 CC        = $(CCNODBG)
 RC        = $(RCNODBG)
@@ -114,6 +111,7 @@
 LIBWEBP_BASENAME = $(LIBWEBP_BASENAME)_debug
 LIBWEBPMUX_BASENAME = $(LIBWEBPMUX_BASENAME)_debug
 LIBWEBPDEMUX_BASENAME = $(LIBWEBPDEMUX_BASENAME)_debug
+LIBSHARPYUV_BASENAME = $(LIBSHARPYUV_BASENAME)_debug
 !ENDIF
 
 !IF "$(STATICLIBBUILD)" == "TRUE"
@@ -123,23 +121,28 @@
 LIBWEBP = $(DIRLIB)\$(LIBWEBP_BASENAME).lib
 LIBWEBPMUX = $(DIRLIB)\$(LIBWEBPMUX_BASENAME).lib
 LIBWEBPDEMUX = $(DIRLIB)\$(LIBWEBPDEMUX_BASENAME).lib
+LIBSHARPYUV = $(DIRLIB)\$(LIBSHARPYUV_BASENAME).lib
 !ELSE IF "$(DLLBUILD)" == "TRUE"
-DLLINC = webp_dll.h
-CC     = $(CC) /I$(DIROBJ) /FI$(DLLINC) $(RTLIB) /DWEBP_DLL
+CC     = $(CC) /I$(DIROBJ) $(RTLIB) /DWEBP_DLL
 LIBWEBPDECODER = $(DIRLIB)\$(LIBWEBPDECODER_BASENAME)_dll.lib
 LIBWEBP = $(DIRLIB)\$(LIBWEBP_BASENAME)_dll.lib
 LIBWEBPMUX = $(DIRLIB)\$(LIBWEBPMUX_BASENAME)_dll.lib
 LIBWEBPDEMUX = $(DIRLIB)\$(LIBWEBPDEMUX_BASENAME)_dll.lib
+LIBSHARPYUV = $(DIRLIB)\$(LIBSHARPYUV_BASENAME)_dll.lib
 LIBWEBP_PDBNAME = $(DIROBJ)\$(LIBWEBP_BASENAME)_dll.pdb
 CFGSET = TRUE
 !ENDIF
 
+!IF "$(UNICODE)" == "1"
+CFLAGS = $(CFLAGS) /D_UNICODE /DUNICODE
+!ENDIF
+
 #######################
 # Usage
 #
 !IF "$(CFGSET)" == "FALSE"
 !MESSAGE Usage: nmake /f Makefile.vc [CFG=<config>]
-!MESSAGE .          [OBJDIR=<path>] [RTLIBCFG=<rtlib>] [<target>]
+!MESSAGE .          [OBJDIR=<path>] [RTLIBCFG=<rtlib>] [UNICODE=1] [<target>]
 !MESSAGE
 !MESSAGE where <config> is one of:
 !MESSAGE -  release-static                - release static library
@@ -175,6 +178,15 @@
 # A config was provided, so the library can be built.
 #
 
+SHARPYUV_OBJS = \
+    $(DIROBJ)\sharpyuv\sharpyuv.obj \
+    $(DIROBJ)\sharpyuv\sharpyuv_cpu.obj \
+    $(DIROBJ)\sharpyuv\sharpyuv_csp.obj \
+    $(DIROBJ)\sharpyuv\sharpyuv_dsp.obj \
+    $(DIROBJ)\sharpyuv\sharpyuv_gamma.obj \
+    $(DIROBJ)\sharpyuv\sharpyuv_neon.obj \
+    $(DIROBJ)\sharpyuv\sharpyuv_sse2.obj \
+
 DEC_OBJS = \
     $(DIROBJ)\dec\alpha_dec.obj \
     $(DIROBJ)\dec\buffer_dec.obj \
@@ -216,6 +228,7 @@
     $(DIROBJ)\dsp\lossless_msa.obj \
     $(DIROBJ)\dsp\lossless_neon.obj \
     $(DIROBJ)\dsp\lossless_sse2.obj \
+    $(DIROBJ)\dsp\lossless_sse41.obj \
     $(DIROBJ)\dsp\rescaler.obj \
     $(DIROBJ)\dsp\rescaler_mips32.obj \
     $(DIROBJ)\dsp\rescaler_mips_dsp_r2.obj \
@@ -239,9 +252,9 @@
     $(DIROBJ)\dsp\cost.obj \
     $(DIROBJ)\dsp\cost_mips32.obj \
     $(DIROBJ)\dsp\cost_mips_dsp_r2.obj \
+    $(DIROBJ)\dsp\cost_neon.obj \
     $(DIROBJ)\dsp\cost_sse2.obj \
     $(DIROBJ)\dsp\enc.obj \
-    $(DIROBJ)\dsp\enc_avx2.obj \
     $(DIROBJ)\dsp\enc_mips32.obj \
     $(DIROBJ)\dsp\enc_mips_dsp_r2.obj \
     $(DIROBJ)\dsp\enc_msa.obj \
@@ -335,12 +348,13 @@
     $(DIROBJ)\utils\quant_levels_utils.obj \
 
 LIBWEBPDECODER_OBJS = $(DEC_OBJS) $(DSP_DEC_OBJS) $(UTILS_DEC_OBJS)
-LIBWEBP_OBJS = $(LIBWEBPDECODER_OBJS) $(ENC_OBJS) $(DSP_ENC_OBJS) \
-               $(UTILS_ENC_OBJS) $(DLL_OBJS)
+LIBWEBP_OBJS = $(LIBWEBPDECODER_OBJS) $(ENC_OBJS) \
+               $(DSP_ENC_OBJS) $(UTILS_ENC_OBJS) $(DLL_OBJS)
 LIBWEBPMUX_OBJS = $(MUX_OBJS) $(LIBWEBPMUX_OBJS)
 LIBWEBPDEMUX_OBJS = $(DEMUX_OBJS) $(LIBWEBPDEMUX_OBJS)
+LIBSHARPYUV_OBJS = $(SHARPYUV_OBJS)
 
-OUT_LIBS = $(LIBWEBPDECODER) $(LIBWEBP)
+OUT_LIBS = $(LIBWEBPDECODER) $(LIBWEBP) $(LIBSHARPYUV)
 !IF "$(ARCH)" == "ARM"
 ex: $(OUT_LIBS)
 all: ex
@@ -368,7 +382,7 @@
 $(DIRBIN)\anim_dump.exe: $(IMAGEIO_ENC_OBJS)
 $(DIRBIN)\cwebp.exe: $(DIROBJ)\examples\cwebp.obj $(IMAGEIO_DEC_OBJS)
 $(DIRBIN)\cwebp.exe: $(IMAGEIO_UTIL_OBJS)
-$(DIRBIN)\cwebp.exe: $(LIBWEBPDEMUX)
+$(DIRBIN)\cwebp.exe: $(LIBWEBPDEMUX) $(LIBSHARPYUV)
 $(DIRBIN)\dwebp.exe: $(DIROBJ)\examples\dwebp.obj $(IMAGEIO_DEC_OBJS)
 $(DIRBIN)\dwebp.exe: $(IMAGEIO_ENC_OBJS)
 $(DIRBIN)\dwebp.exe: $(IMAGEIO_UTIL_OBJS)
@@ -386,13 +400,19 @@
 $(DIRBIN)\img2webp.exe: $(DIROBJ)\examples\img2webp.obj $(LIBWEBPMUX)
 $(DIRBIN)\img2webp.exe: $(IMAGEIO_DEC_OBJS)
 $(DIRBIN)\img2webp.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS)
-$(DIRBIN)\img2webp.exe: $(LIBWEBPDEMUX) $(LIBWEBP)
+$(DIRBIN)\img2webp.exe: $(LIBWEBPDEMUX) $(LIBWEBP) $(LIBSHARPYUV)
 $(DIRBIN)\get_disto.exe: $(DIROBJ)\extras\get_disto.obj
 $(DIRBIN)\get_disto.exe: $(IMAGEIO_DEC_OBJS) $(IMAGEIO_UTIL_OBJS)
 $(DIRBIN)\get_disto.exe: $(LIBWEBPDEMUX) $(LIBWEBP)
 $(DIRBIN)\webp_quality.exe: $(DIROBJ)\extras\webp_quality.obj
 $(DIRBIN)\webp_quality.exe: $(IMAGEIO_UTIL_OBJS)
-$(DIRBIN)\webp_quality.exe: $(EXTRAS_OBJS) $(LIBWEBP)
+$(DIRBIN)\webp_quality.exe: $(EXTRAS_OBJS)
+# EXTRA_OBJS requires private symbols from dsp. Explicitly add those when
+# building libwebp as a dll.
+!IF "$(DLLBUILD)" == "TRUE"
+$(DIRBIN)\webp_quality.exe: $(DSP_DEC_OBJS)
+!ENDIF
+$(DIRBIN)\webp_quality.exe: $(LIBWEBP)
 $(DIRBIN)\webpinfo.exe: $(DIROBJ)\examples\webpinfo.obj
 $(DIRBIN)\webpinfo.exe: $(IMAGEIO_DEC_OBJS)
 $(DIRBIN)\webpinfo.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS)
@@ -403,17 +423,16 @@
 $(IMAGEIO_DEC_OBJS) $(IMAGEIO_ENC_OBJS) $(EXTRAS_OBJS): $(OUTPUT_DIRS)
 !ENDIF  # ARCH == ARM
 
+$(LIBSHARPYUV): $(LIBSHARPYUV_OBJS)
 $(LIBWEBPDECODER): $(LIBWEBPDECODER_OBJS)
-$(LIBWEBP): $(LIBWEBP_OBJS)
+$(LIBWEBP): $(LIBWEBP_OBJS) $(LIBSHARPYUV)
 $(LIBWEBPMUX): $(LIBWEBPMUX_OBJS)
 $(LIBWEBPDEMUX): $(LIBWEBPDEMUX_OBJS)
 
-$(LIBWEBP_OBJS) $(LIBWEBPMUX_OBJS) $(LIBWEBPDEMUX_OBJS): $(OUTPUT_DIRS)
+$(LIBWEBP_OBJS) $(LIBWEBPMUX_OBJS) $(LIBWEBPDEMUX_OBJS) $(LIBSHARPYUV_OBJS): \
+    $(OUTPUT_DIRS)
 
 !IF "$(DLLBUILD)" == "TRUE"
-$(LIBWEBP_OBJS) $(LIBWEBPMUX_OBJS) $(LIBWEBPDEMUX_OBJS): \
-    $(DIROBJ)\$(DLLINC)
-
 {$(DIROBJ)}.c{$(DIROBJ)}.obj:
 	$(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$@  $<
 
@@ -423,20 +442,20 @@
 	$(RC) /fo$@ $<
 {src\mux}.rc{$(DIROBJ)\mux}.res:
 	$(RC) /fo$@ $<
+{sharpyuv}.rc{$(DIROBJ)\sharpyuv}.res:
+	$(RC) /fo$@ $<
 
-$(LIBWEBP): $(DIROBJ)\$(LIBWEBP_BASENAME:_debug=).res
+$(LIBSHARPYUV): $(DIROBJ)\sharpyuv\$(LIBSHARPYUV_BASENAME:_debug=).res
+$(LIBWEBP): $(LIBSHARPYUV) $(DIROBJ)\$(LIBWEBP_BASENAME:_debug=).res
 $(LIBWEBPDECODER): $(DIROBJ)\$(LIBWEBPDECODER_BASENAME:_debug=).res
 $(LIBWEBPMUX): $(LIBWEBP) $(DIROBJ)\mux\$(LIBWEBPMUX_BASENAME:_debug=).res
 $(LIBWEBPDEMUX): $(LIBWEBP) $(DIROBJ)\demux\$(LIBWEBPDEMUX_BASENAME:_debug=).res
 
-$(LIBWEBPDECODER) $(LIBWEBP) $(LIBWEBPMUX) $(LIBWEBPDEMUX):
+$(LIBWEBPDECODER) $(LIBWEBP) $(LIBWEBPMUX) $(LIBWEBPDEMUX) $(LIBSHARPYUV):
 	$(LNKDLL) /out:$(DIRBIN)\$(@B:_dll=.dll) /implib:$@ $(LFLAGS) $**
 	-xcopy $(DIROBJ)\*.pdb $(DIRLIB) /y
-
-clean::
-	@-erase /s $(DIROBJ)\$(DLLINC) 2> NUL
 !ELSE
-$(LIBWEBPDECODER) $(LIBWEBP) $(LIBWEBPMUX) $(LIBWEBPDEMUX):
+$(LIBWEBPDECODER) $(LIBWEBP) $(LIBWEBPMUX) $(LIBWEBPDEMUX) $(LIBSHARPYUV):
 	$(LNKLIB) /out:$@ $**
 	-xcopy $(DIROBJ)\*.pdb $(DIRLIB) /y
 !ENDIF
@@ -444,19 +463,9 @@
 $(OUTPUT_DIRS):
 	@if not exist "$(@)" mkdir "$(@)"
 
-# generate a helper include to define WEBP_EXTERN suitable for the DLL build
-$(DIROBJ)\$(DLLINC):
-	@echo #ifndef WEBP_DLL_H_ > $@
-	@echo #define WEBP_DLL_H_ >> $@
-	@echo #define WEBP_EXTERN __declspec(dllexport) >> $@
-	@echo #endif  /* WEBP_DLL_H_ */ >> $@
-
 .SUFFIXES: .c .obj .res .exe
 # File-specific flag builds. Note batch rules take precedence over wildcards,
 # so for now name each file individually.
-$(DIROBJ)\dsp\enc_avx2.obj: src\dsp\enc_avx2.c
-	$(CC) $(CFLAGS) $(AVX2_FLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\dsp\ \
-	  src\dsp\$(@B).c
 $(DIROBJ)\examples\anim_diff.obj: examples\anim_diff.c
 	$(CC) $(CFLAGS) /DWEBP_HAVE_GIF /Fd$(LIBWEBP_PDBNAME) \
 	  /Fo$(DIROBJ)\examples\ examples\$(@B).c
@@ -479,6 +488,8 @@
 	$(CC) $(CFLAGS) /Fd$(DIROBJ)\extras\ /Fo$(DIROBJ)\extras\ $<
 {imageio}.c{$(DIROBJ)\imageio}.obj::
 	$(CC) $(CFLAGS) /Fd$(DIROBJ)\imageio\ /Fo$(DIROBJ)\imageio\ $<
+{sharpyuv}.c{$(DIROBJ)\sharpyuv}.obj::
+	$(CC) $(CFLAGS) /Fd$(DIROBJ)\sharpyuv\ /Fo$(DIROBJ)\sharpyuv\ $<
 {src\dec}.c{$(DIROBJ)\dec}.obj::
 	$(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\dec\ $<
 {src\demux}.c{$(DIROBJ)\demux}.obj::
@@ -492,17 +503,16 @@
 {src\utils}.c{$(DIROBJ)\utils}.obj::
 	$(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\utils\ $<
 
+LNKLIBS     = ole32.lib windowscodecs.lib shlwapi.lib
+!IF "$(UNICODE)" == "1"
+LNKLIBS     = $(LNKLIBS) Shell32.lib
+!ENDIF
+
 {$(DIROBJ)\examples}.obj{$(DIRBIN)}.exe:
-	$(LNKEXE) $(LDFLAGS) /OUT:$@ $** \
-	    ole32.lib windowscodecs.lib shlwapi.lib
-	$(MT) -manifest $@.manifest -outputresource:$@;1
-	del $@.manifest
+	$(LNKEXE) $(LDFLAGS) /OUT:$@ $** $(LNKLIBS)
 
 {$(DIROBJ)\extras}.obj{$(DIRBIN)}.exe:
-	$(LNKEXE) $(LDFLAGS) /OUT:$@ $** \
-	    ole32.lib windowscodecs.lib shlwapi.lib
-	$(MT) -manifest $@.manifest -outputresource:$@;1
-	del $@.manifest
+	$(LNKEXE) $(LDFLAGS) /OUT:$@ $** $(LNKLIBS)
 
 clean::
 	@-erase /s $(DIROBJ)\*.dll 2> NUL
diff --git a/third_party/libwebp/NEWS b/third_party/libwebp/NEWS
index 480cb7d..2111d33 100644
--- a/third_party/libwebp/NEWS
+++ b/third_party/libwebp/NEWS
@@ -1,3 +1,115 @@
+- 6/23/2023: version 1.3.1
+  This is a binary compatible release.
+  * security fixes for lossless encoder (#603, chromium: #1420107, #1455619,
+    CVE-2023-1999)
+  * improve error reporting through WebPPicture error codes
+  * fix upsampling for RGB565 and RGBA4444 in NEON builds
+  * img2webp: add -sharp_yuv & -near_lossless
+  * Windows builds:
+    - fix compatibility with clang-cl (#607)
+    - improve Arm64 performance with cl.exe
+    - add Arm64EC support
+  * fix webp_js with emcc >= 3.1.27 (stack size change, #614)
+  * CMake fixes (#592, #610, #612)
+  * further updates to the container and lossless bitstream docs (#581, #611)
+
+- 12/16/2022: version 1.3.0
+  This is a binary compatible release.
+  * add libsharpyuv, which exposes -sharp_yuv/config.use_sharp_yuv
+    functionality to other libraries; libwebp now depends on this library
+  * major updates to the container and lossless bitstream docs (#448, #546,
+    #551)
+  * miscellaneous warning, bug & build fixes (#576, #583, #584)
+
+- 8/4/2022: version 1.2.4
+  This is a binary compatible release.
+  * restore CMake libwebpmux target name for compatibility with 1.2.2 (#575)
+  * fix lossless crunch mode encoding with WEBP_REDUCE_SIZE
+    (chromium: #1345547, #1345595, #1345772, #1345804)
+
+- 6/30/2022: version 1.2.3
+  This is a binary compatible release.
+  * security fix for lossless encoder (#565, chromium:1313709)
+  * improved progress granularity in WebPReportProgress() when using lossless
+  * improved precision in Sharp YUV (-sharp_yuv) conversion
+  * many corrections to webp-lossless-bitstream-spec.txt (#551)
+  * crash/leak fixes on error/OOM and other bug fixes (#558, #563, #569, #573)
+
+- 1/11/2022: version 1.2.2
+  This is a binary compatible release.
+  * webpmux: add "-set bgcolor A,R,G,B"
+  * add ARM64 NEON support for MSVC builds (#539)
+  * fix duplicate include error in Xcode when using multiple XCFrameworks in a
+    project (#542)
+  * doc updates and bug fixes (#538, #544, #548, #550)
+
+- 7/20/2021: version 1.2.1
+  This is a binary compatible release.
+  * minor lossless encoder improvements and x86 color conversion speed up
+  * add ARM64 simulator support to xcframeworkbuild.sh (#510)
+  * further security related hardening in libwebp & examples
+    (issues: #497, #508, #518)
+    (chromium: #1196480, #1196773, #1196775, #1196777, #1196778, #1196850)
+    (oss-fuzz: #28658, #28978)
+  * toolchain updates and bug fixes (#498, #501, #502, #504, #505, #506, #509,
+                                     #533)
+  * use more inclusive language within the source (#507)
+
+- 12/23/2020: version 1.2.0
+  * API changes:
+    - libwebp:
+      encode.h: add a qmin / qmax range for quality factor (cwebp adds -qrange)
+  * lossless encoder improvements
+  * SIMD support for Wasm builds
+  * add xcframeworkbuild.sh, supports Mac Catalyst builds
+  * import fuzzers from oss-fuzz & chromium (#409)
+  * webpmux: add an '-set loop <value>' option (#494)
+  * toolchain updates and bug fixes (#449, #463, #470, #475, #477, #478, #479,
+    #488, #491)
+
+- 12/18/2019: version 1.1.0
+  * API changes:
+    - libwebp:
+      WebPMalloc (issue #442)
+    - extras:
+      WebPUnmultiplyARGB
+  * alpha decode fix (issue #439)
+  * toolchain updates and bug fixes
+    (chromium: #1026858, #1027136, #1027409, #1028620, #1028716, #995200)
+    (oss-fuzz: #19430, #19447)
+
+- 7/4/2019: version 1.0.3
+  This is a binary compatible release.
+  * resize fixes for Nx1 sizes and the addition of non-opaque alpha values for
+    odd sizes (issues #418, #434)
+  * lossless encode/decode performance improvements
+  * lossy compression performance improvement at low quality levels with flat
+    content (issue #432)
+  * python swig files updated to support python 3
+  Tool updates:
+    vwebp will now preserve the aspect ratio of images that exceed monitor
+    resolution by scaling the image to fit (issue #433)
+
+- 1/14/2019: version 1.0.2
+  This is a binary compatible release.
+  * (Windows) unicode file support in the tools (linux and mac already had
+    support, issue #398)
+  * lossless encoder speedups
+  * lossy encoder speedup on ARM
+  * lossless multi-threaded security fix (chromium:917029)
+
+- 11/2/2018: version 1.0.1
+  This is a binary compatible release.
+  * lossless encoder speedups
+  * big-endian fix for alpha decoding (issue #393)
+  * gif2webp fix for loop count=65535 transcode (issue #382)
+  * further security related hardening in libwebp & libwebpmux
+    (issues #383, #385, #386, #387, #388, #391)
+    (oss-fuzz #9099, #9100, #9105, #9106, #9111, #9112, #9119, #9123, #9170,
+              #9178, #9179, #9183, #9186, #9191, #9364, #9417, #9496, #10349,
+              #10423, #10634, #10700, #10838, #10922, #11021, #11088, #11152)
+  * miscellaneous bug & build fixes (issues #381, #394, #396, #397, #400)
+
 - 4/2/2018: version 1.0.0
   This is a binary compatible release.
   * lossy encoder improvements to avoid chroma shifts in various circumstances
diff --git a/third_party/libwebp/PRESUBMIT.py b/third_party/libwebp/PRESUBMIT.py
new file mode 100644
index 0000000..91ad12e
--- /dev/null
+++ b/third_party/libwebp/PRESUBMIT.py
@@ -0,0 +1,245 @@
+# Copyright (c) 2021, Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#
+#   * Neither the name of Google nor the names of its contributors may
+#     be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Top-level presubmit script for libwebp.
+
+See https://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
+details on the presubmit API built into depot_tools.
+"""
+
+import re
+import subprocess2
+
+USE_PYTHON3 = True
+_BASH_INDENTATION = "2"
+_GIT_COMMIT_SUBJECT_LENGTH = 65
+_INCLUDE_BASH_FILES_ONLY = [r".*\.sh$"]
+_INCLUDE_MAN_FILES_ONLY = [r"man/.+\.1$"]
+_INCLUDE_SOURCE_FILES_ONLY = [r".*\.[ch]$"]
+_LIBWEBP_MAX_LINE_LENGTH = 80
+
+
+def _CheckCommitSubjectLength(input_api, output_api):
+  """Ensures commit's subject length is no longer than 65 chars."""
+  name = "git-commit subject"
+  cmd = ["git", "log", "-1", "--pretty=%s"]
+  start = input_api.time.time()
+  proc = subprocess2.Popen(
+      cmd,
+      stderr=subprocess2.PIPE,
+      stdout=subprocess2.PIPE,
+      universal_newlines=True)
+
+  stdout, _ = proc.communicate()
+  duration = input_api.time.time() - start
+
+  if not re.match(r"^Revert",
+                  stdout) and (len(stdout) - 1) > _GIT_COMMIT_SUBJECT_LENGTH:
+    failure_msg = (
+        "The commit subject: %s is too long (%d chars)\n"
+        "Try to keep this to 50 or less (up to 65 is permitted for "
+        "non-reverts).\n"
+        "https://www.git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-"
+        "Project#_commit_guidelines") % (stdout, len(stdout) - 1)
+    return output_api.PresubmitError("%s\n (%4.2fs) failed\n%s" %
+                                     (name, duration, failure_msg))
+
+  return output_api.PresubmitResult("%s\n (%4.2fs) success" % (name, duration))
+
+
+def _CheckDuplicateFiles(input_api, output_api):
+  """Ensures there are not repeated filenames."""
+  all_files = []
+  for f in input_api.change.AllFiles():
+    for include_file in _INCLUDE_SOURCE_FILES_ONLY:
+      if re.match(include_file, f):
+        all_files.append(f)
+        break
+
+  basename_to_path = {}
+  for f in all_files:
+    basename_file = input_api.basename(f)
+    if basename_file in basename_to_path:
+      basename_to_path[basename_file].append(f)
+    else:
+      basename_to_path[basename_file] = [f]
+
+  dupes = []
+  for files in basename_to_path.values():
+    if len(files) > 1:
+      dupes.extend(files)
+
+  if dupes:
+    return output_api.PresubmitError(
+        "Duplicate source files, rebase or rename some to make them unique:\n%s"
+        % dupes)
+  return output_api.PresubmitResult("No duplicates, success\n")
+
+
+def _GetFilesToSkip(input_api):
+  return list(input_api.DEFAULT_FILES_TO_SKIP) + [
+      r"swig/.*\.py$",
+      r"\.pylintrc$",
+  ]
+
+
+def _RunManCmd(input_api, output_api, man_file):
+  """man command wrapper."""
+  cmd = ["man", "--warnings", "-EUTF-8", "-l", "-Tutf8", "-Z", man_file]
+  name = "Check %s file." % man_file
+  start = input_api.time.time()
+  output, _ = subprocess2.communicate(
+      cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True)
+  duration = input_api.time.time() - start
+  if output[1]:
+    return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" %
+                                     (name, " ".join(cmd), duration, output[1]))
+  return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" %
+                                    (name, " ".join(cmd), duration))
+
+
+def _RunShellCheckCmd(input_api, output_api, bash_file):
+  """shellcheck command wrapper."""
+  cmd = ["shellcheck", "-x", "-oall", "-sbash", bash_file]
+  name = "Check %s file." % bash_file
+  start = input_api.time.time()
+  output, rc = subprocess2.communicate(
+      cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True)
+  duration = input_api.time.time() - start
+  if rc == 0:
+    return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" %
+                                      (name, " ".join(cmd), duration))
+  return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" %
+                                   (name, " ".join(cmd), duration, output[1]))
+
+
+def _RunShfmtCheckCmd(input_api, output_api, bash_file):
+  """shfmt command wrapper."""
+  cmd = [
+      "shfmt", "-i", _BASH_INDENTATION, "-bn", "-ci", "-sr", "-kp", "-d",
+      bash_file
+  ]
+  name = "Check %s file." % bash_file
+  start = input_api.time.time()
+  output, rc = subprocess2.communicate(
+      cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True)
+  duration = input_api.time.time() - start
+  if rc == 0:
+    return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" %
+                                      (name, " ".join(cmd), duration))
+  return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" %
+                                   (name, " ".join(cmd), duration, output[1]))
+
+
+def _RunCmdOnCheckedFiles(input_api, output_api, run_cmd, files_to_check):
+  """Ensure that libwebp/ files are clean."""
+  file_filter = lambda x: input_api.FilterSourceFile(
+      x, files_to_check=files_to_check, files_to_skip=None)
+
+  affected_files = input_api.change.AffectedFiles(file_filter=file_filter)
+  results = [
+      run_cmd(input_api, output_api, f.AbsoluteLocalPath())
+      for f in affected_files
+  ]
+  return results
+
+
+def _CommonChecks(input_api, output_api):
+  """Ensures this patch does not have trailing spaces, extra EOLs,
+     or long lines.
+  """
+  results = []
+  results.extend(
+      input_api.canned_checks.CheckChangeHasNoCrAndHasOnlyOneEol(
+          input_api, output_api))
+  results.extend(
+      input_api.canned_checks.CheckChangeHasNoTabs(input_api, output_api))
+  results.extend(
+      input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
+          input_api, output_api))
+  results.append(_CheckCommitSubjectLength(input_api, output_api))
+  results.append(_CheckDuplicateFiles(input_api, output_api))
+
+  source_file_filter = lambda x: input_api.FilterSourceFile(
+      x, files_to_skip=_GetFilesToSkip(input_api))
+  results.extend(
+      input_api.canned_checks.CheckLongLines(
+          input_api,
+          output_api,
+          maxlen=_LIBWEBP_MAX_LINE_LENGTH,
+          source_file_filter=source_file_filter))
+
+  results.extend(
+      input_api.canned_checks.CheckPatchFormatted(
+          input_api,
+          output_api,
+          check_clang_format=False,
+          check_python=True,
+          result_factory=output_api.PresubmitError))
+  results.extend(
+      _RunCmdOnCheckedFiles(input_api, output_api, _RunManCmd,
+                            _INCLUDE_MAN_FILES_ONLY))
+  # Run pylint.
+  results.extend(
+      input_api.canned_checks.RunPylint(
+          input_api,
+          output_api,
+          files_to_skip=_GetFilesToSkip(input_api),
+          pylintrc=".pylintrc",
+          version="2.7"))
+
+  # Binaries shellcheck and shfmt are not installed in depot_tools.
+  # Installation is needed
+  try:
+    subprocess2.communicate(["shellcheck", "--version"])
+    results.extend(
+        _RunCmdOnCheckedFiles(input_api, output_api, _RunShellCheckCmd,
+                              _INCLUDE_BASH_FILES_ONLY))
+    print("shfmt")
+    subprocess2.communicate(["shfmt", "-version"])
+    results.extend(
+        _RunCmdOnCheckedFiles(input_api, output_api, _RunShfmtCheckCmd,
+                              _INCLUDE_BASH_FILES_ONLY))
+  except OSError as os_error:
+    results.append(
+        output_api.PresubmitPromptWarning(
+            "%s\nPlease install missing binaries locally." % os_error.args[0]))
+  return results
+
+
+def CheckChangeOnUpload(input_api, output_api):
+  results = []
+  results.extend(_CommonChecks(input_api, output_api))
+  return results
+
+
+def CheckChangeOnCommit(input_api, output_api):
+  results = []
+  results.extend(_CommonChecks(input_api, output_api))
+  return results
diff --git a/third_party/libwebp/README b/third_party/libwebp/README
deleted file mode 100644
index a76b378..0000000
--- a/third_party/libwebp/README
+++ /dev/null
@@ -1,782 +0,0 @@
-          __   __  ____  ____  ____
-         /  \\/  \/  _ \/  _ )/  _ \
-         \       /   __/  _  \   __/
-          \__\__/\____/\_____/__/ ____  ___
-                / _/ /    \    \ /  _ \/ _/
-               /  \_/   / /   \ \   __/  \__
-               \____/____/\_____/_____/____/v1.0.0
-
-Description:
-============
-
-WebP codec: library to encode and decode images in WebP format. This package
-contains the library that can be used in other programs to add WebP support,
-as well as the command line tools 'cwebp' and 'dwebp'.
-
-See http://developers.google.com/speed/webp
-
-The latest source tree is available at
-https://chromium.googlesource.com/webm/libwebp
-
-It is released under the same license as the WebM project.
-See http://www.webmproject.org/license/software/ or the
-"COPYING" file for details. An additional intellectual
-property rights grant can be found in the file PATENTS.
-
-Building:
-=========
-
-Windows build:
---------------
-
-By running:
-
-  nmake /f Makefile.vc CFG=release-static RTLIBCFG=static OBJDIR=output
-
-the directory output\release-static\(x64|x86)\bin will contain the tools
-cwebp.exe and dwebp.exe. The directory output\release-static\(x64|x86)\lib will
-contain the libwebp static library.
-The target architecture (x86/x64) is detected by Makefile.vc from the Visual
-Studio compiler (cl.exe) available in the system path.
-
-Unix build using makefile.unix:
--------------------------------
-
-On platforms with GNU tools installed (gcc and make), running
-
-  make -f makefile.unix
-
-will build the binaries examples/cwebp and examples/dwebp, along
-with the static library src/libwebp.a. No system-wide installation
-is supplied, as this is a simple alternative to the full installation
-system based on the autoconf tools (see below).
-Please refer to makefile.unix for additional details and customizations.
-
-Using autoconf tools:
----------------------
-Prerequisites:
-A compiler (e.g., gcc), make, autoconf, automake, libtool.
-On a Debian-like system the following should install everything you need for a
-minimal build:
-$ sudo apt-get install gcc make autoconf automake libtool
-
-When building from git sources, you will need to run autogen.sh to generate the
-configure script.
-
-./configure
-make
-make install
-
-should be all you need to have the following files
-
-/usr/local/include/webp/decode.h
-/usr/local/include/webp/encode.h
-/usr/local/include/webp/types.h
-/usr/local/lib/libwebp.*
-/usr/local/bin/cwebp
-/usr/local/bin/dwebp
-
-installed.
-
-Note: A decode-only library, libwebpdecoder, is available using the
-'--enable-libwebpdecoder' flag. The encode library is built separately and can
-be installed independently using a minor modification in the corresponding
-Makefile.am configure files (see comments there). See './configure --help' for
-more options.
-
-Building for MIPS Linux:
-------------------------
-MIPS Linux toolchain stable available releases can be found at:
-https://community.imgtec.com/developers/mips/tools/codescape-mips-sdk/available-releases/
-
-# Add toolchain to PATH
-export PATH=$PATH:/path/to/toolchain/bin
-
-# 32-bit build for mips32r5 (p5600)
-HOST=mips-mti-linux-gnu
-MIPS_CFLAGS="-O3 -mips32r5 -mabi=32 -mtune=p5600 -mmsa -mfp64 \
-  -msched-weight -mload-store-pairs -fPIE"
-MIPS_LDFLAGS="-mips32r5 -mabi=32 -mmsa -mfp64 -pie"
-
-# 64-bit build for mips64r6 (i6400)
-HOST=mips-img-linux-gnu
-MIPS_CFLAGS="-O3 -mips64r6 -mabi=64 -mtune=i6400 -mmsa -mfp64 \
-  -msched-weight -mload-store-pairs -fPIE"
-MIPS_LDFLAGS="-mips64r6 -mabi=64 -mmsa -mfp64 -pie"
-
-./configure --host=${HOST} --build=`config.guess` \
-  CC="${HOST}-gcc -EL" \
-  CFLAGS="$MIPS_CFLAGS" \
-  LDFLAGS="$MIPS_LDFLAGS"
-make
-make install
-
-CMake:
-------
-With CMake, you can compile libwebp, cwebp, dwebp, gif2web, img2webp, webpinfo
-and the JS bindings.
-
-Prerequisites:
-A compiler (e.g., gcc with autotools) and CMake.
-On a Debian-like system the following should install everything you need for a
-minimal build:
-$ sudo apt-get install build-essential cmake
-
-When building from git sources, you will need to run cmake to generate the
-makefiles.
-
-mkdir build && cd build && cmake ../
-make
-make install
-
-If you also want any of the executables, you will need to enable them through
-CMake, e.g.:
-
-cmake -DWEBP_BUILD_CWEBP=ON -DWEBP_BUILD_DWEBP=ON ../
-
-or through your favorite interface (like ccmake or cmake-qt-gui).
-
-Finally, once installed, you can also use WebP in your CMake project by doing:
-
-find_package(WebP)
-
-which will define the CMake variables WebP_INCLUDE_DIRS and WebP_LIBRARIES.
-
-Gradle:
--------
-The support for Gradle is minimal: it only helps you compile libwebp, cwebp and
-dwebp and webpmux_example.
-
-Prerequisites:
-A compiler (e.g., gcc with autotools) and gradle.
-On a Debian-like system the following should install everything you need for a
-minimal build:
-$ sudo apt-get install build-essential gradle
-
-When building from git sources, you will need to run the Gradle wrapper with the
-appropriate target, e.g. :
-
-./gradlew buildAllExecutables
-
-SWIG bindings:
---------------
-
-To generate language bindings from swig/libwebp.swig at least swig-1.3
-(http://www.swig.org) is required.
-
-Currently the following functions are mapped:
-Decode:
-  WebPGetDecoderVersion
-  WebPGetInfo
-  WebPDecodeRGBA
-  WebPDecodeARGB
-  WebPDecodeBGRA
-  WebPDecodeBGR
-  WebPDecodeRGB
-
-Encode:
-  WebPGetEncoderVersion
-  WebPEncodeRGBA
-  WebPEncodeBGRA
-  WebPEncodeRGB
-  WebPEncodeBGR
-  WebPEncodeLosslessRGBA
-  WebPEncodeLosslessBGRA
-  WebPEncodeLosslessRGB
-  WebPEncodeLosslessBGR
-
-See swig/README for more detailed build instructions.
-
-Java bindings:
-
-To build the swig-generated JNI wrapper code at least JDK-1.5 (or equivalent)
-is necessary for enum support. The output is intended to be a shared object /
-DLL that can be loaded via System.loadLibrary("webp_jni").
-
-Python bindings:
-
-To build the swig-generated Python extension code at least Python 2.6 is
-required. Python < 2.6 may build with some minor changes to libwebp.swig or the
-generated code, but is untested.
-
-Encoding tool:
-==============
-
-The examples/ directory contains tools for encoding (cwebp) and
-decoding (dwebp) images.
-
-The easiest use should look like:
-  cwebp input.png -q 80 -o output.webp
-which will convert the input file to a WebP file using a quality factor of 80
-on a 0->100 scale (0 being the lowest quality, 100 being the best. Default
-value is 75).
-You might want to try the -lossless flag too, which will compress the source
-(in RGBA format) without any loss. The -q quality parameter will in this case
-control the amount of processing time spent trying to make the output file as
-small as possible.
-
-A longer list of options is available using the -longhelp command line flag:
-
-> cwebp -longhelp
-Usage:
- cwebp [-preset <...>] [options] in_file [-o out_file]
-
-If input size (-s) for an image is not specified, it is
-assumed to be a PNG, JPEG, TIFF or WebP file.
-
-Options:
-  -h / -help ............. short help
-  -H / -longhelp ......... long help
-  -q <float> ............. quality factor (0:small..100:big), default=75
-  -alpha_q <int> ......... transparency-compression quality (0..100),
-                           default=100
-  -preset <string> ....... preset setting, one of:
-                            default, photo, picture,
-                            drawing, icon, text
-     -preset must come first, as it overwrites other parameters
-  -z <int> ............... activates lossless preset with given
-                           level in [0:fast, ..., 9:slowest]
-
-  -m <int> ............... compression method (0=fast, 6=slowest), default=4
-  -segments <int> ........ number of segments to use (1..4), default=4
-  -size <int> ............ target size (in bytes)
-  -psnr <float> .......... target PSNR (in dB. typically: 42)
-
-  -s <int> <int> ......... input size (width x height) for YUV
-  -sns <int> ............. spatial noise shaping (0:off, 100:max), default=50
-  -f <int> ............... filter strength (0=off..100), default=60
-  -sharpness <int> ....... filter sharpness (0:most .. 7:least sharp), default=0
-  -strong ................ use strong filter instead of simple (default)
-  -nostrong .............. use simple filter instead of strong
-  -sharp_yuv ............. use sharper (and slower) RGB->YUV conversion
-  -partition_limit <int> . limit quality to fit the 512k limit on
-                           the first partition (0=no degradation ... 100=full)
-  -pass <int> ............ analysis pass number (1..10)
-  -crop <x> <y> <w> <h> .. crop picture with the given rectangle
-  -resize <w> <h> ........ resize picture (after any cropping)
-  -mt .................... use multi-threading if available
-  -low_memory ............ reduce memory usage (slower encoding)
-  -map <int> ............. print map of extra info
-  -print_psnr ............ prints averaged PSNR distortion
-  -print_ssim ............ prints averaged SSIM distortion
-  -print_lsim ............ prints local-similarity distortion
-  -d <file.pgm> .......... dump the compressed output (PGM file)
-  -alpha_method <int> .... transparency-compression method (0..1), default=1
-  -alpha_filter <string> . predictive filtering for alpha plane,
-                           one of: none, fast (default) or best
-  -exact ................. preserve RGB values in transparent area, default=off
-  -blend_alpha <hex> ..... blend colors against background color
-                           expressed as RGB values written in
-                           hexadecimal, e.g. 0xc0e0d0 for red=0xc0
-                           green=0xe0 and blue=0xd0
-  -noalpha ............... discard any transparency information
-  -lossless .............. encode image losslessly, default=off
-  -near_lossless <int> ... use near-lossless image
-                           preprocessing (0..100=off), default=100
-  -hint <string> ......... specify image characteristics hint,
-                           one of: photo, picture or graph
-
-  -metadata <string> ..... comma separated list of metadata to
-                           copy from the input to the output if present.
-                           Valid values: all, none (default), exif, icc, xmp
-
-  -short ................. condense printed message
-  -quiet ................. don't print anything
-  -version ............... print version number and exit
-  -noasm ................. disable all assembly optimizations
-  -v ..................... verbose, e.g. print encoding/decoding times
-  -progress .............. report encoding progress
-
-Experimental Options:
-  -jpeg_like ............. roughly match expected JPEG size
-  -af .................... auto-adjust filter strength
-  -pre <int> ............. pre-processing filter
-
-The main options you might want to try in order to further tune the
-visual quality are:
- -preset
- -sns
- -f
- -m
-
-Namely:
-  * 'preset' will set up a default encoding configuration targeting a
-     particular type of input. It should appear first in the list of options,
-     so that subsequent options can take effect on top of this preset.
-     Default value is 'default'.
-  * 'sns' will progressively turn on (when going from 0 to 100) some additional
-     visual optimizations (like: segmentation map re-enforcement). This option
-     will balance the bit allocation differently. It tries to take bits from the
-     "easy" parts of the picture and use them in the "difficult" ones instead.
-     Usually, raising the sns value (at fixed -q value) leads to larger files,
-     but with better quality.
-     Typical value is around '75'.
-  * 'f' option directly links to the filtering strength used by the codec's
-     in-loop processing. The higher the value, the smoother the
-     highly-compressed area will look. This is particularly useful when aiming
-     at very small files. Typical values are around 20-30. Note that using the
-     option -strong/-nostrong will change the type of filtering. Use "-f 0" to
-     turn filtering off.
-  * 'm' controls the trade-off between encoding speed and quality. Default is 4.
-     You can try -m 5 or -m 6 to explore more (time-consuming) encoding
-     possibilities. A lower value will result in faster encoding at the expense
-     of quality.
-
-Decoding tool:
-==============
-
-There is a decoding sample in examples/dwebp.c which will take
-a .webp file and decode it to a PNG image file (amongst other formats).
-This is simply to demonstrate the use of the API. You can verify the
-file test.webp decodes to exactly the same as test_ref.ppm by using:
-
- cd examples
- ./dwebp test.webp -ppm -o test.ppm
- diff test.ppm test_ref.ppm
-
-The full list of options is available using -h:
-
-> dwebp -h
-Usage: dwebp in_file [options] [-o out_file]
-
-Decodes the WebP image file to PNG format [Default]
-Use following options to convert into alternate image formats:
-  -pam ......... save the raw RGBA samples as a color PAM
-  -ppm ......... save the raw RGB samples as a color PPM
-  -bmp ......... save as uncompressed BMP format
-  -tiff ........ save as uncompressed TIFF format
-  -pgm ......... save the raw YUV samples as a grayscale PGM
-                 file with IMC4 layout
-  -yuv ......... save the raw YUV samples in flat layout
-
- Other options are:
-  -version ..... print version number and exit
-  -nofancy ..... don't use the fancy YUV420 upscaler
-  -nofilter .... disable in-loop filtering
-  -nodither .... disable dithering
-  -dither <d> .. dithering strength (in 0..100)
-  -alpha_dither  use alpha-plane dithering if needed
-  -mt .......... use multi-threading
-  -crop <x> <y> <w> <h> ... crop output with the given rectangle
-  -resize <w> <h> ......... scale the output (*after* any cropping)
-  -flip ........ flip the output vertically
-  -alpha ....... only save the alpha plane
-  -incremental . use incremental decoding (useful for tests)
-  -h ........... this help message
-  -v ........... verbose (e.g. print encoding/decoding times)
-  -quiet ....... quiet mode, don't print anything
-  -noasm ....... disable all assembly optimizations
-
-WebP file analysis tool:
-========================
-
-'webpinfo' can be used to print out the chunk level structure and bitstream
-header information of WebP files. It can also check if the files are of valid
-WebP format.
-
-Usage: webpinfo [options] in_files
-Note: there could be multiple input files;
-      options must come before input files.
-Options:
-  -version ........... Print version number and exit.
-  -quiet ............. Do not show chunk parsing information.
-  -diag .............. Show parsing error diagnosis.
-  -summary ........... Show chunk stats summary.
-  -bitstream_info .... Parse bitstream header.
-
-Visualization tool:
-===================
-
-There's a little self-serve visualization tool called 'vwebp' under the
-examples/ directory. It uses OpenGL to open a simple drawing window and show
-a decoded WebP file. It's not yet integrated in the automake build system, but
-you can try to manually compile it using the recommendations below.
-
-Usage: vwebp in_file [options]
-
-Decodes the WebP image file and visualize it using OpenGL
-Options are:
-  -version ..... print version number and exit
-  -noicc ....... don't use the icc profile if present
-  -nofancy ..... don't use the fancy YUV420 upscaler
-  -nofilter .... disable in-loop filtering
-  -dither <int>  dithering strength (0..100), default=50
-  -noalphadither disable alpha plane dithering
-  -mt .......... use multi-threading
-  -info ........ print info
-  -h ........... this help message
-
-Keyboard shortcuts:
-  'c' ................ toggle use of color profile
-  'i' ................ overlay file information
-  'd' ................ disable blending & disposal (debug)
-  'q' / 'Q' / ESC .... quit
-
-Building:
----------
-
-Prerequisites:
-1) OpenGL & OpenGL Utility Toolkit (GLUT)
-  Linux:
-    $ sudo apt-get install freeglut3-dev mesa-common-dev
-  Mac + XCode:
-    - These libraries should be available in the OpenGL / GLUT frameworks.
-  Windows:
-    http://freeglut.sourceforge.net/index.php#download
-
-2) (Optional) qcms (Quick Color Management System)
-  i. Download qcms from Mozilla / Chromium:
-    http://hg.mozilla.org/mozilla-central/file/0e7639e3bdfb/gfx/qcms
-    http://src.chromium.org/viewvc/chrome/trunk/src/third_party/qcms
-  ii. Build and archive the source files as libqcms.a / qcms.lib
-  iii. Update makefile.unix / Makefile.vc
-    a) Define WEBP_HAVE_QCMS
-    b) Update include / library paths to reference the qcms directory.
-
-Build using makefile.unix / Makefile.vc:
-$ make -f makefile.unix examples/vwebp
-> nmake /f Makefile.vc CFG=release-static \
-    ../obj/x64/release-static/bin/vwebp.exe
-
-Animation creation tool:
-========================
-The utility 'img2webp' can turn a sequence of input images (PNG, JPEG, ...)
-into an animated WebP file. It offers fine control over duration, encoding
-modes, etc.
-
-Usage:
-
-  img2webp [file-level options] [image files...] [per-frame options...]
-
-File-level options (only used at the start of compression):
- -min_size ............ minimize size
- -loop <int> .......... loop count (default: 0, = infinite loop)
- -kmax <int> .......... maximum number of frame between key-frames
-                        (0=only keyframes)
- -kmin <int> .......... minimum number of frame between key-frames
-                        (0=disable key-frames altogether)
- -mixed ............... use mixed lossy/lossless automatic mode
- -v ................... verbose mode
- -h ................... this help
- -version ............. print version number and exit
-
-Per-frame options (only used for subsequent images input):
- -d <int> ............. frame duration in ms (default: 100)
- -lossless  ........... use lossless mode (default)
- -lossy ... ........... use lossy mode
- -q <float> ........... quality
- -m <int> ............. method to use
-
-example: img2webp -loop 2 in0.png -lossy in1.jpg
-                  -d 80 in2.tiff -o out.webp
-
-Animated GIF conversion:
-========================
-Animated GIF files can be converted to WebP files with animation using the
-gif2webp utility available under examples/. The files can then be viewed using
-vwebp.
-
-Usage:
- gif2webp [options] gif_file -o webp_file
-Options:
-  -h / -help ............. this help
-  -lossy ................. encode image using lossy compression
-  -mixed ................. for each frame in the image, pick lossy
-                           or lossless compression heuristically
-  -q <float> ............. quality factor (0:small..100:big)
-  -m <int> ............... compression method (0=fast, 6=slowest)
-  -min_size .............. minimize output size (default:off)
-                           lossless compression by default; can be
-                           combined with -q, -m, -lossy or -mixed
-                           options
-  -kmin <int> ............ min distance between key frames
-  -kmax <int> ............ max distance between key frames
-  -f <int> ............... filter strength (0=off..100)
-  -metadata <string> ..... comma separated list of metadata to
-                           copy from the input to the output if present
-                           Valid values: all, none, icc, xmp (default)
-  -loop_compatibility .... use compatibility mode for Chrome
-                           version prior to M62 (inclusive)
-  -mt .................... use multi-threading if available
-
-  -version ............... print version number and exit
-  -v ..................... verbose
-  -quiet ................. don't print anything
-
-Building:
----------
-With the libgif development files installed, gif2webp can be built using
-makefile.unix:
-$ make -f makefile.unix examples/gif2webp
-
-or using autoconf:
-$ ./configure --enable-everything
-$ make
-
-Comparison of animated images:
-==============================
-Test utility anim_diff under examples/ can be used to compare two animated
-images (each can be GIF or WebP).
-
-Usage: anim_diff <image1> <image2> [options]
-
-Options:
-  -dump_frames <folder> dump decoded frames in PAM format
-  -min_psnr <float> ... minimum per-frame PSNR
-  -raw_comparison ..... if this flag is not used, RGB is
-                        premultiplied before comparison
-  -max_diff <int> ..... maximum allowed difference per channel
-                        between corresponding pixels in subsequent
-                        frames
-  -h .................. this help
-  -version ............ print version number and exit
-
-Building:
----------
-With the libgif development files and a C++ compiler installed, anim_diff can
-be built using makefile.unix:
-$ make -f makefile.unix examples/anim_diff
-
-or using autoconf:
-$ ./configure --enable-everything
-$ make
-
-Encoding API:
-=============
-
-The main encoding functions are available in the header src/webp/encode.h
-The ready-to-use ones are:
-size_t WebPEncodeRGB(const uint8_t* rgb, int width, int height, int stride,
-                     float quality_factor, uint8_t** output);
-size_t WebPEncodeBGR(const uint8_t* bgr, int width, int height, int stride,
-                     float quality_factor, uint8_t** output);
-size_t WebPEncodeRGBA(const uint8_t* rgba, int width, int height, int stride,
-                      float quality_factor, uint8_t** output);
-size_t WebPEncodeBGRA(const uint8_t* bgra, int width, int height, int stride,
-                      float quality_factor, uint8_t** output);
-
-They will convert raw RGB samples to a WebP data. The only control supplied
-is the quality factor.
-
-There are some variants for using the lossless format:
-
-size_t WebPEncodeLosslessRGB(const uint8_t* rgb, int width, int height,
-                             int stride, uint8_t** output);
-size_t WebPEncodeLosslessBGR(const uint8_t* bgr, int width, int height,
-                             int stride, uint8_t** output);
-size_t WebPEncodeLosslessRGBA(const uint8_t* rgba, int width, int height,
-                              int stride, uint8_t** output);
-size_t WebPEncodeLosslessBGRA(const uint8_t* bgra, int width, int height,
-                              int stride, uint8_t** output);
-
-Of course in this case, no quality factor is needed since the compression
-occurs without loss of the input values, at the expense of larger output sizes.
-
-Advanced encoding API:
-----------------------
-
-A more advanced API is based on the WebPConfig and WebPPicture structures.
-
-WebPConfig contains the encoding settings and is not tied to a particular
-picture.
-WebPPicture contains input data, on which some WebPConfig will be used for
-compression.
-The encoding flow looks like:
-
--------------------------------------- BEGIN PSEUDO EXAMPLE
-
-#include <webp/encode.h>
-
-  // Setup a config, starting form a preset and tuning some additional
-  // parameters
-  WebPConfig config;
-  if (!WebPConfigPreset(&config, WEBP_PRESET_PHOTO, quality_factor))
-    return 0;   // version error
-  }
-  // ... additional tuning
-  config.sns_strength = 90;
-  config.filter_sharpness = 6;
-  config_error = WebPValidateConfig(&config);  // not mandatory, but useful
-
-  // Setup the input data
-  WebPPicture pic;
-  if (!WebPPictureInit(&pic)) {
-    return 0;  // version error
-  }
-  pic.width = width;
-  pic.height = height;
-  // allocated picture of dimension width x height
-  if (!WebPPictureAllocate(&pic)) {
-    return 0;   // memory error
-  }
-  // at this point, 'pic' has been initialized as a container,
-  // and can receive the Y/U/V samples.
-  // Alternatively, one could use ready-made import functions like
-  // WebPPictureImportRGB(), which will take care of memory allocation.
-  // In any case, past this point, one will have to call
-  // WebPPictureFree(&pic) to reclaim memory.
-
-  // Set up a byte-output write method. WebPMemoryWriter, for instance.
-  WebPMemoryWriter wrt;
-  WebPMemoryWriterInit(&wrt);     // initialize 'wrt'
-
-  pic.writer = MyFileWriter;
-  pic.custom_ptr = my_opaque_structure_to_make_MyFileWriter_work;
-
-  // Compress!
-  int ok = WebPEncode(&config, &pic);   // ok = 0 => error occurred!
-  WebPPictureFree(&pic);  // must be called independently of the 'ok' result.
-
-  // output data should have been handled by the writer at that point.
-  // -> compressed data is the memory buffer described by wrt.mem / wrt.size
-
-  // deallocate the memory used by compressed data
-  WebPMemoryWriterClear(&wrt);
-
--------------------------------------- END PSEUDO EXAMPLE
-
-Decoding API:
-=============
-
-This is mainly just one function to call:
-
-#include "webp/decode.h"
-uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size,
-                       int* width, int* height);
-
-Please have a look at the file src/webp/decode.h for the details.
-There are variants for decoding in BGR/RGBA/ARGB/BGRA order, along with
-decoding to raw Y'CbCr samples. One can also decode the image directly into a
-pre-allocated buffer.
-
-To detect a WebP file and gather the picture's dimensions, the function:
-  int WebPGetInfo(const uint8_t* data, size_t data_size,
-                  int* width, int* height);
-is supplied. No decoding is involved when using it.
-
-Incremental decoding API:
-=========================
-
-In the case when data is being progressively transmitted, pictures can still
-be incrementally decoded using a slightly more complicated API. Decoder state
-is stored into an instance of the WebPIDecoder object. This object can be
-created with the purpose of decoding either RGB or Y'CbCr samples.
-For instance:
-
-  WebPDecBuffer buffer;
-  WebPInitDecBuffer(&buffer);
-  buffer.colorspace = MODE_BGR;
-  ...
-  WebPIDecoder* idec = WebPINewDecoder(&buffer);
-
-As data is made progressively available, this incremental-decoder object
-can be used to decode the picture further. There are two (mutually exclusive)
-ways to pass freshly arrived data:
-
-either by appending the fresh bytes:
-
-  WebPIAppend(idec, fresh_data, size_of_fresh_data);
-
-or by just mentioning the new size of the transmitted data:
-
-  WebPIUpdate(idec, buffer, size_of_transmitted_buffer);
-
-Note that 'buffer' can be modified between each call to WebPIUpdate, in
-particular when the buffer is resized to accommodate larger data.
-
-These functions will return the decoding status: either VP8_STATUS_SUSPENDED if
-decoding is not finished yet or VP8_STATUS_OK when decoding is done. Any other
-status is an error condition.
-
-The 'idec' object must always be released (even upon an error condition) by
-calling: WebPDelete(idec).
-
-To retrieve partially decoded picture samples, one must use the corresponding
-method: WebPIDecGetRGB or WebPIDecGetYUVA.
-It will return the last displayable pixel row.
-
-Lastly, note that decoding can also be performed into a pre-allocated pixel
-buffer. This buffer must be passed when creating a WebPIDecoder, calling
-WebPINewRGB() or WebPINewYUVA().
-
-Please have a look at the src/webp/decode.h header for further details.
-
-Advanced Decoding API:
-======================
-
-WebP decoding supports an advanced API which provides on-the-fly cropping and
-rescaling, something of great usefulness on memory-constrained environments like
-mobile phones. Basically, the memory usage will scale with the output's size,
-not the input's, when one only needs a quick preview or a zoomed in portion of
-an otherwise too-large picture. Some CPU can be saved too, incidentally.
-
--------------------------------------- BEGIN PSEUDO EXAMPLE
-     // A) Init a configuration object
-     WebPDecoderConfig config;
-     CHECK(WebPInitDecoderConfig(&config));
-
-     // B) optional: retrieve the bitstream's features.
-     CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK);
-
-     // C) Adjust 'config' options, if needed
-     config.options.no_fancy_upsampling = 1;
-     config.options.use_scaling = 1;
-     config.options.scaled_width = scaledWidth();
-     config.options.scaled_height = scaledHeight();
-     // etc.
-
-     // D) Specify 'config' output options for specifying output colorspace.
-     // Optionally the external image decode buffer can also be specified.
-     config.output.colorspace = MODE_BGRA;
-     // Optionally, the config.output can be pointed to an external buffer as
-     // well for decoding the image. This externally supplied memory buffer
-     // should be big enough to store the decoded picture.
-     config.output.u.RGBA.rgba = (uint8_t*) memory_buffer;
-     config.output.u.RGBA.stride = scanline_stride;
-     config.output.u.RGBA.size = total_size_of_the_memory_buffer;
-     config.output.is_external_memory = 1;
-
-     // E) Decode the WebP image. There are two variants w.r.t decoding image.
-     // The first one (E.1) decodes the full image and the second one (E.2) is
-     // used to incrementally decode the image using small input buffers.
-     // Any one of these steps can be used to decode the WebP image.
-
-     // E.1) Decode full image.
-     CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK);
-
-     // E.2) Decode image incrementally.
-     WebPIDecoder* const idec = WebPIDecode(NULL, NULL, &config);
-     CHECK(idec != NULL);
-     while (bytes_remaining > 0) {
-       VP8StatusCode status = WebPIAppend(idec, input, bytes_read);
-       if (status == VP8_STATUS_OK || status == VP8_STATUS_SUSPENDED) {
-         bytes_remaining -= bytes_read;
-       } else {
-         break;
-       }
-     }
-     WebPIDelete(idec);
-
-     // F) Decoded image is now in config.output (and config.output.u.RGBA).
-     // It can be saved, displayed or otherwise processed.
-
-     // G) Reclaim memory allocated in config's object. It's safe to call
-     // this function even if the memory is external and wasn't allocated
-     // by WebPDecode().
-     WebPFreeDecBuffer(&config.output);
-
--------------------------------------- END PSEUDO EXAMPLE
-
-Bugs:
-=====
-
-Please report all bugs to the issue tracker:
-    https://bugs.chromium.org/p/webp
-Patches welcome! See this page to get started:
-    http://www.webmproject.org/code/contribute/submitting-patches/
-
-Discuss:
-========
-
-Email: webp-discuss@webmproject.org
-Web: http://groups.google.com/a/webmproject.org/group/webp-discuss
diff --git a/third_party/libwebp/README.md b/third_party/libwebp/README.md
new file mode 100644
index 0000000..a877320
--- /dev/null
+++ b/third_party/libwebp/README.md
@@ -0,0 +1,53 @@
+# WebP Codec
+
+```
+      __   __  ____  ____  ____
+     /  \\/  \/  _ \/  _ )/  _ \
+     \       /   __/  _  \   __/
+      \__\__/\____/\_____/__/ ____  ___
+            / _/ /    \    \ /  _ \/ _/
+           /  \_/   / /   \ \   __/  \__
+           \____/____/\_____/_____/____/v1.3.1
+```
+
+WebP codec is a library to encode and decode images in WebP format. This package
+contains the library that can be used in other programs to add WebP support, as
+well as the command line tools 'cwebp' and 'dwebp' to compress and decompress
+images respectively.
+
+See https://developers.google.com/speed/webp for details on the image format.
+
+The latest source tree is available at
+https://chromium.googlesource.com/webm/libwebp
+
+It is released under the same license as the WebM project. See
+https://www.webmproject.org/license/software/ or the "COPYING" file for details.
+An additional intellectual property rights grant can be found in the file
+PATENTS.
+
+## Building
+
+See the [building documentation](doc/building.md).
+
+## Encoding and Decoding Tools
+
+The examples/ directory contains tools to encode and decode images and
+animations, view information about WebP images, and more. See the
+[tools documentation](doc/tools.md).
+
+## APIs
+
+See the [APIs documentation](doc/api.md), and API usage examples in the
+`examples/` directory.
+
+## Bugs
+
+Please report all bugs to the issue tracker: https://bugs.chromium.org/p/webp
+
+Patches welcome! See [how to contribute](CONTRIBUTING.md).
+
+## Discuss
+
+Email: webp-discuss@webmproject.org
+
+Web: https://groups.google.com/a/webmproject.org/group/webp-discuss
diff --git a/third_party/libwebp/README.mux b/third_party/libwebp/README.mux
deleted file mode 100644
index bd4f92f..0000000
--- a/third_party/libwebp/README.mux
+++ /dev/null
@@ -1,227 +0,0 @@
-          __   __  ____  ____  ____  __ __  _     __ __
-         /  \\/  \/  _ \/  _ \/  _ \/  \  \/ \___/_ / _\
-         \       /   __/  _  \   __/      /  /  (_/  /__
-          \__\__/\_____/_____/__/  \__//_/\_____/__/___/v1.0.0
-
-
-Description:
-============
-
-WebPMux: set of two libraries 'Mux' and 'Demux' for creation, extraction and
-manipulation of an extended format WebP file, which can have features like
-color profile, metadata and animation. Reference command-line tools 'webpmux'
-and 'vwebp' as well as the WebP container specification
-'doc/webp-container-spec.txt' are also provided in this package.
-
-WebP Mux tool:
-==============
-
-The examples/ directory contains a tool (webpmux) for manipulating WebP
-files. The webpmux tool can be used to create an extended format WebP file and
-also to extract or strip relevant data from such a file.
-
-A list of options is available using the -help command line flag:
-
-> webpmux -help
-Usage: webpmux -get GET_OPTIONS INPUT -o OUTPUT
-       webpmux -set SET_OPTIONS INPUT -o OUTPUT
-       webpmux -duration DURATION_OPTIONS [-duration ...]
-               INPUT -o OUTPUT
-       webpmux -strip STRIP_OPTIONS INPUT -o OUTPUT
-       webpmux -frame FRAME_OPTIONS [-frame...] [-loop LOOP_COUNT]
-               [-bgcolor BACKGROUND_COLOR] -o OUTPUT
-       webpmux -info INPUT
-       webpmux [-h|-help]
-       webpmux -version
-       webpmux argument_file_name
-
-GET_OPTIONS:
- Extract relevant data:
-   icc       get ICC profile
-   exif      get EXIF metadata
-   xmp       get XMP metadata
-   frame n   get nth frame
-
-SET_OPTIONS:
- Set color profile/metadata:
-   icc  file.icc     set ICC profile
-   exif file.exif    set EXIF metadata
-   xmp  file.xmp     set XMP metadata
-   where:    'file.icc' contains the ICC profile to be set,
-             'file.exif' contains the EXIF metadata to be set
-             'file.xmp' contains the XMP metadata to be set
-
-DURATION_OPTIONS:
- Set duration of selected frames:
-   duration            set duration for each frames
-   duration,frame      set duration of a particular frame
-   duration,start,end  set duration of frames in the
-                        interval [start,end])
-   where: 'duration' is the duration in milliseconds
-          'start' is the start frame index
-          'end' is the inclusive end frame index
-           The special 'end' value '0' means: last frame.
-
-STRIP_OPTIONS:
- Strip color profile/metadata:
-   icc       strip ICC profile
-   exif      strip EXIF metadata
-   xmp       strip XMP metadata
-
-FRAME_OPTIONS(i):
- Create animation:
-   file_i +di+[xi+yi[+mi[bi]]]
-   where:    'file_i' is the i'th animation frame (WebP format),
-             'di' is the pause duration before next frame,
-             'xi','yi' specify the image offset for this frame,
-             'mi' is the dispose method for this frame (0 or 1),
-             'bi' is the blending method for this frame (+b or -b)
-
-LOOP_COUNT:
- Number of times to repeat the animation.
- Valid range is 0 to 65535 [Default: 0 (infinite)].
-
-BACKGROUND_COLOR:
- Background color of the canvas.
-  A,R,G,B
-  where:    'A', 'R', 'G' and 'B' are integers in the range 0 to 255 specifying
-            the Alpha, Red, Green and Blue component values respectively
-            [Default: 255,255,255,255]
-
-INPUT & OUTPUT are in WebP format.
-
-Note: The nature of EXIF, XMP and ICC data is not checked and is assumed to be
-valid.
-
-Note: if a single file name is passed as the argument, the arguments will be
-tokenized from this file. The file name must not start with the character '-'.
-
-Visualization tool:
-===================
-
-The examples/ directory also contains a tool (vwebp) for viewing WebP files.
-It decodes the image and visualizes it using OpenGL. See the libwebp README
-for details on building and running this program.
-
-Mux API:
-========
-The Mux API contains methods for adding data to and reading data from WebP
-files. This API currently supports XMP/EXIF metadata, ICC profile and animation.
-Other features may be added in subsequent releases.
-
-Example#1 (pseudo code): Creating a WebPMux object with image data, color
-profile and XMP metadata.
-
-  int copy_data = 0;
-  WebPMux* mux = WebPMuxNew();
-  // ... (Prepare image data).
-  WebPMuxSetImage(mux, &image, copy_data);
-  // ... (Prepare ICC profile data).
-  WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data);
-  // ... (Prepare XMP metadata).
-  WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data);
-  // Get data from mux in WebP RIFF format.
-  WebPMuxAssemble(mux, &output_data);
-  WebPMuxDelete(mux);
-  // ... (Consume output_data; e.g. write output_data.bytes to file).
-  WebPDataClear(&output_data);
-
-
-Example#2 (pseudo code): Get image and color profile data from a WebP file.
-
-  int copy_data = 0;
-  // ... (Read data from file).
-  WebPMux* mux = WebPMuxCreate(&data, copy_data);
-  WebPMuxGetFrame(mux, 1, &image);
-  // ... (Consume image; e.g. call WebPDecode() to decode the data).
-  WebPMuxGetChunk(mux, "ICCP", &icc_profile);
-  // ... (Consume icc_profile).
-  WebPMuxDelete(mux);
-  free(data);
-
-
-For a detailed Mux API reference, please refer to the header file
-(src/webp/mux.h).
-
-Demux API:
-==========
-The Demux API enables extraction of images and extended format data from
-WebP files. This API currently supports reading of XMP/EXIF metadata, ICC
-profile and animated images. Other features may be added in subsequent
-releases.
-
-Code example: Demuxing WebP data to extract all the frames, ICC profile
-and EXIF/XMP metadata.
-
-  WebPDemuxer* demux = WebPDemux(&webp_data);
-  uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
-  uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
-  // ... (Get information about the features present in the WebP file).
-  uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
-
-  // ... (Iterate over all frames).
-  WebPIterator iter;
-  if (WebPDemuxGetFrame(demux, 1, &iter)) {
-    do {
-      // ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(),
-      // ... and get other frame properties like width, height, offsets etc.
-      // ... see 'struct WebPIterator' below for more info).
-    } while (WebPDemuxNextFrame(&iter));
-    WebPDemuxReleaseIterator(&iter);
-  }
-
-  // ... (Extract metadata).
-  WebPChunkIterator chunk_iter;
-  if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter);
-  // ... (Consume the ICC profile in 'chunk_iter.chunk').
-  WebPDemuxReleaseChunkIterator(&chunk_iter);
-  if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter);
-  // ... (Consume the EXIF metadata in 'chunk_iter.chunk').
-  WebPDemuxReleaseChunkIterator(&chunk_iter);
-  if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter);
-  // ... (Consume the XMP metadata in 'chunk_iter.chunk').
-  WebPDemuxReleaseChunkIterator(&chunk_iter);
-  WebPDemuxDelete(demux);
-
-
-For a detailed Demux API reference, please refer to the header file
-(src/webp/demux.h).
-
-AnimEncoder API:
-================
-The AnimEncoder API can be used to create animated WebP images.
-
-Code example:
-
-  WebPAnimEncoderOptions enc_options;
-  WebPAnimEncoderOptionsInit(&enc_options);
-  // ... (Tune 'enc_options' as needed).
-  WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options);
-  while(<there are more frames>) {
-    WebPConfig config;
-    WebPConfigInit(&config);
-    // ... (Tune 'config' as needed).
-    WebPAnimEncoderAdd(enc, frame, duration, &config);
-  }
-  WebPAnimEncoderAssemble(enc, webp_data);
-  WebPAnimEncoderDelete(enc);
-  // ... (Write the 'webp_data' to a file, or re-mux it further).
-
-
-For a detailed AnimEncoder API reference, please refer to the header file
-(src/webp/mux.h).
-
-
-Bugs:
-=====
-
-Please report all bugs to the issue tracker:
-    https://bugs.chromium.org/p/webp
-Patches welcome! See this page to get started:
-    http://www.webmproject.org/code/contribute/submitting-patches/
-
-Discuss:
-========
-
-Email: webp-discuss@webmproject.org
-Web: http://groups.google.com/a/webmproject.org/group/webp-discuss
diff --git a/third_party/libwebp/README.webp_js b/third_party/libwebp/README.webp_js
deleted file mode 100644
index 2805354..0000000
--- a/third_party/libwebp/README.webp_js
+++ /dev/null
@@ -1,76 +0,0 @@
-     __   __ ____ ____ ____     __  ____
-    /  \\/  \  _ \  _ \  _ \   (__)/  __\
-    \       /  __/ _  \  __/   _)  \_   \
-     \__\__/_____/____/_/     /____/____/
-
-Description:
-============
-
-This file describes the compilation of libwebp into a JavaScript decoder
-using Emscripten and CMake.
-
- - install the Emscripten SDK following the procedure described at:
-   https://kripken.github.io/emscripten-site/docs/getting_started/downloads.html
-   After installation, you should have some global variable positioned to the
-   location of the SDK. In particular, $EMSCRIPTEN should point to the
-   top-level directory containing Emscripten tools.
-
- - make sure the file $EMSCRIPTEN/cmake/Modules/Platform/Emscripten.cmake is
-   accessible. This is the toolchain file used by CMake to invoke Emscripten.
-
- - configure the project 'WEBP_JS' with CMake using:
-
- cd webp_js && \
- cmake -DWEBP_BUILD_WEBP_JS=ON \
-       -DEMSCRIPTEN_GENERATE_BITCODE_STATIC_LIBRARIES=1 \
-       -DCMAKE_TOOLCHAIN_FILE=$EMSCRIPTEN/cmake/Modules/Platform/Emscripten.cmake \
-       ../
-
- - compile webp.js using 'make'.
-
- - that's it! Upon completion, you should have the webp.js and
-   webp.js.mem files generated.
-
-The callable JavaScript function is WebPToSDL(), which decodes a raw WebP
-bitstream into a canvas. See webp_js/index.html for a simple usage sample
-(see below for instructions).
-
-Demo HTML page:
-===============
-
-   The HTML page webp_js/index.html requires an HTTP server to serve the WebP
-   image example. It's easy to just use Python for that.
-
-cd webp_js && python -m SimpleHTTPServer 8080
-
-and then navigate to http://localhost:8080 in your favorite browser.
-
-
-Web-Assembly (WASM) version:
-============================
-
-  CMakeLists.txt is configured to build the WASM version when using
-  the option WEBP_BUILD_WEBP_JS=ON. The compilation step will assemble
-  the files 'webp_wasm.js', 'webp_wasm.wasm' in the webp_js/ directory.
-  See webp_js/index_wasm.html for a simple demo page using the WASM version
-  of the library.
-
-  You will need a fairly recent version of Emscripten (at least 1.37.8) and of
-  your WASM-enabled browser to run this version. Consider it very experimental!
-
-Caveat:
-=======
-
-  - First decoding using the library is usually slower, due to just-in-time
-    compilation.
-
-  - Some versions of llvm produce the following compile error when SSE2 is
-    enabled.
-
-"Unsupported:   %516 = bitcast <8 x i16> %481 to i128
- LLVM ERROR: BitCast Instruction not yet supported for integer types larger than 64 bits"
-
-    The corresponding Emscripten bug is at:
-    https://github.com/kripken/emscripten/issues/3788
-
-    Therefore, SSE2 optimization is currently disabled in CMakeLists.txt.
diff --git a/third_party/libwebp/build.gradle b/third_party/libwebp/build.gradle
index 88ad129..c25314c 100644
--- a/third_party/libwebp/build.gradle
+++ b/third_party/libwebp/build.gradle
@@ -105,6 +105,14 @@
       sources {
         c {
           source {
+            srcDir "sharpyuv"
+            include "sharpyuv.c"
+            include "sharpyuv_cpu.c"
+            include "sharpyuv_csp.c"
+            include "sharpyuv_dsp.c"
+            include "sharpyuv_gamma.c"
+            include "sharpyuv_neon.c"
+            include "sharpyuv_sse2.c"
             srcDir "src/dec"
             include "alpha_dec.c"
             include "buffer_dec.c"
@@ -141,6 +149,7 @@
             include "lossless_msa.c"
             include "lossless_neon.$NEON"
             include "lossless_sse2.c"
+            include "lossless_sse41.c"
             include "rescaler.c"
             include "rescaler_mips32.c"
             include "rescaler_mips_dsp_r2.c"
@@ -173,9 +182,9 @@
             include "cost.c"
             include "cost_mips32.c"
             include "cost_mips_dsp_r2.c"
+            include "cost_neon.$NEON"
             include "cost_sse2.c"
             include "enc.c"
-            include "enc_avx2.c"
             include "enc_mips32.c"
             include "enc_mips_dsp_r2.c"
             include "enc_msa.c"
@@ -432,8 +441,3 @@
     }
   }
 }
-
-// Task to generate the wrapper.
-task wrapper(type: Wrapper) {
-  gradleVersion = '2.13'
-}
diff --git a/third_party/libwebp/cmake/WebPConfig.cmake.in b/third_party/libwebp/cmake/WebPConfig.cmake.in
index ef3df2f..8c883fe 100644
--- a/third_party/libwebp/cmake/WebPConfig.cmake.in
+++ b/third_party/libwebp/cmake/WebPConfig.cmake.in
@@ -1,6 +1,18 @@
+set(WebP_VERSION @PROJECT_VERSION@)
+set(WEBP_VERSION ${WebP_VERSION})
+
 @PACKAGE_INIT@
 
-set(WebP_INCLUDE_DIRS "webp")
+if(@WEBP_USE_THREAD@)
+  include(CMakeFindDependencyMacro)
+  find_dependency(Threads REQUIRED)
+endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
+
+set_and_check(WebP_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@")
 set(WEBP_INCLUDE_DIRS ${WebP_INCLUDE_DIRS})
 set(WebP_LIBRARIES "@INSTALLED_LIBRARIES@")
 set(WEBP_LIBRARIES "${WebP_LIBRARIES}")
+
+check_required_components(WebP)
diff --git a/third_party/libwebp/cmake/config.h.in b/third_party/libwebp/cmake/config.h.in
index ec84acd..fe1c53a 100644
--- a/third_party/libwebp/cmake/config.h.in
+++ b/third_party/libwebp/cmake/config.h.in
@@ -16,48 +16,18 @@
 /* Define to 1 if you have the <cpu-features.h> header file. */
 #cmakedefine HAVE_CPU_FEATURES_H 1
 
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#cmakedefine HAVE_DLFCN_H 1
-
 /* Define to 1 if you have the <GLUT/glut.h> header file. */
 #cmakedefine HAVE_GLUT_GLUT_H 1
 
 /* Define to 1 if you have the <GL/glut.h> header file. */
 #cmakedefine HAVE_GL_GLUT_H 1
 
-/* Define to 1 if you have the <inttypes.h> header file. */
-#cmakedefine HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#cmakedefine HAVE_MEMORY_H 1
-
 /* Define to 1 if you have the <OpenGL/glut.h> header file. */
 #cmakedefine HAVE_OPENGL_GLUT_H 1
 
-/* Have PTHREAD_PRIO_INHERIT. */
-#cmakedefine HAVE_PTHREAD_PRIO_INHERIT @HAVE_PTHREAD_PRIO_INHERIT@
-
 /* Define to 1 if you have the <shlwapi.h> header file. */
 #cmakedefine HAVE_SHLWAPI_H 1
 
-/* Define to 1 if you have the <stdint.h> header file. */
-#cmakedefine HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#cmakedefine HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#cmakedefine HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#cmakedefine HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#cmakedefine HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#cmakedefine HAVE_SYS_TYPES_H 1
-
 /* Define to 1 if you have the <unistd.h> header file. */
 #cmakedefine HAVE_UNISTD_H 1
 
@@ -93,19 +63,9 @@
 /* Define to the version of this package. */
 #cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@"
 
-/* Define to necessary symbol if this constant uses a non-standard name on
-   your system. */
-#cmakedefine PTHREAD_CREATE_JOINABLE 1
-
-/* Define to 1 if you have the ANSI C header files. */
-#cmakedefine STDC_HEADERS 1
-
 /* Version number of package */
 #cmakedefine VERSION "@VERSION@"
 
-/* Set to 1 if AVX2 is supported */
-#cmakedefine WEBP_HAVE_AVX2 1
-
 /* Set to 1 if GIF library is installed */
 #cmakedefine WEBP_HAVE_GIF 1
 
diff --git a/third_party/libwebp/cmake/cpu.cmake b/third_party/libwebp/cmake/cpu.cmake
index 5aa1bfd..7513ca8 100644
--- a/third_party/libwebp/cmake/cpu.cmake
+++ b/third_party/libwebp/cmake/cpu.cmake
@@ -1,4 +1,12 @@
-## Check for SIMD extensions.
+#  Copyright (c) 2021 Google LLC.
+#
+#  Use of this source code is governed by a BSD-style license
+#  that can be found in the LICENSE file in the root of the source
+#  tree. An additional intellectual property rights grant can be found
+#  in the file PATENTS.  All contributing project authors may
+#  be found in the AUTHORS file in the root of the source tree.
+
+# Check for SIMD extensions.
 include(CMakePushCheckState)
 
 function(webp_check_compiler_flag WEBP_SIMD_FLAG ENABLE_SIMD)
@@ -10,7 +18,8 @@
   unset(WEBP_HAVE_FLAG_${WEBP_SIMD_FLAG} CACHE)
   cmake_push_check_state()
   set(CMAKE_REQUIRED_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR})
-  check_c_source_compiles("
+  check_c_source_compiles(
+    "
       #include \"${CMAKE_CURRENT_LIST_DIR}/../src/dsp/dsp.h\"
       int main(void) {
         #if !defined(WEBP_USE_${WEBP_SIMD_FLAG})
@@ -18,8 +27,8 @@
         #endif
         return 0;
       }
-    " WEBP_HAVE_FLAG_${WEBP_SIMD_FLAG}
-  )
+    "
+    WEBP_HAVE_FLAG_${WEBP_SIMD_FLAG})
   cmake_pop_check_state()
   if(WEBP_HAVE_FLAG_${WEBP_SIMD_FLAG})
     set(WEBP_HAVE_${WEBP_SIMD_FLAG} 1 PARENT_SCOPE)
@@ -29,28 +38,34 @@
 endfunction()
 
 # those are included in the names of WEBP_USE_* in c++ code.
-set(WEBP_SIMD_FLAGS "SSE2;SSE41;AVX2;MIPS32;MIPS_DSP_R2;NEON;MSA")
-set(WEBP_SIMD_FILE_EXTENSIONS "_sse2.c;_sse41.c;_avx2.c;_mips32.c;_mips_dsp_r2.c;_neon.c;_msa.c")
-if(MSVC)
-  # MSVC does not have a SSE4 flag but AVX2 support implies
-  # SSE4 support.
-  set(SIMD_ENABLE_FLAGS "/arch:SSE2;/arch:AVX2;/arch:AVX2;;;;")
+set(WEBP_SIMD_FLAGS "SSE41;SSE2;MIPS32;MIPS_DSP_R2;NEON;MSA")
+set(WEBP_SIMD_FILE_EXTENSIONS
+    "_sse41.c;_sse2.c;_mips32.c;_mips_dsp_r2.c;_neon.c;_msa.c")
+if(MSVC AND CMAKE_C_COMPILER_ID STREQUAL "MSVC")
+  # With at least Visual Studio 12 (2013)+ /arch is not necessary to build SSE2
+  # or SSE4 code unless a lesser /arch is forced. MSVC does not have a SSE4
+  # flag, but an AVX one. Using that with SSE4 code risks generating illegal
+  # instructions when used on machines with SSE4 only. The flags are left for
+  # older (untested) versions to avoid any potential compatibility issues.
+  if(MSVC_VERSION GREATER_EQUAL 1800 AND NOT CMAKE_C_FLAGS MATCHES "/arch:")
+    set(SIMD_ENABLE_FLAGS)
+  else()
+    set(SIMD_ENABLE_FLAGS "/arch:AVX;/arch:SSE2;;;;")
+  endif()
   set(SIMD_DISABLE_FLAGS)
 else()
-  set(SIMD_ENABLE_FLAGS "-msse2;-msse4.1;-mavx2;-mips32;-mdspr2;-mfpu=neon;-mmsa")
-  set(SIMD_DISABLE_FLAGS "-mno-sse2;-mno-sse4.1;-mno-avx2;;-mno-dspr2;;-mno-msa")
+  set(SIMD_ENABLE_FLAGS "-msse4.1;-msse2;-mips32;-mdspr2;-mfpu=neon;-mmsa")
+  set(SIMD_DISABLE_FLAGS "-mno-sse4.1;-mno-sse2;;-mno-dspr2;;-mno-msa")
 endif()
 
-set(WEBP_SIMD_FILES_TO_NOT_INCLUDE)
 set(WEBP_SIMD_FILES_TO_INCLUDE)
 set(WEBP_SIMD_FLAGS_TO_INCLUDE)
 
 if(${ANDROID})
   if(${ANDROID_ABI} STREQUAL "armeabi-v7a")
-    # This is because Android studio uses the configuration
-    # "-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
-    # that does not trigger neon optimizations but should
-    # (as this configuration does not exist anymore).
+    # This is because Android studio uses the configuration "-march=armv7-a
+    # -mfloat-abi=softfp -mfpu=vfpv3-d16" that does not trigger neon
+    # optimizations but should (as this configuration does not exist anymore).
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon ")
   endif()
 endif()
@@ -59,6 +74,12 @@
 math(EXPR WEBP_SIMD_FLAGS_RANGE "${WEBP_SIMD_FLAGS_LENGTH} - 1")
 
 foreach(I_SIMD RANGE ${WEBP_SIMD_FLAGS_RANGE})
+  # With Emscripten 2.0.9 -msimd128 -mfpu=neon will enable NEON, but the source
+  # will fail to compile.
+  if(EMSCRIPTEN AND ${I_SIMD} GREATER_EQUAL 2)
+    break()
+  endif()
+
   list(GET WEBP_SIMD_FLAGS ${I_SIMD} WEBP_SIMD_FLAG)
 
   # First try with no extra flag added as the compiler might have default flags
@@ -69,16 +90,24 @@
   webp_check_compiler_flag(${WEBP_SIMD_FLAG} ${WEBP_ENABLE_SIMD})
   if(NOT WEBP_HAVE_${WEBP_SIMD_FLAG})
     list(GET SIMD_ENABLE_FLAGS ${I_SIMD} SIMD_COMPILE_FLAG)
+    if(EMSCRIPTEN)
+      set(SIMD_COMPILE_FLAG "-msimd128 ${SIMD_COMPILE_FLAG}")
+    endif()
     set(CMAKE_REQUIRED_FLAGS ${SIMD_COMPILE_FLAG})
     webp_check_compiler_flag(${WEBP_SIMD_FLAG} ${WEBP_ENABLE_SIMD})
   else()
-    set(SIMD_COMPILE_FLAG " ")
+    if(MSVC AND SIMD_ENABLE_FLAGS)
+      # The detection for SSE2/SSE4 support under MSVC is based on the compiler
+      # version so e.g., clang-cl will require flags to enable the assembly.
+      list(GET SIMD_ENABLE_FLAGS ${I_SIMD} SIMD_COMPILE_FLAG)
+    else()
+      set(SIMD_COMPILE_FLAG " ")
+    endif()
   endif()
   # Check which files we should include or not.
   list(GET WEBP_SIMD_FILE_EXTENSIONS ${I_SIMD} WEBP_SIMD_FILE_EXTENSION)
   file(GLOB SIMD_FILES "${CMAKE_CURRENT_LIST_DIR}/../"
-    "src/dsp/*${WEBP_SIMD_FILE_EXTENSION}"
-  )
+       "src/dsp/*${WEBP_SIMD_FILE_EXTENSION}")
   if(WEBP_HAVE_${WEBP_SIMD_FLAG})
     # Memorize the file and flags.
     foreach(FILE ${SIMD_FILES})
@@ -95,6 +124,12 @@
       list(GET SIMD_DISABLE_FLAGS ${I_SIMD} SIMD_COMPILE_FLAG)
       include(CheckCCompilerFlag)
       if(SIMD_COMPILE_FLAG)
+        # Between 3.17.0 and 3.18.2 check_cxx_compiler_flag() sets a normal
+        # variable at parent scope while check_cxx_source_compiles() continues
+        # to set an internal cache variable, so we unset both to avoid the
+        # failure / success state persisting between checks. See
+        # https://gitlab.kitware.com/cmake/cmake/-/issues/21207.
+        unset(HAS_COMPILE_FLAG)
         unset(HAS_COMPILE_FLAG CACHE)
         check_c_compiler_flag(${SIMD_COMPILE_FLAG} HAS_COMPILE_FLAG)
         if(HAS_COMPILE_FLAG)
@@ -106,12 +141,11 @@
             set(COMMON_PATTERNS)
           endif()
           set(CMAKE_REQUIRED_DEFINITIONS ${SIMD_COMPILE_FLAG})
-          check_c_source_compiles("int main(void) {return 0;}"
-            FLAG_${SIMD_COMPILE_FLAG}
-            FAIL_REGEX "warning: argument unused during compilation:"
-            ${COMMON_PATTERNS}
-          )
+          check_c_source_compiles(
+            "int main(void) {return 0;}" FLAG_${SIMD_COMPILE_FLAG} FAIL_REGEX
+            "warning: argument unused during compilation:" ${COMMON_PATTERNS})
           if(NOT FLAG_${SIMD_COMPILE_FLAG})
+            unset(HAS_COMPILE_FLAG)
             unset(HAS_COMPILE_FLAG CACHE)
           endif()
         endif()
diff --git a/third_party/libwebp/cmake/deps.cmake b/third_party/libwebp/cmake/deps.cmake
index 3d5d10a..0760ba9 100644
--- a/third_party/libwebp/cmake/deps.cmake
+++ b/third_party/libwebp/cmake/deps.cmake
@@ -1,130 +1,137 @@
+#  Copyright (c) 2021 Google LLC.
+#
+#  Use of this source code is governed by a BSD-style license
+#  that can be found in the LICENSE file in the root of the source
+#  tree. An additional intellectual property rights grant can be found
+#  in the file PATENTS.  All contributing project authors may
+#  be found in the AUTHORS file in the root of the source tree.
+
 # Generate the config.h to compile with specific intrinsics / libs.
 
-## Check for compiler options.
+# Check for compiler options.
 include(CheckCSourceCompiles)
-check_c_source_compiles("
+check_c_source_compiles(
+  "
     int main(void) {
       (void)__builtin_bswap16(0);
       return 0;
     }
   "
-  HAVE_BUILTIN_BSWAP16
-)
-check_c_source_compiles("
+  HAVE_BUILTIN_BSWAP16)
+check_c_source_compiles(
+  "
     int main(void) {
       (void)__builtin_bswap32(0);
       return 0;
     }
   "
-  HAVE_BUILTIN_BSWAP32
-)
-check_c_source_compiles("
+  HAVE_BUILTIN_BSWAP32)
+check_c_source_compiles(
+  "
     int main(void) {
       (void)__builtin_bswap64(0);
       return 0;
     }
   "
-  HAVE_BUILTIN_BSWAP64
-)
+  HAVE_BUILTIN_BSWAP64)
 
-## Check for libraries.
-find_package(Threads)
-if(Threads_FOUND)
-  if(CMAKE_USE_PTHREADS_INIT)
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")
+# Check for libraries.
+if(WEBP_USE_THREAD)
+  find_package(Threads)
+  if(Threads_FOUND)
+    # work around cmake bug on QNX (https://cmake.org/Bug/view.php?id=11333)
+    if(CMAKE_USE_PTHREADS_INIT AND NOT CMAKE_SYSTEM_NAME STREQUAL "QNX")
+      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")
+    endif()
+    list(APPEND WEBP_DEP_LIBRARIES Threads::Threads)
   endif()
-  foreach(PTHREAD_TEST HAVE_PTHREAD_PRIO_INHERIT PTHREAD_CREATE_UNDETACHED)
-    check_c_source_compiles("
-        #include <pthread.h>
-        int main (void) {
-          int attr = ${PTHREAD_TEST};
-          return attr;
-        }
-      " ${PTHREAD_TEST}
-    )
-  endforeach()
-  list(APPEND WEBP_DEP_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
+  set(WEBP_USE_THREAD ${Threads_FOUND})
 endif()
-set(WEBP_USE_THREAD ${Threads_FOUND})
 
 # TODO: this seems unused, check with autotools.
 set(LT_OBJDIR ".libs/")
 
 # Only useful for vwebp, so useless for now.
-# find_package(OpenGL)
-# set(WEBP_HAVE_GL ${OPENGL_FOUND})
-# set(WEBP_DEP_INCLUDE_DIRS ${WEBP_DEP_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIRS})
-# set(WEBP_DEP_LIBRARIES ${WEBP_DEP_LIBRARIES} ${OPENGL_LIBRARIES})
+find_package(OpenGL)
+set(WEBP_HAVE_GL ${OPENGL_FOUND})
 
-# Find the standard C math library.
-find_library(MATH_LIBRARY NAMES m)
-if(MATH_LIBRARY)
-  list(APPEND WEBP_DEP_LIBRARIES ${MATH_LIBRARY})
+# Check if we need to link to the C math library. We do not look for it as it is
+# not found when cross-compiling, while it is here.
+check_c_source_compiles(
+  "
+    #include <math.h>
+    int main(int argc, char** argv) {
+      return (int)pow(argc, 2.5);
+    }
+  "
+  HAVE_MATH_LIBRARY)
+if(NOT HAVE_MATH_LIBRARY)
+  message(STATUS "Adding -lm flag.")
+  list(APPEND SHARPYUV_DEP_LIBRARIES m)
+  list(APPEND WEBP_DEP_LIBRARIES m)
 endif()
 
 # Find the standard image libraries.
 set(WEBP_DEP_IMG_LIBRARIES)
 set(WEBP_DEP_IMG_INCLUDE_DIRS)
-foreach(I_LIB PNG JPEG TIFF)
-  find_package(${I_LIB})
-  set(WEBP_HAVE_${I_LIB} ${${I_LIB}_FOUND})
-  if(${I_LIB}_FOUND)
-    list(APPEND WEBP_DEP_IMG_LIBRARIES ${${I_LIB}_LIBRARIES})
-    list(APPEND WEBP_DEP_IMG_INCLUDE_DIRS
-         ${${I_LIB}_INCLUDE_DIR} ${${I_LIB}_INCLUDE_DIRS})
+if(WEBP_FIND_IMG_LIBS)
+  foreach(I_LIB PNG JPEG TIFF)
+    # Disable tiff when compiling in static mode as it is failing on Ubuntu.
+    if(WEBP_LINK_STATIC AND ${I_LIB} STREQUAL "TIFF")
+      message(STATUS "TIFF is disabled when statically linking.")
+      continue()
+    endif()
+    find_package(${I_LIB})
+    set(WEBP_HAVE_${I_LIB} ${${I_LIB}_FOUND})
+    if(${I_LIB}_FOUND)
+      list(APPEND WEBP_DEP_IMG_LIBRARIES ${${I_LIB}_LIBRARIES})
+      list(APPEND WEBP_DEP_IMG_INCLUDE_DIRS ${${I_LIB}_INCLUDE_DIR}
+           ${${I_LIB}_INCLUDE_DIRS})
+    endif()
+  endforeach()
+  if(WEBP_DEP_IMG_INCLUDE_DIRS)
+    list(REMOVE_DUPLICATES WEBP_DEP_IMG_INCLUDE_DIRS)
   endif()
-endforeach()
-if(WEBP_DEP_IMG_INCLUDE_DIRS)
-  list(REMOVE_DUPLICATES WEBP_DEP_IMG_INCLUDE_DIRS)
-endif()
 
-# GIF detection, gifdec isn't part of the imageio lib.
-include(CMakePushCheckState)
-set(WEBP_DEP_GIF_LIBRARIES)
-set(WEBP_DEP_GIF_INCLUDE_DIRS)
-find_package(GIF)
-set(WEBP_HAVE_GIF ${GIF_FOUND})
-if(GIF_FOUND)
-  # GIF find_package only locates the header and library, it doesn't fail
-  # compile tests when detecting the version, but falls back to 3 (as of at
-  # least cmake 3.7.2). Make sure the library links to avoid incorrect
-  # detection when cross compiling.
-  cmake_push_check_state()
-  set(CMAKE_REQUIRED_LIBRARIES ${GIF_LIBRARIES})
-  set(CMAKE_REQUIRED_INCLUDES ${GIF_INCLUDE_DIR})
-  check_c_source_compiles("
+  # GIF detection, gifdec isn't part of the imageio lib.
+  include(CMakePushCheckState)
+  set(WEBP_DEP_GIF_LIBRARIES)
+  set(WEBP_DEP_GIF_INCLUDE_DIRS)
+  find_package(GIF)
+  set(WEBP_HAVE_GIF ${GIF_FOUND})
+  if(GIF_FOUND)
+    # GIF find_package only locates the header and library, it doesn't fail
+    # compile tests when detecting the version, but falls back to 3 (as of at
+    # least cmake 3.7.2). Make sure the library links to avoid incorrect
+    # detection when cross compiling.
+    cmake_push_check_state()
+    set(CMAKE_REQUIRED_LIBRARIES ${GIF_LIBRARIES})
+    set(CMAKE_REQUIRED_INCLUDES ${GIF_INCLUDE_DIR})
+    check_c_source_compiles(
+      "
       #include <gif_lib.h>
       int main(void) {
         (void)DGifOpenFileHandle;
         return 0;
       }
-      " GIF_COMPILES
-  )
-  cmake_pop_check_state()
-  if(GIF_COMPILES)
-    list(APPEND WEBP_DEP_GIF_LIBRARIES ${GIF_LIBRARIES})
-    list(APPEND WEBP_DEP_GIF_INCLUDE_DIRS ${GIF_INCLUDE_DIR})
-  else()
-    unset(GIF_FOUND)
+      "
+      GIF_COMPILES)
+    cmake_pop_check_state()
+    if(GIF_COMPILES)
+      list(APPEND WEBP_DEP_GIF_LIBRARIES ${GIF_LIBRARIES})
+      list(APPEND WEBP_DEP_GIF_INCLUDE_DIRS ${GIF_INCLUDE_DIR})
+    else()
+      unset(GIF_FOUND)
+    endif()
   endif()
 endif()
 
-## Check for specific headers.
+# Check for specific headers.
 include(CheckIncludeFiles)
-check_include_files("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS)
-check_include_files(dlfcn.h HAVE_DLFCN_H)
 check_include_files(GLUT/glut.h HAVE_GLUT_GLUT_H)
 check_include_files(GL/glut.h HAVE_GL_GLUT_H)
-check_include_files(inttypes.h HAVE_INTTYPES_H)
-check_include_files(memory.h HAVE_MEMORY_H)
 check_include_files(OpenGL/glut.h HAVE_OPENGL_GLUT_H)
 check_include_files(shlwapi.h HAVE_SHLWAPI_H)
-check_include_files(stdint.h HAVE_STDINT_H)
-check_include_files(stdlib.h HAVE_STDLIB_H)
-check_include_files(strings.h HAVE_STRINGS_H)
-check_include_files(string.h HAVE_STRING_H)
-check_include_files(sys/stat.h HAVE_SYS_STAT_H)
-check_include_files(sys/types.h HAVE_SYS_TYPES_H)
 check_include_files(unistd.h HAVE_UNISTD_H)
 check_include_files(wincodec.h HAVE_WINCODEC_H)
 check_include_files(windows.h HAVE_WINDOWS_H)
@@ -134,18 +141,17 @@
   list(APPEND WEBP_DEP_LIBRARIES shlwapi ole32 windowscodecs)
 endif()
 
-## Check for SIMD extensions.
+# Check for SIMD extensions.
 include(${CMAKE_CURRENT_LIST_DIR}/cpu.cmake)
 
-## Define extra info.
+# Define extra info.
 set(PACKAGE ${PROJECT_NAME})
 set(PACKAGE_NAME ${PROJECT_NAME})
 
 # Read from configure.ac.
 file(READ ${CMAKE_CURRENT_SOURCE_DIR}/configure.ac CONFIGURE_AC)
-string(REGEX MATCHALL "\\[([0-9a-z\\.:/]*)\\]"
-  CONFIGURE_AC_PACKAGE_INFO ${CONFIGURE_AC}
-)
+string(REGEX MATCHALL "\\[([0-9a-z\\.:/]*)\\]" CONFIGURE_AC_PACKAGE_INFO
+             ${CONFIGURE_AC})
 function(strip_bracket VAR)
   string(LENGTH ${${VAR}} TMP_LEN)
   math(EXPR TMP_LEN ${TMP_LEN}-2)
diff --git a/third_party/libwebp/codereview.settings b/third_party/libwebp/codereview.settings
deleted file mode 100644
index acbc431..0000000
--- a/third_party/libwebp/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
\ No newline at end of file
diff --git a/third_party/libwebp/configure.ac b/third_party/libwebp/configure.ac
index 896e5ff..a999e0c 100644
--- a/third_party/libwebp/configure.ac
+++ b/third_party/libwebp/configure.ac
@@ -1,6 +1,6 @@
-AC_INIT([libwebp], [1.0.0],
+AC_INIT([libwebp], [1.3.1],
         [https://bugs.chromium.org/p/webp],,
-        [http://developers.google.com/speed/webp])
+        [https://developers.google.com/speed/webp])
 AC_CANONICAL_HOST
 AC_PREREQ([2.60])
 AM_INIT_AUTOMAKE([-Wall foreign subdir-objects])
@@ -9,7 +9,8 @@
 dnl === it must occur before LT_INIT (AC_PROG_LIBTOOL).
 m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
 
-AC_PROG_LIBTOOL
+dnl === AC_PROG_LIBTOOL is deprecated.
+m4_ifdef([LT_INIT], [LT_INIT], [AC_PROG_LIBTOOL])
 AC_PROG_SED
 AM_PROG_CC_C_O
 
@@ -27,11 +28,46 @@
               AS_HELP_STRING([--enable-everything],
                              [Enable all optional targets. These can still be
                               disabled with --disable-target]),
-              [SET_IF_UNSET([enable_libwebpdecoder], [$enableval])
+              [SET_IF_UNSET([enable_libsharpyuv], [$enableval])
+               SET_IF_UNSET([enable_libwebpdecoder], [$enableval])
                SET_IF_UNSET([enable_libwebpdemux], [$enableval])
                SET_IF_UNSET([enable_libwebpextras], [$enableval])
                SET_IF_UNSET([enable_libwebpmux], [$enableval])])
 
+dnl === Check whether libwebpmux should be built
+AC_MSG_CHECKING(whether libwebpmux is to be built)
+AC_ARG_ENABLE([libwebpmux],
+              AS_HELP_STRING([--disable-libwebpmux],
+                             [Disable libwebpmux @<:@default=no@:>@]),
+              [], [enable_libwebpmux=yes])
+AC_MSG_RESULT(${enable_libwebpmux-no})
+AM_CONDITIONAL([BUILD_MUX], [test "$enable_libwebpmux" = "yes"])
+
+dnl === Check whether libwebpdemux should be built
+AC_MSG_CHECKING(whether libwebpdemux is to be built)
+AC_ARG_ENABLE([libwebpdemux],
+              AS_HELP_STRING([--disable-libwebpdemux],
+                             [Disable libwebpdemux @<:@default=no@:>@]),
+              [], [enable_libwebpdemux=yes])
+AC_MSG_RESULT(${enable_libwebpdemux-no})
+AM_CONDITIONAL([BUILD_DEMUX], [test "$enable_libwebpdemux" = "yes"])
+
+dnl === Check whether decoder library should be built.
+AC_MSG_CHECKING(whether decoder library is to be built)
+AC_ARG_ENABLE([libwebpdecoder],
+              AS_HELP_STRING([--enable-libwebpdecoder],
+                             [Build libwebpdecoder @<:@default=no@:>@]))
+AC_MSG_RESULT(${enable_libwebpdecoder-no})
+AM_CONDITIONAL([BUILD_LIBWEBPDECODER], [test "$enable_libwebpdecoder" = "yes"])
+
+dnl === Check whether libwebpextras should be built
+AC_MSG_CHECKING(whether libwebpextras is to be built)
+AC_ARG_ENABLE([libwebpextras],
+              AS_HELP_STRING([--enable-libwebpextras],
+                             [Build libwebpextras @<:@default=no@:>@]))
+AC_MSG_RESULT(${enable_libwebpextras-no})
+AM_CONDITIONAL([BUILD_EXTRAS], [test "$enable_libwebpextras" = "yes"])
+
 dnl === If --enable-asserts is not defined, define NDEBUG
 
 AC_MSG_CHECKING(whether asserts are enabled)
@@ -80,6 +116,7 @@
 TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wshadow])
 TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wshorten-64-to-32])
 TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wundef])
+TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wunreachable-code-aggressive])
 TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wunreachable-code])
 TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wunused-but-set-variable])
 TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wunused])
@@ -122,31 +159,6 @@
 AC_SUBST([AM_CFLAGS])
 
 dnl === Check for machine specific flags
-AC_ARG_ENABLE([avx2],
-              AS_HELP_STRING([--disable-avx2],
-                             [Disable detection of AVX2 support
-                              @<:@default=auto@:>@]))
-
-AS_IF([test "x$enable_avx2" != "xno" -a "x$enable_sse4_1" != "xno" \
-         -a "x$enable_sse2" != "xno"], [
-  AVX2_CFLAGS="$INTRINSICS_CFLAGS $AVX2_FLAGS"
-  TEST_AND_ADD_CFLAGS([AVX2_FLAGS], [-mavx2])
-  AS_IF([test -n "$AVX2_FLAGS"], [
-    SAVED_CFLAGS=$CFLAGS
-    CFLAGS="$CFLAGS $AVX2_FLAGS"
-    AC_CHECK_HEADER([immintrin.h],
-                    [AC_DEFINE(WEBP_HAVE_AVX2, [1],
-                     [Set to 1 if AVX2 is supported])],
-                    [AVX2_FLAGS=""],
-                    dnl it's illegal to directly include avx2intrin.h, but it's
-                    dnl included conditionally in immintrin.h, tricky!
-                    [#ifndef __AVX2__
-                     #error avx2 is not enabled
-                     #endif
-                    ])
-    CFLAGS=$SAVED_CFLAGS])
-  AC_SUBST([AVX2_FLAGS])])
-
 AC_ARG_ENABLE([sse4.1],
               AS_HELP_STRING([--disable-sse4.1],
                              [Disable detection of SSE4.1 support
@@ -249,6 +261,9 @@
         *android*) AC_CHECK_HEADERS([cpu-features.h]) ;;
       esac
       ;;
+    aarch64*|arm64*)
+      AC_DEFINE(WEBP_HAVE_NEON, [1], [Set to 1 if NEON is supported])
+      ;;
   esac
   AC_SUBST([NEON_FLAGS])])
 
@@ -433,6 +448,10 @@
 
   if test "$glut_support" = "yes" -a "$enable_libwebpdemux" = "yes"; then
     build_vwebp=yes
+  else
+    AC_MSG_NOTICE(
+      m4_normalize([Not building vwebp.
+                    OpenGL libraries and --enable-libwebpdemux are required.]))
   fi
 ])
 AM_CONDITIONAL([BUILD_VWEBP], [test "$build_vwebp" = "yes"])
@@ -492,7 +511,7 @@
   if test x"$sdl_support" = "xyes"; then
     build_vwebp_sdl=yes
   else
-    AC_MSG_WARN(Optional SDL library not found)
+    AC_MSG_NOTICE([Not building vwebp-sdl. SDL library is required.])
   fi
 ])
 
@@ -616,11 +635,17 @@
   if test "$gif_support" = "yes" -a \
           "$enable_libwebpdemux" = "yes"; then
     build_anim_diff=yes
+  else
+    AC_MSG_NOTICE(
+      [Not building anim_diff. libgif and --enable-libwebpdemux are required.])
   fi
 
   if test "$gif_support" = "yes" -a \
           "$enable_libwebpmux" = "yes"; then
     build_gif2webp=yes
+  else
+    AC_MSG_NOTICE(
+      [Not building gif2webp. libgif and --enable-libwebpmux are required.])
   fi
 ])
 AM_CONDITIONAL([BUILD_ANIMDIFF], [test "${build_anim_diff}" = "yes"])
@@ -628,11 +653,17 @@
 
 if test "$enable_libwebpdemux" = "yes" -a "$enable_libwebpmux" = "yes"; then
   build_img2webp=yes
+else
+  AC_MSG_NOTICE(
+    m4_normalize([Not building img2webp.
+                  --enable-libwebpdemux & --enable-libwebpmux are required.]))
 fi
 AM_CONDITIONAL([BUILD_IMG2WEBP], [test "${build_img2webp}" = "yes"])
 
 if test "$enable_libwebpmux" = "yes"; then
   build_webpinfo=yes
+else
+  AC_MSG_NOTICE([Not building webpinfo. --enable-libwebpdemux is required.])
 fi
 AM_CONDITIONAL([BUILD_WEBPINFO], [test "${build_webpinfo}" = "yes"])
 
@@ -716,45 +747,15 @@
   AC_MSG_RESULT([no])
 fi
 
-dnl === Check whether libwebpmux should be built
-AC_MSG_CHECKING(whether libwebpmux is to be built)
-AC_ARG_ENABLE([libwebpmux],
-              AS_HELP_STRING([--enable-libwebpmux],
-                             [Build libwebpmux @<:@default=no@:>@]))
-AC_MSG_RESULT(${enable_libwebpmux-no})
-AM_CONDITIONAL([WANT_MUX], [test "$enable_libwebpmux" = "yes"])
-
-dnl === Check whether libwebpdemux should be built
-AC_MSG_CHECKING(whether libwebpdemux is to be built)
-AC_ARG_ENABLE([libwebpdemux],
-              AS_HELP_STRING([--disable-libwebpdemux],
-                             [Disable libwebpdemux @<:@default=no@:>@]),
-              [], [enable_libwebpdemux=yes])
-AC_MSG_RESULT(${enable_libwebpdemux-no})
-AM_CONDITIONAL([WANT_DEMUX], [test "$enable_libwebpdemux" = "yes"])
-
-dnl === Check whether decoder library should be built.
-AC_MSG_CHECKING(whether decoder library is to be built)
-AC_ARG_ENABLE([libwebpdecoder],
-              AS_HELP_STRING([--enable-libwebpdecoder],
-                             [Build libwebpdecoder @<:@default=no@:>@]))
-AC_MSG_RESULT(${enable_libwebpdecoder-no})
-AM_CONDITIONAL([BUILD_LIBWEBPDECODER], [test "$enable_libwebpdecoder" = "yes"])
-
-dnl === Check whether libwebpextras should be built
-AC_MSG_CHECKING(whether libwebpextras is to be built)
-AC_ARG_ENABLE([libwebpextras],
-              AS_HELP_STRING([--enable-libwebpextras],
-                             [Build libwebpextras @<:@default=no@:>@]))
-AC_MSG_RESULT(${enable_libwebpextras-no})
-AM_CONDITIONAL([WANT_EXTRAS], [test "$enable_libwebpextras" = "yes"])
-
 dnl =========================
 
+dnl Add an empty webp_libname_prefix variable for use in *.pc.in.
+AC_SUBST([webp_libname_prefix])
 AC_CONFIG_MACRO_DIR([m4])
 AC_CONFIG_HEADERS([src/webp/config.h])
 AC_CONFIG_FILES([Makefile src/Makefile man/Makefile \
                  examples/Makefile extras/Makefile imageio/Makefile \
+                 sharpyuv/Makefile sharpyuv/libsharpyuv.pc \
                  src/dec/Makefile src/enc/Makefile src/dsp/Makefile \
                  src/demux/Makefile src/mux/Makefile \
                  src/utils/Makefile \
diff --git a/third_party/libwebp/doc/README b/third_party/libwebp/doc/README
deleted file mode 100644
index 7f23e0c..0000000
--- a/third_party/libwebp/doc/README
+++ /dev/null
@@ -1,29 +0,0 @@
-
-Generate libwebp Container Spec Docs from Text Source
-=====================================================
-
-HTML generation requires kramdown [1], easily installed as a
-rubygem [2].  Rubygems installation should satisfy dependencies
-automatically.
-
-[1]: http://kramdown.rubyforge.org/
-[2]: http://rubygems.org/
-
-HTML generation can then be done from the project root:
-
-$ kramdown doc/webp-container-spec.txt --template doc/template.html > \
-  doc/output/webp-container-spec.html
-
-kramdown can optionally syntax highlight code blocks, using CodeRay [3],
-a dependency of kramdown that rubygems will install automatically.  The
-following will apply inline CSS styling; an external stylesheet is not
-needed.
-
-$ kramdown doc/webp-lossless-bitstream-spec.txt --template \
-  doc/template.html --coderay-css style --coderay-line-numbers ' ' \
-  --coderay-default-lang c > \
-  doc/output/webp-lossless-bitstream-spec.html
-
-Optimally, use kramdown 0.13.7 or newer if syntax highlighting desired.
-
-[3]: http://coderay.rubychan.de/
diff --git a/third_party/libwebp/doc/api.md b/third_party/libwebp/doc/api.md
new file mode 100644
index 0000000..c613ed3
--- /dev/null
+++ b/third_party/libwebp/doc/api.md
@@ -0,0 +1,385 @@
+# WebP APIs
+
+## Encoding API
+
+The main encoding functions are available in the header src/webp/encode.h
+
+The ready-to-use ones are:
+
+```c
+size_t WebPEncodeRGB(const uint8_t* rgb, int width, int height, int stride,
+                     float quality_factor, uint8_t** output);
+size_t WebPEncodeBGR(const uint8_t* bgr, int width, int height, int stride,
+                     float quality_factor, uint8_t** output);
+size_t WebPEncodeRGBA(const uint8_t* rgba, int width, int height, int stride,
+                      float quality_factor, uint8_t** output);
+size_t WebPEncodeBGRA(const uint8_t* bgra, int width, int height, int stride,
+                      float quality_factor, uint8_t** output);
+```
+
+They will convert raw RGB samples to a WebP data. The only control supplied is
+the quality factor.
+
+There are some variants for using the lossless format:
+
+```c
+size_t WebPEncodeLosslessRGB(const uint8_t* rgb, int width, int height,
+                             int stride, uint8_t** output);
+size_t WebPEncodeLosslessBGR(const uint8_t* bgr, int width, int height,
+                             int stride, uint8_t** output);
+size_t WebPEncodeLosslessRGBA(const uint8_t* rgba, int width, int height,
+                              int stride, uint8_t** output);
+size_t WebPEncodeLosslessBGRA(const uint8_t* bgra, int width, int height,
+                              int stride, uint8_t** output);
+```
+
+Of course in this case, no quality factor is needed since the compression occurs
+without loss of the input values, at the expense of larger output sizes.
+
+### Advanced encoding API
+
+A more advanced API is based on the WebPConfig and WebPPicture structures.
+
+WebPConfig contains the encoding settings and is not tied to a particular
+picture. WebPPicture contains input data, on which some WebPConfig will be used
+for compression. The encoding flow looks like:
+
+```c
+#include <webp/encode.h>
+
+// Setup a config, starting form a preset and tuning some additional
+// parameters
+WebPConfig config;
+if (!WebPConfigPreset(&config, WEBP_PRESET_PHOTO, quality_factor)) {
+  return 0;   // version error
+}
+// ... additional tuning
+config.sns_strength = 90;
+config.filter_sharpness = 6;
+config_error = WebPValidateConfig(&config);  // not mandatory, but useful
+
+// Setup the input data
+WebPPicture pic;
+if (!WebPPictureInit(&pic)) {
+  return 0;  // version error
+}
+pic.width = width;
+pic.height = height;
+// allocated picture of dimension width x height
+if (!WebPPictureAlloc(&pic)) {
+  return 0;   // memory error
+}
+// at this point, 'pic' has been initialized as a container,
+// and can receive the Y/U/V samples.
+// Alternatively, one could use ready-made import functions like
+// WebPPictureImportRGB(), which will take care of memory allocation.
+// In any case, past this point, one will have to call
+// WebPPictureFree(&pic) to reclaim memory.
+
+// Set up a byte-output write method. WebPMemoryWriter, for instance.
+WebPMemoryWriter wrt;
+WebPMemoryWriterInit(&wrt);     // initialize 'wrt'
+
+pic.writer = MyFileWriter;
+pic.custom_ptr = my_opaque_structure_to_make_MyFileWriter_work;
+
+// Compress!
+int ok = WebPEncode(&config, &pic);   // ok = 0 => error occurred!
+WebPPictureFree(&pic);  // must be called independently of the 'ok' result.
+
+// output data should have been handled by the writer at that point.
+// -> compressed data is the memory buffer described by wrt.mem / wrt.size
+
+// deallocate the memory used by compressed data
+WebPMemoryWriterClear(&wrt);
+```
+
+## Decoding API
+
+This is mainly just one function to call:
+
+```c
+#include "webp/decode.h"
+uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size,
+                       int* width, int* height);
+```
+
+Please have a look at the file src/webp/decode.h for the details. There are
+variants for decoding in BGR/RGBA/ARGB/BGRA order, along with decoding to raw
+Y'CbCr samples. One can also decode the image directly into a pre-allocated
+buffer.
+
+To detect a WebP file and gather the picture's dimensions, the function:
+
+```c
+int WebPGetInfo(const uint8_t* data, size_t data_size,
+                int* width, int* height);
+```
+
+is supplied. No decoding is involved when using it.
+
+### Incremental decoding API
+
+In the case when data is being progressively transmitted, pictures can still be
+incrementally decoded using a slightly more complicated API. Decoder state is
+stored into an instance of the WebPIDecoder object. This object can be created
+with the purpose of decoding either RGB or Y'CbCr samples. For instance:
+
+```c
+WebPDecBuffer buffer;
+WebPInitDecBuffer(&buffer);
+buffer.colorspace = MODE_BGR;
+...
+WebPIDecoder* idec = WebPINewDecoder(&buffer);
+```
+
+As data is made progressively available, this incremental-decoder object can be
+used to decode the picture further. There are two (mutually exclusive) ways to
+pass freshly arrived data:
+
+either by appending the fresh bytes:
+
+```c
+WebPIAppend(idec, fresh_data, size_of_fresh_data);
+```
+
+or by just mentioning the new size of the transmitted data:
+
+```c
+WebPIUpdate(idec, buffer, size_of_transmitted_buffer);
+```
+
+Note that 'buffer' can be modified between each call to WebPIUpdate, in
+particular when the buffer is resized to accommodate larger data.
+
+These functions will return the decoding status: either VP8_STATUS_SUSPENDED if
+decoding is not finished yet or VP8_STATUS_OK when decoding is done. Any other
+status is an error condition.
+
+The 'idec' object must always be released (even upon an error condition) by
+calling: WebPDelete(idec).
+
+To retrieve partially decoded picture samples, one must use the corresponding
+method: WebPIDecGetRGB or WebPIDecGetYUVA. It will return the last displayable
+pixel row.
+
+Lastly, note that decoding can also be performed into a pre-allocated pixel
+buffer. This buffer must be passed when creating a WebPIDecoder, calling
+WebPINewRGB() or WebPINewYUVA().
+
+Please have a look at the src/webp/decode.h header for further details.
+
+### Advanced Decoding API
+
+WebP decoding supports an advanced API which provides on-the-fly cropping and
+rescaling, something of great usefulness on memory-constrained environments like
+mobile phones. Basically, the memory usage will scale with the output's size,
+not the input's, when one only needs a quick preview or a zoomed in portion of
+an otherwise too-large picture. Some CPU can be saved too, incidentally.
+
+```c
+// A) Init a configuration object
+WebPDecoderConfig config;
+CHECK(WebPInitDecoderConfig(&config));
+
+// B) optional: retrieve the bitstream's features.
+CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK);
+
+// C) Adjust 'config' options, if needed
+config.options.no_fancy_upsampling = 1;
+config.options.use_scaling = 1;
+config.options.scaled_width = scaledWidth();
+config.options.scaled_height = scaledHeight();
+// etc.
+
+// D) Specify 'config' output options for specifying output colorspace.
+// Optionally the external image decode buffer can also be specified.
+config.output.colorspace = MODE_BGRA;
+// Optionally, the config.output can be pointed to an external buffer as
+// well for decoding the image. This externally supplied memory buffer
+// should be big enough to store the decoded picture.
+config.output.u.RGBA.rgba = (uint8_t*) memory_buffer;
+config.output.u.RGBA.stride = scanline_stride;
+config.output.u.RGBA.size = total_size_of_the_memory_buffer;
+config.output.is_external_memory = 1;
+
+// E) Decode the WebP image. There are two variants w.r.t decoding image.
+// The first one (E.1) decodes the full image and the second one (E.2) is
+// used to incrementally decode the image using small input buffers.
+// Any one of these steps can be used to decode the WebP image.
+
+// E.1) Decode full image.
+CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK);
+
+// E.2) Decode image incrementally.
+WebPIDecoder* const idec = WebPIDecode(NULL, NULL, &config);
+CHECK(idec != NULL);
+while (bytes_remaining > 0) {
+  VP8StatusCode status = WebPIAppend(idec, input, bytes_read);
+  if (status == VP8_STATUS_OK || status == VP8_STATUS_SUSPENDED) {
+    bytes_remaining -= bytes_read;
+  } else {
+    break;
+  }
+}
+WebPIDelete(idec);
+
+// F) Decoded image is now in config.output (and config.output.u.RGBA).
+// It can be saved, displayed or otherwise processed.
+
+// G) Reclaim memory allocated in config's object. It's safe to call
+// this function even if the memory is external and wasn't allocated
+// by WebPDecode().
+WebPFreeDecBuffer(&config.output);
+```
+
+## WebP Mux
+
+WebPMux is a set of two libraries 'Mux' and 'Demux' for creation, extraction and
+manipulation of an extended format WebP file, which can have features like color
+profile, metadata and animation. Reference command-line tools `webpmux` and
+`vwebp` as well as the WebP container specification
+'doc/webp-container-spec.txt' are also provided in this package, see the
+[tools documentation](tools.md).
+
+### Mux API
+
+The Mux API contains methods for adding data to and reading data from WebP
+files. This API currently supports XMP/EXIF metadata, ICC profile and animation.
+Other features may be added in subsequent releases.
+
+Example#1 (pseudo code): Creating a WebPMux object with image data, color
+profile and XMP metadata.
+
+```c
+int copy_data = 0;
+WebPMux* mux = WebPMuxNew();
+// ... (Prepare image data).
+WebPMuxSetImage(mux, &image, copy_data);
+// ... (Prepare ICC profile data).
+WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data);
+// ... (Prepare XMP metadata).
+WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data);
+// Get data from mux in WebP RIFF format.
+WebPMuxAssemble(mux, &output_data);
+WebPMuxDelete(mux);
+// ... (Consume output_data; e.g. write output_data.bytes to file).
+WebPDataClear(&output_data);
+```
+
+Example#2 (pseudo code): Get image and color profile data from a WebP file.
+
+```c
+int copy_data = 0;
+// ... (Read data from file).
+WebPMux* mux = WebPMuxCreate(&data, copy_data);
+WebPMuxGetFrame(mux, 1, &image);
+// ... (Consume image; e.g. call WebPDecode() to decode the data).
+WebPMuxGetChunk(mux, "ICCP", &icc_profile);
+// ... (Consume icc_profile).
+WebPMuxDelete(mux);
+free(data);
+```
+
+For a detailed Mux API reference, please refer to the header file
+(src/webp/mux.h).
+
+### Demux API
+
+The Demux API enables extraction of images and extended format data from WebP
+files. This API currently supports reading of XMP/EXIF metadata, ICC profile and
+animated images. Other features may be added in subsequent releases.
+
+Code example: Demuxing WebP data to extract all the frames, ICC profile and
+EXIF/XMP metadata.
+
+```c
+WebPDemuxer* demux = WebPDemux(&webp_data);
+uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
+uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
+// ... (Get information about the features present in the WebP file).
+uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
+
+// ... (Iterate over all frames).
+WebPIterator iter;
+if (WebPDemuxGetFrame(demux, 1, &iter)) {
+  do {
+    // ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(),
+    // ... and get other frame properties like width, height, offsets etc.
+    // ... see 'struct WebPIterator' below for more info).
+  } while (WebPDemuxNextFrame(&iter));
+  WebPDemuxReleaseIterator(&iter);
+}
+
+// ... (Extract metadata).
+WebPChunkIterator chunk_iter;
+if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter);
+// ... (Consume the ICC profile in 'chunk_iter.chunk').
+WebPDemuxReleaseChunkIterator(&chunk_iter);
+if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter);
+// ... (Consume the EXIF metadata in 'chunk_iter.chunk').
+WebPDemuxReleaseChunkIterator(&chunk_iter);
+if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter);
+// ... (Consume the XMP metadata in 'chunk_iter.chunk').
+WebPDemuxReleaseChunkIterator(&chunk_iter);
+WebPDemuxDelete(demux);
+```
+
+For a detailed Demux API reference, please refer to the header file
+(src/webp/demux.h).
+
+## AnimEncoder API
+
+The AnimEncoder API can be used to create animated WebP images.
+
+Code example:
+
+```c
+WebPAnimEncoderOptions enc_options;
+WebPAnimEncoderOptionsInit(&enc_options);
+// ... (Tune 'enc_options' as needed).
+WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options);
+while(<there are more frames>) {
+  WebPConfig config;
+  WebPConfigInit(&config);
+  // ... (Tune 'config' as needed).
+  WebPAnimEncoderAdd(enc, frame, duration, &config);
+}
+WebPAnimEncoderAssemble(enc, webp_data);
+WebPAnimEncoderDelete(enc);
+// ... (Write the 'webp_data' to a file, or re-mux it further).
+```
+
+For a detailed AnimEncoder API reference, please refer to the header file
+(src/webp/mux.h).
+
+## AnimDecoder API
+
+This AnimDecoder API allows decoding (possibly) animated WebP images.
+
+Code Example:
+
+```c
+WebPAnimDecoderOptions dec_options;
+WebPAnimDecoderOptionsInit(&dec_options);
+// Tune 'dec_options' as needed.
+WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options);
+WebPAnimInfo anim_info;
+WebPAnimDecoderGetInfo(dec, &anim_info);
+for (uint32_t i = 0; i < anim_info.loop_count; ++i) {
+  while (WebPAnimDecoderHasMoreFrames(dec)) {
+    uint8_t* buf;
+    int timestamp;
+    WebPAnimDecoderGetNext(dec, &buf, &timestamp);
+    // ... (Render 'buf' based on 'timestamp').
+    // ... (Do NOT free 'buf', as it is owned by 'dec').
+  }
+  WebPAnimDecoderReset(dec);
+}
+const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec);
+// ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data).
+WebPAnimDecoderDelete(dec);
+```
+
+For a detailed AnimDecoder API reference, please refer to the header file
+(src/webp/demux.h).
diff --git a/third_party/libwebp/doc/building.md b/third_party/libwebp/doc/building.md
new file mode 100644
index 0000000..5efeab9
--- /dev/null
+++ b/third_party/libwebp/doc/building.md
@@ -0,0 +1,213 @@
+# Building
+
+## Windows build
+
+By running:
+
+```batch
+nmake /f Makefile.vc CFG=release-static RTLIBCFG=static OBJDIR=output
+```
+
+the directory `output\release-static\(x64|x86)\bin` will contain the tools
+cwebp.exe and dwebp.exe. The directory `output\release-static\(x64|x86)\lib`
+will contain the libwebp static library. The target architecture (x86/x64) is
+detected by Makefile.vc from the Visual Studio compiler (cl.exe) available in
+the system path.
+
+## Unix build using makefile.unix
+
+On platforms with GNU tools installed (gcc and make), running
+
+```shell
+make -f makefile.unix
+```
+
+will build the binaries examples/cwebp and examples/dwebp, along with the static
+library src/libwebp.a. No system-wide installation is supplied, as this is a
+simple alternative to the full installation system based on the autoconf tools
+(see below). Please refer to makefile.unix for additional details and
+customizations.
+
+## Using autoconf tools
+
+Prerequisites: a compiler (e.g., gcc), make, autoconf, automake, libtool.
+
+On a Debian-like system the following should install everything you need for a
+minimal build:
+
+```shell
+$ sudo apt-get install gcc make autoconf automake libtool
+```
+
+When building from git sources, you will need to run autogen.sh to generate the
+configure script.
+
+```shell
+./configure
+make
+make install
+```
+
+should be all you need to have the following files
+
+```
+/usr/local/include/webp/decode.h
+/usr/local/include/webp/encode.h
+/usr/local/include/webp/types.h
+/usr/local/lib/libwebp.*
+/usr/local/bin/cwebp
+/usr/local/bin/dwebp
+```
+
+installed.
+
+Note: A decode-only library, libwebpdecoder, is available using the
+`--enable-libwebpdecoder` flag. The encode library is built separately and can
+be installed independently using a minor modification in the corresponding
+Makefile.am configure files (see comments there). See `./configure --help` for
+more options.
+
+## Building for MIPS Linux
+
+MIPS Linux toolchain stable available releases can be found at:
+https://community.imgtec.com/developers/mips/tools/codescape-mips-sdk/available-releases/
+
+```shell
+# Add toolchain to PATH
+export PATH=$PATH:/path/to/toolchain/bin
+
+# 32-bit build for mips32r5 (p5600)
+HOST=mips-mti-linux-gnu
+MIPS_CFLAGS="-O3 -mips32r5 -mabi=32 -mtune=p5600 -mmsa -mfp64 \
+  -msched-weight -mload-store-pairs -fPIE"
+MIPS_LDFLAGS="-mips32r5 -mabi=32 -mmsa -mfp64 -pie"
+
+# 64-bit build for mips64r6 (i6400)
+HOST=mips-img-linux-gnu
+MIPS_CFLAGS="-O3 -mips64r6 -mabi=64 -mtune=i6400 -mmsa -mfp64 \
+  -msched-weight -mload-store-pairs -fPIE"
+MIPS_LDFLAGS="-mips64r6 -mabi=64 -mmsa -mfp64 -pie"
+
+./configure --host=${HOST} --build=`config.guess` \
+  CC="${HOST}-gcc -EL" \
+  CFLAGS="$MIPS_CFLAGS" \
+  LDFLAGS="$MIPS_LDFLAGS"
+make
+make install
+```
+
+## CMake
+
+With CMake, you can compile libwebp, cwebp, dwebp, gif2webp, img2webp, webpinfo
+and the JS bindings.
+
+Prerequisites: a compiler (e.g., gcc with autotools) and CMake.
+
+On a Debian-like system the following should install everything you need for a
+minimal build:
+
+```shell
+$ sudo apt-get install build-essential cmake
+```
+
+When building from git sources, you will need to run cmake to generate the
+makefiles.
+
+```shell
+mkdir build && cd build && cmake ../
+make
+make install
+```
+
+If you also want any of the executables, you will need to enable them through
+CMake, e.g.:
+
+```shell
+cmake -DWEBP_BUILD_CWEBP=ON -DWEBP_BUILD_DWEBP=ON ../
+```
+
+or through your favorite interface (like ccmake or cmake-qt-gui).
+
+Use option `-DWEBP_UNICODE=ON` for Unicode support on Windows (with chcp 65001).
+
+Finally, once installed, you can also use WebP in your CMake project by doing:
+
+```cmake
+find_package(WebP)
+```
+
+which will define the CMake variables WebP_INCLUDE_DIRS and WebP_LIBRARIES.
+
+## Gradle
+
+The support for Gradle is minimal: it only helps you compile libwebp, cwebp and
+dwebp and webpmux_example.
+
+Prerequisites: a compiler (e.g., gcc with autotools) and gradle.
+
+On a Debian-like system the following should install everything you need for a
+minimal build:
+
+```shell
+$ sudo apt-get install build-essential gradle
+```
+
+When building from git sources, you will need to run the Gradle wrapper with the
+appropriate target, e.g. :
+
+```shell
+./gradlew buildAllExecutables
+```
+
+## SWIG bindings
+
+To generate language bindings from swig/libwebp.swig at least swig-1.3
+(http://www.swig.org) is required.
+
+Currently the following functions are mapped:
+
+Decode:
+
+```
+WebPGetDecoderVersion
+WebPGetInfo
+WebPDecodeRGBA
+WebPDecodeARGB
+WebPDecodeBGRA
+WebPDecodeBGR
+WebPDecodeRGB
+```
+
+Encode:
+
+```
+WebPGetEncoderVersion
+WebPEncodeRGBA
+WebPEncodeBGRA
+WebPEncodeRGB
+WebPEncodeBGR
+WebPEncodeLosslessRGBA
+WebPEncodeLosslessBGRA
+WebPEncodeLosslessRGB
+WebPEncodeLosslessBGR
+```
+
+See also the [swig documentation](../swig/README.md) for more detailed build
+instructions and usage examples.
+
+### Java bindings
+
+To build the swig-generated JNI wrapper code at least JDK-1.5 (or equivalent) is
+necessary for enum support. The output is intended to be a shared object / DLL
+that can be loaded via `System.loadLibrary("webp_jni")`.
+
+### Python bindings
+
+To build the swig-generated Python extension code at least Python 2.6 is
+required. Python < 2.6 may build with some minor changes to libwebp.swig or the
+generated code, but is untested.
+
+## Javascript decoder
+
+Libwebp can be compiled into a JavaScript decoder using Emscripten and CMake.
+See the [corresponding documentation](../README.md)
diff --git a/third_party/libwebp/doc/specs_generation.md b/third_party/libwebp/doc/specs_generation.md
new file mode 100644
index 0000000..0380d66
--- /dev/null
+++ b/third_party/libwebp/doc/specs_generation.md
@@ -0,0 +1,26 @@
+# Generate libwebp Container Spec Docs from Text Source
+
+HTML generation requires [kramdown](https://kramdown.gettalong.org/), easily
+installed as a [rubygem](https://rubygems.org/). Rubygems installation should
+satisfy dependencies automatically.
+
+HTML generation can then be done from the project root:
+
+```shell
+$ kramdown doc/webp-container-spec.txt --template doc/template.html > \
+  doc/output/webp-container-spec.html
+```
+
+kramdown can optionally syntax highlight code blocks, using
+[CodeRay](https://github.com/rubychan/coderay), a dependency of kramdown that
+rubygems will install automatically. The following will apply inline CSS
+styling; an external stylesheet is not needed.
+
+```shell
+$ kramdown doc/webp-lossless-bitstream-spec.txt --template \
+  doc/template.html --coderay-css style --coderay-line-numbers ' ' \
+  --coderay-default-lang c > \
+  doc/output/webp-lossless-bitstream-spec.html
+```
+
+Optimally, use kramdown 0.13.7 or newer if syntax highlighting desired.
diff --git a/third_party/libwebp/doc/tools.md b/third_party/libwebp/doc/tools.md
new file mode 100644
index 0000000..bf49274
--- /dev/null
+++ b/third_party/libwebp/doc/tools.md
@@ -0,0 +1,516 @@
+# WebP tools
+
+## Encoding tool
+
+The examples/ directory contains tools for encoding (cwebp) and decoding (dwebp)
+images.
+
+The easiest use should look like:
+
+```shell
+cwebp input.png -q 80 -o output.webp
+```
+
+which will convert the input file to a WebP file using a quality factor of 80 on
+a 0->100 scale (0 being the lowest quality, 100 being the best. Default value is
+75).
+
+You might want to try the `-lossless` flag too, which will compress the source
+(in RGBA format) without any loss. The `-q` quality parameter will in this case
+control the amount of processing time spent trying to make the output file as
+small as possible.
+
+A longer list of options is available using the `-longhelp` command line flag:
+
+```shell
+> cwebp -longhelp
+Usage:
+ cwebp [-preset <...>] [options] in_file [-o out_file]
+```
+
+If input size (-s) for an image is not specified, it is assumed to be a PNG,
+JPEG, TIFF or WebP file. Note: Animated PNG and WebP files are not supported.
+
+Options:
+
+```
+-h / -help ............. short help
+-H / -longhelp ......... long help
+-q <float> ............. quality factor (0:small..100:big), default=75
+-alpha_q <int> ......... transparency-compression quality (0..100),
+                         default=100
+-preset <string> ....... preset setting, one of:
+                          default, photo, picture,
+                          drawing, icon, text
+   -preset must come first, as it overwrites other parameters
+-z <int> ............... activates lossless preset with given
+                         level in [0:fast, ..., 9:slowest]
+
+-m <int> ............... compression method (0=fast, 6=slowest), default=4
+-segments <int> ........ number of segments to use (1..4), default=4
+-size <int> ............ target size (in bytes)
+-psnr <float> .......... target PSNR (in dB. typically: 42)
+
+-s <int> <int> ......... input size (width x height) for YUV
+-sns <int> ............. spatial noise shaping (0:off, 100:max), default=50
+-f <int> ............... filter strength (0=off..100), default=60
+-sharpness <int> ....... filter sharpness (0:most .. 7:least sharp), default=0
+-strong ................ use strong filter instead of simple (default)
+-nostrong .............. use simple filter instead of strong
+-sharp_yuv ............. use sharper (and slower) RGB->YUV conversion
+-partition_limit <int> . limit quality to fit the 512k limit on
+                         the first partition (0=no degradation ... 100=full)
+-pass <int> ............ analysis pass number (1..10)
+-qrange <min> <max> .... specifies the permissible quality range
+                         (default: 0 100)
+-crop <x> <y> <w> <h> .. crop picture with the given rectangle
+-resize <w> <h> ........ resize picture (*after* any cropping)
+-mt .................... use multi-threading if available
+-low_memory ............ reduce memory usage (slower encoding)
+-map <int> ............. print map of extra info
+-print_psnr ............ prints averaged PSNR distortion
+-print_ssim ............ prints averaged SSIM distortion
+-print_lsim ............ prints local-similarity distortion
+-d <file.pgm> .......... dump the compressed output (PGM file)
+-alpha_method <int> .... transparency-compression method (0..1), default=1
+-alpha_filter <string> . predictive filtering for alpha plane,
+                         one of: none, fast (default) or best
+-exact ................. preserve RGB values in transparent area, default=off
+-blend_alpha <hex> ..... blend colors against background color
+                         expressed as RGB values written in
+                         hexadecimal, e.g. 0xc0e0d0 for red=0xc0
+                         green=0xe0 and blue=0xd0
+-noalpha ............... discard any transparency information
+-lossless .............. encode image losslessly, default=off
+-near_lossless <int> ... use near-lossless image preprocessing
+                         (0..100=off), default=100
+-hint <string> ......... specify image characteristics hint,
+                         one of: photo, picture or graph
+
+-metadata <string> ..... comma separated list of metadata to
+                         copy from the input to the output if present.
+                         Valid values: all, none (default), exif, icc, xmp
+
+-short ................. condense printed message
+-quiet ................. don't print anything
+-version ............... print version number and exit
+-noasm ................. disable all assembly optimizations
+-v ..................... verbose, e.g. print encoding/decoding times
+-progress .............. report encoding progress
+```
+
+Experimental Options:
+
+```
+-jpeg_like ............. roughly match expected JPEG size
+-af .................... auto-adjust filter strength
+-pre <int> ............. pre-processing filter
+```
+
+The main options you might want to try in order to further tune the visual
+quality are:
+
+-preset -sns -f -m
+
+Namely:
+
+*   `preset` will set up a default encoding configuration targeting a particular
+    type of input. It should appear first in the list of options, so that
+    subsequent options can take effect on top of this preset. Default value is
+    'default'.
+*   `sns` will progressively turn on (when going from 0 to 100) some additional
+    visual optimizations (like: segmentation map re-enforcement). This option
+    will balance the bit allocation differently. It tries to take bits from the
+    "easy" parts of the picture and use them in the "difficult" ones instead.
+    Usually, raising the sns value (at fixed -q value) leads to larger files,
+    but with better quality. Typical value is around '75'.
+*   `f` option directly links to the filtering strength used by the codec's
+    in-loop processing. The higher the value, the smoother the highly-compressed
+    area will look. This is particularly useful when aiming at very small files.
+    Typical values are around 20-30. Note that using the option
+    -strong/-nostrong will change the type of filtering. Use "-f 0" to turn
+    filtering off.
+*   `m` controls the trade-off between encoding speed and quality. Default is 4.
+    You can try -m 5 or -m 6 to explore more (time-consuming) encoding
+    possibilities. A lower value will result in faster encoding at the expense
+    of quality.
+
+## Decoding tool
+
+There is a decoding sample in examples/dwebp.c which will take a .webp file and
+decode it to a PNG image file (amongst other formats). This is simply to
+demonstrate the use of the API. You can verify the file test.webp decodes to
+exactly the same as test_ref.ppm by using:
+
+```shell
+cd examples
+./dwebp test.webp -ppm -o test.ppm
+diff test.ppm test_ref.ppm
+```
+
+The full list of options is available using -h:
+
+```shell
+> dwebp -h
+Usage: dwebp in_file [options] [-o out_file]
+```
+
+Decodes the WebP image file to PNG format [Default]. Note: Animated WebP files
+are not supported.
+
+Use following options to convert into alternate image formats:
+
+```
+-pam ......... save the raw RGBA samples as a color PAM
+-ppm ......... save the raw RGB samples as a color PPM
+-bmp ......... save as uncompressed BMP format
+-tiff ........ save as uncompressed TIFF format
+-pgm ......... save the raw YUV samples as a grayscale PGM
+               file with IMC4 layout
+-yuv ......... save the raw YUV samples in flat layout
+```
+
+Other options are:
+
+```
+-version ..... print version number and exit
+-nofancy ..... don't use the fancy YUV420 upscaler
+-nofilter .... disable in-loop filtering
+-nodither .... disable dithering
+-dither <d> .. dithering strength (in 0..100)
+-alpha_dither  use alpha-plane dithering if needed
+-mt .......... use multi-threading
+-crop <x> <y> <w> <h> ... crop output with the given rectangle
+-resize <w> <h> ......... resize output (*after* any cropping)
+-flip ........ flip the output vertically
+-alpha ....... only save the alpha plane
+-incremental . use incremental decoding (useful for tests)
+-h ........... this help message
+-v ........... verbose (e.g. print encoding/decoding times)
+-quiet ....... quiet mode, don't print anything
+-noasm ....... disable all assembly optimizations
+```
+
+## WebP file analysis tool
+
+`webpinfo` can be used to print out the chunk level structure and bitstream
+header information of WebP files. It can also check if the files are of valid
+WebP format.
+
+Usage:
+
+```shell
+webpinfo [options] in_files
+```
+
+Note: there could be multiple input files; options must come before input files.
+
+Options:
+
+```
+-version ........... Print version number and exit.
+-quiet ............. Do not show chunk parsing information.
+-diag .............. Show parsing error diagnosis.
+-summary ........... Show chunk stats summary.
+-bitstream_info .... Parse bitstream header.
+```
+
+## Visualization tool
+
+There's a little self-serve visualization tool called 'vwebp' under the
+examples/ directory. It uses OpenGL to open a simple drawing window and show a
+decoded WebP file. It's not yet integrated in the automake build system, but you
+can try to manually compile it using the recommendations below.
+
+Usage:
+
+```shell
+vwebp in_file [options]
+```
+
+Decodes the WebP image file and visualize it using OpenGL
+
+Options are:
+
+```
+-version ..... print version number and exit
+-noicc ....... don't use the icc profile if present
+-nofancy ..... don't use the fancy YUV420 upscaler
+-nofilter .... disable in-loop filtering
+-dither <int>  dithering strength (0..100), default=50
+-noalphadither disable alpha plane dithering
+-usebgcolor .. display background color
+-mt .......... use multi-threading
+-info ........ print info
+-h ........... this help message
+```
+
+Keyboard shortcuts:
+
+```
+'c' ................ toggle use of color profile
+'b' ................ toggle background color display
+'i' ................ overlay file information
+'d' ................ disable blending & disposal (debug)
+'q' / 'Q' / ESC .... quit
+```
+
+### Building
+
+Prerequisites:
+
+1.  OpenGL & OpenGL Utility Toolkit (GLUT)
+
+    Linux: `sudo apt-get install freeglut3-dev mesa-common-dev`
+
+    Mac + Xcode: These libraries should be available in the OpenGL / GLUT
+    frameworks.
+
+    Windows: http://freeglut.sourceforge.net/index.php#download
+
+2.  (Optional) qcms (Quick Color Management System)
+
+    1.  Download qcms from Mozilla / Chromium:
+        https://hg.mozilla.org/mozilla-central/file/0e7639e3bdfb/gfx/qcms
+        https://source.chromium.org/chromium/chromium/src/+/main:third_party/qcms/;drc=d4a2f8e1ed461d8fc05ed88d1ae2dc94c9773825
+    2.  Build and archive the source files as libqcms.a / qcms.lib
+    3.  Update makefile.unix / Makefile.vc
+        1.  Define WEBP_HAVE_QCMS
+        2.  Update include / library paths to reference the qcms directory.
+
+Build using makefile.unix / Makefile.vc:
+
+```shell
+$ make -f makefile.unix examples/vwebp
+> nmake /f Makefile.vc CFG=release-static \
+    ../obj/x64/release-static/bin/vwebp.exe
+```
+
+## Animation creation tool
+
+The utility `img2webp` can turn a sequence of input images (PNG, JPEG, ...) into
+an animated WebP file. It offers fine control over duration, encoding modes,
+etc.
+
+Usage:
+
+```shell
+img2webp [file_options] [[frame_options] frame_file]... [-o webp_file]
+```
+
+File-level options (only used at the start of compression):
+
+```
+-min_size ............ minimize size
+-kmax <int> .......... maximum number of frame between key-frames
+                        (0=only keyframes)
+-kmin <int> .......... minimum number of frame between key-frames
+                        (0=disable key-frames altogether)
+-mixed ............... use mixed lossy/lossless automatic mode
+-near_lossless <int> . use near-lossless image preprocessing
+                       (0..100=off), default=100
+-sharp_yuv ........... use sharper (and slower) RGB->YUV conversion
+                       (lossy only)
+-loop <int> .......... loop count (default: 0, = infinite loop)
+-v ................... verbose mode
+-h ................... this help
+-version ............. print version number and exit
+```
+
+Per-frame options (only used for subsequent images input):
+
+```
+-d <int> ............. frame duration in ms (default: 100)
+-lossless  ........... use lossless mode (default)
+-lossy ... ........... use lossy mode
+-q <float> ........... quality
+-m <int> ............. method to use
+```
+
+example: `img2webp -loop 2 in0.png -lossy in1.jpg -d 80 in2.tiff -o out.webp`
+
+Note: if a single file name is passed as the argument, the arguments will be
+tokenized from this file. The file name must not start with the character '-'.
+
+## Animated GIF conversion
+
+Animated GIF files can be converted to WebP files with animation using the
+gif2webp utility available under examples/. The files can then be viewed using
+vwebp.
+
+Usage:
+
+```shell
+gif2webp [options] gif_file -o webp_file
+```
+
+Options:
+
+```
+-h / -help ............. this help
+-lossy ................. encode image using lossy compression
+-mixed ................. for each frame in the image, pick lossy
+                         or lossless compression heuristically
+-q <float> ............. quality factor (0:small..100:big)
+-m <int> ............... compression method (0=fast, 6=slowest)
+-min_size .............. minimize output size (default:off)
+                         lossless compression by default; can be
+                         combined with -q, -m, -lossy or -mixed
+                         options
+-kmin <int> ............ min distance between key frames
+-kmax <int> ............ max distance between key frames
+-f <int> ............... filter strength (0=off..100)
+-metadata <string> ..... comma separated list of metadata to
+                         copy from the input to the output if present
+                         Valid values: all, none, icc, xmp (default)
+-loop_compatibility .... use compatibility mode for Chrome
+                         version prior to M62 (inclusive)
+-mt .................... use multi-threading if available
+
+-version ............... print version number and exit
+-v ..................... verbose
+-quiet ................. don't print anything
+```
+
+### Building
+
+With the libgif development files installed, gif2webp can be built using
+makefile.unix:
+
+```shell
+$ make -f makefile.unix examples/gif2webp
+```
+
+or using autoconf:
+
+```shell
+$ ./configure --enable-everything
+$ make
+```
+
+## Comparison of animated images
+
+Test utility anim_diff under examples/ can be used to compare two animated
+images (each can be GIF or WebP).
+
+Usage:
+
+```shell
+anim_diff <image1> <image2> [options]
+```
+
+Options:
+
+```
+-dump_frames <folder> dump decoded frames in PAM format
+-min_psnr <float> ... minimum per-frame PSNR
+-raw_comparison ..... if this flag is not used, RGB is
+                      premultiplied before comparison
+-max_diff <int> ..... maximum allowed difference per channel
+                      between corresponding pixels in subsequent
+                      frames
+-h .................. this help
+-version ............ print version number and exit
+```
+
+### Building
+
+With the libgif development files installed, anim_diff can be built using
+makefile.unix:
+
+```shell
+$ make -f makefile.unix examples/anim_diff
+```
+
+or using autoconf:
+
+```shell
+$ ./configure --enable-everything
+$ make
+```
+
+## WebP Mux tool
+
+The examples/ directory contains a tool (webpmux) for manipulating WebP files.
+The webpmux tool can be used to create an extended format WebP file and also to
+extract or strip relevant data from such a file.
+
+A list of options is available using the -help command line flag:
+
+```shell
+> webpmux -help
+Usage: webpmux -get GET_OPTIONS INPUT -o OUTPUT
+       webpmux -set SET_OPTIONS INPUT -o OUTPUT
+       webpmux -duration DURATION_OPTIONS [-duration ...]
+               INPUT -o OUTPUT
+       webpmux -strip STRIP_OPTIONS INPUT -o OUTPUT
+       webpmux -frame FRAME_OPTIONS [-frame...] [-loop LOOP_COUNT]
+               [-bgcolor BACKGROUND_COLOR] -o OUTPUT
+       webpmux -info INPUT
+       webpmux [-h|-help]
+       webpmux -version
+       webpmux argument_file_name
+
+GET_OPTIONS:
+ Extract relevant data:
+   icc       get ICC profile
+   exif      get EXIF metadata
+   xmp       get XMP metadata
+   frame n   get nth frame
+
+SET_OPTIONS:
+ Set color profile/metadata/parameters:
+   loop LOOP_COUNT            set the loop count
+   bgcolor BACKGROUND_COLOR   set the animation background color
+   icc  file.icc              set ICC profile
+   exif file.exif             set EXIF metadata
+   xmp  file.xmp              set XMP metadata
+   where:    'file.icc' contains the ICC profile to be set,
+             'file.exif' contains the EXIF metadata to be set
+             'file.xmp' contains the XMP metadata to be set
+
+DURATION_OPTIONS:
+ Set duration of selected frames:
+   duration            set duration for all frames
+   duration,frame      set duration of a particular frame
+   duration,start,end  set duration of frames in the
+                        interval [start,end])
+   where: 'duration' is the duration in milliseconds
+          'start' is the start frame index
+          'end' is the inclusive end frame index
+           The special 'end' value '0' means: last frame.
+
+STRIP_OPTIONS:
+ Strip color profile/metadata:
+   icc       strip ICC profile
+   exif      strip EXIF metadata
+   xmp       strip XMP metadata
+
+FRAME_OPTIONS(i):
+ Create animation:
+   file_i +di[+xi+yi[+mi[bi]]]
+   where:    'file_i' is the i'th animation frame (WebP format),
+             'di' is the pause duration before next frame,
+             'xi','yi' specify the image offset for this frame,
+             'mi' is the dispose method for this frame (0 or 1),
+             'bi' is the blending method for this frame (+b or -b)
+
+LOOP_COUNT:
+ Number of times to repeat the animation.
+ Valid range is 0 to 65535 [Default: 0 (infinite)].
+
+BACKGROUND_COLOR:
+ Background color of the canvas.
+  A,R,G,B
+  where:    'A', 'R', 'G' and 'B' are integers in the range 0 to 255 specifying
+            the Alpha, Red, Green and Blue component values respectively
+            [Default: 255,255,255,255]
+
+INPUT & OUTPUT are in WebP format.
+
+Note: The nature of EXIF, XMP and ICC data is not checked and is assumed to be
+valid.
+
+Note: if a single file name is passed as the argument, the arguments will be
+tokenized from this file. The file name must not start with the character '-'.
+```
diff --git a/third_party/libwebp/doc/webp-container-spec.txt b/third_party/libwebp/doc/webp-container-spec.txt
index 94a7ca2..3e66526 100644
--- a/third_party/libwebp/doc/webp-container-spec.txt
+++ b/third_party/libwebp/doc/webp-container-spec.txt
@@ -2,10 +2,10 @@
 
 Although you may be viewing an alternate representation, this document
 is sourced in Markdown, a light-duty markup scheme, and is optimized for
-the [kramdown](http://kramdown.rubyforge.org/) transformer.
+the [kramdown](https://kramdown.gettalong.org/) transformer.
 
-See the accompanying README. External link targets are referenced at the
-end of this file.
+See the accompanying specs_generation.md. External link targets are referenced
+at the end of this file.
 
 -->
 
@@ -20,25 +20,25 @@
 Introduction
 ------------
 
-WebP is an image format that uses either (i) the VP8 key frame encoding
-to compress image data in a lossy way, or (ii) the WebP lossless encoding
-(and possibly other encodings in the future). These encoding schemes should
-make it more efficient than currently used formats. It is optimized for fast
-image transfer over the network (e.g., for websites). The WebP format has
-feature parity (color profile, metadata, animation etc) with other formats as
-well. This document describes the structure of a WebP file.
+WebP is an image format that uses either (i) the VP8 key frame encoding to
+compress image data in a lossy way, or (ii) the WebP lossless encoding. These
+encoding schemes should make it more efficient than older formats such as JPEG,
+GIF and PNG. It is optimized for fast image transfer over the network (for
+example, for websites). The WebP format has feature parity (color profile,
+metadata, animation, etc.) with other formats as well. This document describes
+the structure of a WebP file.
 
-The WebP container (i.e., RIFF container for WebP) allows feature support over
-and above the basic use case of WebP (i.e., a file containing a single image
-encoded as a VP8 key frame). The WebP container provides additional support
-for:
+The WebP container (that is, the RIFF container for WebP) allows feature support
+over and above the basic use case of WebP (that is, a file containing a single
+image encoded as a VP8 key frame). The WebP container provides additional
+support for:
 
   * **Lossless compression.** An image can be losslessly compressed, using the
     WebP Lossless Format.
 
-  * **Metadata.** An image may have metadata stored in EXIF or XMP formats.
+  * **Metadata.** An image may have metadata stored in Exif or XMP formats.
 
-  * **Transparency.** An image may have transparency, i.e., an alpha channel.
+  * **Transparency.** An image may have transparency, that is, an alpha channel.
 
   * **Color Profile.** An image may have an embedded ICC profile as described
     by the [International Color Consortium][iccspec].
@@ -46,24 +46,21 @@
   * **Animation.** An image may have multiple frames with pauses between them,
     making it an animation.
 
-The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
-"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
-document are to be interpreted as described in [RFC 2119][].
+The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
+"SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this
+document are to be interpreted as described in BCP 14 [RFC 2119][] [RFC 8174][]
+when, and only when, they appear in all capitals, as shown here.
 
 Bit numbering in chunk diagrams starts at `0` for the most significant bit
 ('MSB 0') as described in [RFC 1166][].
 
-**Note:** Out of the features mentioned above, lossy compression, lossless
-compression, transparency, metadata, color profile and animation are finalized
-and are to be considered stable.
+Terminology & Basics
+--------------------
 
-Terminology &amp; Basics
-------------------------
-
-A WebP file contains either a still image (i.e., an encoded matrix of pixels)
+A WebP file contains either a still image (that is, an encoded matrix of pixels)
 or an [animation](#animation). Optionally, it can also contain transparency
-information, color profile and metadata. In case we need to refer only to the
-matrix of pixels, we will call it the _canvas_ of the image.
+information, color profile and metadata. We refer to the matrix of pixels as the
+_canvas_ of the image.
 
 Below are additional terms used throughout this document:
 
@@ -87,18 +84,25 @@
 _FourCC_
 
 : A _FourCC_ (four-character code) is a _uint32_ created by concatenating four
-  ASCII characters in little-endian order.
+  ASCII characters in little-endian order. This means 'aaaa' (0x61616161) and
+ 'AAAA' (0x41414141) are treated as different _FourCCs_.
 
 _1-based_
 
-: An unsigned integer field storing values offset by `-1`. e.g., Such a field
-  would store value _25_ as _24_.
+: An unsigned integer field storing values offset by `-1`, for example, such a
+  field would store value _25_ as _24_.
+
+_ChunkHeader('ABCD')_
+
+: This is used to describe the _FourCC_ and _Chunk Size_ header of individual
+  chunks, where 'ABCD' is the FourCC for the chunk. This element's size is 8
+  bytes.
 
 
 RIFF File Format
 ----------------
 
-The WebP file format is based on the RIFF (resource interchange file format)
+The WebP file format is based on the RIFF (Resource Interchange File Format)
 document format.
 
 The basic element of a RIFF file is a _chunk_. It consists of:
@@ -110,7 +114,7 @@
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                          Chunk Size                           |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                         Chunk Payload                         |
+    :                         Chunk Payload                         :
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
 Chunk FourCC: 32 bits
@@ -119,19 +123,13 @@
 
 Chunk Size: 32 bits (_uint32_)
 
-: The size of the chunk not including this field, the chunk identifier or
-  padding.
+: The size of the chunk in bytes, not including this field, the chunk
+  identifier or padding.
 
 Chunk Payload: _Chunk Size_ bytes
 
-: The data payload. If _Chunk Size_ is odd, a single padding byte -- that
-  SHOULD be `0` -- is added.
-
-_ChunkHeader('ABCD')_
-
-: This is used to describe the _FourCC_ and _Chunk Size_ header of individual
-  chunks, where 'ABCD' is the FourCC for the chunk. This element's
-  size is 8 bytes.
+: The data payload. If _Chunk Size_ is odd, a single padding byte -- that MUST
+  be `0` to conform with RIFF -- is added.
 
 **Note:** RIFF has a convention that all-uppercase chunk FourCCs are standard
 chunks that apply to any RIFF file format, while FourCCs specific to a file
@@ -167,9 +165,11 @@
 
 A WebP file MUST begin with a RIFF header with the FourCC 'WEBP'. The file size
 in the header is the total size of the chunks that follow plus `4` bytes for
-the 'WEBP' FourCC. The file SHOULD NOT contain anything after it. As the size
-of any chunk is even, the size given by the RIFF header is also even. The
-contents of individual chunks will be described in the following sections.
+the 'WEBP' FourCC. The file SHOULD NOT contain any data after the data
+specified by _File Size_. Readers MAY parse such files, ignoring the trailing
+data. As the size of any chunk is even, the size given by the RIFF header is
+also even. The contents of individual chunks are described in the following
+sections.
 
 
 Simple File Format (Lossy)
@@ -184,9 +184,11 @@
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    |                                                               |
     |                    WebP file header (12 bytes)                |
+    |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                          VP8 chunk                            |
+    :                          VP8 chunk                            :
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
 VP8 chunk:
@@ -195,20 +197,24 @@
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      ChunkHeader('VP8 ')                      |
+    |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                           VP8 data                            |
+    :                           VP8 data                            :
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
 VP8 data: _Chunk Size_ bytes
 
 : VP8 bitstream data.
 
+Note the fourth character in the 'VP8 ' FourCC is an ASCII space (0x20).
+
 The VP8 bitstream format specification can be found at [VP8 Data Format and
 Decoding Guide][vp8spec]. Note that the VP8 frame header contains the VP8 frame
 width and height. That is assumed to be the width and height of the canvas.
 
-The VP8 specification describes how to decode the image into Y'CbCr
-format. To convert to RGB, Rec. 601 SHOULD be used.
+The VP8 specification describes how to decode the image into Y'CbCr format. To
+convert to RGB, Rec. 601 SHOULD be used. Applications MAY use another
+conversion method, but visual results may differ among decoders.
 
 
 Simple File Format (Lossless)
@@ -225,9 +231,11 @@
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    |                                                               |
     |                    WebP file header (12 bytes)                |
+    |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                          VP8L chunk                           |
+    :                          VP8L chunk                           :
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
 VP8L chunk:
@@ -236,8 +244,9 @@
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      ChunkHeader('VP8L')                      |
+    |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                           VP8L data                           |
+    :                           VP8L data                           :
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
 VP8L data: _Chunk Size_ bytes
@@ -265,11 +274,11 @@
 
   * Image data.
 
-  * An optional 'EXIF' chunk with EXIF metadata.
+  * An optional 'EXIF' chunk with Exif metadata.
 
   * An optional 'XMP ' chunk with XMP metadata.
 
-  * An optional list of [unknown chunks](#unknown-chunks). _\[status: experimental\]_
+  * An optional list of [unknown chunks](#unknown-chunks).
 
 For a _still image_, the _image data_ consists of a single frame, which is made
 up of:
@@ -283,7 +292,7 @@
 
 All chunks SHOULD be placed in the same order as listed above. If a chunk
 appears in the wrong place, the file is invalid, but readers MAY parse the
-file, ignoring the chunks that come too late.
+file, ignoring the chunks that are out of order.
 
 **Rationale:** Setting the order of chunks should allow quicker file
 parsing. For example, if an 'ALPH' chunk does not appear in its required
@@ -297,9 +306,12 @@
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    |                                                               |
     |                   WebP file header (12 bytes)                 |
+    |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      ChunkHeader('VP8X')                      |
+    |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Rsv|I|L|E|X|A|R|                   Reserved                    |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -310,7 +322,7 @@
 
 Reserved (Rsv): 2 bits
 
-: SHOULD be `0`.
+: MUST be `0`. Readers MUST ignore this field.
 
 ICC profile (I): 1 bit
 
@@ -321,9 +333,9 @@
 : Set if any of the frames of the image contain transparency information
   ("alpha").
 
-EXIF metadata (E): 1 bit
+Exif metadata (E): 1 bit
 
-: Set if the file contains EXIF metadata.
+: Set if the file contains Exif metadata.
 
 XMP metadata (X): 1 bit
 
@@ -336,25 +348,25 @@
 
 Reserved (R): 1 bit
 
-: SHOULD be `0`.
+: MUST be `0`. Readers MUST ignore this field.
 
 Reserved: 24 bits
 
-: SHOULD be `0`.
+: MUST be `0`. Readers MUST ignore this field.
 
 Canvas Width Minus One: 24 bits
 
 : _1-based_ width of the canvas in pixels.
-  The actual canvas width is '1 + Canvas Width Minus One'
+  The actual canvas width is `1 + Canvas Width Minus One`.
 
 Canvas Height Minus One: 24 bits
 
 : _1-based_ height of the canvas in pixels.
-  The actual canvas height is '1 + Canvas Height Minus One'
+  The actual canvas height is `1 + Canvas Height Minus One`.
 
 The product of _Canvas Width_ and _Canvas Height_ MUST be at most `2^32 - 1`.
 
-Future specifications MAY add more fields.
+Future specifications may add more fields. Unknown fields MUST be ignored.
 
 ### Chunks
 
@@ -372,6 +384,7 @@
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      ChunkHeader('ANIM')                      |
+    |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                       Background Color                        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -387,8 +400,8 @@
 
 **Note**:
 
-  * Background color MAY contain a transparency value (alpha), even if the
-    _Alpha_ flag in [VP8X chunk](#extended_header) is unset.
+  * Background color MAY contain a non-opaque alpha value, even if the _Alpha_
+    flag in [VP8X chunk](#extended_header) is unset.
 
   * Viewer applications SHOULD treat the background color value as a hint, and
     are not required to use it.
@@ -401,8 +414,8 @@
 : The number of times to loop the animation. `0` means infinitely.
 
 This chunk MUST appear if the _Animation_ flag in the VP8X chunk is set.
-If the _Animation_ flag is not set and this chunk is present, it
-SHOULD be ignored.
+If the _Animation_ flag is not set and this chunk is present, it MUST be
+ignored.
 
 ANMF chunk:
 
@@ -413,6 +426,7 @@
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      ChunkHeader('ANMF')                      |
+    |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                        Frame X                |             ...
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -422,26 +436,26 @@
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                 Frame Duration                |  Reserved |B|D|
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                         Frame Data                            |
+    :                         Frame Data                            :
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
 Frame X: 24 bits (_uint24_)
 
-: The X coordinate of the upper left corner of the frame is `Frame X * 2`
+: The X coordinate of the upper left corner of the frame is `Frame X * 2`.
 
 Frame Y: 24 bits (_uint24_)
 
-: The Y coordinate of the upper left corner of the frame is `Frame Y * 2`
+: The Y coordinate of the upper left corner of the frame is `Frame Y * 2`.
 
 Frame Width Minus One: 24 bits (_uint24_)
 
 : The _1-based_ width of the frame.
-  The frame width is `1 + Frame Width Minus One`
+  The frame width is `1 + Frame Width Minus One`.
 
 Frame Height Minus One: 24 bits (_uint24_)
 
 : The _1-based_ height of the frame.
-  The frame height is `1 + Frame Height Minus One`
+  The frame height is `1 + Frame Height Minus One`.
 
 Frame Duration: 24 bits (_uint24_)
 
@@ -452,7 +466,7 @@
 
 Reserved: 6 bits
 
-: SHOULD be 0.
+: MUST be `0`. Readers MUST ignore this field.
 
 Blending method (B): 1 bit
 
@@ -497,8 +511,9 @@
     if blend.A = 0 then
       blend.RGB = 0
     else
-      blend.RGB = (src.RGB * src.A +
-                   dst.RGB * dst.A * (1 - src.A / 255)) / blend.A
+      blend.RGB =
+          (src.RGB * src.A +
+           dst.RGB * dst.A * (1 - src.A / 255)) / blend.A
 ~~~~~
 
   * Alpha-blending SHOULD be done in linear color space, by taking into account
@@ -525,22 +540,23 @@
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      ChunkHeader('ALPH')                      |
+    |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Rsv| P | F | C |     Alpha Bitstream...                        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
 Reserved (Rsv): 2 bits
 
-: SHOULD be `0`.
+: MUST be `0`. Readers MUST ignore this field.
 
 Pre-processing (P): 2 bits
 
-: These INFORMATIVE bits are used to signal the pre-processing that has
+: These _informative_ bits are used to signal the pre-processing that has
   been performed during compression. The decoder can use this information to
-  e.g. dither the values or smooth the gradients prior to display.
+  for example, dither the values or smooth the gradients prior to display.
 
-    * `0`: no pre-processing
-    * `1`: level reduction
+    * `0`: No pre-processing.
+    * `1`: Level reduction.
 
 Filtering method (F): 2 bits
 
@@ -573,14 +589,14 @@
   * v    otherwise
 
 The final value is derived by adding the decompressed value `X` to the
-predictor and using modulo-256 arithmetic to wrap the \[256-511\] range
-into the \[0-255\] one:
+predictor and using modulo-256 arithmetic to wrap the \[256..511\] range
+into the \[0..255\] one:
 
 `alpha = (predictor + X) % 256`
 
-There are special cases for left-most and top-most pixel positions:
+There are special cases for the left-most and top-most pixel positions:
 
-  * Top-left value at location (0,0) uses 0 as predictor value. Otherwise,
+  * The top-left value at location (0, 0) uses 0 as predictor value. Otherwise,
   * For horizontal or gradient filtering methods, the left-most pixels at
     location (0, y) are predicted using the location (0, y-1) just above.
   * For vertical or gradient filtering methods, the top-most pixels at
@@ -642,14 +658,15 @@
 [Simple File Format (Lossy)](#simple-file-format-lossy)
 and [Simple File Format (Lossless)](#simple-file-format-lossless) respectively.
 
-#### Color profile
+#### Color Profile
 
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      ChunkHeader('ICCP')                      |
+    |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                       Color Profile                           |
+    :                       Color Profile                           :
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
 Color Profile: _Chunk Size_ bytes
@@ -669,8 +686,7 @@
 Metadata can be stored in 'EXIF' or 'XMP ' chunks.
 
 There SHOULD be at most one chunk of each type ('EXIF' and 'XMP '). If there
-are more such chunks, readers MAY ignore all except the first one. Also, a file
-may possibly contain both 'EXIF' and 'XMP ' chunks.
+are more such chunks, readers MAY ignore all except the first one.
 
 The chunks are defined as follows:
 
@@ -680,13 +696,14 @@
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      ChunkHeader('EXIF')                      |
+    |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                        EXIF Metadata                          |
+    :                        Exif Metadata                          :
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
-EXIF Metadata: _Chunk Size_ bytes
+Exif Metadata: _Chunk Size_ bytes
 
-: image metadata in EXIF format.
+: Image metadata in Exif format.
 
 XMP chunk:
 
@@ -694,18 +711,21 @@
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      ChunkHeader('XMP ')                      |
+    |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                        XMP Metadata                           |
+    :                        XMP Metadata                           :
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
 XMP Metadata: _Chunk Size_ bytes
 
-: image metadata in XMP format.
+: Image metadata in XMP format.
+
+Note the fourth character in the 'XMP ' FourCC is an ASCII space (0x20).
 
 Additional guidance about handling metadata can be found in the
 Metadata Working Group's [Guidelines for Handling Metadata][metadata].
 
-#### Unknown Chunks _\[status: experimental\]_
+#### Unknown Chunks
 
 A RIFF chunk (described in [this](#terminology-amp-basics) section) whose _chunk
 tag_ is different from any of the chunks described in this document, is
@@ -724,49 +744,73 @@
 Readers SHOULD ignore these chunks. Writers SHOULD preserve them in their
 original order (unless they specifically intend to modify these chunks).
 
-### Assembling the Canvas from frames
+### Assembling the Canvas From Frames
 
-Here we provide an overview of how a reader should assemble a canvas in the
-case of an animated image. The notation _VP8X.field_ means the field in the
-'VP8X' chunk with the same description.
+Here we provide an overview of how a reader MUST assemble a canvas in the case
+of an animated image.
 
-Displaying an _animated image_ canvas MUST be equivalent to the following
-pseudocode:
+The process begins with creating a canvas using the dimensions given in the
+'VP8X' chunk, `Canvas Width Minus One + 1` pixels wide by `Canvas Height Minus
+One + 1` pixels high. The `Loop Count` field from the 'ANIM' chunk controls how
+many times the animation process is repeated. This is `Loop Count - 1` for
+non-zero `Loop Count` values or infinitely if `Loop Count` is zero.
+
+At the beginning of each loop iteration the canvas is filled using the
+background color from the 'ANIM' chunk or an application defined color.
+
+'ANMF' chunks contain individual frames given in display order. Before rendering
+each frame, the previous frame's `Disposal method` is applied.
+
+The rendering of the decoded frame begins at the Cartesian coordinates (`2 *
+Frame X`, `2 * Frame Y`) using the top-left corner of the canvas as the origin.
+`Frame Width Minus One + 1` pixels wide by `Frame Height Minus One + 1` pixels
+high are rendered onto the canvas using the `Blending method`.
+
+The canvas is displayed for `Frame Duration` milliseconds. This continues until
+all frames given by 'ANMF' chunks have been displayed. A new loop iteration is
+then begun or the canvas is left in its final state if all iterations have been
+completed.
+
+The following pseudocode illustrates the rendering process. The notation
+_VP8X.field_ means the field in the 'VP8X' chunk with the same description.
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 assert VP8X.flags.hasAnimation
 canvas ← new image of size VP8X.canvasWidth x VP8X.canvasHeight with
          background color ANIM.background_color.
 loop_count ← ANIM.loopCount
-dispose_method ← ANIM.disposeMethod
+dispose_method ← Dispose to background color
 if loop_count == 0:
-    loop_count = ∞
+  loop_count = ∞
 frame_params ← nil
 assert next chunk in image_data is ANMF
 for loop = 0..loop_count - 1
-    clear canvas to ANIM.background_color or application defined color
-    until eof or non-ANMF chunk
-        frame_params.frameX = Frame X
-        frame_params.frameY = Frame Y
-        frame_params.frameWidth = Frame Width Minus One + 1
-        frame_params.frameHeight = Frame Height Minus One + 1
-        frame_params.frameDuration = Frame Duration
-        frame_right = frame_params.frameX + frame_params.frameWidth
-        frame_bottom = frame_params.frameY + frame_params.frameHeight
-        assert VP8X.canvasWidth >= frame_right
-        assert VP8X.canvasHeight >= frame_bottom
-        for subchunk in 'Frame Data':
-            if subchunk.tag == "ALPH":
-                assert alpha subchunks not found in 'Frame Data' earlier
-                frame_params.alpha = alpha_data
-            else if subchunk.tag == "VP8 " OR subchunk.tag == "VP8L":
-                assert bitstream subchunks not found in 'Frame Data' earlier
-                frame_params.bitstream = bitstream_data
-        render frame with frame_params.alpha and frame_params.bitstream on
-            canvas with top-left corner at (frame_params.frameX,
-            frame_params.frameY), using dispose method dispose_method.
-        canvas contains the decoded image.
-        Show the contents of the canvas for frame_params.frameDuration * 1ms.
+  clear canvas to ANIM.background_color or application defined color
+  until eof or non-ANMF chunk
+    frame_params.frameX = Frame X
+    frame_params.frameY = Frame Y
+    frame_params.frameWidth = Frame Width Minus One + 1
+    frame_params.frameHeight = Frame Height Minus One + 1
+    frame_params.frameDuration = Frame Duration
+    frame_right = frame_params.frameX + frame_params.frameWidth
+    frame_bottom = frame_params.frameY + frame_params.frameHeight
+    assert VP8X.canvasWidth >= frame_right
+    assert VP8X.canvasHeight >= frame_bottom
+    for subchunk in 'Frame Data':
+      if subchunk.tag == "ALPH":
+        assert alpha subchunks not found in 'Frame Data' earlier
+        frame_params.alpha = alpha_data
+      else if subchunk.tag == "VP8 " OR subchunk.tag == "VP8L":
+        assert bitstream subchunks not found in 'Frame Data' earlier
+        frame_params.bitstream = bitstream_data
+    render frame with frame_params.alpha and frame_params.bitstream
+      on canvas with top-left corner at (frame_params.frameX,
+      frame_params.frameY), using blending method
+      frame_params.blendingMethod.
+    canvas contains the decoded image.
+    Show the contents of the canvas for
+    frame_params.frameDuration * 1ms.
+    dispose_method = frame_params.disposeMethod
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
@@ -802,7 +846,7 @@
 +- XMP  (metadata)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-An animated image with EXIF metadata may look as follows:
+An animated image with Exif metadata may look as follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 RIFF/WEBP
@@ -815,9 +859,10 @@
 +- EXIF (metadata)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-[vp8spec]:  http://tools.ietf.org/html/rfc6386
-[webpllspec]: https://chromium.googlesource.com/webm/libwebp/+/master/doc/webp-lossless-bitstream-spec.txt
-[iccspec]: http://www.color.org/icc_specs2.xalter
-[metadata]: http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf
-[rfc 1166]: http://tools.ietf.org/html/rfc1166
-[rfc 2119]: http://tools.ietf.org/html/rfc2119
+[vp8spec]:  https://datatracker.ietf.org/doc/html/rfc6386
+[webpllspec]: https://chromium.googlesource.com/webm/libwebp/+/HEAD/doc/webp-lossless-bitstream-spec.txt
+[iccspec]: https://www.color.org/icc_specs2.xalter
+[metadata]: https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf
+[rfc 1166]: https://datatracker.ietf.org/doc/html/rfc1166
+[rfc 2119]: https://datatracker.ietf.org/doc/html/rfc2119
+[rfc 8174]: https://datatracker.ietf.org/doc/html/rfc8174
diff --git a/third_party/libwebp/doc/webp-lossless-bitstream-spec.txt b/third_party/libwebp/doc/webp-lossless-bitstream-spec.txt
index 2d2dde1..ebaf655 100644
--- a/third_party/libwebp/doc/webp-lossless-bitstream-spec.txt
+++ b/third_party/libwebp/doc/webp-lossless-bitstream-spec.txt
@@ -1,113 +1,52 @@
 <!--
 
-Although you may be viewing an alternate representation, this document
-is sourced in Markdown, a light-duty markup scheme, and is optimized for
-the [kramdown](http://kramdown.rubyforge.org/) transformer.
+Although you may be viewing an alternate representation, this document is
+sourced in Markdown, a light-duty markup scheme, and is optimized for the
+[kramdown](https://kramdown.gettalong.org/) transformer.
 
-See the accompanying README. External link targets are referenced at the
-end of this file.
+See the accompanying specs_generation.md. External link targets are referenced
+at the end of this file.
 
 -->
 
 Specification for WebP Lossless Bitstream
 =========================================
 
-_Jyrki Alakuijala, Ph.D., Google, Inc., 2012-06-19_
-
-Paragraphs marked as \[AMENDED\] were amended on 2014-09-16.
+_Jyrki Alakuijala, Ph.D., Google, Inc., 2023-03-09_
 
 Abstract
 --------
 
-WebP lossless is an image format for lossless compression of ARGB
-images. The lossless format stores and restores the pixel values
-exactly, including the color values for zero alpha pixels. The
-format uses subresolution images, recursively embedded into the format
-itself, for storing statistical data about the images, such as the used
-entropy codes, spatial predictors, color space conversion, and color
-table. LZ77, Huffman coding, and a color cache are used for compression
-of the bulk data. Decoding speeds faster than PNG have been
-demonstrated, as well as 25% denser compression than can be achieved
-using today's PNG format.
+WebP lossless is an image format for lossless compression of ARGB images. The
+lossless format stores and restores the pixel values exactly, including the
+color values for pixels whose alpha value is 0. The format uses subresolution
+images, recursively embedded into the format itself, for storing statistical
+data about the images, such as the used entropy codes, spatial predictors, color
+space conversion, and color table. LZ77, prefix coding, and a color cache are
+used for compression of the bulk data. Decoding speeds faster than PNG have been
+demonstrated, as well as 25% denser compression than can be achieved using
+today's PNG format.
 
 
 * TOC placeholder
 {:toc}
 
 
-Nomenclature
-------------
-
-ARGB
-: A pixel value consisting of alpha, red, green, and blue values.
-
-ARGB image
-: A two-dimensional array containing ARGB pixels.
-
-color cache
-: A small hash-addressed array to store recently used colors, to be able
-  to recall them with shorter codes.
-
-color indexing image
-: A one-dimensional image of colors that can be indexed using a small
-  integer (up to 256 within WebP lossless).
-
-color transform image
-: A two-dimensional subresolution image containing data about
-  correlations of color components.
-
-distance mapping
-: Changes LZ77 distances to have the smallest values for pixels in 2D
-  proximity.
-
-entropy image
-: A two-dimensional subresolution image indicating which entropy coding
-  should be used in a respective square in the image, i.e., each pixel
-  is a meta Huffman code.
-
-Huffman code
-: A classic way to do entropy coding where a smaller number of bits are
-  used for more frequent codes.
-
-LZ77
-: Dictionary-based sliding window compression algorithm that either
-  emits symbols or describes them as sequences of past symbols.
-
-meta Huffman code
-: A small integer (up to 16 bits) that indexes an element in the meta
-  Huffman table.
-
-predictor image
-: A two-dimensional subresolution image indicating which spatial
-  predictor is used for a particular square in the image.
-
-prefix coding
-: A way to entropy code larger integers that codes a few bits of the
-  integer using an entropy code and codifies the remaining bits raw.
-  This allows for the descriptions of the entropy codes to remain
-  relatively small even when the range of symbols is large.
-
-scan-line order
-: A processing order of pixels, left-to-right, top-to-bottom, starting
-  from the left-hand-top pixel, proceeding to the right. Once a row is
-  completed, continue from the left-hand column of the next row.
-
-
 1 Introduction
 --------------
 
-This document describes the compressed data representation of a WebP
-lossless image. It is intended as a detailed reference for WebP lossless
-encoder and decoder implementation.
+This document describes the compressed data representation of a WebP lossless
+image. It is intended as a detailed reference for the WebP lossless encoder and
+decoder implementation.
 
-In this document, we extensively use C programming language syntax to
-describe the bitstream, and assume the existence of a function for
-reading bits, `ReadBits(n)`. The bytes are read in the natural order of
-the stream containing them, and bits of each byte are read in
-least-significant-bit-first order. When multiple bits are read at the
-same time, the integer is constructed from the original data in the
-original order. The most significant bits of the returned integer are
-also the most significant bits of the original data. Thus the statement
+In this document, we extensively use C programming language syntax to describe
+the bitstream, and assume the existence of a function for reading bits,
+`ReadBits(n)`. The bytes are read in the natural order of the stream containing
+them, and bits of each byte are read in least-significant-bit-first order. When
+multiple bits are read at the same time, the integer is constructed from the
+original data in the original order. The most significant bits of the returned
+integer are also the most significant bits of the original data. Thus, the
+statement
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 b = ReadBits(2);
@@ -120,24 +59,79 @@
 b |= ReadBits(1) << 1;
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-We assume that each color component (e.g. alpha, red, blue and green) is
-represented using an 8-bit byte. We define the corresponding type as
-uint8. A whole ARGB pixel is represented by a type called uint32, an
-unsigned integer consisting of 32 bits. In the code showing the behavior
-of the transformations, alpha value is codified in bits 31..24, red in
-bits 23..16, green in bits 15..8 and blue in bits 7..0, but
-implementations of the format are free to use another representation
-internally.
+We assume that each color component, that is, alpha, red, blue and green, is
+represented using an 8-bit byte. We define the corresponding type as uint8. A
+whole ARGB pixel is represented by a type called uint32, an unsigned integer
+consisting of 32 bits. In the code showing the behavior of the transformations,
+alpha value is codified in bits 31..24, red in bits 23..16, green in bits 15..8
+and blue in bits 7..0, but implementations of the format are free to use another
+representation internally.
 
-Broadly, a WebP lossless image contains header data, transform
-information and actual image data. Headers contain width and height of
-the image. A WebP lossless image can go through four different types of
-transformation before being entropy encoded. The transform information
-in the bitstream contains the data required to apply the respective
-inverse transforms.
+Broadly, a WebP lossless image contains header data, transform information and
+actual image data. Headers contain width and height of the image. A WebP
+lossless image can go through four different types of transformation before
+being entropy encoded. The transform information in the bitstream contains the
+data required to apply the respective inverse transforms.
 
 
-2 RIFF Header
+2 Nomenclature
+--------------
+
+ARGB
+:   A pixel value consisting of alpha, red, green, and blue values.
+
+ARGB image
+:   A two-dimensional array containing ARGB pixels.
+
+color cache
+:   A small hash-addressed array to store recently used colors, to be able to
+    recall them with shorter codes.
+
+color indexing image
+:   A one-dimensional image of colors that can be indexed using a small integer
+    (up to 256 within WebP lossless).
+
+color transform image
+:   A two-dimensional subresolution image containing data about correlations of
+    color components.
+
+distance mapping
+:   Changes LZ77 distances to have the smallest values for pixels in 2D
+    proximity.
+
+entropy image
+:   A two-dimensional subresolution image indicating which entropy coding should
+    be used in a respective square in the image, that is, each pixel is a meta
+    prefix code.
+
+prefix code
+:   A classic way to do entropy coding where a smaller number of bits are used
+    for more frequent codes.
+
+LZ77
+:   Dictionary-based sliding window compression algorithm that either emits
+    symbols or describes them as sequences of past symbols.
+
+meta prefix code
+:   A small integer (up to 16 bits) that indexes an element in the meta prefix
+    table.
+
+predictor image
+:   A two-dimensional subresolution image indicating which spatial predictor is
+    used for a particular square in the image.
+
+prefix coding
+:   A way to entropy code larger integers that codes a few bits of the integer
+    using an entropy code and codifies the remaining bits raw. This allows for
+    the descriptions of the entropy codes to remain relatively small even when
+    the range of symbols is large.
+
+scan-line order
+:   A processing order of pixels, left-to-right, top-to-bottom, starting from
+    the left-hand-top pixel, proceeding to the right. Once a row is completed,
+    continue from the left-hand column of the next row.
+
+3 RIFF Header
 -------------
 
 The beginning of the header has the RIFF container. This consists of the
@@ -154,49 +148,47 @@
       lossless stream.
    6. One byte signature 0x2f.
 
-The first 28 bits of the bitstream specify the width and height of the
-image. Width and height are decoded as 14-bit integers as follows:
+The first 28 bits of the bitstream specify the width and height of the image.
+Width and height are decoded as 14-bit integers as follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 int image_width = ReadBits(14) + 1;
 int image_height = ReadBits(14) + 1;
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The 14-bit dynamics for image size limit the maximum size of a WebP
-lossless image to 16384✕16384 pixels.
+The 14-bit precision for image width and height limits the maximum size of a
+WebP lossless image to 16384✕16384 pixels.
 
-The alpha_is_used bit is a hint only, and should not impact decoding.
-It should be set to 0 when all alpha values are 255 in the picture, and
-1 otherwise.
+The alpha_is_used bit is a hint only, and should not impact decoding. It should
+be set to 0 when all alpha values are 255 in the picture, and 1 otherwise.
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 int alpha_is_used = ReadBits(1);
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The version_number is a 3 bit code that must be set to 0. Any other value
-should be treated as an error. \[AMENDED\]
+The version_number is a 3 bit code that must be set to 0. Any other value should
+be treated as an error.
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 int version_number = ReadBits(3);
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-3 Transformations
+4 Transformations
 -----------------
 
-Transformations are reversible manipulations of the image data that can
-reduce the remaining symbolic entropy by modeling spatial and color
-correlations. Transformations can make the final compression more dense.
+Transformations are reversible manipulations of the image data that can reduce
+the remaining symbolic entropy by modeling spatial and color correlations.
+Transformations can make the final compression more dense.
 
-An image can go through four types of transformation. A 1 bit indicates
-the presence of a transform. Each transform is allowed to be used only
-once. The transformations are used only for the main level ARGB image:
-the subresolution images have no transforms, not even the 0 bit
-indicating the end-of-transforms.
+An image can go through four types of transformation. A 1 bit indicates the
+presence of a transform. Each transform is allowed to be used only once. The
+transformations are used only for the main level ARGB image: the subresolution
+images have no transforms, not even the 0 bit indicating the end-of-transforms.
 
-Typically an encoder would use these transforms to reduce the Shannon
-entropy in the residual image. Also, the transform data can be decided
-based on entropy minimization.
+Typically, an encoder would use these transforms to reduce the Shannon entropy
+in the residual image. Also, the transform data can be decided based on entropy
+minimization.
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 while (ReadBits(1)) {  // Transform present.
@@ -209,66 +201,62 @@
 // Decode actual image data (Section 4).
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-If a transform is present then the next two bits specify the transform
-type. There are four types of transforms.
+If a transform is present then the next two bits specify the transform type.
+There are four types of transforms.
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 enum TransformType {
   PREDICTOR_TRANSFORM             = 0,
   COLOR_TRANSFORM                 = 1,
-  SUBTRACT_GREEN                  = 2,
+  SUBTRACT_GREEN_TRANSFORM        = 2,
   COLOR_INDEXING_TRANSFORM        = 3,
 };
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The transform type is followed by the transform data. Transform data
-contains the information required to apply the inverse transform and
-depends on the transform type. Next we describe the transform data for
-different types.
+The transform type is followed by the transform data. Transform data contains
+the information required to apply the inverse transform and depends on the
+transform type. Next we describe the transform data for different types.
 
 
-### Predictor Transform
+### 4.1 Predictor Transform
 
-The predictor transform can be used to reduce entropy by exploiting the
-fact that neighboring pixels are often correlated. In the predictor
-transform, the current pixel value is predicted from the pixels already
-decoded (in scan-line order) and only the residual value (actual -
-predicted) is encoded. The _prediction mode_ determines the type of
-prediction to use. We divide the image into squares and all the pixels
-in a square use same prediction mode.
+The predictor transform can be used to reduce entropy by exploiting the fact
+that neighboring pixels are often correlated. In the predictor transform, the
+current pixel value is predicted from the pixels already decoded (in scan-line
+order) and only the residual value (actual - predicted) is encoded. The
+_prediction mode_ determines the type of prediction to use. We divide the image
+into squares and all the pixels in a square use the same prediction mode.
 
-The first 3 bits of prediction data define the block width and height in
-number of bits. The number of block columns, `block_xsize`, is used in
-indexing two-dimensionally.
+The first 3 bits of prediction data define the block width and height in number
+of bits. The number of block columns, `block_xsize`, is used in indexing
+two-dimensionally.
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 int size_bits = ReadBits(3) + 2;
 int block_width = (1 << size_bits);
 int block_height = (1 << size_bits);
-#define DIV_ROUND_UP(num, den) ((num) + (den) - 1) / (den))
+#define DIV_ROUND_UP(num, den) (((num) + (den) - 1) / (den))
 int block_xsize = DIV_ROUND_UP(image_width, 1 << size_bits);
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The transform data contains the prediction mode for each block of the
-image. All the `block_width * block_height` pixels of a block use same
-prediction mode. The prediction modes are treated as pixels of an image
-and encoded using the same techniques described in
-[Chapter 4](#image-data).
+The transform data contains the prediction mode for each block of the image. All
+the `block_width * block_height` pixels of a block use same prediction mode. The
+prediction modes are treated as pixels of an image and encoded using the same
+techniques described in [Chapter 5](#image-data).
 
-For a pixel _x, y_, one can compute the respective filter block address
-by:
+For a pixel _x, y_, one can compute the respective filter block address by:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 int block_index = (y >> size_bits) * block_xsize +
                   (x >> size_bits);
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-There are 14 different prediction modes. In each prediction mode, the
-current pixel value is predicted from one or more neighboring pixels
-whose values are already known.
+There are 14 different prediction modes. In each prediction mode, the current
+pixel value is predicted from one or more neighboring pixels whose values are
+already known.
 
-We choose the neighboring pixels (TL, T, TR, and L) of the current pixel
-(P) as follows:
+We choose the neighboring pixels (TL, T, TR, and L) of the current pixel (P) as
+follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 O    O    O    O    O    O    O    O    O    O    O
@@ -279,12 +267,12 @@
 X    X    X    X    X    X    X    X    X    X    X
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-where TL means top-left, T top, TR top-right, L left pixel.
-At the time of predicting a value for P, all pixels O, TL, T, TR and L
-have been already processed, and pixel P and all pixels X are unknown.
+where TL means top-left, T top, TR top-right, L left pixel. At the time of
+predicting a value for P, all pixels O, TL, T, TR and L have already been
+processed, and pixel P and all pixels X are unknown.
 
-Given the above neighboring pixels, the different prediction modes are
-defined as follows.
+Given the above neighboring pixels, the different prediction modes are defined
+as follows.
 
 | Mode   | Predicted value of each channel of the current pixel    |
 | ------ | ------------------------------------------------------- |
@@ -331,7 +319,7 @@
            abs(pGreen - GREEN(T)) + abs(pBlue - BLUE(T));
 
   // Return either left or top, the one closer to the prediction.
-  if (pL < pT) {     // \[AMENDED\]
+  if (pL < pT) {
     return L;
   } else {
     return T;
@@ -339,8 +327,8 @@
 }
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The functions `ClampAddSubtractFull` and `ClampAddSubtractHalf` are
-performed for each ARGB component as follows:
+The functions `ClampAddSubtractFull` and `ClampAddSubtractHalf` are performed
+for each ARGB component as follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Clamp the input value between 0 and 255.
@@ -362,28 +350,26 @@
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 There are special handling rules for some border pixels. If there is a
-prediction transform, regardless of the mode \[0..13\] for these pixels,
-the predicted value for the left-topmost pixel of the image is
-0xff000000, L-pixel for all pixels on the top row, and T-pixel for all
-pixels on the leftmost column.
+prediction transform, regardless of the mode \[0..13\] for these pixels, the
+predicted value for the left-topmost pixel of the image is 0xff000000, L-pixel
+for all pixels on the top row, and T-pixel for all pixels on the leftmost
+column.
 
 Addressing the TR-pixel for pixels on the rightmost column is
-exceptional. The pixels on the rightmost column are predicted by using
-the modes \[0..13\] just like pixels not on border, but by using the
-leftmost pixel on the same row as the current TR-pixel. The TR-pixel
-offset in memory is the same for border and non-border pixels.
+exceptional. The pixels on the rightmost column are predicted by using the modes
+\[0..13\] just like pixels not on the border, but the leftmost pixel on the same
+row as the current pixel is instead used as the TR-pixel.
 
 
-### Color Transform
+### 4.2 Color Transform
 
-The goal of the color transform is to decorrelate the R, G and B values
-of each pixel. Color transform keeps the green (G) value as it is,
-transforms red (R) based on green and transforms blue (B) based on green
-and then based on red.
+The goal of the color transform is to decorrelate the R, G and B values of each
+pixel. The color transform keeps the green (G) value as it is, transforms red
+(R) based on green and transforms blue (B) based on green and then based on red.
 
-As is the case for the predictor transform, first the image is divided
-into blocks and the same transform mode is used for all the pixels in a
-block. For each block there are three types of color transform elements.
+As is the case for the predictor transform, first the image is divided into
+blocks and the same transform mode is used for all the pixels in a block. For
+each block there are three types of color transform elements.
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 typedef struct {
@@ -393,11 +379,10 @@
 } ColorTransformElement;
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The actual color transformation is done by defining a color transform
-delta. The color transform delta depends on the `ColorTransformElement`,
-which is the same for all the pixels in a particular block. The delta is
-added during color transform. The inverse color transform then is just
-subtracting those deltas.
+The actual color transformation is done by defining a color transform delta. The
+color transform delta depends on the `ColorTransformElement`, which is the same
+for all the pixels in a particular block. The delta is subtracted during the
+color transform. The inverse color transform then is just adding those deltas.
 
 The color transform function is defined as follows:
 
@@ -406,22 +391,22 @@
                     ColorTransformElement *trans,
                     uint8 *new_red, uint8 *new_blue) {
   // Transformed values of red and blue components
-  uint32 tmp_red = red;
-  uint32 tmp_blue = blue;
+  int tmp_red = red;
+  int tmp_blue = blue;
 
-  // Applying transform is just adding the transform deltas
-  tmp_red  += ColorTransformDelta(trans->green_to_red, green);
-  tmp_blue += ColorTransformDelta(trans->green_to_blue, green);
-  tmp_blue += ColorTransformDelta(trans->red_to_blue, red);
+  // Applying the transform is just subtracting the transform deltas
+  tmp_red  -= ColorTransformDelta(trans->green_to_red_,  green);
+  tmp_blue -= ColorTransformDelta(trans->green_to_blue_, green);
+  tmp_blue -= ColorTransformDelta(trans->red_to_blue_, red);
 
   *new_red = tmp_red & 0xff;
   *new_blue = tmp_blue & 0xff;
 }
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-`ColorTransformDelta` is computed using a signed 8-bit integer
-representing a 3.5-fixed-point number, and a signed 8-bit RGB color
-channel (c) \[-128..127\] and is defined as follows:
+`ColorTransformDelta` is computed using a signed 8-bit integer representing a
+3.5-fixed-point number, and a signed 8-bit RGB color channel (c) \[-128..127\]
+and is defined as follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 int8 ColorTransformDelta(int8 t, int8 c) {
@@ -429,22 +414,20 @@
 }
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-A conversion from the 8-bit unsigned representation (uint8) to the 8-bit
-signed one (int8) is required before calling ColorTransformDelta().
-It should be performed using 8-bit two's complement (that is: uint8 range
-\[128-255\] is mapped to the \[-128, -1\] range of its converted int8 value).
+A conversion from the 8-bit unsigned representation (uint8) to the 8-bit signed
+one (int8) is required before calling `ColorTransformDelta()`. It should be
+performed using 8-bit two's complement (that is: uint8 range \[128..255\] is
+mapped to the \[-128..-1\] range of its converted int8 value).
 
-The multiplication is to be done using more precision (with at least
-16-bit dynamics). The sign extension property of the shift operation
-does not matter here: only the lowest 8 bits are used from the result,
-and there the sign extension shifting and unsigned shifting are
-consistent with each other.
+The multiplication is to be done using more precision (with at least 16-bit
+precision). The sign extension property of the shift operation does not matter
+here: only the lowest 8 bits are used from the result, and there the sign
+extension shifting and unsigned shifting are consistent with each other.
 
-Now we describe the contents of color transform data so that decoding
-can apply the inverse color transform and recover the original red and
-blue values. The first 3 bits of the color transform data contain the
-width and height of the image block in number of bits, just like the
-predictor transform:
+Now we describe the contents of color transform data so that decoding can apply
+the inverse color transform and recover the original red and blue values. The
+first 3 bits of the color transform data contain the width and height of the
+image block in number of bits, just like the predictor transform:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 int size_bits = ReadBits(3) + 2;
@@ -452,41 +435,43 @@
 int block_height = 1 << size_bits;
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The remaining part of the color transform data contains
-`ColorTransformElement` instances corresponding to each block of the
-image. `ColorTransformElement` instances are treated as pixels of an
-image and encoded using the methods described in
-[Chapter 4](#image-data).
+The remaining part of the color transform data contains `ColorTransformElement`
+instances corresponding to each block of the image. `ColorTransformElement`
+instances are treated as pixels of an image and encoded using the methods
+described in [Chapter 5](#image-data).
 
-During decoding, `ColorTransformElement` instances of the blocks are
-decoded and the inverse color transform is applied on the ARGB values of
-the pixels. As mentioned earlier, that inverse color transform is just
-subtracting `ColorTransformElement` values from the red and blue
-channels.
+During decoding, `ColorTransformElement` instances of the blocks are decoded and
+the inverse color transform is applied on the ARGB values of the pixels. As
+mentioned earlier, that inverse color transform is just adding
+`ColorTransformElement` values to the red and blue channels.
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 void InverseTransform(uint8 red, uint8 green, uint8 blue,
-                      ColorTransformElement *p,
+                      ColorTransformElement *trans,
                       uint8 *new_red, uint8 *new_blue) {
-  // Applying inverse transform is just subtracting the
-  // color transform deltas
-  red  -= ColorTransformDelta(p->green_to_red_,  green);
-  blue -= ColorTransformDelta(p->green_to_blue_, green);
-  blue -= ColorTransformDelta(p->red_to_blue_, red & 0xff);
+  // Transformed values of red and blue components
+  int tmp_red = red;
+  int tmp_blue = blue;
 
-  *new_red = red & 0xff;
-  *new_blue = blue & 0xff;
+  // Applying the inverse transform is just adding the
+  // color transform deltas
+  tmp_red  += ColorTransformDelta(trans->green_to_red, green);
+  tmp_blue += ColorTransformDelta(trans->green_to_blue, green);
+  tmp_blue +=
+      ColorTransformDelta(trans->red_to_blue, tmp_red & 0xff);
+
+  *new_red = tmp_red & 0xff;
+  *new_blue = tmp_blue & 0xff;
 }
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-### Subtract Green Transform
+### 4.3 Subtract Green Transform
 
-The subtract green transform subtracts green values from red and blue
-values of each pixel. When this transform is present, the decoder needs
-to add the green value to both red and blue. There is no data associated
-with this transform. The decoder applies the inverse transform as
-follows:
+The subtract green transform subtracts green values from red and blue values of
+each pixel. When this transform is present, the decoder needs to add the green
+value to both red and blue. There is no data associated with this transform. The
+decoder applies the inverse transform as follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 void AddGreenToBlueAndRed(uint8 green, uint8 *red, uint8 *blue) {
@@ -495,71 +480,63 @@
 }
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-This transform is redundant as it can be modeled using the color
-transform, but it is still often useful. Since it can extend the
-dynamics of the color transform and there is no additional data here,
-the subtract green transform can be coded using fewer bits than a
-full-blown color transform.
+This transform is redundant as it can be modeled using the color transform, but
+since there is no additional data here, the subtract green transform can be
+coded using fewer bits than a full-blown color transform.
 
 
-### Color Indexing Transform
+### 4.4 Color Indexing Transform
 
-If there are not many unique pixel values, it may be more efficient to
-create a color index array and replace the pixel values by the array's
-indices. The color indexing transform achieves this. (In the context of
-WebP lossless, we specifically do not call this a palette transform
-because a similar but more dynamic concept exists in WebP lossless
-encoding: color cache.)
+If there are not many unique pixel values, it may be more efficient to create a
+color index array and replace the pixel values by the array's indices. The color
+indexing transform achieves this. (In the context of WebP lossless, we
+specifically do not call this a palette transform because a similar but more
+dynamic concept exists in WebP lossless encoding: color cache).
 
-The color indexing transform checks for the number of unique ARGB values
-in the image. If that number is below a threshold (256), it creates an
-array of those ARGB values, which is then used to replace the pixel
-values with the corresponding index: the green channel of the pixels are
-replaced with the index; all alpha values are set to 255; all red and
-blue values to 0.
+The color indexing transform checks for the number of unique ARGB values in the
+image. If that number is below a threshold (256), it creates an array of those
+ARGB values, which is then used to replace the pixel values with the
+corresponding index: the green channel of the pixels are replaced with the
+index; all alpha values are set to 255; all red and blue values to 0.
 
-The transform data contains color table size and the entries in the
-color table. The decoder reads the color indexing transform data as
-follows:
+The transform data contains color table size and the entries in the color table.
+The decoder reads the color indexing transform data as follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // 8 bit value for color table size
 int color_table_size = ReadBits(8) + 1;
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The color table is stored using the image storage format itself. The
-color table can be obtained by reading an image, without the RIFF
-header, image size, and transforms, assuming a height of one pixel and
-a width of `color_table_size`. The color table is always
-subtraction-coded to reduce image entropy. The deltas of palette colors
-contain typically much less entropy than the colors themselves, leading
-to significant savings for smaller images. In decoding, every final
-color in the color table can be obtained by adding the previous color
-component values by each ARGB component separately, and storing the
-least significant 8 bits of the result.
+The color table is stored using the image storage format itself. The color table
+can be obtained by reading an image, without the RIFF header, image size, and
+transforms, assuming a height of one pixel and a width of `color_table_size`.
+The color table is always subtraction-coded to reduce image entropy. The deltas
+of palette colors contain typically much less entropy than the colors
+themselves, leading to significant savings for smaller images. In decoding,
+every final color in the color table can be obtained by adding the previous
+color component values by each ARGB component separately, and storing the least
+significant 8 bits of the result.
 
-The inverse transform for the image is simply replacing the pixel values
-(which are indices to the color table) with the actual color table
-values. The indexing is done based on the green component of the ARGB
-color.
+The inverse transform for the image is simply replacing the pixel values (which
+are indices to the color table) with the actual color table values. The indexing
+is done based on the green component of the ARGB color.
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Inverse transform
 argb = color_table[GREEN(argb)];
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-If the index is equal or larger than color_table_size, the argb color value
-should be set to 0x00000000 (transparent black).  \[AMENDED\]
+If the index is equal or larger than `color_table_size`, the argb color value
+should be set to 0x00000000 (transparent black).
 
-When the color table is small (equal to or less than 16 colors), several
-pixels are bundled into a single pixel. The pixel bundling packs several
-(2, 4, or 8) pixels into a single pixel, reducing the image width
-respectively. Pixel bundling allows for a more efficient joint
-distribution entropy coding of neighboring pixels, and gives some
-arithmetic coding-like benefits to the entropy code, but it can only be
-used when there are a small number of unique values.
+When the color table is small (equal to or less than 16 colors), several pixels
+are bundled into a single pixel. The pixel bundling packs several (2, 4, or 8)
+pixels into a single pixel, reducing the image width respectively. Pixel
+bundling allows for a more efficient joint distribution entropy coding of
+neighboring pixels, and gives some arithmetic coding-like benefits to the
+entropy code, but it can only be used when there are 16 or fewer unique values.
 
-`color_table_size` specifies how many pixels are combined together:
+`color_table_size` specifies how many pixels are combined:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 int width_bits;
@@ -574,13 +551,12 @@
 }
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-`width_bits` has a value of 0, 1, 2 or 3. A value of 0 indicates no
-pixel bundling to be done for the image. A value of 1 indicates that two
-pixels are combined together, and each pixel has a range of \[0..15\]. A
-value of 2 indicates that four pixels are combined together, and each
-pixel has a range of \[0..3\]. A value of 3 indicates that eight pixels
-are combined together and each pixel has a range of \[0..1\], i.e., a
-binary value.
+`width_bits` has a value of 0, 1, 2 or 3. A value of 0 indicates no pixel
+bundling is to be done for the image. A value of 1 indicates that two pixels are
+combined, and each pixel has a range of \[0..15\]. A value of 2 indicates that
+four pixels are combined, and each pixel has a range of \[0..3\]. A value of 3
+indicates that eight pixels are combined and each pixel has a range of \[0..1\],
+that is, a binary value.
 
 The values are packed into the green component as follows:
 
@@ -590,43 +566,43 @@
     4 most-significant bits of the green value at x / 2.
   * `width_bits` = 2: for every x value where x ≡ 0 (mod 4), a green
     value at x is positioned into the 2 least-significant bits of the
-    green value at x / 4, green values at x + 1 to x + 3 in order to the
-    more significant bits of the green value at x / 4.
+    green value at x / 4, green values at x + 1 to x + 3 are positioned in order
+    to the more significant bits of the green value at x / 4.
   * `width_bits` = 3: for every x value where x ≡ 0 (mod 8), a green
     value at x is positioned into the least-significant bit of the green
-    value at x / 8, green values at x + 1 to x + 7 in order to the more
-    significant bits of the green value at x / 8.
+    value at x / 8, green values at x + 1 to x + 7 are positioned in order to
+    the more significant bits of the green value at x / 8.
 
 
-4 Image Data
+5 Image Data
 ------------
 
 Image data is an array of pixel values in scan-line order.
 
-### 4.1 Roles of Image Data
+### 5.1 Roles of Image Data
 
 We use image data in five different roles:
 
   1. ARGB image: Stores the actual pixels of the image.
   1. Entropy image: Stores the
-     [meta Huffman codes](#decoding-of-meta-huffman-codes). The red and green
-     components of a pixel define the meta Huffman code used in a particular
+     [meta prefix codes](#decoding-of-meta-prefix-codes). The red and green
+     components of a pixel define the meta prefix code used in a particular
      block of the ARGB image.
-  1. Predictor image: Stores the metadata for [Predictor
-     Transform](#predictor-transform). The green component of a pixel defines
-     which of the 14 predictors is used within a particular block of the
+  1. Predictor image: Stores the metadata for
+     [Predictor Transform](#predictor-transform). The green component of a pixel
+     defines which of the 14 predictors is used within a particular block of the
      ARGB image.
   1. Color transform image. It is created by `ColorTransformElement` values
      (defined in [Color Transform](#color-transform)) for different blocks of
      the image. Each `ColorTransformElement` `'cte'` is treated as a pixel whose
      alpha component is `255`, red component is `cte.red_to_blue`, green
      component is `cte.green_to_blue` and blue component is `cte.green_to_red`.
-  1. Color indexing image: An array of of size `color_table_size` (up to 256
+  1. Color indexing image: An array of size `color_table_size` (up to 256
      ARGB values) storing the metadata for the
      [Color Indexing Transform](#color-indexing-transform). This is stored as an
      image of width `color_table_size` and height `1`.
 
-### 4.2 Encoding of Image data
+### 5.2 Encoding of Image Data
 
 The encoding of image data is independent of its role.
 
@@ -643,21 +619,22 @@
 
 Each pixel is encoded using one of the three possible methods:
 
-  1. Huffman coded literal: each channel (green, red, blue and alpha) is
+  1. Prefix coded literal: each channel (green, red, blue and alpha) is
      entropy-coded independently;
   2. LZ77 backward reference: a sequence of pixels are copied from elsewhere
      in the image; or
   3. Color cache code: using a short multiplicative hash code (color cache
      index) of a recently seen color.
 
-The following sub-sections describe each of these in detail.
+The following subsections describe each of these in detail.
 
-#### 4.2.1 Huffman Coded Literals
+#### 5.2.1 Prefix Coded Literals
 
-The pixel is stored as Huffman coded values of green, red, blue and alpha (in
-that order). See [this section](#decoding-entropy-coded-image-data) for details.
+The pixel is stored as prefix coded values of green, red, blue and alpha (in
+that order). See [Section 6.2.3](#decoding-entropy-coded-image-data) for
+details.
 
-#### 4.2.2 LZ77 Backward Reference
+#### 5.2.2 LZ77 Backward Reference
 
 Backward references are tuples of _length_ and _distance code_:
 
@@ -674,11 +651,11 @@
 
 **Rationale**: This approach reduces the storage requirement for the entropy
 code. Also, large values are usually rare, and so extra bits would be used for
-very few values in the image. Thus, this approach results in a better
-compression overall.
+very few values in the image. Thus, this approach results in better compression
+overall.
 
 The following table denotes the prefix codes and extra bits used for storing
-different range of values.
+different ranges of values.
 
 Note: The maximum backward reference length is limited to 4096. Hence, only the
 first 24 prefix codes (with the respective extra bits) are meaningful for length
@@ -700,8 +677,8 @@
 | 524289..786432  | 38          | 18         |
 | 786433..1048576 | 39          | 18         |
 
-The pseudocode to obtain a (length or distance) value from the prefix code is
-as follows:
+The pseudocode to obtain a (length or distance) value from the prefix code is as
+follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 if (prefix_code < 4) {
@@ -715,13 +692,13 @@
 **Distance Mapping:**
 {:#distance-mapping}
 
-As noted previously, distance code is a number indicating the position of a
-previously seen pixel, from which the pixels are to be copied. This sub-section
+As noted previously, a distance code is a number indicating the position of a
+previously seen pixel, from which the pixels are to be copied. This subsection
 defines the mapping between a distance code and the position of a previous
 pixel.
 
-The distance codes larger than 120 denote the pixel-distance in scan-line
-order, offset by 120.
+Distance codes larger than 120 denote the pixel-distance in scan-line order,
+offset by 120.
 
 The smallest distance codes \[1..120\] are special, and are reserved for a close
 neighborhood of the current pixel. This neighborhood consists of 120 pixels:
@@ -736,54 +713,58 @@
 `(xi, yi)` is as follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-(0, 1),  (1, 0),  (1, 1),  (-1, 1), (0, 2),  (2, 0),  (1, 2),  (-1, 2),
-(2, 1),  (-2, 1), (2, 2),  (-2, 2), (0, 3),  (3, 0),  (1, 3),  (-1, 3),
-(3, 1),  (-3, 1), (2, 3),  (-2, 3), (3, 2),  (-3, 2), (0, 4),  (4, 0),
-(1, 4),  (-1, 4), (4, 1),  (-4, 1), (3, 3),  (-3, 3), (2, 4),  (-2, 4),
-(4, 2),  (-4, 2), (0, 5),  (3, 4),  (-3, 4), (4, 3),  (-4, 3), (5, 0),
-(1, 5),  (-1, 5), (5, 1),  (-5, 1), (2, 5),  (-2, 5), (5, 2),  (-5, 2),
-(4, 4),  (-4, 4), (3, 5),  (-3, 5), (5, 3),  (-5, 3), (0, 6),  (6, 0),
-(1, 6),  (-1, 6), (6, 1),  (-6, 1), (2, 6),  (-2, 6), (6, 2),  (-6, 2),
-(4, 5),  (-4, 5), (5, 4),  (-5, 4), (3, 6),  (-3, 6), (6, 3),  (-6, 3),
-(0, 7),  (7, 0),  (1, 7),  (-1, 7), (5, 5),  (-5, 5), (7, 1),  (-7, 1),
-(4, 6),  (-4, 6), (6, 4),  (-6, 4), (2, 7),  (-2, 7), (7, 2),  (-7, 2),
-(3, 7),  (-3, 7), (7, 3),  (-7, 3), (5, 6),  (-5, 6), (6, 5),  (-6, 5),
-(8, 0),  (4, 7),  (-4, 7), (7, 4),  (-7, 4), (8, 1),  (8, 2),  (6, 6),
-(-6, 6), (8, 3),  (5, 7),  (-5, 7), (7, 5),  (-7, 5), (8, 4),  (6, 7),
-(-6, 7), (7, 6),  (-7, 6), (8, 5),  (7, 7),  (-7, 7), (8, 6),  (8, 7)
+(0, 1),  (1, 0),  (1, 1),  (-1, 1), (0, 2),  (2, 0),  (1, 2),
+(-1, 2), (2, 1),  (-2, 1), (2, 2),  (-2, 2), (0, 3),  (3, 0),
+(1, 3),  (-1, 3), (3, 1),  (-3, 1), (2, 3),  (-2, 3), (3, 2),
+(-3, 2), (0, 4),  (4, 0),  (1, 4),  (-1, 4), (4, 1),  (-4, 1),
+(3, 3),  (-3, 3), (2, 4),  (-2, 4), (4, 2),  (-4, 2), (0, 5),
+(3, 4),  (-3, 4), (4, 3),  (-4, 3), (5, 0),  (1, 5),  (-1, 5),
+(5, 1),  (-5, 1), (2, 5),  (-2, 5), (5, 2),  (-5, 2), (4, 4),
+(-4, 4), (3, 5),  (-3, 5), (5, 3),  (-5, 3), (0, 6),  (6, 0),
+(1, 6),  (-1, 6), (6, 1),  (-6, 1), (2, 6),  (-2, 6), (6, 2),
+(-6, 2), (4, 5),  (-4, 5), (5, 4),  (-5, 4), (3, 6),  (-3, 6),
+(6, 3),  (-6, 3), (0, 7),  (7, 0),  (1, 7),  (-1, 7), (5, 5),
+(-5, 5), (7, 1),  (-7, 1), (4, 6),  (-4, 6), (6, 4),  (-6, 4),
+(2, 7),  (-2, 7), (7, 2),  (-7, 2), (3, 7),  (-3, 7), (7, 3),
+(-7, 3), (5, 6),  (-5, 6), (6, 5),  (-6, 5), (8, 0),  (4, 7),
+(-4, 7), (7, 4),  (-7, 4), (8, 1),  (8, 2),  (6, 6),  (-6, 6),
+(8, 3),  (5, 7),  (-5, 7), (7, 5),  (-7, 5), (8, 4),  (6, 7),
+(-6, 7), (7, 6),  (-7, 6), (8, 5),  (7, 7),  (-7, 7), (8, 6),
+(8, 7)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-For example, distance code `1` indicates offset of `(0, 1)` for the neighboring
-pixel, that is, the pixel above the current pixel (0-pixel difference in
-X-direction and 1 pixel difference in Y-direction). Similarly, distance code
-`3` indicates left-top pixel.
+For example, the distance code `1` indicates an offset of `(0, 1)` for the
+neighboring pixel, that is, the pixel above the current pixel (0 pixel
+difference in the X-direction and 1 pixel difference in the Y-direction).
+Similarly, the distance code `3` indicates the left-top pixel.
 
-The decoder can convert a distances code 'i' to a scan-line order distance
-'dist' as follows:
+The decoder can convert a distance code `i` to a scan-line order distance `dist`
+as follows:
 
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-(xi, yi) = distance_map[i]
-dist = x + y * xsize
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+(xi, yi) = distance_map[i - 1]
+dist = xi + yi * xsize
 if (dist < 1) {
   dist = 1
 }
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-where 'distance_map' is the mapping noted above and `xsize` is the width of the
+where `distance_map` is the mapping noted above and `xsize` is the width of the
 image in pixels.
 
 
-#### 4.2.3 Color Cache Coding
+#### 5.2.3 Color Cache Coding
+{:#color-cache-code}
 
 Color cache stores a set of colors that have been recently used in the image.
 
 **Rationale:** This way, the recently used colors can sometimes be referred to
-more efficiently than emitting them using other two methods (described in
-[4.2.1](#huffman-coded-literals) and [4.2.2](#lz77-backward-reference)).
+more efficiently than emitting them using the other two methods (described in
+[5.2.1](#prefix-coded-literals) and [5.2.2](#lz77-backward-reference)).
 
 Color cache codes are stored as follows. First, there is a 1-bit value that
 indicates if the color cache is used. If this bit is 0, no color cache codes
-exist, and they are not transmitted in the Huffman code that decodes the green
+exist, and they are not transmitted in the prefix code that decodes the green
 symbols and the length prefix codes. However, if this bit is 1, the color cache
 size is read next:
 
@@ -797,147 +778,270 @@
 `color_cache_code_bits` is \[1..11\]. Compliant decoders must indicate a
 corrupted bitstream for other values.
 
-A color cache is an array of size `color_cache_size`. Each entry
-stores one ARGB color. Colors are looked up by indexing them by
-(0x1e35a7bd * `color`) >> (32 - `color_cache_code_bits`). Only one
-lookup is done in a color cache; there is no conflict resolution.
+A color cache is an array of size `color_cache_size`. Each entry stores one ARGB
+color. Colors are looked up by indexing them by (0x1e35a7bd * `color`) >> (32 -
+`color_cache_code_bits`). Only one lookup is done in a color cache; there is no
+conflict resolution.
 
-In the beginning of decoding or encoding of an image, all entries in all
-color cache values are set to zero. The color cache code is converted to
-this color at decoding time. The state of the color cache is maintained
-by inserting every pixel, be it produced by backward referencing or as
-literals, into the cache in the order they appear in the stream.
+In the beginning of decoding or encoding of an image, all entries in all color
+cache values are set to zero. The color cache code is converted to this color at
+decoding time. The state of the color cache is maintained by inserting every
+pixel, be it produced by backward referencing or as literals, into the cache in
+the order they appear in the stream.
 
 
-5 Entropy Code
+6 Entropy Code
 --------------
 
-### 5.1 Overview
+### 6.1 Overview
 
-Most of the data is coded using [canonical Huffman code][canonical_huff]. Hence,
-the codes are transmitted by sending the _Huffman code lengths_, as opposed to
-the actual _Huffman codes_.
+Most of the data is coded using a [canonical prefix code][canonical_huff].
+Hence, the codes are transmitted by sending the _prefix code lengths_, as
+opposed to the actual _prefix codes_.
 
-In particular, the format uses **spatially-variant Huffman coding**. In other
+In particular, the format uses **spatially-variant prefix coding**. In other
 words, different blocks of the image can potentially use different entropy
 codes.
 
-**Rationale**: Different areas of the image may have different characteristics. So, allowing them to use different entropy codes provides more flexibility and
-potentially a better compression.
+**Rationale**: Different areas of the image may have different characteristics.
+So, allowing them to use different entropy codes provides more flexibility and
+potentially better compression.
 
-### 5.2 Details
+### 6.2 Details
 
-The encoded image data consists of two parts:
+The encoded image data consists of several parts:
 
-  1. Meta Huffman codes
+  1. Decoding and building the prefix codes
+  1. Meta prefix codes
   1. Entropy-coded image data
 
-#### 5.2.1 Decoding of Meta Huffman Codes
+#### 6.2.1 Decoding and Building the Prefix Codes
 
-As noted earlier, the format allows the use of different Huffman codes for
-different blocks of the image. _Meta Huffman codes_ are indexes identifying
-which Huffman codes to use in different parts of the image.
+There are several steps in decoding the prefix codes.
 
-Meta Huffman codes may be used _only_ when the image is being used in the
+**Decoding the Code Lengths:**
+{:#decoding-the-code-lengths}
+
+This section describes how to read the prefix code lengths from the bitstream.
+
+The prefix code lengths can be coded in two ways. The method used is specified
+by a 1-bit value.
+
+  * If this bit is 1, it is a _simple code length code_, and
+  * If this bit is 0, it is a _normal code length code_.
+
+In both cases, there can be unused code lengths that are still part of the
+stream. This may be inefficient, but it is allowed by the format.
+The described tree must be a complete binary tree. A single leaf node is
+considered a complete binary tree and can be encoded using either the simple
+code length code or the normal code length code. When coding a single leaf
+node using the _normal code length code_, all but one code length should be
+zeros, and the single leaf node value is marked with the length of 1 -- even
+when no bits are consumed when that single leaf node tree is used.
+
+**(i) Simple Code Length Code:**
+
+This variant is used in the special case when only 1 or 2 prefix symbols are in
+the range \[0..255\] with code length `1`. All other prefix code lengths are
+implicitly zeros.
+
+The first bit indicates the number of symbols:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+int num_symbols = ReadBits(1) + 1;
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Following are the symbol values.
+
+This first symbol is coded using 1 or 8 bits depending on the value of
+`is_first_8bits`. The range is \[0..1\] or \[0..255\], respectively. The second
+symbol, if present, is always assumed to be in the range \[0..255\] and coded
+using 8 bits.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+int is_first_8bits = ReadBits(1);
+symbol0 = ReadBits(1 + 7 * is_first_8bits);
+code_lengths[symbol0] = 1;
+if (num_symbols == 2) {
+  symbol1 = ReadBits(8);
+  code_lengths[symbol1] = 1;
+}
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**Note:** Another special case is when _all_ prefix code lengths are _zeros_ (an
+empty prefix code). For example, a prefix code for distance can be empty if
+there are no backward references. Similarly, prefix codes for alpha, red, and
+blue can be empty if all pixels within the same meta prefix code are produced
+using the color cache. However, this case doesn't need special handling, as
+empty prefix codes can be coded as those containing a single symbol `0`.
+
+**(ii) Normal Code Length Code:**
+
+The code lengths of the prefix code fit in 8 bits and are read as follows.
+First, `num_code_lengths` specifies the number of code lengths.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+int num_code_lengths = 4 + ReadBits(4);
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If `num_code_lengths` is > 19, the bitstream is invalid.
+
+The code lengths are themselves encoded using prefix codes: lower level code
+lengths, `code_length_code_lengths`, first have to be read. The rest of those
+`code_length_code_lengths` (according to the order in `kCodeLengthCodeOrder`)
+are zeros.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+int kCodeLengthCodes = 19;
+int kCodeLengthCodeOrder[kCodeLengthCodes] = {
+  17, 18, 0, 1, 2, 3, 4, 5, 16, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
+};
+int code_length_code_lengths[kCodeLengthCodes] = { 0 };  // All zeros
+for (i = 0; i < num_code_lengths; ++i) {
+  code_length_code_lengths[kCodeLengthCodeOrder[i]] = ReadBits(3);
+}
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Next, if `ReadBits(1) == 0`, the maximum number of different read symbols is
+`num_code_lengths`. Otherwise, it is defined as:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+int length_nbits = 2 + 2 * ReadBits(3);
+int max_symbol = 2 + ReadBits(length_nbits);
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A prefix table is then built from `code_length_code_lengths` and used to read up
+to `max_symbol` code lengths.
+
+  * Code \[0..15\] indicates literal code lengths.
+    * Value 0 means no symbols have been coded.
+    * Values \[1..15\] indicate the bit length of the respective code.
+  * Code 16 repeats the previous non-zero value \[3..6\] times, that is,
+    `3 + ReadBits(2)` times. If code 16 is used before a non-zero
+    value has been emitted, a value of 8 is repeated.
+  * Code 17 emits a streak of zeros \[3..10\], that is, `3 + ReadBits(3)`
+    times.
+  * Code 18 emits a streak of zeros of length \[11..138\], that is,
+    `11 + ReadBits(7)` times.
+
+Once code lengths are read, a prefix code for each symbol type (A, R, G, B,
+distance) is formed using their respective alphabet sizes:
+
+  * G channel: 256 + 24 + `color_cache_size`
+  * other literals (A,R,B): 256
+  * distance code: 40
+
+The Normal Code Length Code must code a full decision tree, that is, the sum of
+`2 ^ (-length)` for all non-zero codes must be exactly one. There is however
+one exception to this rule, the single leaf node tree, where the leaf node
+value is marked with value 1 and other values are 0s.
+
+#### 6.2.2 Decoding of Meta Prefix Codes
+
+As noted earlier, the format allows the use of different prefix codes for
+different blocks of the image. _Meta prefix codes_ are indexes identifying which
+prefix codes to use in different parts of the image.
+
+Meta prefix codes may be used _only_ when the image is being used in the
 [role](#roles-of-image-data) of an _ARGB image_.
 
-There are two possibilities for the meta Huffman codes, indicated by a 1-bit
+There are two possibilities for the meta prefix codes, indicated by a 1-bit
 value:
 
-  * If this bit is zero, there is only one meta Huffman code used everywhere in
+  * If this bit is zero, there is only one meta prefix code used everywhere in
     the image. No more data is stored.
-  * If this bit is one, the image uses multiple meta Huffman codes. These meta
-    Huffman codes are stored as an _entropy image_ (described below).
+  * If this bit is one, the image uses multiple meta prefix codes. These meta
+    prefix codes are stored as an _entropy image_ (described below).
 
 **Entropy image:**
 
-The entropy image defines which Huffman codes are used in different parts of the
+The entropy image defines which prefix codes are used in different parts of the
 image, as described below.
 
-The first 3-bits contain the `huffman_bits` value. The dimensions of the entropy
-image are derived from 'huffman_bits'.
+The first 3-bits contain the `prefix_bits` value. The dimensions of the entropy
+image are derived from `prefix_bits`.
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-int huffman_bits = ReadBits(3) + 2;
-int huffman_xsize = DIV_ROUND_UP(xsize, 1 << huffman_bits);
-int huffman_ysize = DIV_ROUND_UP(ysize, 1 << huffman_bits);
+int prefix_bits = ReadBits(3) + 2;
+int prefix_xsize = DIV_ROUND_UP(xsize, 1 << prefix_bits);
+int prefix_ysize = DIV_ROUND_UP(ysize, 1 << prefix_bits);
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 where `DIV_ROUND_UP` is as defined [earlier](#predictor-transform).
 
-Next bits contain an entropy image of width `huffman_xsize` and height
-`huffman_ysize`.
+The next bits contain an entropy image of width `prefix_xsize` and height
+`prefix_ysize`.
 
-**Interpretation of Meta Huffman Codes:**
+**Interpretation of Meta Prefix Codes:**
 
-For any given pixel (x, y), there is a set of five Huffman codes associated with
+For any given pixel (x, y), there is a set of five prefix codes associated with
 it. These codes are (in bitstream order):
 
-  * **Huffman code #1**: used for green channel, backward-reference length and
-    color cache
-  * **Huffman code #2, #3 and #4**: used for red, blue and alpha channels
+  * **Prefix code #1**: used for green channel, backward-reference length and
+    color cache.
+  * **Prefix code #2, #3 and #4**: used for red, blue and alpha channels
     respectively.
-  * **Huffman code #5**: used for backward-reference distance.
+  * **Prefix code #5**: used for backward-reference distance.
 
-From here on, we refer to this set as a **Huffman code group**.
+From here on, we refer to this set as a **prefix code group**.
 
-The number of Huffman code groups in the ARGB image can be obtained by finding
-the _largest meta Huffman code_ from the entropy image:
+The number of prefix code groups in the ARGB image can be obtained by finding
+the _largest meta prefix code_ from the entropy image:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-int num_huff_groups = max(entropy image) + 1;
+int num_prefix_groups = max(entropy image) + 1;
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-where `max(entropy image)` indicates the largest Huffman code stored in the
+where `max(entropy image)` indicates the largest prefix code stored in the
 entropy image.
 
-As each Huffman code groups contains five Huffman codes, the total number of
-Huffman codes is:
+As each prefix code group contains five prefix codes, the total number of prefix
+codes is:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-int num_huff_codes = 5 * num_huff_groups;
+int num_prefix_codes = 5 * num_prefix_groups;
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Given a pixel (x, y) in the ARGB image, we can obtain the corresponding Huffman
+Given a pixel (x, y) in the ARGB image, we can obtain the corresponding prefix
 codes to be used as follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-int position = (y >> huffman_bits) * huffman_xsize + (x >> huffman_bits);
-int meta_huff_code = (entropy_image[pos] >> 8) & 0xffff;
-HuffmanCodeGroup huff_group = huffman_code_groups[meta_huff_code];
+int position =
+    (y >> prefix_bits) * prefix_xsize + (x >> prefix_bits);
+int meta_prefix_code = (entropy_image[position] >> 8) & 0xffff;
+PrefixCodeGroup prefix_group = prefix_code_groups[meta_prefix_code];
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-where, we have assumed the existence of `HuffmanCodeGroup` structure, which
-represents a set of five Huffman codes. Also, `huffman_code_groups` is an array
-of `HuffmanCodeGroup` (of size `num_huff_groups`).
+where, we have assumed the existence of `PrefixCodeGroup` structure, which
+represents a set of five prefix codes. Also, `prefix_code_groups` is an array of
+`PrefixCodeGroup` (of size `num_prefix_groups`).
 
-The decoder then uses Huffman code group `huff_group` to decode the pixel
+The decoder then uses prefix code group `prefix_group` to decode the pixel
 (x, y) as explained in the [next section](#decoding-entropy-coded-image-data).
 
-#### 5.2.2 Decoding Entropy-coded Image Data
+#### 6.2.3 Decoding Entropy-Coded Image Data
 
 For the current position (x, y) in the image, the decoder first identifies the
-corresponding Huffman code group (as explained in the last section). Given the
-Huffman code group, the pixel is read and decoded as follows:
+corresponding prefix code group (as explained in the last section). Given the
+prefix code group, the pixel is read and decoded as follows:
 
-Read next symbol S from the bitstream using Huffman code #1. \[See
-[next section](#decoding-the-code-lengths) for details on decoding the Huffman
-code lengths\]. Note that S is any integer in the range `0` to
-`(256 + 24 + ` [`color_cache_size`](#color-cache-code)`- 1)`.
+Read the next symbol S from the bitstream using prefix code #1. Note that S is
+any integer in the range `0` to
+`(256 + 24 + ` [`color_cache_size`](#color-cache-code)` - 1)`.
 
 The interpretation of S depends on its value:
 
   1. if S < 256
-     1. Use S as the green component
-     1. Read red from the bitstream using Huffman code #2
-     1. Read blue from the bitstream using Huffman code #3
-     1. Read alpha from the bitstream using Huffman code #4
-  1. if S < 256 + 24
-     1. Use S - 256 as a length prefix code
-     1. Read extra bits for length from the bitstream
+     1. Use S as the green component.
+     1. Read red from the bitstream using prefix code #2.
+     1. Read blue from the bitstream using prefix code #3.
+     1. Read alpha from the bitstream using prefix code #4.
+  1. if S >= 256 && S < 256 + 24
+     1. Use S - 256 as a length prefix code.
+     1. Read extra bits for length from the bitstream.
      1. Determine backward-reference length L from length prefix code and the
         extra bits read.
-     1. Read distance prefix code from the bitstream using Huffman code #5
-     1. Read extra bits for distance from the bitstream
+     1. Read distance prefix code from the bitstream using prefix code #5.
+     1. Read extra bits for distance from the bitstream.
      1. Determine backward-reference distance D from distance prefix code and
         the extra bits read.
      1. Copy the L pixels (in scan-line order) from the sequence of pixels
@@ -947,144 +1051,86 @@
      1. Get ARGB color from the color cache at that index.
 
 
-**Decoding the Code Lengths:**
-{:#decoding-the-code-lengths}
-
-This section describes the details about reading a symbol from the bitstream by
-decoding the Huffman code length.
-
-The Huffman code lengths can be coded in two ways. The method used is specified
-by a 1-bit value.
-
-  * If this bit is 1, it is a _simple code length code_, and
-  * If this bit is 0, it is a _normal code length code_.
-
-**(i) Simple Code Length Code:**
-
-This variant is used in the special case when only 1 or 2 Huffman code lengths
-are non-zero, and are in the range of \[0, 255\]. All other Huffman code lengths
-are implicitly zeros.
-
-The first bit indicates the number of non-zero code lengths:
-
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-int num_code_lengths = ReadBits(1) + 1;
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The first code length is stored either using a 1-bit code for values of 0 and 1,
-or using an 8-bit code for values in range \[0, 255\]. The second code length,
-when present, is coded as an 8-bit code.
-
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-int is_first_8bits = ReadBits(1);
-code_lengths[0] = ReadBits(1 + 7 * is_first_8bits);
-if (num_code_lengths == 2) {
-  code_lengths[1] = ReadBits(8);
-}
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-**Note:** Another special case is when _all_ Huffman code lengths are _zeros_
-(an empty Huffman code). For example, a Huffman code for distance can be empty
-if there are no backward references. Similarly, Huffman codes for alpha, red,
-and blue can be empty if all pixels within the same meta Huffman code are
-produced using the color cache. However, this case doesn't need a special
-handling, as empty Huffman codes can be coded as those containing a single
-symbol `0`.
-
-**(ii) Normal Code Length Code:**
-
-The code lengths of a Huffman code are read as follows: `num_code_lengths`
-specifies the number of code lengths; the rest of the code lengths
-(according to the order in `kCodeLengthCodeOrder`) are zeros.
-
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-int kCodeLengthCodes = 19;
-int kCodeLengthCodeOrder[kCodeLengthCodes] = {
-  17, 18, 0, 1, 2, 3, 4, 5, 16, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
-};
-int code_lengths[kCodeLengthCodes] = { 0 };  // All zeros.
-int num_code_lengths = 4 + ReadBits(4);
-for (i = 0; i < num_code_lengths; ++i) {
-  code_lengths[kCodeLengthCodeOrder[i]] = ReadBits(3);
-}
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-  * Code length code \[0..15\] indicates literal code lengths.
-    * Value 0 means no symbols have been coded.
-    * Values \[1..15\] indicate the bit length of the respective code.
-  * Code 16 repeats the previous non-zero value \[3..6\] times, i.e.,
-    3 + `ReadBits(2)` times.  If code 16 is used before a non-zero
-    value has been emitted, a value of 8 is repeated.
-  * Code 17 emits a streak of zeros \[3..10\], i.e., 3 + `ReadBits(3)`
-    times.
-  * Code 18 emits a streak of zeros of length \[11..138\], i.e.,
-    11 + `ReadBits(7)` times.
-
-
-6 Overall Structure of the Format
+7 Overall Structure of the Format
 ---------------------------------
 
-Below is a view into the format in Backus-Naur form. It does not cover
-all details. End-of-image (EOI) is only implicitly coded into the number
-of pixels (xsize * ysize).
+Below is a view into the format in Augmented Backus-Naur Form ([ABNF]). It does
+not cover all details. End-of-image (EOI) is only implicitly coded into the
+number of pixels (xsize * ysize).
 
 
-#### Basic Structure
+#### 7.1 Basic Structure
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-<format> ::= <RIFF header><image size><image stream>
-<image stream> ::= <optional-transform><spatially-coded image>
+format        = RIFF-header image-header image-stream
+RIFF-header   = "RIFF" 4OCTET "WEBP" "VP8L" 4OCTET %x2F
+image-header  = image-size alpha-is-used version
+image-size    = 14BIT 14BIT ; width - 1, height - 1
+alpha-is-used = 1BIT
+version       = 3BIT ; 0
+image-stream  = optional-transform spatially-coded-image
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-#### Structure of Transforms
+#### 7.2 Structure of Transforms
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-<optional-transform> ::= (1-bit value 1; <transform> <optional-transform>) |
-                         1-bit value 0
-<transform> ::= <predictor-tx> | <color-tx> | <subtract-green-tx> |
-                <color-indexing-tx>
-<predictor-tx> ::= 2-bit value 0; <predictor image>
-<predictor image> ::= 3-bit sub-pixel code ; <entropy-coded image>
-<color-tx> ::= 2-bit value 1; <color image>
-<color image> ::= 3-bit sub-pixel code ; <entropy-coded image>
-<subtract-green-tx> ::= 2-bit value 2
-<color-indexing-tx> ::= 2-bit value 3; <color-indexing image>
-<color-indexing image> ::= 8-bit color count; <entropy-coded image>
+optional-transform   =  (%b1 transform optional-transform) / %b0
+transform            =  predictor-tx / color-tx / subtract-green-tx
+transform            =/ color-indexing-tx
+
+predictor-tx         =  %b00 predictor-image
+predictor-image      =  3BIT ; sub-pixel code
+                        entropy-coded-image
+
+color-tx             =  %b01 color-image
+color-image          =  3BIT ; sub-pixel code
+                        entropy-coded-image
+
+subtract-green-tx    =  %b10
+
+color-indexing-tx    =  %b11 color-indexing-image
+color-indexing-image =  8BIT ; color count
+                        entropy-coded-image
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-#### Structure of the Image Data
+#### 7.3 Structure of the Image Data
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-<spatially-coded image> ::= <meta huffman><entropy-coded image>
-<entropy-coded image> ::= <color cache info><huffman codes><lz77-coded image>
-<meta huffman> ::= 1-bit value 0 |
-                   (1-bit value 1; <entropy image>)
-<entropy image> ::= 3-bit subsample value; <entropy-coded image>
-<color cache info> ::= 1 bit value 0 |
-                       (1-bit value 1; 4-bit value for color cache size)
-<huffman codes> ::= <huffman code group> | <huffman code group><huffman codes>
-<huffman code group> ::= <huffman code><huffman code><huffman code>
-                         <huffman code><huffman code>
-                         See "Interpretation of Meta Huffman codes" to
-                         understand what each of these five Huffman codes are
-                         for.
-<huffman code> ::= <simple huffman code> | <normal huffman code>
-<simple huffman code> ::= see "Simple code length code" for details
-<normal huffman code> ::= <code length code>; encoded code lengths
-<code length code> ::= see section "Normal code length code"
-<lz77-coded image> ::= ((<argb-pixel> | <lz77-copy> | <color-cache-code>)
-                       <lz77-coded image>) | ""
+spatially-coded-image =  color-cache-info meta-prefix data
+entropy-coded-image   =  color-cache-info data
+
+color-cache-info      =  %b0
+color-cache-info      =/ (%b1 4BIT) ; 1 followed by color cache size
+
+meta-prefix           =  %b0 / (%b1 entropy-image)
+
+data                  =  prefix-codes lz77-coded-image
+entropy-image         =  3BIT ; subsample value
+                         entropy-coded-image
+
+prefix-codes          =  prefix-code-group *prefix-codes
+prefix-code-group     =
+    5prefix-code ; See "Interpretation of Meta Prefix Codes" to
+                 ; understand what each of these five prefix
+                 ; codes are for.
+
+prefix-code           =  simple-prefix-code / normal-prefix-code
+simple-prefix-code    =  ; see "Simple Code Length Code" for details
+normal-prefix-code    =  ; see "Normal Code Length Code" for details
+
+lz77-coded-image      =
+    *((argb-pixel / lz77-copy / color-cache-code) lz77-coded-image)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 A possible example sequence:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-<RIFF header><image size>1-bit value 1<subtract-green-tx>
-1-bit value 1<predictor-tx>1-bit value 0<meta huffman>
-<color cache info><huffman codes>
-<lz77-coded image>
+RIFF-header image-size %b1 subtract-green-tx
+%b1 predictor-tx %b0 color-cache-info
+%b0 prefix-codes lz77-coded-image
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-[canonical_huff]: http://en.wikipedia.org/wiki/Canonical_Huffman_code
+[ABNF]: https://www.rfc-editor.org/rfc/rfc5234
+[canonical_huff]: https://en.wikipedia.org/wiki/Canonical_Huffman_code
diff --git a/third_party/libwebp/examples/Android.mk b/third_party/libwebp/examples/Android.mk
index 486b8b8..ae0f5b4 100644
--- a/third_party/libwebp/examples/Android.mk
+++ b/third_party/libwebp/examples/Android.mk
@@ -1,3 +1,5 @@
+# Ignore this file during non-NDK builds.
+ifdef NDK_ROOT
 LOCAL_PATH := $(call my-dir)
 
 ################################################################################
@@ -26,7 +28,6 @@
     cwebp.c \
 
 LOCAL_CFLAGS := $(WEBP_CFLAGS)
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
 LOCAL_STATIC_LIBRARIES := example_util imageio_util imagedec webpdemux webp
 
 LOCAL_MODULE := cwebp
@@ -42,7 +43,6 @@
     dwebp.c \
 
 LOCAL_CFLAGS := $(WEBP_CFLAGS)
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
 LOCAL_STATIC_LIBRARIES := example_util imagedec imageenc webpdemux webp
 LOCAL_MODULE := dwebp
 
@@ -57,7 +57,6 @@
     webpmux.c \
 
 LOCAL_CFLAGS := $(WEBP_CFLAGS)
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
 LOCAL_STATIC_LIBRARIES := example_util imageio_util webpmux webp
 
 LOCAL_MODULE := webpmux_example
@@ -73,7 +72,6 @@
     img2webp.c \
 
 LOCAL_CFLAGS := $(WEBP_CFLAGS)
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
 LOCAL_STATIC_LIBRARIES := example_util imageio_util imagedec webpmux webpdemux \
                           webp
 
@@ -90,9 +88,9 @@
     webpinfo.c \
 
 LOCAL_CFLAGS := $(WEBP_CFLAGS)
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
 LOCAL_STATIC_LIBRARIES := example_util imageio_util webp
 
 LOCAL_MODULE := webpinfo_example
 
 include $(BUILD_EXECUTABLE)
+endif  # NDK_ROOT
diff --git a/third_party/libwebp/examples/Makefile.am b/third_party/libwebp/examples/Makefile.am
index e10872f..bbf0bac 100644
--- a/third_party/libwebp/examples/Makefile.am
+++ b/third_party/libwebp/examples/Makefile.am
@@ -1,7 +1,7 @@
 AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_srcdir)/src
 
 bin_PROGRAMS =
-if WANT_DEMUX
+if BUILD_DEMUX
   bin_PROGRAMS += dwebp cwebp
 endif
 if BUILD_ANIMDIFF
@@ -13,7 +13,7 @@
 if BUILD_IMG2WEBP
   bin_PROGRAMS += img2webp
 endif
-if WANT_MUX
+if BUILD_MUX
   bin_PROGRAMS += webpmux
 endif
 if BUILD_VWEBP
@@ -28,7 +28,7 @@
 libexample_util_la_SOURCES = example_util.c example_util.h
 libexample_util_la_LIBADD = ../src/libwebp.la
 
-anim_diff_SOURCES = anim_diff.c anim_util.c anim_util.h
+anim_diff_SOURCES = anim_diff.c anim_util.c anim_util.h gifdec.c gifdec.h
 anim_diff_CPPFLAGS = $(AM_CPPFLAGS) $(GIF_INCLUDES)
 anim_diff_LDADD  =
 anim_diff_LDADD += ../src/demux/libwebpdemux.la
@@ -36,7 +36,7 @@
 anim_diff_LDADD += ../imageio/libimageio_util.la
 anim_diff_LDADD += $(GIF_LIBS) -lm
 
-anim_dump_SOURCES = anim_dump.c anim_util.c anim_util.h
+anim_dump_SOURCES = anim_dump.c anim_util.c anim_util.h gifdec.c gifdec.h
 anim_dump_CPPFLAGS = $(AM_CPPFLAGS) $(PNG_INCLUDES)
 anim_dump_CPPFLAGS += $(GIF_INCLUDES)
 anim_dump_LDADD  =
@@ -47,7 +47,7 @@
 anim_dump_LDADD += $(PNG_LIBS) $(GIF_LIBS) $(TIFF_LIBS) -lm
 
 cwebp_SOURCES  = cwebp.c stopwatch.h
-cwebp_CPPFLAGS  = $(AM_CPPFLAGS)
+cwebp_CPPFLAGS  = $(AM_CPPFLAGS) -I$(top_srcdir)
 cwebp_LDADD  =
 cwebp_LDADD += libexample_util.la
 cwebp_LDADD += ../imageio/libimageio_util.la
@@ -92,7 +92,7 @@
 webpmux_LDADD += ../src/libwebp.la
 
 img2webp_SOURCES = img2webp.c
-img2webp_CPPFLAGS = $(AM_CPPFLAGS)
+img2webp_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)
 img2webp_LDADD  =
 img2webp_LDADD += libexample_util.la
 img2webp_LDADD += ../imageio/libimageio_util.la
diff --git a/third_party/libwebp/examples/anim_diff.c b/third_party/libwebp/examples/anim_diff.c
index e74a915..7ffabc8 100644
--- a/third_party/libwebp/examples/anim_diff.c
+++ b/third_party/libwebp/examples/anim_diff.c
@@ -20,6 +20,8 @@
 #include <string.h>  // for 'strcmp'.
 
 #include "./anim_util.h"
+#include "./example_util.h"
+#include "./unicode.h"
 
 #if defined(_MSC_VER) && _MSC_VER < 1900
 #define snprintf _snprintf
@@ -143,8 +145,18 @@
   if (!ok) return 0;  // These are fatal failures, can't proceed.
 
   if (is_multi_frame_image) {  // Checks relevant for multi-frame images only.
-    ok = CompareValues(img1->loop_count, img2->loop_count,
-                       "Loop count mismatch") && ok;
+    int max_loop_count_workaround = 0;
+    // Transcodes to webp increase the gif loop count by 1 for compatibility.
+    // When the gif has the maximum value the webp value will be off by one.
+    if ((img1->format == ANIM_GIF && img1->loop_count == 65536 &&
+         img2->format == ANIM_WEBP && img2->loop_count == 65535) ||
+        (img1->format == ANIM_WEBP && img1->loop_count == 65535 &&
+         img2->format == ANIM_GIF && img2->loop_count == 65536)) {
+      max_loop_count_workaround = 1;
+    }
+    ok = (max_loop_count_workaround ||
+          CompareValues(img1->loop_count, img2->loop_count,
+                        "Loop count mismatch")) && ok;
     ok = CompareBackgroundColor(img1->bgcolor, img2->bgcolor,
                                 premultiply) && ok;
   }
@@ -207,25 +219,20 @@
   const char* files[2] = { NULL, NULL };
   AnimatedImage images[2];
 
+  INIT_WARGV(argc, argv);
+
   for (c = 1; c < argc; ++c) {
     int parse_error = 0;
     if (!strcmp(argv[c], "-dump_frames")) {
       if (c < argc - 1) {
         dump_frames = 1;
-        dump_folder = argv[++c];
+        dump_folder = (const char*)GET_WARGV(argv, ++c);
       } else {
         parse_error = 1;
       }
     } else if (!strcmp(argv[c], "-min_psnr")) {
       if (c < argc - 1) {
-        const char* const v = argv[++c];
-        char* end = NULL;
-        const double d = strtod(v, &end);
-        if (end == v) {
-          parse_error = 1;
-          fprintf(stderr, "Error! '%s' is not a floating point number.\n", v);
-        }
-        min_psnr = d;
+        min_psnr = ExUtilGetFloat(argv[++c], &parse_error);
       } else {
         parse_error = 1;
       }
@@ -233,20 +240,13 @@
       premultiply = 0;
     } else if (!strcmp(argv[c], "-max_diff")) {
       if (c < argc - 1) {
-        const char* const v = argv[++c];
-        char* end = NULL;
-        const int n = (int)strtol(v, &end, 10);
-        if (end == v) {
-          parse_error = 1;
-          fprintf(stderr, "Error! '%s' is not an integer.\n", v);
-        }
-        max_diff = n;
+        max_diff = ExUtilGetInt(argv[++c], 0, &parse_error);
       } else {
         parse_error = 1;
       }
     } else if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) {
       Help();
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else if (!strcmp(argv[c], "-version")) {
       int dec_version, demux_version;
       GetAnimatedImageVersions(&dec_version, &demux_version);
@@ -255,13 +255,13 @@
              (dec_version >> 0) & 0xff,
              (demux_version >> 16) & 0xff, (demux_version >> 8) & 0xff,
              (demux_version >> 0) & 0xff);
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else {
       if (!got_input1) {
-        files[0] = argv[c];
+        files[0] = (const char*)GET_WARGV(argv, c);
         got_input1 = 1;
       } else if (!got_input2) {
-        files[1] = argv[c];
+        files[1] = (const char*)GET_WARGV(argv, c);
         got_input2 = 1;
       } else {
         parse_error = 1;
@@ -269,29 +269,30 @@
     }
     if (parse_error) {
       Help();
-      return -1;
+      FREE_WARGV_AND_RETURN(-1);
     }
   }
   if (argc < 3) {
     Help();
-    return -1;
+    FREE_WARGV_AND_RETURN(-1);
   }
 
 
   if (!got_input2) {
     Help();
-    return -1;
+    FREE_WARGV_AND_RETURN(-1);
   }
 
   if (dump_frames) {
-    printf("Dumping decoded frames in: %s\n", dump_folder);
+    WPRINTF("Dumping decoded frames in: %s\n", (const W_CHAR*)dump_folder);
   }
 
   memset(images, 0, sizeof(images));
   for (i = 0; i < 2; ++i) {
-    printf("Decoding file: %s\n", files[i]);
+    WPRINTF("Decoding file: %s\n", (const W_CHAR*)files[i]);
     if (!ReadAnimatedImage(files[i], &images[i], dump_frames, dump_folder)) {
-      fprintf(stderr, "Error decoding file: %s\n Aborting.\n", files[i]);
+      WFPRINTF(stderr, "Error decoding file: %s\n Aborting.\n",
+               (const W_CHAR*)files[i]);
       return_code = -2;
       goto End;
     } else {
@@ -301,14 +302,16 @@
 
   if (!CompareAnimatedImagePair(&images[0], &images[1],
                                 premultiply, min_psnr)) {
-    fprintf(stderr, "\nFiles %s and %s differ.\n", files[0], files[1]);
+    WFPRINTF(stderr, "\nFiles %s and %s differ.\n", (const W_CHAR*)files[0],
+             (const W_CHAR*)files[1]);
     return_code = -3;
   } else {
-    printf("\nFiles %s and %s are identical.\n", files[0], files[1]);
+    WPRINTF("\nFiles %s and %s are identical.\n", (const W_CHAR*)files[0],
+            (const W_CHAR*)files[1]);
     return_code = 0;
   }
  End:
   ClearAnimatedImage(&images[0]);
   ClearAnimatedImage(&images[1]);
-  return return_code;
+  FREE_WARGV_AND_RETURN(return_code);
 }
diff --git a/third_party/libwebp/examples/anim_dump.c b/third_party/libwebp/examples/anim_dump.c
index 7b96cfe..e447338 100644
--- a/third_party/libwebp/examples/anim_dump.c
+++ b/third_party/libwebp/examples/anim_dump.c
@@ -17,6 +17,7 @@
 #include "./anim_util.h"
 #include "webp/decode.h"
 #include "../imageio/image_enc.h"
+#include "./unicode.h"
 
 #if defined(_MSC_VER) && _MSC_VER < 1900
 #define snprintf _snprintf
@@ -36,15 +37,17 @@
 
 int main(int argc, const char* argv[]) {
   int error = 0;
-  const char* dump_folder = ".";
-  const char* prefix = "dump_";
-  const char* suffix = "png";
+  const W_CHAR* dump_folder = TO_W_CHAR(".");
+  const W_CHAR* prefix = TO_W_CHAR("dump_");
+  const W_CHAR* suffix = TO_W_CHAR("png");
   WebPOutputFileFormat format = PNG;
   int c;
 
+  INIT_WARGV(argc, argv);
+
   if (argc < 2) {
     Help();
-    return -1;
+    FREE_WARGV_AND_RETURN(-1);
   }
 
   for (c = 1; !error && c < argc; ++c) {
@@ -54,23 +57,23 @@
         error = 1;
         break;
       }
-      dump_folder = argv[++c];
+      dump_folder = GET_WARGV(argv, ++c);
     } else if (!strcmp(argv[c], "-prefix")) {
       if (c + 1 == argc) {
         fprintf(stderr, "missing argument after option '%s'\n", argv[c]);
         error = 1;
         break;
       }
-      prefix = argv[++c];
+      prefix = GET_WARGV(argv, ++c);
     } else if (!strcmp(argv[c], "-tiff")) {
       format = TIFF;
-      suffix = "tiff";
+      suffix = TO_W_CHAR("tiff");
     } else if (!strcmp(argv[c], "-pam")) {
       format = PAM;
-      suffix = "pam";
+      suffix = TO_W_CHAR("pam");
     } else if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) {
       Help();
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else if (!strcmp(argv[c], "-version")) {
       int dec_version, demux_version;
       GetAnimatedImageVersions(&dec_version, &demux_version);
@@ -79,21 +82,21 @@
              (dec_version >> 0) & 0xff,
              (demux_version >> 16) & 0xff, (demux_version >> 8) & 0xff,
              (demux_version >> 0) & 0xff);
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else {
       uint32_t i;
       AnimatedImage image;
-      const char* const file = argv[c];
+      const W_CHAR* const file = GET_WARGV(argv, c);
       memset(&image, 0, sizeof(image));
-      printf("Decoding file: %s as %s/%sxxxx.%s\n",
-             file, dump_folder, prefix, suffix);
-      if (!ReadAnimatedImage(file, &image, 0, NULL)) {
-        fprintf(stderr, "Error decoding file: %s\n Aborting.\n", file);
+      WPRINTF("Decoding file: %s as %s/%sxxxx.%s\n",
+              file, dump_folder, prefix, suffix);
+      if (!ReadAnimatedImage((const char*)file, &image, 0, NULL)) {
+        WFPRINTF(stderr, "Error decoding file: %s\n Aborting.\n", file);
         error = 1;
         break;
       }
       for (i = 0; !error && i < image.num_frames; ++i) {
-        char out_file[1024];
+        W_CHAR out_file[1024];
         WebPDecBuffer buffer;
         WebPInitDecBuffer(&buffer);
         buffer.colorspace = MODE_RGBA;
@@ -103,10 +106,10 @@
         buffer.u.RGBA.rgba = image.frames[i].rgba;
         buffer.u.RGBA.stride = buffer.width * sizeof(uint32_t);
         buffer.u.RGBA.size = buffer.u.RGBA.stride * buffer.height;
-        snprintf(out_file, sizeof(out_file), "%s/%s%.4d.%s",
-                 dump_folder, prefix, i, suffix);
-        if (!WebPSaveImage(&buffer, format, out_file)) {
-          fprintf(stderr, "Error while saving image '%s'\n", out_file);
+        WSNPRINTF(out_file, sizeof(out_file), "%s/%s%.4d.%s",
+                  dump_folder, prefix, i, suffix);
+        if (!WebPSaveImage(&buffer, format, (const char*)out_file)) {
+          WFPRINTF(stderr, "Error while saving image '%s'\n", out_file);
           error = 1;
         }
         WebPFreeDecBuffer(&buffer);
@@ -114,5 +117,5 @@
       ClearAnimatedImage(&image);
     }
   }
-  return error ? 1 : 0;
+  FREE_WARGV_AND_RETURN(error ? 1 : 0);
 }
diff --git a/third_party/libwebp/examples/anim_util.c b/third_party/libwebp/examples/anim_util.c
index c7a05c7..cf7da4c 100644
--- a/third_party/libwebp/examples/anim_util.c
+++ b/third_party/libwebp/examples/anim_util.c
@@ -23,6 +23,9 @@
 #include "webp/decode.h"
 #include "webp/demux.h"
 #include "../imageio/imageio_util.h"
+#include "./gifdec.h"
+#include "./unicode.h"
+#include "./unicode_gif.h"
 
 #if defined(_MSC_VER) && _MSC_VER < 1900
 #define snprintf _snprintf
@@ -57,15 +60,15 @@
       !CheckSizeForOverflow(total_frame_size)) {
     return 0;
   }
-  mem = (uint8_t*)malloc((size_t)total_size);
-  frames = (DecodedFrame*)malloc((size_t)total_frame_size);
+  mem = (uint8_t*)WebPMalloc((size_t)total_size);
+  frames = (DecodedFrame*)WebPMalloc((size_t)total_frame_size);
 
   if (mem == NULL || frames == NULL) {
-    free(mem);
-    free(frames);
+    WebPFree(mem);
+    WebPFree(frames);
     return 0;
   }
-  free(image->raw_mem);
+  WebPFree(image->raw_mem);
   image->num_frames = num_frames;
   image->frames = frames;
   for (i = 0; i < num_frames; ++i) {
@@ -79,8 +82,8 @@
 
 void ClearAnimatedImage(AnimatedImage* const image) {
   if (image != NULL) {
-    free(image->raw_mem);
-    free(image->frames);
+    WebPFree(image->raw_mem);
+    WebPFree(image->frames);
     image->num_frames = 0;
     image->frames = NULL;
     image->raw_mem = NULL;
@@ -151,42 +154,42 @@
   int ok = 0;
   size_t max_len;
   int y;
-  const char* base_name = NULL;
-  char* file_name = NULL;
+  const W_CHAR* base_name = NULL;
+  W_CHAR* file_name = NULL;
   FILE* f = NULL;
   const char* row;
 
-  if (dump_folder == NULL) dump_folder = ".";
+  if (dump_folder == NULL) dump_folder = (const char*)TO_W_CHAR(".");
 
-  base_name = strrchr(filename, '/');
-  base_name = (base_name == NULL) ? filename : base_name + 1;
-  max_len = strlen(dump_folder) + 1 + strlen(base_name)
+  base_name = WSTRRCHR(filename, '/');
+  base_name = (base_name == NULL) ? (const W_CHAR*)filename : base_name + 1;
+  max_len = WSTRLEN(dump_folder) + 1 + WSTRLEN(base_name)
           + strlen("_frame_") + strlen(".pam") + 8;
-  file_name = (char*)malloc(max_len * sizeof(*file_name));
+  file_name = (W_CHAR*)WebPMalloc(max_len * sizeof(*file_name));
   if (file_name == NULL) goto End;
 
-  if (snprintf(file_name, max_len, "%s/%s_frame_%d.pam",
-               dump_folder, base_name, frame_num) < 0) {
+  if (WSNPRINTF(file_name, max_len, "%s/%s_frame_%d.pam",
+                (const W_CHAR*)dump_folder, base_name, frame_num) < 0) {
     fprintf(stderr, "Error while generating file name\n");
     goto End;
   }
 
-  f = fopen(file_name, "wb");
+  f = WFOPEN(file_name, "wb");
   if (f == NULL) {
-    fprintf(stderr, "Error opening file for writing: %s\n", file_name);
+    WFPRINTF(stderr, "Error opening file for writing: %s\n", file_name);
     ok = 0;
     goto End;
   }
   if (fprintf(f, "P7\nWIDTH %d\nHEIGHT %d\n"
               "DEPTH 4\nMAXVAL 255\nTUPLTYPE RGB_ALPHA\nENDHDR\n",
               canvas_width, canvas_height) < 0) {
-    fprintf(stderr, "Write error for file %s\n", file_name);
+    WFPRINTF(stderr, "Write error for file %s\n", file_name);
     goto End;
   }
   row = (const char*)rgba;
   for (y = 0; y < canvas_height; ++y) {
     if (fwrite(row, canvas_width * kNumChannels, 1, f) != 1) {
-      fprintf(stderr, "Error writing to file: %s\n", file_name);
+      WFPRINTF(stderr, "Error writing to file: %s\n", file_name);
       goto End;
     }
     row += canvas_width * kNumChannels;
@@ -194,7 +197,7 @@
   ok = 1;
  End:
   if (f != NULL) fclose(f);
-  free(file_name);
+  WebPFree(file_name);
   return ok;
 }
 
@@ -222,7 +225,7 @@
 
   dec = WebPAnimDecoderNew(webp_data, NULL);
   if (dec == NULL) {
-    fprintf(stderr, "Error parsing image: %s\n", filename);
+    WFPRINTF(stderr, "Error parsing image: %s\n", (const W_CHAR*)filename);
     goto End;
   }
 
@@ -238,7 +241,7 @@
   image->bgcolor = anim_info.bgcolor;
 
   // Allocate frames.
-  if (!AllocateFrames(image, anim_info.frame_count)) return 0;
+  if (!AllocateFrames(image, anim_info.frame_count)) goto End;
 
   // Decode frames.
   while (WebPAnimDecoderHasMoreFrames(dec)) {
@@ -275,6 +278,7 @@
     prev_frame_timestamp = timestamp;
   }
   ok = dump_ok;
+  if (ok) image->format = ANIM_WEBP;
 
  End:
   WebPAnimDecoderDelete(dec);
@@ -369,26 +373,6 @@
 #define DGifCloseFile(a, b) DGifCloseFile(a)
 #endif
 
-static void GIFDisplayError(const GifFileType* const gif, int gif_error) {
-  // libgif 4.2.0 has retired PrintGifError() and added GifErrorString().
-#if LOCAL_GIF_PREREQ(4, 2)
-#if LOCAL_GIF_PREREQ(5, 0)
-  const char* error_str =
-      GifErrorString((gif == NULL) ? gif_error : gif->Error);
-#else
-  const char* error_str = GifErrorString();
-  (void)gif;
-#endif
-  if (error_str == NULL) error_str = "Unknown error";
-  fprintf(stderr, "GIFLib Error %d: %s\n", gif_error, error_str);
-#else
-  (void)gif;
-  fprintf(stderr, "GIFLib Error %d: ", gif_error);
-  PrintGifError();
-  fprintf(stderr, "\n");
-#endif
-}
-
 static int IsKeyFrameGIF(const GifImageDesc* prev_desc, int prev_dispose,
                          const DecodedFrame* const prev_frame,
                          int canvas_width, int canvas_height) {
@@ -421,7 +405,7 @@
     return 0xffffffff;  // Invalid: assume white.
   } else {
     const GifColorType color = color_map->Colors[gif->SBackGroundColor];
-    return (0xff << 24) |
+    return (0xffu << 24) |
            (color.Red << 16) |
            (color.Green << 8) |
            (color.Blue << 0);
@@ -529,15 +513,15 @@
   int gif_error;
   GifFileType* gif;
 
-  gif = DGifOpenFileName(filename, NULL);
+  gif = DGifOpenFileUnicode((const W_CHAR*)filename, NULL);
   if (gif == NULL) {
-    fprintf(stderr, "Could not read file: %s.\n", filename);
+    WFPRINTF(stderr, "Could not read file: %s.\n", (const W_CHAR*)filename);
     return 0;
   }
 
   gif_error = DGifSlurp(gif);
   if (gif_error != GIF_OK) {
-    fprintf(stderr, "Could not parse image: %s.\n", filename);
+    WFPRINTF(stderr, "Could not parse image: %s.\n", (const W_CHAR*)filename);
     GIFDisplayError(gif, gif_error);
     DGifCloseFile(gif, NULL);
     return 0;
@@ -574,7 +558,10 @@
     }
   }
   // Allocate frames.
-  AllocateFrames(image, frame_count);
+  if (!AllocateFrames(image, frame_count)) {
+    DGifCloseFile(gif, NULL);
+    return 0;
+  }
 
   canvas_width = image->canvas_width;
   canvas_height = image->canvas_height;
@@ -687,6 +674,7 @@
       }
     }
   }
+  image->format = ANIM_GIF;
   DGifCloseFile(gif, NULL);
   return 1;
 }
@@ -722,7 +710,7 @@
   memset(image, 0, sizeof(*image));
 
   if (!ImgIoUtilReadFile(filename, &webp_data.bytes, &webp_data.size)) {
-    fprintf(stderr, "Error reading file: %s\n", filename);
+    WFPRINTF(stderr, "Error reading file: %s\n", (const W_CHAR*)filename);
     return 0;
   }
 
@@ -732,9 +720,9 @@
   } else if (IsGIF(&webp_data)) {
     ok = ReadAnimatedGIF(filename, image, dump_frames, dump_folder);
   } else {
-    fprintf(stderr,
-            "Unknown file type: %s. Supported file types are WebP and GIF\n",
-            filename);
+    WFPRINTF(stderr,
+             "Unknown file type: %s. Supported file types are WebP and GIF\n",
+             (const W_CHAR*)filename);
     ok = 0;
   }
   if (!ok) ClearAnimatedImage(image);
diff --git a/third_party/libwebp/examples/anim_util.h b/third_party/libwebp/examples/anim_util.h
index 8063121..574e032 100644
--- a/third_party/libwebp/examples/anim_util.h
+++ b/third_party/libwebp/examples/anim_util.h
@@ -22,6 +22,11 @@
 extern "C" {
 #endif
 
+typedef enum {
+  ANIM_GIF,
+  ANIM_WEBP
+} AnimatedFileFormat;
+
 typedef struct {
   uint8_t* rgba;         // Decoded and reconstructed full frame.
   int duration;          // Frame duration in milliseconds.
@@ -29,6 +34,7 @@
 } DecodedFrame;
 
 typedef struct {
+  AnimatedFileFormat format;
   uint32_t canvas_width;
   uint32_t canvas_height;
   uint32_t bgcolor;
diff --git a/third_party/libwebp/examples/cwebp.c b/third_party/libwebp/examples/cwebp.c
index de7190b..835579d 100644
--- a/third_party/libwebp/examples/cwebp.c
+++ b/third_party/libwebp/examples/cwebp.c
@@ -12,6 +12,7 @@
 //
 // Author: Skal (pascal.massimino@gmail.com)
 
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -23,7 +24,10 @@
 #include "../examples/example_util.h"
 #include "../imageio/image_dec.h"
 #include "../imageio/imageio_util.h"
+#include "../imageio/webpdec.h"
 #include "./stopwatch.h"
+#include "./unicode.h"
+#include "sharpyuv/sharpyuv.h"
 #include "webp/encode.h"
 
 #ifndef WEBP_DLL
@@ -88,9 +92,10 @@
     }
   }
   if (!ok) {
-    fprintf(stderr, "Error! Could not process file %s\n", filename);
+    WFPRINTF(stderr, "Error! Could not process file %s\n",
+             (const W_CHAR*)filename);
   }
-  free((void*)data);
+  WebPFree((void*)data);
   return ok;
 }
 
@@ -114,9 +119,10 @@
   }
  End:
   if (!ok) {
-    fprintf(stderr, "Error! Could not process file %s\n", filename);
+    WFPRINTF(stderr, "Error! Could not process file %s\n",
+             (const W_CHAR*)filename);
   }
-  free((void*)data);
+  WebPFree((void*)data);
   return ok;
 }
 
@@ -125,7 +131,8 @@
 static void AllocExtraInfo(WebPPicture* const pic) {
   const int mb_w = (pic->width + 15) / 16;
   const int mb_h = (pic->height + 15) / 16;
-  pic->extra_info = (uint8_t*)malloc(mb_w * mb_h * sizeof(*pic->extra_info));
+  pic->extra_info =
+      (uint8_t*)WebPMalloc(mb_w * mb_h * sizeof(*pic->extra_info));
 }
 
 static void PrintByteCount(const int bytes[4], int total_size,
@@ -144,7 +151,7 @@
   int s;
   const int total = counts[0] + counts[1] + counts[2] + counts[3];
   for (s = 0; s < 4; ++s) {
-    fprintf(stderr, "|      %2d%%", (int)(100. * counts[s] / total + .5));
+    fprintf(stderr, "|     %3d%%", (int)(100. * counts[s] / total + .5));
   }
   fprintf(stderr, "| %7d\n", total);
 }
@@ -185,7 +192,7 @@
   if (short_output) {
     fprintf(stderr, "%7d %2.2f\n", stats->coded_size, stats->PSNR[3]);
   } else {
-    fprintf(stderr, "File:      %s\n", file_name);
+    WFPRINTF(stderr, "File:      %s\n", (const W_CHAR*)file_name);
     fprintf(stderr, "Dimension: %d x %d\n", pic->width, pic->height);
     fprintf(stderr, "Output:    %d bytes (%.2f bpp)\n", stats->coded_size,
             8.f * stats->coded_size / pic->width / pic->height);
@@ -204,7 +211,7 @@
     const int num_i16 = stats->block_count[1];
     const int num_skip = stats->block_count[2];
     const int total = num_i4 + num_i16;
-    fprintf(stderr, "File:      %s\n", file_name);
+    WFPRINTF(stderr, "File:      %s\n", (const W_CHAR*)file_name);
     fprintf(stderr, "Dimension: %d x %d%s\n",
             pic->width, pic->height,
             stats->alpha_data_size ? " (with alpha)" : "");
@@ -309,7 +316,7 @@
   const int alpha_height =
       WebPPictureHasTransparency(picture) ? picture->height : 0;
   const int height = picture->height + uv_height + alpha_height;
-  FILE* const f = fopen(PGM_name, "wb");
+  FILE* const f = WFOPEN(PGM_name, "wb");
   if (f == NULL) return 0;
   fprintf(f, "P5\n%d %d\n255\n", stride, height);
   for (y = 0; y < picture->height; ++y) {
@@ -521,6 +528,7 @@
   printf(" cwebp [-preset <...>] [options] in_file [-o out_file]\n\n");
   printf("If input size (-s) for an image is not specified, it is\n"
          "assumed to be a PNG, JPEG, TIFF or WebP file.\n");
+  printf("Note: Animated PNG and WebP files are not supported.\n");
 #ifdef HAVE_WINCODEC_H
   printf("Windows builds can take as input any of the files handled by WIC.\n");
 #endif
@@ -561,8 +569,10 @@
   printf("                           "
          "the first partition (0=no degradation ... 100=full)\n");
   printf("  -pass <int> ............ analysis pass number (1..10)\n");
+  printf("  -qrange <min> <max> .... specifies the permissible quality range\n"
+         "                           (default: 0 100)\n");
   printf("  -crop <x> <y> <w> <h> .. crop picture with the given rectangle\n");
-  printf("  -resize <w> <h> ........ resize picture (after any cropping)\n");
+  printf("  -resize <w> <h> ........ resize picture (*after* any cropping)\n");
   printf("  -mt .................... use multi-threading if available\n");
   printf("  -low_memory ............ reduce memory usage (slower encoding)\n");
   printf("  -map <int> ............. print map of extra info\n");
@@ -582,9 +592,8 @@
          "                           green=0xe0 and blue=0xd0\n");
   printf("  -noalpha ............... discard any transparency information\n");
   printf("  -lossless .............. encode image losslessly, default=off\n");
-  printf("  -near_lossless <int> ... use near-lossless image\n"
-         "                           preprocessing (0..100=off), "
-         "default=100\n");
+  printf("  -near_lossless <int> ... use near-lossless image preprocessing\n"
+         "                           (0..100=off), default=100\n");
   printf("  -hint <string> ......... specify image characteristics hint,\n");
   printf("                           one of: photo, picture or graph\n");
 
@@ -611,6 +620,7 @@
   printf("  -af .................... auto-adjust filter strength\n");
   printf("  -pre <int> ............. pre-processing filter\n");
   printf("\n");
+  printf("Supported input formats:\n  %s\n", WebPGetEnabledInputFileFormats());
 }
 
 //------------------------------------------------------------------------------
@@ -637,10 +647,10 @@
 
 //------------------------------------------------------------------------------
 
-int main(int argc, const char *argv[]) {
+int main(int argc, const char* argv[]) {
   int return_value = -1;
-  const char *in_file = NULL, *out_file = NULL, *dump_file = NULL;
-  FILE *out = NULL;
+  const char* in_file = NULL, *out_file = NULL, *dump_file = NULL;
+  FILE* out = NULL;
   int c;
   int short_output = 0;
   int quiet = 0;
@@ -660,35 +670,38 @@
   WebPConfig config;
   WebPAuxStats stats;
   WebPMemoryWriter memory_writer;
+  int use_memory_writer;
   Metadata metadata;
   Stopwatch stop_watch;
 
+  INIT_WARGV(argc, argv);
+
   MetadataInit(&metadata);
   WebPMemoryWriterInit(&memory_writer);
   if (!WebPPictureInit(&picture) ||
       !WebPPictureInit(&original_picture) ||
       !WebPConfigInit(&config)) {
     fprintf(stderr, "Error! Version mismatch!\n");
-    return -1;
+    FREE_WARGV_AND_RETURN(-1);
   }
 
   if (argc == 1) {
     HelpShort();
-    return 0;
+    FREE_WARGV_AND_RETURN(0);
   }
 
   for (c = 1; c < argc; ++c) {
     int parse_error = 0;
     if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) {
       HelpShort();
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else if (!strcmp(argv[c], "-H") || !strcmp(argv[c], "-longhelp")) {
       HelpLong();
-      return 0;
-    } else if (!strcmp(argv[c], "-o") && c < argc - 1) {
-      out_file = argv[++c];
-    } else if (!strcmp(argv[c], "-d") && c < argc - 1) {
-      dump_file = argv[++c];
+      FREE_WARGV_AND_RETURN(0);
+    } else if (!strcmp(argv[c], "-o") && c + 1 < argc) {
+      out_file = (const char*)GET_WARGV(argv, ++c);
+    } else if (!strcmp(argv[c], "-d") && c + 1 < argc) {
+      dump_file = (const char*)GET_WARGV(argv, ++c);
       config.show_compressed = 1;
     } else if (!strcmp(argv[c], "-print_psnr")) {
       config.show_compressed = 1;
@@ -701,7 +714,7 @@
       print_distortion = 2;
     } else if (!strcmp(argv[c], "-short")) {
       ++short_output;
-    } else if (!strcmp(argv[c], "-s") && c < argc - 2) {
+    } else if (!strcmp(argv[c], "-s") && c + 2 < argc) {
       picture.width = ExUtilGetInt(argv[++c], 0, &parse_error);
       picture.height = ExUtilGetInt(argv[++c], 0, &parse_error);
       if (picture.width > WEBP_MAX_DIMENSION || picture.width < 0 ||
@@ -711,30 +724,30 @@
                 picture.width, picture.height);
         goto Error;
       }
-    } else if (!strcmp(argv[c], "-m") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-m") && c + 1 < argc) {
       config.method = ExUtilGetInt(argv[++c], 0, &parse_error);
       use_lossless_preset = 0;   // disable -z option
-    } else if (!strcmp(argv[c], "-q") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-q") && c + 1 < argc) {
       config.quality = ExUtilGetFloat(argv[++c], &parse_error);
       use_lossless_preset = 0;   // disable -z option
-    } else if (!strcmp(argv[c], "-z") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-z") && c + 1 < argc) {
       lossless_preset = ExUtilGetInt(argv[++c], 0, &parse_error);
       if (use_lossless_preset != 0) use_lossless_preset = 1;
-    } else if (!strcmp(argv[c], "-alpha_q") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-alpha_q") && c + 1 < argc) {
       config.alpha_quality = ExUtilGetInt(argv[++c], 0, &parse_error);
-    } else if (!strcmp(argv[c], "-alpha_method") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-alpha_method") && c + 1 < argc) {
       config.alpha_compression = ExUtilGetInt(argv[++c], 0, &parse_error);
     } else if (!strcmp(argv[c], "-alpha_cleanup")) {
       // This flag is obsolete, does opposite of -exact.
       config.exact = 0;
     } else if (!strcmp(argv[c], "-exact")) {
       config.exact = 1;
-    } else if (!strcmp(argv[c], "-blend_alpha") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-blend_alpha") && c + 1 < argc) {
       blend_alpha = 1;
       // background color is given in hex with an optional '0x' prefix
       background_color = ExUtilGetInt(argv[++c], 16, &parse_error);
       background_color = background_color & 0x00ffffffu;
-    } else if (!strcmp(argv[c], "-alpha_filter") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-alpha_filter") && c + 1 < argc) {
       ++c;
       if (!strcmp(argv[c], "none")) {
         config.alpha_filtering = 0;
@@ -750,10 +763,10 @@
       keep_alpha = 0;
     } else if (!strcmp(argv[c], "-lossless")) {
       config.lossless = 1;
-    } else if (!strcmp(argv[c], "-near_lossless") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-near_lossless") && c + 1 < argc) {
       config.near_lossless = ExUtilGetInt(argv[++c], 0, &parse_error);
       config.lossless = 1;  // use near-lossless only with lossless
-    } else if (!strcmp(argv[c], "-hint") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-hint") && c + 1 < argc) {
       ++c;
       if (!strcmp(argv[c], "photo")) {
         config.image_hint = WEBP_HINT_PHOTO;
@@ -765,13 +778,13 @@
         fprintf(stderr, "Error! Unrecognized image hint: %s\n", argv[c]);
         goto Error;
       }
-    } else if (!strcmp(argv[c], "-size") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-size") && c + 1 < argc) {
       config.target_size = ExUtilGetInt(argv[++c], 0, &parse_error);
-    } else if (!strcmp(argv[c], "-psnr") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-psnr") && c + 1 < argc) {
       config.target_PSNR = ExUtilGetFloat(argv[++c], &parse_error);
-    } else if (!strcmp(argv[c], "-sns") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-sns") && c + 1 < argc) {
       config.sns_strength = ExUtilGetInt(argv[++c], 0, &parse_error);
-    } else if (!strcmp(argv[c], "-f") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-f") && c + 1 < argc) {
       config.filter_strength = ExUtilGetInt(argv[++c], 0, &parse_error);
     } else if (!strcmp(argv[c], "-af")) {
       config.autofilter = 1;
@@ -785,27 +798,32 @@
       config.filter_type = 1;
     } else if (!strcmp(argv[c], "-nostrong")) {
       config.filter_type = 0;
-    } else if (!strcmp(argv[c], "-sharpness") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-sharpness") && c + 1 < argc) {
       config.filter_sharpness = ExUtilGetInt(argv[++c], 0, &parse_error);
     } else if (!strcmp(argv[c], "-sharp_yuv")) {
       config.use_sharp_yuv = 1;
-    } else if (!strcmp(argv[c], "-pass") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-pass") && c + 1 < argc) {
       config.pass = ExUtilGetInt(argv[++c], 0, &parse_error);
-    } else if (!strcmp(argv[c], "-pre") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-qrange") && c + 2 < argc) {
+      config.qmin = ExUtilGetInt(argv[++c], 0, &parse_error);
+      config.qmax = ExUtilGetInt(argv[++c], 0, &parse_error);
+      if (config.qmin < 0) config.qmin = 0;
+      if (config.qmax > 100) config.qmax = 100;
+    } else if (!strcmp(argv[c], "-pre") && c + 1 < argc) {
       config.preprocessing = ExUtilGetInt(argv[++c], 0, &parse_error);
-    } else if (!strcmp(argv[c], "-segments") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-segments") && c + 1 < argc) {
       config.segments = ExUtilGetInt(argv[++c], 0, &parse_error);
-    } else if (!strcmp(argv[c], "-partition_limit") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-partition_limit") && c + 1 < argc) {
       config.partition_limit = ExUtilGetInt(argv[++c], 0, &parse_error);
-    } else if (!strcmp(argv[c], "-map") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-map") && c + 1 < argc) {
       picture.extra_info_type = ExUtilGetInt(argv[++c], 0, &parse_error);
-    } else if (!strcmp(argv[c], "-crop") && c < argc - 4) {
+    } else if (!strcmp(argv[c], "-crop") && c + 4 < argc) {
       crop = 1;
       crop_x = ExUtilGetInt(argv[++c], 0, &parse_error);
       crop_y = ExUtilGetInt(argv[++c], 0, &parse_error);
       crop_w = ExUtilGetInt(argv[++c], 0, &parse_error);
       crop_h = ExUtilGetInt(argv[++c], 0, &parse_error);
-    } else if (!strcmp(argv[c], "-resize") && c < argc - 2) {
+    } else if (!strcmp(argv[c], "-resize") && c + 2 < argc) {
       resize_w = ExUtilGetInt(argv[++c], 0, &parse_error);
       resize_h = ExUtilGetInt(argv[++c], 0, &parse_error);
 #ifndef WEBP_DLL
@@ -814,14 +832,18 @@
 #endif
     } else if (!strcmp(argv[c], "-version")) {
       const int version = WebPGetEncoderVersion();
+      const int sharpyuv_version = SharpYuvGetVersion();
       printf("%d.%d.%d\n",
              (version >> 16) & 0xff, (version >> 8) & 0xff, version & 0xff);
-      return 0;
+      printf("libsharpyuv: %d.%d.%d\n",
+             (sharpyuv_version >> 24) & 0xff, (sharpyuv_version >> 16) & 0xffff,
+             sharpyuv_version & 0xff);
+      FREE_WARGV_AND_RETURN(0);
     } else if (!strcmp(argv[c], "-progress")) {
       show_progress = 1;
     } else if (!strcmp(argv[c], "-quiet")) {
       quiet = 1;
-    } else if (!strcmp(argv[c], "-preset") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-preset") && c + 1 < argc) {
       WebPPreset preset;
       ++c;
       if (!strcmp(argv[c], "default")) {
@@ -844,7 +866,7 @@
         fprintf(stderr, "Error! Could initialize configuration with preset.\n");
         goto Error;
       }
-    } else if (!strcmp(argv[c], "-metadata") && c < argc - 1) {
+    } else if (!strcmp(argv[c], "-metadata") && c + 1 < argc) {
       static const struct {
         const char* option;
         int flag;
@@ -878,8 +900,7 @@
         if (i == kNumTokens) {
           fprintf(stderr, "Error! Unknown metadata type '%.*s'\n",
                   (int)(token - start), start);
-          HelpLong();
-          return -1;
+          FREE_WARGV_AND_RETURN(-1);
         }
         start = token + 1;
       }
@@ -893,19 +914,19 @@
     } else if (!strcmp(argv[c], "-v")) {
       verbose = 1;
     } else if (!strcmp(argv[c], "--")) {
-      if (c < argc - 1) in_file = argv[++c];
+      if (c + 1 < argc) in_file = (const char*)GET_WARGV(argv, ++c);
       break;
     } else if (argv[c][0] == '-') {
       fprintf(stderr, "Error! Unknown option '%s'\n", argv[c]);
       HelpLong();
-      return -1;
+      FREE_WARGV_AND_RETURN(-1);
     } else {
-      in_file = argv[c];
+      in_file = (const char*)GET_WARGV(argv, c);
     }
 
     if (parse_error) {
       HelpLong();
-      return -1;
+      FREE_WARGV_AND_RETURN(-1);
     }
   }
   if (in_file == NULL) {
@@ -955,7 +976,8 @@
   }
   if (!ReadPicture(in_file, &picture, keep_alpha,
                    (keep_metadata == 0) ? NULL : &metadata)) {
-    fprintf(stderr, "Error! Cannot read input picture file '%s'\n", in_file);
+    WFPRINTF(stderr, "Error! Cannot read input picture file '%s'\n",
+             (const W_CHAR*)in_file);
     goto Error;
   }
   picture.progress_hook = (show_progress && !quiet) ? ProgressReport : NULL;
@@ -968,28 +990,41 @@
     const double read_time = StopwatchReadAndReset(&stop_watch);
     fprintf(stderr, "Time to read input: %.3fs\n", read_time);
   }
+  // The bitstream should be kept in memory when metadata must be appended
+  // before writing it to a file/stream, and/or when the near-losslessly encoded
+  // bitstream must be decoded for distortion computation (lossy will modify the
+  // 'picture' but not the lossless pipeline).
+  // Otherwise directly write the bitstream to a file.
+  use_memory_writer = (out_file != NULL && keep_metadata) ||
+                      (!quiet && print_distortion >= 0 && config.lossless &&
+                       config.near_lossless < 100);
 
   // Open the output
   if (out_file != NULL) {
-    const int use_stdout = !strcmp(out_file, "-");
-    out = use_stdout ? ImgIoUtilSetBinaryMode(stdout) : fopen(out_file, "wb");
+    const int use_stdout = !WSTRCMP(out_file, "-");
+    out = use_stdout ? ImgIoUtilSetBinaryMode(stdout) : WFOPEN(out_file, "wb");
     if (out == NULL) {
-      fprintf(stderr, "Error! Cannot open output file '%s'\n", out_file);
+      WFPRINTF(stderr, "Error! Cannot open output file '%s'\n",
+               (const W_CHAR*)out_file);
       goto Error;
     } else {
       if (!short_output && !quiet) {
-        fprintf(stderr, "Saving file '%s'\n", out_file);
+        WFPRINTF(stderr, "Saving file '%s'\n", (const W_CHAR*)out_file);
       }
     }
-    if (keep_metadata == 0) {
-      picture.writer = MyWriter;
-      picture.custom_ptr = (void*)out;
-    } else {
+    if (use_memory_writer) {
       picture.writer = WebPMemoryWrite;
       picture.custom_ptr = (void*)&memory_writer;
+    } else {
+      picture.writer = MyWriter;
+      picture.custom_ptr = (void*)out;
     }
   } else {
     out = NULL;
+    if (use_memory_writer) {
+      picture.writer = WebPMemoryWrite;
+      picture.custom_ptr = (void*)&memory_writer;
+    }
     if (!quiet && !short_output) {
       fprintf(stderr, "No output file specified (no -o flag). Encoding will\n");
       fprintf(stderr, "be performed, but its results discarded.\n\n");
@@ -1012,10 +1047,53 @@
     }
   }
   if ((resize_w | resize_h) > 0) {
+    WebPPicture picture_no_alpha;
+    if (config.exact) {
+      // If -exact, we can't premultiply RGB by A otherwise RGB is lost if A=0.
+      // We rescale an opaque copy and assemble scaled A and non-premultiplied
+      // RGB channels. This is slower but it's a very uncommon use case. Color
+      // leak at sharp alpha edges is possible.
+      if (!WebPPictureCopy(&picture, &picture_no_alpha)) {
+        fprintf(stderr, "Error! Cannot copy temporary picture\n");
+        goto Error;
+      }
+
+      // We enforced picture.use_argb = 1 above. Now, remove the alpha values.
+      {
+        int x, y;
+        uint32_t* argb_no_alpha = picture_no_alpha.argb;
+        for (y = 0; y < picture_no_alpha.height; ++y) {
+          for (x = 0; x < picture_no_alpha.width; ++x) {
+            argb_no_alpha[x] |= 0xff000000;  // Opaque copy.
+          }
+          argb_no_alpha += picture_no_alpha.argb_stride;
+        }
+      }
+
+      if (!WebPPictureRescale(&picture_no_alpha, resize_w, resize_h)) {
+        fprintf(stderr, "Error! Cannot resize temporary picture\n");
+        goto Error;
+      }
+    }
+
     if (!WebPPictureRescale(&picture, resize_w, resize_h)) {
       fprintf(stderr, "Error! Cannot resize picture\n");
       goto Error;
     }
+
+    if (config.exact) {  // Put back the alpha information.
+      int x, y;
+      uint32_t* argb_no_alpha = picture_no_alpha.argb;
+      uint32_t* argb = picture.argb;
+      for (y = 0; y < picture_no_alpha.height; ++y) {
+        for (x = 0; x < picture_no_alpha.width; ++x) {
+          argb[x] = (argb[x] & 0xff000000) | (argb_no_alpha[x] & 0x00ffffff);
+        }
+        argb_no_alpha += picture_no_alpha.argb_stride;
+        argb += picture.argb_stride;
+      }
+      WebPPictureFree(&picture_no_alpha);
+    }
   }
   if (verbose && (crop != 0 || (resize_w | resize_h) > 0)) {
     const double preproc_time = StopwatchReadAndReset(&stop_watch);
@@ -1025,8 +1103,12 @@
   if (picture.extra_info_type > 0) {
     AllocExtraInfo(&picture);
   }
-  if (print_distortion >= 0) {  // Save original picture for later comparison
-    WebPPictureCopy(&picture, &original_picture);
+  // Save original picture for later comparison. Only for lossy as lossless does
+  // not modify 'picture' (even near-lossless).
+  if (print_distortion >= 0 && !config.lossless &&
+      !WebPPictureCopy(&picture, &original_picture)) {
+    fprintf(stderr, "Error! Cannot copy temporary picture\n");
+    goto Error;
   }
 
   // Compress.
@@ -1044,40 +1126,72 @@
     fprintf(stderr, "Time to encode picture: %.3fs\n", encode_time);
   }
 
-  // Write info
+  // Get the decompressed image for the lossless pipeline.
+  if (!quiet && print_distortion >= 0 && config.lossless) {
+    if (config.near_lossless == 100) {
+      // Pure lossless: image was not modified, make 'original_picture' a view
+      // of 'picture' by copying all members except the freeable pointers.
+      original_picture = picture;
+      original_picture.memory_ = original_picture.memory_argb_ = NULL;
+    } else {
+      // Decode the bitstream stored in 'memory_writer' to get the altered image
+      // to 'picture'; save the 'original_picture' beforehand.
+      assert(use_memory_writer);
+      original_picture = picture;
+      if (!WebPPictureInit(&picture)) {  // Do not free 'picture'.
+        fprintf(stderr, "Error! Version mismatch!\n");
+        goto Error;
+      }
+
+      picture.use_argb = 1;
+      if (!ReadWebP(
+              memory_writer.mem, memory_writer.size, &picture,
+              /*keep_alpha=*/WebPPictureHasTransparency(&original_picture),
+              /*metadata=*/NULL)) {
+        fprintf(stderr, "Error! Cannot decode encoded WebP bitstream\n");
+        fprintf(stderr, "Error code: %d (%s)\n", picture.error_code,
+                kErrorMessages[picture.error_code]);
+        goto Error;
+      }
+      picture.stats = original_picture.stats;
+    }
+    original_picture.stats = NULL;
+  }
+
+  // Write the YUV planes to a PGM file. Only available for lossy.
   if (dump_file) {
     if (picture.use_argb) {
-      fprintf(stderr, "Warning: can't dump file (-d option) in lossless mode.");
+      fprintf(stderr, "Warning: can't dump file (-d option) "
+                      "in lossless mode.\n");
     } else if (!DumpPicture(&picture, dump_file)) {
-      fprintf(stderr, "Warning, couldn't dump picture %s\n", dump_file);
+      WFPRINTF(stderr, "Warning, couldn't dump picture %s\n",
+               (const W_CHAR*)dump_file);
     }
   }
 
-  if (keep_metadata != 0) {
-    if (out != NULL) {
-      if (!WriteWebPWithMetadata(out, &picture, &memory_writer,
-                                 &metadata, keep_metadata, &metadata_written)) {
-        fprintf(stderr, "Error writing WebP file with metadata!\n");
-        goto Error;
-      }
-    } else {  // output is disabled, just display the metadata stats.
-      const struct {
-        const MetadataPayload* const payload;
-        int flag;
-      } *iter, info[] = {
-        { &metadata.exif, METADATA_EXIF },
-        { &metadata.iccp, METADATA_ICC },
-        { &metadata.xmp, METADATA_XMP },
-        { NULL, 0 }
-      };
-      uint32_t unused1 = 0;
-      uint64_t unused2 = 0;
+  if (use_memory_writer && out != NULL &&
+      !WriteWebPWithMetadata(out, &picture, &memory_writer, &metadata,
+                             keep_metadata, &metadata_written)) {
+    fprintf(stderr, "Error writing WebP file!\n");
+    goto Error;
+  }
 
-      for (iter = info; iter->payload != NULL; ++iter) {
-        if (UpdateFlagsAndSize(iter->payload, !!(keep_metadata & iter->flag),
-                               0, &unused1, &unused2)) {
-          metadata_written |= iter->flag;
-        }
+  if (out == NULL && keep_metadata) {
+    // output is disabled, just display the metadata stats.
+    const struct {
+      const MetadataPayload* const payload;
+      int flag;
+    } *iter, info[] = {{&metadata.exif, METADATA_EXIF},
+                       {&metadata.iccp, METADATA_ICC},
+                       {&metadata.xmp, METADATA_XMP},
+                       {NULL, 0}};
+    uint32_t unused1 = 0;
+    uint64_t unused2 = 0;
+
+    for (iter = info; iter->payload != NULL; ++iter) {
+      if (UpdateFlagsAndSize(iter->payload, !!(keep_metadata & iter->flag),
+                             /*flag=*/0, &unused1, &unused2)) {
+        metadata_written |= iter->flag;
       }
     }
   }
@@ -1117,7 +1231,7 @@
 
  Error:
   WebPMemoryWriterClear(&memory_writer);
-  free(picture.extra_info);
+  WebPFree(picture.extra_info);
   MetadataFree(&metadata);
   WebPPictureFree(&picture);
   WebPPictureFree(&original_picture);
@@ -1125,7 +1239,7 @@
     fclose(out);
   }
 
-  return return_value;
+  FREE_WARGV_AND_RETURN(return_value);
 }
 
 //------------------------------------------------------------------------------
diff --git a/third_party/libwebp/examples/dwebp.c b/third_party/libwebp/examples/dwebp.c
index 154069a..652de6a 100644
--- a/third_party/libwebp/examples/dwebp.c
+++ b/third_party/libwebp/examples/dwebp.c
@@ -24,6 +24,7 @@
 #include "../imageio/image_enc.h"
 #include "../imageio/webpdec.h"
 #include "./stopwatch.h"
+#include "./unicode.h"
 
 static int verbose = 0;
 static int quiet = 0;
@@ -42,7 +43,7 @@
 
 static int SaveOutput(const WebPDecBuffer* const buffer,
                       WebPOutputFileFormat format, const char* const out_file) {
-  const int use_stdout = (out_file != NULL) && !strcmp(out_file, "-");
+  const int use_stdout = (out_file != NULL) && !WSTRCMP(out_file, "-");
   int ok = 1;
   Stopwatch stop_watch;
 
@@ -56,7 +57,7 @@
       if (use_stdout) {
         fprintf(stderr, "Saved to stdout\n");
       } else {
-        fprintf(stderr, "Saved file %s\n", out_file);
+        WFPRINTF(stderr, "Saved file %s\n", (const W_CHAR*)out_file);
       }
     }
     if (verbose) {
@@ -67,7 +68,7 @@
     if (use_stdout) {
       fprintf(stderr, "Error writing to stdout !!\n");
     } else {
-      fprintf(stderr, "Error writing file %s !!\n", out_file);
+      WFPRINTF(stderr, "Error writing file %s !!\n", (const W_CHAR*)out_file);
     }
   }
   return ok;
@@ -75,7 +76,8 @@
 
 static void Help(void) {
   printf("Usage: dwebp in_file [options] [-o out_file]\n\n"
-         "Decodes the WebP image file to PNG format [Default]\n"
+         "Decodes the WebP image file to PNG format [Default].\n"
+         "Note: Animated WebP files are not supported.\n\n"
          "Use following options to convert into alternate image formats:\n"
          "  -pam ......... save the raw RGBA samples as a color PAM\n"
          "  -ppm ......... save the raw RGB samples as a color PPM\n"
@@ -94,7 +96,7 @@
          "  -alpha_dither  use alpha-plane dithering if needed\n"
          "  -mt .......... use multi-threading\n"
          "  -crop <x> <y> <w> <h> ... crop output with the given rectangle\n"
-         "  -resize <w> <h> ......... scale the output (*after* any cropping)\n"
+         "  -resize <w> <h> ......... resize output (*after* any cropping)\n"
          "  -flip ........ flip the output vertically\n"
          "  -alpha ....... only save the alpha plane\n"
          "  -incremental . use incremental decoding (useful for tests)\n"
@@ -131,7 +133,7 @@
                      format == RGB_565) ? 2
                   : 4;
     uint32_t stride = bpp * w + 7;   // <- just for exercising
-    external_buffer = (uint8_t*)malloc(stride * h);
+    external_buffer = (uint8_t*)WebPMalloc(stride * h);
     if (external_buffer == NULL) return NULL;
     output_buffer->u.RGBA.stride = stride;
     output_buffer->u.RGBA.size = stride * h;
@@ -144,7 +146,7 @@
     uint32_t total_size = stride * h * (has_alpha ? 2 : 1)
                         + 2 * uv_stride * (h + 1) / 2;
     assert(format >= YUV && format <= YUVA);
-    external_buffer = (uint8_t*)malloc(total_size);
+    external_buffer = (uint8_t*)WebPMalloc(total_size);
     if (external_buffer == NULL) return NULL;
     tmp = external_buffer;
     output_buffer->u.YUVA.y = tmp;
@@ -175,10 +177,10 @@
   return external_buffer;
 }
 
-int main(int argc, const char *argv[]) {
+int main(int argc, const char* argv[]) {
   int ok = 0;
-  const char *in_file = NULL;
-  const char *out_file = NULL;
+  const char* in_file = NULL;
+  const char* out_file = NULL;
 
   WebPDecoderConfig config;
   WebPDecBuffer* const output_buffer = &config.output;
@@ -191,18 +193,20 @@
   int incremental = 0;
   int c;
 
+  INIT_WARGV(argc, argv);
+
   if (!WebPInitDecoderConfig(&config)) {
     fprintf(stderr, "Library version mismatch!\n");
-    return -1;
+    FREE_WARGV_AND_RETURN(-1);
   }
 
   for (c = 1; c < argc; ++c) {
     int parse_error = 0;
     if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) {
       Help();
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else if (!strcmp(argv[c], "-o") && c < argc - 1) {
-      out_file = argv[++c];
+      out_file = (const char*)GET_WARGV(argv, ++c);
     } else if (!strcmp(argv[c], "-alpha")) {
       format = ALPHA_PLANE_ONLY;
     } else if (!strcmp(argv[c], "-nofancy")) {
@@ -223,7 +227,7 @@
       const int version = WebPGetDecoderVersion();
       printf("%d.%d.%d\n",
              (version >> 16) & 0xff, (version >> 8) & 0xff, version & 0xff);
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else if (!strcmp(argv[c], "-pgm")) {
       format = PGM;
     } else if (!strcmp(argv[c], "-yuv")) {
@@ -284,26 +288,26 @@
     } else if (!strcmp(argv[c], "-incremental")) {
       incremental = 1;
     } else if (!strcmp(argv[c], "--")) {
-      if (c < argc - 1) in_file = argv[++c];
+      if (c < argc - 1) in_file = (const char*)GET_WARGV(argv, ++c);
       break;
     } else if (argv[c][0] == '-') {
       fprintf(stderr, "Unknown option '%s'\n", argv[c]);
       Help();
-      return -1;
+      FREE_WARGV_AND_RETURN(-1);
     } else {
-      in_file = argv[c];
+      in_file = (const char*)GET_WARGV(argv, c);
     }
 
     if (parse_error) {
       Help();
-      return -1;
+      FREE_WARGV_AND_RETURN(-1);
     }
   }
 
   if (in_file == NULL) {
     fprintf(stderr, "missing input file!!\n");
     Help();
-    return -1;
+    FREE_WARGV_AND_RETURN(-1);
   }
 
   if (quiet) verbose = 0;
@@ -312,7 +316,7 @@
     VP8StatusCode status = VP8_STATUS_OK;
     size_t data_size = 0;
     if (!LoadWebP(in_file, &data, &data_size, bitstream)) {
-      return -1;
+      FREE_WARGV_AND_RETURN(-1);
     }
 
     switch (format) {
@@ -389,18 +393,18 @@
 
   if (out_file != NULL) {
     if (!quiet) {
-      fprintf(stderr, "Decoded %s. Dimensions: %d x %d %s. Format: %s. "
-                      "Now saving...\n",
-              in_file, output_buffer->width, output_buffer->height,
+      WFPRINTF(stderr, "Decoded %s.", (const W_CHAR*)in_file);
+      fprintf(stderr, " Dimensions: %d x %d %s. Format: %s. Now saving...\n",
+              output_buffer->width, output_buffer->height,
               bitstream->has_alpha ? " (with alpha)" : "",
               kFormatType[bitstream->format]);
     }
     ok = SaveOutput(output_buffer, format, out_file);
   } else {
     if (!quiet) {
-      fprintf(stderr, "File %s can be decoded "
-                      "(dimensions: %d x %d %s. Format: %s).\n",
-              in_file, output_buffer->width, output_buffer->height,
+      WFPRINTF(stderr, "File %s can be decoded ", (const W_CHAR*)in_file);
+      fprintf(stderr, "(dimensions: %d x %d %s. Format: %s).\n",
+              output_buffer->width, output_buffer->height,
               bitstream->has_alpha ? " (with alpha)" : "",
               kFormatType[bitstream->format]);
       fprintf(stderr, "Nothing written; "
@@ -409,9 +413,9 @@
   }
  Exit:
   WebPFreeDecBuffer(output_buffer);
-  free((void*)external_buffer);
-  free((void*)data);
-  return ok ? 0 : -1;
+  WebPFree((void*)external_buffer);
+  WebPFree((void*)data);
+  FREE_WARGV_AND_RETURN(ok ? 0 : -1);
 }
 
 //------------------------------------------------------------------------------
diff --git a/third_party/libwebp/examples/example_util.c b/third_party/libwebp/examples/example_util.c
index 825a123..fa38d3c 100644
--- a/third_party/libwebp/examples/example_util.c
+++ b/third_party/libwebp/examples/example_util.c
@@ -75,7 +75,7 @@
 void ExUtilDeleteCommandLineArguments(CommandLineArguments* const args) {
   if (args != NULL) {
     if (args->own_argv_) {
-      free((void*)args->argv_);
+      WebPFree((void*)args->argv_);
       WebPDataClear(&args->argv_data_);
     }
     ResetCommandLineArguments(0, NULL, args);
@@ -90,12 +90,23 @@
   if (argc == 1 && argv[0][0] != '-') {
     char* cur;
     const char sep[] = " \t\r\n\f\v";
+
+#if defined(_WIN32) && defined(_UNICODE)
+    fprintf(stderr,
+            "Error: Reading arguments from a file is a feature unavailable "
+            "with Unicode binaries.\n");
+    return 0;
+#endif
+
     if (!ExUtilReadFileToWebPData(argv[0], &args->argv_data_)) {
       return 0;
     }
     args->own_argv_ = 1;
-    args->argv_ = (const char**)malloc(MAX_ARGC * sizeof(*args->argv_));
-    if (args->argv_ == NULL) return 0;
+    args->argv_ = (const char**)WebPMalloc(MAX_ARGC * sizeof(*args->argv_));
+    if (args->argv_ == NULL) {
+      ExUtilDeleteCommandLineArguments(args);
+      return 0;
+    }
 
     argc = 0;
     for (cur = strtok((char*)args->argv_data_.bytes, sep);
@@ -103,6 +114,7 @@
          cur = strtok(NULL, sep)) {
       if (argc == MAX_ARGC) {
         fprintf(stderr, "ERROR: Arguments limit %d reached\n", MAX_ARGC);
+        ExUtilDeleteCommandLineArguments(args);
         return 0;
       }
       assert(strlen(cur) != 0);
diff --git a/third_party/libwebp/examples/gif2webp.c b/third_party/libwebp/examples/gif2webp.c
index b61f273..cc9b25d 100644
--- a/third_party/libwebp/examples/gif2webp.c
+++ b/third_party/libwebp/examples/gif2webp.c
@@ -33,6 +33,8 @@
 #include "../examples/example_util.h"
 #include "../imageio/imageio_util.h"
 #include "./gifdec.h"
+#include "./unicode.h"
+#include "./unicode_gif.h"
 
 #if !defined(STDIN_FILENO)
 #define STDIN_FILENO 0
@@ -94,13 +96,12 @@
 
 //------------------------------------------------------------------------------
 
-int main(int argc, const char *argv[]) {
+int main(int argc, const char* argv[]) {
   int verbose = 0;
   int gif_error = GIF_ERROR;
   WebPMuxError err = WEBP_MUX_OK;
   int ok = 0;
-  const char *in_file = NULL, *out_file = NULL;
-  FILE* out = NULL;
+  const W_CHAR* in_file = NULL, *out_file = NULL;
   GifFileType* gif = NULL;
   int frame_duration = 0;
   int frame_timestamp = 0;
@@ -133,11 +134,13 @@
   int default_kmin = 1;  // Whether to use default kmin value.
   int default_kmax = 1;
 
+  INIT_WARGV(argc, argv);
+
   if (!WebPConfigInit(&config) || !WebPAnimEncoderOptionsInit(&enc_options) ||
       !WebPPictureInit(&frame) || !WebPPictureInit(&curr_canvas) ||
       !WebPPictureInit(&prev_canvas)) {
     fprintf(stderr, "Error! Version mismatch!\n");
-    return -1;
+    FREE_WARGV_AND_RETURN(-1);
   }
   config.lossless = 1;  // Use lossless compression by default.
 
@@ -147,16 +150,16 @@
 
   if (argc == 1) {
     Help();
-    return 0;
+    FREE_WARGV_AND_RETURN(0);
   }
 
   for (c = 1; c < argc; ++c) {
     int parse_error = 0;
     if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) {
       Help();
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else if (!strcmp(argv[c], "-o") && c < argc - 1) {
-      out_file = argv[++c];
+      out_file = GET_WARGV(argv, ++c);
     } else if (!strcmp(argv[c], "-lossy")) {
       config.lossless = 0;
     } else if (!strcmp(argv[c], "-mixed")) {
@@ -213,7 +216,7 @@
           fprintf(stderr, "Error! Unknown metadata type '%.*s'\n",
                   (int)(token - start), start);
           Help();
-          return -1;
+          FREE_WARGV_AND_RETURN(-1);
         }
         start = token + 1;
       }
@@ -226,7 +229,7 @@
              (enc_version >> 16) & 0xff, (enc_version >> 8) & 0xff,
              enc_version & 0xff, (mux_version >> 16) & 0xff,
              (mux_version >> 8) & 0xff, mux_version & 0xff);
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else if (!strcmp(argv[c], "-quiet")) {
       quiet = 1;
       enc_options.verbose = 0;
@@ -234,19 +237,19 @@
       verbose = 1;
       enc_options.verbose = 1;
     } else if (!strcmp(argv[c], "--")) {
-      if (c < argc - 1) in_file = argv[++c];
+      if (c < argc - 1) in_file = GET_WARGV(argv, ++c);
       break;
     } else if (argv[c][0] == '-') {
       fprintf(stderr, "Error! Unknown option '%s'\n", argv[c]);
       Help();
-      return -1;
+      FREE_WARGV_AND_RETURN(-1);
     } else {
-      in_file = argv[c];
+      in_file = GET_WARGV(argv, c);
     }
 
     if (parse_error) {
       Help();
-      return -1;
+      FREE_WARGV_AND_RETURN(-1);
     }
   }
 
@@ -270,13 +273,7 @@
   }
 
   // Start the decoder object
-#if LOCAL_GIF_PREREQ(5,0)
-  gif = !strcmp(in_file, "-") ? DGifOpenFileHandle(STDIN_FILENO, &gif_error)
-                              : DGifOpenFileName(in_file, &gif_error);
-#else
-  gif = !strcmp(in_file, "-") ? DGifOpenFileHandle(STDIN_FILENO)
-                              : DGifOpenFileName(in_file);
-#endif
+  gif = DGifOpenFileUnicode(in_file, &gif_error);
   if (gif == NULL) goto End;
 
   // Loop over GIF images
@@ -317,8 +314,11 @@
           frame.use_argb = 1;
           if (!WebPPictureAlloc(&frame)) goto End;
           GIFClearPic(&frame, NULL);
-          WebPPictureCopy(&frame, &curr_canvas);
-          WebPPictureCopy(&frame, &prev_canvas);
+          if (!(WebPPictureCopy(&frame, &curr_canvas) &&
+                WebPPictureCopy(&frame, &prev_canvas))) {
+            fprintf(stderr, "Error allocating canvas.\n");
+            goto End;
+          }
 
           // Background color.
           GIFGetBackgroundColor(gif->SColorMap, gif->SBackGroundColor,
@@ -382,7 +382,7 @@
       }
       case EXTENSION_RECORD_TYPE: {
         int extension;
-        GifByteType *data = NULL;
+        GifByteType* data = NULL;
         if (DGifGetExtension(gif, &extension, &data) == GIF_ERROR) {
           goto End;
         }
@@ -468,8 +468,10 @@
     fprintf(stderr, "%s\n", WebPAnimEncoderGetError(enc));
     goto End;
   }
-
-  if (!loop_compatibility) {
+  // If there's only one frame, we don't need to handle loop count.
+  if (frame_number == 1) {
+    loop_count = 0;
+  } else if (!loop_compatibility) {
     if (!stored_loop_count) {
       // if no loop-count element is seen, the default is '1' (loop-once)
       // and we need to signal it explicitly in WebP. Note however that
@@ -478,7 +480,7 @@
         stored_loop_count = 1;
         loop_count = 1;
       }
-    } else if (loop_count > 0) {
+    } else if (loop_count > 0 && loop_count < 65535) {
       // adapt GIF's semantic to WebP's (except in the infinite-loop case)
       loop_count += 1;
     }
@@ -545,17 +547,18 @@
   }
 
   if (out_file != NULL) {
-    if (!ImgIoUtilWriteFile(out_file, webp_data.bytes, webp_data.size)) {
-      fprintf(stderr, "Error writing output file: %s\n", out_file);
+    if (!ImgIoUtilWriteFile((const char*)out_file, webp_data.bytes,
+                            webp_data.size)) {
+      WFPRINTF(stderr, "Error writing output file: %s\n", out_file);
       goto End;
     }
     if (!quiet) {
-      if (!strcmp(out_file, "-")) {
+      if (!WSTRCMP(out_file, "-")) {
         fprintf(stderr, "Saved %d bytes to STDIO\n",
                 (int)webp_data.size);
       } else {
-        fprintf(stderr, "Saved output file (%d bytes): %s\n",
-                (int)webp_data.size, out_file);
+        WFPRINTF(stderr, "Saved output file (%d bytes): %s\n",
+                 (int)webp_data.size, out_file);
       }
     }
   } else {
@@ -578,7 +581,6 @@
   WebPPictureFree(&curr_canvas);
   WebPPictureFree(&prev_canvas);
   WebPAnimEncoderDelete(enc);
-  if (out != NULL && out_file != NULL) fclose(out);
 
   if (gif_error != GIF_OK) {
     GIFDisplayError(gif, gif_error);
@@ -591,12 +593,12 @@
 #endif
   }
 
-  return !ok;
+  FREE_WARGV_AND_RETURN(!ok);
 }
 
 #else  // !WEBP_HAVE_GIF
 
-int main(int argc, const char *argv[]) {
+int main(int argc, const char* argv[]) {
   fprintf(stderr, "GIF support not enabled in %s.\n", argv[0]);
   (void)argc;
   return 0;
diff --git a/third_party/libwebp/examples/gifdec.c b/third_party/libwebp/examples/gifdec.c
index 4219352..99ee996 100644
--- a/third_party/libwebp/examples/gifdec.c
+++ b/third_party/libwebp/examples/gifdec.c
@@ -137,7 +137,7 @@
   }
   dst = sub_image.argb;
 
-  tmp = (uint8_t*)malloc(rect.width * sizeof(*tmp));
+  tmp = (uint8_t*)WebPMalloc(rect.width * sizeof(*tmp));
   if (tmp == NULL) goto End;
 
   if (image_desc->Interlace) {  // Interlaced image.
@@ -168,7 +168,7 @@
  End:
   if (!ok) picture->error_code = sub_image.error_code;
   WebPPictureFree(&sub_image);
-  free(tmp);
+  WebPFree(tmp);
   return ok;
 }
 
diff --git a/third_party/libwebp/examples/img2webp.c b/third_party/libwebp/examples/img2webp.c
index 2f750c5..3735030 100644
--- a/third_party/libwebp/examples/img2webp.c
+++ b/third_party/libwebp/examples/img2webp.c
@@ -27,6 +27,8 @@
 #include "../imageio/image_dec.h"
 #include "../imageio/imageio_util.h"
 #include "./stopwatch.h"
+#include "./unicode.h"
+#include "sharpyuv/sharpyuv.h"
 #include "webp/encode.h"
 #include "webp/mux.h"
 
@@ -34,18 +36,22 @@
 
 static void Help(void) {
   printf("Usage:\n\n");
-  printf("  img2webp [file-level options] [image files...] "
-         "[per-frame options...]\n");
-  printf("\n");
+  printf("  img2webp [file_options] [[frame_options] frame_file]...");
+  printf(" [-o webp_file]\n\n");
 
   printf("File-level options (only used at the start of compression):\n");
   printf(" -min_size ............ minimize size\n");
-  printf(" -loop <int> .......... loop count (default: 0, = infinite loop)\n");
   printf(" -kmax <int> .......... maximum number of frame between key-frames\n"
          "                        (0=only keyframes)\n");
   printf(" -kmin <int> .......... minimum number of frame between key-frames\n"
          "                        (0=disable key-frames altogether)\n");
   printf(" -mixed ............... use mixed lossy/lossless automatic mode\n");
+  printf(" -near_lossless <int> . use near-lossless image preprocessing\n"
+         "                        (0..100=off), default=100\n");
+  printf(" -sharp_yuv ........... use sharper (and slower) RGB->YUV "
+                                  "conversion\n                        "
+                                  "(lossy only)\n");
+  printf(" -loop <int> .......... loop count (default: 0, = infinite loop)\n");
   printf(" -v ................... verbose mode\n");
   printf(" -h ................... this help\n");
   printf(" -version ............. print version number and exit\n");
@@ -61,6 +67,12 @@
   printf("\n");
   printf("example: img2webp -loop 2 in0.png -lossy in1.jpg\n"
          "                  -d 80 in2.tiff -o out.webp\n");
+  printf("\nNote: if a single file name is passed as the argument, the "
+         "arguments will be\n");
+  printf("tokenized from this file. The file name must not start with "
+         "the character '-'.\n");
+  printf("\nSupported input formats:\n  %s\n",
+         WebPGetEnabledInputFileFormats());
 }
 
 //------------------------------------------------------------------------------
@@ -79,7 +91,7 @@
   if (!ImgIoUtilReadFile(filename, &data, &data_size)) return 0;
   reader = WebPGuessImageReader(data, data_size);
   ok = reader(data, data_size, pic, 1, NULL);
-  free((void*)data);
+  WebPFree((void*)data);
   return ok;
 }
 
@@ -134,8 +146,13 @@
   int c;
   int have_input = 0;
   CommandLineArguments cmd_args;
-  int ok = ExUtilInitCommandLineArguments(argc - 1, argv + 1, &cmd_args);
-  if (!ok) return 1;
+  int ok;
+
+  INIT_WARGV(argc, argv);
+
+  ok = ExUtilInitCommandLineArguments(argc - 1, argv + 1, &cmd_args);
+  if (!ok) FREE_WARGV_AND_RETURN(1);
+
   argc = cmd_args.argc_;
   argv = cmd_args.argv_;
 
@@ -154,7 +171,7 @@
       int parse_error = 0;
       if (!strcmp(argv[c], "-o") && c + 1 < argc) {
         argv[c] = NULL;
-        output = argv[++c];
+        output = (const char*)GET_WARGV_SHIFTED(argv, ++c);
       } else if (!strcmp(argv[c], "-kmin") && c + 1 < argc) {
         argv[c] = NULL;
         anim_config.kmin = ExUtilGetInt(argv[++c], 0, &parse_error);
@@ -173,18 +190,26 @@
       } else if (!strcmp(argv[c], "-mixed")) {
         anim_config.allow_mixed = 1;
         config.lossless = 0;
+      } else if (!strcmp(argv[c], "-near_lossless") && c + 1 < argc) {
+        argv[c] = NULL;
+        config.near_lossless = ExUtilGetInt(argv[++c], 0, &parse_error);
+      } else if (!strcmp(argv[c], "-sharp_yuv")) {
+        config.use_sharp_yuv = 1;
       } else if (!strcmp(argv[c], "-v")) {
         verbose = 1;
       } else if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) {
         Help();
-        goto End;
+        FREE_WARGV_AND_RETURN(0);
       } else if (!strcmp(argv[c], "-version")) {
         const int enc_version = WebPGetEncoderVersion();
         const int mux_version = WebPGetMuxVersion();
+        const int sharpyuv_version = SharpYuvGetVersion();
         printf("WebP Encoder version: %d.%d.%d\nWebP Mux version: %d.%d.%d\n",
                (enc_version >> 16) & 0xff, (enc_version >> 8) & 0xff,
                enc_version & 0xff, (mux_version >> 16) & 0xff,
                (mux_version >> 8) & 0xff, mux_version & 0xff);
+        printf("libsharpyuv: %d.%d.%d\n", (sharpyuv_version >> 24) & 0xff,
+               (sharpyuv_version >> 16) & 0xffff, sharpyuv_version & 0xff);
         goto End;
       } else {
         continue;
@@ -241,7 +266,7 @@
 
     // read next input image
     pic.use_argb = 1;
-    ok = ReadImage(argv[c], &pic);
+    ok = ReadImage((const char*)GET_WARGV_SHIFTED(argv, c), &pic);
     if (!ok) goto End;
 
     if (enc == NULL) {
@@ -273,8 +298,8 @@
     if (!ok) goto End;
 
     if (verbose) {
-      fprintf(stderr, "Added frame #%3d at time %4d (file: %s)\n",
-              pic_num, timestamp_ms, argv[c]);
+      WFPRINTF(stderr, "Added frame #%3d at time %4d (file: %s)\n",
+               pic_num, timestamp_ms, GET_WARGV_SHIFTED(argv, c));
     }
     timestamp_ms += duration;
     ++pic_num;
@@ -298,7 +323,7 @@
   if (ok) {
     if (output != NULL) {
       ok = ImgIoUtilWriteFile(output, webp_data.bytes, webp_data.size);
-      if (ok) fprintf(stderr, "output file: %s     ", output);
+      if (ok) WFPRINTF(stderr, "output file: %s     ", (const W_CHAR*)output);
     } else {
       fprintf(stderr, "[no output file specified]   ");
     }
@@ -310,5 +335,5 @@
   }
   WebPDataClear(&webp_data);
   ExUtilDeleteCommandLineArguments(&cmd_args);
-  return ok ? 0 : 1;
+  FREE_WARGV_AND_RETURN(ok ? 0 : 1);
 }
diff --git a/third_party/libwebp/examples/stopwatch.h b/third_party/libwebp/examples/stopwatch.h
index f9e799c..f1b0fac 100644
--- a/third_party/libwebp/examples/stopwatch.h
+++ b/third_party/libwebp/examples/stopwatch.h
@@ -60,4 +60,4 @@
 
 #endif   /* _WIN32 */
 
-#endif  /* WEBP_EXAMPLES_STOPWATCH_H_ */
+#endif  // WEBP_EXAMPLES_STOPWATCH_H_
diff --git a/third_party/libwebp/examples/unicode.h b/third_party/libwebp/examples/unicode.h
new file mode 100644
index 0000000..0831e23
--- /dev/null
+++ b/third_party/libwebp/examples/unicode.h
@@ -0,0 +1,116 @@
+// Copyright 2018 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Unicode support for Windows. The main idea is to maintain an array of Unicode
+// arguments (wargv) and use it only for file paths. The regular argv is used
+// for everything else.
+//
+// Author: Yannis Guyon (yguyon@google.com)
+
+#ifndef WEBP_EXAMPLES_UNICODE_H_
+#define WEBP_EXAMPLES_UNICODE_H_
+
+#include <stdio.h>
+
+#if defined(_WIN32) && defined(_UNICODE)
+
+// wchar_t is used instead of TCHAR because we only perform additional work when
+// Unicode is enabled and because the output of CommandLineToArgvW() is wchar_t.
+
+#include <fcntl.h>
+#include <io.h>
+#include <wchar.h>
+#include <windows.h>
+#include <shellapi.h>
+
+// Create a wchar_t array containing Unicode parameters.
+#define INIT_WARGV(ARGC, ARGV)                                                \
+  int wargc;                                                                  \
+  const W_CHAR** const wargv =                                                \
+      (const W_CHAR**)CommandLineToArgvW(GetCommandLineW(), &wargc);          \
+  do {                                                                        \
+    if (wargv == NULL || wargc != (ARGC)) {                                   \
+      fprintf(stderr, "Error: Unable to get Unicode arguments.\n");           \
+      FREE_WARGV_AND_RETURN(-1);                                              \
+    }                                                                         \
+  } while (0)
+
+// Use this to get a Unicode argument (e.g. file path).
+#define GET_WARGV(UNUSED, C) wargv[C]
+// For cases where argv is shifted by one compared to wargv.
+#define GET_WARGV_SHIFTED(UNUSED, C) wargv[(C) + 1]
+#define GET_WARGV_OR_NULL() wargv
+
+// Release resources. LocalFree() is needed after CommandLineToArgvW().
+#define FREE_WARGV() LOCAL_FREE((W_CHAR** const)wargv)
+#define LOCAL_FREE(WARGV)                  \
+  do {                                     \
+    if ((WARGV) != NULL) LocalFree(WARGV); \
+  } while (0)
+
+#define W_CHAR wchar_t  // WCHAR without underscore might already be defined.
+#define TO_W_CHAR(STR) (L##STR)
+
+#define WFOPEN(ARG, OPT) _wfopen((const W_CHAR*)ARG, TO_W_CHAR(OPT))
+
+#define WFPRINTF(STREAM, STR, ...)                    \
+  do {                                                \
+    int prev_mode;                                    \
+    fflush(STREAM);                                   \
+    prev_mode = _setmode(_fileno(STREAM), _O_U8TEXT); \
+    fwprintf(STREAM, TO_W_CHAR(STR), __VA_ARGS__);    \
+    fflush(STREAM);                                   \
+    (void)_setmode(_fileno(STREAM), prev_mode);       \
+  } while (0)
+#define WPRINTF(STR, ...) WFPRINTF(stdout, STR, __VA_ARGS__)
+
+#define WSTRLEN(FILENAME) wcslen((const W_CHAR*)FILENAME)
+#define WSTRCMP(FILENAME, STR) wcscmp((const W_CHAR*)FILENAME, TO_W_CHAR(STR))
+#define WSTRRCHR(FILENAME, STR) wcsrchr((const W_CHAR*)FILENAME, TO_W_CHAR(STR))
+#define WSNPRINTF(A, B, STR, ...) _snwprintf(A, B, TO_W_CHAR(STR), __VA_ARGS__)
+
+#else
+
+#include <string.h>
+
+// Unicode file paths work as is on Unix platforms, and no extra work is done on
+// Windows either if Unicode is disabled.
+
+#define INIT_WARGV(ARGC, ARGV)
+
+#define GET_WARGV(ARGV, C) (ARGV)[C]
+#define GET_WARGV_SHIFTED(ARGV, C) (ARGV)[C]
+#define GET_WARGV_OR_NULL() NULL
+
+#define FREE_WARGV()
+#define LOCAL_FREE(WARGV)
+
+#define W_CHAR char
+#define TO_W_CHAR(STR) (STR)
+
+#define WFOPEN(ARG, OPT) fopen(ARG, OPT)
+
+#define WPRINTF(STR, ...) printf(STR, __VA_ARGS__)
+#define WFPRINTF(STREAM, STR, ...) fprintf(STREAM, STR, __VA_ARGS__)
+
+#define WSTRLEN(FILENAME) strlen(FILENAME)
+#define WSTRCMP(FILENAME, STR) strcmp(FILENAME, STR)
+#define WSTRRCHR(FILENAME, STR) strrchr(FILENAME, STR)
+#define WSNPRINTF(A, B, STR, ...) snprintf(A, B, STR, __VA_ARGS__)
+
+#endif  // defined(_WIN32) && defined(_UNICODE)
+
+// Don't forget to free wargv before returning (e.g. from main).
+#define FREE_WARGV_AND_RETURN(VALUE) \
+  do {                               \
+    FREE_WARGV();                    \
+    return (VALUE);                  \
+  } while (0)
+
+#endif  // WEBP_EXAMPLES_UNICODE_H_
diff --git a/third_party/libwebp/examples/unicode_gif.h b/third_party/libwebp/examples/unicode_gif.h
new file mode 100644
index 0000000..626c6e7
--- /dev/null
+++ b/third_party/libwebp/examples/unicode_gif.h
@@ -0,0 +1,76 @@
+// Copyright 2018 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// giflib doesn't have a Unicode DGifOpenFileName(). Let's make one.
+//
+// Author: Yannis Guyon (yguyon@google.com)
+
+#ifndef WEBP_EXAMPLES_UNICODE_GIF_H_
+#define WEBP_EXAMPLES_UNICODE_GIF_H_
+
+#include "./unicode.h"
+#ifdef HAVE_CONFIG_H
+#include "webp/config.h"  // For WEBP_HAVE_GIF
+#endif
+
+#if defined(WEBP_HAVE_GIF)
+
+#ifdef _WIN32
+#include <fcntl.h>  // Not standard, needed for _topen and flags.
+#include <io.h>
+#endif
+
+#include <gif_lib.h>
+#include <string.h>
+#include "./gifdec.h"
+
+#if !defined(STDIN_FILENO)
+#define STDIN_FILENO 0
+#endif
+
+static GifFileType* DGifOpenFileUnicode(const W_CHAR* file_name, int* error) {
+  if (!WSTRCMP(file_name, "-")) {
+#if LOCAL_GIF_PREREQ(5, 0)
+    return DGifOpenFileHandle(STDIN_FILENO, error);
+#else
+    (void)error;
+    return DGifOpenFileHandle(STDIN_FILENO);
+#endif
+  }
+
+#if defined(_WIN32) && defined(_UNICODE)
+  {
+    int file_handle = _wopen(file_name, _O_RDONLY | _O_BINARY);
+    if (file_handle == -1) {
+      if (error != NULL) *error = D_GIF_ERR_OPEN_FAILED;
+      return NULL;
+    }
+
+#if LOCAL_GIF_PREREQ(5, 0)
+    return DGifOpenFileHandle(file_handle, error);
+#else
+    return DGifOpenFileHandle(file_handle);
+#endif
+  }
+
+#else
+
+#if LOCAL_GIF_PREREQ(5, 0)
+  return DGifOpenFileName(file_name, error);
+#else
+  return DGifOpenFileName(file_name);
+#endif
+
+#endif  // defined(_WIN32) && defined(_UNICODE)
+  // DGifCloseFile() is called later.
+}
+
+#endif  // defined(WEBP_HAVE_GIF)
+
+#endif  // WEBP_EXAMPLES_UNICODE_GIF_H_
diff --git a/third_party/libwebp/examples/vwebp.c b/third_party/libwebp/examples/vwebp.c
index a79c72c..35f1b18 100644
--- a/third_party/libwebp/examples/vwebp.c
+++ b/third_party/libwebp/examples/vwebp.c
@@ -42,6 +42,7 @@
 
 #include "../examples/example_util.h"
 #include "../imageio/imageio_util.h"
+#include "./unicode.h"
 
 #if defined(_MSC_VER) && _MSC_VER < 1900
 #define snprintf _snprintf
@@ -56,6 +57,7 @@
   int print_info;
   int only_deltas;
   int use_color_profile;
+  int draw_anim_background_color;
 
   int canvas_width, canvas_height;
   int loop_count;
@@ -225,6 +227,9 @@
 // Callbacks
 
 static void HandleKey(unsigned char key, int pos_x, int pos_y) {
+  // Note: rescaling the window or toggling some features during an animation
+  // generates visual artifacts. This is not fixed because refreshing the frame
+  // may require rendering the whole animation from start till current frame.
   (void)pos_x;
   (void)pos_y;
   if (key == 'q' || key == 'Q' || key == 27 /* Esc */) {
@@ -252,9 +257,11 @@
         glutPostRedisplay();
       }
     }
+  } else if (key == 'b') {
+    kParams.draw_anim_background_color = 1 - kParams.draw_anim_background_color;
+    if (!kParams.has_animation) ClearPreviousFrame();
+    glutPostRedisplay();
   } else if (key == 'i') {
-    // Note: doesn't handle refresh of animation's last-frame (it's quite
-    // more involved to do, since you need to save the previous frame).
     kParams.print_info = 1 - kParams.print_info;
     if (!kParams.has_animation) ClearPreviousFrame();
     glutPostRedisplay();
@@ -285,8 +292,21 @@
   }
 }
 
+static void PrintStringW(const char* const text) {
+#if defined(_WIN32) && defined(_UNICODE)
+  void* const font = GLUT_BITMAP_9_BY_15;
+  const W_CHAR* const wtext = (const W_CHAR*)text;
+  int i;
+  for (i = 0; wtext[i]; ++i) {
+    glutBitmapCharacter(font, wtext[i]);
+  }
+#else
+  PrintString(text);
+#endif
+}
+
 static float GetColorf(uint32_t color, int shift) {
-  return (color >> shift) / 255.f;
+  return ((color >> shift) & 0xff) / 255.f;
 }
 
 static void DrawCheckerBoard(void) {
@@ -309,6 +329,43 @@
   glPopMatrix();
 }
 
+static void DrawBackground(void) {
+  // Whole window cleared with clear color, checkerboard rendered on top of it.
+  glClear(GL_COLOR_BUFFER_BIT);
+  DrawCheckerBoard();
+
+  // ANIM background color rendered (blend) on top. Default is white for still
+  // images (without ANIM chunk). glClear() can't be used for that (no blend).
+  if (kParams.draw_anim_background_color) {
+    glPushMatrix();
+    glLoadIdentity();
+    glColor4f(GetColorf(kParams.bg_color, 16),  // BGRA from spec
+              GetColorf(kParams.bg_color, 8),
+              GetColorf(kParams.bg_color, 0),
+              GetColorf(kParams.bg_color, 24));
+    glRecti(-1, -1, +1, +1);
+    glPopMatrix();
+  }
+}
+
+// Draw background in a scissored rectangle.
+static void DrawBackgroundScissored(int window_x, int window_y, int frame_w,
+                                    int frame_h) {
+  // Only update the requested area, not the whole canvas.
+  window_x = window_x * kParams.viewport_width / kParams.canvas_width;
+  window_y = window_y * kParams.viewport_height / kParams.canvas_height;
+  frame_w = frame_w * kParams.viewport_width / kParams.canvas_width;
+  frame_h = frame_h * kParams.viewport_height / kParams.canvas_height;
+
+  // glScissor() takes window coordinates (0,0 at bottom left).
+  window_y = kParams.viewport_height - window_y - frame_h;
+
+  glEnable(GL_SCISSOR_TEST);
+  glScissor(window_x, window_y, frame_w, frame_h);
+  DrawBackground();
+  glDisable(GL_SCISSOR_TEST);
+}
+
 static void HandleDisplay(void) {
   const WebPDecBuffer* const pic = kParams.pic;
   const WebPIterator* const curr = &kParams.curr_frame;
@@ -325,38 +382,21 @@
   glPixelStorei(GL_UNPACK_ROW_LENGTH, pic->u.RGBA.stride / 4);
 
   if (kParams.only_deltas) {
-    DrawCheckerBoard();
-  } else if (prev->dispose_method == WEBP_MUX_DISPOSE_BACKGROUND ||
-      curr->blend_method == WEBP_MUX_NO_BLEND) {
-    // glScissor() takes window coordinates (0,0 at bottom left).
-    int window_x, window_y;
-    int frame_w, frame_h;
+    DrawBackground();
+  } else {
+    // The rectangle of the previous frame might be different than the current
+    // frame, so we may need to DrawBackgroundScissored for both.
     if (prev->dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) {
       // Clear the previous frame rectangle.
-      window_x = prev->x_offset;
-      window_y = kParams.canvas_height - prev->y_offset - prev->height;
-      frame_w = prev->width;
-      frame_h = prev->height;
-    } else {  // curr->blend_method == WEBP_MUX_NO_BLEND.
-      // We simulate no-blending behavior by first clearing the current frame
-      // rectangle (to a checker-board) and then alpha-blending against it.
-      window_x = curr->x_offset;
-      window_y = kParams.canvas_height - curr->y_offset - curr->height;
-      frame_w = curr->width;
-      frame_h = curr->height;
+      DrawBackgroundScissored(prev->x_offset, prev->y_offset, prev->width,
+                              prev->height);
     }
-    glEnable(GL_SCISSOR_TEST);
-    // Only update the requested area, not the whole canvas.
-    window_x = window_x * kParams.viewport_width / kParams.canvas_width;
-    window_y = window_y * kParams.viewport_height / kParams.canvas_height;
-    frame_w = frame_w * kParams.viewport_width / kParams.canvas_width;
-    frame_h = frame_h * kParams.viewport_height / kParams.canvas_height;
-    glScissor(window_x, window_y, frame_w, frame_h);
-
-    glClear(GL_COLOR_BUFFER_BIT);  // use clear color
-    DrawCheckerBoard();
-
-    glDisable(GL_SCISSOR_TEST);
+    if (curr->blend_method == WEBP_MUX_NO_BLEND) {
+      // We simulate no-blending behavior by first clearing the current frame
+      // rectangle and then alpha-blending against it.
+      DrawBackgroundScissored(curr->x_offset, curr->y_offset, curr->width,
+                              curr->height);
+    }
   }
 
   *prev = *curr;
@@ -369,7 +409,7 @@
 
     glColor4f(0.90f, 0.0f, 0.90f, 1.0f);
     glRasterPos2f(-0.95f, 0.90f);
-    PrintString(kParams.file_name);
+    PrintStringW(kParams.file_name);
 
     snprintf(tmp, sizeof(tmp), "Dimension:%d x %d", pic->width, pic->height);
     glColor4f(0.90f, 0.0f, 0.90f, 1.0f);
@@ -391,8 +431,9 @@
 }
 
 static void StartDisplay(void) {
-  const int width = kParams.canvas_width;
-  const int height = kParams.canvas_height;
+  int width = kParams.canvas_width;
+  int height = kParams.canvas_height;
+  int screen_width, screen_height;
   // TODO(webp:365) GLUT_DOUBLE results in flickering / old frames to be
   // partially displayed with animated webp + alpha.
 #if defined(__APPLE__) || defined(_WIN32)
@@ -400,6 +441,18 @@
 #else
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
 #endif
+  screen_width = glutGet(GLUT_SCREEN_WIDTH);
+  screen_height = glutGet(GLUT_SCREEN_HEIGHT);
+  if (width > screen_width || height > screen_height) {
+    if (width > screen_width) {
+      height = (height * screen_width + width - 1) / width;
+      width = screen_width;
+    }
+    if (height > screen_height) {
+      width = (width * screen_height + height - 1) / height;
+      height = screen_height;
+    }
+  }
   glutInitWindowSize(width, height);
   glutCreateWindow("WebP viewer");
   glutDisplayFunc(HandleDisplay);
@@ -408,57 +461,59 @@
   glutKeyboardFunc(HandleKey);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   glEnable(GL_BLEND);
-  glClearColor(GetColorf(kParams.bg_color, 0),
-               GetColorf(kParams.bg_color, 8),
-               GetColorf(kParams.bg_color, 16),
-               GetColorf(kParams.bg_color, 24));
-  glClear(GL_COLOR_BUFFER_BIT);
-  DrawCheckerBoard();
+  glClearColor(0, 0, 0, 0);  // window will be cleared to black (no blend)
+  DrawBackground();
 }
 
 //------------------------------------------------------------------------------
 // Main
 
 static void Help(void) {
-  printf("Usage: vwebp in_file [options]\n\n"
-         "Decodes the WebP image file and visualize it using OpenGL\n"
-         "Options are:\n"
-         "  -version ..... print version number and exit\n"
-         "  -noicc ....... don't use the icc profile if present\n"
-         "  -nofancy ..... don't use the fancy YUV420 upscaler\n"
-         "  -nofilter .... disable in-loop filtering\n"
-         "  -dither <int>  dithering strength (0..100), default=50\n"
-         "  -noalphadither disable alpha plane dithering\n"
-         "  -mt .......... use multi-threading\n"
-         "  -info ........ print info\n"
-         "  -h ........... this help message\n"
-         "\n"
-         "Keyboard shortcuts:\n"
-         "  'c' ................ toggle use of color profile\n"
-         "  'i' ................ overlay file information\n"
-         "  'd' ................ disable blending & disposal (debug)\n"
-         "  'q' / 'Q' / ESC .... quit\n"
-        );
+  printf(
+      "Usage: vwebp in_file [options]\n\n"
+      "Decodes the WebP image file and visualize it using OpenGL\n"
+      "Options are:\n"
+      "  -version ..... print version number and exit\n"
+      "  -noicc ....... don't use the icc profile if present\n"
+      "  -nofancy ..... don't use the fancy YUV420 upscaler\n"
+      "  -nofilter .... disable in-loop filtering\n"
+      "  -dither <int>  dithering strength (0..100), default=50\n"
+      "  -noalphadither disable alpha plane dithering\n"
+      "  -usebgcolor .. display background color\n"
+      "  -mt .......... use multi-threading\n"
+      "  -info ........ print info\n"
+      "  -h ........... this help message\n"
+      "\n"
+      "Keyboard shortcuts:\n"
+      "  'c' ................ toggle use of color profile\n"
+      "  'b' ................ toggle background color display\n"
+      "  'i' ................ overlay file information\n"
+      "  'd' ................ disable blending & disposal (debug)\n"
+      "  'q' / 'Q' / ESC .... quit\n");
 }
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   int c;
   WebPDecoderConfig* const config = &kParams.config;
   WebPIterator* const curr = &kParams.curr_frame;
 
+  INIT_WARGV(argc, argv);
+
   if (!WebPInitDecoderConfig(config)) {
     fprintf(stderr, "Library version mismatch!\n");
-    return -1;
+    FREE_WARGV_AND_RETURN(-1);
   }
   config->options.dithering_strength = 50;
   config->options.alpha_dithering_strength = 100;
   kParams.use_color_profile = 1;
+  // Background color hidden by default to see transparent areas.
+  kParams.draw_anim_background_color = 0;
 
   for (c = 1; c < argc; ++c) {
     int parse_error = 0;
     if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) {
       Help();
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else if (!strcmp(argv[c], "-noicc")) {
       kParams.use_color_profile = 0;
     } else if (!strcmp(argv[c], "-nofancy")) {
@@ -467,6 +522,8 @@
       config->options.bypass_filtering = 1;
     } else if (!strcmp(argv[c], "-noalphadither")) {
       config->options.alpha_dithering_strength = 0;
+    } else if (!strcmp(argv[c], "-usebgcolor")) {
+      kParams.draw_anim_background_color = 1;
     } else if (!strcmp(argv[c], "-dither") && c + 1 < argc) {
       config->options.dithering_strength =
           ExUtilGetInt(argv[++c], 0, &parse_error);
@@ -479,30 +536,30 @@
              (dec_version >> 16) & 0xff, (dec_version >> 8) & 0xff,
              dec_version & 0xff, (dmux_version >> 16) & 0xff,
              (dmux_version >> 8) & 0xff, dmux_version & 0xff);
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else if (!strcmp(argv[c], "-mt")) {
       config->options.use_threads = 1;
     } else if (!strcmp(argv[c], "--")) {
-      if (c < argc - 1) kParams.file_name = argv[++c];
+      if (c < argc - 1) kParams.file_name = (const char*)GET_WARGV(argv, ++c);
       break;
     } else if (argv[c][0] == '-') {
       printf("Unknown option '%s'\n", argv[c]);
       Help();
-      return -1;
+      FREE_WARGV_AND_RETURN(-1);
     } else {
-      kParams.file_name = argv[c];
+      kParams.file_name = (const char*)GET_WARGV(argv, c);
     }
 
     if (parse_error) {
       Help();
-      return -1;
+      FREE_WARGV_AND_RETURN(-1);
     }
   }
 
   if (kParams.file_name == NULL) {
     printf("missing input file!!\n");
     Help();
-    return 0;
+    FREE_WARGV_AND_RETURN(0);
   }
 
   if (!ImgIoUtilReadFile(kParams.file_name,
@@ -577,16 +634,16 @@
 
   // Should only be reached when using FREEGLUT:
   ClearParams();
-  return 0;
+  FREE_WARGV_AND_RETURN(0);
 
  Error:
   ClearParams();
-  return -1;
+  FREE_WARGV_AND_RETURN(-1);
 }
 
 #else   // !WEBP_HAVE_GL
 
-int main(int argc, const char *argv[]) {
+int main(int argc, const char* argv[]) {
   fprintf(stderr, "OpenGL support not enabled in %s.\n", argv[0]);
   (void)argc;
   return 0;
diff --git a/third_party/libwebp/examples/webpinfo.c b/third_party/libwebp/examples/webpinfo.c
index 2dcd277..356abae 100644
--- a/third_party/libwebp/examples/webpinfo.c
+++ b/third_party/libwebp/examples/webpinfo.c
@@ -20,6 +20,7 @@
 #endif
 
 #include "../imageio/imageio_util.h"
+#include "./unicode.h"
 #include "webp/decode.h"
 #include "webp/format_constants.h"
 #include "webp/mux_types.h"
@@ -40,6 +41,7 @@
     if (webp_info->show_diagnosis_) {            \
       fprintf(stderr, "Warning: %s\n", MESSAGE); \
     }                                            \
+    ++webp_info->num_warnings_;                  \
   } while (0)
 
 static const char* const kFormats[3] = {
@@ -115,6 +117,7 @@
   int is_processing_anim_frame_, seen_alpha_subchunk_, seen_image_subchunk_;
   // Print output control.
   int quiet_, show_diagnosis_, show_summary_;
+  int num_warnings_;
   int parse_bitstream_;
 } WebPInfo;
 
@@ -122,16 +125,16 @@
   memset(webp_info, 0, sizeof(*webp_info));
 }
 
-static const char kWebPChunkTags[CHUNK_TYPES][4] = {
-  { 'V', 'P', '8', ' ' },
-  { 'V', 'P', '8', 'L' },
-  { 'V', 'P', '8', 'X' },
-  { 'A', 'L', 'P', 'H' },
-  { 'A', 'N', 'I', 'M' },
-  { 'A', 'N', 'M', 'F' },
-  { 'I', 'C', 'C', 'P' },
-  { 'E', 'X', 'I', 'F' },
-  { 'X', 'M', 'P', ' ' },
+static const uint32_t kWebPChunkTags[CHUNK_TYPES] = {
+  MKFOURCC('V', 'P', '8', ' '),
+  MKFOURCC('V', 'P', '8', 'L'),
+  MKFOURCC('V', 'P', '8', 'X'),
+  MKFOURCC('A', 'L', 'P', 'H'),
+  MKFOURCC('A', 'N', 'I', 'M'),
+  MKFOURCC('A', 'N', 'M', 'F'),
+  MKFOURCC('I', 'C', 'C', 'P'),
+  MKFOURCC('E', 'X', 'I', 'F'),
+  MKFOURCC('X', 'M', 'P', ' '),
 };
 
 // -----------------------------------------------------------------------------
@@ -579,7 +582,7 @@
 // -----------------------------------------------------------------------------
 // Chunk parsing.
 
-static WebPInfoStatus ParseRIFFHeader(const WebPInfo* const webp_info,
+static WebPInfoStatus ParseRIFFHeader(WebPInfo* const webp_info,
                                       MemBuffer* const mem) {
   const size_t min_size = RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE;
   size_t riff_size;
@@ -641,7 +644,7 @@
       return WEBP_INFO_TRUNCATED_DATA;
     }
     for (i = 0; i < CHUNK_TYPES; ++i) {
-      if (!memcmp(kWebPChunkTags[i], &fourcc, TAG_SIZE)) break;
+      if (kWebPChunkTags[i] == fourcc) break;
     }
     chunk_data->offset_ = chunk_start_offset;
     chunk_data->size_ = chunk_size;
@@ -936,7 +939,13 @@
     LOG_WARN(error_message);
   } else {
     if (!webp_info->quiet_) {
-      const char* tag = kWebPChunkTags[chunk_data->id_];
+      char tag[4];
+      uint32_t fourcc = kWebPChunkTags[chunk_data->id_];
+#ifdef WORDS_BIGENDIAN
+      fourcc = (fourcc >> 24) | ((fourcc >> 8) & 0xff00) |
+               ((fourcc << 8) & 0xff0000) | (fourcc << 24);
+#endif
+      memcpy(tag, &fourcc, sizeof(tag));
       printf("Chunk %c%c%c%c at offset %6d, length %6d\n",
              tag[0], tag[1], tag[2], tag[3], (int)chunk_data->offset_,
              (int)chunk_data->size_);
@@ -987,7 +996,7 @@
   return status;
 }
 
-static WebPInfoStatus Validate(const WebPInfo* const webp_info) {
+static WebPInfoStatus Validate(WebPInfo* const webp_info) {
   if (webp_info->num_frames_ < 1) {
     LOG_ERROR("No image/frame detected.");
     return WEBP_INFO_MISSING_DATA;
@@ -1092,16 +1101,14 @@
     } else {
       printf("Errors detected.\n");
     }
+    if (webp_info->num_warnings_ > 0) {
+      printf("There were %d warning(s).\n", webp_info->num_warnings_);
+    }
   }
   return webp_info_status;
 }
 
-static void HelpShort(void) {
-  printf("Usage: webpinfo [options] in_files\n"
-         "Try -longhelp for an exhaustive list of options.\n");
-}
-
-static void HelpLong(void) {
+static void Help(void) {
   printf("Usage: webpinfo [options] in_files\n"
          "Note: there could be multiple input files;\n"
          "      options must come before input files.\n"
@@ -1119,19 +1126,19 @@
   WebPInfoStatus webp_info_status = WEBP_INFO_OK;
   WebPInfo webp_info;
 
+  INIT_WARGV(argc, argv);
+
   if (argc == 1) {
-    HelpShort();
-    return WEBP_INFO_OK;
+    Help();
+    FREE_WARGV_AND_RETURN(WEBP_INFO_OK);
   }
 
   // Parse command-line input.
   for (c = 1; c < argc; ++c) {
-    if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) {
-      HelpShort();
-      return WEBP_INFO_OK;
-    } else if (!strcmp(argv[c], "-H") || !strcmp(argv[c], "-longhelp")) {
-      HelpLong();
-      return WEBP_INFO_OK;
+    if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help") ||
+        !strcmp(argv[c], "-H") || !strcmp(argv[c], "-longhelp")) {
+      Help();
+      FREE_WARGV_AND_RETURN(WEBP_INFO_OK);
     } else if (!strcmp(argv[c], "-quiet")) {
       quiet = 1;
     } else if (!strcmp(argv[c], "-diag")) {
@@ -1144,35 +1151,36 @@
       const int version = WebPGetDecoderVersion();
       printf("WebP Decoder version: %d.%d.%d\n",
              (version >> 16) & 0xff, (version >> 8) & 0xff, version & 0xff);
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else {  // Assume the remaining are all input files.
       break;
     }
   }
 
   if (c == argc) {
-    HelpShort();
-    return WEBP_INFO_INVALID_COMMAND;
+    Help();
+    FREE_WARGV_AND_RETURN(WEBP_INFO_INVALID_COMMAND);
   }
 
   // Process input files one by one.
   for (; c < argc; ++c) {
     WebPData webp_data;
-    const char* in_file = NULL;
+    const W_CHAR* in_file = NULL;
     WebPInfoInit(&webp_info);
     webp_info.quiet_ = quiet;
     webp_info.show_diagnosis_ = show_diag;
     webp_info.show_summary_ = show_summary;
     webp_info.parse_bitstream_ = parse_bitstream;
-    in_file = argv[c];
-    if (in_file == NULL || !ReadFileToWebPData(in_file, &webp_data)) {
+    in_file = GET_WARGV(argv, c);
+    if (in_file == NULL ||
+        !ReadFileToWebPData((const char*)in_file, &webp_data)) {
       webp_info_status = WEBP_INFO_INVALID_COMMAND;
-      fprintf(stderr, "Failed to open input file %s.\n", in_file);
+      WFPRINTF(stderr, "Failed to open input file %s.\n", in_file);
       continue;
     }
-    if (!webp_info.quiet_) printf("File: %s\n", in_file);
+    if (!webp_info.quiet_) WPRINTF("File: %s\n", in_file);
     webp_info_status = AnalyzeWebP(&webp_info, &webp_data);
     WebPDataClear(&webp_data);
   }
-  return webp_info_status;
+  FREE_WARGV_AND_RETURN(webp_info_status);
 }
diff --git a/third_party/libwebp/examples/webpmux.c b/third_party/libwebp/examples/webpmux.c
index 55e8d21..b61eed6 100644
--- a/third_party/libwebp/examples/webpmux.c
+++ b/third_party/libwebp/examples/webpmux.c
@@ -26,6 +26,7 @@
     webpmux -set icc image_profile.icc in.webp -o out_icc_container.webp
     webpmux -set exif image_metadata.exif in.webp -o out_exif_container.webp
     webpmux -set xmp image_metadata.xmp in.webp -o out_xmp_container.webp
+    webpmux -set loop 1 in.webp -o out_looped.webp
 
   Extract relevant data from WebP container file:
     webpmux -get frame n in.webp -o out_frame.webp
@@ -62,6 +63,7 @@
 #include "webp/mux.h"
 #include "../examples/example_util.h"
 #include "../imageio/imageio_util.h"
+#include "./unicode.h"
 
 //------------------------------------------------------------------------------
 // Config object to parse command-line arguments.
@@ -96,6 +98,8 @@
   FEATURE_ICCP,
   FEATURE_ANMF,
   FEATURE_DURATION,
+  FEATURE_LOOP,
+  FEATURE_BGCOLOR,
   LAST_FEATURE
 } FeatureType;
 
@@ -312,10 +316,12 @@
 
   printf("\n");
   printf("SET_OPTIONS:\n");
-  printf(" Set color profile/metadata:\n");
-  printf("   icc  file.icc     set ICC profile\n");
-  printf("   exif file.exif    set EXIF metadata\n");
-  printf("   xmp  file.xmp     set XMP metadata\n");
+  printf(" Set color profile/metadata/parameters:\n");
+  printf("   loop LOOP_COUNT            set the loop count\n");
+  printf("   bgcolor BACKGROUND_COLOR   set the animation background color\n");
+  printf("   icc  file.icc              set ICC profile\n");
+  printf("   exif file.exif             set EXIF metadata\n");
+  printf("   xmp  file.xmp              set XMP metadata\n");
   printf("   where:    'file.icc' contains the ICC profile to be set,\n");
   printf("             'file.exif' contains the EXIF metadata to be set\n");
   printf("             'file.xmp' contains the XMP metadata to be set\n");
@@ -323,7 +329,7 @@
   printf("\n");
   printf("DURATION_OPTIONS:\n");
   printf(" Set duration of selected frames:\n");
-  printf("   duration            set duration for each frames\n");
+  printf("   duration            set duration for all frames\n");
   printf("   duration,frame      set duration of a particular frame\n");
   printf("   duration,start,end  set duration of frames in the\n");
   printf("                        interval [start,end])\n");
@@ -342,7 +348,7 @@
   printf("\n");
   printf("FRAME_OPTIONS(i):\n");
   printf(" Create animation:\n");
-  printf("   file_i +di+[xi+yi[+mi[bi]]]\n");
+  printf("   file_i +di[+xi+yi[+mi[bi]]]\n");
   printf("   where:    'file_i' is the i'th animation frame (WebP format),\n");
   printf("             'di' is the pause duration before next frame,\n");
   printf("             'xi','yi' specify the image offset for this frame,\n");
@@ -390,23 +396,25 @@
   *mux = WebPMuxCreate(&bitstream, 1);
   WebPDataClear(&bitstream);
   if (*mux != NULL) return 1;
-  fprintf(stderr, "Failed to create mux object from file %s.\n", filename);
+  WFPRINTF(stderr, "Failed to create mux object from file %s.\n",
+           (const W_CHAR*)filename);
   return 0;
 }
 
 static int WriteData(const char* filename, const WebPData* const webpdata) {
   int ok = 0;
-  FILE* fout = strcmp(filename, "-") ? fopen(filename, "wb")
-                                     : ImgIoUtilSetBinaryMode(stdout);
+  FILE* fout = WSTRCMP(filename, "-") ? WFOPEN(filename, "wb")
+                                      : ImgIoUtilSetBinaryMode(stdout);
   if (fout == NULL) {
-    fprintf(stderr, "Error opening output WebP file %s!\n", filename);
+    WFPRINTF(stderr, "Error opening output WebP file %s!\n",
+             (const W_CHAR*)filename);
     return 0;
   }
   if (fwrite(webpdata->bytes, webpdata->size, 1, fout) != 1) {
-    fprintf(stderr, "Error writing file %s!\n", filename);
+    WFPRINTF(stderr, "Error writing file %s!\n", (const W_CHAR*)filename);
   } else {
-    fprintf(stderr, "Saved file %s (%d bytes)\n",
-            filename, (int)webpdata->size);
+    WFPRINTF(stderr, "Saved file %s (%d bytes)\n",
+             (const W_CHAR*)filename, (int)webpdata->size);
     ok = 1;
   }
   if (fout != stdout) fclose(fout);
@@ -452,7 +460,8 @@
     if (err == WEBP_MUX_OK && metadata.size > 0) {
       err = WebPMuxSetChunk(new_mux, kFourccList[i], &metadata, 1);
       if (err != WEBP_MUX_OK) {
-        ERROR_GOTO1("Error transferring metadata in DuplicateMux().", End);
+        ERROR_GOTO1("Error transferring metadata in DuplicateMuxHeader().",
+                    End);
       }
     }
   }
@@ -466,11 +475,11 @@
 }
 
 static int ParseFrameArgs(const char* args, WebPMuxFrameInfo* const info) {
-  int dispose_method, dummy;
+  int dispose_method, unused;
   char plus_minus, blend_method;
   const int num_args = sscanf(args, "+%d+%d+%d+%d%c%c+%d", &info->duration,
                               &info->x_offset, &info->y_offset, &dispose_method,
-                              &plus_minus, &blend_method, &dummy);
+                              &plus_minus, &blend_method, &unused);
   switch (num_args) {
     case 1:
       info->x_offset = info->y_offset = 0;  // fall through
@@ -489,7 +498,7 @@
 
   WarnAboutOddOffset(info);
 
-  // Note: The sanity of the following conversion is checked by
+  // Note: The validity of the following conversion is checked by
   // WebPMuxPushFrame().
   info->dispose_method = (WebPMuxAnimDispose)dispose_method;
 
@@ -595,26 +604,33 @@
 
 #define FEATURETYPE_IS_NIL (config->type_ == NIL_FEATURE)
 
-#define CHECK_NUM_ARGS_LESS(NUM, LABEL)                                  \
+#define CHECK_NUM_ARGS_AT_LEAST(NUM, LABEL)                              \
   if (argc < i + (NUM)) {                                                \
     fprintf(stderr, "ERROR: Too few arguments for '%s'.\n", argv[i]);    \
     goto LABEL;                                                          \
   }
 
-#define CHECK_NUM_ARGS_NOT_EQUAL(NUM, LABEL)                             \
-  if (argc != i + (NUM)) {                                               \
+#define CHECK_NUM_ARGS_AT_MOST(NUM, LABEL)                               \
+  if (argc > i + (NUM)) {                                                \
     fprintf(stderr, "ERROR: Too many arguments for '%s'.\n", argv[i]);   \
     goto LABEL;                                                          \
   }
 
+#define CHECK_NUM_ARGS_EXACTLY(NUM, LABEL)                               \
+  CHECK_NUM_ARGS_AT_LEAST(NUM, LABEL);                                   \
+  CHECK_NUM_ARGS_AT_MOST(NUM, LABEL);
+
 // Parses command-line arguments to fill up config object. Also performs some
-// semantic checks.
-static int ParseCommandLine(Config* config) {
+// semantic checks. unicode_argv contains wchar_t arguments or is null.
+static int ParseCommandLine(Config* config, const W_CHAR** const unicode_argv) {
   int i = 0;
   int feature_arg_index = 0;
   int ok = 1;
   int argc = config->cmd_args_.argc_;
   const char* const* argv = config->cmd_args_.argv_;
+  // Unicode file paths will be used if available.
+  const char* const* wargv =
+      (unicode_argv != NULL) ? (const char**)(unicode_argv + 1) : argv;
 
   while (i < argc) {
     FeatureArg* const arg = &config->args_[feature_arg_index];
@@ -627,7 +643,7 @@
         }
         ++i;
       } else if (!strcmp(argv[i], "-duration")) {
-        CHECK_NUM_ARGS_LESS(2, ErrParse);
+        CHECK_NUM_ARGS_AT_LEAST(2, ErrParse);
         if (ACTION_IS_NIL || config->action_type_ == ACTION_DURATION) {
           config->action_type_ = ACTION_DURATION;
         } else {
@@ -657,7 +673,7 @@
         }
         ++i;
       } else if (!strcmp(argv[i], "-frame")) {
-        CHECK_NUM_ARGS_LESS(3, ErrParse);
+        CHECK_NUM_ARGS_AT_LEAST(3, ErrParse);
         if (ACTION_IS_NIL || config->action_type_ == ACTION_SET) {
           config->action_type_ = ACTION_SET;
         } else {
@@ -669,12 +685,12 @@
           ERROR_GOTO1("ERROR: Multiple features specified.\n", ErrParse);
         }
         arg->subtype_ = SUBTYPE_ANMF;
-        arg->filename_ = argv[i + 1];
+        arg->filename_ = wargv[i + 1];
         arg->params_ = argv[i + 2];
         ++feature_arg_index;
         i += 3;
       } else if (!strcmp(argv[i], "-loop") || !strcmp(argv[i], "-bgcolor")) {
-        CHECK_NUM_ARGS_LESS(2, ErrParse);
+        CHECK_NUM_ARGS_AT_LEAST(2, ErrParse);
         if (ACTION_IS_NIL || config->action_type_ == ACTION_SET) {
           config->action_type_ = ACTION_SET;
         } else {
@@ -691,34 +707,36 @@
         ++feature_arg_index;
         i += 2;
       } else if (!strcmp(argv[i], "-o")) {
-        CHECK_NUM_ARGS_LESS(2, ErrParse);
-        config->output_ = argv[i + 1];
+        CHECK_NUM_ARGS_AT_LEAST(2, ErrParse);
+        config->output_ = wargv[i + 1];
         i += 2;
       } else if (!strcmp(argv[i], "-info")) {
-        CHECK_NUM_ARGS_NOT_EQUAL(2, ErrParse);
+        CHECK_NUM_ARGS_EXACTLY(2, ErrParse);
         if (config->action_type_ != NIL_ACTION) {
           ERROR_GOTO1("ERROR: Multiple actions specified.\n", ErrParse);
         } else {
           config->action_type_ = ACTION_INFO;
           config->arg_count_ = 0;
-          config->input_ = argv[i + 1];
+          config->input_ = wargv[i + 1];
         }
         i += 2;
       } else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "-help")) {
         PrintHelp();
         DeleteConfig(config);
+        LOCAL_FREE((W_CHAR** const)unicode_argv);
         exit(0);
       } else if (!strcmp(argv[i], "-version")) {
         const int version = WebPGetMuxVersion();
         printf("%d.%d.%d\n",
                (version >> 16) & 0xff, (version >> 8) & 0xff, version & 0xff);
         DeleteConfig(config);
+        LOCAL_FREE((W_CHAR** const)unicode_argv);
         exit(0);
       } else if (!strcmp(argv[i], "--")) {
         if (i < argc - 1) {
           ++i;
           if (config->input_ == NULL) {
-            config->input_ = argv[i];
+            config->input_ = wargv[i];
           } else {
             ERROR_GOTO2("ERROR at '%s': Multiple input files specified.\n",
                         argv[i], ErrParse);
@@ -742,8 +760,8 @@
           ERROR_GOTO1("ERROR: Multiple features specified.\n", ErrParse);
         }
         if (config->action_type_ == ACTION_SET) {
-          CHECK_NUM_ARGS_LESS(2, ErrParse);
-          arg->filename_ = argv[i + 1];
+          CHECK_NUM_ARGS_AT_LEAST(2, ErrParse);
+          arg->filename_ = wargv[i + 1];
           ++feature_arg_index;
           i += 2;
         } else {
@@ -751,14 +769,28 @@
         }
       } else if (!strcmp(argv[i], "frame") &&
                  (config->action_type_ == ACTION_GET)) {
-        CHECK_NUM_ARGS_LESS(2, ErrParse);
+        CHECK_NUM_ARGS_AT_LEAST(2, ErrParse);
         config->type_ = FEATURE_ANMF;
         arg->params_ = argv[i + 1];
         ++feature_arg_index;
         i += 2;
+      } else if (!strcmp(argv[i], "loop") &&
+                 (config->action_type_ == ACTION_SET)) {
+        CHECK_NUM_ARGS_AT_LEAST(2, ErrParse);
+        config->type_ = FEATURE_LOOP;
+        arg->params_ = argv[i + 1];
+        ++feature_arg_index;
+        i += 2;
+      } else if (!strcmp(argv[i], "bgcolor") &&
+                 (config->action_type_ == ACTION_SET)) {
+        CHECK_NUM_ARGS_AT_LEAST(2, ErrParse);
+        config->type_ = FEATURE_BGCOLOR;
+        arg->params_ = argv[i + 1];
+        ++feature_arg_index;
+        i += 2;
       } else {  // Assume input file.
         if (config->input_ == NULL) {
-          config->input_ = argv[i];
+          config->input_ = wargv[i];
         } else {
           ERROR_GOTO2("ERROR at '%s': Multiple input files specified.\n",
                       argv[i], ErrParse);
@@ -804,8 +836,8 @@
 }
 
 // Create config object from command-line arguments.
-static int InitializeConfig(int argc, const char* argv[],
-                            Config* const config) {
+static int InitializeConfig(int argc, const char* argv[], Config* const config,
+                            const W_CHAR** const unicode_argv) {
   int num_feature_args = 0;
   int ok;
 
@@ -826,7 +858,7 @@
   }
 
   // Parse command-line.
-  if (!ParseCommandLine(config) || !ValidateConfig(config)) {
+  if (!ParseCommandLine(config, unicode_argv) || !ValidateConfig(config)) {
     ERROR_GOTO1("Exiting due to command-line parsing error.\n", Err1);
   }
 
@@ -836,8 +868,9 @@
 
 #undef ACTION_IS_NIL
 #undef FEATURETYPE_IS_NIL
-#undef CHECK_NUM_ARGS_LESS
-#undef CHECK_NUM_ARGS_MORE
+#undef CHECK_NUM_ARGS_AT_LEAST
+#undef CHECK_NUM_ARGS_AT_MOST
+#undef CHECK_NUM_ARGS_EXACTLY
 
 //------------------------------------------------------------------------------
 // Processing.
@@ -998,13 +1031,62 @@
           ok = ExUtilReadFileToWebPData(config->args_[0].filename_, &chunk);
           if (!ok) goto Err2;
           err = WebPMuxSetChunk(mux, kFourccList[config->type_], &chunk, 1);
-          free((void*)chunk.bytes);
+          WebPDataClear(&chunk);
           if (err != WEBP_MUX_OK) {
             ERROR_GOTO3("ERROR (%s): Could not set the %s.\n",
                         ErrorString(err), kDescriptions[config->type_], Err2);
           }
           break;
         }
+        case FEATURE_LOOP: {
+          WebPMuxAnimParams params = { 0xFFFFFFFF, 0 };
+          int parse_error = 0;
+          const int loop_count =
+              ExUtilGetInt(config->args_[0].params_, 10, &parse_error);
+          if (loop_count < 0 || loop_count > 65535 || parse_error) {
+            ERROR_GOTO1("ERROR: Loop count must be in the range 0 to 65535.\n",
+                        Err2);
+          }
+          ok = CreateMux(config->input_, &mux);
+          if (!ok) goto Err2;
+          ok = (WebPMuxGetAnimationParams(mux, &params) == WEBP_MUX_OK);
+          if (!ok) {
+            ERROR_GOTO1("ERROR: input file does not seem to be an animation.\n",
+                        Err2);
+          }
+          params.loop_count = loop_count;
+          err = WebPMuxSetAnimationParams(mux, &params);
+          ok = (err == WEBP_MUX_OK);
+          if (!ok) {
+            ERROR_GOTO2("ERROR (%s): Could not set animation parameters.\n",
+                        ErrorString(err), Err2);
+          }
+          break;
+        }
+        case FEATURE_BGCOLOR: {
+          WebPMuxAnimParams params = { 0xFFFFFFFF, 0 };
+          uint32_t bgcolor;
+          ok = ParseBgcolorArgs(config->args_[0].params_, &bgcolor);
+          if (!ok) {
+            ERROR_GOTO1("ERROR: Could not parse the background color.\n",
+                        Err2);
+          }
+          ok = CreateMux(config->input_, &mux);
+          if (!ok) goto Err2;
+          ok = (WebPMuxGetAnimationParams(mux, &params) == WEBP_MUX_OK);
+          if (!ok) {
+            ERROR_GOTO1("ERROR: input file does not seem to be an animation.\n",
+                        Err2);
+          }
+          params.bgcolor = bgcolor;
+          err = WebPMuxSetAnimationParams(mux, &params);
+          ok = (err == WEBP_MUX_OK);
+          if (!ok) {
+            ERROR_GOTO2("ERROR (%s): Could not set animation parameters.\n",
+                        ErrorString(err), Err2);
+          }
+          break;
+        }
         default: {
           ERROR_GOTO1("ERROR: Invalid feature for action 'set'.\n", Err2);
           break;
@@ -1032,7 +1114,7 @@
         int* durations = NULL;
         WebPMux* new_mux = DuplicateMuxHeader(mux);
         if (new_mux == NULL) goto Err2;
-        durations = (int*)malloc((size_t)num_frames * sizeof(*durations));
+        durations = (int*)WebPMalloc((size_t)num_frames * sizeof(*durations));
         if (durations == NULL) goto Err2;
         for (i = 0; i < num_frames; ++i) durations[i] = -1;
 
@@ -1090,7 +1172,7 @@
         new_mux = NULL;
 
  Err3:
-        free(durations);
+        WebPFree(durations);
         WebPMuxDelete(new_mux);
         if (!ok) goto Err2;
       }
@@ -1135,14 +1217,18 @@
 
 int main(int argc, const char* argv[]) {
   Config config;
-  int ok = InitializeConfig(argc - 1, argv + 1, &config);
+  int ok;
+
+  INIT_WARGV(argc, argv);
+
+  ok = InitializeConfig(argc - 1, argv + 1, &config, GET_WARGV_OR_NULL());
   if (ok) {
     ok = Process(&config);
   } else {
     PrintHelp();
   }
   DeleteConfig(&config);
-  return !ok;
+  FREE_WARGV_AND_RETURN(!ok);
 }
 
 //------------------------------------------------------------------------------
diff --git a/third_party/libwebp/extras/Makefile.am b/third_party/libwebp/extras/Makefile.am
index 14d567a..7e29888 100644
--- a/third_party/libwebp/extras/Makefile.am
+++ b/third_party/libwebp/extras/Makefile.am
@@ -14,7 +14,7 @@
 
 noinst_PROGRAMS =
 noinst_PROGRAMS += webp_quality
-if WANT_DEMUX
+if BUILD_DEMUX
   noinst_PROGRAMS += get_disto
 endif
 if BUILD_VWEBP_SDL
diff --git a/third_party/libwebp/extras/extras.c b/third_party/libwebp/extras/extras.c
index 2feb595..3949b9e 100644
--- a/third_party/libwebp/extras/extras.c
+++ b/third_party/libwebp/extras/extras.c
@@ -12,13 +12,14 @@
 
 #include "extras/extras.h"
 #include "webp/format_constants.h"
+#include "src/dsp/dsp.h"
 
 #include <assert.h>
 #include <string.h>
 
 #define XTRA_MAJ_VERSION 1
-#define XTRA_MIN_VERSION 0
-#define XTRA_REV_VERSION 0
+#define XTRA_MIN_VERSION 3
+#define XTRA_REV_VERSION 1
 
 //------------------------------------------------------------------------------
 
@@ -57,7 +58,7 @@
   for (y = 0; y < pic->height; ++y) {
     const int width = pic->width;
     for (x = 0; x < width; ++x) {
-#ifdef WEBP_SWAP_16BIT_CSP
+#if defined(WEBP_SWAP_16BIT_CSP) && (WEBP_SWAP_16BIT_CSP == 1)
       const uint32_t rg = rgb565[2 * x + 1];
       const uint32_t gb = rgb565[2 * x + 0];
 #else
@@ -90,7 +91,7 @@
   for (y = 0; y < pic->height; ++y) {
     const int width = pic->width;
     for (x = 0; x < width; ++x) {
-#ifdef WEBP_SWAP_16BIT_CSP
+#if defined(WEBP_SWAP_16BIT_CSP) && (WEBP_SWAP_16BIT_CSP == 1)
       const uint32_t rg = rgb4444[2 * x + 1];
       const uint32_t ba = rgb4444[2 * x + 0];
 #else
@@ -144,3 +145,18 @@
 }
 
 //------------------------------------------------------------------------------
+
+int WebPUnmultiplyARGB(WebPPicture* pic) {
+  int y;
+  uint32_t* dst;
+  if (pic == NULL || pic->use_argb != 1 || pic->argb == NULL) return 0;
+  WebPInitAlphaProcessing();
+  dst = pic->argb;
+  for (y = 0; y < pic->height; ++y) {
+    WebPMultARGBRow(dst, pic->width, /*inverse=*/1);
+    dst += pic->argb_stride;
+  }
+  return 1;
+}
+
+//------------------------------------------------------------------------------
diff --git a/third_party/libwebp/extras/extras.h b/third_party/libwebp/extras/extras.h
index fd4437a..c084682 100644
--- a/third_party/libwebp/extras/extras.h
+++ b/third_party/libwebp/extras/extras.h
@@ -19,7 +19,7 @@
 
 #include "webp/encode.h"
 
-#define WEBP_EXTRAS_ABI_VERSION 0x0001    // MAJOR(8b) + MINOR(8b)
+#define WEBP_EXTRAS_ABI_VERSION 0x0002    // MAJOR(8b) + MINOR(8b)
 
 //------------------------------------------------------------------------------
 
@@ -51,6 +51,13 @@
                           const uint32_t palette[], int palette_size,
                           WebPPicture* pic);
 
+// Convert the ARGB content of 'pic' from associated to unassociated.
+// 'pic' can be for instance the result of calling of some WebPPictureImportXXX
+// functions, with pic->use_argb set to 'true'. It is assumed (and not checked)
+// that the pre-multiplied r/g/b values as less or equal than the alpha value.
+// Return false in case of error (invalid parameter, ...).
+WEBP_EXTERN int WebPUnmultiplyARGB(WebPPicture* pic);
+
 //------------------------------------------------------------------------------
 
 // Parse a bitstream, search for VP8 (lossy) header and report a
@@ -67,4 +74,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_EXTRAS_EXTRAS_H_ */
+#endif  // WEBP_EXTRAS_EXTRAS_H_
diff --git a/third_party/libwebp/extras/get_disto.c b/third_party/libwebp/extras/get_disto.c
index b406147..3aa345b 100644
--- a/third_party/libwebp/extras/get_disto.c
+++ b/third_party/libwebp/extras/get_disto.c
@@ -26,6 +26,7 @@
 #include "webp/encode.h"
 #include "imageio/image_dec.h"
 #include "imageio/imageio_util.h"
+#include "../examples/unicode.h"
 
 static size_t ReadPicture(const char* const filename, WebPPicture* const pic,
                           int keep_alpha) {
@@ -48,7 +49,8 @@
 
  End:
   if (!ok) {
-    fprintf(stderr, "Error! Could not process file %s\n", filename);
+    WFPRINTF(stderr, "Error! Could not process file %s\n",
+             (const W_CHAR*)filename);
   }
   free((void*)data);
   return ok ? data_size : 0;
@@ -221,10 +223,11 @@
           "  -o <file> . save the diff map as a WebP lossless file\n"
           "  -scale .... scale the difference map to fit [0..255] range\n"
           "  -gray ..... use grayscale for difference map (-scale)\n"
-          " Also handles PNG, JPG and TIFF files, in addition to WebP.\n");
+          "\nSupported input formats:\n  %s\n",
+          WebPGetEnabledInputFileFormats());
 }
 
-int main(int argc, const char *argv[]) {
+int main(int argc, const char* argv[]) {
   WebPPicture pic1, pic2;
   size_t size1 = 0, size2 = 0;
   int ret = 1;
@@ -239,9 +242,11 @@
   const char* name2 = NULL;
   const char* output = NULL;
 
+  INIT_WARGV(argc, argv);
+
   if (!WebPPictureInit(&pic1) || !WebPPictureInit(&pic2)) {
     fprintf(stderr, "Can't init pictures\n");
-    return 1;
+    FREE_WARGV_AND_RETURN(1);
   }
 
   for (c = 1; c < argc; ++c) {
@@ -263,11 +268,11 @@
         fprintf(stderr, "missing file name after %s option.\n", argv[c - 1]);
         goto End;
       }
-      output = argv[c];
+      output = (const char*)GET_WARGV(argv, c);
     } else if (name1 == NULL) {
-      name1 = argv[c];
+      name1 = (const char*)GET_WARGV(argv, c);
     } else {
-      name2 = argv[c];
+      name2 = (const char*)GET_WARGV(argv, c);
     }
   }
   if (help || name1 == NULL || name2 == NULL) {
@@ -347,5 +352,5 @@
  End:
   WebPPictureFree(&pic1);
   WebPPictureFree(&pic2);
-  return ret;
+  FREE_WARGV_AND_RETURN(ret);
 }
diff --git a/third_party/libwebp/extras/vwebp_sdl.c b/third_party/libwebp/extras/vwebp_sdl.c
index 69171b9..e9554eb 100644
--- a/third_party/libwebp/extras/vwebp_sdl.c
+++ b/third_party/libwebp/extras/vwebp_sdl.c
@@ -25,6 +25,7 @@
 #include "webp_to_sdl.h"
 #include "webp/decode.h"
 #include "imageio/imageio_util.h"
+#include "../examples/unicode.h"
 
 #if defined(WEBP_HAVE_JUST_SDL_H)
 #include <SDL.h>
@@ -51,29 +52,33 @@
 int main(int argc, char* argv[]) {
   int c;
   int ok = 0;
+
+  INIT_WARGV(argc, argv);
+
   for (c = 1; c < argc; ++c) {
     const char* file = NULL;
     const uint8_t* webp = NULL;
     size_t webp_size = 0;
     if (!strcmp(argv[c], "-h")) {
       printf("Usage: %s [-h] image.webp [more_files.webp...]\n", argv[0]);
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else {
-      file = argv[c];
+      file = (const char*)GET_WARGV(argv, c);
     }
     if (file == NULL) continue;
     if (!ImgIoUtilReadFile(file, &webp, &webp_size)) {
-      fprintf(stderr, "Error opening file: %s\n", file);
+      WFPRINTF(stderr, "Error opening file: %s\n", (const W_CHAR*)file);
       goto Error;
     }
     if (webp_size != (size_t)(int)webp_size) {
+      free((void*)webp);
       fprintf(stderr, "File too large.\n");
       goto Error;
     }
-    ok = WebpToSDL((const char*)webp, (int)webp_size);
+    ok = WebPToSDL((const char*)webp, (int)webp_size);
     free((void*)webp);
     if (!ok) {
-      fprintf(stderr, "Error decoding file %s\n", file);
+      WFPRINTF(stderr, "Error decoding file %s\n", (const W_CHAR*)file);
       goto Error;
     }
     ProcessEvents();
@@ -82,12 +87,12 @@
 
  Error:
   SDL_Quit();
-  return ok ? 0 : 1;
+  FREE_WARGV_AND_RETURN(ok ? 0 : 1);
 }
 
 #else  // !WEBP_HAVE_SDL
 
-int main(int argc, const char *argv[]) {
+int main(int argc, const char* argv[]) {
   fprintf(stderr, "SDL support not enabled in %s.\n", argv[0]);
   (void)argc;
   return 0;
diff --git a/third_party/libwebp/extras/webp_quality.c b/third_party/libwebp/extras/webp_quality.c
index 3f6ba20..0a3b25f 100644
--- a/third_party/libwebp/extras/webp_quality.c
+++ b/third_party/libwebp/extras/webp_quality.c
@@ -13,26 +13,30 @@
 
 #include "extras/extras.h"
 #include "imageio/imageio_util.h"
+#include "../examples/unicode.h"
 
-int main(int argc, const char *argv[]) {
+int main(int argc, const char* argv[]) {
   int c;
   int quiet = 0;
   int ok = 1;
+
+  INIT_WARGV(argc, argv);
+
   for (c = 1; ok && c < argc; ++c) {
     if (!strcmp(argv[c], "-quiet")) {
       quiet = 1;
     } else if (!strcmp(argv[c], "-help") || !strcmp(argv[c], "-h")) {
       printf("webp_quality [-h][-quiet] webp_files...\n");
-      return 0;
+      FREE_WARGV_AND_RETURN(0);
     } else {
-      const char* const filename = argv[c];
+      const char* const filename = (const char*)GET_WARGV(argv, c);
       const uint8_t* data = NULL;
       size_t data_size = 0;
       int q;
       ok = ImgIoUtilReadFile(filename, &data, &data_size);
       if (!ok) break;
       q = VP8EstimateQuality(data, data_size);
-      if (!quiet) printf("[%s] ", filename);
+      if (!quiet) WPRINTF("[%s] ", (const W_CHAR*)filename);
       if (q < 0) {
         fprintf(stderr, "Not a WebP file, or not a lossy WebP file.\n");
         ok = 0;
@@ -46,5 +50,5 @@
       free((void*)data);
     }
   }
-  return ok ? 0 : 1;
+  FREE_WARGV_AND_RETURN(ok ? 0 : 1);
 }
diff --git a/third_party/libwebp/extras/webp_to_sdl.c b/third_party/libwebp/extras/webp_to_sdl.c
index 2a74715..1e52681 100644
--- a/third_party/libwebp/extras/webp_to_sdl.c
+++ b/third_party/libwebp/extras/webp_to_sdl.c
@@ -29,7 +29,7 @@
 #endif
 
 static int init_ok = 0;
-int WebpToSDL(const char* data, unsigned int data_size) {
+int WebPToSDL(const char* data, unsigned int data_size) {
   int ok = 0;
   VP8StatusCode status;
   WebPDecoderConfig config;
@@ -40,7 +40,7 @@
 
   if (!WebPInitDecoderConfig(&config)) {
     fprintf(stderr, "Library version mismatch!\n");
-    return 1;
+    return 0;
   }
 
   if (!init_ok) {
diff --git a/third_party/libwebp/extras/webp_to_sdl.h b/third_party/libwebp/extras/webp_to_sdl.h
index 1b5ea98..1534f2b 100644
--- a/third_party/libwebp/extras/webp_to_sdl.h
+++ b/third_party/libwebp/extras/webp_to_sdl.h
@@ -14,9 +14,9 @@
 #ifndef WEBP_EXTRAS_WEBP_TO_SDL_H_
 #define WEBP_EXTRAS_WEBP_TO_SDL_H_
 
-// Exports the method WebpToSDL(const char* data, int data_size) which decodes
+// Exports the method WebPToSDL(const char* data, int data_size) which decodes
 // a WebP bitstream into an RGBA SDL surface.
 // Return false on failure.
-extern int WebpToSDL(const char* data, unsigned int data_size);
+extern int WebPToSDL(const char* data, unsigned int data_size);
 
 #endif  // WEBP_EXTRAS_WEBP_TO_SDL_H_
diff --git a/third_party/libwebp/gradle/wrapper/gradle-wrapper.jar b/third_party/libwebp/gradle/wrapper/gradle-wrapper.jar
index ca78035..f3d88b1 100644
--- a/third_party/libwebp/gradle/wrapper/gradle-wrapper.jar
+++ b/third_party/libwebp/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/third_party/libwebp/gradle/wrapper/gradle-wrapper.properties b/third_party/libwebp/gradle/wrapper/gradle-wrapper.properties
index d556104..1b16c34 100644
--- a/third_party/libwebp/gradle/wrapper/gradle-wrapper.properties
+++ b/third_party/libwebp/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Thu May 12 17:06:25 CEST 2016
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-bin.zip
diff --git a/third_party/libwebp/gradlew b/third_party/libwebp/gradlew
index 27309d9..2fe81a7 100755
--- a/third_party/libwebp/gradlew
+++ b/third_party/libwebp/gradlew
@@ -1,4 +1,20 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
 
 ##############################################################################
 ##
@@ -28,16 +44,16 @@
 APP_BASE_NAME=`basename "$0"`
 
 # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
 
 # Use the maximum available, or set MAX_FD != -1 to use that value.
 MAX_FD="maximum"
 
-warn ( ) {
+warn () {
     echo "$*"
 }
 
-die ( ) {
+die () {
     echo
     echo "$*"
     echo
@@ -109,8 +125,8 @@
     GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
 fi
 
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
     APP_HOME=`cygpath --path --mixed "$APP_HOME"`
     CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
     JAVACMD=`cygpath --unix "$JAVACMD"`
@@ -138,27 +154,30 @@
         else
             eval `echo args$i`="\"$arg\""
         fi
-        i=$((i+1))
+        i=`expr $i + 1`
     done
     case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+        0) set -- ;;
+        1) set -- "$args0" ;;
+        2) set -- "$args0" "$args1" ;;
+        3) set -- "$args0" "$args1" "$args2" ;;
+        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
     esac
 fi
 
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
-    JVM_OPTS=("$@")
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
 }
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=`save "$@"`
 
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/third_party/libwebp/gradlew.bat b/third_party/libwebp/gradlew.bat
index f6d5974..24467a1 100644
--- a/third_party/libwebp/gradlew.bat
+++ b/third_party/libwebp/gradlew.bat
@@ -1,3 +1,19 @@
+@rem

+@rem Copyright 2015 the original author or authors.

+@rem

+@rem Licensed under the Apache License, Version 2.0 (the "License");

+@rem you may not use this file except in compliance with the License.

+@rem You may obtain a copy of the License at

+@rem

+@rem      https://www.apache.org/licenses/LICENSE-2.0

+@rem

+@rem Unless required by applicable law or agreed to in writing, software

+@rem distributed under the License is distributed on an "AS IS" BASIS,

+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+@rem See the License for the specific language governing permissions and

+@rem limitations under the License.

+@rem

+

 @if "%DEBUG%" == "" @echo off

 @rem ##########################################################################

 @rem

@@ -14,7 +30,7 @@
 set APP_HOME=%DIRNAME%

 

 @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

-set DEFAULT_JVM_OPTS=

+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"

 

 @rem Find java.exe

 if defined JAVA_HOME goto findJavaFromJavaHome

@@ -49,7 +65,6 @@
 @rem Get command-line arguments, handling Windows variants

 

 if not "%OS%" == "Windows_NT" goto win9xME_args

-if "%@eval[2+2]" == "4" goto 4NT_args

 

 :win9xME_args

 @rem Slurp the command line arguments.

@@ -60,11 +75,6 @@
 if "x%~1" == "x" goto execute

 

 set CMD_LINE_ARGS=%*

-goto execute

-

-:4NT_args

-@rem Get arguments from the 4NT Shell from JP Software

-set CMD_LINE_ARGS=%$

 

 :execute

 @rem Setup the command line

diff --git a/third_party/libwebp/imageio/Android.mk b/third_party/libwebp/imageio/Android.mk
index e779f71..1c8b836 100644
--- a/third_party/libwebp/imageio/Android.mk
+++ b/third_party/libwebp/imageio/Android.mk
@@ -1,3 +1,5 @@
+# Ignore this file during non-NDK builds.
+ifdef NDK_ROOT
 LOCAL_PATH := $(call my-dir)
 
 ################################################################################
@@ -52,3 +54,4 @@
 LOCAL_MODULE := imageenc
 
 include $(BUILD_STATIC_LIBRARY)
+endif  # NDK_ROOT
diff --git a/third_party/libwebp/imageio/Makefile.am b/third_party/libwebp/imageio/Makefile.am
index b0e6d8e..500ec7e 100644
--- a/third_party/libwebp/imageio/Makefile.am
+++ b/third_party/libwebp/imageio/Makefile.am
@@ -1,7 +1,7 @@
 AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_srcdir)/src
 noinst_LTLIBRARIES =
 noinst_LTLIBRARIES += libimageio_util.la
-if WANT_DEMUX
+if BUILD_DEMUX
   noinst_LTLIBRARIES += libimagedec.la
 endif
 noinst_LTLIBRARIES += libimageenc.la
diff --git a/third_party/libwebp/imageio/image_dec.c b/third_party/libwebp/imageio/image_dec.c
index 08a1b18..5e003fa 100644
--- a/third_party/libwebp/imageio/image_dec.c
+++ b/third_party/libwebp/imageio/image_dec.c
@@ -11,6 +11,24 @@
 
 #include "./image_dec.h"
 
+const char* WebPGetEnabledInputFileFormats(void) {
+  return "WebP"
+#ifdef WEBP_HAVE_JPEG
+         ", JPEG"
+#endif
+#ifdef WEBP_HAVE_PNG
+         ", PNG"
+#endif
+         ", PNM (PGM, PPM, PAM)"
+#ifdef WEBP_HAVE_TIFF
+         ", TIFF"
+#endif
+#ifdef HAVE_WINCODEC_H
+         ", Windows Imaging Component (WIC)"
+#endif
+         "";
+}
+
 static WEBP_INLINE uint32_t GetBE32(const uint8_t buf[]) {
   return ((uint32_t)buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
 }
diff --git a/third_party/libwebp/imageio/image_dec.h b/third_party/libwebp/imageio/image_dec.h
index df411e1..f09f564 100644
--- a/third_party/libwebp/imageio/image_dec.h
+++ b/third_party/libwebp/imageio/image_dec.h
@@ -41,6 +41,9 @@
   WEBP_UNSUPPORTED_FORMAT
 } WebPInputFileFormat;
 
+// Returns a comma separated list of enabled input formats.
+const char* WebPGetEnabledInputFileFormats(void);
+
 // Try to infer the image format. 'data_size' should be larger than 12.
 // Returns WEBP_UNSUPPORTED_FORMAT if format can't be guess safely.
 WebPInputFileFormat WebPGuessImageType(const uint8_t* const data,
diff --git a/third_party/libwebp/imageio/image_enc.c b/third_party/libwebp/imageio/image_enc.c
index d413490..e06bcaf 100644
--- a/third_party/libwebp/imageio/image_enc.c
+++ b/third_party/libwebp/imageio/image_enc.c
@@ -29,11 +29,13 @@
                          // code with COBJMACROS.
 #include <ole2.h>  // CreateStreamOnHGlobal()
 #include <shlwapi.h>
+#include <tchar.h>
 #include <windows.h>
 #include <wincodec.h>
 #endif
 
 #include "./imageio_util.h"
+#include "../examples/unicode.h"
 
 //------------------------------------------------------------------------------
 // PNG
@@ -61,11 +63,12 @@
     // Output to a memory buffer. This is freed when 'stream' is released.
     IFS(CreateStreamOnHGlobal(NULL, TRUE, stream));
   } else {
-    IFS(SHCreateStreamOnFileA(out_file_name, STGM_WRITE | STGM_CREATE, stream));
+    IFS(SHCreateStreamOnFile((const LPTSTR)out_file_name,
+                             STGM_WRITE | STGM_CREATE, stream));
   }
   if (FAILED(hr)) {
-    fprintf(stderr, "Error opening output file %s (%08lx)\n",
-            out_file_name, hr);
+    _ftprintf(stderr, _T("Error opening output file %s (%08lx)\n"),
+              (const LPTSTR)out_file_name, hr);
   }
   return hr;
 }
@@ -152,8 +155,8 @@
 }
 
 #elif defined(WEBP_HAVE_PNG)    // !HAVE_WINCODEC_H
-static void PNGAPI PNGErrorFunction(png_structp png, png_const_charp dummy) {
-  (void)dummy;  // remove variable-unused warning
+static void PNGAPI PNGErrorFunction(png_structp png, png_const_charp unused) {
+  (void)unused;  // remove variable-unused warning
   longjmp(png_jmpbuf(png), 1);
 }
 
@@ -277,7 +280,7 @@
 }
 
 //------------------------------------------------------------------------------
-// BMP
+// BMP (see https://en.wikipedia.org/wiki/BMP_file_format#Pixel_storage)
 
 static void PutLE16(uint8_t* const dst, uint32_t value) {
   dst[0] = (value >> 0) & 0xff;
@@ -290,8 +293,11 @@
 }
 
 #define BMP_HEADER_SIZE 54
+#define BMP_HEADER_ALPHA_EXTRA_SIZE 16  // for alpha info
 int WebPWriteBMP(FILE* fout, const WebPDecBuffer* const buffer) {
   const int has_alpha = WebPIsAlphaMode(buffer->colorspace);
+  const int header_size =
+      BMP_HEADER_SIZE + (has_alpha ? BMP_HEADER_ALPHA_EXTRA_SIZE : 0);
   const uint32_t width = buffer->width;
   const uint32_t height = buffer->height;
   const uint8_t* rgba = buffer->u.RGBA.rgba;
@@ -300,8 +306,9 @@
   uint32_t y;
   const uint32_t line_size = bytes_per_px * width;
   const uint32_t bmp_stride = (line_size + 3) & ~3;   // pad to 4
-  const uint32_t total_size = bmp_stride * height + BMP_HEADER_SIZE;
-  uint8_t bmp_header[BMP_HEADER_SIZE] = { 0 };
+  const uint32_t image_size = bmp_stride * height;
+  const uint32_t total_size =  image_size + header_size;
+  uint8_t bmp_header[BMP_HEADER_SIZE + BMP_HEADER_ALPHA_EXTRA_SIZE] = { 0 };
 
   if (fout == NULL || buffer == NULL || rgba == NULL) return 0;
 
@@ -309,30 +316,37 @@
   PutLE16(bmp_header + 0, 0x4d42);                // signature 'BM'
   PutLE32(bmp_header + 2, total_size);            // size including header
   PutLE32(bmp_header + 6, 0);                     // reserved
-  PutLE32(bmp_header + 10, BMP_HEADER_SIZE);      // offset to pixel array
+  PutLE32(bmp_header + 10, header_size);          // offset to pixel array
   // bitmap info header
-  PutLE32(bmp_header + 14, 40);                   // DIB header size
+  PutLE32(bmp_header + 14, header_size - 14);     // DIB header size
   PutLE32(bmp_header + 18, width);                // dimensions
-  PutLE32(bmp_header + 22, -(int)height);         // vertical flip!
+  PutLE32(bmp_header + 22, height);               // no vertical flip
   PutLE16(bmp_header + 26, 1);                    // number of planes
   PutLE16(bmp_header + 28, bytes_per_px * 8);     // bits per pixel
-  PutLE32(bmp_header + 30, 0);                    // no compression (BI_RGB)
-  PutLE32(bmp_header + 34, 0);                    // image size (dummy)
+  PutLE32(bmp_header + 30, has_alpha ? 3 : 0);    // BI_BITFIELDS or BI_RGB
+  PutLE32(bmp_header + 34, image_size);
   PutLE32(bmp_header + 38, 2400);                 // x pixels/meter
   PutLE32(bmp_header + 42, 2400);                 // y pixels/meter
   PutLE32(bmp_header + 46, 0);                    // number of palette colors
   PutLE32(bmp_header + 50, 0);                    // important color count
+  if (has_alpha) {  // BITMAPV3INFOHEADER complement
+    PutLE32(bmp_header + 54, 0x00ff0000);         // red mask
+    PutLE32(bmp_header + 58, 0x0000ff00);         // green mask
+    PutLE32(bmp_header + 62, 0x000000ff);         // blue mask
+    PutLE32(bmp_header + 66, 0xff000000);         // alpha mask
+  }
 
   // TODO(skal): color profile
 
   // write header
-  if (fwrite(bmp_header, sizeof(bmp_header), 1, fout) != 1) {
+  if (fwrite(bmp_header, header_size, 1, fout) != 1) {
     return 0;
   }
 
-  // write pixel array
+  // write pixel array, bottom to top
   for (y = 0; y < height; ++y) {
-    if (fwrite(rgba, line_size, 1, fout) != 1) {
+    const uint8_t* const src = &rgba[(uint64_t)(height - 1 - y) * stride];
+    if (fwrite(src, line_size, 1, fout) != 1) {
       return 0;
     }
     // write padding zeroes
@@ -342,11 +356,11 @@
         return 0;
       }
     }
-    rgba += stride;
   }
   return 1;
 }
 #undef BMP_HEADER_SIZE
+#undef BMP_HEADER_ALPHA_EXTRA_SIZE
 
 //------------------------------------------------------------------------------
 // TIFF
@@ -549,7 +563,8 @@
                   const char* const out_file_name) {
   FILE* fout = NULL;
   int needs_open_file = 1;
-  const int use_stdout = (out_file_name != NULL) && !strcmp(out_file_name, "-");
+  const int use_stdout =
+      (out_file_name != NULL) && !WSTRCMP(out_file_name, "-");
   int ok = 1;
 
   if (buffer == NULL || out_file_name == NULL) return 0;
@@ -560,9 +575,10 @@
 
   if (needs_open_file) {
     fout = use_stdout ? ImgIoUtilSetBinaryMode(stdout)
-                      : fopen(out_file_name, "wb");
+                      : WFOPEN(out_file_name, "wb");
     if (fout == NULL) {
-      fprintf(stderr, "Error opening output file %s\n", out_file_name);
+      WFPRINTF(stderr, "Error opening output file %s\n",
+               (const W_CHAR*)out_file_name);
       return 0;
     }
   }
diff --git a/third_party/libwebp/imageio/image_enc.h b/third_party/libwebp/imageio/image_enc.h
index f8abdac..d31e4bd 100644
--- a/third_party/libwebp/imageio/image_enc.h
+++ b/third_party/libwebp/imageio/image_enc.h
@@ -79,7 +79,7 @@
 int WebPWriteAlphaPlane(FILE* fout, const struct WebPDecBuffer* const buffer);
 
 // Save as YUV samples as PGM format (using IMC4 layout).
-// See: http://www.fourcc.org/yuv.php#IMC4.
+// See: https://www.fourcc.org/yuv.php#IMC4.
 // (very convenient format for viewing the samples, esp. for odd dimensions).
 int WebPWritePGM(FILE* fout, const struct WebPDecBuffer* const buffer);
 
diff --git a/third_party/libwebp/imageio/imageio_util.c b/third_party/libwebp/imageio/imageio_util.c
index 3a4ade0..df37137 100644
--- a/third_party/libwebp/imageio/imageio_util.c
+++ b/third_party/libwebp/imageio/imageio_util.c
@@ -18,6 +18,7 @@
 #endif
 #include <stdlib.h>
 #include <string.h>
+#include "../examples/unicode.h"
 
 // -----------------------------------------------------------------------------
 // File I/O
@@ -73,7 +74,7 @@
   uint8_t* file_data;
   size_t file_size;
   FILE* in;
-  const int from_stdin = (file_name == NULL) || !strcmp(file_name, "-");
+  const int from_stdin = (file_name == NULL) || !WSTRCMP(file_name, "-");
 
   if (from_stdin) return ImgIoUtilReadFromStdin(data, data_size);
 
@@ -81,29 +82,29 @@
   *data = NULL;
   *data_size = 0;
 
-  in = fopen(file_name, "rb");
+  in = WFOPEN(file_name, "rb");
   if (in == NULL) {
-    fprintf(stderr, "cannot open input file '%s'\n", file_name);
+    WFPRINTF(stderr, "cannot open input file '%s'\n", (const W_CHAR*)file_name);
     return 0;
   }
   fseek(in, 0, SEEK_END);
   file_size = ftell(in);
   fseek(in, 0, SEEK_SET);
   // we allocate one extra byte for the \0 terminator
-  file_data = (uint8_t*)malloc(file_size + 1);
+  file_data = (uint8_t*)WebPMalloc(file_size + 1);
   if (file_data == NULL) {
     fclose(in);
-    fprintf(stderr, "memory allocation failure when reading file %s\n",
-            file_name);
+    WFPRINTF(stderr, "memory allocation failure when reading file %s\n",
+             (const W_CHAR*)file_name);
     return 0;
   }
   ok = (fread(file_data, file_size, 1, in) == 1);
   fclose(in);
 
   if (!ok) {
-    fprintf(stderr, "Could not read %d bytes of data from file %s\n",
-            (int)file_size, file_name);
-    free(file_data);
+    WFPRINTF(stderr, "Could not read %d bytes of data from file %s\n",
+             (int)file_size, (const W_CHAR*)file_name);
+    WebPFree(file_data);
     return 0;
   }
   file_data[file_size] = '\0';  // convenient 0-terminator
@@ -118,14 +119,15 @@
                        const uint8_t* data, size_t data_size) {
   int ok;
   FILE* out;
-  const int to_stdout = (file_name == NULL) || !strcmp(file_name, "-");
+  const int to_stdout = (file_name == NULL) || !WSTRCMP(file_name, "-");
 
   if (data == NULL) {
     return 0;
   }
-  out = to_stdout ? ImgIoUtilSetBinaryMode(stdout) : fopen(file_name, "wb");
+  out = to_stdout ? ImgIoUtilSetBinaryMode(stdout) : WFOPEN(file_name, "wb");
   if (out == NULL) {
-    fprintf(stderr, "Error! Cannot open output file '%s'\n", file_name);
+    WFPRINTF(stderr, "Error! Cannot open output file '%s'\n",
+             (const W_CHAR*)file_name);
     return 0;
   }
   ok = (fwrite(data, data_size, 1, out) == 1);
@@ -146,9 +148,11 @@
 
 // -----------------------------------------------------------------------------
 
-int ImgIoUtilCheckSizeArgumentsOverflow(uint64_t nmemb, size_t size) {
-  const uint64_t total_size = nmemb * size;
+int ImgIoUtilCheckSizeArgumentsOverflow(uint64_t stride, size_t height) {
+  const uint64_t total_size = stride * height;
   int ok = (total_size == (size_t)total_size);
+  // check that 'stride' is representable as int:
+  ok = ok && ((uint64_t)(int)stride == stride);
 #if defined(WEBP_MAX_IMAGE_SIZE)
   ok = ok && (total_size <= (uint64_t)WEBP_MAX_IMAGE_SIZE);
 #endif
diff --git a/third_party/libwebp/imageio/imageio_util.h b/third_party/libwebp/imageio/imageio_util.h
index 72db159..f135f56 100644
--- a/third_party/libwebp/imageio/imageio_util.h
+++ b/third_party/libwebp/imageio/imageio_util.h
@@ -29,7 +29,7 @@
 
 // Allocates storage for entire file 'file_name' and returns contents and size
 // in 'data' and 'data_size'. Returns 1 on success, 0 otherwise. '*data' should
-// be deleted using free().
+// be deleted using WebPFree().
 // Note: for convenience, the data will be null-terminated with an extra byte
 // (not accounted for in *data_size), in case the file is text and intended
 // to be used as a C-string.
@@ -54,8 +54,8 @@
 
 //------------------------------------------------------------------------------
 
-// Returns 0 in case of overflow of nmemb * size.
-int ImgIoUtilCheckSizeArgumentsOverflow(uint64_t nmemb, size_t size);
+// Returns 0 in case of overflow, memory over-allocation or excessive dimension.
+int ImgIoUtilCheckSizeArgumentsOverflow(uint64_t stride, size_t height);
 
 #ifdef __cplusplus
 }    // extern "C"
diff --git a/third_party/libwebp/imageio/jpegdec.c b/third_party/libwebp/imageio/jpegdec.c
index eefe92f..74a4c09 100644
--- a/third_party/libwebp/imageio/jpegdec.c
+++ b/third_party/libwebp/imageio/jpegdec.c
@@ -206,6 +206,7 @@
 
 static void my_error_exit(j_common_ptr dinfo) {
   struct my_error_mgr* myerr = (struct my_error_mgr*)dinfo->err;
+  fprintf(stderr, "libjpeg error: ");
   dinfo->err->output_message(dinfo);
   longjmp(myerr->setjmp_buffer, 1);
 }
@@ -273,7 +274,7 @@
   ctx.data = data;
   ctx.data_size = data_size;
 
-  memset((j_decompress_ptr)&dinfo, 0, sizeof(dinfo));   // for setjmp sanity
+  memset((j_decompress_ptr)&dinfo, 0, sizeof(dinfo));   // for setjmp safety
   dinfo.err = jpeg_std_error(&jerr.pub);
   jerr.pub.error_exit = my_error_exit;
 
@@ -335,7 +336,11 @@
   pic->width = width;
   pic->height = height;
   ok = WebPPictureImportRGB(pic, rgb, (int)stride);
-  if (!ok) goto Error;
+  if (!ok) {
+    pic->width = 0;   // WebPPictureImportRGB() barely touches 'pic' on failure.
+    pic->height = 0;  // Just reset dimensions but keep any 'custom_ptr' etc.
+    MetadataFree(metadata);  // In case the caller forgets to free it on error.
+  }
 
  End:
   free(rgb);
diff --git a/third_party/libwebp/imageio/pngdec.c b/third_party/libwebp/imageio/pngdec.c
index 4622353..cdd9988 100644
--- a/third_party/libwebp/imageio/pngdec.c
+++ b/third_party/libwebp/imageio/pngdec.c
@@ -18,6 +18,9 @@
 #include <stdio.h>
 
 #ifdef WEBP_HAVE_PNG
+#ifndef PNG_USER_MEM_SUPPORTED
+#define PNG_USER_MEM_SUPPORTED  // for png_create_read_struct_2
+#endif
 #include <png.h>
 #include <setjmp.h>   // note: this must be included *after* png.h
 #include <stdlib.h>
@@ -27,11 +30,33 @@
 #include "./imageio_util.h"
 #include "./metadata.h"
 
+#define LOCAL_PNG_VERSION ((PNG_LIBPNG_VER_MAJOR << 8) | PNG_LIBPNG_VER_MINOR)
+#define LOCAL_PNG_PREREQ(maj, min) \
+   (LOCAL_PNG_VERSION >= (((maj) << 8) | (min)))
+
 static void PNGAPI error_function(png_structp png, png_const_charp error) {
   if (error != NULL) fprintf(stderr, "libpng error: %s\n", error);
   longjmp(png_jmpbuf(png), 1);
 }
 
+#if LOCAL_PNG_PREREQ(1,4)
+typedef png_alloc_size_t LocalPngAllocSize;
+#else
+typedef png_size_t LocalPngAllocSize;
+#endif
+
+static png_voidp MallocFunc(png_structp png_ptr, LocalPngAllocSize size) {
+  (void)png_ptr;
+  if (size != (size_t)size) return NULL;
+  if (!ImgIoUtilCheckSizeArgumentsOverflow(size, 1)) return NULL;
+  return (png_voidp)malloc((size_t)size);
+}
+
+static void FreeFunc(png_structp png_ptr, png_voidp ptr) {
+  (void)png_ptr;
+  free(ptr);
+}
+
 // Converts the NULL terminated 'hexstring' which contains 2-byte character
 // representations of hex values to raw data.
 // 'hexstring' may contain values consisting of [A-F][a-f][0-9] in pairs,
@@ -108,7 +133,7 @@
                  MetadataPayload* const payload);
   size_t storage_offset;
 } kPNGMetadataMap[] = {
-  // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/PNG.html#TextualData
+  // https://exiftool.org/TagNames/PNG.html#TextualData
   // See also: ExifTool on CPAN.
   { "Raw profile type exif", ProcessRawProfile, METADATA_OFFSET(exif) },
   { "Raw profile type xmp",  ProcessRawProfile, METADATA_OFFSET(xmp) },
@@ -171,11 +196,10 @@
     {
       png_charp name;
       int comp_type;
-#if ((PNG_LIBPNG_VER_MAJOR << 8) | PNG_LIBPNG_VER_MINOR << 0) < \
-    ((1 << 8) | (5 << 0))
-      png_charp profile;
-#else  // >= libpng 1.5.0
+#if LOCAL_PNG_PREREQ(1,5)
       png_bytep profile;
+#else
+      png_charp profile;
 #endif
       png_uint_32 len;
 
@@ -211,7 +235,7 @@
   volatile png_infop end_info = NULL;
   PNGReadContext context = { NULL, 0, 0 };
   int color_type, bit_depth, interlaced;
-  int has_alpha;
+  int num_channels;
   int num_passes;
   int p;
   volatile int ok = 0;
@@ -224,7 +248,8 @@
   context.data = data;
   context.data_size = data_size;
 
-  png = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
+  png = png_create_read_struct_2(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL,
+                                 NULL, MallocFunc, FreeFunc);
   if (png == NULL) goto End;
 
   png_set_error_fn(png, 0, error_function, NULL);
@@ -234,6 +259,15 @@
     goto End;
   }
 
+#if LOCAL_PNG_PREREQ(1,5) || \
+    (LOCAL_PNG_PREREQ(1,4) && PNG_LIBPNG_VER_RELEASE >= 1)
+  // If it looks like the bitstream is going to need more memory than libpng's
+  // internal limit (default: 8M), try to (reasonably) raise it.
+  if (data_size > png_get_chunk_malloc_max(png) && data_size < (1u << 24)) {
+    png_set_chunk_malloc_max(png, data_size);
+  }
+#endif
+
   info = png_create_info_struct(png);
   if (info == NULL) goto Error;
   end_info = png_create_info_struct(png);
@@ -259,9 +293,6 @@
   }
   if (png_get_valid(png, info, PNG_INFO_tRNS)) {
     png_set_tRNS_to_alpha(png);
-    has_alpha = 1;
-  } else {
-    has_alpha = !!(color_type & PNG_COLOR_MASK_ALPHA);
   }
 
   // Apply gamma correction if needed.
@@ -276,13 +307,16 @@
 
   if (!keep_alpha) {
     png_set_strip_alpha(png);
-    has_alpha = 0;
   }
 
   num_passes = png_set_interlace_handling(png);
   png_read_update_info(png, info);
 
-  stride = (int64_t)(has_alpha ? 4 : 3) * width * sizeof(*rgb);
+  num_channels = png_get_channels(png, info);
+  if (num_channels != 3 && num_channels != 4) {
+    goto Error;
+  }
+  stride = (int64_t)num_channels * width * sizeof(*rgb);
   if (stride != (int)stride ||
       !ImgIoUtilCheckSizeArgumentsOverflow(stride, height)) {
     goto Error;
@@ -307,8 +341,8 @@
 
   pic->width = (int)width;
   pic->height = (int)height;
-  ok = has_alpha ? WebPPictureImportRGBA(pic, rgb, (int)stride)
-                 : WebPPictureImportRGB(pic, rgb, (int)stride);
+  ok = (num_channels == 4) ? WebPPictureImportRGBA(pic, rgb, (int)stride)
+                           : WebPPictureImportRGB(pic, rgb, (int)stride);
 
   if (!ok) {
     goto Error;
diff --git a/third_party/libwebp/imageio/pnmdec.c b/third_party/libwebp/imageio/pnmdec.c
index 8f5a4a0..0d592c3 100644
--- a/third_party/libwebp/imageio/pnmdec.c
+++ b/third_party/libwebp/imageio/pnmdec.c
@@ -20,21 +20,25 @@
 #include "webp/encode.h"
 #include "./imageio_util.h"
 
+#if defined(_MSC_VER) && _MSC_VER < 1900
+#define snprintf _snprintf
+#endif
+
 typedef enum {
   WIDTH_FLAG      = 1 << 0,
   HEIGHT_FLAG     = 1 << 1,
   DEPTH_FLAG      = 1 << 2,
   MAXVAL_FLAG     = 1 << 3,
   TUPLE_FLAG      = 1 << 4,
-  ALL_NEEDED_FLAGS = 0x1f
+  ALL_NEEDED_FLAGS = WIDTH_FLAG | HEIGHT_FLAG | DEPTH_FLAG | MAXVAL_FLAG
 } PNMFlags;
 
 typedef struct {
   const uint8_t* data;
   size_t data_size;
   int width, height;
-  int bytes_per_px;   // 1, 3, 4
-  int depth;
+  int bytes_per_px;
+  int depth;          // 1 (grayscale), 2 (grayscale + alpha), 3 (rgb), 4 (rgba)
   int max_value;
   int type;           // 5, 6 or 7
   int seen_flags;
@@ -74,6 +78,7 @@
   char out[MAX_LINE_SIZE + 1];
   size_t out_size;
   int tmp;
+  int expected_depth = -1;
   assert(info != NULL);
   while (1) {
     off = ReadLine(info->data, off, info->data_size, out, &out_size);
@@ -95,38 +100,43 @@
       info->seen_flags |= MAXVAL_FLAG;
       info->max_value = tmp;
     } else if (!strcmp(out, "TUPLTYPE RGB_ALPHA")) {
-      info->bytes_per_px = 4;
+      expected_depth = 4;
       info->seen_flags |= TUPLE_FLAG;
     } else if (!strcmp(out, "TUPLTYPE RGB")) {
-      info->bytes_per_px = 3;
+      expected_depth = 3;
+      info->seen_flags |= TUPLE_FLAG;
+    } else if (!strcmp(out, "TUPLTYPE GRAYSCALE_ALPHA")) {
+      expected_depth = 2;
       info->seen_flags |= TUPLE_FLAG;
     } else if (!strcmp(out, "TUPLTYPE GRAYSCALE")) {
-      info->bytes_per_px = 1;
+      expected_depth = 1;
       info->seen_flags |= TUPLE_FLAG;
     } else if (!strcmp(out, "ENDHDR")) {
       break;
     } else {
       static const char kEllipsis[] = " ...";
+      const size_t kLen = strlen(kEllipsis) + 1;  // +1 = trailing \0
       int i;
-      if (out_size > 20) sprintf(out + 20 - strlen(kEllipsis), kEllipsis);
+      if (out_size > 20) snprintf(out + 20 - kLen, kLen, kEllipsis);
       for (i = 0; i < (int)strlen(out); ++i) {
-        if (!isprint(out[i])) out[i] = ' ';
+        // isprint() might trigger a "char-subscripts" warning if given a char.
+        if (!isprint((int)out[i])) out[i] = ' ';
       }
       fprintf(stderr, "PAM header error: unrecognized entry [%s]\n", out);
       return 0;
     }
   }
-  if (!(info->seen_flags & TUPLE_FLAG)) {
-    if (info->depth > 0 && info->depth <= 4 && info->depth != 2) {
-      info->seen_flags |= TUPLE_FLAG;
-      info->bytes_per_px = info->depth * (info->max_value > 255 ? 2 : 1);
-    } else {
-      fprintf(stderr, "PAM: invalid bitdepth (%d).\n", info->depth);
-      return 0;
-    }
+  if (!(info->seen_flags & ALL_NEEDED_FLAGS)) {
+    fprintf(stderr, "PAM header error: missing tags%s%s%s%s\n",
+            (info->seen_flags & WIDTH_FLAG) ? "" : " WIDTH",
+            (info->seen_flags & HEIGHT_FLAG) ? "" : " HEIGHT",
+            (info->seen_flags & DEPTH_FLAG) ? "" : " DEPTH",
+            (info->seen_flags & MAXVAL_FLAG) ? "" : " MAXVAL");
+    return 0;
   }
-  if (info->seen_flags != ALL_NEEDED_FLAGS) {
-    fprintf(stderr, "PAM: incomplete header.\n");
+  if (expected_depth != -1 && info->depth != expected_depth) {
+    fprintf(stderr, "PAM header error: expected DEPTH %d but got DEPTH %d\n",
+            expected_depth, info->depth);
     return 0;
   }
   return off;
@@ -160,16 +170,15 @@
 
     // finish initializing missing fields
     info->depth = (info->type == 5) ? 1 : 3;
-    info->bytes_per_px = info->depth * (info->max_value > 255 ? 2 : 1);
   }
   // perform some basic numerical validation
   if (info->width <= 0 || info->height <= 0 ||
       info->type <= 0 || info->type >= 9 ||
-      info->depth <= 0 || info->depth == 2 || info->depth > 4 ||
-      info->bytes_per_px < info->depth ||
+      info->depth <= 0 || info->depth > 4 ||
       info->max_value <= 0 || info->max_value >= 65536) {
     return 0;
   }
+  info->bytes_per_px = info->depth * (info->max_value > 255 ? 2 : 1);
   return off;
 }
 
@@ -178,7 +187,7 @@
             struct Metadata* const metadata) {
   int ok = 0;
   int i, j;
-  uint64_t stride, pixel_bytes;
+  uint64_t stride, pixel_bytes, sample_size, depth;
   uint8_t* rgb = NULL, *tmp_rgb;
   size_t offset;
   PNMInfo info;
@@ -209,8 +218,10 @@
     fprintf(stderr, "Truncated PNM file (P%d).\n", info.type);
     goto End;
   }
-  stride =
-      (uint64_t)(info.bytes_per_px < 3 ? 3 : info.bytes_per_px) * info.width;
+  sample_size = (info.max_value > 255) ? 2 : 1;
+  // final depth
+  depth = (info.depth == 1 || info.depth == 3 || !keep_alpha) ? 3 : 4;
+  stride = depth * info.width;
   if (stride != (size_t)stride ||
       !ImgIoUtilCheckSizeArgumentsOverflow(stride, info.height)) {
     goto End;
@@ -219,30 +230,63 @@
   rgb = (uint8_t*)malloc((size_t)stride * info.height);
   if (rgb == NULL) goto End;
 
-  // Convert input
+  // Convert input.
+  // We only optimize for the sample_size=1, max_value=255, depth=1 case.
   tmp_rgb = rgb;
   for (j = 0; j < info.height; ++j) {
-    assert(offset + info.bytes_per_px * info.width <= data_size);
-    if (info.depth == 1) {
-      // convert grayscale -> RGB
-      for (i = 0; i < info.width; ++i) {
-        const uint8_t v = data[offset + i];
-        tmp_rgb[3 * i + 0] = tmp_rgb[3 * i + 1] = tmp_rgb[3 * i + 2] = v;
-      }
-    } else if (info.depth == 3) {   // RGB
-      memcpy(tmp_rgb, data + offset, 3 * info.width * sizeof(*data));
-    } else if (info.depth == 4) {   // RGBA
-      memcpy(tmp_rgb, data + offset, 4 * info.width * sizeof(*data));
-    }
+    const uint8_t* in = data + offset;
     offset += info.bytes_per_px * info.width;
+    assert(offset <= data_size);
+    if (info.max_value == 255 && info.depth >= 3) {
+      // RGB or RGBA
+      if (info.depth == 3 || keep_alpha) {
+        memcpy(tmp_rgb, in, info.depth * info.width * sizeof(*in));
+      } else {
+        assert(info.depth == 4 && !keep_alpha);
+        for (i = 0; i < info.width; ++i) {
+          tmp_rgb[3 * i + 0] = in[4 * i + 0];
+          tmp_rgb[3 * i + 1] = in[4 * i + 1];
+          tmp_rgb[3 * i + 2] = in[4 * i + 2];
+        }
+      }
+    } else {
+      // Unoptimized case, we need to handle non-trivial operations:
+      //   * convert 16b to 8b (if max_value > 255)
+      //   * rescale to [0..255] range (if max_value != 255)
+      //   * drop the alpha channel (if keep_alpha is false)
+      const uint32_t round = info.max_value / 2;
+      int k = 0;
+      for (i = 0; i < info.width * info.depth; ++i) {
+        uint32_t v = (sample_size == 2) ? 256u * in[2 * i + 0] + in[2 * i + 1]
+                   : in[i];
+        if (info.max_value != 255) v = (v * 255u + round) / info.max_value;
+        if (v > 255u) v = 255u;
+        if (info.depth > 2) {
+          if (!keep_alpha && info.depth == 4 && (i % 4) == 3) {
+            // skip alpha
+          } else {
+            tmp_rgb[k] = v;
+            k += 1;
+          }
+        } else if (info.depth == 1 || (i % 2) == 0) {
+          tmp_rgb[k + 0] = tmp_rgb[k + 1] = tmp_rgb[k + 2] = v;
+          k += 3;
+        } else if (keep_alpha && info.depth == 2) {
+          tmp_rgb[k] = v;
+          k += 1;
+        } else {
+          // skip alpha
+        }
+      }
+    }
     tmp_rgb += stride;
   }
 
   // WebP conversion.
   pic->width = info.width;
   pic->height = info.height;
-  ok = (info.depth == 4) ? WebPPictureImportRGBA(pic, rgb, (int)stride)
-                         : WebPPictureImportRGB(pic, rgb, (int)stride);
+  ok = (depth == 4) ? WebPPictureImportRGBA(pic, rgb, (int)stride)
+                    : WebPPictureImportRGB(pic, rgb, (int)stride);
   if (!ok) goto End;
 
   ok = 1;
diff --git a/third_party/libwebp/imageio/tiffdec.c b/third_party/libwebp/imageio/tiffdec.c
index 92eb682..d711fa4 100644
--- a/third_party/libwebp/imageio/tiffdec.c
+++ b/third_party/libwebp/imageio/tiffdec.c
@@ -46,7 +46,7 @@
         (MetadataPayload*)((uint8_t*)metadata +
                            kTIFFMetadataMap[i].storage_offset);
     void* tag_data;
-    uint32 tag_data_len;
+    uint32_t tag_data_len;
 
     if (TIFFGetField(tif, kTIFFMetadataMap[i].tag, &tag_data_len, &tag_data) &&
         !MetadataCopy((const char*)tag_data, tag_data_len, payload)) {
@@ -121,7 +121,6 @@
 // (we don't want to force a dependency to a libdspdec library).
 #define MFIX 24    // 24bit fixed-point arithmetic
 #define HALF ((1u << MFIX) >> 1)
-#define KINV_255 ((1u << MFIX) / 255u)
 
 static uint32_t Unmult(uint8_t x, uint32_t mult) {
   const uint32_t v = (x * mult + HALF) >> MFIX;
@@ -132,6 +131,9 @@
   return (255u << MFIX) / a;
 }
 
+#undef MFIX
+#undef HALF
+
 static void MultARGBRow(uint8_t* ptr, int width) {
   int x;
   for (x = 0; x < width; ++x, ptr += 4) {
@@ -154,7 +156,8 @@
              Metadata* const metadata) {
   MyData my_data = { data, (toff_t)data_size, 0 };
   TIFF* tif;
-  uint32_t width, height;
+  uint32_t image_width, image_height, tile_width, tile_height;
+  uint64_t stride;
   uint16_t samples_per_px = 0;
   uint16_t extra_samples = 0;
   uint16_t* extra_samples_ptr = NULL;
@@ -185,17 +188,40 @@
     fprintf(stderr, "Error! Cannot retrieve TIFF samples-per-pixel info.\n");
     goto End;
   }
-  if (samples_per_px < 3 || samples_per_px > 4) goto End;  // not supported
+  if (!(samples_per_px == 1 || samples_per_px == 3 || samples_per_px == 4)) {
+    goto End;  // not supported
+  }
 
-  if (!(TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width) &&
-        TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height))) {
+  if (!(TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &image_width) &&
+        TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &image_height))) {
     fprintf(stderr, "Error! Cannot retrieve TIFF image dimensions.\n");
     goto End;
   }
-  if (!ImgIoUtilCheckSizeArgumentsOverflow((uint64_t)width * height,
-                                           sizeof(*raster))) {
+  stride = (uint64_t)image_width * sizeof(*raster);
+  if (!ImgIoUtilCheckSizeArgumentsOverflow(stride, image_height)) {
+    fprintf(stderr, "Error! TIFF image dimension (%d x %d) is too large.\n",
+            image_width, image_height);
     goto End;
   }
+
+  // According to spec, a tile can be bigger than the image. However it should
+  // be a multiple of 16 and not way too large, so check that it's not more
+  // than twice the image size, for dimensions above some arbitrary minimum
+  // 32. We also check that they respect WebP's dimension and memory limit.
+  // Note that a tile can be 6byte/px in some cases. Here we assume
+  // 4byte/px with sizeof(*raster), to be conservative.
+  if (TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width) &&
+      TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height)) {
+    if ((tile_width > 32 && tile_width / 2 > image_width) ||
+        (tile_height > 32 && tile_height / 2 > image_height) ||
+        !ImgIoUtilCheckSizeArgumentsOverflow(
+            (uint64_t)tile_width * sizeof(*raster), tile_height)) {
+      fprintf(stderr, "Error! TIFF tile dimension (%d x %d) is too large.\n",
+              tile_width, tile_height);
+      goto End;
+    }
+  }
+
   if (samples_per_px > 3 && !TIFFGetField(tif, TIFFTAG_EXTRASAMPLES,
                                           &extra_samples, &extra_samples_ptr)) {
     fprintf(stderr, "Error! Cannot retrieve TIFF ExtraSamples info.\n");
@@ -203,33 +229,32 @@
   }
 
   // _Tiffmalloc uses a signed type for size.
-  alloc_size = (int64_t)((uint64_t)width * height * sizeof(*raster));
+  alloc_size = (int64_t)(stride * image_height);
   if (alloc_size < 0 || alloc_size != (tsize_t)alloc_size) goto End;
 
-  raster = (uint32*)_TIFFmalloc((tsize_t)alloc_size);
+  raster = (uint32_t*)_TIFFmalloc((tsize_t)alloc_size);
   if (raster != NULL) {
-    if (TIFFReadRGBAImageOriented(tif, width, height, raster,
+    if (TIFFReadRGBAImageOriented(tif, image_width, image_height, raster,
                                   ORIENTATION_TOPLEFT, 1)) {
-      const int stride = width * sizeof(*raster);
-      pic->width = width;
-      pic->height = height;
+      pic->width = image_width;
+      pic->height = image_height;
       // TIFF data is ABGR
 #ifdef WORDS_BIGENDIAN
-      TIFFSwabArrayOfLong(raster, width * height);
+      TIFFSwabArrayOfLong(raster, image_width * image_height);
 #endif
       // if we have an alpha channel, we must un-multiply from rgbA to RGBA
       if (extra_samples == 1 && extra_samples_ptr != NULL &&
           extra_samples_ptr[0] == EXTRASAMPLE_ASSOCALPHA) {
         uint32_t y;
         uint8_t* tmp = (uint8_t*)raster;
-        for (y = 0; y < height; ++y) {
-          MultARGBRow(tmp, width);
+        for (y = 0; y < image_height; ++y) {
+          MultARGBRow(tmp, image_width);
           tmp += stride;
         }
       }
       ok = keep_alpha
-         ? WebPPictureImportRGBA(pic, (const uint8_t*)raster, stride)
-         : WebPPictureImportRGBX(pic, (const uint8_t*)raster, stride);
+         ? WebPPictureImportRGBA(pic, (const uint8_t*)raster, (int)stride)
+         : WebPPictureImportRGBX(pic, (const uint8_t*)raster, (int)stride);
     }
     _TIFFfree(raster);
   } else {
diff --git a/third_party/libwebp/imageio/webpdec.c b/third_party/libwebp/imageio/webpdec.c
index a9d0654..aed60e1 100644
--- a/third_party/libwebp/imageio/webpdec.c
+++ b/third_party/libwebp/imageio/webpdec.c
@@ -22,6 +22,7 @@
 #include "webp/decode.h"
 #include "webp/demux.h"
 #include "webp/encode.h"
+#include "../examples/unicode.h"
 #include "./imageio_util.h"
 #include "./metadata.h"
 
@@ -43,7 +44,7 @@
 }
 
 void PrintWebPError(const char* const in_file, int status) {
-  fprintf(stderr, "Decoding of %s failed.\n", in_file);
+  WFPRINTF(stderr, "Decoding of %s failed.\n", (const W_CHAR*)in_file);
   fprintf(stderr, "Status: %d", status);
   if (status >= VP8_STATUS_OK && status <= VP8_STATUS_NOT_ENOUGH_DATA) {
     fprintf(stderr, "(%s)", kStatusMessages[status]);
@@ -64,7 +65,7 @@
 
   status = WebPGetFeatures(*data, *data_size, bitstream);
   if (status != VP8_STATUS_OK) {
-    free((void*)*data);
+    WebPFree((void*)*data);
     *data = NULL;
     *data_size = 0;
     PrintWebPError(in_file, status);
@@ -94,7 +95,7 @@
   {
     WebPIDecoder* const idec = WebPIDecode(data, data_size, config);
     if (idec == NULL) {
-      fprintf(stderr, "Failed during WebPINewDecoder().\n");
+      fprintf(stderr, "Failed during WebPIDecode().\n");
       return VP8_STATUS_OUT_OF_MEMORY;
     } else {
       status = WebPIUpdate(idec, data, data_size);
diff --git a/third_party/libwebp/imageio/wicdec.c b/third_party/libwebp/imageio/wicdec.c
index 3ee72a8..42001c6 100644
--- a/third_party/libwebp/imageio/wicdec.c
+++ b/third_party/libwebp/imageio/wicdec.c
@@ -29,12 +29,14 @@
                          // code with COBJMACROS.
 #include <ole2.h>  // CreateStreamOnHGlobal()
 #include <shlwapi.h>
+#include <tchar.h>
 #include <windows.h>
 #include <wincodec.h>
 
-#include "webp/encode.h"
+#include "../examples/unicode.h"
 #include "./imageio_util.h"
 #include "./metadata.h"
+#include "webp/encode.h"
 
 #define IFS(fn)                                                     \
   do {                                                              \
@@ -85,7 +87,7 @@
 
 static HRESULT OpenInputStream(const char* filename, IStream** stream) {
   HRESULT hr = S_OK;
-  if (!strcmp(filename, "-")) {
+  if (!WSTRCMP(filename, "-")) {
     const uint8_t* data = NULL;
     size_t data_size = 0;
     const int ok = ImgIoUtilReadFile(filename, &data, &data_size);
@@ -108,11 +110,12 @@
       hr = E_FAIL;
     }
   } else {
-    IFS(SHCreateStreamOnFileA(filename, STGM_READ, stream));
+    IFS(SHCreateStreamOnFile((const LPTSTR)filename, STGM_READ, stream));
   }
 
   if (FAILED(hr)) {
-    fprintf(stderr, "Error opening input file %s (%08lx)\n", filename, hr);
+    _ftprintf(stderr, _T("Error opening input file %s (%08lx)\n"),
+              (const LPTSTR)filename, hr);
   }
   return hr;
 }
@@ -131,7 +134,10 @@
   IWICColorContext** color_contexts;
 
   IFS(IWICBitmapFrameDecode_GetColorContexts(frame, 0, NULL, &count));
-  if (FAILED(hr) || count == 0) return hr;
+  if (FAILED(hr) || count == 0) {
+    // Treat unsupported operation as a non-fatal error. See crbug.com/webp/506.
+    return (hr == WINCODEC_ERR_UNSUPPORTEDOPERATION) ? S_OK : hr;
+  }
 
   color_contexts = (IWICColorContext**)calloc(count, sizeof(*color_contexts));
   if (color_contexts == NULL) return E_OUTOFMEMORY;
@@ -267,10 +273,15 @@
   WICPixelFormatGUID src_pixel_format = GUID_WICPixelFormatUndefined;
   const WICFormatImporter* importer = NULL;
   GUID src_container_format = GUID_NULL_;
+  // From Windows Kits\10\Include\10.0.19041.0\um\wincodec.h
+  WEBP_DEFINE_GUID(GUID_ContainerFormatWebp_,
+                   0xe094b0e2, 0x67f2, 0x45b3,
+                   0xb0, 0xea, 0x11, 0x53, 0x37, 0xca, 0x7c, 0xf3);
   static const GUID* kAlphaContainers[] = {
     &GUID_ContainerFormatBmp,
     &GUID_ContainerFormatPng,
     &GUID_ContainerFormatTiff,
+    &GUID_ContainerFormatWebp_,
     NULL
   };
   int has_alpha = 0;
@@ -295,9 +306,15 @@
           factory, stream, NULL,
           WICDecodeMetadataCacheOnDemand, &decoder));
   IFS(IWICBitmapDecoder_GetFrameCount(decoder, &frame_count));
-  if (SUCCEEDED(hr) && frame_count == 0) {
-    fprintf(stderr, "No frame found in input file.\n");
-    hr = E_FAIL;
+  if (SUCCEEDED(hr)) {
+    if (frame_count == 0) {
+      fprintf(stderr, "No frame found in input file.\n");
+      hr = E_FAIL;
+    } else if (frame_count > 1) {
+      // WIC will be tried before native WebP decoding so avoid duplicating the
+      // error message.
+      hr = E_FAIL;
+    }
   }
   IFS(IWICBitmapDecoder_GetFrame(decoder, 0, &frame));
   IFS(IWICBitmapFrameDecode_GetPixelFormat(frame, &src_pixel_format));
diff --git a/third_party/libwebp/infra/common.sh b/third_party/libwebp/infra/common.sh
new file mode 100644
index 0000000..b4892d5
--- /dev/null
+++ b/third_party/libwebp/infra/common.sh
@@ -0,0 +1,106 @@
+# Copyright (c) 2021, Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#
+#   * Neither the name of Google nor the names of its contributors may
+#     be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+log_err() {
+  echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2
+}
+
+#######################################
+# Create build directory. Build directory will be deleted if it exists.
+# Arguments:
+#   None.
+# Returns:
+#   mkdir result.
+#######################################
+make_build_dir() {
+  if [[ "$#" -ne 1 ]]; then
+    return 1
+  fi
+
+  local build_dir
+  build_dir="$1"
+  rm -rf "${build_dir}"
+  mkdir -p "${build_dir}"
+}
+
+#######################################
+# Cleanup files from the build directory.
+# Globals:
+#   LIBWEBP_ROOT repository's root path.
+# Arguments:
+#   $1 build directory.
+#######################################
+cleanup() {
+  # $1 is not completely removed to allow for binary artifacts to be
+  # extracted.
+  find "${1:?"Build directory not defined"}" \
+    \( -name "*.[ao]" -o -name "*.l[ao]" \) -exec rm -f {} +
+}
+
+#######################################
+# Setup ccache for toolchain.
+# Globals:
+#   PATH
+# Arguments:
+#   None.
+#######################################
+setup_ccache() {
+  if [[ -x "$(command -v ccache)" ]]; then
+    export CCACHE_CPP2=yes
+    export PATH="/usr/lib/ccache:${PATH}"
+  fi
+}
+
+#######################################
+# Detects whether test block should be run in the current test shard.
+# Globals:
+#   TEST_TOTAL_SHARDS: Valid range: [1, N]. Defaults to 1.
+#   TEST_SHARD_INDEX: Valid range: [0, TEST_TOTAL_SHARDS). Defaults to 0.
+#   libwebp_test_id: current test number; incremented with each call.
+# Arguments:
+#   None
+# Returns:
+#   true if the shard is active
+#   false if the shard is inactive
+#######################################
+shard_should_run() {
+  TEST_TOTAL_SHARDS=${TEST_TOTAL_SHARDS:=1}
+  TEST_SHARD_INDEX=${TEST_SHARD_INDEX:=0}
+  libwebp_test_id=${libwebp_test_id:=-1}
+  : $((libwebp_test_id += 1))
+
+  if [[ "${TEST_SHARD_INDEX}" -lt 0 ||
+    "${TEST_SHARD_INDEX}" -ge "${TEST_TOTAL_SHARDS}" ]]; then
+    log_err "Invalid TEST_SHARD_INDEX (${TEST_SHARD_INDEX})!" \
+      "Expected [0, ${TEST_TOTAL_SHARDS})."
+  fi
+
+  [[ "$((libwebp_test_id % TEST_TOTAL_SHARDS))" -eq "${TEST_SHARD_INDEX}" ]]
+}
diff --git a/third_party/libwebp/infra/compile.sh b/third_party/libwebp/infra/compile.sh
new file mode 100755
index 0000000..18e9ebe
--- /dev/null
+++ b/third_party/libwebp/infra/compile.sh
@@ -0,0 +1,401 @@
+#!/bin/bash
+# Copyright (c) 2021, Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#
+#   * Neither the name of Google nor the names of its contributors may
+#     be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+set -xe
+LIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")"
+WORKSPACE=${WORKSPACE:-"$(mktemp -d -t webp.XXX)"}
+
+# shellcheck source=infra/common.sh
+source "${LIBWEBP_ROOT}/infra/common.sh"
+
+usage() {
+  cat << EOF
+Usage: compile.sh BUILD_TYPE TARGET
+Options:
+BUILD_TYPE  supported build type: (shared, static, static-debug)
+TARGET      supported target platforms:
+              aarch64-linux-clang
+              aarch64-linux-gnu
+              arm-linux-gnueabi
+              arm-neon-linux-gnueabi
+              cmake
+              cmake-aarch64
+              cmake-arm
+              cmake-clang
+              disable-near-lossless
+              disable-sse4.1
+              disable-stats
+              force-aligned-32
+              force-aligned-64
+              gradle
+              i686-linux-asan
+              i686-linux-clang
+              i686-linux-gnu
+              i686-w64-mingw32
+              mips2el-linux-gnu
+              mips32dspr2el-linux-gnu
+              mips32eb-linux-gnu
+              mips32el-linux-gnu
+              mips32r2el-linux-gnu
+              mips32r5el-linux-gnu
+              mips64r2el-linux-gnu
+              mips64r6el-linux-gnu
+              native
+              reduce-csp
+              reduce-size
+              reduce-size-disable-stats
+              visibility-default-gnu
+              visibility-hidden-clang
+              visibility-hidden-gnu
+              wasm
+              x86_64-linux-clang
+              x86_64-linux-gnu
+              x86_64-linux-msan
+              x86_64-w64-mingw32
+Environment variables:
+WORKSPACE   directory where the build is done
+EOF
+}
+
+################################################################################
+echo "Building libwebp in ${WORKSPACE}"
+
+if [[ ! -d "${WORKSPACE}" ]]; then
+  log_err "${WORKSPACE} directory does not exist"
+  exit 1
+fi
+
+BUILD_TYPE=${1:?"Build type not defined.$(
+  echo
+  usage
+)"}
+TARGET=${2:?"Target not defined.$(
+  echo
+  usage
+)"}
+readonly BUILD_DIR="${WORKSPACE}/build-${BUILD_TYPE}"
+
+trap 'cleanup ${BUILD_DIR}' EXIT
+make_build_dir "${BUILD_DIR}"
+
+config_flags=()
+case "${BUILD_TYPE}" in
+  shared*) ;;  # Valid BUILD_TYPE but no setup required
+  static*) config_flags+=("--disable-shared") ;;
+  experimental) config_flags+=("--enable-experimental") ;;
+  *)
+    log_err "Invalid BUILD_TYPE"
+    usage
+    exit 1
+    ;;
+esac
+
+if grep -m 1 -q "enable-asserts" "${LIBWEBP_ROOT}/configure.ac"; then
+  config_flags+=("--enable-asserts")
+fi
+
+case "${TARGET}" in
+  aarch64-linux-clang)
+    TARGET="aarch64-linux-gnu"
+    CC="clang"
+    CC="${CC} --target=aarch64-linux-gnu"
+    export CC
+    export CFLAGS="-isystem /usr/aarch64-linux-gnu/include"
+    ;;
+  arm-linux-gnueabi)
+    export CFLAGS="-O3 -march=armv7-a -mfloat-abi=softfp -ftree-vectorize"
+    ;;
+  arm-neon-linux-gnueabi)
+    TARGET="arm-linux-gnueabi"
+    CFLAGS="-O3 -march=armv7-a -mfpu=neon -mfloat-abi=softfp -ftree-vectorize"
+    export CFLAGS
+    ;;
+  mips2el-linux-gnu)
+    export CFLAGS="-EL -O2 -mips2"
+    TARGET="mipsel-linux-gnu"
+    ;;
+  mips32el-linux-gnu)
+    export CFLAGS="-EL -O2 -mips32"
+    TARGET="mipsel-linux-gnu"
+    ;;
+  mips32r2el-linux-gnu)
+    export CFLAGS="-EL -O2 -mips32r2"
+    TARGET="mipsel-linux-gnu"
+    ;;
+  mips32dspr2el-linux-gnu)
+    export CFLAGS="-EL -O2 -mdspr2"
+    TARGET="mipsel-linux-gnu"
+    ;;
+  mips32r5el-linux-gnu)
+    export CFLAGS="-EL -O2 -mips32r5 -mmsa"
+    TARGET="mipsel-linux-gnu"
+    ;;
+  mips32eb-linux-gnu)
+    export CFLAGS="-EB -O2 -mips32"
+    TARGET="mips-linux-gnu"
+    ;;
+  mips64r2el-linux-gnu)
+    export CFLAGS="-EL -O2 -mips64r2 -mabi=64"
+    TARGET="mips64el-linux-gnuabi64"
+    ;;
+  mips64r6el-linux-gnu)
+    export CFLAGS="-EL -O2 -mips64r6 -mabi=64 -mmsa"
+    TARGET="mips-img-linux-gnu"
+    ;;
+  i686-linux-gnu)
+    export CC="gcc -m32"
+    ;;
+  i686-linux-clang)
+    TARGET="i686-linux-gnu"
+    export CC="clang -m32"
+    ;;
+  i686-linux-asan)
+    TARGET="i686-linux-gnu"
+    export CC="clang -m32 -fsanitize=address"
+    ;;
+  i686-linux-msan)
+    TARGET="i686-linux-gnu"
+    export CC="clang -m32 -fsanitize=memory"
+    ;;
+  x86_64-linux-clang)
+    TARGET="x86_64-linux-gnu"
+    export CC=clang
+    ;;
+  x86_64-linux-msan)
+    TARGET="x86_64-linux-gnu"
+    export CC="clang -fsanitize=memory"
+    ;;
+  force-aligned-32)
+    config_flags+=("--enable-aligned")
+    TARGET="i686-linux-gnu"
+    export CC="gcc -m32"
+    ;;
+  force-aligned-64)
+    config_flags+=("--enable-aligned")
+    TARGET="x86_64-linux-gnu"
+    ;;
+  visibility-default-*)
+    export CFLAGS="-O2 -g -fvisibility=default"
+    TARGET="x86_64-linux-gnu"
+    ;;
+  visibility-hidden-*)
+    export CFLAGS="-O2 -g -fvisibility=hidden"
+    if [[ "${TARGET}" = "visibility-hidden-clang" ]]; then
+      export CC=clang
+    fi
+    TARGET="x86_64-linux-gnu"
+    ;;
+  disable-sse4.1)
+    grep "${TARGET}" "${LIBWEBP_ROOT}/configure.ac" || exit 0
+    config_flags+=("--${TARGET}")
+    TARGET="x86_64-linux-gnu"
+    ;;
+  disable-near-lossless)
+    grep "${TARGET}" "${LIBWEBP_ROOT}/configure.ac" || exit 0
+    config_flags+=("--${TARGET}")
+    TARGET="x86_64-linux-gnu"
+    ;;
+  disable-stats)
+    git -C "${LIBWEBP_ROOT}" grep WEBP_DISABLE_STATS || exit 0
+    export CFLAGS="-O2 -g -DWEBP_DISABLE_STATS"
+    TARGET="x86_64-linux-gnu"
+    ;;
+  reduce-size)
+    git -C "${LIBWEBP_ROOT}" grep WEBP_REDUCE_SIZE || exit 0
+    export CFLAGS="-O2 -g -DWEBP_REDUCE_SIZE"
+    TARGET="x86_64-linux-gnu"
+    ;;
+  reduce-size-disable-stats)
+    git -C "${LIBWEBP_ROOT}" grep -e WEBP_DISABLE_STATS -e WEBP_REDUCE_SIZE \
+      || exit 0
+    export CFLAGS="-O2 -g -DWEBP_DISABLE_STATS -DWEBP_REDUCE_SIZE"
+    TARGET="x86_64-linux-gnu"
+    ;;
+  reduce-csp)
+    git -C "${LIBWEBP_ROOT}" grep WEBP_REDUCE_CSP || exit 0
+    export CFLAGS="-O2 -g -DWEBP_REDUCE_CSP"
+    TARGET="x86_64-linux-gnu"
+    ;;
+  x86_64-linux-gnu | *mingw32 | aarch64*) ;;  # Default target configuration
+  # non-configure based builds
+  native)
+    setup_ccache
+    # exercise makefile.unix then quit
+    make -C "${LIBWEBP_ROOT}" -f makefile.unix -j all
+    for tgt in extras examples/anim_diff; do
+      grep -q -m 1 "${tgt}" "${LIBWEBP_ROOT}/makefile.unix" \
+        && make -C "${LIBWEBP_ROOT}" -f makefile.unix -j "${tgt}"
+    done
+    [[ -d "${LIBWEBP_ROOT}/tests/fuzzer" ]] \
+      && make -j -C "${LIBWEBP_ROOT}/tests/fuzzer" -f makefile.unix
+    exit 0
+    ;;
+  cmake*)
+    setup_ccache
+    # exercise cmake then quit
+    opts=()
+    case "${TARGET}" in
+      cmake-clang)
+        opts+=("-DCMAKE_C_COMPILER=clang")
+        ;;
+      cmake-arm)
+        opts+=("-DCMAKE_C_COMPILER=arm-linux-gnueabi-gcc")
+        case "${GERRIT_BRANCH:-}" in
+          portable-intrinsics | 0.6.1) exit 0 ;;
+          *) ;;  # Skip configuration
+        esac
+        ;;
+      cmake-aarch64)
+        opts+=("-DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc")
+        case "${GERRIT_BRANCH:-}" in
+          portable-intrinsics | 0.6.1) exit 0 ;;
+          *) ;;  # Skip configuration
+        esac
+        ;;
+      *) ;;  # Skip configuration
+    esac
+    case "${BUILD_TYPE}" in
+      static*)
+        opts+=("-DBUILD_SHARED_LIBS=OFF")
+        ;;
+      experimental)
+        opts+=("-DWEBP_EXPERIMENTAL_FEATURES=ON" "-DBUILD_SHARED_LIBS=ON")
+        ;;
+      *)
+        opts+=("-DBUILD_SHARED_LIBS=ON")
+        ;;
+    esac
+    case "${BUILD_TYPE}" in
+      *debug) opts+=("-DCMAKE_BUILD_TYPE=Debug") ;;
+      *) opts+=("-DCMAKE_BUILD_TYPE=RelWithDebInfo") ;;
+    esac
+    cd "${BUILD_DIR}"
+    opts+=("-DWEBP_BUILD_CWEBP=ON" "-DWEBP_BUILD_DWEBP=ON")
+    grep -m 1 -q WEBP_BUILD_GIF2WEBP "${LIBWEBP_ROOT}/CMakeLists.txt" \
+      && opts+=("-DWEBP_BUILD_GIF2WEBP=ON")
+    grep -m 1 -q WEBP_BUILD_IMG2WEBP "${LIBWEBP_ROOT}/CMakeLists.txt" \
+      && opts+=("-DWEBP_BUILD_IMG2WEBP=ON")
+    cmake "${opts[@]}" "${LIBWEBP_ROOT}"
+    make VERBOSE=1 -j
+    case "${BUILD_TYPE}" in
+      static)
+        mkdir -p examples
+        cp [cd]webp examples
+        ;;
+      *) ;;  # Skip configuration.
+    esac
+
+    grep "install" "${LIBWEBP_ROOT}/CMakeLists.txt" || exit 0
+
+    make DESTDIR="${BUILD_DIR}/webp-install" install/strip
+    mkdir tmp
+    cd tmp
+    cat > CMakeLists.txt << EOF
+cmake_minimum_required(VERSION 2.8.7)
+
+project(libwebp C)
+
+find_package(WebP)
+if (NOT WebP_FOUND)
+  message(FATAL_ERROR "WebP package not found")
+endif ()
+message("WebP_FOUND: \${WebP_FOUND}")
+message("WebP_INCLUDE_DIRS: \${WebP_INCLUDE_DIRS}")
+message("WebP_LIBRARIES: \${WebP_LIBRARIES}")
+message("WEBP_INCLUDE_DIRS: \${WEBP_INCLUDE_DIRS}")
+message("WEBP_LIBRARIES: \${WEBP_LIBRARIES}")
+EOF
+    cmake . "${opts[@]}" \
+      "-DCMAKE_PREFIX_PATH=${BUILD_DIR}/webp-install/usr/local"
+    exit 0
+    ;;
+  gradle)
+    setup_ccache
+    # exercise gradle then quit
+    [[ -f "${LIBWEBP_ROOT}/gradlew" ]] || exit 0
+
+    cd "${BUILD_DIR}"
+    # TODO -g / --gradle-user-home could be used if there's a race between jobs
+    "${LIBWEBP_ROOT}/gradlew" -p "${LIBWEBP_ROOT}" buildAllExecutables
+    exit 0
+    ;;
+  wasm)
+    grep -m 1 -q WEBP_ENABLE_WASM "${LIBWEBP_ROOT}/CMakeLists.txt" || exit 0
+    opts+=("-DCMAKE_C_COMPILER=clang" "-DWEBP_ENABLE_WASM=ON")
+    opts+=("-DWEBP_BUILD_CWEBP=ON" "-DWEBP_BUILD_DWEBP=ON")
+    case "${BUILD_TYPE}" in
+      *debug) opts+=("-DCMAKE_BUILD_TYPE=Debug") ;;
+      *) opts+=("-DCMAKE_BUILD_TYPE=RelWithDebInfo") ;;
+    esac
+    cd "${BUILD_DIR}"
+    cmake "${opts[@]}" "${LIBWEBP_ROOT}"
+    make VERBOSE=1 -j
+    mkdir examples
+    case "${BUILD_TYPE}" in
+      static)
+        mkdir -p examples
+        cp [cd]webp examples
+        ;;
+      *) ;;  # Skip configuration
+    esac
+    exit 0
+    ;;
+  *)
+    log_err "Invalid TARGET"
+    usage
+    exit 1
+    ;;
+esac
+
+case "${TARGET}" in
+  *mingw32) ;;  # Skip configuration
+  *)
+    case "${TARGET}-${CC}" in
+      static-debug-gcc* | static-debug-)
+        CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage -O0 -g"
+        CXXFLAGS="${CXXFLAGS} -fprofile-arcs -ftest-coverage -O0 -g"
+        export CFLAGS CXXFLAGS
+        ;;
+      *) ;;  # This case should not be reached.
+    esac
+    ;;
+esac
+
+setup_ccache
+
+cd "${LIBWEBP_ROOT}"
+./autogen.sh
+
+cd "${BUILD_DIR}"
+"${LIBWEBP_ROOT}/configure" \
+  --host "${TARGET}" --build "$("${LIBWEBP_ROOT}/config.guess")" \
+  --enable-everything "${config_flags[@]}"
+make -j V=1
diff --git a/third_party/libwebp/infra/compile_android.sh b/third_party/libwebp/infra/compile_android.sh
new file mode 100755
index 0000000..013b97c
--- /dev/null
+++ b/third_party/libwebp/infra/compile_android.sh
@@ -0,0 +1,224 @@
+#!/bin/bash
+# Copyright (c) 2021, Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#
+#   * Neither the name of Google nor the names of its contributors may
+#     be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+set -xe
+LIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")"
+readonly LIBWEBP_ROOT
+readonly WORKSPACE=${WORKSPACE:-"$(mktemp -d -t webp.android.XXX)"}
+# shellcheck source=infra/common.sh
+source "${LIBWEBP_ROOT}/infra/common.sh"
+
+usage() {
+  cat << EOF
+Usage: $(basename "$0") BUILD_TYPE APP_ABI
+Options:
+BUILD_TYPE  supported build types:
+              static
+              static-debug
+              shared
+              shared-debug
+APP_ABI     supported application binary interfaces:
+              armeabi-v7a
+              arm64-v8a
+              x86
+              x86_64
+Environment variables:
+WORKSPACE   directory where the build is done.
+ANDROID_NDK_DIR directory where the android ndk tools are.
+EOF
+}
+
+################################################################################
+echo "Building libwebp for Android in ${WORKSPACE}"
+
+if [[ ! -d "${WORKSPACE}" ]]; then
+  log_err "${WORKSPACE} directory does not exist."
+  exit 1
+fi
+
+readonly BUILD_TYPE=${1:?"BUILD_TYPE is not defined.$(
+  echo
+  usage
+)"}
+readonly APP_ABI=${2:?"APP_ABI not defined.$(
+  echo
+  usage
+)"}
+readonly ANDROID_NDK_DIR=${ANDROID_NDK_DIR:?"ANDROID_NDK_DIR is not defined.$(
+  echo
+  usage
+)"}
+readonly BUILD_DIR="${WORKSPACE}/build-${BUILD_TYPE}"
+readonly STANDALONE_ANDROID_DIR="${WORKSPACE}/android"
+
+if [[ ! -x "${ANDROID_NDK_DIR}/ndk-build" ]]; then
+  log_err "unable to find ndk-build in ANDROID_NDK_DIR: ${ANDROID_NDK_DIR}."
+  exit 1
+fi
+
+CFLAGS=
+LDFLAGS=
+opts=()
+case "${BUILD_TYPE}" in
+  *debug)
+    readonly APP_OPTIM="debug"
+    CFLAGS="-O0 -g"
+    opts+=("--enable-asserts")
+    ;;
+  static* | shared*)
+    readonly APP_OPTIM="release"
+    CFLAGS="-O2 -g"
+    ;;
+  *)
+    usage
+    exit 1
+    ;;
+esac
+
+case "${BUILD_TYPE}" in
+  shared*) readonly SHARED="1" ;;
+  *)
+    readonly SHARED="0"
+    CFLAGS="${CFLAGS} -fPIE"
+    LDFLAGS="${LDFLAGS} -Wl,-pie"
+    opts+=("--disable-shared")
+    ;;
+esac
+
+# Create a fresh build directory
+make_build_dir "${BUILD_DIR}"
+cd "${BUILD_DIR}"
+ln -s "${LIBWEBP_ROOT}" jni
+
+"${ANDROID_NDK_DIR}/ndk-build" -j2 \
+  APP_ABI="${APP_ABI}" \
+  APP_OPTIM="${APP_OPTIM}" \
+  ENABLE_SHARED="${SHARED}"
+
+cd "${LIBWEBP_ROOT}"
+./autogen.sh
+
+case "${APP_ABI}" in
+  armeabi*) arch="arm" ;;
+  arm64*) arch="arm64" ;;
+  *) arch="${APP_ABI}" ;;
+esac
+# TODO(b/185520507): remove this and use the binaries from
+# toolchains/llvm/prebuilt/ directly.
+rm -rf "${STANDALONE_ANDROID_DIR}"
+"${ANDROID_NDK_DIR}/build/tools/make_standalone_toolchain.py" \
+  --api 24 --arch "${arch}" --stl gnustl --install-dir \
+  "${STANDALONE_ANDROID_DIR}"
+export PATH="${STANDALONE_ANDROID_DIR}/bin:${PATH}"
+
+rm -rf "${BUILD_DIR}"
+make_build_dir "${BUILD_DIR}"
+cd "${BUILD_DIR}"
+
+case "${arch}" in
+  arm)
+    host="arm-linux-androideabi"
+    case "${APP_ABI}" in
+      armeabi) ;;
+      armeabi-v7a)
+        CFLAGS="${CFLAGS} -march=armv7-a -mfpu=neon -mfloat-abi=softfp"
+        ;;
+      *) ;;  # No configuration needed
+    esac
+    ;;
+  arm64)
+    host="aarch64-linux-android"
+    ;;
+  x86)
+    host="i686-linux-android"
+    ;;
+  x86_64)
+    host="x86_64-linux-android"
+    ;;
+  *) ;;  # Skip configuration
+esac
+
+setup_ccache
+CC="clang"
+
+"${LIBWEBP_ROOT}/configure" --host "${host}" --build \
+  "$("${LIBWEBP_ROOT}/config.guess")" CC="${CC}" CFLAGS="${CFLAGS}" \
+  LDFLAGS="${LDFLAGS}" "${opts[@]}"
+make -j
+
+if [[ "${GERRIT_REFSPEC:-}" = "refs/heads/portable-intrinsics" ]] \
+  || [[ "${GERRIT_BRANCH:-}" = "portable-intrinsics" ]]; then
+  cd "${WORKSPACE}"
+  rm -rf build && mkdir build
+  cd build
+  standalone="${WORKSPACE}/android"
+  cmake ../libwebp \
+    -DWEBP_BUILD_DWEBP=1 \
+    -DCMAKE_C_COMPILER="${standalone}/bin/clang" \
+    -DCMAKE_PREFIX_PATH="${standalone}/sysroot/usr/lib" \
+    -DCMAKE_C_FLAGS=-fPIE \
+    -DCMAKE_EXE_LINKER_FLAGS=-Wl,-pie \
+    -DCMAKE_BUILD_TYPE=Release \
+    -DWEBP_ENABLE_WASM=1
+  make -j2
+
+  cd "${WORKSPACE}"
+  make_build_dir "${BUILD_DIR}"
+  cd "${BUILD_DIR}"
+  case "${APP_ABI}" in
+    armeabi-v7a | arm64*)
+      cmake "${LIBWEBP_ROOT}" \
+        -DWEBP_BUILD_DWEBP=1 \
+        -DCMAKE_C_COMPILER="${standalone}/bin/clang" \
+        -DCMAKE_PREFIX_PATH="${standalone}/sysroot/usr/lib" \
+        -DCMAKE_C_FLAGS='-fPIE -DENABLE_NEON_BUILTIN_MULHI_INT16X8' \
+        -DCMAKE_EXE_LINKER_FLAGS=-Wl,-pie \
+        -DCMAKE_BUILD_TYPE=Release \
+        -DWEBP_ENABLE_WASM=1
+      make -j2
+      ;;
+    x86*)
+      cmake "${LIBWEBP_ROOT}" \
+        -DWEBP_BUILD_DWEBP=1 \
+        -DCMAKE_C_COMPILER="${standalone}/bin/clang" \
+        -DCMAKE_PREFIX_PATH="${standalone}/sysroot/usr/lib" \
+        -DCMAKE_C_FLAGS='-fPIE -DENABLE_X86_BUILTIN_MULHI_INT16X8' \
+        -DCMAKE_EXE_LINKER_FLAGS=-Wl,-pie \
+        -DCMAKE_BUILD_TYPE=Release \
+        -DWEBP_ENABLE_WASM=1
+      make -j2
+      ;;
+    *)
+      log_err "APP_ABI not supported."
+      exit 1
+      ;;
+  esac
+fi
diff --git a/third_party/libwebp/infra/compile_js.sh b/third_party/libwebp/infra/compile_js.sh
new file mode 100755
index 0000000..6a13fe6
--- /dev/null
+++ b/third_party/libwebp/infra/compile_js.sh
@@ -0,0 +1,75 @@
+#!/bin/bash
+# Copyright (c) 2021, Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#
+#   * Neither the name of Google nor the names of its contributors may
+#     be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+set -ex
+
+readonly WORKSPACE="${WORKSPACE:-"$(mktemp -d -t webp.js.XXX)"}"
+readonly BUILD_DIR="${WORKSPACE}/webp_js/"
+readonly LIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")"
+
+# shellcheck source=infra/common.sh
+source "${LIBWEBP_ROOT}/infra/common.sh"
+
+usage() {
+  cat << EOF
+Usage: $(basename "$0")
+Environment variables:
+WORKSPACE directory where the build is done
+EMSDK_DIR directory where emsdk is installed
+EOF
+}
+
+[[ -d "${EMSDK_DIR:?Not defined}" ]] \
+  || (log_err "${EMSDK_DIR} is not a valid directory." && exit 1)
+
+# shellcheck source=/opt/emsdk/emsdk_env.sh
+source "${EMSDK_DIR}/emsdk_env.sh"
+
+readonly EMSCRIPTEN=${EMSCRIPTEN:-"${EMSDK}/upstream/emscripten"}
+readonly \
+  EMSCRIPTEN_CMAKE_FILE="${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake"
+make_build_dir "${BUILD_DIR}"
+
+pushd "${BUILD_DIR}"
+opts=("-GUnix Makefiles" "-DWEBP_BUILD_WEBP_JS=ON")
+if [[ -z "$(command -v emcmake)" ]]; then
+  opts+=("-DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN_CMAKE_FILE}")
+  cmake \
+    "${opts[@]}" \
+    "${LIBWEBP_ROOT}"
+  make -j
+else
+  emcmake cmake \
+    "${opts[@]}" \
+    "${LIBWEBP_ROOT}"
+  emmake make -j
+fi
+popd
diff --git a/third_party/libwebp/infra/run_static_analysis.sh b/third_party/libwebp/infra/run_static_analysis.sh
new file mode 100755
index 0000000..fa8445c
--- /dev/null
+++ b/third_party/libwebp/infra/run_static_analysis.sh
@@ -0,0 +1,98 @@
+#!/bin/bash
+# Copyright (c) 2021, Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#
+#   * Neither the name of Google nor the names of its contributors may
+#     be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+set -xe
+
+LIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")"
+readonly LIBWEBP_ROOT
+readonly WORKSPACE=${WORKSPACE:-"$(mktemp -d -t webp.scanbuild.XXX)"}
+
+# shellcheck source=infra/common.sh
+source "${LIBWEBP_ROOT}/infra/common.sh"
+
+usage() {
+  cat << EOF
+Usage: $(basename "$0") MODE
+Options:
+MODE supported scan modes: (shallow|deep)
+Environment variables:
+WORKSPACE directory where the build is done.
+EOF
+}
+
+#######################################
+# Wrap clang-tools scan-build.
+# Globals:
+#   OUTPUT_DIR target directory where scan-build report is generated.
+#   MODE scan-build mode
+# Arguments:
+#   $* scan-build additional args.
+# Returns:
+#   scan-build retcode
+#######################################
+scan_build() {
+  scan-build -o "${OUTPUT_DIR}" --use-analyzer="$(command -v clang)" \
+    -analyzer-config mode="${MODE}" "$*"
+}
+
+MODE=${1:?"MODE is not specified.$(
+  echo
+  usage
+)"}
+
+readonly OUTPUT_DIR="${WORKSPACE}/output-${MODE}"
+readonly BUILD_DIR="${WORKSPACE}/build"
+
+make_build_dir "${OUTPUT_DIR}"
+make_build_dir "${BUILD_DIR}"
+
+cd "${LIBWEBP_ROOT}"
+./autogen.sh
+
+cd "${BUILD_DIR}"
+grep -m 1 -q 'enable-asserts' "${LIBWEBP_ROOT}/configure.ac" \
+    && args='--enable-asserts'
+scan_build "${LIBWEBP_ROOT}/configure" --enable-everything "${args}"
+scan_build make -j4
+
+index="$(find "${OUTPUT_DIR}" -name index.html)"
+if [[ -f "${index}" ]]; then
+  mv "$(dirname "${index}")/"* "${OUTPUT_DIR}"
+else
+  # make a empty report to wipe out any old bug reports.
+  cat << EOT > "${OUTPUT_DIR}/index.html"
+<html>
+<body>
+No bugs reported.
+</body>
+</html>
+EOT
+fi
diff --git a/third_party/libwebp/iosbuild.sh b/third_party/libwebp/iosbuild.sh
index 971efc8..cd3a24c 100755
--- a/third_party/libwebp/iosbuild.sh
+++ b/third_party/libwebp/iosbuild.sh
@@ -1,17 +1,21 @@
 #!/bin/bash
 #
-# This script generates 'WebP.framework' and 'WebPDecoder.framework'. An iOS
-# app can decode WebP images by including 'WebPDecoder.framework' and both
-# encode and decode WebP images by including 'WebP.framework'.
+# This script generates 'WebP.framework' and 'WebPDecoder.framework',
+# 'WebPDemux.framework' and 'WebPMux.framework'.
+# An iOS app can decode WebP images by including 'WebPDecoder.framework' and
+# both encode and decode WebP images by including 'WebP.framework'.
 #
 # Run ./iosbuild.sh to generate the frameworks under the current directory
 # (the previous build will be erased if it exists).
 #
 # This script is inspired by the build script written by Carson McDonald.
-# (http://www.ioncannon.net/programming/1483/using-webp-to-reduce-native-ios-app-size/).
+# (https://www.ioncannon.net/programming/1483/using-webp-to-reduce-native-ios-app-size/).
 
 set -e
 
+# Set this variable based on the desired minimum deployment target.
+readonly IOS_MIN_VERSION=6.0
+
 # Extract the latest SDK version from the final field of the form: iphoneosX.Y
 readonly SDK=$(xcodebuild -showsdks \
   | grep iphoneos | sort | tail -n 1 | awk '{print substr($NF, 9)}'
@@ -35,35 +39,55 @@
 readonly BUILDDIR="${TOPDIR}/iosbuild"
 readonly TARGETDIR="${TOPDIR}/WebP.framework"
 readonly DECTARGETDIR="${TOPDIR}/WebPDecoder.framework"
+readonly MUXTARGETDIR="${TOPDIR}/WebPMux.framework"
+readonly DEMUXTARGETDIR="${TOPDIR}/WebPDemux.framework"
 readonly DEVELOPER=$(xcode-select --print-path)
 readonly PLATFORMSROOT="${DEVELOPER}/Platforms"
 readonly LIPO=$(xcrun -sdk iphoneos${SDK} -find lipo)
 LIBLIST=''
 DECLIBLIST=''
+MUXLIBLIST=''
+DEMUXLIBLIST=''
 
 if [[ -z "${SDK}" ]]; then
   echo "iOS SDK not available"
   exit 1
 elif [[ ${SDK%%.*} -gt 8 ]]; then
   EXTRA_CFLAGS="-fembed-bitcode"
-elif [[ ${SDK} < 6.0 ]]; then
+elif [[ ${SDK%%.*} -le 6 ]]; then
   echo "You need iOS SDK version 6.0 or above"
   exit 1
-else
-  echo "iOS SDK Version ${SDK}"
 fi
 
-rm -rf ${BUILDDIR} ${TARGETDIR} ${DECTARGETDIR}
-mkdir -p ${BUILDDIR} ${TARGETDIR}/Headers/ ${DECTARGETDIR}/Headers/
+echo "Xcode Version: ${XCODE}"
+echo "iOS SDK Version: ${SDK}"
+
+if [[ -e "${BUILDDIR}" || -e "${TARGETDIR}" || -e "${DECTARGETDIR}" \
+      || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" ]]; then
+  cat << EOF
+WARNING: The following directories will be deleted:
+WARNING:   ${BUILDDIR}
+WARNING:   ${TARGETDIR}
+WARNING:   ${DECTARGETDIR}
+WARNING:   ${MUXTARGETDIR}
+WARNING:   ${DEMUXTARGETDIR}
+WARNING: The build will continue in 5 seconds...
+EOF
+  sleep 5
+fi
+rm -rf ${BUILDDIR} ${TARGETDIR} ${DECTARGETDIR} \
+    ${MUXTARGETDIR} ${DEMUXTARGETDIR}
+mkdir -p ${BUILDDIR} ${TARGETDIR}/Headers/ ${DECTARGETDIR}/Headers/ \
+    ${MUXTARGETDIR}/Headers/ ${DEMUXTARGETDIR}/Headers/
 
 if [[ ! -e ${SRCDIR}/configure ]]; then
   if ! (cd ${SRCDIR} && sh autogen.sh); then
-    cat <<EOT
+    cat << EOF
 Error creating configure script!
 This script requires the autoconf/automake and libtool to build. MacPorts can
 be used to obtain these:
-http://www.macports.org/install.php
-EOT
+https://www.macports.org/install.php
+EOF
     exit 1
   fi
 fi
@@ -97,7 +121,7 @@
   SDKROOT="${PLATFORMSROOT}/"
   SDKROOT+="${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDK}.sdk/"
   CFLAGS="-arch ${ARCH2:-${ARCH}} -pipe -isysroot ${SDKROOT} -O3 -DNDEBUG"
-  CFLAGS+=" -miphoneos-version-min=6.0 ${EXTRA_CFLAGS}"
+  CFLAGS+=" -miphoneos-version-min=${IOS_MIN_VERSION} ${EXTRA_CFLAGS}"
 
   set -x
   export PATH="${DEVROOT}/usr/bin:${OLDPATH}"
@@ -105,25 +129,40 @@
     --build=$(${SRCDIR}/config.guess) \
     --disable-shared --enable-static \
     --enable-libwebpdecoder --enable-swap-16bit-csp \
+    --enable-libwebpmux \
     CFLAGS="${CFLAGS}"
   set +x
 
-  # run make only in the src/ directory to create libwebp.a/libwebpdecoder.a
-  cd src/
-  make V=0
-  make install
+  # Build only the libraries, skip the examples.
+  make V=0 -C sharpyuv
+  make V=0 -C src install
 
   LIBLIST+=" ${ROOTDIR}/lib/libwebp.a"
   DECLIBLIST+=" ${ROOTDIR}/lib/libwebpdecoder.a"
+  MUXLIBLIST+=" ${ROOTDIR}/lib/libwebpmux.a"
+  DEMUXLIBLIST+=" ${ROOTDIR}/lib/libwebpdemux.a"
 
   make clean
-  cd ..
 
   export PATH=${OLDPATH}
 done
 
+echo "LIBLIST = ${LIBLIST}"
 cp -a ${SRCDIR}/src/webp/{decode,encode,types}.h ${TARGETDIR}/Headers/
 ${LIPO} -create ${LIBLIST} -output ${TARGETDIR}/WebP
 
+echo "DECLIBLIST = ${DECLIBLIST}"
 cp -a ${SRCDIR}/src/webp/{decode,types}.h ${DECTARGETDIR}/Headers/
 ${LIPO} -create ${DECLIBLIST} -output ${DECTARGETDIR}/WebPDecoder
+
+echo "MUXLIBLIST = ${MUXLIBLIST}"
+cp -a ${SRCDIR}/src/webp/{types,mux,mux_types}.h \
+    ${MUXTARGETDIR}/Headers/
+${LIPO} -create ${MUXLIBLIST} -output ${MUXTARGETDIR}/WebPMux
+
+echo "DEMUXLIBLIST = ${DEMUXLIBLIST}"
+cp -a ${SRCDIR}/src/webp/{decode,types,mux_types,demux}.h \
+    ${DEMUXTARGETDIR}/Headers/
+${LIPO} -create ${DEMUXLIBLIST} -output ${DEMUXTARGETDIR}/WebPDemux
+
+echo  "SUCCESS"
diff --git a/third_party/libwebp/libwebp.gni b/third_party/libwebp/libwebp.gni
index cba22f5..4cd75f6 100644
--- a/third_party/libwebp/libwebp.gni
+++ b/third_party/libwebp/libwebp.gni
@@ -97,9 +97,9 @@
   "src/dsp/cost.c",
   "src/dsp/cost_mips32.c",
   "src/dsp/cost_mips_dsp_r2.c",
+  "src/dsp/cost_neon.c",
   "src/dsp/cost_sse2.c",
   "src/dsp/enc.c",
-  "src/dsp/enc_avx2.c",
   "src/dsp/enc_mips32.c",
   "src/dsp/enc_mips_dsp_r2.c",
   "src/dsp/enc_msa.c",
@@ -113,6 +113,7 @@
   "src/dsp/lossless_enc_neon.c",
   "src/dsp/lossless_enc_sse2.c",
   "src/dsp/lossless_enc_sse41.c",
+  "src/dsp/lossless_sse41.c",
   "src/dsp/ssim.c",
   "src/dsp/ssim_sse2.c",
 ]
@@ -143,6 +144,16 @@
   "src/enc/webp_enc.c",
 ]
 
+libwebp_sharpyuv_sources = [
+  "sharpyuv/sharpyuv.c",
+  "sharpyuv/sharpyuv_cpu.c",
+  "sharpyuv/sharpyuv_csp.c",
+  "sharpyuv/sharpyuv_dsp.c",
+  "sharpyuv/sharpyuv_gamma.c",
+  "sharpyuv/sharpyuv_neon.c",
+  "sharpyuv/sharpyuv_sse2.c",
+]
+
 libwebp_format_dec_sources = [
   "imageio/image_dec.c",
   "imageio/jpegdec.c",
diff --git a/third_party/libwebp/m4/.gitignore b/third_party/libwebp/m4/.gitignore
deleted file mode 100644
index 64d9bbc..0000000
--- a/third_party/libwebp/m4/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/libtool.m4
-/lt*.m4
diff --git a/third_party/libwebp/makefile.unix b/third_party/libwebp/makefile.unix
index cc0035d..8348d10 100644
--- a/third_party/libwebp/makefile.unix
+++ b/third_party/libwebp/makefile.unix
@@ -3,7 +3,8 @@
 # It will not install the libraries system-wide, but just create the 'cwebp'
 # and 'dwebp' tools in the examples/ directory, along with the static
 # libraries 'src/libwebp.a', 'src/libwebpdecoder.a', 'src/mux/libwebpmux.a',
-# 'src/demux/libwebpdemux.a' and 'extras/libwebpextras.a'.
+# 'src/demux/libwebpdemux.a', 'extras/libwebpextras.a' and
+# 'sharpyuv/libsharpyuv.a'.
 #
 # To build the library and examples, use:
 #    make -f makefile.unix
@@ -47,7 +48,7 @@
 endif
 
 # To install libraries on Mac OS X:
-# 1. Install MacPorts (http://www.macports.org/install.php)
+# 1. Install MacPorts (https://www.macports.org/install.php)
 # 2. Run "sudo port install jpeg"
 # 3. Run "sudo port install libpng"
 # 4. Run "sudo port install tiff"
@@ -89,12 +90,6 @@
 src/dsp/%_sse41.o: EXTRA_FLAGS += -msse4.1
 endif
 
-# AVX2-specific flags:
-ifeq ($(HAVE_AVX2), 1)
-EXTRA_FLAGS += -DWEBP_HAVE_AVX2
-src/dsp/%_avx2.o: EXTRA_FLAGS += -mavx2
-endif
-
 # NEON-specific flags:
 # EXTRA_FLAGS += -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a8
 # -> seems to make the overall lib slower: -fno-split-wide-types
@@ -124,9 +119,22 @@
 COL = /usr/bin/col
 LDFLAGS = $(EXTRA_LIBS) $(EXTRA_FLAGS) -lm
 
+ifdef BITTRACE
+CFLAGS += -DBITTRACE=$(BITTRACE)
+endif
+
 ANIM_UTIL_OBJS = \
     examples/anim_util.o \
 
+SHARPYUV_OBJS = \
+    sharpyuv/sharpyuv.o \
+    sharpyuv/sharpyuv_cpu.o \
+    sharpyuv/sharpyuv_csp.o \
+    sharpyuv/sharpyuv_dsp.o \
+    sharpyuv/sharpyuv_gamma.o \
+    sharpyuv/sharpyuv_neon.o \
+    sharpyuv/sharpyuv_sse2.o \
+
 DEC_OBJS = \
     src/dec/alpha_dec.o \
     src/dec/buffer_dec.o \
@@ -168,6 +176,7 @@
     src/dsp/lossless_msa.o \
     src/dsp/lossless_neon.o \
     src/dsp/lossless_sse2.o \
+    src/dsp/lossless_sse41.o \
     src/dsp/rescaler.o \
     src/dsp/rescaler_mips32.o \
     src/dsp/rescaler_mips_dsp_r2.o \
@@ -191,9 +200,9 @@
     src/dsp/cost.o \
     src/dsp/cost_mips32.o \
     src/dsp/cost_mips_dsp_r2.o \
+    src/dsp/cost_neon.o \
     src/dsp/cost_sse2.o \
     src/dsp/enc.o \
-    src/dsp/enc_avx2.o \
     src/dsp/enc_mips32.o \
     src/dsp/enc_mips_dsp_r2.o \
     src/dsp/enc_msa.o \
@@ -283,11 +292,12 @@
     extras/quality_estimate.o \
 
 LIBWEBPDECODER_OBJS = $(DEC_OBJS) $(DSP_DEC_OBJS) $(UTILS_DEC_OBJS)
-LIBWEBP_OBJS = $(LIBWEBPDECODER_OBJS) $(ENC_OBJS) $(DSP_ENC_OBJS) \
-               $(UTILS_ENC_OBJS)
+LIBWEBP_OBJS = $(LIBWEBPDECODER_OBJS) $(ENC_OBJS) \
+               $(DSP_ENC_OBJS) $(UTILS_ENC_OBJS)
 LIBWEBPMUX_OBJS = $(MUX_OBJS)
 LIBWEBPDEMUX_OBJS = $(DEMUX_OBJS)
 LIBWEBPEXTRA_OBJS = $(EXTRA_OBJS)
+LIBSHARPYUV_OBJS = $(SHARPYUV_OBJS)
 
 HDRS_INSTALLED = \
     src/webp/decode.h \
@@ -297,6 +307,11 @@
     src/webp/mux_types.h \
     src/webp/types.h \
 
+SHARPYUV_HDRS_INSTALLED = \
+    sharpyuv/sharpyuv.h \
+    sharpyuv/sharpyuv_cpu.h \
+    sharpyuv/sharpyuv_csp.h \
+
 HDRS = \
     src/dec/alphai_dec.h \
     src/dec/common_dec.h \
@@ -305,6 +320,7 @@
     src/dec/vp8li_dec.h \
     src/dec/webpi_dec.h \
     src/dsp/common_sse2.h \
+    src/dsp/cpu.h \
     src/dsp/dsp.h \
     src/dsp/lossless.h \
     src/dsp/lossless_common.h \
@@ -335,6 +351,7 @@
     src/utils/utils.h \
     src/webp/format_constants.h \
     $(HDRS_INSTALLED) \
+    $(SHARPYUV_HDRS_INSTALLED) \
 
 OUT_LIBS = examples/libexample_util.a
 OUT_LIBS += imageio/libimageio_util.a
@@ -342,6 +359,7 @@
 OUT_LIBS += imageio/libimageenc.a
 OUT_LIBS += src/libwebpdecoder.a
 OUT_LIBS += src/libwebp.a
+OUT_LIBS += sharpyuv/libsharpyuv.a
 EXTRA_LIB = extras/libwebpextras.a
 OUT_EXAMPLES = examples/cwebp examples/dwebp
 EXTRA_EXAMPLES = examples/gif2webp examples/vwebp examples/webpmux \
@@ -387,12 +405,13 @@
 src/libwebp.a: $(LIBWEBP_OBJS)
 src/mux/libwebpmux.a: $(LIBWEBPMUX_OBJS)
 src/demux/libwebpdemux.a: $(LIBWEBPDEMUX_OBJS)
+sharpyuv/libsharpyuv.a: $(LIBSHARPYUV_OBJS)
 
 %.a:
 	$(AR) $(ARFLAGS) $@ $^
 
 examples/anim_diff: examples/anim_diff.o $(ANIM_UTIL_OBJS) $(GIFDEC_OBJS)
-examples/anim_dump: examples/anim_dump.o $(ANIM_UTIL_OBJS)
+examples/anim_dump: examples/anim_dump.o $(ANIM_UTIL_OBJS) $(GIFDEC_OBJS)
 examples/cwebp: examples/cwebp.o
 examples/dwebp: examples/dwebp.o
 examples/gif2webp: examples/gif2webp.o $(GIFDEC_OBJS)
@@ -404,43 +423,51 @@
 examples/anim_diff: examples/libanim_util.a examples/libgifdec.a
 examples/anim_diff: src/demux/libwebpdemux.a examples/libexample_util.a
 examples/anim_diff: imageio/libimageio_util.a src/libwebp.a
-examples/anim_diff: EXTRA_LIBS += $(GIF_LIBS)
+examples/anim_diff: sharpyuv/libsharpyuv.a
+examples/anim_diff: override EXTRA_LIBS += $(GIF_LIBS)
 examples/anim_diff: EXTRA_FLAGS += -DWEBP_HAVE_GIF
-examples/anim_dump: examples/libanim_util.a
+examples/anim_dump: examples/libanim_util.a examples/libgifdec.a
 examples/anim_dump: src/demux/libwebpdemux.a
 examples/anim_dump: examples/libexample_util.a
 examples/anim_dump: imageio/libimageio_util.a
 examples/anim_dump: imageio/libimageenc.a
 examples/anim_dump: src/libwebp.a
-examples/anim_dump: EXTRA_LIBS += $(GIF_LIBS) $(DWEBP_LIBS)
+examples/anim_dump: sharpyuv/libsharpyuv.a
+examples/anim_dump: override EXTRA_LIBS += $(GIF_LIBS) $(DWEBP_LIBS)
 examples/cwebp: examples/libexample_util.a
 examples/cwebp: imageio/libimagedec.a
 examples/cwebp: src/demux/libwebpdemux.a
 examples/cwebp: imageio/libimageio_util.a
 examples/cwebp: src/libwebp.a
-examples/cwebp: EXTRA_LIBS += $(CWEBP_LIBS)
+examples/cwebp: sharpyuv/libsharpyuv.a
+examples/cwebp: override EXTRA_LIBS += $(CWEBP_LIBS)
 examples/dwebp: examples/libexample_util.a
 examples/dwebp: imageio/libimagedec.a
 examples/dwebp: src/demux/libwebpdemux.a
 examples/dwebp: imageio/libimageenc.a
 examples/dwebp: imageio/libimageio_util.a
 examples/dwebp: src/libwebp.a
-examples/dwebp: EXTRA_LIBS += $(DWEBP_LIBS)
+examples/dwebp: sharpyuv/libsharpyuv.a
+examples/dwebp: override EXTRA_LIBS += $(DWEBP_LIBS)
 examples/gif2webp: examples/libexample_util.a imageio/libimageio_util.a
 examples/gif2webp: examples/libgifdec.a src/mux/libwebpmux.a src/libwebp.a
-examples/gif2webp: EXTRA_LIBS += $(GIF_LIBS)
+examples/gif2webp: sharpyuv/libsharpyuv.a
+examples/gif2webp: override EXTRA_LIBS += $(GIF_LIBS)
 examples/gif2webp: EXTRA_FLAGS += -DWEBP_HAVE_GIF
 examples/vwebp: examples/libexample_util.a src/demux/libwebpdemux.a
 examples/vwebp: imageio/libimageio_util.a src/libwebp.a
-examples/vwebp: EXTRA_LIBS += $(GL_LIBS)
+examples/vwebp: sharpyuv/libsharpyuv.a
+examples/vwebp: override EXTRA_LIBS += $(GL_LIBS)
 examples/vwebp: EXTRA_FLAGS += -DWEBP_HAVE_GL
 examples/webpmux: examples/libexample_util.a imageio/libimageio_util.a
 examples/webpmux: src/mux/libwebpmux.a src/libwebpdecoder.a
 examples/img2webp: examples/libexample_util.a imageio/libimageio_util.a
 examples/img2webp: imageio/libimagedec.a
 examples/img2webp: src/demux/libwebpdemux.a
-examples/img2webp: src/mux/libwebpmux.a src/libwebp.a
-examples/img2webp: EXTRA_LIBS += $(CWEBP_LIBS)
+examples/img2webp: src/mux/libwebpmux.a
+examples/img2webp: src/libwebp.a
+examples/img2webp: sharpyuv/libsharpyuv.a
+examples/img2webp: override EXTRA_LIBS += $(CWEBP_LIBS)
 examples/webpinfo: examples/libexample_util.a imageio/libimageio_util.a
 examples/webpinfo: src/libwebpdecoder.a
 
@@ -449,18 +476,21 @@
 extras/get_disto: src/demux/libwebpdemux.a
 extras/get_disto: imageio/libimageio_util.a
 extras/get_disto: src/libwebp.a
-extras/get_disto: EXTRA_LIBS += $(CWEBP_LIBS)
+extras/get_disto: sharpyuv/libsharpyuv.a
+extras/get_disto: override EXTRA_LIBS += $(CWEBP_LIBS)
 
 extras/webp_quality: extras/webp_quality.o
 extras/webp_quality: imageio/libimageio_util.a
 extras/webp_quality: $(EXTRA_LIB) src/libwebp.a
+extras/webp_quality: sharpyuv/libsharpyuv.a
 
 extras/vwebp_sdl: extras/vwebp_sdl.o
 extras/vwebp_sdl: extras/webp_to_sdl.o
 extras/vwebp_sdl: imageio/libimageio_util.a
 extras/vwebp_sdl: src/libwebp.a
+extras/vwebp_sdl: sharpyuv/libsharpyuv.a
 extras/vwebp_sdl: EXTRA_FLAGS += -DWEBP_HAVE_SDL $(SDL_FLAGS)
-extras/vwebp_sdl: EXTRA_LIBS += $(SDL_LIBS)
+extras/vwebp_sdl: override EXTRA_LIBS += $(SDL_LIBS)
 
 $(OUT_EXAMPLES) $(EXTRA_EXAMPLES) $(OTHER_EXAMPLES):
 	$(CC) -o $@ $^ $(LDFLAGS)
@@ -469,12 +499,15 @@
 dist: OUT_EXAMPLES += $(EXTRA_EXAMPLES)
 dist: all
 	$(INSTALL) -m755 -d $(DESTDIR)/include/webp \
-	           $(DESTDIR)/bin $(DESTDIR)/doc $(DESTDIR)/lib
+	            $(DESTDIR)/include/webp/sharpyuv \
+	            $(DESTDIR)/bin $(DESTDIR)/doc $(DESTDIR)/lib
 	$(INSTALL) -m755 -s $(OUT_EXAMPLES) $(DESTDIR)/bin
 	$(INSTALL) -m644 $(HDRS_INSTALLED) $(DESTDIR)/include/webp
+	$(INSTALL) -m644 $(SHARPYUV_HDRS_INSTALLED) $(DESTDIR)/include/webp/sharpyuv
 	$(INSTALL) -m644 src/libwebp.a $(DESTDIR)/lib
 	$(INSTALL) -m644 src/demux/libwebpdemux.a $(DESTDIR)/lib
 	$(INSTALL) -m644 src/mux/libwebpmux.a $(DESTDIR)/lib
+	$(INSTALL) -m644 sharpyuv/libsharpyuv.a $(DESTDIR)/lib
 	umask 022; \
 	for m in man/[cdv]webp.1 man/gif2webp.1 man/webpmux.1 \
                  man/img2webp.1 man/webpinfo.1; do \
@@ -490,6 +523,7 @@
               examples/*.o examples/*~ \
               extras/*.o extras/*~ \
               imageio/*.o imageio/*~ \
+              sharpyuv/*.o sharpyuv/*~ \
               src/dec/*.o src/dec/*~ \
               src/demux/*.o src/demux/*~ \
               src/dsp/*.o src/dsp/*~ \
diff --git a/third_party/libwebp/man/Makefile.am b/third_party/libwebp/man/Makefile.am
index a7ef77f..57e2483 100644
--- a/third_party/libwebp/man/Makefile.am
+++ b/third_party/libwebp/man/Makefile.am
@@ -1,10 +1,13 @@
 man_MANS = cwebp.1 dwebp.1
-if WANT_MUX
+if BUILD_MUX
   man_MANS += webpmux.1
 endif
 if BUILD_GIF2WEBP
   man_MANS += gif2webp.1
 endif
+if BUILD_IMG2WEBP
+  man_MANS += img2webp.1
+endif
 if BUILD_VWEBP
   man_MANS += vwebp.1
 endif
diff --git a/third_party/libwebp/man/cwebp.1 b/third_party/libwebp/man/cwebp.1
index c943324..28de4c9 100644
--- a/third_party/libwebp/man/cwebp.1
+++ b/third_party/libwebp/man/cwebp.1
@@ -1,5 +1,5 @@
 .\"                                      Hey, EMACS: -*- nroff -*-
-.TH CWEBP 1 "January 20, 2017"
+.TH CWEBP 1 "March 17, 2022"
 .SH NAME
 cwebp \- compress an image file to a WebP file
 .SH SYNOPSIS
@@ -13,6 +13,7 @@
 .PP
 \fBcwebp\fP compresses an image using the WebP format.
 Input format can be either PNG, JPEG, TIFF, WebP or raw Y'CbCr samples.
+Note: Animated PNG and WebP files are not supported.
 .SH OPTIONS
 The basic options are:
 .TP
@@ -41,10 +42,12 @@
 \-exact option is used.
 .TP
 .BI \-near_lossless " int
-Use near\-lossless image preprocessing. This option adjusts pixel values
-to help compressibility, but has minimal impact on the visual quality.
-It triggers lossless compression mode automatically.
-Range is 0 (maximum preprocessing) to 100 (no preprocessing, the default).
+Specify the level of near\-lossless image preprocessing. This option adjusts
+pixel values to help compressibility, but has minimal impact on the visual
+quality. It triggers lossless compression mode automatically. The range is 0
+(maximum preprocessing) to 100 (no preprocessing, the default). The typical
+value is around 60. Note that lossy with \fB\-q 100\fP can at times yield
+better results.
 .TP
 .BI \-q " float
 Specify the compression factor for RGB channels between 0 and 100. The default
@@ -87,15 +90,17 @@
 Lower value can result in faster processing time at the expense of
 larger file size and lower compression quality.
 .TP
-.BI \-resize " width height
-Resize the source to a rectangle with size \fBwidth\fP x \fBheight\fP.
-If either (but not both) of the \fBwidth\fP or \fBheight\fP parameters is 0,
-the value will be calculated preserving the aspect\-ratio.
-.TP
 .BI \-crop " x_position y_position width height
 Crop the source to a rectangle with top\-left corner at coordinates
 (\fBx_position\fP, \fBy_position\fP) and size \fBwidth\fP x \fBheight\fP.
 This cropping area must be fully contained within the source rectangle.
+Note: the cropping is applied \fIbefore\fP any scaling.
+.TP
+.BI \-resize " width height
+Resize the source to a rectangle with size \fBwidth\fP x \fBheight\fP.
+If either (but not both) of the \fBwidth\fP or \fBheight\fP parameters is 0,
+the value will be calculated preserving the aspect\-ratio. Note: scaling
+is applied \fIafter\fP cropping.
 .TP
 .B \-mt
 Use multi\-threading for encoding, if possible.
@@ -132,6 +137,13 @@
 If options \fB\-size\fP or \fB\-psnr\fP were used, but \fB\-pass\fP wasn't
 specified, a default value of '6' passes will be used.
 .TP
+.BI \-qrange " int int
+Specifies the permissible interval for the quality factor. This is particularly
+useful when using multi-pass (\fB\-size\fP or \fB\-psnr\fP options).
+Default is 0 100.
+If the quality factor is outside this range, it will be clamped.
+If the minimum value must be less or equal to the maximum one.
+.TP
 .B \-af
 Turns auto\-filter on. This algorithm will spend additional time optimizing
 the filtering strength to reach a well\-balanced quality.
@@ -212,7 +224,7 @@
 .TP
 .B \-print_ssim
 Compute and report average SSIM (structural similarity
-metric, see http://en.wikipedia.org/wiki/SSIM for additional details).
+metric, see https://en.wikipedia.org/wiki/SSIM for additional details).
 .TP
 .B \-print_lsim
 Compute and report local similarity metric (sum of lowest error amongst the
@@ -288,7 +300,7 @@
 https://bugs.chromium.org/p/webp
 .br
 Patches welcome! See this page to get started:
-http://www.webmproject.org/code/contribute/submitting\-patches/
+https://www.webmproject.org/code/contribute/submitting\-patches/
 
 .SH EXAMPLES
 cwebp \-q 50 -lossless picture.png \-o picture_lossless.webp
@@ -312,5 +324,5 @@
 .BR dwebp (1),
 .BR gif2webp (1)
 .br
-Please refer to http://developers.google.com/speed/webp/ for additional
+Please refer to https://developers.google.com/speed/webp/ for additional
 information.
diff --git a/third_party/libwebp/man/dwebp.1 b/third_party/libwebp/man/dwebp.1
index d4b60ed..e718aba 100644
--- a/third_party/libwebp/man/dwebp.1
+++ b/third_party/libwebp/man/dwebp.1
@@ -1,5 +1,5 @@
 .\"                                      Hey, EMACS: -*- nroff -*-
-.TH DWEBP 1 "June 23, 2016"
+.TH DWEBP 1 "November 17, 2021"
 .SH NAME
 dwebp \- decompress a WebP file to an image file
 .SH SYNOPSIS
@@ -12,6 +12,7 @@
 command.
 .PP
 \fBdwebp\fP decompresses WebP files into PNG, PAM, PPM or PGM images.
+Note: Animated WebP files are not supported.
 .SH OPTIONS
 The basic options are:
 .TP
@@ -112,7 +113,7 @@
 https://bugs.chromium.org/p/webp
 .br
 Patches welcome! See this page to get started:
-http://www.webmproject.org/code/contribute/submitting-patches/
+https://www.webmproject.org/code/contribute/submitting\-patches/
 
 .SH EXAMPLES
 dwebp picture.webp \-o output.png
@@ -137,7 +138,7 @@
 .BR gif2webp (1),
 .BR webpmux (1)
 .br
-Please refer to http://developers.google.com/speed/webp/ for additional
+Please refer to https://developers.google.com/speed/webp/ for additional
 information.
 .SS Output file format details
 PAM: http://netpbm.sourceforge.net/doc/pam.html
diff --git a/third_party/libwebp/man/gif2webp.1 b/third_party/libwebp/man/gif2webp.1
index a94f2ee..3bf43bc 100644
--- a/third_party/libwebp/man/gif2webp.1
+++ b/third_party/libwebp/man/gif2webp.1
@@ -1,5 +1,5 @@
 .\"                                      Hey, EMACS: -*- nroff -*-
-.TH GIF2WEBP 1 "January 25, 2018"
+.TH GIF2WEBP 1 "November 17, 2021"
 .SH NAME
 gif2webp \- Convert a GIF image to WebP
 .SH SYNOPSIS
@@ -62,9 +62,9 @@
 .TP
 .BI \-min_size
 Encode image to achieve smallest size. This disables key frame insertion and
-picks the dispose method resulting in smallest output for each frame. It uses
-lossless compression by default, but can be combined with \-q, \-m, \-lossy or
-\-mixed options.
+picks the dispose method resulting in the smallest output for each frame. It
+uses lossless compression by default, but can be combined with \-q, \-m,
+\-lossy or \-mixed options.
 .TP
 .BI \-kmin " int
 .TP
@@ -131,7 +131,7 @@
 https://bugs.chromium.org/p/webp
 .br
 Patches welcome! See this page to get started:
-http://www.webmproject.org/code/contribute/submitting-patches/
+https://www.webmproject.org/code/contribute/submitting\-patches/
 
 .SH EXAMPLES
 gif2webp picture.gif \-o picture.webp
@@ -160,5 +160,5 @@
 .BR dwebp (1),
 .BR webpmux (1)
 .br
-Please refer to http://developers.google.com/speed/webp/ for additional
+Please refer to https://developers.google.com/speed/webp/ for additional
 information.
diff --git a/third_party/libwebp/man/img2webp.1 b/third_party/libwebp/man/img2webp.1
index da1d91d..fc493e1 100644
--- a/third_party/libwebp/man/img2webp.1
+++ b/third_party/libwebp/man/img2webp.1
@@ -1,10 +1,10 @@
 .\"                                      Hey, EMACS: -*- nroff -*-
-.TH IMG2WEBP 1 "April 3, 2018"
+.TH IMG2WEBP 1 "March 17, 2023"
 .SH NAME
 img2webp \- create animated WebP file from a sequence of input images.
 .SH SYNOPSIS
 .B img2webp
-[file_level_options] [files] [per_frame_options...]
+[file_options] [[frame_options] frame_file]... [\-o webp_file]
 .br
 .B img2webp argument_file_name
 .br
@@ -16,8 +16,8 @@
 \fBimg2webp\fP compresses a sequence of images using the animated WebP format.
 Input images can either be PNG, JPEG, TIFF or WebP.
 If a single file name (not starting with the character '\-') is supplied as
-the argument, the command line argument are actually tokenized from this file.
-This allows for easy scripting or using large number of arguments.
+the argument, the command line arguments are actually tokenized from this file.
+This allows for easy scripting or using a large number of arguments.
 .SH FILE-LEVEL OPTIONS
 The file-level options are applied at the beginning of the compression process,
 before the input frames are read.
@@ -27,7 +27,7 @@
 .TP
 .BI \-min_size
 Encode images to achieve smallest size. This disables key frame insertion and
-picks the parameters resulting in smallest output for each frame. It uses
+picks the parameters resulting in the smallest output for each frame. It uses
 lossless compression by default, but can be combined with \-q, \-m, \-lossy or
 \-mixed options.
 .TP
@@ -44,6 +44,18 @@
 lossy or lossless compression for each frame heuristically. This global
 option disables the local option \fB-lossy\fP and \fB-lossless\fP .
 .TP
+.BI \-near_lossless " int
+Specify the level of near\-lossless image preprocessing. This option adjusts
+pixel values to help compressibility, but has minimal impact on the visual
+quality. It triggers lossless compression mode automatically. The range is 0
+(maximum preprocessing) to 100 (no preprocessing, the default). The typical
+value is around 60. Note that lossy with \fB\-q 100\fP can at times yield
+better results.
+.TP
+.B \-sharp_yuv
+Use more accurate and sharper RGB->YUV conversion if needed. Note that this
+process is slower than the default 'fast' RGB->YUV conversion.
+.TP
 .BI \-loop " int
 Specifies the number of times the animation should loop. Using '0'
 means 'loop indefinitely'.
@@ -86,7 +98,7 @@
 https://bugs.chromium.org/p/webp
 .br
 Patches welcome! See this page to get started:
-http://www.webmproject.org/code/contribute/submitting\-patches/
+https://www.webmproject.org/code/contribute/submitting\-patches/
 
 .SH AUTHORS
 \fBimg2webp\fP is a part of libwebp and was written by the WebP team.
@@ -101,5 +113,5 @@
 .BR webpmux (1),
 .BR gif2webp (1)
 .br
-Please refer to http://developers.google.com/speed/webp/ for additional
+Please refer to https://developers.google.com/speed/webp/ for additional
 information.
diff --git a/third_party/libwebp/man/vwebp.1 b/third_party/libwebp/man/vwebp.1
index 4ec346a..fa48db6 100644
--- a/third_party/libwebp/man/vwebp.1
+++ b/third_party/libwebp/man/vwebp.1
@@ -1,5 +1,5 @@
 .\"                                      Hey, EMACS: -*- nroff -*-
-.TH VWEBP 1 "November 25, 2016"
+.TH VWEBP 1 "November 17, 2021"
 .SH NAME
 vwebp \- decompress a WebP file and display it in a window
 .SH SYNOPSIS
@@ -38,6 +38,10 @@
 By default, quantized transparency planes are dithered during decompression,
 to smooth the gradients. This flag will prevent this dithering.
 .TP
+.B \-usebgcolor
+Fill transparent areas with the bitstream's own background color instead of
+checkerboard only. Default is white for non-animated images.
+.TP
 .B \-mt
 Use multi-threading for decoding, if possible.
 .TP
@@ -56,6 +60,9 @@
 .B 'c'
 Toggle use of color profile.
 .TP
+.B 'b'
+Toggle display of background color.
+.TP
 .B 'i'
 Overlay file information.
 .TP
@@ -70,7 +77,7 @@
 https://bugs.chromium.org/p/webp
 .br
 Patches welcome! See this page to get started:
-http://www.webmproject.org/code/contribute/submitting-patches/
+https://www.webmproject.org/code/contribute/submitting\-patches/
 
 .SH EXAMPLES
 vwebp picture.webp
@@ -90,5 +97,5 @@
 .SH SEE ALSO
 .BR dwebp (1)
 .br
-Please refer to http://developers.google.com/speed/webp/ for additional
+Please refer to https://developers.google.com/speed/webp/ for additional
 information.
diff --git a/third_party/libwebp/man/webpinfo.1 b/third_party/libwebp/man/webpinfo.1
index 902ba9e..35d6d92 100644
--- a/third_party/libwebp/man/webpinfo.1
+++ b/third_party/libwebp/man/webpinfo.1
@@ -1,5 +1,5 @@
 .\"                                      Hey, EMACS: -*- nroff -*-
-.TH WEBPINFO 1 "November 24, 2017"
+.TH WEBPINFO 1 "November 17, 2021"
 .SH NAME
 webpinfo \- print out the chunk level structure of WebP files
 along with basic integrity checks.
@@ -52,7 +52,7 @@
 https://bugs.chromium.org/p/webp
 .br
 Patches welcome! See this page to get started:
-http://www.webmproject.org/code/contribute/submitting\-patches/
+https://www.webmproject.org/code/contribute/submitting\-patches/
 
 .SH EXAMPLES
 .br
@@ -76,5 +76,5 @@
 .SH SEE ALSO
 .BR webpmux (1)
 .br
-Please refer to http://developers.google.com/speed/webp/ for additional
+Please refer to https://developers.google.com/speed/webp/ for additional
 information.
diff --git a/third_party/libwebp/man/webpmux.1 b/third_party/libwebp/man/webpmux.1
index eb41a61..07e8738 100644
--- a/third_party/libwebp/man/webpmux.1
+++ b/third_party/libwebp/man/webpmux.1
@@ -1,5 +1,5 @@
 .\"                                      Hey, EMACS: -*- nroff -*-
-.TH WEBPMUX 1 "December 1, 2017"
+.TH WEBPMUX 1 "November 17, 2021"
 .SH NAME
 webpmux \- create animated WebP files from non\-animated WebP images, extract
 frames from animated WebP images, and manage XMP/EXIF metadata and ICC profile.
@@ -58,8 +58,8 @@
 \fBwebpmux\fP can be used to create/extract from animated WebP files, as well as
 to add/extract/strip XMP/EXIF metadata and ICC profile.
 If a single file name (not starting with the character '\-') is supplied as
-the argument, the command line argument are actually tokenized from this file.
-This allows for easy scripting or using large number of arguments.
+the argument, the command line arguments are actually tokenized from this file.
+This allows for easy scripting or using a large number of arguments.
 .SH OPTIONS
 .SS GET_OPTIONS (\-get):
 .TP
@@ -77,6 +77,17 @@
 
 .SS SET_OPTIONS (\-set)
 .TP
+.BI loop " loop_count
+Set loop count on an animated file.
+.P
+Where: 'loop_count' must be in range [0, 65535].
+.TP
+.BI bgcolor " A,R,G,B
+Set the background color of the canvas on an animated file.
+.P
+where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255 specifying the
+Alpha, Red, Green and Blue component values respectively.
+.TP
 .BI icc " file.icc
 Set ICC profile.
 .P
@@ -180,7 +191,7 @@
 https://bugs.chromium.org/p/webp
 .br
 Patches welcome! See this page to get started:
-http://www.webmproject.org/code/contribute/submitting\-patches/
+https://www.webmproject.org/code/contribute/submitting\-patches/
 
 .SH EXAMPLES
 .P
@@ -256,5 +267,5 @@
 .BR dwebp (1),
 .BR gif2webp (1)
 .br
-Please refer to http://developers.google.com/speed/webp/ for additional
+Please refer to https://developers.google.com/speed/webp/ for additional
 information.
diff --git a/third_party/libwebp/sharpyuv/Makefile.am b/third_party/libwebp/sharpyuv/Makefile.am
new file mode 100644
index 0000000..8d9ba7c
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/Makefile.am
@@ -0,0 +1,41 @@
+AM_CPPFLAGS += -I$(top_builddir) -I$(top_srcdir)
+AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_srcdir)/src
+
+lib_LTLIBRARIES = libsharpyuv.la
+
+noinst_LTLIBRARIES =
+noinst_LTLIBRARIES += libsharpyuv_sse2.la
+noinst_LTLIBRARIES += libsharpyuv_neon.la
+
+libsharpyuvinclude_HEADERS =
+libsharpyuvinclude_HEADERS += sharpyuv.h
+libsharpyuvinclude_HEADERS += sharpyuv_csp.h
+noinst_HEADERS =
+noinst_HEADERS += ../src/dsp/cpu.c
+noinst_HEADERS += ../src/dsp/cpu.h
+noinst_HEADERS += ../src/webp/types.h
+
+libsharpyuv_sse2_la_SOURCES =
+libsharpyuv_sse2_la_SOURCES += sharpyuv_sse2.c
+libsharpyuv_sse2_la_CPPFLAGS = $(libsharpyuv_la_CPPFLAGS)
+libsharpyuv_sse2_la_CFLAGS = $(AM_CFLAGS) $(SSE2_FLAGS)
+
+libsharpyuv_neon_la_SOURCES =
+libsharpyuv_neon_la_SOURCES += sharpyuv_neon.c
+libsharpyuv_neon_la_CPPFLAGS = $(libsharpyuv_la_CPPFLAGS)
+libsharpyuv_neon_la_CFLAGS = $(AM_CFLAGS) $(NEON_FLAGS)
+
+libsharpyuv_la_SOURCES =
+libsharpyuv_la_SOURCES += sharpyuv_cpu.c sharpyuv_cpu.h
+libsharpyuv_la_SOURCES += sharpyuv_csp.c sharpyuv_csp.h
+libsharpyuv_la_SOURCES += sharpyuv_dsp.c sharpyuv_dsp.h
+libsharpyuv_la_SOURCES += sharpyuv_gamma.c sharpyuv_gamma.h
+libsharpyuv_la_SOURCES += sharpyuv.c sharpyuv.h
+
+libsharpyuv_la_CPPFLAGS = $(AM_CPPFLAGS)
+libsharpyuv_la_LDFLAGS = -no-undefined -version-info 0:1:0 -lm
+libsharpyuv_la_LIBADD =
+libsharpyuv_la_LIBADD += libsharpyuv_sse2.la
+libsharpyuv_la_LIBADD += libsharpyuv_neon.la
+libsharpyuvincludedir = $(includedir)/webp/sharpyuv
+pkgconfig_DATA = libsharpyuv.pc
diff --git a/third_party/libwebp/sharpyuv/libsharpyuv.pc.in b/third_party/libwebp/sharpyuv/libsharpyuv.pc.in
new file mode 100644
index 0000000..0fb565a
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/libsharpyuv.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/webp
+
+Name: libsharpyuv
+Description: Library for sharp RGB to YUV conversion
+Version: @PACKAGE_VERSION@
+Cflags: -I${includedir}
+Libs: -L${libdir} -l@webp_libname_prefix@sharpyuv
+Libs.private: -lm @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
diff --git a/third_party/libwebp/sharpyuv/libsharpyuv.rc b/third_party/libwebp/sharpyuv/libsharpyuv.rc
new file mode 100644
index 0000000..49c338a
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/libsharpyuv.rc
@@ -0,0 +1,41 @@
+#define APSTUDIO_READONLY_SYMBOLS
+#include "winres.h"
+#undef APSTUDIO_READONLY_SYMBOLS
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 0,0,2,1
+ PRODUCTVERSION 0,0,2,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "CompanyName", "Google, Inc."
+            VALUE "FileDescription", "libsharpyuv DLL"
+            VALUE "FileVersion", "0.2.1"
+            VALUE "InternalName", "libsharpyuv.dll"
+            VALUE "LegalCopyright", "Copyright (C) 2023"
+            VALUE "OriginalFilename", "libsharpyuv.dll"
+            VALUE "ProductName", "SharpYuv Library"
+            VALUE "ProductVersion", "0.2.1"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+#endif    // English (United States) resources
diff --git a/third_party/libwebp/sharpyuv/sharpyuv.c b/third_party/libwebp/sharpyuv/sharpyuv.c
new file mode 100644
index 0000000..a074564
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/sharpyuv.c
@@ -0,0 +1,527 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Sharp RGB to YUV conversion.
+//
+// Author: Skal (pascal.massimino@gmail.com)
+
+#include "sharpyuv/sharpyuv.h"
+
+#include <assert.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "src/webp/types.h"
+#include "sharpyuv/sharpyuv_cpu.h"
+#include "sharpyuv/sharpyuv_dsp.h"
+#include "sharpyuv/sharpyuv_gamma.h"
+
+//------------------------------------------------------------------------------
+
+int SharpYuvGetVersion(void) {
+  return SHARPYUV_VERSION;
+}
+
+//------------------------------------------------------------------------------
+// Sharp RGB->YUV conversion
+
+static const int kNumIterations = 4;
+
+#define YUV_FIX 16  // fixed-point precision for RGB->YUV
+static const int kYuvHalf = 1 << (YUV_FIX - 1);
+
+// Max bit depth so that intermediate calculations fit in 16 bits.
+static const int kMaxBitDepth = 14;
+
+// Returns the precision shift to use based on the input rgb_bit_depth.
+static int GetPrecisionShift(int rgb_bit_depth) {
+  // Try to add 2 bits of precision if it fits in kMaxBitDepth. Otherwise remove
+  // bits if needed.
+  return ((rgb_bit_depth + 2) <= kMaxBitDepth) ? 2
+                                               : (kMaxBitDepth - rgb_bit_depth);
+}
+
+typedef int16_t fixed_t;      // signed type with extra precision for UV
+typedef uint16_t fixed_y_t;   // unsigned type with extra precision for W
+
+//------------------------------------------------------------------------------
+
+static uint8_t clip_8b(fixed_t v) {
+  return (!(v & ~0xff)) ? (uint8_t)v : (v < 0) ? 0u : 255u;
+}
+
+static uint16_t clip(fixed_t v, int max) {
+  return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v;
+}
+
+static fixed_y_t clip_bit_depth(int y, int bit_depth) {
+  const int max = (1 << bit_depth) - 1;
+  return (!(y & ~max)) ? (fixed_y_t)y : (y < 0) ? 0 : max;
+}
+
+//------------------------------------------------------------------------------
+
+static int RGBToGray(int64_t r, int64_t g, int64_t b) {
+  const int64_t luma = 13933 * r + 46871 * g + 4732 * b + kYuvHalf;
+  return (int)(luma >> YUV_FIX);
+}
+
+static uint32_t ScaleDown(uint16_t a, uint16_t b, uint16_t c, uint16_t d,
+                          int rgb_bit_depth) {
+  const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth);
+  const uint32_t A = SharpYuvGammaToLinear(a, bit_depth);
+  const uint32_t B = SharpYuvGammaToLinear(b, bit_depth);
+  const uint32_t C = SharpYuvGammaToLinear(c, bit_depth);
+  const uint32_t D = SharpYuvGammaToLinear(d, bit_depth);
+  return SharpYuvLinearToGamma((A + B + C + D + 2) >> 2, bit_depth);
+}
+
+static WEBP_INLINE void UpdateW(const fixed_y_t* src, fixed_y_t* dst, int w,
+                                int rgb_bit_depth) {
+  const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth);
+  int i;
+  for (i = 0; i < w; ++i) {
+    const uint32_t R = SharpYuvGammaToLinear(src[0 * w + i], bit_depth);
+    const uint32_t G = SharpYuvGammaToLinear(src[1 * w + i], bit_depth);
+    const uint32_t B = SharpYuvGammaToLinear(src[2 * w + i], bit_depth);
+    const uint32_t Y = RGBToGray(R, G, B);
+    dst[i] = (fixed_y_t)SharpYuvLinearToGamma(Y, bit_depth);
+  }
+}
+
+static void UpdateChroma(const fixed_y_t* src1, const fixed_y_t* src2,
+                         fixed_t* dst, int uv_w, int rgb_bit_depth) {
+  int i;
+  for (i = 0; i < uv_w; ++i) {
+    const int r =
+        ScaleDown(src1[0 * uv_w + 0], src1[0 * uv_w + 1], src2[0 * uv_w + 0],
+                  src2[0 * uv_w + 1], rgb_bit_depth);
+    const int g =
+        ScaleDown(src1[2 * uv_w + 0], src1[2 * uv_w + 1], src2[2 * uv_w + 0],
+                  src2[2 * uv_w + 1], rgb_bit_depth);
+    const int b =
+        ScaleDown(src1[4 * uv_w + 0], src1[4 * uv_w + 1], src2[4 * uv_w + 0],
+                  src2[4 * uv_w + 1], rgb_bit_depth);
+    const int W = RGBToGray(r, g, b);
+    dst[0 * uv_w] = (fixed_t)(r - W);
+    dst[1 * uv_w] = (fixed_t)(g - W);
+    dst[2 * uv_w] = (fixed_t)(b - W);
+    dst  += 1;
+    src1 += 2;
+    src2 += 2;
+  }
+}
+
+static void StoreGray(const fixed_y_t* rgb, fixed_y_t* y, int w) {
+  int i;
+  assert(w > 0);
+  for (i = 0; i < w; ++i) {
+    y[i] = RGBToGray(rgb[0 * w + i], rgb[1 * w + i], rgb[2 * w + i]);
+  }
+}
+
+//------------------------------------------------------------------------------
+
+static WEBP_INLINE fixed_y_t Filter2(int A, int B, int W0, int bit_depth) {
+  const int v0 = (A * 3 + B + 2) >> 2;
+  return clip_bit_depth(v0 + W0, bit_depth);
+}
+
+//------------------------------------------------------------------------------
+
+static WEBP_INLINE int Shift(int v, int shift) {
+  return (shift >= 0) ? (v << shift) : (v >> -shift);
+}
+
+static void ImportOneRow(const uint8_t* const r_ptr,
+                         const uint8_t* const g_ptr,
+                         const uint8_t* const b_ptr,
+                         int rgb_step,
+                         int rgb_bit_depth,
+                         int pic_width,
+                         fixed_y_t* const dst) {
+  // Convert the rgb_step from a number of bytes to a number of uint8_t or
+  // uint16_t values depending the bit depth.
+  const int step = (rgb_bit_depth > 8) ? rgb_step / 2 : rgb_step;
+  int i;
+  const int w = (pic_width + 1) & ~1;
+  for (i = 0; i < pic_width; ++i) {
+    const int off = i * step;
+    const int shift = GetPrecisionShift(rgb_bit_depth);
+    if (rgb_bit_depth == 8) {
+      dst[i + 0 * w] = Shift(r_ptr[off], shift);
+      dst[i + 1 * w] = Shift(g_ptr[off], shift);
+      dst[i + 2 * w] = Shift(b_ptr[off], shift);
+    } else {
+      dst[i + 0 * w] = Shift(((uint16_t*)r_ptr)[off], shift);
+      dst[i + 1 * w] = Shift(((uint16_t*)g_ptr)[off], shift);
+      dst[i + 2 * w] = Shift(((uint16_t*)b_ptr)[off], shift);
+    }
+  }
+  if (pic_width & 1) {  // replicate rightmost pixel
+    dst[pic_width + 0 * w] = dst[pic_width + 0 * w - 1];
+    dst[pic_width + 1 * w] = dst[pic_width + 1 * w - 1];
+    dst[pic_width + 2 * w] = dst[pic_width + 2 * w - 1];
+  }
+}
+
+static void InterpolateTwoRows(const fixed_y_t* const best_y,
+                               const fixed_t* prev_uv,
+                               const fixed_t* cur_uv,
+                               const fixed_t* next_uv,
+                               int w,
+                               fixed_y_t* out1,
+                               fixed_y_t* out2,
+                               int rgb_bit_depth) {
+  const int uv_w = w >> 1;
+  const int len = (w - 1) >> 1;   // length to filter
+  int k = 3;
+  const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth);
+  while (k-- > 0) {   // process each R/G/B segments in turn
+    // special boundary case for i==0
+    out1[0] = Filter2(cur_uv[0], prev_uv[0], best_y[0], bit_depth);
+    out2[0] = Filter2(cur_uv[0], next_uv[0], best_y[w], bit_depth);
+
+    SharpYuvFilterRow(cur_uv, prev_uv, len, best_y + 0 + 1, out1 + 1,
+                      bit_depth);
+    SharpYuvFilterRow(cur_uv, next_uv, len, best_y + w + 1, out2 + 1,
+                      bit_depth);
+
+    // special boundary case for i == w - 1 when w is even
+    if (!(w & 1)) {
+      out1[w - 1] = Filter2(cur_uv[uv_w - 1], prev_uv[uv_w - 1],
+                            best_y[w - 1 + 0], bit_depth);
+      out2[w - 1] = Filter2(cur_uv[uv_w - 1], next_uv[uv_w - 1],
+                            best_y[w - 1 + w], bit_depth);
+    }
+    out1 += w;
+    out2 += w;
+    prev_uv += uv_w;
+    cur_uv  += uv_w;
+    next_uv += uv_w;
+  }
+}
+
+static WEBP_INLINE int RGBToYUVComponent(int r, int g, int b,
+                                         const int coeffs[4], int sfix) {
+  const int srounder = 1 << (YUV_FIX + sfix - 1);
+  const int luma = coeffs[0] * r + coeffs[1] * g + coeffs[2] * b +
+                   coeffs[3] + srounder;
+  return (luma >> (YUV_FIX + sfix));
+}
+
+static int ConvertWRGBToYUV(const fixed_y_t* best_y, const fixed_t* best_uv,
+                            uint8_t* y_ptr, int y_stride, uint8_t* u_ptr,
+                            int u_stride, uint8_t* v_ptr, int v_stride,
+                            int rgb_bit_depth,
+                            int yuv_bit_depth, int width, int height,
+                            const SharpYuvConversionMatrix* yuv_matrix) {
+  int i, j;
+  const fixed_t* const best_uv_base = best_uv;
+  const int w = (width + 1) & ~1;
+  const int h = (height + 1) & ~1;
+  const int uv_w = w >> 1;
+  const int uv_h = h >> 1;
+  const int sfix = GetPrecisionShift(rgb_bit_depth);
+  const int yuv_max = (1 << yuv_bit_depth) - 1;
+
+  for (best_uv = best_uv_base, j = 0; j < height; ++j) {
+    for (i = 0; i < width; ++i) {
+      const int off = (i >> 1);
+      const int W = best_y[i];
+      const int r = best_uv[off + 0 * uv_w] + W;
+      const int g = best_uv[off + 1 * uv_w] + W;
+      const int b = best_uv[off + 2 * uv_w] + W;
+      const int y = RGBToYUVComponent(r, g, b, yuv_matrix->rgb_to_y, sfix);
+      if (yuv_bit_depth <= 8) {
+        y_ptr[i] = clip_8b(y);
+      } else {
+        ((uint16_t*)y_ptr)[i] = clip(y, yuv_max);
+      }
+    }
+    best_y += w;
+    best_uv += (j & 1) * 3 * uv_w;
+    y_ptr += y_stride;
+  }
+  for (best_uv = best_uv_base, j = 0; j < uv_h; ++j) {
+    for (i = 0; i < uv_w; ++i) {
+      const int off = i;
+      // Note r, g and b values here are off by W, but a constant offset on all
+      // 3 components doesn't change the value of u and v with a YCbCr matrix.
+      const int r = best_uv[off + 0 * uv_w];
+      const int g = best_uv[off + 1 * uv_w];
+      const int b = best_uv[off + 2 * uv_w];
+      const int u = RGBToYUVComponent(r, g, b, yuv_matrix->rgb_to_u, sfix);
+      const int v = RGBToYUVComponent(r, g, b, yuv_matrix->rgb_to_v, sfix);
+      if (yuv_bit_depth <= 8) {
+        u_ptr[i] = clip_8b(u);
+        v_ptr[i] = clip_8b(v);
+      } else {
+        ((uint16_t*)u_ptr)[i] = clip(u, yuv_max);
+        ((uint16_t*)v_ptr)[i] = clip(v, yuv_max);
+      }
+    }
+    best_uv += 3 * uv_w;
+    u_ptr += u_stride;
+    v_ptr += v_stride;
+  }
+  return 1;
+}
+
+//------------------------------------------------------------------------------
+// Main function
+
+static void* SafeMalloc(uint64_t nmemb, size_t size) {
+  const uint64_t total_size = nmemb * (uint64_t)size;
+  if (total_size != (size_t)total_size) return NULL;
+  return malloc((size_t)total_size);
+}
+
+#define SAFE_ALLOC(W, H, T) ((T*)SafeMalloc((W) * (H), sizeof(T)))
+
+static int DoSharpArgbToYuv(const uint8_t* r_ptr, const uint8_t* g_ptr,
+                            const uint8_t* b_ptr, int rgb_step, int rgb_stride,
+                            int rgb_bit_depth, uint8_t* y_ptr, int y_stride,
+                            uint8_t* u_ptr, int u_stride, uint8_t* v_ptr,
+                            int v_stride, int yuv_bit_depth, int width,
+                            int height,
+                            const SharpYuvConversionMatrix* yuv_matrix) {
+  // we expand the right/bottom border if needed
+  const int w = (width + 1) & ~1;
+  const int h = (height + 1) & ~1;
+  const int uv_w = w >> 1;
+  const int uv_h = h >> 1;
+  uint64_t prev_diff_y_sum = ~0;
+  int j, iter;
+
+  // TODO(skal): allocate one big memory chunk. But for now, it's easier
+  // for valgrind debugging to have several chunks.
+  fixed_y_t* const tmp_buffer = SAFE_ALLOC(w * 3, 2, fixed_y_t);   // scratch
+  fixed_y_t* const best_y_base = SAFE_ALLOC(w, h, fixed_y_t);
+  fixed_y_t* const target_y_base = SAFE_ALLOC(w, h, fixed_y_t);
+  fixed_y_t* const best_rgb_y = SAFE_ALLOC(w, 2, fixed_y_t);
+  fixed_t* const best_uv_base = SAFE_ALLOC(uv_w * 3, uv_h, fixed_t);
+  fixed_t* const target_uv_base = SAFE_ALLOC(uv_w * 3, uv_h, fixed_t);
+  fixed_t* const best_rgb_uv = SAFE_ALLOC(uv_w * 3, 1, fixed_t);
+  fixed_y_t* best_y = best_y_base;
+  fixed_y_t* target_y = target_y_base;
+  fixed_t* best_uv = best_uv_base;
+  fixed_t* target_uv = target_uv_base;
+  const uint64_t diff_y_threshold = (uint64_t)(3.0 * w * h);
+  int ok;
+  assert(w > 0);
+  assert(h > 0);
+
+  if (best_y_base == NULL || best_uv_base == NULL ||
+      target_y_base == NULL || target_uv_base == NULL ||
+      best_rgb_y == NULL || best_rgb_uv == NULL ||
+      tmp_buffer == NULL) {
+    ok = 0;
+    goto End;
+  }
+
+  // Import RGB samples to W/RGB representation.
+  for (j = 0; j < height; j += 2) {
+    const int is_last_row = (j == height - 1);
+    fixed_y_t* const src1 = tmp_buffer + 0 * w;
+    fixed_y_t* const src2 = tmp_buffer + 3 * w;
+
+    // prepare two rows of input
+    ImportOneRow(r_ptr, g_ptr, b_ptr, rgb_step, rgb_bit_depth, width,
+                 src1);
+    if (!is_last_row) {
+      ImportOneRow(r_ptr + rgb_stride, g_ptr + rgb_stride, b_ptr + rgb_stride,
+                   rgb_step, rgb_bit_depth, width, src2);
+    } else {
+      memcpy(src2, src1, 3 * w * sizeof(*src2));
+    }
+    StoreGray(src1, best_y + 0, w);
+    StoreGray(src2, best_y + w, w);
+
+    UpdateW(src1, target_y, w, rgb_bit_depth);
+    UpdateW(src2, target_y + w, w, rgb_bit_depth);
+    UpdateChroma(src1, src2, target_uv, uv_w, rgb_bit_depth);
+    memcpy(best_uv, target_uv, 3 * uv_w * sizeof(*best_uv));
+    best_y += 2 * w;
+    best_uv += 3 * uv_w;
+    target_y += 2 * w;
+    target_uv += 3 * uv_w;
+    r_ptr += 2 * rgb_stride;
+    g_ptr += 2 * rgb_stride;
+    b_ptr += 2 * rgb_stride;
+  }
+
+  // Iterate and resolve clipping conflicts.
+  for (iter = 0; iter < kNumIterations; ++iter) {
+    const fixed_t* cur_uv = best_uv_base;
+    const fixed_t* prev_uv = best_uv_base;
+    uint64_t diff_y_sum = 0;
+
+    best_y = best_y_base;
+    best_uv = best_uv_base;
+    target_y = target_y_base;
+    target_uv = target_uv_base;
+    for (j = 0; j < h; j += 2) {
+      fixed_y_t* const src1 = tmp_buffer + 0 * w;
+      fixed_y_t* const src2 = tmp_buffer + 3 * w;
+      {
+        const fixed_t* const next_uv = cur_uv + ((j < h - 2) ? 3 * uv_w : 0);
+        InterpolateTwoRows(best_y, prev_uv, cur_uv, next_uv, w,
+                           src1, src2, rgb_bit_depth);
+        prev_uv = cur_uv;
+        cur_uv = next_uv;
+      }
+
+      UpdateW(src1, best_rgb_y + 0 * w, w, rgb_bit_depth);
+      UpdateW(src2, best_rgb_y + 1 * w, w, rgb_bit_depth);
+      UpdateChroma(src1, src2, best_rgb_uv, uv_w, rgb_bit_depth);
+
+      // update two rows of Y and one row of RGB
+      diff_y_sum +=
+          SharpYuvUpdateY(target_y, best_rgb_y, best_y, 2 * w,
+                          rgb_bit_depth + GetPrecisionShift(rgb_bit_depth));
+      SharpYuvUpdateRGB(target_uv, best_rgb_uv, best_uv, 3 * uv_w);
+
+      best_y += 2 * w;
+      best_uv += 3 * uv_w;
+      target_y += 2 * w;
+      target_uv += 3 * uv_w;
+    }
+    // test exit condition
+    if (iter > 0) {
+      if (diff_y_sum < diff_y_threshold) break;
+      if (diff_y_sum > prev_diff_y_sum) break;
+    }
+    prev_diff_y_sum = diff_y_sum;
+  }
+
+  // final reconstruction
+  ok = ConvertWRGBToYUV(best_y_base, best_uv_base, y_ptr, y_stride, u_ptr,
+                        u_stride, v_ptr, v_stride, rgb_bit_depth, yuv_bit_depth,
+                        width, height, yuv_matrix);
+
+ End:
+  free(best_y_base);
+  free(best_uv_base);
+  free(target_y_base);
+  free(target_uv_base);
+  free(best_rgb_y);
+  free(best_rgb_uv);
+  free(tmp_buffer);
+  return ok;
+}
+#undef SAFE_ALLOC
+
+#if defined(WEBP_USE_THREAD) && !defined(_WIN32)
+#include <pthread.h>  // NOLINT
+
+#define LOCK_ACCESS \
+    static pthread_mutex_t sharpyuv_lock = PTHREAD_MUTEX_INITIALIZER; \
+    if (pthread_mutex_lock(&sharpyuv_lock)) return
+#define UNLOCK_ACCESS_AND_RETURN                  \
+    do {                                          \
+      (void)pthread_mutex_unlock(&sharpyuv_lock); \
+      return;                                     \
+    } while (0)
+#else  // !(defined(WEBP_USE_THREAD) && !defined(_WIN32))
+#define LOCK_ACCESS do {} while (0)
+#define UNLOCK_ACCESS_AND_RETURN return
+#endif  // defined(WEBP_USE_THREAD) && !defined(_WIN32)
+
+// Hidden exported init function.
+// By default SharpYuvConvert calls it with SharpYuvGetCPUInfo. If needed,
+// users can declare it as extern and call it with an alternate VP8CPUInfo
+// function.
+extern VP8CPUInfo SharpYuvGetCPUInfo;
+SHARPYUV_EXTERN void SharpYuvInit(VP8CPUInfo cpu_info_func);
+void SharpYuvInit(VP8CPUInfo cpu_info_func) {
+  static volatile VP8CPUInfo sharpyuv_last_cpuinfo_used =
+      (VP8CPUInfo)&sharpyuv_last_cpuinfo_used;
+  LOCK_ACCESS;
+  // Only update SharpYuvGetCPUInfo when called from external code to avoid a
+  // race on reading the value in SharpYuvConvert().
+  if (cpu_info_func != (VP8CPUInfo)&SharpYuvGetCPUInfo) {
+    SharpYuvGetCPUInfo = cpu_info_func;
+  }
+  if (sharpyuv_last_cpuinfo_used == SharpYuvGetCPUInfo) {
+    UNLOCK_ACCESS_AND_RETURN;
+  }
+
+  SharpYuvInitDsp();
+  SharpYuvInitGammaTables();
+
+  sharpyuv_last_cpuinfo_used = SharpYuvGetCPUInfo;
+  UNLOCK_ACCESS_AND_RETURN;
+}
+
+int SharpYuvConvert(const void* r_ptr, const void* g_ptr,
+                    const void* b_ptr, int rgb_step, int rgb_stride,
+                    int rgb_bit_depth, void* y_ptr, int y_stride,
+                    void* u_ptr, int u_stride, void* v_ptr,
+                    int v_stride, int yuv_bit_depth, int width,
+                    int height, const SharpYuvConversionMatrix* yuv_matrix) {
+  SharpYuvConversionMatrix scaled_matrix;
+  const int rgb_max = (1 << rgb_bit_depth) - 1;
+  const int rgb_round = 1 << (rgb_bit_depth - 1);
+  const int yuv_max = (1 << yuv_bit_depth) - 1;
+  const int sfix = GetPrecisionShift(rgb_bit_depth);
+
+  if (width < 1 || height < 1 || width == INT_MAX || height == INT_MAX ||
+      r_ptr == NULL || g_ptr == NULL || b_ptr == NULL || y_ptr == NULL ||
+      u_ptr == NULL || v_ptr == NULL) {
+    return 0;
+  }
+  if (rgb_bit_depth != 8 && rgb_bit_depth != 10 && rgb_bit_depth != 12 &&
+      rgb_bit_depth != 16) {
+    return 0;
+  }
+  if (yuv_bit_depth != 8 && yuv_bit_depth != 10 && yuv_bit_depth != 12) {
+    return 0;
+  }
+  if (rgb_bit_depth > 8 && (rgb_step % 2 != 0 || rgb_stride %2 != 0)) {
+    // Step/stride should be even for uint16_t buffers.
+    return 0;
+  }
+  if (yuv_bit_depth > 8 &&
+      (y_stride % 2 != 0 || u_stride % 2 != 0 || v_stride % 2 != 0)) {
+    // Stride should be even for uint16_t buffers.
+    return 0;
+  }
+  // The address of the function pointer is used to avoid a read race.
+  SharpYuvInit((VP8CPUInfo)&SharpYuvGetCPUInfo);
+
+  // Add scaling factor to go from rgb_bit_depth to yuv_bit_depth, to the
+  // rgb->yuv conversion matrix.
+  if (rgb_bit_depth == yuv_bit_depth) {
+    memcpy(&scaled_matrix, yuv_matrix, sizeof(scaled_matrix));
+  } else {
+    int i;
+    for (i = 0; i < 3; ++i) {
+      scaled_matrix.rgb_to_y[i] =
+          (yuv_matrix->rgb_to_y[i] * yuv_max + rgb_round) / rgb_max;
+      scaled_matrix.rgb_to_u[i] =
+          (yuv_matrix->rgb_to_u[i] * yuv_max + rgb_round) / rgb_max;
+      scaled_matrix.rgb_to_v[i] =
+          (yuv_matrix->rgb_to_v[i] * yuv_max + rgb_round) / rgb_max;
+    }
+  }
+  // Also incorporate precision change scaling.
+  scaled_matrix.rgb_to_y[3] = Shift(yuv_matrix->rgb_to_y[3], sfix);
+  scaled_matrix.rgb_to_u[3] = Shift(yuv_matrix->rgb_to_u[3], sfix);
+  scaled_matrix.rgb_to_v[3] = Shift(yuv_matrix->rgb_to_v[3], sfix);
+
+  return DoSharpArgbToYuv(r_ptr, g_ptr, b_ptr, rgb_step, rgb_stride,
+                          rgb_bit_depth, y_ptr, y_stride, u_ptr, u_stride,
+                          v_ptr, v_stride, yuv_bit_depth, width, height,
+                          &scaled_matrix);
+}
+
+//------------------------------------------------------------------------------
diff --git a/third_party/libwebp/sharpyuv/sharpyuv.h b/third_party/libwebp/sharpyuv/sharpyuv.h
new file mode 100644
index 0000000..7b9904d
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/sharpyuv.h
@@ -0,0 +1,103 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Sharp RGB to YUV conversion.
+
+#ifndef WEBP_SHARPYUV_SHARPYUV_H_
+#define WEBP_SHARPYUV_SHARPYUV_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SHARPYUV_EXTERN
+#ifdef WEBP_EXTERN
+#define SHARPYUV_EXTERN WEBP_EXTERN
+#else
+// This explicitly marks library functions and allows for changing the
+// signature for e.g., Windows DLL builds.
+#if defined(__GNUC__) && __GNUC__ >= 4
+#define SHARPYUV_EXTERN extern __attribute__((visibility("default")))
+#else
+#if defined(_MSC_VER) && defined(WEBP_DLL)
+#define SHARPYUV_EXTERN __declspec(dllexport)
+#else
+#define SHARPYUV_EXTERN extern
+#endif /* _MSC_VER && WEBP_DLL */
+#endif /* __GNUC__ >= 4 */
+#endif /* WEBP_EXTERN */
+#endif /* SHARPYUV_EXTERN */
+
+// SharpYUV API version following the convention from semver.org
+#define SHARPYUV_VERSION_MAJOR 0
+#define SHARPYUV_VERSION_MINOR 2
+#define SHARPYUV_VERSION_PATCH 1
+// Version as a uint32_t. The major number is the high 8 bits.
+// The minor number is the middle 8 bits. The patch number is the low 16 bits.
+#define SHARPYUV_MAKE_VERSION(MAJOR, MINOR, PATCH) \
+  (((MAJOR) << 24) | ((MINOR) << 16) | (PATCH))
+#define SHARPYUV_VERSION                                                \
+  SHARPYUV_MAKE_VERSION(SHARPYUV_VERSION_MAJOR, SHARPYUV_VERSION_MINOR, \
+                        SHARPYUV_VERSION_PATCH)
+
+// Returns the library's version number, packed in hexadecimal. See
+// SHARPYUV_VERSION.
+SHARPYUV_EXTERN int SharpYuvGetVersion(void);
+
+// RGB to YUV conversion matrix, in 16 bit fixed point.
+// y = rgb_to_y[0] * r + rgb_to_y[1] * g + rgb_to_y[2] * b + rgb_to_y[3]
+// u = rgb_to_u[0] * r + rgb_to_u[1] * g + rgb_to_u[2] * b + rgb_to_u[3]
+// v = rgb_to_v[0] * r + rgb_to_v[1] * g + rgb_to_v[2] * b + rgb_to_v[3]
+// Then y, u and v values are divided by 1<<16 and rounded.
+typedef struct {
+  int rgb_to_y[4];
+  int rgb_to_u[4];
+  int rgb_to_v[4];
+} SharpYuvConversionMatrix;
+
+// Converts RGB to YUV420 using a downsampling algorithm that minimizes
+// artefacts caused by chroma subsampling.
+// This is slower than standard downsampling (averaging of 4 UV values).
+// Assumes that the image will be upsampled using a bilinear filter. If nearest
+// neighbor is used instead, the upsampled image might look worse than with
+// standard downsampling.
+// r_ptr, g_ptr, b_ptr: pointers to the source r, g and b channels. Should point
+//     to uint8_t buffers if rgb_bit_depth is 8, or uint16_t buffers otherwise.
+// rgb_step: distance in bytes between two horizontally adjacent pixels on the
+//     r, g and b channels. If rgb_bit_depth is > 8, it should be a
+//     multiple of 2.
+// rgb_stride: distance in bytes between two vertically adjacent pixels on the
+//     r, g, and b channels. If rgb_bit_depth is > 8, it should be a
+//     multiple of 2.
+// rgb_bit_depth: number of bits for each r/g/b value. One of: 8, 10, 12, 16.
+//     Note: 16 bit input is truncated to 14 bits before conversion to yuv.
+// yuv_bit_depth: number of bits for each y/u/v value. One of: 8, 10, 12.
+// y_ptr, u_ptr, v_ptr: pointers to the destination y, u and v channels.  Should
+//     point to uint8_t buffers if yuv_bit_depth is 8, or uint16_t buffers
+//     otherwise.
+// y_stride, u_stride, v_stride: distance in bytes between two vertically
+//     adjacent pixels on the y, u and v channels. If yuv_bit_depth > 8, they
+//     should be multiples of 2.
+// width, height: width and height of the image in pixels
+SHARPYUV_EXTERN int SharpYuvConvert(const void* r_ptr, const void* g_ptr,
+                                    const void* b_ptr, int rgb_step,
+                                    int rgb_stride, int rgb_bit_depth,
+                                    void* y_ptr, int y_stride, void* u_ptr,
+                                    int u_stride, void* v_ptr, int v_stride,
+                                    int yuv_bit_depth, int width, int height,
+                                    const SharpYuvConversionMatrix* yuv_matrix);
+
+// TODO(b/194336375): Add YUV444 to YUV420 conversion. Maybe also add 422
+// support (it's rarely used in practice, especially for images).
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+#endif  // WEBP_SHARPYUV_SHARPYUV_H_
diff --git a/third_party/libwebp/sharpyuv/sharpyuv_cpu.c b/third_party/libwebp/sharpyuv/sharpyuv_cpu.c
new file mode 100644
index 0000000..29425a0
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/sharpyuv_cpu.c
@@ -0,0 +1,14 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+#include "sharpyuv/sharpyuv_cpu.h"
+
+// Include src/dsp/cpu.c to create SharpYuvGetCPUInfo from VP8GetCPUInfo. The
+// function pointer is renamed in sharpyuv_cpu.h.
+#include "src/dsp/cpu.c"
diff --git a/third_party/libwebp/sharpyuv/sharpyuv_cpu.h b/third_party/libwebp/sharpyuv/sharpyuv_cpu.h
new file mode 100644
index 0000000..176ca3e
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/sharpyuv_cpu.h
@@ -0,0 +1,22 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+#ifndef WEBP_SHARPYUV_SHARPYUV_CPU_H_
+#define WEBP_SHARPYUV_SHARPYUV_CPU_H_
+
+#include "sharpyuv/sharpyuv.h"
+
+// Avoid exporting SharpYuvGetCPUInfo in shared object / DLL builds.
+// SharpYuvInit() replaces the use of the function pointer.
+#undef WEBP_EXTERN
+#define WEBP_EXTERN extern
+#define VP8GetCPUInfo SharpYuvGetCPUInfo
+#include "src/dsp/cpu.h"
+
+#endif  // WEBP_SHARPYUV_SHARPYUV_CPU_H_
diff --git a/third_party/libwebp/sharpyuv/sharpyuv_csp.c b/third_party/libwebp/sharpyuv/sharpyuv_csp.c
new file mode 100644
index 0000000..0ad22be
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/sharpyuv_csp.c
@@ -0,0 +1,110 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Colorspace utilities.
+
+#include "sharpyuv/sharpyuv_csp.h"
+
+#include <assert.h>
+#include <math.h>
+#include <stddef.h>
+
+static int ToFixed16(float f) { return (int)floor(f * (1 << 16) + 0.5f); }
+
+void SharpYuvComputeConversionMatrix(const SharpYuvColorSpace* yuv_color_space,
+                                     SharpYuvConversionMatrix* matrix) {
+  const float kr = yuv_color_space->kr;
+  const float kb = yuv_color_space->kb;
+  const float kg = 1.0f - kr - kb;
+  const float cr = 0.5f / (1.0f - kb);
+  const float cb = 0.5f / (1.0f - kr);
+
+  const int shift = yuv_color_space->bit_depth - 8;
+
+  const float denom = (float)((1 << yuv_color_space->bit_depth) - 1);
+  float scale_y = 1.0f;
+  float add_y = 0.0f;
+  float scale_u = cr;
+  float scale_v = cb;
+  float add_uv = (float)(128 << shift);
+  assert(yuv_color_space->bit_depth >= 8);
+
+  if (yuv_color_space->range == kSharpYuvRangeLimited) {
+    scale_y *= (219 << shift) / denom;
+    scale_u *= (224 << shift) / denom;
+    scale_v *= (224 << shift) / denom;
+    add_y = (float)(16 << shift);
+  }
+
+  matrix->rgb_to_y[0] = ToFixed16(kr * scale_y);
+  matrix->rgb_to_y[1] = ToFixed16(kg * scale_y);
+  matrix->rgb_to_y[2] = ToFixed16(kb * scale_y);
+  matrix->rgb_to_y[3] = ToFixed16(add_y);
+
+  matrix->rgb_to_u[0] = ToFixed16(-kr * scale_u);
+  matrix->rgb_to_u[1] = ToFixed16(-kg * scale_u);
+  matrix->rgb_to_u[2] = ToFixed16((1 - kb) * scale_u);
+  matrix->rgb_to_u[3] = ToFixed16(add_uv);
+
+  matrix->rgb_to_v[0] = ToFixed16((1 - kr) * scale_v);
+  matrix->rgb_to_v[1] = ToFixed16(-kg * scale_v);
+  matrix->rgb_to_v[2] = ToFixed16(-kb * scale_v);
+  matrix->rgb_to_v[3] = ToFixed16(add_uv);
+}
+
+// Matrices are in YUV_FIX fixed point precision.
+// WebP's matrix, similar but not identical to kRec601LimitedMatrix.
+static const SharpYuvConversionMatrix kWebpMatrix = {
+  {16839, 33059, 6420, 16 << 16},
+  {-9719, -19081, 28800, 128 << 16},
+  {28800, -24116, -4684, 128 << 16},
+};
+// Kr=0.2990f Kb=0.1140f bits=8 range=kSharpYuvRangeLimited
+static const SharpYuvConversionMatrix kRec601LimitedMatrix = {
+  {16829, 33039, 6416, 16 << 16},
+  {-9714, -19071, 28784, 128 << 16},
+  {28784, -24103, -4681, 128 << 16},
+};
+// Kr=0.2990f Kb=0.1140f bits=8 range=kSharpYuvRangeFull
+static const SharpYuvConversionMatrix kRec601FullMatrix = {
+  {19595, 38470, 7471, 0},
+  {-11058, -21710, 32768, 128 << 16},
+  {32768, -27439, -5329, 128 << 16},
+};
+// Kr=0.2126f Kb=0.0722f bits=8 range=kSharpYuvRangeLimited
+static const SharpYuvConversionMatrix kRec709LimitedMatrix = {
+  {11966, 40254, 4064, 16 << 16},
+  {-6596, -22189, 28784, 128 << 16},
+  {28784, -26145, -2639, 128 << 16},
+};
+// Kr=0.2126f Kb=0.0722f bits=8 range=kSharpYuvRangeFull
+static const SharpYuvConversionMatrix kRec709FullMatrix = {
+  {13933, 46871, 4732, 0},
+  {-7509, -25259, 32768, 128 << 16},
+  {32768, -29763, -3005, 128 << 16},
+};
+
+const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix(
+    SharpYuvMatrixType matrix_type) {
+  switch (matrix_type) {
+    case kSharpYuvMatrixWebp:
+      return &kWebpMatrix;
+    case kSharpYuvMatrixRec601Limited:
+      return &kRec601LimitedMatrix;
+    case kSharpYuvMatrixRec601Full:
+      return &kRec601FullMatrix;
+    case kSharpYuvMatrixRec709Limited:
+      return &kRec709LimitedMatrix;
+    case kSharpYuvMatrixRec709Full:
+      return &kRec709FullMatrix;
+    case kSharpYuvMatrixNum:
+      return NULL;
+  }
+  return NULL;
+}
diff --git a/third_party/libwebp/sharpyuv/sharpyuv_csp.h b/third_party/libwebp/sharpyuv/sharpyuv_csp.h
new file mode 100644
index 0000000..3214e3a
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/sharpyuv_csp.h
@@ -0,0 +1,60 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Colorspace utilities.
+
+#ifndef WEBP_SHARPYUV_SHARPYUV_CSP_H_
+#define WEBP_SHARPYUV_SHARPYUV_CSP_H_
+
+#include "sharpyuv/sharpyuv.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Range of YUV values.
+typedef enum {
+  kSharpYuvRangeFull,     // YUV values between [0;255] (for 8 bit)
+  kSharpYuvRangeLimited   // Y in [16;235], YUV in [16;240] (for 8 bit)
+} SharpYuvRange;
+
+// Constants that define a YUV color space.
+typedef struct {
+  // Kr and Kb are defined such that:
+  // Y = Kr * r + Kg * g + Kb * b where Kg = 1 - Kr - Kb.
+  float kr;
+  float kb;
+  int bit_depth;  // 8, 10 or 12
+  SharpYuvRange range;
+} SharpYuvColorSpace;
+
+// Fills in 'matrix' for the given YUVColorSpace.
+SHARPYUV_EXTERN void SharpYuvComputeConversionMatrix(
+    const SharpYuvColorSpace* yuv_color_space,
+    SharpYuvConversionMatrix* matrix);
+
+// Enums for precomputed conversion matrices.
+typedef enum {
+  kSharpYuvMatrixWebp = 0,
+  kSharpYuvMatrixRec601Limited,
+  kSharpYuvMatrixRec601Full,
+  kSharpYuvMatrixRec709Limited,
+  kSharpYuvMatrixRec709Full,
+  kSharpYuvMatrixNum
+} SharpYuvMatrixType;
+
+// Returns a pointer to a matrix for one of the predefined colorspaces.
+SHARPYUV_EXTERN const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix(
+    SharpYuvMatrixType matrix_type);
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+#endif  // WEBP_SHARPYUV_SHARPYUV_CSP_H_
diff --git a/third_party/libwebp/sharpyuv/sharpyuv_dsp.c b/third_party/libwebp/sharpyuv/sharpyuv_dsp.c
new file mode 100644
index 0000000..0da3efc
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/sharpyuv_dsp.c
@@ -0,0 +1,104 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Speed-critical functions for Sharp YUV.
+//
+// Author: Skal (pascal.massimino@gmail.com)
+
+#include "sharpyuv/sharpyuv_dsp.h"
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include "sharpyuv/sharpyuv_cpu.h"
+
+//-----------------------------------------------------------------------------
+
+#if !WEBP_NEON_OMIT_C_CODE
+static uint16_t clip(int v, int max) {
+  return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v;
+}
+
+static uint64_t SharpYuvUpdateY_C(const uint16_t* ref, const uint16_t* src,
+                                  uint16_t* dst, int len, int bit_depth) {
+  uint64_t diff = 0;
+  int i;
+  const int max_y = (1 << bit_depth) - 1;
+  for (i = 0; i < len; ++i) {
+    const int diff_y = ref[i] - src[i];
+    const int new_y = (int)dst[i] + diff_y;
+    dst[i] = clip(new_y, max_y);
+    diff += (uint64_t)abs(diff_y);
+  }
+  return diff;
+}
+
+static void SharpYuvUpdateRGB_C(const int16_t* ref, const int16_t* src,
+                                int16_t* dst, int len) {
+  int i;
+  for (i = 0; i < len; ++i) {
+    const int diff_uv = ref[i] - src[i];
+    dst[i] += diff_uv;
+  }
+}
+
+static void SharpYuvFilterRow_C(const int16_t* A, const int16_t* B, int len,
+                                const uint16_t* best_y, uint16_t* out,
+                                int bit_depth) {
+  int i;
+  const int max_y = (1 << bit_depth) - 1;
+  for (i = 0; i < len; ++i, ++A, ++B) {
+    const int v0 = (A[0] * 9 + A[1] * 3 + B[0] * 3 + B[1] + 8) >> 4;
+    const int v1 = (A[1] * 9 + A[0] * 3 + B[1] * 3 + B[0] + 8) >> 4;
+    out[2 * i + 0] = clip(best_y[2 * i + 0] + v0, max_y);
+    out[2 * i + 1] = clip(best_y[2 * i + 1] + v1, max_y);
+  }
+}
+#endif  // !WEBP_NEON_OMIT_C_CODE
+
+//-----------------------------------------------------------------------------
+
+uint64_t (*SharpYuvUpdateY)(const uint16_t* src, const uint16_t* ref,
+                            uint16_t* dst, int len, int bit_depth);
+void (*SharpYuvUpdateRGB)(const int16_t* src, const int16_t* ref, int16_t* dst,
+                          int len);
+void (*SharpYuvFilterRow)(const int16_t* A, const int16_t* B, int len,
+                          const uint16_t* best_y, uint16_t* out,
+                          int bit_depth);
+
+extern VP8CPUInfo SharpYuvGetCPUInfo;
+extern void InitSharpYuvSSE2(void);
+extern void InitSharpYuvNEON(void);
+
+void SharpYuvInitDsp(void) {
+#if !WEBP_NEON_OMIT_C_CODE
+  SharpYuvUpdateY = SharpYuvUpdateY_C;
+  SharpYuvUpdateRGB = SharpYuvUpdateRGB_C;
+  SharpYuvFilterRow = SharpYuvFilterRow_C;
+#endif
+
+  if (SharpYuvGetCPUInfo != NULL) {
+#if defined(WEBP_HAVE_SSE2)
+    if (SharpYuvGetCPUInfo(kSSE2)) {
+      InitSharpYuvSSE2();
+    }
+#endif  // WEBP_HAVE_SSE2
+  }
+
+#if defined(WEBP_HAVE_NEON)
+  if (WEBP_NEON_OMIT_C_CODE ||
+      (SharpYuvGetCPUInfo != NULL && SharpYuvGetCPUInfo(kNEON))) {
+    InitSharpYuvNEON();
+  }
+#endif  // WEBP_HAVE_NEON
+
+  assert(SharpYuvUpdateY != NULL);
+  assert(SharpYuvUpdateRGB != NULL);
+  assert(SharpYuvFilterRow != NULL);
+}
diff --git a/third_party/libwebp/sharpyuv/sharpyuv_dsp.h b/third_party/libwebp/sharpyuv/sharpyuv_dsp.h
new file mode 100644
index 0000000..805fbad
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/sharpyuv_dsp.h
@@ -0,0 +1,28 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Speed-critical functions for Sharp YUV.
+
+#ifndef WEBP_SHARPYUV_SHARPYUV_DSP_H_
+#define WEBP_SHARPYUV_SHARPYUV_DSP_H_
+
+#include "sharpyuv/sharpyuv_cpu.h"
+#include "src/webp/types.h"
+
+extern uint64_t (*SharpYuvUpdateY)(const uint16_t* src, const uint16_t* ref,
+                                   uint16_t* dst, int len, int bit_depth);
+extern void (*SharpYuvUpdateRGB)(const int16_t* src, const int16_t* ref,
+                                 int16_t* dst, int len);
+extern void (*SharpYuvFilterRow)(const int16_t* A, const int16_t* B, int len,
+                                 const uint16_t* best_y, uint16_t* out,
+                                 int bit_depth);
+
+void SharpYuvInitDsp(void);
+
+#endif  // WEBP_SHARPYUV_SHARPYUV_DSP_H_
diff --git a/third_party/libwebp/sharpyuv/sharpyuv_gamma.c b/third_party/libwebp/sharpyuv/sharpyuv_gamma.c
new file mode 100644
index 0000000..20ab2da
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/sharpyuv_gamma.c
@@ -0,0 +1,113 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Gamma correction utilities.
+
+#include "sharpyuv/sharpyuv_gamma.h"
+
+#include <assert.h>
+#include <math.h>
+
+#include "src/webp/types.h"
+
+// Gamma correction compensates loss of resolution during chroma subsampling.
+// Size of pre-computed table for converting from gamma to linear.
+#define GAMMA_TO_LINEAR_TAB_BITS 10
+#define GAMMA_TO_LINEAR_TAB_SIZE (1 << GAMMA_TO_LINEAR_TAB_BITS)
+static uint32_t kGammaToLinearTabS[GAMMA_TO_LINEAR_TAB_SIZE + 2];
+#define LINEAR_TO_GAMMA_TAB_BITS 9
+#define LINEAR_TO_GAMMA_TAB_SIZE (1 << LINEAR_TO_GAMMA_TAB_BITS)
+static uint32_t kLinearToGammaTabS[LINEAR_TO_GAMMA_TAB_SIZE + 2];
+
+static const double kGammaF = 1. / 0.45;
+#define GAMMA_TO_LINEAR_BITS 16
+
+static volatile int kGammaTablesSOk = 0;
+void SharpYuvInitGammaTables(void) {
+  assert(GAMMA_TO_LINEAR_BITS <= 16);
+  if (!kGammaTablesSOk) {
+    int v;
+    const double a = 0.09929682680944;
+    const double thresh = 0.018053968510807;
+    const double final_scale = 1 << GAMMA_TO_LINEAR_BITS;
+    // Precompute gamma to linear table.
+    {
+      const double norm = 1. / GAMMA_TO_LINEAR_TAB_SIZE;
+      const double a_rec = 1. / (1. + a);
+      for (v = 0; v <= GAMMA_TO_LINEAR_TAB_SIZE; ++v) {
+        const double g = norm * v;
+        double value;
+        if (g <= thresh * 4.5) {
+          value = g / 4.5;
+        } else {
+          value = pow(a_rec * (g + a), kGammaF);
+        }
+        kGammaToLinearTabS[v] = (uint32_t)(value * final_scale + .5);
+      }
+      // to prevent small rounding errors to cause read-overflow:
+      kGammaToLinearTabS[GAMMA_TO_LINEAR_TAB_SIZE + 1] =
+          kGammaToLinearTabS[GAMMA_TO_LINEAR_TAB_SIZE];
+    }
+    // Precompute linear to gamma table.
+    {
+      const double scale = 1. / LINEAR_TO_GAMMA_TAB_SIZE;
+      for (v = 0; v <= LINEAR_TO_GAMMA_TAB_SIZE; ++v) {
+        const double g = scale * v;
+        double value;
+        if (g <= thresh) {
+          value = 4.5 * g;
+        } else {
+          value = (1. + a) * pow(g, 1. / kGammaF) - a;
+        }
+        kLinearToGammaTabS[v] =
+            (uint32_t)(final_scale * value + 0.5);
+      }
+      // to prevent small rounding errors to cause read-overflow:
+      kLinearToGammaTabS[LINEAR_TO_GAMMA_TAB_SIZE + 1] =
+          kLinearToGammaTabS[LINEAR_TO_GAMMA_TAB_SIZE];
+    }
+    kGammaTablesSOk = 1;
+  }
+}
+
+static WEBP_INLINE int Shift(int v, int shift) {
+  return (shift >= 0) ? (v << shift) : (v >> -shift);
+}
+
+static WEBP_INLINE uint32_t FixedPointInterpolation(int v, uint32_t* tab,
+                                                    int tab_pos_shift_right,
+                                                    int tab_value_shift) {
+  const uint32_t tab_pos = Shift(v, -tab_pos_shift_right);
+  // fractional part, in 'tab_pos_shift' fixed-point precision
+  const uint32_t x = v - (tab_pos << tab_pos_shift_right);  // fractional part
+  // v0 / v1 are in kGammaToLinearBits fixed-point precision (range [0..1])
+  const uint32_t v0 = Shift(tab[tab_pos + 0], tab_value_shift);
+  const uint32_t v1 = Shift(tab[tab_pos + 1], tab_value_shift);
+  // Final interpolation.
+  const uint32_t v2 = (v1 - v0) * x;  // note: v1 >= v0.
+  const int half =
+      (tab_pos_shift_right > 0) ? 1 << (tab_pos_shift_right - 1) : 0;
+  const uint32_t result = v0 + ((v2 + half) >> tab_pos_shift_right);
+  return result;
+}
+
+uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth) {
+  const int shift = GAMMA_TO_LINEAR_TAB_BITS - bit_depth;
+  if (shift > 0) {
+    return kGammaToLinearTabS[v << shift];
+  }
+  return FixedPointInterpolation(v, kGammaToLinearTabS, -shift, 0);
+}
+
+uint16_t SharpYuvLinearToGamma(uint32_t value, int bit_depth) {
+  return FixedPointInterpolation(
+      value, kLinearToGammaTabS,
+      (GAMMA_TO_LINEAR_BITS - LINEAR_TO_GAMMA_TAB_BITS),
+      bit_depth - GAMMA_TO_LINEAR_BITS);
+}
diff --git a/third_party/libwebp/sharpyuv/sharpyuv_gamma.h b/third_party/libwebp/sharpyuv/sharpyuv_gamma.h
new file mode 100644
index 0000000..d13aff5
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/sharpyuv_gamma.h
@@ -0,0 +1,35 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Gamma correction utilities.
+
+#ifndef WEBP_SHARPYUV_SHARPYUV_GAMMA_H_
+#define WEBP_SHARPYUV_SHARPYUV_GAMMA_H_
+
+#include "src/webp/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Initializes precomputed tables. Must be called once before calling
+// SharpYuvGammaToLinear or SharpYuvLinearToGamma.
+void SharpYuvInitGammaTables(void);
+
+// Converts a gamma color value on 'bit_depth' bits to a 16 bit linear value.
+uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth);
+
+// Converts a 16 bit linear color value to a gamma value on 'bit_depth' bits.
+uint16_t SharpYuvLinearToGamma(uint32_t value, int bit_depth);
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+#endif  // WEBP_SHARPYUV_SHARPYUV_GAMMA_H_
diff --git a/third_party/libwebp/sharpyuv/sharpyuv_neon.c b/third_party/libwebp/sharpyuv/sharpyuv_neon.c
new file mode 100644
index 0000000..5840914
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/sharpyuv_neon.c
@@ -0,0 +1,181 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Speed-critical functions for Sharp YUV.
+//
+// Author: Skal (pascal.massimino@gmail.com)
+
+#include "sharpyuv/sharpyuv_dsp.h"
+
+#if defined(WEBP_USE_NEON)
+#include <assert.h>
+#include <stdlib.h>
+#include <arm_neon.h>
+
+static uint16_t clip_NEON(int v, int max) {
+  return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v;
+}
+
+static uint64_t SharpYuvUpdateY_NEON(const uint16_t* ref, const uint16_t* src,
+                                     uint16_t* dst, int len, int bit_depth) {
+  const int max_y = (1 << bit_depth) - 1;
+  int i;
+  const int16x8_t zero = vdupq_n_s16(0);
+  const int16x8_t max = vdupq_n_s16(max_y);
+  uint64x2_t sum = vdupq_n_u64(0);
+  uint64_t diff;
+
+  for (i = 0; i + 8 <= len; i += 8) {
+    const int16x8_t A = vreinterpretq_s16_u16(vld1q_u16(ref + i));
+    const int16x8_t B = vreinterpretq_s16_u16(vld1q_u16(src + i));
+    const int16x8_t C = vreinterpretq_s16_u16(vld1q_u16(dst + i));
+    const int16x8_t D = vsubq_s16(A, B);       // diff_y
+    const int16x8_t F = vaddq_s16(C, D);       // new_y
+    const uint16x8_t H =
+        vreinterpretq_u16_s16(vmaxq_s16(vminq_s16(F, max), zero));
+    const int16x8_t I = vabsq_s16(D);          // abs(diff_y)
+    vst1q_u16(dst + i, H);
+    sum = vpadalq_u32(sum, vpaddlq_u16(vreinterpretq_u16_s16(I)));
+  }
+  diff = vgetq_lane_u64(sum, 0) + vgetq_lane_u64(sum, 1);
+  for (; i < len; ++i) {
+    const int diff_y = ref[i] - src[i];
+    const int new_y = (int)(dst[i]) + diff_y;
+    dst[i] = clip_NEON(new_y, max_y);
+    diff += (uint64_t)(abs(diff_y));
+  }
+  return diff;
+}
+
+static void SharpYuvUpdateRGB_NEON(const int16_t* ref, const int16_t* src,
+                                   int16_t* dst, int len) {
+  int i;
+  for (i = 0; i + 8 <= len; i += 8) {
+    const int16x8_t A = vld1q_s16(ref + i);
+    const int16x8_t B = vld1q_s16(src + i);
+    const int16x8_t C = vld1q_s16(dst + i);
+    const int16x8_t D = vsubq_s16(A, B);   // diff_uv
+    const int16x8_t E = vaddq_s16(C, D);   // new_uv
+    vst1q_s16(dst + i, E);
+  }
+  for (; i < len; ++i) {
+    const int diff_uv = ref[i] - src[i];
+    dst[i] += diff_uv;
+  }
+}
+
+static void SharpYuvFilterRow16_NEON(const int16_t* A, const int16_t* B,
+                                     int len, const uint16_t* best_y,
+                                     uint16_t* out, int bit_depth) {
+  const int max_y = (1 << bit_depth) - 1;
+  int i;
+  const int16x8_t max = vdupq_n_s16(max_y);
+  const int16x8_t zero = vdupq_n_s16(0);
+  for (i = 0; i + 8 <= len; i += 8) {
+    const int16x8_t a0 = vld1q_s16(A + i + 0);
+    const int16x8_t a1 = vld1q_s16(A + i + 1);
+    const int16x8_t b0 = vld1q_s16(B + i + 0);
+    const int16x8_t b1 = vld1q_s16(B + i + 1);
+    const int16x8_t a0b1 = vaddq_s16(a0, b1);
+    const int16x8_t a1b0 = vaddq_s16(a1, b0);
+    const int16x8_t a0a1b0b1 = vaddq_s16(a0b1, a1b0);  // A0+A1+B0+B1
+    const int16x8_t a0b1_2 = vaddq_s16(a0b1, a0b1);    // 2*(A0+B1)
+    const int16x8_t a1b0_2 = vaddq_s16(a1b0, a1b0);    // 2*(A1+B0)
+    const int16x8_t c0 = vshrq_n_s16(vaddq_s16(a0b1_2, a0a1b0b1), 3);
+    const int16x8_t c1 = vshrq_n_s16(vaddq_s16(a1b0_2, a0a1b0b1), 3);
+    const int16x8_t e0 = vrhaddq_s16(c1, a0);
+    const int16x8_t e1 = vrhaddq_s16(c0, a1);
+    const int16x8x2_t f = vzipq_s16(e0, e1);
+    const int16x8_t g0 = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i + 0));
+    const int16x8_t g1 = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i + 8));
+    const int16x8_t h0 = vaddq_s16(g0, f.val[0]);
+    const int16x8_t h1 = vaddq_s16(g1, f.val[1]);
+    const int16x8_t i0 = vmaxq_s16(vminq_s16(h0, max), zero);
+    const int16x8_t i1 = vmaxq_s16(vminq_s16(h1, max), zero);
+    vst1q_u16(out + 2 * i + 0, vreinterpretq_u16_s16(i0));
+    vst1q_u16(out + 2 * i + 8, vreinterpretq_u16_s16(i1));
+  }
+  for (; i < len; ++i) {
+    const int a0b1 = A[i + 0] + B[i + 1];
+    const int a1b0 = A[i + 1] + B[i + 0];
+    const int a0a1b0b1 = a0b1 + a1b0 + 8;
+    const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4;
+    const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4;
+    out[2 * i + 0] = clip_NEON(best_y[2 * i + 0] + v0, max_y);
+    out[2 * i + 1] = clip_NEON(best_y[2 * i + 1] + v1, max_y);
+  }
+}
+
+static void SharpYuvFilterRow32_NEON(const int16_t* A, const int16_t* B,
+                                     int len, const uint16_t* best_y,
+                                     uint16_t* out, int bit_depth) {
+  const int max_y = (1 << bit_depth) - 1;
+  int i;
+  const uint16x8_t max = vdupq_n_u16(max_y);
+  for (i = 0; i + 4 <= len; i += 4) {
+    const int16x4_t a0 = vld1_s16(A + i + 0);
+    const int16x4_t a1 = vld1_s16(A + i + 1);
+    const int16x4_t b0 = vld1_s16(B + i + 0);
+    const int16x4_t b1 = vld1_s16(B + i + 1);
+    const int32x4_t a0b1 = vaddl_s16(a0, b1);
+    const int32x4_t a1b0 = vaddl_s16(a1, b0);
+    const int32x4_t a0a1b0b1 = vaddq_s32(a0b1, a1b0);  // A0+A1+B0+B1
+    const int32x4_t a0b1_2 = vaddq_s32(a0b1, a0b1);    // 2*(A0+B1)
+    const int32x4_t a1b0_2 = vaddq_s32(a1b0, a1b0);    // 2*(A1+B0)
+    const int32x4_t c0 = vshrq_n_s32(vaddq_s32(a0b1_2, a0a1b0b1), 3);
+    const int32x4_t c1 = vshrq_n_s32(vaddq_s32(a1b0_2, a0a1b0b1), 3);
+    const int32x4_t e0 = vrhaddq_s32(c1, vmovl_s16(a0));
+    const int32x4_t e1 = vrhaddq_s32(c0, vmovl_s16(a1));
+    const int32x4x2_t f = vzipq_s32(e0, e1);
+
+    const int16x8_t g = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i));
+    const int32x4_t h0 = vaddw_s16(f.val[0], vget_low_s16(g));
+    const int32x4_t h1 = vaddw_s16(f.val[1], vget_high_s16(g));
+    const uint16x8_t i_16 = vcombine_u16(vqmovun_s32(h0), vqmovun_s32(h1));
+    const uint16x8_t i_clamped = vminq_u16(i_16, max);
+    vst1q_u16(out + 2 * i + 0, i_clamped);
+  }
+  for (; i < len; ++i) {
+    const int a0b1 = A[i + 0] + B[i + 1];
+    const int a1b0 = A[i + 1] + B[i + 0];
+    const int a0a1b0b1 = a0b1 + a1b0 + 8;
+    const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4;
+    const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4;
+    out[2 * i + 0] = clip_NEON(best_y[2 * i + 0] + v0, max_y);
+    out[2 * i + 1] = clip_NEON(best_y[2 * i + 1] + v1, max_y);
+  }
+}
+
+static void SharpYuvFilterRow_NEON(const int16_t* A, const int16_t* B, int len,
+                                   const uint16_t* best_y, uint16_t* out,
+                                   int bit_depth) {
+  if (bit_depth <= 10) {
+    SharpYuvFilterRow16_NEON(A, B, len, best_y, out, bit_depth);
+  } else {
+    SharpYuvFilterRow32_NEON(A, B, len, best_y, out, bit_depth);
+  }
+}
+
+//------------------------------------------------------------------------------
+
+extern void InitSharpYuvNEON(void);
+
+WEBP_TSAN_IGNORE_FUNCTION void InitSharpYuvNEON(void) {
+  SharpYuvUpdateY = SharpYuvUpdateY_NEON;
+  SharpYuvUpdateRGB = SharpYuvUpdateRGB_NEON;
+  SharpYuvFilterRow = SharpYuvFilterRow_NEON;
+}
+
+#else  // !WEBP_USE_NEON
+
+extern void InitSharpYuvNEON(void);
+
+void InitSharpYuvNEON(void) {}
+
+#endif  // WEBP_USE_NEON
diff --git a/third_party/libwebp/sharpyuv/sharpyuv_sse2.c b/third_party/libwebp/sharpyuv/sharpyuv_sse2.c
new file mode 100644
index 0000000..9744d1b
--- /dev/null
+++ b/third_party/libwebp/sharpyuv/sharpyuv_sse2.c
@@ -0,0 +1,201 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Speed-critical functions for Sharp YUV.
+//
+// Author: Skal (pascal.massimino@gmail.com)
+
+#include "sharpyuv/sharpyuv_dsp.h"
+
+#if defined(WEBP_USE_SSE2)
+#include <stdlib.h>
+#include <emmintrin.h>
+
+static uint16_t clip_SSE2(int v, int max) {
+  return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v;
+}
+
+static uint64_t SharpYuvUpdateY_SSE2(const uint16_t* ref, const uint16_t* src,
+                                     uint16_t* dst, int len, int bit_depth) {
+  const int max_y = (1 << bit_depth) - 1;
+  uint64_t diff = 0;
+  uint32_t tmp[4];
+  int i;
+  const __m128i zero = _mm_setzero_si128();
+  const __m128i max = _mm_set1_epi16(max_y);
+  const __m128i one = _mm_set1_epi16(1);
+  __m128i sum = zero;
+
+  for (i = 0; i + 8 <= len; i += 8) {
+    const __m128i A = _mm_loadu_si128((const __m128i*)(ref + i));
+    const __m128i B = _mm_loadu_si128((const __m128i*)(src + i));
+    const __m128i C = _mm_loadu_si128((const __m128i*)(dst + i));
+    const __m128i D = _mm_sub_epi16(A, B);       // diff_y
+    const __m128i E = _mm_cmpgt_epi16(zero, D);  // sign (-1 or 0)
+    const __m128i F = _mm_add_epi16(C, D);       // new_y
+    const __m128i G = _mm_or_si128(E, one);      // -1 or 1
+    const __m128i H = _mm_max_epi16(_mm_min_epi16(F, max), zero);
+    const __m128i I = _mm_madd_epi16(D, G);      // sum(abs(...))
+    _mm_storeu_si128((__m128i*)(dst + i), H);
+    sum = _mm_add_epi32(sum, I);
+  }
+  _mm_storeu_si128((__m128i*)tmp, sum);
+  diff = tmp[3] + tmp[2] + tmp[1] + tmp[0];
+  for (; i < len; ++i) {
+    const int diff_y = ref[i] - src[i];
+    const int new_y = (int)dst[i] + diff_y;
+    dst[i] = clip_SSE2(new_y, max_y);
+    diff += (uint64_t)abs(diff_y);
+  }
+  return diff;
+}
+
+static void SharpYuvUpdateRGB_SSE2(const int16_t* ref, const int16_t* src,
+                                   int16_t* dst, int len) {
+  int i = 0;
+  for (i = 0; i + 8 <= len; i += 8) {
+    const __m128i A = _mm_loadu_si128((const __m128i*)(ref + i));
+    const __m128i B = _mm_loadu_si128((const __m128i*)(src + i));
+    const __m128i C = _mm_loadu_si128((const __m128i*)(dst + i));
+    const __m128i D = _mm_sub_epi16(A, B);   // diff_uv
+    const __m128i E = _mm_add_epi16(C, D);   // new_uv
+    _mm_storeu_si128((__m128i*)(dst + i), E);
+  }
+  for (; i < len; ++i) {
+    const int diff_uv = ref[i] - src[i];
+    dst[i] += diff_uv;
+  }
+}
+
+static void SharpYuvFilterRow16_SSE2(const int16_t* A, const int16_t* B,
+                                     int len, const uint16_t* best_y,
+                                     uint16_t* out, int bit_depth) {
+  const int max_y = (1 << bit_depth) - 1;
+  int i;
+  const __m128i kCst8 = _mm_set1_epi16(8);
+  const __m128i max = _mm_set1_epi16(max_y);
+  const __m128i zero = _mm_setzero_si128();
+  for (i = 0; i + 8 <= len; i += 8) {
+    const __m128i a0 = _mm_loadu_si128((const __m128i*)(A + i + 0));
+    const __m128i a1 = _mm_loadu_si128((const __m128i*)(A + i + 1));
+    const __m128i b0 = _mm_loadu_si128((const __m128i*)(B + i + 0));
+    const __m128i b1 = _mm_loadu_si128((const __m128i*)(B + i + 1));
+    const __m128i a0b1 = _mm_add_epi16(a0, b1);
+    const __m128i a1b0 = _mm_add_epi16(a1, b0);
+    const __m128i a0a1b0b1 = _mm_add_epi16(a0b1, a1b0);  // A0+A1+B0+B1
+    const __m128i a0a1b0b1_8 = _mm_add_epi16(a0a1b0b1, kCst8);
+    const __m128i a0b1_2 = _mm_add_epi16(a0b1, a0b1);    // 2*(A0+B1)
+    const __m128i a1b0_2 = _mm_add_epi16(a1b0, a1b0);    // 2*(A1+B0)
+    const __m128i c0 = _mm_srai_epi16(_mm_add_epi16(a0b1_2, a0a1b0b1_8), 3);
+    const __m128i c1 = _mm_srai_epi16(_mm_add_epi16(a1b0_2, a0a1b0b1_8), 3);
+    const __m128i d0 = _mm_add_epi16(c1, a0);
+    const __m128i d1 = _mm_add_epi16(c0, a1);
+    const __m128i e0 = _mm_srai_epi16(d0, 1);
+    const __m128i e1 = _mm_srai_epi16(d1, 1);
+    const __m128i f0 = _mm_unpacklo_epi16(e0, e1);
+    const __m128i f1 = _mm_unpackhi_epi16(e0, e1);
+    const __m128i g0 = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 0));
+    const __m128i g1 = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 8));
+    const __m128i h0 = _mm_add_epi16(g0, f0);
+    const __m128i h1 = _mm_add_epi16(g1, f1);
+    const __m128i i0 = _mm_max_epi16(_mm_min_epi16(h0, max), zero);
+    const __m128i i1 = _mm_max_epi16(_mm_min_epi16(h1, max), zero);
+    _mm_storeu_si128((__m128i*)(out + 2 * i + 0), i0);
+    _mm_storeu_si128((__m128i*)(out + 2 * i + 8), i1);
+  }
+  for (; i < len; ++i) {
+    //   (9 * A0 + 3 * A1 + 3 * B0 + B1 + 8) >> 4 =
+    // = (8 * A0 + 2 * (A1 + B0) + (A0 + A1 + B0 + B1 + 8)) >> 4
+    // We reuse the common sub-expressions.
+    const int a0b1 = A[i + 0] + B[i + 1];
+    const int a1b0 = A[i + 1] + B[i + 0];
+    const int a0a1b0b1 = a0b1 + a1b0 + 8;
+    const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4;
+    const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4;
+    out[2 * i + 0] = clip_SSE2(best_y[2 * i + 0] + v0, max_y);
+    out[2 * i + 1] = clip_SSE2(best_y[2 * i + 1] + v1, max_y);
+  }
+}
+
+static WEBP_INLINE __m128i s16_to_s32(__m128i in) {
+  return _mm_srai_epi32(_mm_unpacklo_epi16(in, in), 16);
+}
+
+static void SharpYuvFilterRow32_SSE2(const int16_t* A, const int16_t* B,
+                                     int len, const uint16_t* best_y,
+                                     uint16_t* out, int bit_depth) {
+  const int max_y = (1 << bit_depth) - 1;
+  int i;
+  const __m128i kCst8 = _mm_set1_epi32(8);
+  const __m128i max = _mm_set1_epi16(max_y);
+  const __m128i zero = _mm_setzero_si128();
+  for (i = 0; i + 4 <= len; i += 4) {
+    const __m128i a0 = s16_to_s32(_mm_loadl_epi64((const __m128i*)(A + i + 0)));
+    const __m128i a1 = s16_to_s32(_mm_loadl_epi64((const __m128i*)(A + i + 1)));
+    const __m128i b0 = s16_to_s32(_mm_loadl_epi64((const __m128i*)(B + i + 0)));
+    const __m128i b1 = s16_to_s32(_mm_loadl_epi64((const __m128i*)(B + i + 1)));
+    const __m128i a0b1 = _mm_add_epi32(a0, b1);
+    const __m128i a1b0 = _mm_add_epi32(a1, b0);
+    const __m128i a0a1b0b1 = _mm_add_epi32(a0b1, a1b0);  // A0+A1+B0+B1
+    const __m128i a0a1b0b1_8 = _mm_add_epi32(a0a1b0b1, kCst8);
+    const __m128i a0b1_2 = _mm_add_epi32(a0b1, a0b1);  // 2*(A0+B1)
+    const __m128i a1b0_2 = _mm_add_epi32(a1b0, a1b0);  // 2*(A1+B0)
+    const __m128i c0 = _mm_srai_epi32(_mm_add_epi32(a0b1_2, a0a1b0b1_8), 3);
+    const __m128i c1 = _mm_srai_epi32(_mm_add_epi32(a1b0_2, a0a1b0b1_8), 3);
+    const __m128i d0 = _mm_add_epi32(c1, a0);
+    const __m128i d1 = _mm_add_epi32(c0, a1);
+    const __m128i e0 = _mm_srai_epi32(d0, 1);
+    const __m128i e1 = _mm_srai_epi32(d1, 1);
+    const __m128i f0 = _mm_unpacklo_epi32(e0, e1);
+    const __m128i f1 = _mm_unpackhi_epi32(e0, e1);
+    const __m128i g = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 0));
+    const __m128i h_16 = _mm_add_epi16(g, _mm_packs_epi32(f0, f1));
+    const __m128i final = _mm_max_epi16(_mm_min_epi16(h_16, max), zero);
+    _mm_storeu_si128((__m128i*)(out + 2 * i + 0), final);
+  }
+  for (; i < len; ++i) {
+    //   (9 * A0 + 3 * A1 + 3 * B0 + B1 + 8) >> 4 =
+    // = (8 * A0 + 2 * (A1 + B0) + (A0 + A1 + B0 + B1 + 8)) >> 4
+    // We reuse the common sub-expressions.
+    const int a0b1 = A[i + 0] + B[i + 1];
+    const int a1b0 = A[i + 1] + B[i + 0];
+    const int a0a1b0b1 = a0b1 + a1b0 + 8;
+    const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4;
+    const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4;
+    out[2 * i + 0] = clip_SSE2(best_y[2 * i + 0] + v0, max_y);
+    out[2 * i + 1] = clip_SSE2(best_y[2 * i + 1] + v1, max_y);
+  }
+}
+
+static void SharpYuvFilterRow_SSE2(const int16_t* A, const int16_t* B, int len,
+                                   const uint16_t* best_y, uint16_t* out,
+                                   int bit_depth) {
+  if (bit_depth <= 10) {
+    SharpYuvFilterRow16_SSE2(A, B, len, best_y, out, bit_depth);
+  } else {
+    SharpYuvFilterRow32_SSE2(A, B, len, best_y, out, bit_depth);
+  }
+}
+
+//------------------------------------------------------------------------------
+
+extern void InitSharpYuvSSE2(void);
+
+WEBP_TSAN_IGNORE_FUNCTION void InitSharpYuvSSE2(void) {
+  SharpYuvUpdateY = SharpYuvUpdateY_SSE2;
+  SharpYuvUpdateRGB = SharpYuvUpdateRGB_SSE2;
+  SharpYuvFilterRow = SharpYuvFilterRow_SSE2;
+}
+#else  // !WEBP_USE_SSE2
+
+extern void InitSharpYuvSSE2(void);
+
+void InitSharpYuvSSE2(void) {}
+
+#endif  // WEBP_USE_SSE2
diff --git a/third_party/libwebp/src/Makefile.am b/third_party/libwebp/src/Makefile.am
index 32cfa38..23da9fb 100644
--- a/third_party/libwebp/src/Makefile.am
+++ b/third_party/libwebp/src/Makefile.am
@@ -1,10 +1,10 @@
 # The mux and demux libraries depend on libwebp, thus the '.' to force
 # the build order so it's available to them.
 SUBDIRS = dec enc dsp utils .
-if WANT_MUX
+if BUILD_MUX
   SUBDIRS += mux
 endif
-if WANT_DEMUX
+if BUILD_DEMUX
   SUBDIRS += demux
 endif
 
@@ -36,7 +36,7 @@
 # other than the ones listed on the command line, i.e., after linking, it will
 # not have unresolved symbols. Some platforms (Windows among them) require all
 # symbols in shared libraries to be resolved at library creation.
-libwebp_la_LDFLAGS = -no-undefined -version-info 7:2:0
+libwebp_la_LDFLAGS = -no-undefined -version-info 8:7:1
 libwebpincludedir = $(includedir)/webp
 pkgconfig_DATA = libwebp.pc
 
@@ -48,7 +48,7 @@
   libwebpdecoder_la_LIBADD += dsp/libwebpdspdecode.la
   libwebpdecoder_la_LIBADD += utils/libwebputilsdecode.la
 
-  libwebpdecoder_la_LDFLAGS = -no-undefined -version-info 3:2:0
+  libwebpdecoder_la_LDFLAGS = -no-undefined -version-info 4:7:1
   pkgconfig_DATA += libwebpdecoder.pc
 endif
 
diff --git a/third_party/libwebp/src/dec/alpha_dec.c b/third_party/libwebp/src/dec/alpha_dec.c
index c2bef1d..94d71ac 100644
--- a/third_party/libwebp/src/dec/alpha_dec.c
+++ b/third_party/libwebp/src/dec/alpha_dec.c
@@ -189,7 +189,7 @@
   assert(dec != NULL && io != NULL);
 
   if (row < 0 || num_rows <= 0 || row + num_rows > height) {
-    return NULL;    // sanity check.
+    return NULL;
   }
 
   if (!dec->is_alpha_decoded_) {
diff --git a/third_party/libwebp/src/dec/alphai_dec.h b/third_party/libwebp/src/dec/alphai_dec.h
index e0fa281..a64104a 100644
--- a/third_party/libwebp/src/dec/alphai_dec.h
+++ b/third_party/libwebp/src/dec/alphai_dec.h
@@ -51,4 +51,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_DEC_ALPHAI_DEC_H_ */
+#endif  // WEBP_DEC_ALPHAI_DEC_H_
diff --git a/third_party/libwebp/src/dec/buffer_dec.c b/third_party/libwebp/src/dec/buffer_dec.c
index d6d99b9..8ca5e23 100644
--- a/third_party/libwebp/src/dec/buffer_dec.c
+++ b/third_party/libwebp/src/dec/buffer_dec.c
@@ -79,7 +79,8 @@
   } else {    // RGB checks
     const WebPRGBABuffer* const buf = &buffer->u.RGBA;
     const int stride = abs(buf->stride);
-    const uint64_t size = MIN_BUFFER_SIZE(width, height, stride);
+    const uint64_t size =
+        MIN_BUFFER_SIZE(width * kModeBpp[mode], height, stride);
     ok &= (size <= buf->size);
     ok &= (stride >= width * kModeBpp[mode]);
     ok &= (buf->rgba != NULL);
@@ -106,7 +107,7 @@
     int stride;
     uint64_t size;
 
-    if ((uint64_t)w * kModeBpp[mode] >= (1ull << 32)) {
+    if ((uint64_t)w * kModeBpp[mode] >= (1ull << 31)) {
       return VP8_STATUS_INVALID_PARAM;
     }
     stride = w * kModeBpp[mode];
@@ -121,7 +122,6 @@
     }
     total_size = size + 2 * uv_size + a_size;
 
-    // Security/sanity checks
     output = (uint8_t*)WebPSafeMalloc(total_size, sizeof(*output));
     if (output == NULL) {
       return VP8_STATUS_OUT_OF_MEMORY;
@@ -160,11 +160,11 @@
   }
   if (WebPIsRGBMode(buffer->colorspace)) {
     WebPRGBABuffer* const buf = &buffer->u.RGBA;
-    buf->rgba += (buffer->height - 1) * buf->stride;
+    buf->rgba += (int64_t)(buffer->height - 1) * buf->stride;
     buf->stride = -buf->stride;
   } else {
     WebPYUVABuffer* const buf = &buffer->u.YUVA;
-    const int H = buffer->height;
+    const int64_t H = buffer->height;
     buf->y += (H - 1) * buf->y_stride;
     buf->y_stride = -buf->y_stride;
     buf->u += ((H - 1) >> 1) * buf->u_stride;
@@ -192,8 +192,7 @@
       const int ch = options->crop_height;
       const int x = options->crop_left & ~1;
       const int y = options->crop_top & ~1;
-      if (x < 0 || y < 0 || cw <= 0 || ch <= 0 ||
-          x + cw > width || y + ch > height) {
+      if (!WebPCheckCropDimensions(width, height, x, y, cw, ch)) {
         return VP8_STATUS_INVALID_PARAM;   // out of frame boundary.
       }
       width = cw;
diff --git a/third_party/libwebp/src/dec/common_dec.h b/third_party/libwebp/src/dec/common_dec.h
index 9995f1a..b158550 100644
--- a/third_party/libwebp/src/dec/common_dec.h
+++ b/third_party/libwebp/src/dec/common_dec.h
@@ -51,4 +51,4 @@
        NUM_PROBAS = 11
      };
 
-#endif    // WEBP_DEC_COMMON_DEC_H_
+#endif  // WEBP_DEC_COMMON_DEC_H_
diff --git a/third_party/libwebp/src/dec/frame_dec.c b/third_party/libwebp/src/dec/frame_dec.c
index 0d44798..98fba09 100644
--- a/third_party/libwebp/src/dec/frame_dec.c
+++ b/third_party/libwebp/src/dec/frame_dec.c
@@ -344,7 +344,6 @@
       for (s = 0; s < NUM_MB_SEGMENTS; ++s) {
         VP8QuantMatrix* const dqm = &dec->dqm_[s];
         if (dqm->uv_quant_ < DITHER_AMP_TAB_SIZE) {
-          // TODO(skal): should we specially dither more for uv_quant_ < 0?
           const int idx = (dqm->uv_quant_ < 0) ? 0 : dqm->uv_quant_;
           dqm->dither_ = (f * kQuantToDitherAmp[idx]) >> 3;
         }
@@ -675,15 +674,9 @@
   (void)height;
   assert(headers == NULL || !headers->is_lossless);
 #if defined(WEBP_USE_THREAD)
-  if (width < MIN_WIDTH_FOR_THREADS) return 0;
-  // TODO(skal): tune the heuristic further
-#if 0
-  if (height < 2 * width) return 2;
+  if (width >= MIN_WIDTH_FOR_THREADS) return 2;
 #endif
-  return 2;
-#else   // !WEBP_USE_THREAD
   return 0;
-#endif
 }
 
 #undef MT_CACHE_LINES
@@ -718,7 +711,7 @@
                         + cache_size + alpha_size + WEBP_ALIGN_CST;
   uint8_t* mem;
 
-  if (needed != (size_t)needed) return 0;  // check for overflow
+  if (!CheckSizeOverflow(needed)) return 0;  // check for overflow
   if (needed > dec->mem_size_) {
     WebPSafeFree(dec->mem_);
     dec->mem_size_ = 0;
@@ -745,7 +738,7 @@
   mem += f_info_size;
   dec->thread_ctx_.id_ = 0;
   dec->thread_ctx_.f_info_ = dec->f_info_;
-  if (dec->mt_method_ > 0) {
+  if (dec->filter_type_ > 0 && dec->mt_method_ > 0) {
     // secondary cache line. The deblocking process need to make use of the
     // filtering strength from previous macroblock row, while the new ones
     // are being decoded in parallel. We'll just swap the pointers.
diff --git a/third_party/libwebp/src/dec/idec_dec.c b/third_party/libwebp/src/dec/idec_dec.c
index d7d0226..cf3c967 100644
--- a/third_party/libwebp/src/dec/idec_dec.c
+++ b/third_party/libwebp/src/dec/idec_dec.c
@@ -146,10 +146,9 @@
       if (NeedCompressedAlpha(idec)) {
         ALPHDecoder* const alph_dec = dec->alph_dec_;
         dec->alpha_data_ += offset;
-        if (alph_dec != NULL) {
+        if (alph_dec != NULL && alph_dec->vp8l_dec_ != NULL) {
           if (alph_dec->method_ == ALPHA_LOSSLESS_COMPRESSION) {
             VP8LDecoder* const alph_vp8l_dec = alph_dec->vp8l_dec_;
-            assert(alph_vp8l_dec != NULL);
             assert(dec->alpha_data_size_ >= ALPHA_HEADER_LEN);
             VP8LBitReaderSetBuffer(&alph_vp8l_dec->br_,
                                    dec->alpha_data_ + ALPHA_HEADER_LEN,
@@ -173,9 +172,11 @@
   VP8Decoder* const dec = (VP8Decoder*)idec->dec_;
   MemBuffer* const mem = &idec->mem_;
   const int need_compressed_alpha = NeedCompressedAlpha(idec);
-  const uint8_t* const old_start = mem->buf_ + mem->start_;
+  const uint8_t* const old_start =
+      (mem->buf_ == NULL) ? NULL : mem->buf_ + mem->start_;
   const uint8_t* const old_base =
       need_compressed_alpha ? dec->alpha_data_ : old_start;
+  assert(mem->buf_ != NULL || mem->start_ == 0);
   assert(mem->mode_ == MEM_MODE_APPEND);
   if (data_size > MAX_CHUNK_PAYLOAD) {
     // security safeguard: trying to allocate more than what the format
@@ -191,7 +192,7 @@
     uint8_t* const new_buf =
         (uint8_t*)WebPSafeMalloc(extra_size, sizeof(*new_buf));
     if (new_buf == NULL) return 0;
-    memcpy(new_buf, old_base, current_size);
+    if (old_base != NULL) memcpy(new_buf, old_base, current_size);
     WebPSafeFree(mem->buf_);
     mem->buf_ = new_buf;
     mem->buf_size_ = (size_t)extra_size;
@@ -199,6 +200,7 @@
     mem->end_ = current_size;
   }
 
+  assert(mem->buf_ != NULL);
   memcpy(mem->buf_ + mem->end_, data, data_size);
   mem->end_ += data_size;
   assert(mem->end_ <= mem->buf_size_);
@@ -211,7 +213,9 @@
                           const uint8_t* const data, size_t data_size) {
   MemBuffer* const mem = &idec->mem_;
   const uint8_t* const old_buf = mem->buf_;
-  const uint8_t* const old_start = old_buf + mem->start_;
+  const uint8_t* const old_start =
+      (old_buf == NULL) ? NULL : old_buf + mem->start_;
+  assert(old_buf != NULL || mem->start_ == 0);
   assert(mem->mode_ == MEM_MODE_MAP);
 
   if (data_size < mem->buf_size_) return 0;  // can't remap to a shorter buffer!
@@ -289,10 +293,8 @@
 
 static VP8StatusCode IDecError(WebPIDecoder* const idec, VP8StatusCode error) {
   if (idec->state_ == STATE_VP8_DATA) {
-    VP8Io* const io = &idec->io_;
-    if (io->teardown != NULL) {
-      io->teardown(io);
-    }
+    // Synchronize the thread, clean-up and check for errors.
+    VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_);
   }
   idec->state_ = STATE_ERROR;
   return error;
@@ -457,7 +459,10 @@
   VP8Decoder* const dec = (VP8Decoder*)idec->dec_;
   VP8Io* const io = &idec->io_;
 
-  assert(dec->ready_);
+  // Make sure partition #0 has been read before, to set dec to ready_.
+  if (!dec->ready_) {
+    return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR);
+  }
   for (; dec->mb_y_ < dec->mb_h_; ++dec->mb_y_) {
     if (idec->last_mb_y_ != dec->mb_y_) {
       if (!VP8ParseIntraModeRow(&dec->br_, dec)) {
@@ -479,6 +484,12 @@
             MemDataSize(&idec->mem_) > MAX_MB_SIZE) {
           return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR);
         }
+        // Synchronize the threads.
+        if (dec->mt_method_ > 0) {
+          if (!WebPGetWorkerInterface()->Sync(&dec->worker_)) {
+            return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR);
+          }
+        }
         RestoreContext(&context, dec, token_br);
         return VP8_STATUS_SUSPENDED;
       }
@@ -497,6 +508,7 @@
   }
   // Synchronize the thread and check for errors.
   if (!VP8ExitCritical(dec, io)) {
+    idec->state_ = STATE_ERROR;  // prevent re-entry in IDecError
     return IDecError(idec, VP8_STATUS_USER_ABORT);
   }
   dec->ready_ = 0;
@@ -577,6 +589,10 @@
     status = DecodePartition0(idec);
   }
   if (idec->state_ == STATE_VP8_DATA) {
+    const VP8Decoder* const dec = (VP8Decoder*)idec->dec_;
+    if (dec == NULL) {
+      return VP8_STATUS_SUSPENDED;  // can't continue if we have no decoder.
+    }
     status = DecodeRemaining(idec);
   }
   if (idec->state_ == STATE_VP8L_HEADER) {
diff --git a/third_party/libwebp/src/dec/io_dec.c b/third_party/libwebp/src/dec/io_dec.c
index 1924435..a67af25 100644
--- a/third_party/libwebp/src/dec/io_dec.c
+++ b/third_party/libwebp/src/dec/io_dec.c
@@ -32,21 +32,16 @@
 static int EmitYUV(const VP8Io* const io, WebPDecParams* const p) {
   WebPDecBuffer* output = p->output;
   const WebPYUVABuffer* const buf = &output->u.YUVA;
-  uint8_t* const y_dst = buf->y + io->mb_y * buf->y_stride;
-  uint8_t* const u_dst = buf->u + (io->mb_y >> 1) * buf->u_stride;
-  uint8_t* const v_dst = buf->v + (io->mb_y >> 1) * buf->v_stride;
+  uint8_t* const y_dst = buf->y + (size_t)io->mb_y * buf->y_stride;
+  uint8_t* const u_dst = buf->u + (size_t)(io->mb_y >> 1) * buf->u_stride;
+  uint8_t* const v_dst = buf->v + (size_t)(io->mb_y >> 1) * buf->v_stride;
   const int mb_w = io->mb_w;
   const int mb_h = io->mb_h;
   const int uv_w = (mb_w + 1) / 2;
   const int uv_h = (mb_h + 1) / 2;
-  int j;
-  for (j = 0; j < mb_h; ++j) {
-    memcpy(y_dst + j * buf->y_stride, io->y + j * io->y_stride, mb_w);
-  }
-  for (j = 0; j < uv_h; ++j) {
-    memcpy(u_dst + j * buf->u_stride, io->u + j * io->uv_stride, uv_w);
-    memcpy(v_dst + j * buf->v_stride, io->v + j * io->uv_stride, uv_w);
-  }
+  WebPCopyPlane(io->y, io->y_stride, y_dst, buf->y_stride, mb_w, mb_h);
+  WebPCopyPlane(io->u, io->uv_stride, u_dst, buf->u_stride, uv_w, uv_h);
+  WebPCopyPlane(io->v, io->uv_stride, v_dst, buf->v_stride, uv_w, uv_h);
   return io->mb_h;
 }
 
@@ -54,7 +49,7 @@
 static int EmitSampledRGB(const VP8Io* const io, WebPDecParams* const p) {
   WebPDecBuffer* const output = p->output;
   WebPRGBABuffer* const buf = &output->u.RGBA;
-  uint8_t* const dst = buf->rgba + io->mb_y * buf->stride;
+  uint8_t* const dst = buf->rgba + (size_t)io->mb_y * buf->stride;
   WebPSamplerProcessPlane(io->y, io->y_stride,
                           io->u, io->v, io->uv_stride,
                           dst, buf->stride, io->mb_w, io->mb_h,
@@ -69,7 +64,7 @@
 static int EmitFancyRGB(const VP8Io* const io, WebPDecParams* const p) {
   int num_lines_out = io->mb_h;   // a priori guess
   const WebPRGBABuffer* const buf = &p->output->u.RGBA;
-  uint8_t* dst = buf->rgba + io->mb_y * buf->stride;
+  uint8_t* dst = buf->rgba + (size_t)io->mb_y * buf->stride;
   WebPUpsampleLinePairFunc upsample = WebPUpsamplers[p->output->colorspace];
   const uint8_t* cur_y = io->y;
   const uint8_t* cur_u = io->u;
@@ -140,7 +135,7 @@
   const WebPYUVABuffer* const buf = &p->output->u.YUVA;
   const int mb_w = io->mb_w;
   const int mb_h = io->mb_h;
-  uint8_t* dst = buf->a + io->mb_y * buf->a_stride;
+  uint8_t* dst = buf->a + (size_t)io->mb_y * buf->a_stride;
   int j;
   (void)expected_num_lines_out;
   assert(expected_num_lines_out == mb_h);
@@ -193,7 +188,7 @@
         (colorspace == MODE_ARGB || colorspace == MODE_Argb);
     const WebPRGBABuffer* const buf = &p->output->u.RGBA;
     int num_rows;
-    const int start_y = GetAlphaSourceRow(io, &alpha, &num_rows);
+    const size_t start_y = GetAlphaSourceRow(io, &alpha, &num_rows);
     uint8_t* const base_rgba = buf->rgba + start_y * buf->stride;
     uint8_t* const dst = base_rgba + (alpha_first ? 0 : 3);
     const int has_alpha = WebPDispatchAlpha(alpha, io->width, mb_w,
@@ -217,7 +212,7 @@
     const WEBP_CSP_MODE colorspace = p->output->colorspace;
     const WebPRGBABuffer* const buf = &p->output->u.RGBA;
     int num_rows;
-    const int start_y = GetAlphaSourceRow(io, &alpha, &num_rows);
+    const size_t start_y = GetAlphaSourceRow(io, &alpha, &num_rows);
     uint8_t* const base_rgba = buf->rgba + start_y * buf->stride;
 #if (WEBP_SWAP_16BIT_CSP == 1)
     uint8_t* alpha_dst = base_rgba;
@@ -283,9 +278,9 @@
 static int EmitRescaledAlphaYUV(const VP8Io* const io, WebPDecParams* const p,
                                 int expected_num_lines_out) {
   const WebPYUVABuffer* const buf = &p->output->u.YUVA;
-  uint8_t* const dst_a = buf->a + p->last_y * buf->a_stride;
+  uint8_t* const dst_a = buf->a + (size_t)p->last_y * buf->a_stride;
   if (io->a != NULL) {
-    uint8_t* const dst_y = buf->y + p->last_y * buf->y_stride;
+    uint8_t* const dst_y = buf->y + (size_t)p->last_y * buf->y_stride;
     const int num_lines_out = Rescale(io->a, io->width, io->mb_h, p->scaler_a);
     assert(expected_num_lines_out == num_lines_out);
     if (num_lines_out > 0) {   // unmultiply the Y
@@ -310,46 +305,57 @@
   const int uv_out_height = (out_height + 1) >> 1;
   const int uv_in_width  = (io->mb_w + 1) >> 1;
   const int uv_in_height = (io->mb_h + 1) >> 1;
-  const size_t work_size = 2 * out_width;   // scratch memory for luma rescaler
+  // scratch memory for luma rescaler
+  const size_t work_size = 2 * (size_t)out_width;
   const size_t uv_work_size = 2 * uv_out_width;  // and for each u/v ones
-  size_t tmp_size, rescaler_size;
+  uint64_t total_size;
+  size_t rescaler_size;
   rescaler_t* work;
   WebPRescaler* scalers;
   const int num_rescalers = has_alpha ? 4 : 3;
 
-  tmp_size = (work_size + 2 * uv_work_size) * sizeof(*work);
+  total_size = ((uint64_t)work_size + 2 * uv_work_size) * sizeof(*work);
   if (has_alpha) {
-    tmp_size += work_size * sizeof(*work);
+    total_size += (uint64_t)work_size * sizeof(*work);
   }
   rescaler_size = num_rescalers * sizeof(*p->scaler_y) + WEBP_ALIGN_CST;
+  total_size += rescaler_size;
+  if (!CheckSizeOverflow(total_size)) {
+    return 0;
+  }
 
-  p->memory = WebPSafeMalloc(1ULL, tmp_size + rescaler_size);
+  p->memory = WebPSafeMalloc(1ULL, (size_t)total_size);
   if (p->memory == NULL) {
     return 0;   // memory error
   }
   work = (rescaler_t*)p->memory;
 
-  scalers = (WebPRescaler*)WEBP_ALIGN((const uint8_t*)work + tmp_size);
+  scalers = (WebPRescaler*)WEBP_ALIGN(
+      (const uint8_t*)work + total_size - rescaler_size);
   p->scaler_y = &scalers[0];
   p->scaler_u = &scalers[1];
   p->scaler_v = &scalers[2];
   p->scaler_a = has_alpha ? &scalers[3] : NULL;
 
-  WebPRescalerInit(p->scaler_y, io->mb_w, io->mb_h,
-                   buf->y, out_width, out_height, buf->y_stride, 1,
-                   work);
-  WebPRescalerInit(p->scaler_u, uv_in_width, uv_in_height,
-                   buf->u, uv_out_width, uv_out_height, buf->u_stride, 1,
-                   work + work_size);
-  WebPRescalerInit(p->scaler_v, uv_in_width, uv_in_height,
-                   buf->v, uv_out_width, uv_out_height, buf->v_stride, 1,
-                   work + work_size + uv_work_size);
+  if (!WebPRescalerInit(p->scaler_y, io->mb_w, io->mb_h,
+                        buf->y, out_width, out_height, buf->y_stride, 1,
+                        work) ||
+      !WebPRescalerInit(p->scaler_u, uv_in_width, uv_in_height,
+                        buf->u, uv_out_width, uv_out_height, buf->u_stride, 1,
+                        work + work_size) ||
+      !WebPRescalerInit(p->scaler_v, uv_in_width, uv_in_height,
+                        buf->v, uv_out_width, uv_out_height, buf->v_stride, 1,
+                        work + work_size + uv_work_size)) {
+    return 0;
+  }
   p->emit = EmitRescaledYUV;
 
   if (has_alpha) {
-    WebPRescalerInit(p->scaler_a, io->mb_w, io->mb_h,
-                     buf->a, out_width, out_height, buf->a_stride, 1,
-                     work + work_size + 2 * uv_work_size);
+    if (!WebPRescalerInit(p->scaler_a, io->mb_w, io->mb_h,
+                          buf->a, out_width, out_height, buf->a_stride, 1,
+                          work + work_size + 2 * uv_work_size)) {
+      return 0;
+    }
     p->emit_alpha = EmitRescaledAlphaYUV;
     WebPInitAlphaProcessing();
   }
@@ -363,7 +369,7 @@
   const WebPYUV444Converter convert =
       WebPYUV444Converters[p->output->colorspace];
   const WebPRGBABuffer* const buf = &p->output->u.RGBA;
-  uint8_t* dst = buf->rgba + y_pos * buf->stride;
+  uint8_t* dst = buf->rgba + (size_t)y_pos * buf->stride;
   int num_lines_out = 0;
   // For RGB rescaling, because of the YUV420, current scan position
   // U/V can be +1/-1 line from the Y one.  Hence the double test.
@@ -390,15 +396,15 @@
   while (j < mb_h) {
     const int y_lines_in =
         WebPRescalerImport(p->scaler_y, mb_h - j,
-                           io->y + j * io->y_stride, io->y_stride);
+                           io->y + (size_t)j * io->y_stride, io->y_stride);
     j += y_lines_in;
     if (WebPRescaleNeededLines(p->scaler_u, uv_mb_h - uv_j)) {
-      const int u_lines_in =
-          WebPRescalerImport(p->scaler_u, uv_mb_h - uv_j,
-                             io->u + uv_j * io->uv_stride, io->uv_stride);
-      const int v_lines_in =
-          WebPRescalerImport(p->scaler_v, uv_mb_h - uv_j,
-                             io->v + uv_j * io->uv_stride, io->uv_stride);
+      const int u_lines_in = WebPRescalerImport(
+          p->scaler_u, uv_mb_h - uv_j, io->u + (size_t)uv_j * io->uv_stride,
+          io->uv_stride);
+      const int v_lines_in = WebPRescalerImport(
+          p->scaler_v, uv_mb_h - uv_j, io->v + (size_t)uv_j * io->uv_stride,
+          io->uv_stride);
       (void)v_lines_in;   // remove a gcc warning
       assert(u_lines_in == v_lines_in);
       uv_j += u_lines_in;
@@ -410,7 +416,7 @@
 
 static int ExportAlpha(WebPDecParams* const p, int y_pos, int max_lines_out) {
   const WebPRGBABuffer* const buf = &p->output->u.RGBA;
-  uint8_t* const base_rgba = buf->rgba + y_pos * buf->stride;
+  uint8_t* const base_rgba = buf->rgba + (size_t)y_pos * buf->stride;
   const WEBP_CSP_MODE colorspace = p->output->colorspace;
   const int alpha_first =
       (colorspace == MODE_ARGB || colorspace == MODE_Argb);
@@ -438,7 +444,7 @@
 static int ExportAlphaRGBA4444(WebPDecParams* const p, int y_pos,
                                int max_lines_out) {
   const WebPRGBABuffer* const buf = &p->output->u.RGBA;
-  uint8_t* const base_rgba = buf->rgba + y_pos * buf->stride;
+  uint8_t* const base_rgba = buf->rgba + (size_t)y_pos * buf->stride;
 #if (WEBP_SWAP_16BIT_CSP == 1)
   uint8_t* alpha_dst = base_rgba;
 #else
@@ -477,7 +483,7 @@
     int lines_left = expected_num_out_lines;
     const int y_end = p->last_y + lines_left;
     while (lines_left > 0) {
-      const int row_offset = scaler->src_y - io->mb_y;
+      const int64_t row_offset = (int64_t)scaler->src_y - io->mb_y;
       WebPRescalerImport(scaler, io->mb_h + io->mb_y - scaler->src_y,
                          io->a + row_offset * io->width, io->width);
       lines_left -= p->emit_alpha_row(p, y_end - lines_left, lines_left);
@@ -492,51 +498,58 @@
   const int out_height = io->scaled_height;
   const int uv_in_width  = (io->mb_w + 1) >> 1;
   const int uv_in_height = (io->mb_h + 1) >> 1;
-  const size_t work_size = 2 * out_width;   // scratch memory for one rescaler
+  // scratch memory for one rescaler
+  const size_t work_size = 2 * (size_t)out_width;
   rescaler_t* work;  // rescalers work area
   uint8_t* tmp;   // tmp storage for scaled YUV444 samples before RGB conversion
-  size_t tmp_size1, tmp_size2, total_size, rescaler_size;
+  uint64_t tmp_size1, tmp_size2, total_size;
+  size_t rescaler_size;
   WebPRescaler* scalers;
   const int num_rescalers = has_alpha ? 4 : 3;
 
-  tmp_size1 = 3 * work_size;
-  tmp_size2 = 3 * out_width;
-  if (has_alpha) {
-    tmp_size1 += work_size;
-    tmp_size2 += out_width;
-  }
+  tmp_size1 = (uint64_t)num_rescalers * work_size;
+  tmp_size2 = (uint64_t)num_rescalers * out_width;
   total_size = tmp_size1 * sizeof(*work) + tmp_size2 * sizeof(*tmp);
   rescaler_size = num_rescalers * sizeof(*p->scaler_y) + WEBP_ALIGN_CST;
+  total_size += rescaler_size;
+  if (!CheckSizeOverflow(total_size)) {
+    return 0;
+  }
 
-  p->memory = WebPSafeMalloc(1ULL, total_size + rescaler_size);
+  p->memory = WebPSafeMalloc(1ULL, (size_t)total_size);
   if (p->memory == NULL) {
     return 0;   // memory error
   }
   work = (rescaler_t*)p->memory;
   tmp = (uint8_t*)(work + tmp_size1);
 
-  scalers = (WebPRescaler*)WEBP_ALIGN((const uint8_t*)work + total_size);
+  scalers = (WebPRescaler*)WEBP_ALIGN(
+      (const uint8_t*)work + total_size - rescaler_size);
   p->scaler_y = &scalers[0];
   p->scaler_u = &scalers[1];
   p->scaler_v = &scalers[2];
   p->scaler_a = has_alpha ? &scalers[3] : NULL;
 
-  WebPRescalerInit(p->scaler_y, io->mb_w, io->mb_h,
-                   tmp + 0 * out_width, out_width, out_height, 0, 1,
-                   work + 0 * work_size);
-  WebPRescalerInit(p->scaler_u, uv_in_width, uv_in_height,
-                   tmp + 1 * out_width, out_width, out_height, 0, 1,
-                   work + 1 * work_size);
-  WebPRescalerInit(p->scaler_v, uv_in_width, uv_in_height,
-                   tmp + 2 * out_width, out_width, out_height, 0, 1,
-                   work + 2 * work_size);
+  if (!WebPRescalerInit(p->scaler_y, io->mb_w, io->mb_h,
+                        tmp + 0 * out_width, out_width, out_height, 0, 1,
+                        work + 0 * work_size) ||
+      !WebPRescalerInit(p->scaler_u, uv_in_width, uv_in_height,
+                        tmp + 1 * out_width, out_width, out_height, 0, 1,
+                        work + 1 * work_size) ||
+      !WebPRescalerInit(p->scaler_v, uv_in_width, uv_in_height,
+                        tmp + 2 * out_width, out_width, out_height, 0, 1,
+                        work + 2 * work_size)) {
+    return 0;
+  }
   p->emit = EmitRescaledRGB;
   WebPInitYUV444Converters();
 
   if (has_alpha) {
-    WebPRescalerInit(p->scaler_a, io->mb_w, io->mb_h,
-                     tmp + 3 * out_width, out_width, out_height, 0, 1,
-                     work + 3 * work_size);
+    if (!WebPRescalerInit(p->scaler_a, io->mb_w, io->mb_h,
+                          tmp + 3 * out_width, out_width, out_height, 0, 1,
+                          work + 3 * work_size)) {
+      return 0;
+    }
     p->emit_alpha = EmitRescaledAlphaRGB;
     if (p->output->colorspace == MODE_RGBA_4444 ||
         p->output->colorspace == MODE_rgbA_4444) {
diff --git a/third_party/libwebp/src/dec/quant_dec.c b/third_party/libwebp/src/dec/quant_dec.c
index f07212a..a0ac018 100644
--- a/third_party/libwebp/src/dec/quant_dec.c
+++ b/third_party/libwebp/src/dec/quant_dec.c
@@ -61,12 +61,17 @@
 
 void VP8ParseQuant(VP8Decoder* const dec) {
   VP8BitReader* const br = &dec->br_;
-  const int base_q0 = VP8GetValue(br, 7);
-  const int dqy1_dc = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
-  const int dqy2_dc = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
-  const int dqy2_ac = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
-  const int dquv_dc = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
-  const int dquv_ac = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
+  const int base_q0 = VP8GetValue(br, 7, "global-header");
+  const int dqy1_dc = VP8Get(br, "global-header") ?
+       VP8GetSignedValue(br, 4, "global-header") : 0;
+  const int dqy2_dc = VP8Get(br, "global-header") ?
+       VP8GetSignedValue(br, 4, "global-header") : 0;
+  const int dqy2_ac = VP8Get(br, "global-header") ?
+       VP8GetSignedValue(br, 4, "global-header") : 0;
+  const int dquv_dc = VP8Get(br, "global-header") ?
+       VP8GetSignedValue(br, 4, "global-header") : 0;
+  const int dquv_ac = VP8Get(br, "global-header") ?
+       VP8GetSignedValue(br, 4, "global-header") : 0;
 
   const VP8SegmentHeader* const hdr = &dec->segment_hdr_;
   int i;
diff --git a/third_party/libwebp/src/dec/tree_dec.c b/third_party/libwebp/src/dec/tree_dec.c
index 1bd4dfc..5b24c70 100644
--- a/third_party/libwebp/src/dec/tree_dec.c
+++ b/third_party/libwebp/src/dec/tree_dec.c
@@ -16,10 +16,11 @@
 #endif
 
 #include "src/dec/vp8i_dec.h"
+#include "src/dsp/cpu.h"
 #include "src/utils/bit_reader_inl_utils.h"
 
 #if !defined(USE_GENERIC_TREE)
-#if !defined(__arm__) && !defined(_M_ARM) && !defined(__aarch64__)
+#if !defined(__arm__) && !defined(_M_ARM) && !WEBP_AARCH64
 // using a table is ~1-2% slower on ARM. Prefer the coded-tree approach then.
 #define USE_GENERIC_TREE 1   // ALTERNATE_CODE
 #else
@@ -300,20 +301,21 @@
   // to decode more than 1 keyframe.
   if (dec->segment_hdr_.update_map_) {
     // Hardcoded tree parsing
-    block->segment_ = !VP8GetBit(br, dec->proba_.segments_[0])
-                    ? VP8GetBit(br, dec->proba_.segments_[1])
-                    : 2 + VP8GetBit(br, dec->proba_.segments_[2]);
+    block->segment_ = !VP8GetBit(br, dec->proba_.segments_[0], "segments")
+                    ?  VP8GetBit(br, dec->proba_.segments_[1], "segments")
+                    :  VP8GetBit(br, dec->proba_.segments_[2], "segments") + 2;
   } else {
     block->segment_ = 0;  // default for intra
   }
-  if (dec->use_skip_proba_) block->skip_ = VP8GetBit(br, dec->skip_p_);
+  if (dec->use_skip_proba_) block->skip_ = VP8GetBit(br, dec->skip_p_, "skip");
 
-  block->is_i4x4_ = !VP8GetBit(br, 145);   // decide for B_PRED first
+  block->is_i4x4_ = !VP8GetBit(br, 145, "block-size");
   if (!block->is_i4x4_) {
     // Hardcoded 16x16 intra-mode decision tree.
     const int ymode =
-        VP8GetBit(br, 156) ? (VP8GetBit(br, 128) ? TM_PRED : H_PRED)
-                           : (VP8GetBit(br, 163) ? V_PRED : DC_PRED);
+        VP8GetBit(br, 156, "pred-modes") ?
+            (VP8GetBit(br, 128, "pred-modes") ? TM_PRED : H_PRED) :
+            (VP8GetBit(br, 163, "pred-modes") ? V_PRED : DC_PRED);
     block->imodes_[0] = ymode;
     memset(top, ymode, 4 * sizeof(*top));
     memset(left, ymode, 4 * sizeof(*left));
@@ -327,22 +329,25 @@
         const uint8_t* const prob = kBModesProba[top[x]][ymode];
 #if (USE_GENERIC_TREE == 1)
         // Generic tree-parsing
-        int i = kYModesIntra4[VP8GetBit(br, prob[0])];
+        int i = kYModesIntra4[VP8GetBit(br, prob[0], "pred-modes")];
         while (i > 0) {
-          i = kYModesIntra4[2 * i + VP8GetBit(br, prob[i])];
+          i = kYModesIntra4[2 * i + VP8GetBit(br, prob[i], "pred-modes")];
         }
         ymode = -i;
 #else
         // Hardcoded tree parsing
-        ymode = !VP8GetBit(br, prob[0]) ? B_DC_PRED :
-                  !VP8GetBit(br, prob[1]) ? B_TM_PRED :
-                    !VP8GetBit(br, prob[2]) ? B_VE_PRED :
-                      !VP8GetBit(br, prob[3]) ?
-                        (!VP8GetBit(br, prob[4]) ? B_HE_PRED :
-                          (!VP8GetBit(br, prob[5]) ? B_RD_PRED : B_VR_PRED)) :
-                        (!VP8GetBit(br, prob[6]) ? B_LD_PRED :
-                          (!VP8GetBit(br, prob[7]) ? B_VL_PRED :
-                            (!VP8GetBit(br, prob[8]) ? B_HD_PRED : B_HU_PRED)));
+        ymode = !VP8GetBit(br, prob[0], "pred-modes") ? B_DC_PRED :
+                  !VP8GetBit(br, prob[1], "pred-modes") ? B_TM_PRED :
+                    !VP8GetBit(br, prob[2], "pred-modes") ? B_VE_PRED :
+                      !VP8GetBit(br, prob[3], "pred-modes") ?
+                        (!VP8GetBit(br, prob[4], "pred-modes") ? B_HE_PRED :
+                          (!VP8GetBit(br, prob[5], "pred-modes") ? B_RD_PRED
+                                                                 : B_VR_PRED)) :
+                        (!VP8GetBit(br, prob[6], "pred-modes") ? B_LD_PRED :
+                          (!VP8GetBit(br, prob[7], "pred-modes") ? B_VL_PRED :
+                            (!VP8GetBit(br, prob[8], "pred-modes") ? B_HD_PRED
+                                                                   : B_HU_PRED))
+                        );
 #endif  // USE_GENERIC_TREE
         top[x] = ymode;
       }
@@ -352,9 +357,9 @@
     }
   }
   // Hardcoded UVMode decision tree
-  block->uvmode_ = !VP8GetBit(br, 142) ? DC_PRED
-                 : !VP8GetBit(br, 114) ? V_PRED
-                 : VP8GetBit(br, 183) ? TM_PRED : H_PRED;
+  block->uvmode_ = !VP8GetBit(br, 142, "pred-modes-uv") ? DC_PRED
+                 : !VP8GetBit(br, 114, "pred-modes-uv") ? V_PRED
+                 : VP8GetBit(br, 183, "pred-modes-uv") ? TM_PRED : H_PRED;
 }
 
 int VP8ParseIntraModeRow(VP8BitReader* const br, VP8Decoder* const dec) {
@@ -518,8 +523,10 @@
     for (b = 0; b < NUM_BANDS; ++b) {
       for (c = 0; c < NUM_CTX; ++c) {
         for (p = 0; p < NUM_PROBAS; ++p) {
-          const int v = VP8GetBit(br, CoeffsUpdateProba[t][b][c][p]) ?
-                        VP8GetValue(br, 8) : CoeffsProba0[t][b][c][p];
+          const int v =
+              VP8GetBit(br, CoeffsUpdateProba[t][b][c][p], "global-header") ?
+                        VP8GetValue(br, 8, "global-header") :
+                        CoeffsProba0[t][b][c][p];
           proba->bands_[t][b].probas_[c][p] = v;
         }
       }
@@ -528,9 +535,8 @@
       proba->bands_ptr_[t][b] = &proba->bands_[t][kBands[b]];
     }
   }
-  dec->use_skip_proba_ = VP8Get(br);
+  dec->use_skip_proba_ = VP8Get(br, "global-header");
   if (dec->use_skip_proba_) {
-    dec->skip_p_ = VP8GetValue(br, 8);
+    dec->skip_p_ = VP8GetValue(br, 8, "global-header");
   }
 }
-
diff --git a/third_party/libwebp/src/dec/vp8_dec.c b/third_party/libwebp/src/dec/vp8_dec.c
index ea29a20..3f161da 100644
--- a/third_party/libwebp/src/dec/vp8_dec.c
+++ b/third_party/libwebp/src/dec/vp8_dec.c
@@ -166,23 +166,26 @@
                               VP8SegmentHeader* hdr, VP8Proba* proba) {
   assert(br != NULL);
   assert(hdr != NULL);
-  hdr->use_segment_ = VP8Get(br);
+  hdr->use_segment_ = VP8Get(br, "global-header");
   if (hdr->use_segment_) {
-    hdr->update_map_ = VP8Get(br);
-    if (VP8Get(br)) {   // update data
+    hdr->update_map_ = VP8Get(br, "global-header");
+    if (VP8Get(br, "global-header")) {   // update data
       int s;
-      hdr->absolute_delta_ = VP8Get(br);
+      hdr->absolute_delta_ = VP8Get(br, "global-header");
       for (s = 0; s < NUM_MB_SEGMENTS; ++s) {
-        hdr->quantizer_[s] = VP8Get(br) ? VP8GetSignedValue(br, 7) : 0;
+        hdr->quantizer_[s] = VP8Get(br, "global-header") ?
+            VP8GetSignedValue(br, 7, "global-header") : 0;
       }
       for (s = 0; s < NUM_MB_SEGMENTS; ++s) {
-        hdr->filter_strength_[s] = VP8Get(br) ? VP8GetSignedValue(br, 6) : 0;
+        hdr->filter_strength_[s] = VP8Get(br, "global-header") ?
+            VP8GetSignedValue(br, 6, "global-header") : 0;
       }
     }
     if (hdr->update_map_) {
       int s;
       for (s = 0; s < MB_FEATURE_TREE_PROBS; ++s) {
-        proba->segments_[s] = VP8Get(br) ? VP8GetValue(br, 8) : 255u;
+        proba->segments_[s] = VP8Get(br, "global-header") ?
+            VP8GetValue(br, 8, "global-header") : 255u;
       }
     }
   } else {
@@ -210,7 +213,7 @@
   size_t last_part;
   size_t p;
 
-  dec->num_parts_minus_one_ = (1 << VP8GetValue(br, 2)) - 1;
+  dec->num_parts_minus_one_ = (1 << VP8GetValue(br, 2, "global-header")) - 1;
   last_part = dec->num_parts_minus_one_;
   if (size < 3 * last_part) {
     // we can't even read the sizes with sz[]! That's a failure.
@@ -234,21 +237,21 @@
 // Paragraph 9.4
 static int ParseFilterHeader(VP8BitReader* br, VP8Decoder* const dec) {
   VP8FilterHeader* const hdr = &dec->filter_hdr_;
-  hdr->simple_    = VP8Get(br);
-  hdr->level_     = VP8GetValue(br, 6);
-  hdr->sharpness_ = VP8GetValue(br, 3);
-  hdr->use_lf_delta_ = VP8Get(br);
+  hdr->simple_    = VP8Get(br, "global-header");
+  hdr->level_     = VP8GetValue(br, 6, "global-header");
+  hdr->sharpness_ = VP8GetValue(br, 3, "global-header");
+  hdr->use_lf_delta_ = VP8Get(br, "global-header");
   if (hdr->use_lf_delta_) {
-    if (VP8Get(br)) {   // update lf-delta?
+    if (VP8Get(br, "global-header")) {   // update lf-delta?
       int i;
       for (i = 0; i < NUM_REF_LF_DELTAS; ++i) {
-        if (VP8Get(br)) {
-          hdr->ref_lf_delta_[i] = VP8GetSignedValue(br, 6);
+        if (VP8Get(br, "global-header")) {
+          hdr->ref_lf_delta_[i] = VP8GetSignedValue(br, 6, "global-header");
         }
       }
       for (i = 0; i < NUM_MODE_LF_DELTAS; ++i) {
-        if (VP8Get(br)) {
-          hdr->mode_lf_delta_[i] = VP8GetSignedValue(br, 6);
+        if (VP8Get(br, "global-header")) {
+          hdr->mode_lf_delta_[i] = VP8GetSignedValue(br, 6, "global-header");
         }
       }
     }
@@ -337,7 +340,7 @@
     io->scaled_width = io->width;
     io->scaled_height = io->height;
 
-    io->mb_w = io->width;   // sanity check
+    io->mb_w = io->width;   // for soundness
     io->mb_h = io->height;  // ditto
 
     VP8ResetProba(&dec->proba_);
@@ -357,8 +360,8 @@
   buf_size -= frm_hdr->partition_length_;
 
   if (frm_hdr->key_frame_) {
-    pic_hdr->colorspace_ = VP8Get(br);
-    pic_hdr->clamp_type_ = VP8Get(br);
+    pic_hdr->colorspace_ = VP8Get(br, "global-header");
+    pic_hdr->clamp_type_ = VP8Get(br, "global-header");
   }
   if (!ParseSegmentHeader(br, &dec->segment_hdr_, &dec->proba_)) {
     return VP8SetError(dec, VP8_STATUS_BITSTREAM_ERROR,
@@ -383,7 +386,7 @@
                        "Not a key frame.");
   }
 
-  VP8Get(br);   // ignore the value of update_proba_
+  VP8Get(br, "global-header");   // ignore the value of update_proba_
 
   VP8ParseProba(br, dec);
 
@@ -405,31 +408,31 @@
   0, 1, 4, 8,  5, 2, 3, 6,  9, 12, 13, 10,  7, 11, 14, 15
 };
 
-// See section 13-2: http://tools.ietf.org/html/rfc6386#section-13.2
+// See section 13-2: https://datatracker.ietf.org/doc/html/rfc6386#section-13.2
 static int GetLargeValue(VP8BitReader* const br, const uint8_t* const p) {
   int v;
-  if (!VP8GetBit(br, p[3])) {
-    if (!VP8GetBit(br, p[4])) {
+  if (!VP8GetBit(br, p[3], "coeffs")) {
+    if (!VP8GetBit(br, p[4], "coeffs")) {
       v = 2;
     } else {
-      v = 3 + VP8GetBit(br, p[5]);
+      v = 3 + VP8GetBit(br, p[5], "coeffs");
     }
   } else {
-    if (!VP8GetBit(br, p[6])) {
-      if (!VP8GetBit(br, p[7])) {
-        v = 5 + VP8GetBit(br, 159);
+    if (!VP8GetBit(br, p[6], "coeffs")) {
+      if (!VP8GetBit(br, p[7], "coeffs")) {
+        v = 5 + VP8GetBit(br, 159, "coeffs");
       } else {
-        v = 7 + 2 * VP8GetBit(br, 165);
-        v += VP8GetBit(br, 145);
+        v = 7 + 2 * VP8GetBit(br, 165, "coeffs");
+        v += VP8GetBit(br, 145, "coeffs");
       }
     } else {
       const uint8_t* tab;
-      const int bit1 = VP8GetBit(br, p[8]);
-      const int bit0 = VP8GetBit(br, p[9 + bit1]);
+      const int bit1 = VP8GetBit(br, p[8], "coeffs");
+      const int bit0 = VP8GetBit(br, p[9 + bit1], "coeffs");
       const int cat = 2 * bit1 + bit0;
       v = 0;
       for (tab = kCat3456[cat]; *tab; ++tab) {
-        v += v + VP8GetBit(br, *tab);
+        v += v + VP8GetBit(br, *tab, "coeffs");
       }
       v += 3 + (8 << cat);
     }
@@ -443,24 +446,24 @@
                          int ctx, const quant_t dq, int n, int16_t* out) {
   const uint8_t* p = prob[n]->probas_[ctx];
   for (; n < 16; ++n) {
-    if (!VP8GetBit(br, p[0])) {
+    if (!VP8GetBit(br, p[0], "coeffs")) {
       return n;  // previous coeff was last non-zero coeff
     }
-    while (!VP8GetBit(br, p[1])) {       // sequence of zero coeffs
+    while (!VP8GetBit(br, p[1], "coeffs")) {       // sequence of zero coeffs
       p = prob[++n]->probas_[0];
       if (n == 16) return 16;
     }
     {        // non zero coeff
       const VP8ProbaArray* const p_ctx = &prob[n + 1]->probas_[0];
       int v;
-      if (!VP8GetBit(br, p[2])) {
+      if (!VP8GetBit(br, p[2], "coeffs")) {
         v = 1;
         p = p_ctx[1];
       } else {
         v = GetLargeValue(br, p);
         p = p_ctx[2];
       }
-      out[kZigzag[n]] = VP8GetSigned(br, v) * dq[n > 0];
+      out[kZigzag[n]] = VP8GetSigned(br, v, "coeffs") * dq[n > 0];
     }
   }
   return 16;
@@ -473,36 +476,36 @@
                         int ctx, const quant_t dq, int n, int16_t* out) {
   const uint8_t* p = prob[n]->probas_[ctx];
   for (; n < 16; ++n) {
-    if (!VP8GetBitAlt(br, p[0])) {
+    if (!VP8GetBitAlt(br, p[0], "coeffs")) {
       return n;  // previous coeff was last non-zero coeff
     }
-    while (!VP8GetBitAlt(br, p[1])) {       // sequence of zero coeffs
+    while (!VP8GetBitAlt(br, p[1], "coeffs")) {       // sequence of zero coeffs
       p = prob[++n]->probas_[0];
       if (n == 16) return 16;
     }
     {        // non zero coeff
       const VP8ProbaArray* const p_ctx = &prob[n + 1]->probas_[0];
       int v;
-      if (!VP8GetBitAlt(br, p[2])) {
+      if (!VP8GetBitAlt(br, p[2], "coeffs")) {
         v = 1;
         p = p_ctx[1];
       } else {
         v = GetLargeValue(br, p);
         p = p_ctx[2];
       }
-      out[kZigzag[n]] = VP8GetSigned(br, v) * dq[n > 0];
+      out[kZigzag[n]] = VP8GetSigned(br, v, "coeffs") * dq[n > 0];
     }
   }
   return 16;
 }
 
-static WEBP_TSAN_IGNORE_FUNCTION void InitGetCoeffs(void) {
-  if (GetCoeffs == NULL) {
-    if (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kSlowSSSE3)) {
-      GetCoeffs = GetCoeffsAlt;
-    } else {
-      GetCoeffs = GetCoeffsFast;
-    }
+extern VP8CPUInfo VP8GetCPUInfo;
+
+WEBP_DSP_INIT_FUNC(InitGetCoeffs) {
+  if (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kSlowSSSE3)) {
+    GetCoeffs = GetCoeffsAlt;
+  } else {
+    GetCoeffs = GetCoeffsFast;
   }
 }
 
diff --git a/third_party/libwebp/src/dec/vp8_dec.h b/third_party/libwebp/src/dec/vp8_dec.h
index ca85b34..a05405d 100644
--- a/third_party/libwebp/src/dec/vp8_dec.h
+++ b/third_party/libwebp/src/dec/vp8_dec.h
@@ -182,4 +182,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_DEC_VP8_DEC_H_ */
+#endif  // WEBP_DEC_VP8_DEC_H_
diff --git a/third_party/libwebp/src/dec/vp8i_dec.h b/third_party/libwebp/src/dec/vp8i_dec.h
index 33b0dbd..279483b 100644
--- a/third_party/libwebp/src/dec/vp8i_dec.h
+++ b/third_party/libwebp/src/dec/vp8i_dec.h
@@ -34,8 +34,8 @@
 
 // version numbers
 #define DEC_MAJ_VERSION 1
-#define DEC_MIN_VERSION 0
-#define DEC_REV_VERSION 0
+#define DEC_MIN_VERSION 3
+#define DEC_REV_VERSION 1
 
 // YUV-cache parameters. Cache is 32-bytes wide (= one cacheline).
 // Constraints are: We need to store one 16x16 block of luma samples (y),
@@ -319,4 +319,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_DEC_VP8I_DEC_H_ */
+#endif  // WEBP_DEC_VP8I_DEC_H_
diff --git a/third_party/libwebp/src/dec/vp8l_dec.c b/third_party/libwebp/src/dec/vp8l_dec.c
index fba6649..f1e7a11 100644
--- a/third_party/libwebp/src/dec/vp8l_dec.c
+++ b/third_party/libwebp/src/dec/vp8l_dec.c
@@ -88,7 +88,7 @@
 // to 256 (green component values) + 24 (length prefix values)
 // + color_cache_size (between 0 and 2048).
 // All values computed for 8-bit first level lookup with Mark Adler's tool:
-// http://www.hdfgroup.org/ftp/lib-external/zlib/zlib-1.2.5/examples/enough.c
+// https://github.com/madler/zlib/blob/v1.2.5/examples/enough.c
 #define FIXED_TABLE_SIZE (630 * 3 + 410)
 static const uint16_t kTableSize[12] = {
   FIXED_TABLE_SIZE + 654,
@@ -182,7 +182,7 @@
 
 //------------------------------------------------------------------------------
 // Decodes the next Huffman code from bit-stream.
-// FillBitWindow(br) needs to be called at minimum every second call
+// VP8LFillBitWindow(br) needs to be called at minimum every second call
 // to ReadSymbol, in order to pre-fetch enough bits.
 static WEBP_INLINE int ReadSymbol(const HuffmanCode* table,
                                   VP8LBitReader* const br) {
@@ -325,7 +325,7 @@
     // The first code is either 1 bit or 8 bit code.
     int symbol = VP8LReadBits(br, (first_symbol_len_code == 0) ? 1 : 8);
     code_lengths[symbol] = 1;
-    // The second code (if present), is always 8 bit long.
+    // The second code (if present), is always 8 bits long.
     if (num_symbols == 2) {
       symbol = VP8LReadBits(br, 8);
       code_lengths[symbol] = 1;
@@ -367,11 +367,14 @@
   uint32_t* huffman_image = NULL;
   HTreeGroup* htree_groups = NULL;
   HuffmanCode* huffman_tables = NULL;
-  HuffmanCode* next = NULL;
+  HuffmanCode* huffman_table = NULL;
   int num_htree_groups = 1;
+  int num_htree_groups_max = 1;
   int max_alphabet_size = 0;
   int* code_lengths = NULL;
   const int table_size = kTableSize[color_cache_bits];
+  int* mapping = NULL;
+  int ok = 0;
 
   if (allow_recursion && VP8LReadBits(br, 1)) {
     // use meta Huffman codes.
@@ -388,10 +391,36 @@
       // The huffman data is stored in red and green bytes.
       const int group = (huffman_image[i] >> 8) & 0xffff;
       huffman_image[i] = group;
-      if (group >= num_htree_groups) {
-        num_htree_groups = group + 1;
+      if (group >= num_htree_groups_max) {
+        num_htree_groups_max = group + 1;
       }
     }
+    // Check the validity of num_htree_groups_max. If it seems too big, use a
+    // smaller value for later. This will prevent big memory allocations to end
+    // up with a bad bitstream anyway.
+    // The value of 1000 is totally arbitrary. We know that num_htree_groups_max
+    // is smaller than (1 << 16) and should be smaller than the number of pixels
+    // (though the format allows it to be bigger).
+    if (num_htree_groups_max > 1000 || num_htree_groups_max > xsize * ysize) {
+      // Create a mapping from the used indices to the minimal set of used
+      // values [0, num_htree_groups)
+      mapping = (int*)WebPSafeMalloc(num_htree_groups_max, sizeof(*mapping));
+      if (mapping == NULL) {
+        dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+        goto Error;
+      }
+      // -1 means a value is unmapped, and therefore unused in the Huffman
+      // image.
+      memset(mapping, 0xff, num_htree_groups_max * sizeof(*mapping));
+      for (num_htree_groups = 0, i = 0; i < huffman_pixs; ++i) {
+        // Get the current mapping for the group and remap the Huffman image.
+        int* const mapped_group = &mapping[huffman_image[i]];
+        if (*mapped_group == -1) *mapped_group = num_htree_groups++;
+        huffman_image[i] = *mapped_group;
+      }
+    } else {
+      num_htree_groups = num_htree_groups_max;
+    }
   }
 
   if (br->eos_) goto Error;
@@ -407,83 +436,100 @@
     }
   }
 
+  code_lengths = (int*)WebPSafeCalloc((uint64_t)max_alphabet_size,
+                                      sizeof(*code_lengths));
   huffman_tables = (HuffmanCode*)WebPSafeMalloc(num_htree_groups * table_size,
                                                 sizeof(*huffman_tables));
   htree_groups = VP8LHtreeGroupsNew(num_htree_groups);
-  code_lengths = (int*)WebPSafeCalloc((uint64_t)max_alphabet_size,
-                                      sizeof(*code_lengths));
 
   if (htree_groups == NULL || code_lengths == NULL || huffman_tables == NULL) {
     dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
     goto Error;
   }
 
-  next = huffman_tables;
-  for (i = 0; i < num_htree_groups; ++i) {
-    HTreeGroup* const htree_group = &htree_groups[i];
-    HuffmanCode** const htrees = htree_group->htrees;
-    int size;
-    int total_size = 0;
-    int is_trivial_literal = 1;
-    int max_bits = 0;
-    for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) {
-      int alphabet_size = kAlphabetSize[j];
-      htrees[j] = next;
-      if (j == 0 && color_cache_bits > 0) {
-        alphabet_size += 1 << color_cache_bits;
-      }
-      size = ReadHuffmanCode(alphabet_size, dec, code_lengths, next);
-      if (size == 0) {
-        goto Error;
-      }
-      if (is_trivial_literal && kLiteralMap[j] == 1) {
-        is_trivial_literal = (next->bits == 0);
-      }
-      total_size += next->bits;
-      next += size;
-      if (j <= ALPHA) {
-        int local_max_bits = code_lengths[0];
-        int k;
-        for (k = 1; k < alphabet_size; ++k) {
-          if (code_lengths[k] > local_max_bits) {
-            local_max_bits = code_lengths[k];
-          }
+  huffman_table = huffman_tables;
+  for (i = 0; i < num_htree_groups_max; ++i) {
+    // If the index "i" is unused in the Huffman image, just make sure the
+    // coefficients are valid but do not store them.
+    if (mapping != NULL && mapping[i] == -1) {
+      for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) {
+        int alphabet_size = kAlphabetSize[j];
+        if (j == 0 && color_cache_bits > 0) {
+          alphabet_size += (1 << color_cache_bits);
         }
-        max_bits += local_max_bits;
+        // Passing in NULL so that nothing gets filled.
+        if (!ReadHuffmanCode(alphabet_size, dec, code_lengths, NULL)) {
+          goto Error;
+        }
       }
-    }
-    htree_group->is_trivial_literal = is_trivial_literal;
-    htree_group->is_trivial_code = 0;
-    if (is_trivial_literal) {
-      const int red = htrees[RED][0].value;
-      const int blue = htrees[BLUE][0].value;
-      const int alpha = htrees[ALPHA][0].value;
-      htree_group->literal_arb =
-          ((uint32_t)alpha << 24) | (red << 16) | blue;
-      if (total_size == 0 && htrees[GREEN][0].value < NUM_LITERAL_CODES) {
-        htree_group->is_trivial_code = 1;
-        htree_group->literal_arb |= htrees[GREEN][0].value << 8;
+    } else {
+      HTreeGroup* const htree_group =
+          &htree_groups[(mapping == NULL) ? i : mapping[i]];
+      HuffmanCode** const htrees = htree_group->htrees;
+      int size;
+      int total_size = 0;
+      int is_trivial_literal = 1;
+      int max_bits = 0;
+      for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) {
+        int alphabet_size = kAlphabetSize[j];
+        htrees[j] = huffman_table;
+        if (j == 0 && color_cache_bits > 0) {
+          alphabet_size += (1 << color_cache_bits);
+        }
+        size = ReadHuffmanCode(alphabet_size, dec, code_lengths, huffman_table);
+        if (size == 0) {
+          goto Error;
+        }
+        if (is_trivial_literal && kLiteralMap[j] == 1) {
+          is_trivial_literal = (huffman_table->bits == 0);
+        }
+        total_size += huffman_table->bits;
+        huffman_table += size;
+        if (j <= ALPHA) {
+          int local_max_bits = code_lengths[0];
+          int k;
+          for (k = 1; k < alphabet_size; ++k) {
+            if (code_lengths[k] > local_max_bits) {
+              local_max_bits = code_lengths[k];
+            }
+          }
+          max_bits += local_max_bits;
+        }
       }
+      htree_group->is_trivial_literal = is_trivial_literal;
+      htree_group->is_trivial_code = 0;
+      if (is_trivial_literal) {
+        const int red = htrees[RED][0].value;
+        const int blue = htrees[BLUE][0].value;
+        const int alpha = htrees[ALPHA][0].value;
+        htree_group->literal_arb = ((uint32_t)alpha << 24) | (red << 16) | blue;
+        if (total_size == 0 && htrees[GREEN][0].value < NUM_LITERAL_CODES) {
+          htree_group->is_trivial_code = 1;
+          htree_group->literal_arb |= htrees[GREEN][0].value << 8;
+        }
+      }
+      htree_group->use_packed_table =
+          !htree_group->is_trivial_code && (max_bits < HUFFMAN_PACKED_BITS);
+      if (htree_group->use_packed_table) BuildPackedTable(htree_group);
     }
-    htree_group->use_packed_table = !htree_group->is_trivial_code &&
-                                    (max_bits < HUFFMAN_PACKED_BITS);
-    if (htree_group->use_packed_table) BuildPackedTable(htree_group);
   }
-  WebPSafeFree(code_lengths);
+  ok = 1;
 
-  // All OK. Finalize pointers and return.
+  // All OK. Finalize pointers.
   hdr->huffman_image_ = huffman_image;
   hdr->num_htree_groups_ = num_htree_groups;
   hdr->htree_groups_ = htree_groups;
   hdr->huffman_tables_ = huffman_tables;
-  return 1;
 
  Error:
   WebPSafeFree(code_lengths);
-  WebPSafeFree(huffman_image);
-  WebPSafeFree(huffman_tables);
-  VP8LHtreeGroupsFree(htree_groups);
-  return 0;
+  WebPSafeFree(mapping);
+  if (!ok) {
+    WebPSafeFree(huffman_image);
+    WebPSafeFree(huffman_tables);
+    VP8LHtreeGroupsFree(htree_groups);
+  }
+  return ok;
 }
 
 //------------------------------------------------------------------------------
@@ -517,8 +563,11 @@
   memory += work_size * sizeof(*work);
   scaled_data = (uint32_t*)memory;
 
-  WebPRescalerInit(dec->rescaler, in_width, in_height, (uint8_t*)scaled_data,
-                   out_width, out_height, 0, num_channels, work);
+  if (!WebPRescalerInit(dec->rescaler, in_width, in_height,
+                        (uint8_t*)scaled_data, out_width, out_height,
+                        0, num_channels, work)) {
+    return 0;
+  }
   return 1;
 }
 #endif   // WEBP_REDUCE_SIZE
@@ -532,13 +581,14 @@
 static int Export(WebPRescaler* const rescaler, WEBP_CSP_MODE colorspace,
                   int rgba_stride, uint8_t* const rgba) {
   uint32_t* const src = (uint32_t*)rescaler->dst;
+  uint8_t* dst = rgba;
   const int dst_width = rescaler->dst_width;
   int num_lines_out = 0;
   while (WebPRescalerHasPendingOutput(rescaler)) {
-    uint8_t* const dst = rgba + num_lines_out * rgba_stride;
     WebPRescalerExportRow(rescaler);
     WebPMultARGBRow(src, dst_width, 1);
     VP8LConvertFromBGRA(src, dst_width, colorspace, dst);
+    dst += rgba_stride;
     ++num_lines_out;
   }
   return num_lines_out;
@@ -552,8 +602,8 @@
   int num_lines_in = 0;
   int num_lines_out = 0;
   while (num_lines_in < mb_h) {
-    uint8_t* const row_in = in + num_lines_in * in_stride;
-    uint8_t* const row_out = out + num_lines_out * out_stride;
+    uint8_t* const row_in = in + (uint64_t)num_lines_in * in_stride;
+    uint8_t* const row_out = out + (uint64_t)num_lines_out * out_stride;
     const int lines_left = mb_h - num_lines_in;
     const int needed_lines = WebPRescaleNeededLines(dec->rescaler, lines_left);
     int lines_imported;
@@ -712,11 +762,11 @@
 
 typedef void (*ProcessRowsFunc)(VP8LDecoder* const dec, int row);
 
-static void ApplyInverseTransforms(VP8LDecoder* const dec, int num_rows,
+static void ApplyInverseTransforms(VP8LDecoder* const dec,
+                                   int start_row, int num_rows,
                                    const uint32_t* const rows) {
   int n = dec->next_transform_;
   const int cache_pixs = dec->width_ * num_rows;
-  const int start_row = dec->last_row_;
   const int end_row = start_row + num_rows;
   const uint32_t* rows_in = rows;
   uint32_t* const rows_out = dec->argb_cache_;
@@ -747,15 +797,15 @@
     VP8Io* const io = dec->io_;
     uint8_t* rows_data = (uint8_t*)dec->argb_cache_;
     const int in_stride = io->width * sizeof(uint32_t);  // in unit of RGBA
-
-    ApplyInverseTransforms(dec, num_rows, rows);
+    ApplyInverseTransforms(dec, dec->last_row_, num_rows, rows);
     if (!SetCropWindow(io, dec->last_row_, row, &rows_data, in_stride)) {
       // Nothing to output (this time).
     } else {
       const WebPDecBuffer* const output = dec->output_;
       if (WebPIsRGBMode(output->colorspace)) {  // convert to RGBA
         const WebPRGBABuffer* const buf = &output->u.RGBA;
-        uint8_t* const rgba = buf->rgba + dec->last_out_row_ * buf->stride;
+        uint8_t* const rgba =
+            buf->rgba + (int64_t)dec->last_out_row_ * buf->stride;
         const int num_rows_out =
 #if !defined(WEBP_REDUCE_SIZE)
          io->use_scaling ?
@@ -888,7 +938,11 @@
 #endif
         break;
       case 2:
+#if !defined(WORDS_BIGENDIAN)
         memcpy(&pattern, src, sizeof(uint16_t));
+#else
+        pattern = ((uint32_t)src[0] << 8) | src[1];
+#endif
 #if defined(__arm__) || defined(_M_ARM)
         pattern |= pattern << 16;
 #elif defined(WEBP_USE_MIPS_DSP_R2)
@@ -902,7 +956,6 @@
         break;
       default:
         goto Copy;
-        break;
     }
     CopySmallPattern8b(src, dst, length, pattern);
     return;
@@ -1147,6 +1200,7 @@
       VP8LFillBitWindow(br);
       dist_code = GetCopyDistance(dist_symbol, br);
       dist = PlaneCodeToDistance(width, dist_code);
+
       if (VP8LIsEndOfStream(br)) break;
       if (src - data < (ptrdiff_t)dist || src_end - src < (ptrdiff_t)length) {
         goto Error;
@@ -1231,7 +1285,7 @@
     uint8_t* const new_data = (uint8_t*)new_color_map;
     new_color_map[0] = transform->data_[0];
     for (i = 4; i < 4 * num_colors; ++i) {
-      // Equivalent to AddPixelEq(), on a byte-basis.
+      // Equivalent to VP8LAddPixels(), on a byte-basis.
       new_data[i] = (data[i] + new_data[i - 4]) & 0xff;
     }
     for (; i < 4 * final_num_colors; ++i) {
@@ -1286,7 +1340,7 @@
        ok = ok && ExpandColorMap(num_colors, transform);
       break;
     }
-    case SUBTRACT_GREEN:
+    case SUBTRACT_GREEN_TRANSFORM:
       break;
     default:
       assert(0);    // can't happen
@@ -1469,7 +1523,7 @@
   assert(dec->width_ <= final_width);
   dec->pixels_ = (uint32_t*)WebPSafeMalloc(total_num_pixels, sizeof(uint32_t));
   if (dec->pixels_ == NULL) {
-    dec->argb_cache_ = NULL;    // for sanity check
+    dec->argb_cache_ = NULL;    // for soundness
     dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
     return 0;
   }
@@ -1479,7 +1533,7 @@
 
 static int AllocateInternalBuffers8b(VP8LDecoder* const dec) {
   const uint64_t total_num_pixels = (uint64_t)dec->width_ * dec->height_;
-  dec->argb_cache_ = NULL;    // for sanity check
+  dec->argb_cache_ = NULL;    // for soundness
   dec->pixels_ = (uint32_t*)WebPSafeMalloc(total_num_pixels, sizeof(uint8_t));
   if (dec->pixels_ == NULL) {
     dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
@@ -1507,7 +1561,7 @@
     const int cache_pixs = width * num_rows_to_process;
     uint8_t* const dst = output + width * cur_row;
     const uint32_t* const src = dec->argb_cache_;
-    ApplyInverseTransforms(dec, num_rows_to_process, in);
+    ApplyInverseTransforms(dec, cur_row, num_rows_to_process, in);
     WebPExtractGreen(src, dst, cache_pixs);
     AlphaApplyFilter(alph_dec,
                      cur_row, cur_row + num_rows_to_process, dst, width);
@@ -1527,7 +1581,6 @@
   if (dec == NULL) return 0;
 
   assert(alph_dec != NULL);
-  alph_dec->vp8l_dec_ = dec;
 
   dec->width_ = alph_dec->width_;
   dec->height_ = alph_dec->height_;
@@ -1559,11 +1612,12 @@
 
   if (!ok) goto Err;
 
+  // Only set here, once we are sure it is valid (to avoid thread races).
+  alph_dec->vp8l_dec_ = dec;
   return 1;
 
  Err:
-  VP8LDelete(alph_dec->vp8l_dec_);
-  alph_dec->vp8l_dec_ = NULL;
+  VP8LDelete(dec);
   return 0;
 }
 
@@ -1621,7 +1675,6 @@
   VP8Io* io = NULL;
   WebPDecParams* params = NULL;
 
-  // Sanity checks.
   if (dec == NULL) return 0;
 
   assert(dec->hdr_.huffman_tables_ != NULL);
diff --git a/third_party/libwebp/src/dec/vp8li_dec.h b/third_party/libwebp/src/dec/vp8li_dec.h
index cea22f7..6eb4d4b 100644
--- a/third_party/libwebp/src/dec/vp8li_dec.h
+++ b/third_party/libwebp/src/dec/vp8li_dec.h
@@ -39,7 +39,7 @@
   int                    bits_;   // subsampling bits defining transform window.
   int                    xsize_;  // transform window X index.
   int                    ysize_;  // transform window Y index.
-  uint32_t              *data_;   // transform data.
+  uint32_t*              data_;   // transform data.
 };
 
 typedef struct {
@@ -50,23 +50,23 @@
   int             huffman_mask_;
   int             huffman_subsample_bits_;
   int             huffman_xsize_;
-  uint32_t       *huffman_image_;
+  uint32_t*       huffman_image_;
   int             num_htree_groups_;
-  HTreeGroup     *htree_groups_;
-  HuffmanCode    *huffman_tables_;
+  HTreeGroup*     htree_groups_;
+  HuffmanCode*    huffman_tables_;
 } VP8LMetadata;
 
 typedef struct VP8LDecoder VP8LDecoder;
 struct VP8LDecoder {
   VP8StatusCode    status_;
   VP8LDecodeState  state_;
-  VP8Io           *io_;
+  VP8Io*           io_;
 
-  const WebPDecBuffer *output_;    // shortcut to io->opaque->output
+  const WebPDecBuffer* output_;    // shortcut to io->opaque->output
 
-  uint32_t        *pixels_;        // Internal data: either uint8_t* for alpha
+  uint32_t*        pixels_;        // Internal data: either uint8_t* for alpha
                                    // or uint32_t* for BGRA.
-  uint32_t        *argb_cache_;    // Scratch buffer for temporary BGRA storage.
+  uint32_t*        argb_cache_;    // Scratch buffer for temporary BGRA storage.
 
   VP8LBitReader    br_;
   int              incremental_;   // if true, incremental decoding is expected
@@ -88,8 +88,8 @@
   // or'd bitset storing the transforms types.
   uint32_t         transforms_seen_;
 
-  uint8_t         *rescaler_memory;  // Working memory for rescaling work.
-  WebPRescaler    *rescaler;         // Common rescaler for all channels.
+  uint8_t*         rescaler_memory;  // Working memory for rescaling work.
+  WebPRescaler*    rescaler;         // Common rescaler for all channels.
 };
 
 //------------------------------------------------------------------------------
@@ -134,4 +134,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_DEC_VP8LI_DEC_H_ */
+#endif  // WEBP_DEC_VP8LI_DEC_H_
diff --git a/third_party/libwebp/src/dec/webp_dec.c b/third_party/libwebp/src/dec/webp_dec.c
index 81a13ac..3fc87de 100644
--- a/third_party/libwebp/src/dec/webp_dec.c
+++ b/third_party/libwebp/src/dec/webp_dec.c
@@ -184,7 +184,7 @@
       return VP8_STATUS_BITSTREAM_ERROR;          // Not a valid chunk size.
     }
     // For odd-sized chunk-payload, there's one byte padding at the end.
-    disk_chunk_size = (CHUNK_HEADER_SIZE + chunk_size + 1) & ~1;
+    disk_chunk_size = (CHUNK_HEADER_SIZE + chunk_size + 1) & ~1u;
     total_size += disk_chunk_size;
 
     // Check that total bytes skipped so far does not exceed riff_size.
@@ -663,19 +663,26 @@
 uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,
                        int* width, int* height, uint8_t** u, uint8_t** v,
                        int* stride, int* uv_stride) {
-  WebPDecBuffer output;   // only to preserve the side-infos
-  uint8_t* const out = Decode(MODE_YUV, data, data_size,
-                              width, height, &output);
-
-  if (out != NULL) {
-    const WebPYUVABuffer* const buf = &output.u.YUVA;
-    *u = buf->u;
-    *v = buf->v;
-    *stride = buf->y_stride;
-    *uv_stride = buf->u_stride;
-    assert(buf->u_stride == buf->v_stride);
+  // data, width and height are checked by Decode().
+  if (u == NULL || v == NULL || stride == NULL || uv_stride == NULL) {
+    return NULL;
   }
-  return out;
+
+  {
+    WebPDecBuffer output;   // only to preserve the side-infos
+    uint8_t* const out = Decode(MODE_YUV, data, data_size,
+                                width, height, &output);
+
+    if (out != NULL) {
+      const WebPYUVABuffer* const buf = &output.u.YUVA;
+      *u = buf->u;
+      *v = buf->v;
+      *stride = buf->y_stride;
+      *uv_stride = buf->u_stride;
+      assert(buf->u_stride == buf->v_stride);
+    }
+    return out;
+  }
 }
 
 static void DefaultFeatures(WebPBitstreamFeatures* const features) {
@@ -790,6 +797,13 @@
 //------------------------------------------------------------------------------
 // Cropping and rescaling.
 
+int WebPCheckCropDimensions(int image_width, int image_height,
+                            int x, int y, int w, int h) {
+  return !(x < 0 || y < 0 || w <= 0 || h <= 0 ||
+           x >= image_width || w > image_width || w > image_width - x ||
+           y >= image_height || h > image_height || h > image_height - y);
+}
+
 int WebPIoInitFromOptions(const WebPDecoderOptions* const options,
                           VP8Io* const io, WEBP_CSP_MODE src_colorspace) {
   const int W = io->width;
@@ -797,7 +811,7 @@
   int x = 0, y = 0, w = W, h = H;
 
   // Cropping
-  io->use_cropping = (options != NULL) && (options->use_cropping > 0);
+  io->use_cropping = (options != NULL) && options->use_cropping;
   if (io->use_cropping) {
     w = options->crop_width;
     h = options->crop_height;
@@ -807,7 +821,7 @@
       x &= ~1;
       y &= ~1;
     }
-    if (x < 0 || y < 0 || w <= 0 || h <= 0 || x + w > W || y + h > H) {
+    if (!WebPCheckCropDimensions(W, H, x, y, w, h)) {
       return 0;  // out of frame boundary error
     }
   }
@@ -819,7 +833,7 @@
   io->mb_h = h;
 
   // Scaling
-  io->use_scaling = (options != NULL) && (options->use_scaling > 0);
+  io->use_scaling = (options != NULL) && options->use_scaling;
   if (io->use_scaling) {
     int scaled_width = options->scaled_width;
     int scaled_height = options->scaled_height;
@@ -840,8 +854,8 @@
 
   if (io->use_scaling) {
     // disable filter (only for large downscaling ratio).
-    io->bypass_filtering = (io->scaled_width < W * 3 / 4) &&
-                           (io->scaled_height < H * 3 / 4);
+    io->bypass_filtering |= (io->scaled_width < W * 3 / 4) &&
+                            (io->scaled_height < H * 3 / 4);
     io->fancy_upsampling = 0;
   }
   return 1;
diff --git a/third_party/libwebp/src/dec/webpi_dec.h b/third_party/libwebp/src/dec/webpi_dec.h
index c378ba6..3b97388 100644
--- a/third_party/libwebp/src/dec/webpi_dec.h
+++ b/third_party/libwebp/src/dec/webpi_dec.h
@@ -77,6 +77,10 @@
 //------------------------------------------------------------------------------
 // Misc utils
 
+// Returns true if crop dimensions are within image bounds.
+int WebPCheckCropDimensions(int image_width, int image_height,
+                            int x, int y, int w, int h);
+
 // Initializes VP8Io with custom setup, io and teardown functions. The default
 // hooks will use the supplied 'params' as io->opaque handle.
 void WebPInitCustomIo(WebPDecParams* const params, VP8Io* const io);
@@ -130,4 +134,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_DEC_WEBPI_DEC_H_ */
+#endif  // WEBP_DEC_WEBPI_DEC_H_
diff --git a/third_party/libwebp/src/demux/Makefile.am b/third_party/libwebp/src/demux/Makefile.am
index 7e80bdc..42de71d 100644
--- a/third_party/libwebp/src/demux/Makefile.am
+++ b/third_party/libwebp/src/demux/Makefile.am
@@ -13,6 +13,6 @@
 noinst_HEADERS += ../webp/format_constants.h
 
 libwebpdemux_la_LIBADD = ../libwebp.la
-libwebpdemux_la_LDFLAGS = -no-undefined -version-info 2:4:0
+libwebpdemux_la_LDFLAGS = -no-undefined -version-info 2:13:0
 libwebpdemuxincludedir = $(includedir)/webp
 pkgconfig_DATA = libwebpdemux.pc
diff --git a/third_party/libwebp/src/demux/anim_decode.c b/third_party/libwebp/src/demux/anim_decode.c
index 6de3121..fdf4a63 100644
--- a/third_party/libwebp/src/demux/anim_decode.c
+++ b/third_party/libwebp/src/demux/anim_decode.c
@@ -28,6 +28,14 @@
 
 #define NUM_CHANNELS 4
 
+// Channel extraction from a uint32_t representation of a uint8_t RGBA/BGRA
+// buffer.
+#ifdef WORDS_BIGENDIAN
+#define CHANNEL_SHIFT(i) (24 - (i) * 8)
+#else
+#define CHANNEL_SHIFT(i) ((i) * 8)
+#endif
+
 typedef void (*BlendRowFunc)(uint32_t* const, const uint32_t* const, int);
 static void BlendPixelRowNonPremult(uint32_t* const src,
                                     const uint32_t* const dst, int num_pixels);
@@ -92,11 +100,19 @@
     int abi_version) {
   WebPAnimDecoderOptions options;
   WebPAnimDecoder* dec = NULL;
+  WebPBitstreamFeatures features;
   if (webp_data == NULL ||
       WEBP_ABI_IS_INCOMPATIBLE(abi_version, WEBP_DEMUX_ABI_VERSION)) {
     return NULL;
   }
 
+  // Validate the bitstream before doing expensive allocations. The demuxer may
+  // be more tolerant than the decoder.
+  if (WebPGetFeatures(webp_data->bytes, webp_data->size, &features) !=
+      VP8_STATUS_OK) {
+    return NULL;
+  }
+
   // Note: calloc() so that the pointer members are initialized to NULL.
   dec = (WebPAnimDecoder*)WebPSafeCalloc(1ULL, sizeof(*dec));
   if (dec == NULL) goto Error;
@@ -150,7 +166,7 @@
                           uint32_t canvas_height) {
   const uint64_t size =
       (uint64_t)canvas_width * canvas_height * NUM_CHANNELS * sizeof(*buf);
-  if (size != (size_t)size) return 0;
+  if (!CheckSizeOverflow(size)) return 0;
   memset(buf, 0, (size_t)size);
   return 1;
 }
@@ -171,7 +187,7 @@
 static int CopyCanvas(const uint8_t* src, uint8_t* dst,
                       uint32_t width, uint32_t height) {
   const uint64_t size = (uint64_t)width * height * NUM_CHANNELS;
-  if (size != (size_t)size) return 0;
+  if (!CheckSizeOverflow(size)) return 0;
   assert(src != NULL && dst != NULL);
   memcpy(dst, src, (size_t)size);
   return 1;
@@ -206,35 +222,35 @@
   const uint8_t dst_channel = (dst >> shift) & 0xff;
   const uint32_t blend_unscaled = src_channel * src_a + dst_channel * dst_a;
   assert(blend_unscaled < (1ULL << 32) / scale);
-  return (blend_unscaled * scale) >> 24;
+  return (blend_unscaled * scale) >> CHANNEL_SHIFT(3);
 }
 
 // Blend 'src' over 'dst' assuming they are NOT pre-multiplied by alpha.
 static uint32_t BlendPixelNonPremult(uint32_t src, uint32_t dst) {
-  const uint8_t src_a = (src >> 24) & 0xff;
+  const uint8_t src_a = (src >> CHANNEL_SHIFT(3)) & 0xff;
 
   if (src_a == 0) {
     return dst;
   } else {
-    const uint8_t dst_a = (dst >> 24) & 0xff;
+    const uint8_t dst_a = (dst >> CHANNEL_SHIFT(3)) & 0xff;
     // This is the approximate integer arithmetic for the actual formula:
     // dst_factor_a = (dst_a * (255 - src_a)) / 255.
     const uint8_t dst_factor_a = (dst_a * (256 - src_a)) >> 8;
     const uint8_t blend_a = src_a + dst_factor_a;
     const uint32_t scale = (1UL << 24) / blend_a;
 
-    const uint8_t blend_r =
-        BlendChannelNonPremult(src, src_a, dst, dst_factor_a, scale, 0);
-    const uint8_t blend_g =
-        BlendChannelNonPremult(src, src_a, dst, dst_factor_a, scale, 8);
-    const uint8_t blend_b =
-        BlendChannelNonPremult(src, src_a, dst, dst_factor_a, scale, 16);
+    const uint8_t blend_r = BlendChannelNonPremult(
+        src, src_a, dst, dst_factor_a, scale, CHANNEL_SHIFT(0));
+    const uint8_t blend_g = BlendChannelNonPremult(
+        src, src_a, dst, dst_factor_a, scale, CHANNEL_SHIFT(1));
+    const uint8_t blend_b = BlendChannelNonPremult(
+        src, src_a, dst, dst_factor_a, scale, CHANNEL_SHIFT(2));
     assert(src_a + dst_factor_a < 256);
 
-    return (blend_r << 0) |
-           (blend_g << 8) |
-           (blend_b << 16) |
-           ((uint32_t)blend_a << 24);
+    return ((uint32_t)blend_r << CHANNEL_SHIFT(0)) |
+           ((uint32_t)blend_g << CHANNEL_SHIFT(1)) |
+           ((uint32_t)blend_b << CHANNEL_SHIFT(2)) |
+           ((uint32_t)blend_a << CHANNEL_SHIFT(3));
   }
 }
 
@@ -244,7 +260,7 @@
                                     const uint32_t* const dst, int num_pixels) {
   int i;
   for (i = 0; i < num_pixels; ++i) {
-    const uint8_t src_alpha = (src[i] >> 24) & 0xff;
+    const uint8_t src_alpha = (src[i] >> CHANNEL_SHIFT(3)) & 0xff;
     if (src_alpha != 0xff) {
       src[i] = BlendPixelNonPremult(src[i], dst[i]);
     }
@@ -261,7 +277,7 @@
 
 // Blend 'src' over 'dst' assuming they are pre-multiplied by alpha.
 static uint32_t BlendPixelPremult(uint32_t src, uint32_t dst) {
-  const uint8_t src_a = (src >> 24) & 0xff;
+  const uint8_t src_a = (src >> CHANNEL_SHIFT(3)) & 0xff;
   return src + ChannelwiseMultiply(dst, 256 - src_a);
 }
 
@@ -271,7 +287,7 @@
                                  int num_pixels) {
   int i;
   for (i = 0; i < num_pixels; ++i) {
-    const uint8_t src_alpha = (src[i] >> 24) & 0xff;
+    const uint8_t src_alpha = (src[i] >> CHANNEL_SHIFT(3)) & 0xff;
     if (src_alpha != 0xff) {
       src[i] = BlendPixelPremult(src[i], dst[i]);
     }
@@ -351,12 +367,15 @@
   {
     const uint8_t* in = iter.fragment.bytes;
     const size_t in_size = iter.fragment.size;
-    const size_t out_offset =
-        (iter.y_offset * width + iter.x_offset) * NUM_CHANNELS;
+    const uint32_t stride = width * NUM_CHANNELS;  // at most 25 + 2 bits
+    const uint64_t out_offset = (uint64_t)iter.y_offset * stride +
+                                (uint64_t)iter.x_offset * NUM_CHANNELS;  // 53b
+    const uint64_t size = (uint64_t)iter.height * stride;  // at most 25 + 27b
     WebPDecoderConfig* const config = &dec->config_;
     WebPRGBABuffer* const buf = &config->output.u.RGBA;
-    buf->stride = NUM_CHANNELS * width;
-    buf->size = buf->stride * iter.height;
+    if ((size_t)size != size) goto Error;
+    buf->stride = (int)stride;
+    buf->size = (size_t)size;
     buf->rgba = dec->curr_frame_ + out_offset;
 
     if (WebPDecode(in, in_size, config) != VP8_STATUS_OK) {
diff --git a/third_party/libwebp/src/demux/demux.c b/third_party/libwebp/src/demux/demux.c
index 684215e..fd45a25 100644
--- a/third_party/libwebp/src/demux/demux.c
+++ b/third_party/libwebp/src/demux/demux.c
@@ -24,8 +24,8 @@
 #include "src/webp/format_constants.h"
 
 #define DMUX_MAJ_VERSION 1
-#define DMUX_MIN_VERSION 0
-#define DMUX_REV_VERSION 0
+#define DMUX_MIN_VERSION 3
+#define DMUX_REV_VERSION 1
 
 typedef struct {
   size_t start_;        // start location of the data
@@ -221,12 +221,16 @@
     const size_t chunk_start_offset = mem->start_;
     const uint32_t fourcc = ReadLE32(mem);
     const uint32_t payload_size = ReadLE32(mem);
-    const uint32_t payload_size_padded = payload_size + (payload_size & 1);
-    const size_t payload_available = (payload_size_padded > MemDataSize(mem))
-                                   ? MemDataSize(mem) : payload_size_padded;
-    const size_t chunk_size = CHUNK_HEADER_SIZE + payload_available;
+    uint32_t payload_size_padded;
+    size_t payload_available;
+    size_t chunk_size;
 
     if (payload_size > MAX_CHUNK_PAYLOAD) return PARSE_ERROR;
+
+    payload_size_padded = payload_size + (payload_size & 1);
+    payload_available = (payload_size_padded > MemDataSize(mem))
+                      ? MemDataSize(mem) : payload_size_padded;
+    chunk_size = CHUNK_HEADER_SIZE + payload_available;
     if (SizeIsInvalid(mem, payload_size_padded)) return PARSE_ERROR;
     if (payload_size_padded > MemDataSize(mem)) status = PARSE_NEED_MORE_DATA;
 
@@ -312,6 +316,7 @@
   int bits;
   MemBuffer* const mem = &dmux->mem_;
   Frame* frame;
+  size_t start_offset;
   ParseStatus status =
       NewFrame(mem, ANMF_CHUNK_SIZE, frame_chunk_size, &frame);
   if (status != PARSE_OK) return status;
@@ -332,7 +337,11 @@
 
   // Store a frame only if the animation flag is set there is some data for
   // this frame is available.
+  start_offset = mem->start_;
   status = StoreFrame(dmux->num_frames_ + 1, anmf_payload_size, mem, frame);
+  if (status != PARSE_ERROR && mem->start_ - start_offset > anmf_payload_size) {
+    status = PARSE_ERROR;
+  }
   if (status != PARSE_ERROR && is_animation && frame->frame_num_ > 0) {
     added_frame = AddFrame(dmux, frame);
     if (added_frame) {
@@ -446,9 +455,11 @@
     const size_t chunk_start_offset = mem->start_;
     const uint32_t fourcc = ReadLE32(mem);
     const uint32_t chunk_size = ReadLE32(mem);
-    const uint32_t chunk_size_padded = chunk_size + (chunk_size & 1);
+    uint32_t chunk_size_padded;
 
     if (chunk_size > MAX_CHUNK_PAYLOAD) return PARSE_ERROR;
+
+    chunk_size_padded = chunk_size + (chunk_size & 1);
     if (SizeIsInvalid(mem, chunk_size_padded)) return PARSE_ERROR;
 
     switch (fourcc) {
@@ -603,7 +614,6 @@
 
   while (f != NULL) {
     const int cur_frame_set = f->frame_num_;
-    int frame_count = 0;
 
     // Check frame properties.
     for (; f != NULL && f->frame_num_ == cur_frame_set; f = f->next_) {
@@ -638,8 +648,6 @@
                             dmux->canvas_width_, dmux->canvas_height_)) {
         return 0;
       }
-
-      ++frame_count;
     }
   }
   return 1;
diff --git a/third_party/libwebp/src/demux/libwebpdemux.pc.in b/third_party/libwebp/src/demux/libwebpdemux.pc.in
index 6dfbbbd..4da2e40 100644
--- a/third_party/libwebp/src/demux/libwebpdemux.pc.in
+++ b/third_party/libwebp/src/demux/libwebpdemux.pc.in
@@ -6,6 +6,6 @@
 Name: libwebpdemux
 Description: Library for parsing the WebP graphics format container
 Version: @PACKAGE_VERSION@
-Requires: libwebp >= 0.2.0
+Requires.private: libwebp >= 0.2.0
 Cflags: -I${includedir}
-Libs: -L${libdir} -lwebpdemux
+Libs: -L${libdir} -l@webp_libname_prefix@webpdemux
diff --git a/third_party/libwebp/src/demux/libwebpdemux.rc b/third_party/libwebp/src/demux/libwebpdemux.rc
index 544a8b2..49a4547 100644
--- a/third_party/libwebp/src/demux/libwebpdemux.rc
+++ b/third_party/libwebp/src/demux/libwebpdemux.rc
@@ -6,8 +6,8 @@
 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,0
- PRODUCTVERSION 1,0,0,0
+ FILEVERSION 1,0,3,1
+ PRODUCTVERSION 1,0,3,1
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -24,12 +24,12 @@
         BEGIN
             VALUE "CompanyName", "Google, Inc."
             VALUE "FileDescription", "libwebpdemux DLL"
-            VALUE "FileVersion", "1.0.0"
+            VALUE "FileVersion", "1.3.1"
             VALUE "InternalName", "libwebpdemux.dll"
-            VALUE "LegalCopyright", "Copyright (C) 2018"
+            VALUE "LegalCopyright", "Copyright (C) 2023"
             VALUE "OriginalFilename", "libwebpdemux.dll"
             VALUE "ProductName", "WebP Image Demuxer"
-            VALUE "ProductVersion", "1.0.0"
+            VALUE "ProductVersion", "1.3.1"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/third_party/libwebp/src/dsp/Makefile.am b/third_party/libwebp/src/dsp/Makefile.am
index 0836d8f..7db4ef0 100644
--- a/third_party/libwebp/src/dsp/Makefile.am
+++ b/third_party/libwebp/src/dsp/Makefile.am
@@ -1,7 +1,6 @@
 AM_CPPFLAGS += -I$(top_builddir) -I$(top_srcdir)
 noinst_LTLIBRARIES =
 noinst_LTLIBRARIES += libwebpdsp.la
-noinst_LTLIBRARIES += libwebpdsp_avx2.la
 noinst_LTLIBRARIES += libwebpdsp_sse2.la
 noinst_LTLIBRARIES += libwebpdspdecode_sse2.la
 noinst_LTLIBRARIES += libwebpdsp_sse41.la
@@ -10,6 +9,10 @@
 noinst_LTLIBRARIES += libwebpdspdecode_neon.la
 noinst_LTLIBRARIES += libwebpdsp_msa.la
 noinst_LTLIBRARIES += libwebpdspdecode_msa.la
+noinst_LTLIBRARIES += libwebpdsp_mips32.la
+noinst_LTLIBRARIES += libwebpdspdecode_mips32.la
+noinst_LTLIBRARIES += libwebpdsp_mips_dsp_r2.la
+noinst_LTLIBRARIES += libwebpdspdecode_mips_dsp_r2.la
 
 if BUILD_LIBWEBPDECODER
   noinst_LTLIBRARIES += libwebpdspdecode.la
@@ -20,51 +23,31 @@
 
 COMMON_SOURCES =
 COMMON_SOURCES += alpha_processing.c
-COMMON_SOURCES += alpha_processing_mips_dsp_r2.c
-COMMON_SOURCES += common_sse2.h
 COMMON_SOURCES += cpu.c
+COMMON_SOURCES += cpu.h
 COMMON_SOURCES += dec.c
 COMMON_SOURCES += dec_clip_tables.c
-COMMON_SOURCES += dec_mips32.c
-COMMON_SOURCES += dec_mips_dsp_r2.c
 COMMON_SOURCES += dsp.h
 COMMON_SOURCES += filters.c
-COMMON_SOURCES += filters_mips_dsp_r2.c
 COMMON_SOURCES += lossless.c
 COMMON_SOURCES += lossless.h
 COMMON_SOURCES += lossless_common.h
-COMMON_SOURCES += lossless_mips_dsp_r2.c
-COMMON_SOURCES += mips_macro.h
 COMMON_SOURCES += rescaler.c
-COMMON_SOURCES += rescaler_mips32.c
-COMMON_SOURCES += rescaler_mips_dsp_r2.c
 COMMON_SOURCES += upsampling.c
-COMMON_SOURCES += upsampling_mips_dsp_r2.c
 COMMON_SOURCES += yuv.c
 COMMON_SOURCES += yuv.h
-COMMON_SOURCES += yuv_mips32.c
-COMMON_SOURCES += yuv_mips_dsp_r2.c
 
 ENC_SOURCES =
 ENC_SOURCES += cost.c
-ENC_SOURCES += cost_mips32.c
-ENC_SOURCES += cost_mips_dsp_r2.c
 ENC_SOURCES += enc.c
-ENC_SOURCES += enc_mips32.c
-ENC_SOURCES += enc_mips_dsp_r2.c
 ENC_SOURCES += lossless_enc.c
-ENC_SOURCES += lossless_enc_mips32.c
-ENC_SOURCES += lossless_enc_mips_dsp_r2.c
+ENC_SOURCES += quant.h
 ENC_SOURCES += ssim.c
 
-libwebpdsp_avx2_la_SOURCES =
-libwebpdsp_avx2_la_SOURCES += enc_avx2.c
-libwebpdsp_avx2_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS)
-libwebpdsp_avx2_la_CFLAGS = $(AM_CFLAGS) $(AVX2_FLAGS)
-
 libwebpdspdecode_sse41_la_SOURCES =
 libwebpdspdecode_sse41_la_SOURCES += alpha_processing_sse41.c
 libwebpdspdecode_sse41_la_SOURCES += dec_sse41.c
+libwebpdspdecode_sse41_la_SOURCES += lossless_sse41.c
 libwebpdspdecode_sse41_la_SOURCES += upsampling_sse41.c
 libwebpdspdecode_sse41_la_SOURCES += yuv_sse41.c
 libwebpdspdecode_sse41_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS)
@@ -72,6 +55,7 @@
 
 libwebpdspdecode_sse2_la_SOURCES =
 libwebpdspdecode_sse2_la_SOURCES += alpha_processing_sse2.c
+libwebpdspdecode_sse2_la_SOURCES += common_sse2.h
 libwebpdspdecode_sse2_la_SOURCES += dec_sse2.c
 libwebpdspdecode_sse2_la_SOURCES += filters_sse2.c
 libwebpdspdecode_sse2_la_SOURCES += lossless_sse2.c
@@ -103,6 +87,26 @@
 libwebpdspdecode_msa_la_CPPFLAGS = $(libwebpdsp_msa_la_CPPFLAGS)
 libwebpdspdecode_msa_la_CFLAGS = $(libwebpdsp_msa_la_CFLAGS)
 
+libwebpdspdecode_mips32_la_SOURCES =
+libwebpdspdecode_mips32_la_SOURCES += dec_mips32.c
+libwebpdspdecode_mips32_la_SOURCES += mips_macro.h
+libwebpdspdecode_mips32_la_SOURCES += rescaler_mips32.c
+libwebpdspdecode_mips32_la_SOURCES += yuv_mips32.c
+libwebpdspdecode_mips32_la_CPPFLAGS = $(libwebpdsp_mips32_la_CPPFLAGS)
+libwebpdspdecode_mips32_la_CFLAGS = $(libwebpdsp_mips32_la_CFLAGS)
+
+libwebpdspdecode_mips_dsp_r2_la_SOURCES =
+libwebpdspdecode_mips_dsp_r2_la_SOURCES += alpha_processing_mips_dsp_r2.c
+libwebpdspdecode_mips_dsp_r2_la_SOURCES += dec_mips_dsp_r2.c
+libwebpdspdecode_mips_dsp_r2_la_SOURCES += filters_mips_dsp_r2.c
+libwebpdspdecode_mips_dsp_r2_la_SOURCES += lossless_mips_dsp_r2.c
+libwebpdspdecode_mips_dsp_r2_la_SOURCES += mips_macro.h
+libwebpdspdecode_mips_dsp_r2_la_SOURCES += rescaler_mips_dsp_r2.c
+libwebpdspdecode_mips_dsp_r2_la_SOURCES += upsampling_mips_dsp_r2.c
+libwebpdspdecode_mips_dsp_r2_la_SOURCES += yuv_mips_dsp_r2.c
+libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS = $(libwebpdsp_mips_dsp_r2_la_CPPFLAGS)
+libwebpdspdecode_mips_dsp_r2_la_CFLAGS = $(libwebpdsp_mips_dsp_r2_la_CFLAGS)
+
 libwebpdsp_sse2_la_SOURCES =
 libwebpdsp_sse2_la_SOURCES += cost_sse2.c
 libwebpdsp_sse2_la_SOURCES += enc_sse2.c
@@ -120,6 +124,7 @@
 libwebpdsp_sse41_la_LIBADD = libwebpdspdecode_sse41.la
 
 libwebpdsp_neon_la_SOURCES =
+libwebpdsp_neon_la_SOURCES += cost_neon.c
 libwebpdsp_neon_la_SOURCES += enc_neon.c
 libwebpdsp_neon_la_SOURCES += lossless_enc_neon.c
 libwebpdsp_neon_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS)
@@ -133,6 +138,22 @@
 libwebpdsp_msa_la_CFLAGS = $(AM_CFLAGS)
 libwebpdsp_msa_la_LIBADD = libwebpdspdecode_msa.la
 
+libwebpdsp_mips32_la_SOURCES =
+libwebpdsp_mips32_la_SOURCES += cost_mips32.c
+libwebpdsp_mips32_la_SOURCES += enc_mips32.c
+libwebpdsp_mips32_la_SOURCES += lossless_enc_mips32.c
+libwebpdsp_mips32_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS)
+libwebpdsp_mips32_la_CFLAGS = $(AM_CFLAGS)
+libwebpdsp_mips32_la_LIBADD = libwebpdspdecode_mips32.la
+
+libwebpdsp_mips_dsp_r2_la_SOURCES =
+libwebpdsp_mips_dsp_r2_la_SOURCES += cost_mips_dsp_r2.c
+libwebpdsp_mips_dsp_r2_la_SOURCES += enc_mips_dsp_r2.c
+libwebpdsp_mips_dsp_r2_la_SOURCES += lossless_enc_mips_dsp_r2.c
+libwebpdsp_mips_dsp_r2_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS)
+libwebpdsp_mips_dsp_r2_la_CFLAGS = $(AM_CFLAGS)
+libwebpdsp_mips_dsp_r2_la_LIBADD = libwebpdspdecode_mips_dsp_r2.la
+
 libwebpdsp_la_SOURCES = $(COMMON_SOURCES) $(ENC_SOURCES)
 
 noinst_HEADERS =
@@ -144,11 +165,12 @@
 libwebpdsp_la_CPPFLAGS += $(USE_SWAP_16BIT_CSP)
 libwebpdsp_la_LDFLAGS = -lm
 libwebpdsp_la_LIBADD =
-libwebpdsp_la_LIBADD += libwebpdsp_avx2.la
 libwebpdsp_la_LIBADD += libwebpdsp_sse2.la
 libwebpdsp_la_LIBADD += libwebpdsp_sse41.la
 libwebpdsp_la_LIBADD += libwebpdsp_neon.la
 libwebpdsp_la_LIBADD += libwebpdsp_msa.la
+libwebpdsp_la_LIBADD += libwebpdsp_mips32.la
+libwebpdsp_la_LIBADD += libwebpdsp_mips_dsp_r2.la
 
 if BUILD_LIBWEBPDECODER
   libwebpdspdecode_la_SOURCES = $(COMMON_SOURCES)
@@ -160,4 +182,6 @@
   libwebpdspdecode_la_LIBADD += libwebpdspdecode_sse41.la
   libwebpdspdecode_la_LIBADD += libwebpdspdecode_neon.la
   libwebpdspdecode_la_LIBADD += libwebpdspdecode_msa.la
+  libwebpdspdecode_la_LIBADD += libwebpdspdecode_mips32.la
+  libwebpdspdecode_la_LIBADD += libwebpdspdecode_mips_dsp_r2.la
 endif
diff --git a/third_party/libwebp/src/dsp/alpha_processing.c b/third_party/libwebp/src/dsp/alpha_processing.c
index 819d139..1d152f2 100644
--- a/third_party/libwebp/src/dsp/alpha_processing.c
+++ b/third_party/libwebp/src/dsp/alpha_processing.c
@@ -157,7 +157,8 @@
   }
 }
 
-void WebPMultRow_C(uint8_t* const ptr, const uint8_t* const alpha,
+void WebPMultRow_C(uint8_t* WEBP_RESTRICT const ptr,
+                   const uint8_t* WEBP_RESTRICT const alpha,
                    int width, int inverse) {
   int x;
   for (x = 0; x < width; ++x) {
@@ -178,7 +179,8 @@
 #undef MFIX
 
 void (*WebPMultARGBRow)(uint32_t* const ptr, int width, int inverse);
-void (*WebPMultRow)(uint8_t* const ptr, const uint8_t* const alpha,
+void (*WebPMultRow)(uint8_t* WEBP_RESTRICT const ptr,
+                    const uint8_t* WEBP_RESTRICT const alpha,
                     int width, int inverse);
 
 //------------------------------------------------------------------------------
@@ -193,8 +195,8 @@
   }
 }
 
-void WebPMultRows(uint8_t* ptr, int stride,
-                  const uint8_t* alpha, int alpha_stride,
+void WebPMultRows(uint8_t* WEBP_RESTRICT ptr, int stride,
+                  const uint8_t* WEBP_RESTRICT alpha, int alpha_stride,
                   int width, int num_rows, int inverse) {
   int n;
   for (n = 0; n < num_rows; ++n) {
@@ -290,9 +292,9 @@
 }
 
 #if !WEBP_NEON_OMIT_C_CODE
-static int DispatchAlpha_C(const uint8_t* alpha, int alpha_stride,
+static int DispatchAlpha_C(const uint8_t* WEBP_RESTRICT alpha, int alpha_stride,
                            int width, int height,
-                           uint8_t* dst, int dst_stride) {
+                           uint8_t* WEBP_RESTRICT dst, int dst_stride) {
   uint32_t alpha_mask = 0xff;
   int i, j;
 
@@ -309,9 +311,10 @@
   return (alpha_mask != 0xff);
 }
 
-static void DispatchAlphaToGreen_C(const uint8_t* alpha, int alpha_stride,
-                                   int width, int height,
-                                   uint32_t* dst, int dst_stride) {
+static void DispatchAlphaToGreen_C(const uint8_t* WEBP_RESTRICT alpha,
+                                   int alpha_stride, int width, int height,
+                                   uint32_t* WEBP_RESTRICT dst,
+                                   int dst_stride) {
   int i, j;
   for (j = 0; j < height; ++j) {
     for (i = 0; i < width; ++i) {
@@ -322,9 +325,9 @@
   }
 }
 
-static int ExtractAlpha_C(const uint8_t* argb, int argb_stride,
+static int ExtractAlpha_C(const uint8_t* WEBP_RESTRICT argb, int argb_stride,
                           int width, int height,
-                          uint8_t* alpha, int alpha_stride) {
+                          uint8_t* WEBP_RESTRICT alpha, int alpha_stride) {
   uint8_t alpha_mask = 0xff;
   int i, j;
 
@@ -340,7 +343,8 @@
   return (alpha_mask == 0xff);
 }
 
-static void ExtractGreen_C(const uint32_t* argb, uint8_t* alpha, int size) {
+static void ExtractGreen_C(const uint32_t* WEBP_RESTRICT argb,
+                           uint8_t* WEBP_RESTRICT alpha, int size) {
   int i;
   for (i = 0; i < size; ++i) alpha[i] = argb[i] >> 8;
 }
@@ -359,6 +363,11 @@
   return 0;
 }
 
+static void AlphaReplace_C(uint32_t* src, int length, uint32_t color) {
+  int x;
+  for (x = 0; x < length; ++x) if ((src[x] >> 24) == 0) src[x] = color;
+}
+
 //------------------------------------------------------------------------------
 // Simple channel manipulations.
 
@@ -367,8 +376,11 @@
 }
 
 #ifdef WORDS_BIGENDIAN
-static void PackARGB_C(const uint8_t* a, const uint8_t* r, const uint8_t* g,
-                       const uint8_t* b, int len, uint32_t* out) {
+static void PackARGB_C(const uint8_t* WEBP_RESTRICT a,
+                       const uint8_t* WEBP_RESTRICT r,
+                       const uint8_t* WEBP_RESTRICT g,
+                       const uint8_t* WEBP_RESTRICT b,
+                       int len, uint32_t* WEBP_RESTRICT out) {
   int i;
   for (i = 0; i < len; ++i) {
     out[i] = MakeARGB32(a[4 * i], r[4 * i], g[4 * i], b[4 * i]);
@@ -376,8 +388,10 @@
 }
 #endif
 
-static void PackRGB_C(const uint8_t* r, const uint8_t* g, const uint8_t* b,
-                      int len, int step, uint32_t* out) {
+static void PackRGB_C(const uint8_t* WEBP_RESTRICT r,
+                      const uint8_t* WEBP_RESTRICT g,
+                      const uint8_t* WEBP_RESTRICT b,
+                      int len, int step, uint32_t* WEBP_RESTRICT out) {
   int i, offset = 0;
   for (i = 0; i < len; ++i) {
     out[i] = MakeARGB32(0xff, r[offset], g[offset], b[offset]);
@@ -387,23 +401,31 @@
 
 void (*WebPApplyAlphaMultiply)(uint8_t*, int, int, int, int);
 void (*WebPApplyAlphaMultiply4444)(uint8_t*, int, int, int);
-int (*WebPDispatchAlpha)(const uint8_t*, int, int, int, uint8_t*, int);
-void (*WebPDispatchAlphaToGreen)(const uint8_t*, int, int, int, uint32_t*, int);
-int (*WebPExtractAlpha)(const uint8_t*, int, int, int, uint8_t*, int);
-void (*WebPExtractGreen)(const uint32_t* argb, uint8_t* alpha, int size);
+int (*WebPDispatchAlpha)(const uint8_t* WEBP_RESTRICT, int, int, int,
+                         uint8_t* WEBP_RESTRICT, int);
+void (*WebPDispatchAlphaToGreen)(const uint8_t* WEBP_RESTRICT, int, int, int,
+                                 uint32_t* WEBP_RESTRICT, int);
+int (*WebPExtractAlpha)(const uint8_t* WEBP_RESTRICT, int, int, int,
+                        uint8_t* WEBP_RESTRICT, int);
+void (*WebPExtractGreen)(const uint32_t* WEBP_RESTRICT argb,
+                         uint8_t* WEBP_RESTRICT alpha, int size);
 #ifdef WORDS_BIGENDIAN
 void (*WebPPackARGB)(const uint8_t* a, const uint8_t* r, const uint8_t* g,
                      const uint8_t* b, int, uint32_t*);
 #endif
-void (*WebPPackRGB)(const uint8_t* r, const uint8_t* g, const uint8_t* b,
-                    int len, int step, uint32_t* out);
+void (*WebPPackRGB)(const uint8_t* WEBP_RESTRICT r,
+                    const uint8_t* WEBP_RESTRICT g,
+                    const uint8_t* WEBP_RESTRICT b,
+                    int len, int step, uint32_t* WEBP_RESTRICT out);
 
 int (*WebPHasAlpha8b)(const uint8_t* src, int length);
 int (*WebPHasAlpha32b)(const uint8_t* src, int length);
+void (*WebPAlphaReplace)(uint32_t* src, int length, uint32_t color);
 
 //------------------------------------------------------------------------------
 // Init function
 
+extern VP8CPUInfo VP8GetCPUInfo;
 extern void WebPInitAlphaProcessingMIPSdspR2(void);
 extern void WebPInitAlphaProcessingSSE2(void);
 extern void WebPInitAlphaProcessingSSE41(void);
@@ -428,13 +450,14 @@
 
   WebPHasAlpha8b = HasAlpha8b_C;
   WebPHasAlpha32b = HasAlpha32b_C;
+  WebPAlphaReplace = AlphaReplace_C;
 
   // If defined, use CPUInfo() to overwrite some pointers with faster versions.
   if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       WebPInitAlphaProcessingSSE2();
-#if defined(WEBP_USE_SSE41)
+#if defined(WEBP_HAVE_SSE41)
       if (VP8GetCPUInfo(kSSE4_1)) {
         WebPInitAlphaProcessingSSE41();
       }
@@ -448,7 +471,7 @@
 #endif
   }
 
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
   if (WEBP_NEON_OMIT_C_CODE ||
       (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
     WebPInitAlphaProcessingNEON();
@@ -469,4 +492,5 @@
   assert(WebPPackRGB != NULL);
   assert(WebPHasAlpha8b != NULL);
   assert(WebPHasAlpha32b != NULL);
+  assert(WebPAlphaReplace != NULL);
 }
diff --git a/third_party/libwebp/src/dsp/alpha_processing_neon.c b/third_party/libwebp/src/dsp/alpha_processing_neon.c
index 9d55421..6716fb7 100644
--- a/third_party/libwebp/src/dsp/alpha_processing_neon.c
+++ b/third_party/libwebp/src/dsp/alpha_processing_neon.c
@@ -80,10 +80,10 @@
 
 //------------------------------------------------------------------------------
 
-static int DispatchAlpha_NEON(const uint8_t* alpha, int alpha_stride,
-                              int width, int height,
-                              uint8_t* dst, int dst_stride) {
-  uint32_t alpha_mask = 0xffffffffu;
+static int DispatchAlpha_NEON(const uint8_t* WEBP_RESTRICT alpha,
+                              int alpha_stride, int width, int height,
+                              uint8_t* WEBP_RESTRICT dst, int dst_stride) {
+  uint32_t alpha_mask = 0xffu;
   uint8x8_t mask8 = vdup_n_u8(0xff);
   uint32_t tmp[2];
   int i, j;
@@ -107,14 +107,16 @@
     dst += dst_stride;
   }
   vst1_u8((uint8_t*)tmp, mask8);
+  alpha_mask *= 0x01010101;
   alpha_mask &= tmp[0];
   alpha_mask &= tmp[1];
   return (alpha_mask != 0xffffffffu);
 }
 
-static void DispatchAlphaToGreen_NEON(const uint8_t* alpha, int alpha_stride,
-                                      int width, int height,
-                                      uint32_t* dst, int dst_stride) {
+static void DispatchAlphaToGreen_NEON(const uint8_t* WEBP_RESTRICT alpha,
+                                      int alpha_stride, int width, int height,
+                                      uint32_t* WEBP_RESTRICT dst,
+                                      int dst_stride) {
   int i, j;
   uint8x8x4_t greens;   // leave A/R/B channels zero'd.
   greens.val[0] = vdup_n_u8(0);
@@ -131,10 +133,10 @@
   }
 }
 
-static int ExtractAlpha_NEON(const uint8_t* argb, int argb_stride,
+static int ExtractAlpha_NEON(const uint8_t* WEBP_RESTRICT argb, int argb_stride,
                              int width, int height,
-                             uint8_t* alpha, int alpha_stride) {
-  uint32_t alpha_mask = 0xffffffffu;
+                             uint8_t* WEBP_RESTRICT alpha, int alpha_stride) {
+  uint32_t alpha_mask = 0xffu;
   uint8x8_t mask8 = vdup_n_u8(0xff);
   uint32_t tmp[2];
   int i, j;
@@ -156,13 +158,14 @@
     alpha += alpha_stride;
   }
   vst1_u8((uint8_t*)tmp, mask8);
+  alpha_mask *= 0x01010101;
   alpha_mask &= tmp[0];
   alpha_mask &= tmp[1];
   return (alpha_mask == 0xffffffffu);
 }
 
-static void ExtractGreen_NEON(const uint32_t* argb,
-                              uint8_t* alpha, int size) {
+static void ExtractGreen_NEON(const uint32_t* WEBP_RESTRICT argb,
+                              uint8_t* WEBP_RESTRICT alpha, int size) {
   int i;
   for (i = 0; i + 16 <= size; i += 16) {
     const uint8x16x4_t rgbX = vld4q_u8((const uint8_t*)(argb + i));
diff --git a/third_party/libwebp/src/dsp/alpha_processing_sse2.c b/third_party/libwebp/src/dsp/alpha_processing_sse2.c
index 7658700..f0843d0 100644
--- a/third_party/libwebp/src/dsp/alpha_processing_sse2.c
+++ b/third_party/libwebp/src/dsp/alpha_processing_sse2.c
@@ -18,16 +18,16 @@
 
 //------------------------------------------------------------------------------
 
-static int DispatchAlpha_SSE2(const uint8_t* alpha, int alpha_stride,
-                              int width, int height,
-                              uint8_t* dst, int dst_stride) {
+static int DispatchAlpha_SSE2(const uint8_t* WEBP_RESTRICT alpha,
+                              int alpha_stride, int width, int height,
+                              uint8_t* WEBP_RESTRICT dst, int dst_stride) {
   // alpha_and stores an 'and' operation of all the alpha[] values. The final
   // value is not 0xff if any of the alpha[] is not equal to 0xff.
   uint32_t alpha_and = 0xff;
   int i, j;
   const __m128i zero = _mm_setzero_si128();
-  const __m128i rgb_mask = _mm_set1_epi32(0xffffff00u);  // to preserve RGB
-  const __m128i all_0xff = _mm_set_epi32(0, 0, ~0u, ~0u);
+  const __m128i rgb_mask = _mm_set1_epi32((int)0xffffff00);  // to preserve RGB
+  const __m128i all_0xff = _mm_set_epi32(0, 0, ~0, ~0);
   __m128i all_alphas = all_0xff;
 
   // We must be able to access 3 extra bytes after the last written byte
@@ -72,9 +72,10 @@
   return (alpha_and != 0xff);
 }
 
-static void DispatchAlphaToGreen_SSE2(const uint8_t* alpha, int alpha_stride,
-                                      int width, int height,
-                                      uint32_t* dst, int dst_stride) {
+static void DispatchAlphaToGreen_SSE2(const uint8_t* WEBP_RESTRICT alpha,
+                                      int alpha_stride, int width, int height,
+                                      uint32_t* WEBP_RESTRICT dst,
+                                      int dst_stride) {
   int i, j;
   const __m128i zero = _mm_setzero_si128();
   const int limit = width & ~15;
@@ -98,15 +99,15 @@
   }
 }
 
-static int ExtractAlpha_SSE2(const uint8_t* argb, int argb_stride,
+static int ExtractAlpha_SSE2(const uint8_t* WEBP_RESTRICT argb, int argb_stride,
                              int width, int height,
-                             uint8_t* alpha, int alpha_stride) {
+                             uint8_t* WEBP_RESTRICT alpha, int alpha_stride) {
   // alpha_and stores an 'and' operation of all the alpha[] values. The final
   // value is not 0xff if any of the alpha[] is not equal to 0xff.
   uint32_t alpha_and = 0xff;
   int i, j;
-  const __m128i a_mask = _mm_set1_epi32(0xffu);  // to preserve alpha
-  const __m128i all_0xff = _mm_set_epi32(0, 0, ~0u, ~0u);
+  const __m128i a_mask = _mm_set1_epi32(0xff);  // to preserve alpha
+  const __m128i all_0xff = _mm_set_epi32(0, 0, ~0, ~0);
   __m128i all_alphas = all_0xff;
 
   // We must be able to access 3 extra bytes after the last written byte
@@ -177,7 +178,7 @@
 static void ApplyAlphaMultiply_SSE2(uint8_t* rgba, int alpha_first,
                                     int w, int h, int stride) {
   const __m128i zero = _mm_setzero_si128();
-  const __m128i kMult = _mm_set1_epi16(0x8081u);
+  const __m128i kMult = _mm_set1_epi16((short)0x8081);
   const __m128i kMask = _mm_set_epi16(0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0);
   const int kSpan = 4;
   while (h-- > 0) {
@@ -214,7 +215,7 @@
 // Alpha detection
 
 static int HasAlpha8b_SSE2(const uint8_t* src, int length) {
-  const __m128i all_0xff = _mm_set1_epi8(0xff);
+  const __m128i all_0xff = _mm_set1_epi8((char)0xff);
   int i = 0;
   for (; i + 16 <= length; i += 16) {
     const __m128i v = _mm_loadu_si128((const __m128i*)(src + i));
@@ -228,7 +229,7 @@
 
 static int HasAlpha32b_SSE2(const uint8_t* src, int length) {
   const __m128i alpha_mask = _mm_set1_epi32(0xff);
-  const __m128i all_0xff = _mm_set1_epi8(0xff);
+  const __m128i all_0xff = _mm_set1_epi8((char)0xff);
   int i = 0;
   // We don't know if we can access the last 3 bytes after the last alpha
   // value 'src[4 * length - 4]' (because we don't know if alpha is the first
@@ -265,6 +266,27 @@
   return 0;
 }
 
+static void AlphaReplace_SSE2(uint32_t* src, int length, uint32_t color) {
+  const __m128i m_color = _mm_set1_epi32((int)color);
+  const __m128i zero = _mm_setzero_si128();
+  int i = 0;
+  for (; i + 8 <= length; i += 8) {
+    const __m128i a0 = _mm_loadu_si128((const __m128i*)(src + i + 0));
+    const __m128i a1 = _mm_loadu_si128((const __m128i*)(src + i + 4));
+    const __m128i b0 = _mm_srai_epi32(a0, 24);
+    const __m128i b1 = _mm_srai_epi32(a1, 24);
+    const __m128i c0 = _mm_cmpeq_epi32(b0, zero);
+    const __m128i c1 = _mm_cmpeq_epi32(b1, zero);
+    const __m128i d0 = _mm_and_si128(c0, m_color);
+    const __m128i d1 = _mm_and_si128(c1, m_color);
+    const __m128i e0 = _mm_andnot_si128(c0, a0);
+    const __m128i e1 = _mm_andnot_si128(c1, a1);
+    _mm_storeu_si128((__m128i*)(src + i + 0), _mm_or_si128(d0, e0));
+    _mm_storeu_si128((__m128i*)(src + i + 4), _mm_or_si128(d1, e1));
+  }
+  for (; i < length; ++i) if ((src[i] >> 24) == 0) src[i] = color;
+}
+
 // -----------------------------------------------------------------------------
 // Apply alpha value to rows
 
@@ -296,7 +318,8 @@
   if (width > 0) WebPMultARGBRow_C(ptr + x, width, inverse);
 }
 
-static void MultRow_SSE2(uint8_t* const ptr, const uint8_t* const alpha,
+static void MultRow_SSE2(uint8_t* WEBP_RESTRICT const ptr,
+                         const uint8_t* WEBP_RESTRICT const alpha,
                          int width, int inverse) {
   int x = 0;
   if (!inverse) {
@@ -334,6 +357,7 @@
 
   WebPHasAlpha8b = HasAlpha8b_SSE2;
   WebPHasAlpha32b = HasAlpha32b_SSE2;
+  WebPAlphaReplace = AlphaReplace_SSE2;
 }
 
 #else  // !WEBP_USE_SSE2
diff --git a/third_party/libwebp/src/dsp/alpha_processing_sse41.c b/third_party/libwebp/src/dsp/alpha_processing_sse41.c
index 56040f9..1156ac3 100644
--- a/third_party/libwebp/src/dsp/alpha_processing_sse41.c
+++ b/third_party/libwebp/src/dsp/alpha_processing_sse41.c
@@ -19,14 +19,14 @@
 
 //------------------------------------------------------------------------------
 
-static int ExtractAlpha_SSE41(const uint8_t* argb, int argb_stride,
-                              int width, int height,
-                              uint8_t* alpha, int alpha_stride) {
+static int ExtractAlpha_SSE41(const uint8_t* WEBP_RESTRICT argb,
+                              int argb_stride, int width, int height,
+                              uint8_t* WEBP_RESTRICT alpha, int alpha_stride) {
   // alpha_and stores an 'and' operation of all the alpha[] values. The final
   // value is not 0xff if any of the alpha[] is not equal to 0xff.
   uint32_t alpha_and = 0xff;
   int i, j;
-  const __m128i all_0xff = _mm_set1_epi32(~0u);
+  const __m128i all_0xff = _mm_set1_epi32(~0);
   __m128i all_alphas = all_0xff;
 
   // We must be able to access 3 extra bytes after the last written byte
diff --git a/third_party/libwebp/src/dsp/cost.c b/third_party/libwebp/src/dsp/cost.c
index 0dba57b..eae0cb7 100644
--- a/third_party/libwebp/src/dsp/cost.c
+++ b/third_party/libwebp/src/dsp/cost.c
@@ -380,9 +380,11 @@
 VP8GetResidualCostFunc VP8GetResidualCost;
 VP8SetResidualCoeffsFunc VP8SetResidualCoeffs;
 
+extern VP8CPUInfo VP8GetCPUInfo;
 extern void VP8EncDspCostInitMIPS32(void);
 extern void VP8EncDspCostInitMIPSdspR2(void);
 extern void VP8EncDspCostInitSSE2(void);
+extern void VP8EncDspCostInitNEON(void);
 
 WEBP_DSP_INIT_FUNC(VP8EncDspCostInit) {
   VP8GetResidualCost = GetResidualCost_C;
@@ -400,11 +402,16 @@
       VP8EncDspCostInitMIPSdspR2();
     }
 #endif
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       VP8EncDspCostInitSSE2();
     }
 #endif
+#if defined(WEBP_HAVE_NEON)
+    if (VP8GetCPUInfo(kNEON)) {
+      VP8EncDspCostInitNEON();
+    }
+#endif
   }
 }
 
diff --git a/third_party/libwebp/src/dsp/cost_neon.c b/third_party/libwebp/src/dsp/cost_neon.c
new file mode 100644
index 0000000..5e28930
--- /dev/null
+++ b/third_party/libwebp/src/dsp/cost_neon.c
@@ -0,0 +1,126 @@
+// Copyright 2018 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// ARM NEON version of cost functions
+
+#include "src/dsp/dsp.h"
+
+#if defined(WEBP_USE_NEON)
+
+#if defined(STARBOARD)
+#include "starboard/client_porting/poem/assert_poem.h"
+#endif
+
+#include "src/dsp/neon.h"
+#include "src/enc/cost_enc.h"
+
+static const uint8_t position[16] = { 1, 2,  3,  4,  5,  6,  7,  8,
+                                      9, 10, 11, 12, 13, 14, 15, 16 };
+
+static void SetResidualCoeffs_NEON(const int16_t* const coeffs,
+                                   VP8Residual* const res) {
+  const int16x8_t minus_one = vdupq_n_s16(-1);
+  const int16x8_t coeffs_0 = vld1q_s16(coeffs);
+  const int16x8_t coeffs_1 = vld1q_s16(coeffs + 8);
+  const uint16x8_t eob_0 = vtstq_s16(coeffs_0, minus_one);
+  const uint16x8_t eob_1 = vtstq_s16(coeffs_1, minus_one);
+  const uint8x16_t eob = vcombine_u8(vqmovn_u16(eob_0), vqmovn_u16(eob_1));
+  const uint8x16_t masked = vandq_u8(eob, vld1q_u8(position));
+
+#if WEBP_AARCH64
+  res->last = vmaxvq_u8(masked) - 1;
+#else
+  const uint8x8_t eob_8x8 = vmax_u8(vget_low_u8(masked), vget_high_u8(masked));
+  const uint16x8_t eob_16x8 = vmovl_u8(eob_8x8);
+  const uint16x4_t eob_16x4 =
+      vmax_u16(vget_low_u16(eob_16x8), vget_high_u16(eob_16x8));
+  const uint32x4_t eob_32x4 = vmovl_u16(eob_16x4);
+  uint32x2_t eob_32x2 =
+      vmax_u32(vget_low_u32(eob_32x4), vget_high_u32(eob_32x4));
+  eob_32x2 = vpmax_u32(eob_32x2, eob_32x2);
+
+  vst1_lane_s32(&res->last, vreinterpret_s32_u32(eob_32x2), 0);
+  --res->last;
+#endif  // WEBP_AARCH64
+
+  res->coeffs = coeffs;
+}
+
+static int GetResidualCost_NEON(int ctx0, const VP8Residual* const res) {
+  uint8_t levels[16], ctxs[16];
+  uint16_t abs_levels[16];
+  int n = res->first;
+  // should be prob[VP8EncBands[n]], but it's equivalent for n=0 or 1
+  const int p0 = res->prob[n][ctx0][0];
+  CostArrayPtr const costs = res->costs;
+  const uint16_t* t = costs[n][ctx0];
+  // bit_cost(1, p0) is already incorporated in t[] tables, but only if ctx != 0
+  // (as required by the syntax). For ctx0 == 0, we need to add it here or it'll
+  // be missing during the loop.
+  int cost = (ctx0 == 0) ? VP8BitCost(1, p0) : 0;
+
+  if (res->last < 0) {
+    return VP8BitCost(0, p0);
+  }
+
+  {   // precompute clamped levels and contexts, packed to 8b.
+    const uint8x16_t kCst2 = vdupq_n_u8(2);
+    const uint8x16_t kCst67 = vdupq_n_u8(MAX_VARIABLE_LEVEL);
+    const int16x8_t c0 = vld1q_s16(res->coeffs);
+    const int16x8_t c1 = vld1q_s16(res->coeffs + 8);
+    const uint16x8_t E0 = vreinterpretq_u16_s16(vabsq_s16(c0));
+    const uint16x8_t E1 = vreinterpretq_u16_s16(vabsq_s16(c1));
+    const uint8x16_t F = vcombine_u8(vqmovn_u16(E0), vqmovn_u16(E1));
+    const uint8x16_t G = vminq_u8(F, kCst2);   // context = 0,1,2
+    const uint8x16_t H = vminq_u8(F, kCst67);  // clamp_level in [0..67]
+
+    vst1q_u8(ctxs, G);
+    vst1q_u8(levels, H);
+
+    vst1q_u16(abs_levels, E0);
+    vst1q_u16(abs_levels + 8, E1);
+  }
+  for (; n < res->last; ++n) {
+    const int ctx = ctxs[n];
+    const int level = levels[n];
+    const int flevel = abs_levels[n];   // full level
+    cost += VP8LevelFixedCosts[flevel] + t[level];  // simplified VP8LevelCost()
+    t = costs[n + 1][ctx];
+  }
+  // Last coefficient is always non-zero
+  {
+    const int level = levels[n];
+    const int flevel = abs_levels[n];
+    assert(flevel != 0);
+    cost += VP8LevelFixedCosts[flevel] + t[level];
+    if (n < 15) {
+      const int b = VP8EncBands[n + 1];
+      const int ctx = ctxs[n];
+      const int last_p0 = res->prob[b][ctx][0];
+      cost += VP8BitCost(0, last_p0);
+    }
+  }
+  return cost;
+}
+
+//------------------------------------------------------------------------------
+// Entry point
+
+extern void VP8EncDspCostInitNEON(void);
+
+WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspCostInitNEON(void) {
+  VP8SetResidualCoeffs = SetResidualCoeffs_NEON;
+  VP8GetResidualCost = GetResidualCost_NEON;
+}
+
+#else  // !WEBP_USE_NEON
+
+WEBP_DSP_INIT_STUB(VP8EncDspCostInitNEON)
+
+#endif  // WEBP_USE_NEON
diff --git a/third_party/libwebp/src/dsp/cpu.c b/third_party/libwebp/src/dsp/cpu.c
index 8b40fee..71b20f6 100644
--- a/third_party/libwebp/src/dsp/cpu.c
+++ b/third_party/libwebp/src/dsp/cpu.c
@@ -11,7 +11,52 @@
 //
 // Author: Christian Duvivier (cduvivier@google.com)
 
-#include "src/dsp/dsp.h"
+#include "src/dsp/cpu.h"
+
+#if defined(STARBOARD)
+
+#include "starboard/cpu_features.h"
+#include "starboard/log.h"
+#include "starboard/system.h"
+
+static bool warn_if_not_enabled(const char* name, bool value) {
+  if (!value) {
+    SbLogFormatF("LibWebP optimization not enabled: %s\n", name);
+    SbLogFlush();
+  }
+  return value;
+}
+
+static int StarboardGetCPUInfo(CPUFeature feature) {
+  SbCPUFeatures features;
+  if (SbCPUFeaturesGet(&features)) {
+    switch (feature) {
+      case kSSE2:
+        return warn_if_not_enabled("sse2", features.x86.has_sse2);
+      case kSSE3:
+        return warn_if_not_enabled("sse3", features.x86.has_sse3);
+      case kSSE4_1:
+        return warn_if_not_enabled("sse41", features.x86.has_sse41);
+      case kAVX:
+        return warn_if_not_enabled("avx", features.x86.has_avx);
+      case kAVX2:
+        return warn_if_not_enabled("avx2", features.x86.has_avx2);
+      case kNEON: {
+        return warn_if_not_enabled("neon", features.arm.has_neon);
+      }
+      default:
+        return 0;
+    }
+  } else {
+    SbLogFormatF("LibWebP CPU feature detection failed\n");
+    SbLogFlush();
+  }
+  return 0;
+}
+
+VP8CPUInfo VP8GetCPUInfo = StarboardGetCPUInfo;
+
+#else  // STARBOARD
 
 #if defined(WEBP_HAVE_NEON_RTCD)
 #include <stdio.h>
@@ -55,12 +100,18 @@
     : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3])
     : "a"(info_type), "c"(0));
 }
-#elif (defined(_M_X64) || defined(_M_IX86)) && \
-      defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 150030729  // >= VS2008 SP1
+#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86))
+
+#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 150030729  // >= VS2008 SP1
 #include <intrin.h>
 #define GetCPUInfo(info, type) __cpuidex(info, type, 0)  // set ecx=0
-#elif defined(WEBP_MSC_SSE2)
+#define WEBP_HAVE_MSC_CPUID
+#elif _MSC_VER > 1310
+#include <intrin.h>
 #define GetCPUInfo __cpuid
+#define WEBP_HAVE_MSC_CPUID
+#endif
+
 #endif
 
 // NaCl has no support for xgetbv or the raw opcode.
@@ -94,7 +145,7 @@
 #define xgetbv() 0U  // no AVX for older x64 or unrecognized toolchains.
 #endif
 
-#if defined(__i386__) || defined(__x86_64__) || defined(WEBP_MSC_SSE2)
+#if defined(__i386__) || defined(__x86_64__) || defined(WEBP_HAVE_MSC_CPUID)
 
 // helper function for run-time detection of slow SSSE3 platforms
 static int CheckSlowModel(int info) {
@@ -167,21 +218,49 @@
   }
   return 0;
 }
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
 VP8CPUInfo VP8GetCPUInfo = x86CPUInfo;
 #elif defined(WEBP_ANDROID_NEON)  // NB: needs to be before generic NEON test.
 static int AndroidCPUInfo(CPUFeature feature) {
   const AndroidCpuFamily cpu_family = android_getCpuFamily();
   const uint64_t cpu_features = android_getCpuFeatures();
   if (feature == kNEON) {
-    return (cpu_family == ANDROID_CPU_FAMILY_ARM &&
-            0 != (cpu_features & ANDROID_CPU_ARM_FEATURE_NEON));
+    return cpu_family == ANDROID_CPU_FAMILY_ARM &&
+           (cpu_features & ANDROID_CPU_ARM_FEATURE_NEON) != 0;
   }
   return 0;
 }
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
 VP8CPUInfo VP8GetCPUInfo = AndroidCPUInfo;
-#elif defined(WEBP_USE_NEON)
-// define a dummy function to enable turning off NEON at runtime by setting
-// VP8DecGetCPUInfo = NULL
+#elif defined(EMSCRIPTEN) // also needs to be before generic NEON test
+// Use compile flags as an indicator of SIMD support instead of a runtime check.
+static int wasmCPUInfo(CPUFeature feature) {
+  switch (feature) {
+#ifdef WEBP_HAVE_SSE2
+    case kSSE2:
+      return 1;
+#endif
+#ifdef WEBP_HAVE_SSE41
+    case kSSE3:
+    case kSlowSSSE3:
+    case kSSE4_1:
+      return 1;
+#endif
+#ifdef WEBP_HAVE_NEON
+    case kNEON:
+      return 1;
+#endif
+    default:
+      break;
+  }
+  return 0;
+}
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
+VP8CPUInfo VP8GetCPUInfo = wasmCPUInfo;
+#elif defined(WEBP_HAVE_NEON)
+// In most cases this function doesn't check for NEON support (it's assumed by
+// the configuration), but enables turning off NEON at runtime, for testing
+// purposes, by setting VP8GetCPUInfo = NULL.
 static int armCPUInfo(CPUFeature feature) {
   if (feature != kNEON) return 0;
 #if defined(__linux__) && defined(WEBP_HAVE_NEON_RTCD)
@@ -205,6 +284,7 @@
   return 1;
 #endif
 }
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
 VP8CPUInfo VP8GetCPUInfo = armCPUInfo;
 #elif defined(WEBP_USE_MIPS32) || defined(WEBP_USE_MIPS_DSP_R2) || \
       defined(WEBP_USE_MSA)
@@ -216,7 +296,11 @@
   }
 
 }
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
 VP8CPUInfo VP8GetCPUInfo = mipsCPUInfo;
 #else
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
 VP8CPUInfo VP8GetCPUInfo = NULL;
 #endif
+
+#endif  // STARBOARD
diff --git a/third_party/libwebp/src/dsp/cpu.h b/third_party/libwebp/src/dsp/cpu.h
new file mode 100644
index 0000000..c86540f
--- /dev/null
+++ b/third_party/libwebp/src/dsp/cpu.h
@@ -0,0 +1,266 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+//   CPU detection functions and macros.
+//
+// Author: Skal (pascal.massimino@gmail.com)
+
+#ifndef WEBP_DSP_CPU_H_
+#define WEBP_DSP_CPU_H_
+
+#include <stddef.h>
+
+#ifdef HAVE_CONFIG_H
+#include "src/webp/config.h"
+#endif
+
+#include "src/webp/types.h"
+
+#if defined(__GNUC__)
+#define LOCAL_GCC_VERSION ((__GNUC__ << 8) | __GNUC_MINOR__)
+#define LOCAL_GCC_PREREQ(maj, min) (LOCAL_GCC_VERSION >= (((maj) << 8) | (min)))
+#else
+#define LOCAL_GCC_VERSION 0
+#define LOCAL_GCC_PREREQ(maj, min) 0
+#endif
+
+#if defined(__clang__)
+#define LOCAL_CLANG_VERSION ((__clang_major__ << 8) | __clang_minor__)
+#define LOCAL_CLANG_PREREQ(maj, min) \
+  (LOCAL_CLANG_VERSION >= (((maj) << 8) | (min)))
+#else
+#define LOCAL_CLANG_VERSION 0
+#define LOCAL_CLANG_PREREQ(maj, min) 0
+#endif
+
+#ifndef __has_builtin
+#define __has_builtin(x) 0
+#endif
+
+//------------------------------------------------------------------------------
+// x86 defines.
+
+#if !defined(HAVE_CONFIG_H)
+#if defined(_MSC_VER) && _MSC_VER > 1310 && \
+    (defined(_M_X64) || defined(_M_IX86))
+#define WEBP_MSC_SSE2  // Visual C++ SSE2 targets
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER >= 1500 && \
+    (defined(_M_X64) || defined(_M_IX86))
+#define WEBP_MSC_SSE41  // Visual C++ SSE4.1 targets
+#endif
+#endif
+
+// WEBP_HAVE_* are used to indicate the presence of the instruction set in dsp
+// files without intrinsics, allowing the corresponding Init() to be called.
+// Files containing intrinsics will need to be built targeting the instruction
+// set so should succeed on one of the earlier tests.
+#if (defined(__SSE2__) || defined(WEBP_MSC_SSE2)) && \
+    (!defined(HAVE_CONFIG_H) || defined(WEBP_HAVE_SSE2))
+#define WEBP_USE_SSE2
+#endif
+
+#if defined(WEBP_USE_SSE2) && !defined(WEBP_HAVE_SSE2)
+#define WEBP_HAVE_SSE2
+#endif
+
+#if (defined(__SSE4_1__) || defined(WEBP_MSC_SSE41)) && \
+    (!defined(HAVE_CONFIG_H) || defined(WEBP_HAVE_SSE41))
+#define WEBP_USE_SSE41
+#endif
+
+#if defined(WEBP_USE_SSE41) && !defined(WEBP_HAVE_SSE41)
+#define WEBP_HAVE_SSE41
+#endif
+
+#undef WEBP_MSC_SSE41
+#undef WEBP_MSC_SSE2
+
+//------------------------------------------------------------------------------
+// Arm defines.
+
+// The intrinsics currently cause compiler errors with arm-nacl-gcc and the
+// inline assembly would need to be modified for use with Native Client.
+#if ((defined(__ARM_NEON__) || defined(__aarch64__)) &&       \
+     (!defined(HAVE_CONFIG_H) || defined(WEBP_HAVE_NEON))) && \
+    !defined(__native_client__)
+#define WEBP_USE_NEON
+#endif
+
+#if !defined(WEBP_USE_NEON) && defined(__ANDROID__) && \
+    defined(__ARM_ARCH_7A__) && defined(HAVE_CPU_FEATURES_H)
+#define WEBP_ANDROID_NEON  // Android targets that may have NEON
+#define WEBP_USE_NEON
+#endif
+
+// Note: ARM64 is supported in Visual Studio 2017, but requires the direct
+// inclusion of arm64_neon.h; Visual Studio 2019 includes this file in
+// arm_neon.h. Compile errors were seen with Visual Studio 2019 16.4 with
+// vtbl4_u8(); a fix was made in 16.6.
+#if defined(_MSC_VER) && \
+    ((_MSC_VER >= 1700 && defined(_M_ARM)) || \
+     (_MSC_VER >= 1926 && (defined(_M_ARM64) || defined(_M_ARM64EC))))
+#define WEBP_USE_NEON
+#define WEBP_USE_INTRINSICS
+#endif
+
+#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
+#define WEBP_AARCH64 1
+#else
+#define WEBP_AARCH64 0
+#endif
+
+#if defined(WEBP_USE_NEON) && !defined(WEBP_HAVE_NEON)
+#define WEBP_HAVE_NEON
+#endif
+
+//------------------------------------------------------------------------------
+// MIPS defines.
+
+#if defined(__mips__) && !defined(__mips64) && defined(__mips_isa_rev) && \
+    (__mips_isa_rev >= 1) && (__mips_isa_rev < 6)
+#define WEBP_USE_MIPS32
+#if (__mips_isa_rev >= 2)
+#define WEBP_USE_MIPS32_R2
+#if defined(__mips_dspr2) || (defined(__mips_dsp_rev) && __mips_dsp_rev >= 2)
+#define WEBP_USE_MIPS_DSP_R2
+#endif
+#endif
+#endif
+
+#if defined(__mips_msa) && defined(__mips_isa_rev) && (__mips_isa_rev >= 5)
+#define WEBP_USE_MSA
+#endif
+
+//------------------------------------------------------------------------------
+
+#ifndef WEBP_DSP_OMIT_C_CODE
+#define WEBP_DSP_OMIT_C_CODE 1
+#endif
+
+#if defined(WEBP_USE_NEON) && WEBP_DSP_OMIT_C_CODE
+#define WEBP_NEON_OMIT_C_CODE 1
+#else
+#define WEBP_NEON_OMIT_C_CODE 0
+#endif
+
+#if !(LOCAL_CLANG_PREREQ(3, 8) || LOCAL_GCC_PREREQ(4, 8) || WEBP_AARCH64)
+#define WEBP_NEON_WORK_AROUND_GCC 1
+#else
+#define WEBP_NEON_WORK_AROUND_GCC 0
+#endif
+
+//------------------------------------------------------------------------------
+
+// This macro prevents thread_sanitizer from reporting known concurrent writes.
+#define WEBP_TSAN_IGNORE_FUNCTION
+#if defined(__has_feature)
+#if __has_feature(thread_sanitizer)
+#undef WEBP_TSAN_IGNORE_FUNCTION
+#define WEBP_TSAN_IGNORE_FUNCTION __attribute__((no_sanitize_thread))
+#endif
+#endif
+
+#if defined(__has_feature)
+#if __has_feature(memory_sanitizer)
+#define WEBP_MSAN
+#endif
+#endif
+
+#if defined(WEBP_USE_THREAD) && !defined(_WIN32)
+#include <pthread.h>  // NOLINT
+
+#define WEBP_DSP_INIT(func)                                         \
+  do {                                                              \
+    static volatile VP8CPUInfo func##_last_cpuinfo_used =           \
+        (VP8CPUInfo)&func##_last_cpuinfo_used;                      \
+    static pthread_mutex_t func##_lock = PTHREAD_MUTEX_INITIALIZER; \
+    if (pthread_mutex_lock(&func##_lock)) break;                    \
+    if (func##_last_cpuinfo_used != VP8GetCPUInfo) func();          \
+    func##_last_cpuinfo_used = VP8GetCPUInfo;                       \
+    (void)pthread_mutex_unlock(&func##_lock);                       \
+  } while (0)
+#else  // !(defined(WEBP_USE_THREAD) && !defined(_WIN32))
+#define WEBP_DSP_INIT(func)                               \
+  do {                                                    \
+    static volatile VP8CPUInfo func##_last_cpuinfo_used = \
+        (VP8CPUInfo)&func##_last_cpuinfo_used;            \
+    if (func##_last_cpuinfo_used == VP8GetCPUInfo) break; \
+    func();                                               \
+    func##_last_cpuinfo_used = VP8GetCPUInfo;             \
+  } while (0)
+#endif  // defined(WEBP_USE_THREAD) && !defined(_WIN32)
+
+// Defines an Init + helper function that control multiple initialization of
+// function pointers / tables.
+/* Usage:
+   WEBP_DSP_INIT_FUNC(InitFunc) {
+     ...function body
+   }
+*/
+#define WEBP_DSP_INIT_FUNC(name)                                            \
+  static WEBP_TSAN_IGNORE_FUNCTION void name##_body(void);                  \
+  WEBP_TSAN_IGNORE_FUNCTION void name(void) { WEBP_DSP_INIT(name##_body); } \
+  static WEBP_TSAN_IGNORE_FUNCTION void name##_body(void)
+
+#define WEBP_UBSAN_IGNORE_UNDEF
+#define WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW
+#if defined(__clang__) && defined(__has_attribute)
+#if __has_attribute(no_sanitize)
+// This macro prevents the undefined behavior sanitizer from reporting
+// failures. This is only meant to silence unaligned loads on platforms that
+// are known to support them.
+#undef WEBP_UBSAN_IGNORE_UNDEF
+#define WEBP_UBSAN_IGNORE_UNDEF __attribute__((no_sanitize("undefined")))
+
+// This macro prevents the undefined behavior sanitizer from reporting
+// failures related to unsigned integer overflows. This is only meant to
+// silence cases where this well defined behavior is expected.
+#undef WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW
+#define WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW \
+  __attribute__((no_sanitize("unsigned-integer-overflow")))
+#endif
+#endif
+
+// If 'ptr' is NULL, returns NULL. Otherwise returns 'ptr + off'.
+// Prevents undefined behavior sanitizer nullptr-with-nonzero-offset warning.
+#if !defined(WEBP_OFFSET_PTR)
+#define WEBP_OFFSET_PTR(ptr, off) (((ptr) == NULL) ? NULL : ((ptr) + (off)))
+#endif
+
+// Regularize the definition of WEBP_SWAP_16BIT_CSP (backward compatibility)
+#if !defined(WEBP_SWAP_16BIT_CSP)
+#define WEBP_SWAP_16BIT_CSP 0
+#endif
+
+// some endian fix (e.g.: mips-gcc doesn't define __BIG_ENDIAN__)
+#if !defined(WORDS_BIGENDIAN) &&                   \
+    (defined(__BIG_ENDIAN__) || defined(_M_PPC) || \
+     (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)))
+#define WORDS_BIGENDIAN
+#endif
+
+typedef enum {
+  kSSE2,
+  kSSE3,
+  kSlowSSSE3,  // special feature for slow SSSE3 architectures
+  kSSE4_1,
+  kAVX,
+  kAVX2,
+  kNEON,
+  kMIPS32,
+  kMIPSdspR2,
+  kMSA
+} CPUFeature;
+
+// returns true if the CPU supports the feature.
+typedef int (*VP8CPUInfo)(CPUFeature feature);
+
+#endif  // WEBP_DSP_CPU_H_
diff --git a/third_party/libwebp/src/dsp/dec.c b/third_party/libwebp/src/dsp/dec.c
index aa2079b..791e041 100644
--- a/third_party/libwebp/src/dsp/dec.c
+++ b/third_party/libwebp/src/dsp/dec.c
@@ -738,6 +738,7 @@
 void (*VP8DitherCombine8x8)(const uint8_t* dither, uint8_t* dst,
                             int dst_stride);
 
+extern VP8CPUInfo VP8GetCPUInfo;
 extern void VP8DspInitSSE2(void);
 extern void VP8DspInitSSE41(void);
 extern void VP8DspInitNEON(void);
@@ -811,10 +812,10 @@
 
   // If defined, use CPUInfo() to overwrite some pointers with faster versions.
   if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       VP8DspInitSSE2();
-#if defined(WEBP_USE_SSE41)
+#if defined(WEBP_HAVE_SSE41)
       if (VP8GetCPUInfo(kSSE4_1)) {
         VP8DspInitSSE41();
       }
@@ -838,7 +839,7 @@
 #endif
   }
 
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
   if (WEBP_NEON_OMIT_C_CODE ||
       (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
     VP8DspInitNEON();
diff --git a/third_party/libwebp/src/dsp/dec_neon.c b/third_party/libwebp/src/dsp/dec_neon.c
index ffa697f..22784cf 100644
--- a/third_party/libwebp/src/dsp/dec_neon.c
+++ b/third_party/libwebp/src/dsp/dec_neon.c
@@ -1283,12 +1283,12 @@
   const uint8x8_t A = vld1_u8(dst - BPS);  // top row
   const uint16x4_t p0 = vpaddl_u8(A);  // cascading summation of the top
   const uint16x4_t p1 = vpadd_u16(p0, p0);
-  const uint16x8_t L0 = vmovl_u8(vld1_u8(dst + 0 * BPS - 1));
-  const uint16x8_t L1 = vmovl_u8(vld1_u8(dst + 1 * BPS - 1));
-  const uint16x8_t L2 = vmovl_u8(vld1_u8(dst + 2 * BPS - 1));
-  const uint16x8_t L3 = vmovl_u8(vld1_u8(dst + 3 * BPS - 1));
-  const uint16x8_t s0 = vaddq_u16(L0, L1);
-  const uint16x8_t s1 = vaddq_u16(L2, L3);
+  const uint8x8_t L0 = vld1_u8(dst + 0 * BPS - 1);
+  const uint8x8_t L1 = vld1_u8(dst + 1 * BPS - 1);
+  const uint8x8_t L2 = vld1_u8(dst + 2 * BPS - 1);
+  const uint8x8_t L3 = vld1_u8(dst + 3 * BPS - 1);
+  const uint16x8_t s0 = vaddl_u8(L0, L1);
+  const uint16x8_t s1 = vaddl_u8(L2, L3);
   const uint16x8_t s01 = vaddq_u16(s0, s1);
   const uint16x8_t sum = vaddq_u16(s01, vcombine_u16(p1, p1));
   const uint8x8_t dc0 = vrshrn_n_u16(sum, 3);  // (sum + 4) >> 3
@@ -1361,7 +1361,8 @@
   const uint32_t J = dst[-1 + 1 * BPS];
   const uint32_t K = dst[-1 + 2 * BPS];
   const uint32_t L = dst[-1 + 3 * BPS];
-  const uint64x1_t LKJI____ = vcreate_u64(L | (K << 8) | (J << 16) | (I << 24));
+  const uint64x1_t LKJI____ =
+      vcreate_u64((uint64_t)L | (K << 8) | (J << 16) | (I << 24));
   const uint64x1_t LKJIXABC = vorr_u64(LKJI____, ____XABC);
   const uint8x8_t KJIXABC_ = vreinterpret_u8_u64(vshr_n_u64(LKJIXABC, 8));
   const uint8x8_t JIXABC__ = vreinterpret_u8_u64(vshr_n_u64(LKJIXABC, 16));
@@ -1427,25 +1428,30 @@
 
   if (do_top) {
     const uint8x8_t A = vld1_u8(dst - BPS);  // top row
+#if WEBP_AARCH64
+    const uint16_t p2 = vaddlv_u8(A);
+    sum_top = vdupq_n_u16(p2);
+#else
     const uint16x4_t p0 = vpaddl_u8(A);  // cascading summation of the top
     const uint16x4_t p1 = vpadd_u16(p0, p0);
     const uint16x4_t p2 = vpadd_u16(p1, p1);
     sum_top = vcombine_u16(p2, p2);
+#endif
   }
 
   if (do_left) {
-    const uint16x8_t L0 = vmovl_u8(vld1_u8(dst + 0 * BPS - 1));
-    const uint16x8_t L1 = vmovl_u8(vld1_u8(dst + 1 * BPS - 1));
-    const uint16x8_t L2 = vmovl_u8(vld1_u8(dst + 2 * BPS - 1));
-    const uint16x8_t L3 = vmovl_u8(vld1_u8(dst + 3 * BPS - 1));
-    const uint16x8_t L4 = vmovl_u8(vld1_u8(dst + 4 * BPS - 1));
-    const uint16x8_t L5 = vmovl_u8(vld1_u8(dst + 5 * BPS - 1));
-    const uint16x8_t L6 = vmovl_u8(vld1_u8(dst + 6 * BPS - 1));
-    const uint16x8_t L7 = vmovl_u8(vld1_u8(dst + 7 * BPS - 1));
-    const uint16x8_t s0 = vaddq_u16(L0, L1);
-    const uint16x8_t s1 = vaddq_u16(L2, L3);
-    const uint16x8_t s2 = vaddq_u16(L4, L5);
-    const uint16x8_t s3 = vaddq_u16(L6, L7);
+    const uint8x8_t L0 = vld1_u8(dst + 0 * BPS - 1);
+    const uint8x8_t L1 = vld1_u8(dst + 1 * BPS - 1);
+    const uint8x8_t L2 = vld1_u8(dst + 2 * BPS - 1);
+    const uint8x8_t L3 = vld1_u8(dst + 3 * BPS - 1);
+    const uint8x8_t L4 = vld1_u8(dst + 4 * BPS - 1);
+    const uint8x8_t L5 = vld1_u8(dst + 5 * BPS - 1);
+    const uint8x8_t L6 = vld1_u8(dst + 6 * BPS - 1);
+    const uint8x8_t L7 = vld1_u8(dst + 7 * BPS - 1);
+    const uint16x8_t s0 = vaddl_u8(L0, L1);
+    const uint16x8_t s1 = vaddl_u8(L2, L3);
+    const uint16x8_t s2 = vaddl_u8(L4, L5);
+    const uint16x8_t s3 = vaddl_u8(L6, L7);
     const uint16x8_t s01 = vaddq_u16(s0, s1);
     const uint16x8_t s23 = vaddq_u16(s2, s3);
     sum_left = vaddq_u16(s01, s23);
@@ -1505,29 +1511,34 @@
 
   if (do_top) {
     const uint8x16_t A = vld1q_u8(dst - BPS);  // top row
+#if WEBP_AARCH64
+    const uint16_t p3 = vaddlvq_u8(A);
+    sum_top = vdupq_n_u16(p3);
+#else
     const uint16x8_t p0 = vpaddlq_u8(A);  // cascading summation of the top
     const uint16x4_t p1 = vadd_u16(vget_low_u16(p0), vget_high_u16(p0));
     const uint16x4_t p2 = vpadd_u16(p1, p1);
     const uint16x4_t p3 = vpadd_u16(p2, p2);
     sum_top = vcombine_u16(p3, p3);
+#endif
   }
 
   if (do_left) {
     int i;
     sum_left = vdupq_n_u16(0);
     for (i = 0; i < 16; i += 8) {
-      const uint16x8_t L0 = vmovl_u8(vld1_u8(dst + (i + 0) * BPS - 1));
-      const uint16x8_t L1 = vmovl_u8(vld1_u8(dst + (i + 1) * BPS - 1));
-      const uint16x8_t L2 = vmovl_u8(vld1_u8(dst + (i + 2) * BPS - 1));
-      const uint16x8_t L3 = vmovl_u8(vld1_u8(dst + (i + 3) * BPS - 1));
-      const uint16x8_t L4 = vmovl_u8(vld1_u8(dst + (i + 4) * BPS - 1));
-      const uint16x8_t L5 = vmovl_u8(vld1_u8(dst + (i + 5) * BPS - 1));
-      const uint16x8_t L6 = vmovl_u8(vld1_u8(dst + (i + 6) * BPS - 1));
-      const uint16x8_t L7 = vmovl_u8(vld1_u8(dst + (i + 7) * BPS - 1));
-      const uint16x8_t s0 = vaddq_u16(L0, L1);
-      const uint16x8_t s1 = vaddq_u16(L2, L3);
-      const uint16x8_t s2 = vaddq_u16(L4, L5);
-      const uint16x8_t s3 = vaddq_u16(L6, L7);
+      const uint8x8_t L0 = vld1_u8(dst + (i + 0) * BPS - 1);
+      const uint8x8_t L1 = vld1_u8(dst + (i + 1) * BPS - 1);
+      const uint8x8_t L2 = vld1_u8(dst + (i + 2) * BPS - 1);
+      const uint8x8_t L3 = vld1_u8(dst + (i + 3) * BPS - 1);
+      const uint8x8_t L4 = vld1_u8(dst + (i + 4) * BPS - 1);
+      const uint8x8_t L5 = vld1_u8(dst + (i + 5) * BPS - 1);
+      const uint8x8_t L6 = vld1_u8(dst + (i + 6) * BPS - 1);
+      const uint8x8_t L7 = vld1_u8(dst + (i + 7) * BPS - 1);
+      const uint16x8_t s0 = vaddl_u8(L0, L1);
+      const uint16x8_t s1 = vaddl_u8(L2, L3);
+      const uint16x8_t s2 = vaddl_u8(L4, L5);
+      const uint16x8_t s3 = vaddl_u8(L6, L7);
       const uint16x8_t s01 = vaddq_u16(s0, s1);
       const uint16x8_t s23 = vaddq_u16(s2, s3);
       const uint16x8_t sum = vaddq_u16(s01, s23);
diff --git a/third_party/libwebp/src/dsp/dec_sse2.c b/third_party/libwebp/src/dsp/dec_sse2.c
index b3840fa..01e6bcb 100644
--- a/third_party/libwebp/src/dsp/dec_sse2.c
+++ b/third_party/libwebp/src/dsp/dec_sse2.c
@@ -158,10 +158,10 @@
       dst3 = _mm_loadl_epi64((__m128i*)(dst + 3 * BPS));
     } else {
       // Load four bytes/pixels per line.
-      dst0 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 0 * BPS));
-      dst1 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 1 * BPS));
-      dst2 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 2 * BPS));
-      dst3 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 3 * BPS));
+      dst0 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 0 * BPS));
+      dst1 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 1 * BPS));
+      dst2 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 2 * BPS));
+      dst3 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 3 * BPS));
     }
     // Convert to 16b.
     dst0 = _mm_unpacklo_epi8(dst0, zero);
@@ -187,10 +187,10 @@
       _mm_storel_epi64((__m128i*)(dst + 3 * BPS), dst3);
     } else {
       // Store four bytes/pixels per line.
-      WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0));
-      WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1));
-      WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2));
-      WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3));
+      WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0));
+      WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1));
+      WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2));
+      WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3));
     }
   }
 }
@@ -213,10 +213,10 @@
   const __m128i m3 = _mm_subs_epi16(B, d4);
   const __m128i zero = _mm_setzero_si128();
   // Load the source pixels.
-  __m128i dst0 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 0 * BPS));
-  __m128i dst1 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 1 * BPS));
-  __m128i dst2 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 2 * BPS));
-  __m128i dst3 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 3 * BPS));
+  __m128i dst0 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 0 * BPS));
+  __m128i dst1 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 1 * BPS));
+  __m128i dst2 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 2 * BPS));
+  __m128i dst3 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 3 * BPS));
   // Convert to 16b.
   dst0 = _mm_unpacklo_epi8(dst0, zero);
   dst1 = _mm_unpacklo_epi8(dst1, zero);
@@ -233,10 +233,10 @@
   dst2 = _mm_packus_epi16(dst2, dst2);
   dst3 = _mm_packus_epi16(dst3, dst3);
   // Store the results.
-  WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0));
-  WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1));
-  WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2));
-  WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3));
+  WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0));
+  WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1));
+  WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2));
+  WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3));
 }
 #undef MUL
 #endif   // USE_TRANSFORM_AC3
@@ -326,7 +326,7 @@
   const __m128i a1_lo = _mm_srai_epi16(*a0_lo, 7);
   const __m128i a1_hi = _mm_srai_epi16(*a0_hi, 7);
   const __m128i delta = _mm_packs_epi16(a1_lo, a1_hi);
-  const __m128i sign_bit = _mm_set1_epi8(0x80);
+  const __m128i sign_bit = _mm_set1_epi8((char)0x80);
   *pi = _mm_adds_epi8(*pi, delta);
   *qi = _mm_subs_epi8(*qi, delta);
   FLIP_SIGN_BIT2(*pi, *qi);
@@ -338,9 +338,9 @@
                                          const __m128i* const q0,
                                          const __m128i* const q1,
                                          int thresh, __m128i* const mask) {
-  const __m128i m_thresh = _mm_set1_epi8(thresh);
+  const __m128i m_thresh = _mm_set1_epi8((char)thresh);
   const __m128i t1 = MM_ABS(*p1, *q1);        // abs(p1 - q1)
-  const __m128i kFE = _mm_set1_epi8(0xFE);
+  const __m128i kFE = _mm_set1_epi8((char)0xFE);
   const __m128i t2 = _mm_and_si128(t1, kFE);  // set lsb of each byte to zero
   const __m128i t3 = _mm_srli_epi16(t2, 1);   // abs(p1 - q1) / 2
 
@@ -360,7 +360,7 @@
                                        __m128i* const q0, __m128i* const q1,
                                        int thresh) {
   __m128i a, mask;
-  const __m128i sign_bit = _mm_set1_epi8(0x80);
+  const __m128i sign_bit = _mm_set1_epi8((char)0x80);
   // convert p1/q1 to int8_t (for GetBaseDelta_SSE2)
   const __m128i p1s = _mm_xor_si128(*p1, sign_bit);
   const __m128i q1s = _mm_xor_si128(*q1, sign_bit);
@@ -380,7 +380,7 @@
                                        const __m128i* const mask,
                                        int hev_thresh) {
   const __m128i zero = _mm_setzero_si128();
-  const __m128i sign_bit = _mm_set1_epi8(0x80);
+  const __m128i sign_bit = _mm_set1_epi8((char)0x80);
   const __m128i k64 = _mm_set1_epi8(64);
   const __m128i k3 = _mm_set1_epi8(3);
   const __m128i k4 = _mm_set1_epi8(4);
@@ -427,7 +427,7 @@
                                        const __m128i* const mask,
                                        int hev_thresh) {
   const __m128i zero = _mm_setzero_si128();
-  const __m128i sign_bit = _mm_set1_epi8(0x80);
+  const __m128i sign_bit = _mm_set1_epi8((char)0x80);
   __m128i a, not_hev;
 
   // compute hev mask
@@ -477,11 +477,11 @@
   // A0 = 63 62 61 60 23 22 21 20 43 42 41 40 03 02 01 00
   // A1 = 73 72 71 70 33 32 31 30 53 52 51 50 13 12 11 10
   const __m128i A0 = _mm_set_epi32(
-      WebPMemToUint32(&b[6 * stride]), WebPMemToUint32(&b[2 * stride]),
-      WebPMemToUint32(&b[4 * stride]), WebPMemToUint32(&b[0 * stride]));
+      WebPMemToInt32(&b[6 * stride]), WebPMemToInt32(&b[2 * stride]),
+      WebPMemToInt32(&b[4 * stride]), WebPMemToInt32(&b[0 * stride]));
   const __m128i A1 = _mm_set_epi32(
-      WebPMemToUint32(&b[7 * stride]), WebPMemToUint32(&b[3 * stride]),
-      WebPMemToUint32(&b[5 * stride]), WebPMemToUint32(&b[1 * stride]));
+      WebPMemToInt32(&b[7 * stride]), WebPMemToInt32(&b[3 * stride]),
+      WebPMemToInt32(&b[5 * stride]), WebPMemToInt32(&b[1 * stride]));
 
   // B0 = 53 43 52 42 51 41 50 40 13 03 12 02 11 01 10 00
   // B1 = 73 63 72 62 71 61 70 60 33 23 32 22 31 21 30 20
@@ -540,7 +540,7 @@
                                       uint8_t* dst, int stride) {
   int i;
   for (i = 0; i < 4; ++i, dst += stride) {
-    WebPUint32ToMem(dst, _mm_cvtsi128_si32(*x));
+    WebPInt32ToMem(dst, _mm_cvtsi128_si32(*x));
     *x = _mm_srli_si128(*x, 4);
   }
 }
@@ -908,10 +908,10 @@
   const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGH00), one);
   const __m128i b = _mm_subs_epu8(a, lsb);
   const __m128i avg = _mm_avg_epu8(b, BCDEFGH0);
-  const uint32_t vals = _mm_cvtsi128_si32(avg);
+  const int vals = _mm_cvtsi128_si32(avg);
   int i;
   for (i = 0; i < 4; ++i) {
-    WebPUint32ToMem(dst + i * BPS, vals);
+    WebPInt32ToMem(dst + i * BPS, vals);
   }
 }
 
@@ -925,10 +925,10 @@
   const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGHH0), one);
   const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
   const __m128i abcdefg = _mm_avg_epu8(avg2, BCDEFGH0);
-  WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(               abcdefg    ));
-  WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
-  WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
-  WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
+  WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(               abcdefg    ));
+  WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
+  WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
+  WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
 }
 
 static void VR4_SSE2(uint8_t* dst) {   // Vertical-Right
@@ -941,15 +941,15 @@
   const __m128i ABCD0 = _mm_srli_si128(XABCD, 1);
   const __m128i abcd = _mm_avg_epu8(XABCD, ABCD0);
   const __m128i _XABCD = _mm_slli_si128(XABCD, 1);
-  const __m128i IXABCD = _mm_insert_epi16(_XABCD, I | (X << 8), 0);
+  const __m128i IXABCD = _mm_insert_epi16(_XABCD, (short)(I | (X << 8)), 0);
   const __m128i avg1 = _mm_avg_epu8(IXABCD, ABCD0);
   const __m128i lsb = _mm_and_si128(_mm_xor_si128(IXABCD, ABCD0), one);
   const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
   const __m128i efgh = _mm_avg_epu8(avg2, XABCD);
-  WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(               abcd    ));
-  WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(               efgh    ));
-  WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1)));
-  WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1)));
+  WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(               abcd    ));
+  WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(               efgh    ));
+  WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1)));
+  WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1)));
 
   // these two are hard to implement in SSE2, so we keep the C-version:
   DST(0, 2) = AVG3(J, I, X);
@@ -970,11 +970,12 @@
   const __m128i abbc = _mm_or_si128(ab, bc);
   const __m128i lsb2 = _mm_and_si128(abbc, lsb1);
   const __m128i avg4 = _mm_subs_epu8(avg3, lsb2);
-  const uint32_t extra_out = _mm_cvtsi128_si32(_mm_srli_si128(avg4, 4));
-  WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(               avg1    ));
-  WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(               avg4    ));
-  WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1)));
-  WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1)));
+  const uint32_t extra_out =
+      (uint32_t)_mm_cvtsi128_si32(_mm_srli_si128(avg4, 4));
+  WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(               avg1    ));
+  WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(               avg4    ));
+  WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1)));
+  WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1)));
 
   // these two are hard to get and irregular
   DST(3, 2) = (extra_out >> 0) & 0xff;
@@ -990,7 +991,7 @@
   const uint32_t K = dst[-1 + 2 * BPS];
   const uint32_t L = dst[-1 + 3 * BPS];
   const __m128i LKJI_____ =
-      _mm_cvtsi32_si128(L | (K << 8) | (J << 16) | (I << 24));
+      _mm_cvtsi32_si128((int)(L | (K << 8) | (J << 16) | (I << 24)));
   const __m128i LKJIXABCD = _mm_or_si128(LKJI_____, ____XABCD);
   const __m128i KJIXABCD_ = _mm_srli_si128(LKJIXABCD, 1);
   const __m128i JIXABCD__ = _mm_srli_si128(LKJIXABCD, 2);
@@ -998,10 +999,10 @@
   const __m128i lsb = _mm_and_si128(_mm_xor_si128(JIXABCD__, LKJIXABCD), one);
   const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
   const __m128i abcdefg = _mm_avg_epu8(avg2, KJIXABCD_);
-  WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(               abcdefg    ));
-  WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
-  WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
-  WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
+  WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(               abcdefg    ));
+  WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
+  WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
+  WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
 }
 
 #undef DST
@@ -1015,13 +1016,13 @@
   const __m128i zero = _mm_setzero_si128();
   int y;
   if (size == 4) {
-    const __m128i top_values = _mm_cvtsi32_si128(WebPMemToUint32(top));
+    const __m128i top_values = _mm_cvtsi32_si128(WebPMemToInt32(top));
     const __m128i top_base = _mm_unpacklo_epi8(top_values, zero);
     for (y = 0; y < 4; ++y, dst += BPS) {
       const int val = dst[-1] - top[-1];
       const __m128i base = _mm_set1_epi16(val);
       const __m128i out = _mm_packus_epi16(_mm_add_epi16(base, top_base), zero);
-      WebPUint32ToMem(dst, _mm_cvtsi128_si32(out));
+      WebPInt32ToMem(dst, _mm_cvtsi128_si32(out));
     }
   } else if (size == 8) {
     const __m128i top_values = _mm_loadl_epi64((const __m128i*)top);
@@ -1062,7 +1063,7 @@
 static void HE16_SSE2(uint8_t* dst) {     // horizontal
   int j;
   for (j = 16; j > 0; --j) {
-    const __m128i values = _mm_set1_epi8(dst[-1]);
+    const __m128i values = _mm_set1_epi8((char)dst[-1]);
     _mm_storeu_si128((__m128i*)dst, values);
     dst += BPS;
   }
@@ -1070,7 +1071,7 @@
 
 static WEBP_INLINE void Put16_SSE2(uint8_t v, uint8_t* dst) {
   int j;
-  const __m128i values = _mm_set1_epi8(v);
+  const __m128i values = _mm_set1_epi8((char)v);
   for (j = 0; j < 16; ++j) {
     _mm_storeu_si128((__m128i*)(dst + j * BPS), values);
   }
@@ -1130,7 +1131,7 @@
 // helper for chroma-DC predictions
 static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) {
   int j;
-  const __m128i values = _mm_set1_epi8(v);
+  const __m128i values = _mm_set1_epi8((char)v);
   for (j = 0; j < 8; ++j) {
     _mm_storel_epi64((__m128i*)(dst + j * BPS), values);
   }
diff --git a/third_party/libwebp/src/dsp/dec_sse41.c b/third_party/libwebp/src/dsp/dec_sse41.c
index 8f18506..08a3630 100644
--- a/third_party/libwebp/src/dsp/dec_sse41.c
+++ b/third_party/libwebp/src/dsp/dec_sse41.c
@@ -23,7 +23,7 @@
   int j;
   const __m128i kShuffle3 = _mm_set1_epi8(3);
   for (j = 16; j > 0; --j) {
-    const __m128i in = _mm_cvtsi32_si128(WebPMemToUint32(dst - 4));
+    const __m128i in = _mm_cvtsi32_si128(WebPMemToInt32(dst - 4));
     const __m128i values = _mm_shuffle_epi8(in, kShuffle3);
     _mm_storeu_si128((__m128i*)dst, values);
     dst += BPS;
diff --git a/third_party/libwebp/src/dsp/dsp.h b/third_party/libwebp/src/dsp/dsp.h
index 7f9bb53..d2000b8 100644
--- a/third_party/libwebp/src/dsp/dsp.h
+++ b/third_party/libwebp/src/dsp/dsp.h
@@ -18,6 +18,7 @@
 #include "src/webp/config.h"
 #endif
 
+#include "src/dsp/cpu.h"
 #include "src/webp/types.h"
 
 #ifdef __cplusplus
@@ -27,214 +28,22 @@
 #define BPS 32   // this is the common stride for enc/dec
 
 //------------------------------------------------------------------------------
-// CPU detection
+// WEBP_RESTRICT
 
+// Declares a pointer with the restrict type qualifier if available.
+// This allows code to hint to the compiler that only this pointer references a
+// particular object or memory region within the scope of the block in which it
+// is declared. This may allow for improved optimizations due to the lack of
+// pointer aliasing. See also:
+// https://en.cppreference.com/w/c/language/restrict
 #if defined(__GNUC__)
-# define LOCAL_GCC_VERSION ((__GNUC__ << 8) | __GNUC_MINOR__)
-# define LOCAL_GCC_PREREQ(maj, min) \
-    (LOCAL_GCC_VERSION >= (((maj) << 8) | (min)))
+#define WEBP_RESTRICT __restrict__
+#elif defined(_MSC_VER)
+#define WEBP_RESTRICT __restrict
 #else
-# define LOCAL_GCC_VERSION 0
-# define LOCAL_GCC_PREREQ(maj, min) 0
+#define WEBP_RESTRICT
 #endif
 
-#if defined(__clang__)
-# define LOCAL_CLANG_VERSION ((__clang_major__ << 8) | __clang_minor__)
-# define LOCAL_CLANG_PREREQ(maj, min) \
-    (LOCAL_CLANG_VERSION >= (((maj) << 8) | (min)))
-#else
-# define LOCAL_CLANG_VERSION 0
-# define LOCAL_CLANG_PREREQ(maj, min) 0
-#endif
-
-#ifndef __has_builtin
-# define __has_builtin(x) 0
-#endif
-
-// for now, none of the optimizations below are available in emscripten
-#if !defined(EMSCRIPTEN)
-
-#if defined(_MSC_VER) && _MSC_VER > 1310 && \
-    (defined(_M_X64) || defined(_M_IX86))
-#define WEBP_MSC_SSE2  // Visual C++ SSE2 targets
-#endif
-
-#if defined(_MSC_VER) && _MSC_VER >= 1500 && \
-    (defined(_M_X64) || defined(_M_IX86))
-#define WEBP_MSC_SSE41  // Visual C++ SSE4.1 targets
-#endif
-
-// WEBP_HAVE_* are used to indicate the presence of the instruction set in dsp
-// files without intrinsics, allowing the corresponding Init() to be called.
-// Files containing intrinsics will need to be built targeting the instruction
-// set so should succeed on one of the earlier tests.
-#if defined(__SSE2__) || defined(WEBP_MSC_SSE2) || defined(WEBP_HAVE_SSE2)
-#define WEBP_USE_SSE2
-#endif
-
-#if defined(__SSE4_1__) || defined(WEBP_MSC_SSE41) || defined(WEBP_HAVE_SSE41)
-#define WEBP_USE_SSE41
-#endif
-
-#if defined(__AVX2__) || defined(WEBP_HAVE_AVX2)
-#define WEBP_USE_AVX2
-#endif
-
-// The intrinsics currently cause compiler errors with arm-nacl-gcc and the
-// inline assembly would need to be modified for use with Native Client.
-#if (defined(__ARM_NEON__) || \
-     defined(__aarch64__) || defined(WEBP_HAVE_NEON)) && \
-    !defined(__native_client__)
-#define WEBP_USE_NEON
-#endif
-
-#if !defined(WEBP_USE_NEON) && defined(__ANDROID__) && \
-    defined(__ARM_ARCH_7A__) && defined(HAVE_CPU_FEATURES_H)
-#define WEBP_ANDROID_NEON  // Android targets that may have NEON
-#define WEBP_USE_NEON
-#endif
-
-#if defined(_MSC_VER) && _MSC_VER >= 1700 && defined(_M_ARM)
-#define WEBP_USE_NEON
-#define WEBP_USE_INTRINSICS
-#endif
-
-#if defined(__mips__) && !defined(__mips64) && \
-    defined(__mips_isa_rev) && (__mips_isa_rev >= 1) && (__mips_isa_rev < 6)
-#define WEBP_USE_MIPS32
-#if (__mips_isa_rev >= 2)
-#define WEBP_USE_MIPS32_R2
-#if defined(__mips_dspr2) || (defined(__mips_dsp_rev) && __mips_dsp_rev >= 2)
-#define WEBP_USE_MIPS_DSP_R2
-#endif
-#endif
-#endif
-
-#if defined(__mips_msa) && defined(__mips_isa_rev) && (__mips_isa_rev >= 5)
-#define WEBP_USE_MSA
-#endif
-
-#endif  /* EMSCRIPTEN */
-
-#ifndef WEBP_DSP_OMIT_C_CODE
-#define WEBP_DSP_OMIT_C_CODE 1
-#endif
-
-#if (defined(__aarch64__) || defined(__ARM_NEON__)) && WEBP_DSP_OMIT_C_CODE
-#define WEBP_NEON_OMIT_C_CODE 1
-#else
-#define WEBP_NEON_OMIT_C_CODE 0
-#endif
-
-#if !(LOCAL_CLANG_PREREQ(3,8) || LOCAL_GCC_PREREQ(4,8) || defined(__aarch64__))
-#define WEBP_NEON_WORK_AROUND_GCC 1
-#else
-#define WEBP_NEON_WORK_AROUND_GCC 0
-#endif
-
-// This macro prevents thread_sanitizer from reporting known concurrent writes.
-#define WEBP_TSAN_IGNORE_FUNCTION
-#if defined(__has_feature)
-#if __has_feature(thread_sanitizer)
-#undef WEBP_TSAN_IGNORE_FUNCTION
-#define WEBP_TSAN_IGNORE_FUNCTION __attribute__((no_sanitize_thread))
-#endif
-#endif
-
-#if defined(WEBP_USE_THREAD) && !defined(_WIN32)
-#if !defined(STARBOARD)
-// TODO: If not including this is a problem on a Starboard platform, then
-//       we should implement this functionality with Starboard threading
-//       primitives instead.
-#include <pthread.h>  // NOLINT
-#endif
-
-#define WEBP_DSP_INIT(func) do {                                    \
-  static volatile VP8CPUInfo func ## _last_cpuinfo_used =           \
-      (VP8CPUInfo)&func ## _last_cpuinfo_used;                      \
-  static pthread_mutex_t func ## _lock = PTHREAD_MUTEX_INITIALIZER; \
-  if (pthread_mutex_lock(&func ## _lock)) break;                    \
-  if (func ## _last_cpuinfo_used != VP8GetCPUInfo) func();          \
-  func ## _last_cpuinfo_used = VP8GetCPUInfo;                       \
-  (void)pthread_mutex_unlock(&func ## _lock);                       \
-} while (0)
-#else  // !(defined(WEBP_USE_THREAD) && !defined(_WIN32))
-#define WEBP_DSP_INIT(func) do {                                    \
-  static volatile VP8CPUInfo func ## _last_cpuinfo_used =           \
-      (VP8CPUInfo)&func ## _last_cpuinfo_used;                      \
-  if (func ## _last_cpuinfo_used == VP8GetCPUInfo) break;           \
-  func();                                                           \
-  func ## _last_cpuinfo_used = VP8GetCPUInfo;                       \
-} while (0)
-#endif  // defined(WEBP_USE_THREAD) && !defined(_WIN32)
-
-// Defines an Init + helper function that control multiple initialization of
-// function pointers / tables.
-/* Usage:
-   WEBP_DSP_INIT_FUNC(InitFunc) {
-     ...function body
-   }
-*/
-#define WEBP_DSP_INIT_FUNC(name)                             \
-  static WEBP_TSAN_IGNORE_FUNCTION void name ## _body(void); \
-  WEBP_TSAN_IGNORE_FUNCTION void name(void) {                \
-    WEBP_DSP_INIT(name ## _body);                            \
-  }                                                          \
-  static WEBP_TSAN_IGNORE_FUNCTION void name ## _body(void)
-
-#define WEBP_UBSAN_IGNORE_UNDEF
-#define WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW
-#if defined(__clang__) && defined(__has_attribute)
-#if __has_attribute(no_sanitize)
-// This macro prevents the undefined behavior sanitizer from reporting
-// failures. This is only meant to silence unaligned loads on platforms that
-// are known to support them.
-#undef WEBP_UBSAN_IGNORE_UNDEF
-#define WEBP_UBSAN_IGNORE_UNDEF \
-  __attribute__((no_sanitize("undefined")))
-
-// This macro prevents the undefined behavior sanitizer from reporting
-// failures related to unsigned integer overflows. This is only meant to
-// silence cases where this well defined behavior is expected.
-#undef WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW
-#define WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW \
-  __attribute__((no_sanitize("unsigned-integer-overflow")))
-#endif
-#endif
-
-// Regularize the definition of WEBP_SWAP_16BIT_CSP (backward compatibility)
-#if !defined(WEBP_SWAP_16BIT_CSP)
-#define WEBP_SWAP_16BIT_CSP 0
-#endif
-
-// some endian fix (e.g.: mips-gcc doesn't define __BIG_ENDIAN__)
-#if defined(STARBOARD)
-#if SB_IS(BIG_ENDIAN)
-#define WORDS_BIGENDIAN
-#endif
-#else
-#if !defined(WORDS_BIGENDIAN) && \
-    (defined(__BIG_ENDIAN__) || defined(_M_PPC) || \
-     (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)))
-#define WORDS_BIGENDIAN
-#endif
-#endif  // defined(STARBOARD)
-
-typedef enum {
-  kSSE2,
-  kSSE3,
-  kSlowSSSE3,  // special feature for slow SSSE3 architectures
-  kSSE4_1,
-  kAVX,
-  kAVX2,
-  kNEON,
-  kMIPS32,
-  kMIPSdspR2,
-  kMSA
-} CPUFeature;
-// returns true if the CPU supports the feature.
-typedef int (*VP8CPUInfo)(CPUFeature feature);
-WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
 
 //------------------------------------------------------------------------------
 // Init stub generator
@@ -261,9 +70,9 @@
 extern VP8WHT VP8FTransformWHT;
 // Predictions
 // *dst is the destination block. *top and *left can be NULL.
-typedef void (*VP8IntraPreds)(uint8_t *dst, const uint8_t* left,
+typedef void (*VP8IntraPreds)(uint8_t* dst, const uint8_t* left,
                               const uint8_t* top);
-typedef void (*VP8Intra4Preds)(uint8_t *dst, const uint8_t* top);
+typedef void (*VP8Intra4Preds)(uint8_t* dst, const uint8_t* top);
 extern VP8Intra4Preds VP8EncPredLuma4;
 extern VP8IntraPreds VP8EncPredLuma16;
 extern VP8IntraPreds VP8EncPredChroma8;
@@ -523,15 +332,6 @@
 extern void WebPConvertRGBA32ToUV_C(const uint16_t* rgb,
                                     uint8_t* u, uint8_t* v, int width);
 
-// utilities for accurate RGB->YUV conversion
-extern uint64_t (*WebPSharpYUVUpdateY)(const uint16_t* src, const uint16_t* ref,
-                                       uint16_t* dst, int len);
-extern void (*WebPSharpYUVUpdateRGB)(const int16_t* src, const int16_t* ref,
-                                     int16_t* dst, int len);
-extern void (*WebPSharpYUVFilterRow)(const int16_t* A, const int16_t* B,
-                                     int len,
-                                     const uint16_t* best_y, uint16_t* out);
-
 // Must be called before using the above.
 void WebPInitConvertARGBToYUV(void);
 
@@ -587,26 +387,29 @@
 
 // Dispatch the values from alpha[] plane to the ARGB destination 'dst'.
 // Returns true if alpha[] plane has non-trivial values different from 0xff.
-extern int (*WebPDispatchAlpha)(const uint8_t* alpha, int alpha_stride,
-                                int width, int height,
-                                uint8_t* dst, int dst_stride);
+extern int (*WebPDispatchAlpha)(const uint8_t* WEBP_RESTRICT alpha,
+                                int alpha_stride, int width, int height,
+                                uint8_t* WEBP_RESTRICT dst, int dst_stride);
 
 // Transfer packed 8b alpha[] values to green channel in dst[], zero'ing the
 // A/R/B values. 'dst_stride' is the stride for dst[] in uint32_t units.
-extern void (*WebPDispatchAlphaToGreen)(const uint8_t* alpha, int alpha_stride,
-                                        int width, int height,
-                                        uint32_t* dst, int dst_stride);
+extern void (*WebPDispatchAlphaToGreen)(const uint8_t* WEBP_RESTRICT alpha,
+                                        int alpha_stride, int width, int height,
+                                        uint32_t* WEBP_RESTRICT dst,
+                                        int dst_stride);
 
 // Extract the alpha values from 32b values in argb[] and pack them into alpha[]
 // (this is the opposite of WebPDispatchAlpha).
 // Returns true if there's only trivial 0xff alpha values.
-extern int (*WebPExtractAlpha)(const uint8_t* argb, int argb_stride,
-                               int width, int height,
-                               uint8_t* alpha, int alpha_stride);
+extern int (*WebPExtractAlpha)(const uint8_t* WEBP_RESTRICT argb,
+                               int argb_stride, int width, int height,
+                               uint8_t* WEBP_RESTRICT alpha,
+                               int alpha_stride);
 
 // Extract the green values from 32b values in argb[] and pack them into alpha[]
 // (this is the opposite of WebPDispatchAlphaToGreen).
-extern void (*WebPExtractGreen)(const uint32_t* argb, uint8_t* alpha, int size);
+extern void (*WebPExtractGreen)(const uint32_t* WEBP_RESTRICT argb,
+                                uint8_t* WEBP_RESTRICT alpha, int size);
 
 // Pre-Multiply operation transforms x into x * A / 255  (where x=Y,R,G or B).
 // Un-Multiply operation transforms x into x * 255 / A.
@@ -619,34 +422,42 @@
                       int inverse);
 
 // Same for a row of single values, with side alpha values.
-extern void (*WebPMultRow)(uint8_t* const ptr, const uint8_t* const alpha,
+extern void (*WebPMultRow)(uint8_t* WEBP_RESTRICT const ptr,
+                           const uint8_t* WEBP_RESTRICT const alpha,
                            int width, int inverse);
 
 // Same a WebPMultRow(), but for several 'num_rows' rows.
-void WebPMultRows(uint8_t* ptr, int stride,
-                  const uint8_t* alpha, int alpha_stride,
+void WebPMultRows(uint8_t* WEBP_RESTRICT ptr, int stride,
+                  const uint8_t* WEBP_RESTRICT alpha, int alpha_stride,
                   int width, int num_rows, int inverse);
 
 // Plain-C versions, used as fallback by some implementations.
-void WebPMultRow_C(uint8_t* const ptr, const uint8_t* const alpha,
+void WebPMultRow_C(uint8_t* WEBP_RESTRICT const ptr,
+                   const uint8_t* WEBP_RESTRICT const alpha,
                    int width, int inverse);
 void WebPMultARGBRow_C(uint32_t* const ptr, int width, int inverse);
 
 #ifdef WORDS_BIGENDIAN
 // ARGB packing function: a/r/g/b input is rgba or bgra order.
-extern void (*WebPPackARGB)(const uint8_t* a, const uint8_t* r,
-                            const uint8_t* g, const uint8_t* b, int len,
-                            uint32_t* out);
+extern void (*WebPPackARGB)(const uint8_t* WEBP_RESTRICT a,
+                            const uint8_t* WEBP_RESTRICT r,
+                            const uint8_t* WEBP_RESTRICT g,
+                            const uint8_t* WEBP_RESTRICT b,
+                            int len, uint32_t* WEBP_RESTRICT out);
 #endif
 
 // RGB packing function. 'step' can be 3 or 4. r/g/b input is rgb or bgr order.
-extern void (*WebPPackRGB)(const uint8_t* r, const uint8_t* g, const uint8_t* b,
-                           int len, int step, uint32_t* out);
+extern void (*WebPPackRGB)(const uint8_t* WEBP_RESTRICT r,
+                           const uint8_t* WEBP_RESTRICT g,
+                           const uint8_t* WEBP_RESTRICT b,
+                           int len, int step, uint32_t* WEBP_RESTRICT out);
 
 // This function returns true if src[i] contains a value different from 0xff.
 extern int (*WebPHasAlpha8b)(const uint8_t* src, int length);
 // This function returns true if src[4*i] contains a value different from 0xff.
 extern int (*WebPHasAlpha32b)(const uint8_t* src, int length);
+// replaces transparent values in src[] by 'color'.
+extern void (*WebPAlphaReplace)(uint32_t* src, int length, uint32_t color);
 
 // To be called first before using the above.
 void WebPInitAlphaProcessing(void);
@@ -690,4 +501,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_DSP_DSP_H_ */
+#endif  // WEBP_DSP_DSP_H_
diff --git a/third_party/libwebp/src/dsp/enc.c b/third_party/libwebp/src/dsp/enc.c
index 4775258..b492454 100644
--- a/third_party/libwebp/src/dsp/enc.c
+++ b/third_party/libwebp/src/dsp/enc.c
@@ -738,9 +738,9 @@
 VP8BlockCopy VP8Copy4x4;
 VP8BlockCopy VP8Copy16x8;
 
+extern VP8CPUInfo VP8GetCPUInfo;
 extern void VP8EncDspInitSSE2(void);
 extern void VP8EncDspInitSSE41(void);
-extern void VP8EncDspInitAVX2(void);
 extern void VP8EncDspInitNEON(void);
 extern void VP8EncDspInitMIPS32(void);
 extern void VP8EncDspInitMIPSdspR2(void);
@@ -780,21 +780,16 @@
 
   // If defined, use CPUInfo() to overwrite some pointers with faster versions.
   if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       VP8EncDspInitSSE2();
-#if defined(WEBP_USE_SSE41)
+#if defined(WEBP_HAVE_SSE41)
       if (VP8GetCPUInfo(kSSE4_1)) {
         VP8EncDspInitSSE41();
       }
 #endif
     }
 #endif
-#if defined(WEBP_USE_AVX2)
-    if (VP8GetCPUInfo(kAVX2)) {
-      VP8EncDspInitAVX2();
-    }
-#endif
 #if defined(WEBP_USE_MIPS32)
     if (VP8GetCPUInfo(kMIPS32)) {
       VP8EncDspInitMIPS32();
@@ -812,7 +807,7 @@
 #endif
   }
 
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
   if (WEBP_NEON_OMIT_C_CODE ||
       (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
     VP8EncDspInitNEON();
diff --git a/third_party/libwebp/src/dsp/enc_avx2.c b/third_party/libwebp/src/dsp/enc_avx2.c
deleted file mode 100644
index 8bc5798..0000000
--- a/third_party/libwebp/src/dsp/enc_avx2.c
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// Use of this source code is governed by a BSD-style license
-// that can be found in the COPYING file in the root of the source
-// tree. An additional intellectual property rights grant can be found
-// in the file PATENTS. All contributing project authors may
-// be found in the AUTHORS file in the root of the source tree.
-// -----------------------------------------------------------------------------
-//
-// AVX2 version of speed-critical encoding functions.
-
-#include "src/dsp/dsp.h"
-
-#if defined(WEBP_USE_AVX2)
-
-#endif  // WEBP_USE_AVX2
-
-//------------------------------------------------------------------------------
-// Entry point
-
-WEBP_DSP_INIT_STUB(VP8EncDspInitAVX2)
diff --git a/third_party/libwebp/src/dsp/enc_neon.c b/third_party/libwebp/src/dsp/enc_neon.c
index 43bf124..7148003 100644
--- a/third_party/libwebp/src/dsp/enc_neon.c
+++ b/third_party/libwebp/src/dsp/enc_neon.c
@@ -9,7 +9,7 @@
 //
 // ARM NEON version of speed-critical encoding functions.
 //
-// adapted from libvpx (http://www.webmproject.org/code/)
+// adapted from libvpx (https://www.webmproject.org/code/)
 
 #include "src/dsp/dsp.h"
 
@@ -764,9 +764,14 @@
 
 // Horizontal sum of all four uint32_t values in 'sum'.
 static int SumToInt_NEON(uint32x4_t sum) {
+#if WEBP_AARCH64
+  return (int)vaddvq_u32(sum);
+#else
   const uint64x2_t sum2 = vpaddlq_u32(sum);
-  const uint64_t sum3 = vgetq_lane_u64(sum2, 0) + vgetq_lane_u64(sum2, 1);
-  return (int)sum3;
+  const uint32x2_t sum3 = vadd_u32(vreinterpret_u32_u64(vget_low_u64(sum2)),
+                                   vreinterpret_u32_u64(vget_high_u64(sum2)));
+  return (int)vget_lane_u32(sum3, 0);
+#endif
 }
 
 static int SSE16x16_NEON(const uint8_t* a, const uint8_t* b) {
@@ -860,7 +865,7 @@
   uint8x8x4_t shuffles;
   // vtbl?_u8 are marked unavailable for iOS arm64 with Xcode < 6.3, use
   // non-standard versions there.
-#if defined(__APPLE__) && defined(__aarch64__) && \
+#if defined(__APPLE__) && WEBP_AARCH64 && \
     defined(__apple_build_version__) && (__apple_build_version__< 6020037)
   uint8x16x2_t all_out;
   INIT_VECTOR2(all_out, vreinterpretq_u8_s16(out0), vreinterpretq_u8_s16(out1));
diff --git a/third_party/libwebp/src/dsp/enc_sse2.c b/third_party/libwebp/src/dsp/enc_sse2.c
index eead98e..463609a 100644
--- a/third_party/libwebp/src/dsp/enc_sse2.c
+++ b/third_party/libwebp/src/dsp/enc_sse2.c
@@ -31,9 +31,160 @@
 //------------------------------------------------------------------------------
 // Transforms (Paragraph 14.4)
 
-// Does one or two inverse transforms.
-static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst,
-                            int do_two) {
+// Does one inverse transform.
+static void ITransform_One_SSE2(const uint8_t* ref, const int16_t* in,
+                                uint8_t* dst) {
+  // This implementation makes use of 16-bit fixed point versions of two
+  // multiply constants:
+  //    K1 = sqrt(2) * cos (pi/8) ~= 85627 / 2^16
+  //    K2 = sqrt(2) * sin (pi/8) ~= 35468 / 2^16
+  //
+  // To be able to use signed 16-bit integers, we use the following trick to
+  // have constants within range:
+  // - Associated constants are obtained by subtracting the 16-bit fixed point
+  //   version of one:
+  //      k = K - (1 << 16)  =>  K = k + (1 << 16)
+  //      K1 = 85267  =>  k1 =  20091
+  //      K2 = 35468  =>  k2 = -30068
+  // - The multiplication of a variable by a constant become the sum of the
+  //   variable and the multiplication of that variable by the associated
+  //   constant:
+  //      (x * K) >> 16 = (x * (k + (1 << 16))) >> 16 = ((x * k ) >> 16) + x
+  const __m128i k1k2 = _mm_set_epi16(-30068, -30068, -30068, -30068,
+                                     20091, 20091, 20091, 20091);
+  const __m128i k2k1 = _mm_set_epi16(20091, 20091, 20091, 20091,
+                                     -30068, -30068, -30068, -30068);
+  const __m128i zero = _mm_setzero_si128();
+  const __m128i zero_four = _mm_set_epi16(0, 0, 0, 0, 4, 4, 4, 4);
+  __m128i T01, T23;
+
+  // Load and concatenate the transform coefficients.
+  const __m128i in01 = _mm_loadu_si128((const __m128i*)&in[0]);
+  const __m128i in23 = _mm_loadu_si128((const __m128i*)&in[8]);
+  // a00 a10 a20 a30   a01 a11 a21 a31
+  // a02 a12 a22 a32   a03 a13 a23 a33
+
+  // Vertical pass and subsequent transpose.
+  {
+    const __m128i in1 = _mm_unpackhi_epi64(in01, in01);
+    const __m128i in3 = _mm_unpackhi_epi64(in23, in23);
+
+    // First pass, c and d calculations are longer because of the "trick"
+    // multiplications.
+    // c = MUL(in1, K2) - MUL(in3, K1) = MUL(in1, k2) - MUL(in3, k1) + in1 - in3
+    // d = MUL(in1, K1) + MUL(in3, K2) = MUL(in1, k1) + MUL(in3, k2) + in1 + in3
+    const __m128i a_d3 = _mm_add_epi16(in01, in23);
+    const __m128i b_c3 = _mm_sub_epi16(in01, in23);
+    const __m128i c1d1 = _mm_mulhi_epi16(in1, k2k1);
+    const __m128i c2d2 = _mm_mulhi_epi16(in3, k1k2);
+    const __m128i c3 = _mm_unpackhi_epi64(b_c3, b_c3);
+    const __m128i c4 = _mm_sub_epi16(c1d1, c2d2);
+    const __m128i c = _mm_add_epi16(c3, c4);
+    const __m128i d4u = _mm_add_epi16(c1d1, c2d2);
+    const __m128i du = _mm_add_epi16(a_d3, d4u);
+    const __m128i d = _mm_unpackhi_epi64(du, du);
+
+    // Second pass.
+    const __m128i comb_ab = _mm_unpacklo_epi64(a_d3, b_c3);
+    const __m128i comb_dc = _mm_unpacklo_epi64(d, c);
+
+    const __m128i tmp01 = _mm_add_epi16(comb_ab, comb_dc);
+    const __m128i tmp32 = _mm_sub_epi16(comb_ab, comb_dc);
+    const __m128i tmp23 = _mm_shuffle_epi32(tmp32, _MM_SHUFFLE(1, 0, 3, 2));
+
+    const __m128i transpose_0 = _mm_unpacklo_epi16(tmp01, tmp23);
+    const __m128i transpose_1 = _mm_unpackhi_epi16(tmp01, tmp23);
+    // a00 a20 a01 a21   a02 a22 a03 a23
+    // a10 a30 a11 a31   a12 a32 a13 a33
+
+    T01 = _mm_unpacklo_epi16(transpose_0, transpose_1);
+    T23 = _mm_unpackhi_epi16(transpose_0, transpose_1);
+    // a00 a10 a20 a30   a01 a11 a21 a31
+    // a02 a12 a22 a32   a03 a13 a23 a33
+  }
+
+  // Horizontal pass and subsequent transpose.
+  {
+    const __m128i T1 = _mm_unpackhi_epi64(T01, T01);
+    const __m128i T3 = _mm_unpackhi_epi64(T23, T23);
+
+    // First pass, c and d calculations are longer because of the "trick"
+    // multiplications.
+    const __m128i dc = _mm_add_epi16(T01, zero_four);
+
+    // c = MUL(T1, K2) - MUL(T3, K1) = MUL(T1, k2) - MUL(T3, k1) + T1 - T3
+    // d = MUL(T1, K1) + MUL(T3, K2) = MUL(T1, k1) + MUL(T3, k2) + T1 + T3
+    const __m128i a_d3 = _mm_add_epi16(dc, T23);
+    const __m128i b_c3 = _mm_sub_epi16(dc, T23);
+    const __m128i c1d1 = _mm_mulhi_epi16(T1, k2k1);
+    const __m128i c2d2 = _mm_mulhi_epi16(T3, k1k2);
+    const __m128i c3 = _mm_unpackhi_epi64(b_c3, b_c3);
+    const __m128i c4 = _mm_sub_epi16(c1d1, c2d2);
+    const __m128i c = _mm_add_epi16(c3, c4);
+    const __m128i d4u = _mm_add_epi16(c1d1, c2d2);
+    const __m128i du = _mm_add_epi16(a_d3, d4u);
+    const __m128i d = _mm_unpackhi_epi64(du, du);
+
+    // Second pass.
+    const __m128i comb_ab = _mm_unpacklo_epi64(a_d3, b_c3);
+    const __m128i comb_dc = _mm_unpacklo_epi64(d, c);
+
+    const __m128i tmp01 = _mm_add_epi16(comb_ab, comb_dc);
+    const __m128i tmp32 = _mm_sub_epi16(comb_ab, comb_dc);
+    const __m128i tmp23 = _mm_shuffle_epi32(tmp32, _MM_SHUFFLE(1, 0, 3, 2));
+
+    const __m128i shifted01 = _mm_srai_epi16(tmp01, 3);
+    const __m128i shifted23 = _mm_srai_epi16(tmp23, 3);
+    // a00 a01 a02 a03   a10 a11 a12 a13
+    // a20 a21 a22 a23   a30 a31 a32 a33
+
+    const __m128i transpose_0 = _mm_unpacklo_epi16(shifted01, shifted23);
+    const __m128i transpose_1 = _mm_unpackhi_epi16(shifted01, shifted23);
+    // a00 a20 a01 a21   a02 a22 a03 a23
+    // a10 a30 a11 a31   a12 a32 a13 a33
+
+    T01 = _mm_unpacklo_epi16(transpose_0, transpose_1);
+    T23 = _mm_unpackhi_epi16(transpose_0, transpose_1);
+    // a00 a10 a20 a30   a01 a11 a21 a31
+    // a02 a12 a22 a32   a03 a13 a23 a33
+  }
+
+  // Add inverse transform to 'ref' and store.
+  {
+    // Load the reference(s).
+    __m128i ref01, ref23, ref0123;
+    int32_t buf[4];
+
+    // Load four bytes/pixels per line.
+    const __m128i ref0 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[0 * BPS]));
+    const __m128i ref1 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[1 * BPS]));
+    const __m128i ref2 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[2 * BPS]));
+    const __m128i ref3 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[3 * BPS]));
+    ref01 = _mm_unpacklo_epi32(ref0, ref1);
+    ref23 = _mm_unpacklo_epi32(ref2, ref3);
+
+    // Convert to 16b.
+    ref01 = _mm_unpacklo_epi8(ref01, zero);
+    ref23 = _mm_unpacklo_epi8(ref23, zero);
+    // Add the inverse transform(s).
+    ref01 = _mm_add_epi16(ref01, T01);
+    ref23 = _mm_add_epi16(ref23, T23);
+    // Unsigned saturate to 8b.
+    ref0123 = _mm_packus_epi16(ref01, ref23);
+
+    _mm_storeu_si128((__m128i *)buf, ref0123);
+
+    // Store four bytes/pixels per line.
+    WebPInt32ToMem(&dst[0 * BPS], buf[0]);
+    WebPInt32ToMem(&dst[1 * BPS], buf[1]);
+    WebPInt32ToMem(&dst[2 * BPS], buf[2]);
+    WebPInt32ToMem(&dst[3 * BPS], buf[3]);
+  }
+}
+
+// Does two inverse transforms.
+static void ITransform_Two_SSE2(const uint8_t* ref, const int16_t* in,
+                                uint8_t* dst) {
   // This implementation makes use of 16-bit fixed point versions of two
   // multiply constants:
   //    K1 = sqrt(2) * cos (pi/8) ~= 85627 / 2^16
@@ -55,33 +206,21 @@
   __m128i T0, T1, T2, T3;
 
   // Load and concatenate the transform coefficients (we'll do two inverse
-  // transforms in parallel). In the case of only one inverse transform, the
-  // second half of the vectors will just contain random value we'll never
-  // use nor store.
+  // transforms in parallel).
   __m128i in0, in1, in2, in3;
   {
-    in0 = _mm_loadl_epi64((const __m128i*)&in[0]);
-    in1 = _mm_loadl_epi64((const __m128i*)&in[4]);
-    in2 = _mm_loadl_epi64((const __m128i*)&in[8]);
-    in3 = _mm_loadl_epi64((const __m128i*)&in[12]);
-    // a00 a10 a20 a30   x x x x
-    // a01 a11 a21 a31   x x x x
-    // a02 a12 a22 a32   x x x x
-    // a03 a13 a23 a33   x x x x
-    if (do_two) {
-      const __m128i inB0 = _mm_loadl_epi64((const __m128i*)&in[16]);
-      const __m128i inB1 = _mm_loadl_epi64((const __m128i*)&in[20]);
-      const __m128i inB2 = _mm_loadl_epi64((const __m128i*)&in[24]);
-      const __m128i inB3 = _mm_loadl_epi64((const __m128i*)&in[28]);
-      in0 = _mm_unpacklo_epi64(in0, inB0);
-      in1 = _mm_unpacklo_epi64(in1, inB1);
-      in2 = _mm_unpacklo_epi64(in2, inB2);
-      in3 = _mm_unpacklo_epi64(in3, inB3);
-      // a00 a10 a20 a30   b00 b10 b20 b30
-      // a01 a11 a21 a31   b01 b11 b21 b31
-      // a02 a12 a22 a32   b02 b12 b22 b32
-      // a03 a13 a23 a33   b03 b13 b23 b33
-    }
+    const __m128i tmp0 = _mm_loadu_si128((const __m128i*)&in[0]);
+    const __m128i tmp1 = _mm_loadu_si128((const __m128i*)&in[8]);
+    const __m128i tmp2 = _mm_loadu_si128((const __m128i*)&in[16]);
+    const __m128i tmp3 = _mm_loadu_si128((const __m128i*)&in[24]);
+    in0 = _mm_unpacklo_epi64(tmp0, tmp2);
+    in1 = _mm_unpackhi_epi64(tmp0, tmp2);
+    in2 = _mm_unpacklo_epi64(tmp1, tmp3);
+    in3 = _mm_unpackhi_epi64(tmp1, tmp3);
+    // a00 a10 a20 a30   b00 b10 b20 b30
+    // a01 a11 a21 a31   b01 b11 b21 b31
+    // a02 a12 a22 a32   b02 b12 b22 b32
+    // a03 a13 a23 a33   b03 b13 b23 b33
   }
 
   // Vertical pass and subsequent transpose.
@@ -154,19 +293,11 @@
     const __m128i zero = _mm_setzero_si128();
     // Load the reference(s).
     __m128i ref0, ref1, ref2, ref3;
-    if (do_two) {
-      // Load eight bytes/pixels per line.
-      ref0 = _mm_loadl_epi64((const __m128i*)&ref[0 * BPS]);
-      ref1 = _mm_loadl_epi64((const __m128i*)&ref[1 * BPS]);
-      ref2 = _mm_loadl_epi64((const __m128i*)&ref[2 * BPS]);
-      ref3 = _mm_loadl_epi64((const __m128i*)&ref[3 * BPS]);
-    } else {
-      // Load four bytes/pixels per line.
-      ref0 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[0 * BPS]));
-      ref1 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[1 * BPS]));
-      ref2 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[2 * BPS]));
-      ref3 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[3 * BPS]));
-    }
+    // Load eight bytes/pixels per line.
+    ref0 = _mm_loadl_epi64((const __m128i*)&ref[0 * BPS]);
+    ref1 = _mm_loadl_epi64((const __m128i*)&ref[1 * BPS]);
+    ref2 = _mm_loadl_epi64((const __m128i*)&ref[2 * BPS]);
+    ref3 = _mm_loadl_epi64((const __m128i*)&ref[3 * BPS]);
     // Convert to 16b.
     ref0 = _mm_unpacklo_epi8(ref0, zero);
     ref1 = _mm_unpacklo_epi8(ref1, zero);
@@ -182,20 +313,21 @@
     ref1 = _mm_packus_epi16(ref1, ref1);
     ref2 = _mm_packus_epi16(ref2, ref2);
     ref3 = _mm_packus_epi16(ref3, ref3);
-    // Store the results.
-    if (do_two) {
-      // Store eight bytes/pixels per line.
-      _mm_storel_epi64((__m128i*)&dst[0 * BPS], ref0);
-      _mm_storel_epi64((__m128i*)&dst[1 * BPS], ref1);
-      _mm_storel_epi64((__m128i*)&dst[2 * BPS], ref2);
-      _mm_storel_epi64((__m128i*)&dst[3 * BPS], ref3);
-    } else {
-      // Store four bytes/pixels per line.
-      WebPUint32ToMem(&dst[0 * BPS], _mm_cvtsi128_si32(ref0));
-      WebPUint32ToMem(&dst[1 * BPS], _mm_cvtsi128_si32(ref1));
-      WebPUint32ToMem(&dst[2 * BPS], _mm_cvtsi128_si32(ref2));
-      WebPUint32ToMem(&dst[3 * BPS], _mm_cvtsi128_si32(ref3));
-    }
+    // Store eight bytes/pixels per line.
+    _mm_storel_epi64((__m128i*)&dst[0 * BPS], ref0);
+    _mm_storel_epi64((__m128i*)&dst[1 * BPS], ref1);
+    _mm_storel_epi64((__m128i*)&dst[2 * BPS], ref2);
+    _mm_storel_epi64((__m128i*)&dst[3 * BPS], ref3);
+  }
+}
+
+// Does one or two inverse transforms.
+static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst,
+                            int do_two) {
+  if (do_two) {
+    ITransform_Two_SSE2(ref, in, dst);
+  } else {
+    ITransform_One_SSE2(ref, in, dst);
   }
 }
 
@@ -487,7 +619,7 @@
 // helper for chroma-DC predictions
 static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) {
   int j;
-  const __m128i values = _mm_set1_epi8(v);
+  const __m128i values = _mm_set1_epi8((char)v);
   for (j = 0; j < 8; ++j) {
     _mm_storel_epi64((__m128i*)(dst + j * BPS), values);
   }
@@ -495,7 +627,7 @@
 
 static WEBP_INLINE void Put16_SSE2(uint8_t v, uint8_t* dst) {
   int j;
-  const __m128i values = _mm_set1_epi8(v);
+  const __m128i values = _mm_set1_epi8((char)v);
   for (j = 0; j < 16; ++j) {
     _mm_store_si128((__m128i*)(dst + j * BPS), values);
   }
@@ -546,7 +678,7 @@
 static WEBP_INLINE void HE8uv_SSE2(uint8_t* dst, const uint8_t* left) {
   int j;
   for (j = 0; j < 8; ++j) {
-    const __m128i values = _mm_set1_epi8(left[j]);
+    const __m128i values = _mm_set1_epi8((char)left[j]);
     _mm_storel_epi64((__m128i*)dst, values);
     dst += BPS;
   }
@@ -555,7 +687,7 @@
 static WEBP_INLINE void HE16_SSE2(uint8_t* dst, const uint8_t* left) {
   int j;
   for (j = 0; j < 16; ++j) {
-    const __m128i values = _mm_set1_epi8(left[j]);
+    const __m128i values = _mm_set1_epi8((char)left[j]);
     _mm_store_si128((__m128i*)dst, values);
     dst += BPS;
   }
@@ -728,10 +860,10 @@
   const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGH00), one);
   const __m128i b = _mm_subs_epu8(a, lsb);
   const __m128i avg = _mm_avg_epu8(b, BCDEFGH0);
-  const uint32_t vals = _mm_cvtsi128_si32(avg);
+  const int vals = _mm_cvtsi128_si32(avg);
   int i;
   for (i = 0; i < 4; ++i) {
-    WebPUint32ToMem(dst + i * BPS, vals);
+    WebPInt32ToMem(dst + i * BPS, vals);
   }
 }
 
@@ -766,10 +898,10 @@
   const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGHH0), one);
   const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
   const __m128i abcdefg = _mm_avg_epu8(avg2, BCDEFGH0);
-  WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(               abcdefg    ));
-  WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
-  WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
-  WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
+  WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(               abcdefg    ));
+  WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
+  WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
+  WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
 }
 
 static WEBP_INLINE void VR4_SSE2(uint8_t* dst,
@@ -783,15 +915,15 @@
   const __m128i ABCD0 = _mm_srli_si128(XABCD, 1);
   const __m128i abcd = _mm_avg_epu8(XABCD, ABCD0);
   const __m128i _XABCD = _mm_slli_si128(XABCD, 1);
-  const __m128i IXABCD = _mm_insert_epi16(_XABCD, I | (X << 8), 0);
+  const __m128i IXABCD = _mm_insert_epi16(_XABCD, (short)(I | (X << 8)), 0);
   const __m128i avg1 = _mm_avg_epu8(IXABCD, ABCD0);
   const __m128i lsb = _mm_and_si128(_mm_xor_si128(IXABCD, ABCD0), one);
   const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
   const __m128i efgh = _mm_avg_epu8(avg2, XABCD);
-  WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(               abcd    ));
-  WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(               efgh    ));
-  WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1)));
-  WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1)));
+  WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(               abcd    ));
+  WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(               efgh    ));
+  WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1)));
+  WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1)));
 
   // these two are hard to implement in SSE2, so we keep the C-version:
   DST(0, 2) = AVG3(J, I, X);
@@ -813,11 +945,12 @@
   const __m128i abbc = _mm_or_si128(ab, bc);
   const __m128i lsb2 = _mm_and_si128(abbc, lsb1);
   const __m128i avg4 = _mm_subs_epu8(avg3, lsb2);
-  const uint32_t extra_out = _mm_cvtsi128_si32(_mm_srli_si128(avg4, 4));
-  WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(               avg1    ));
-  WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(               avg4    ));
-  WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1)));
-  WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1)));
+  const uint32_t extra_out =
+      (uint32_t)_mm_cvtsi128_si32(_mm_srli_si128(avg4, 4));
+  WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(               avg1    ));
+  WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(               avg4    ));
+  WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1)));
+  WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1)));
 
   // these two are hard to get and irregular
   DST(3, 2) = (extra_out >> 0) & 0xff;
@@ -835,10 +968,10 @@
   const __m128i lsb = _mm_and_si128(_mm_xor_si128(JIXABCD__, LKJIXABCD), one);
   const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
   const __m128i abcdefg = _mm_avg_epu8(avg2, KJIXABCD_);
-  WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(               abcdefg    ));
-  WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
-  WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
-  WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
+  WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(               abcdefg    ));
+  WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
+  WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
+  WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
 }
 
 static WEBP_INLINE void HU4_SSE2(uint8_t* dst, const uint8_t* top) {
@@ -881,14 +1014,14 @@
 
 static WEBP_INLINE void TM4_SSE2(uint8_t* dst, const uint8_t* top) {
   const __m128i zero = _mm_setzero_si128();
-  const __m128i top_values = _mm_cvtsi32_si128(WebPMemToUint32(top));
+  const __m128i top_values = _mm_cvtsi32_si128(WebPMemToInt32(top));
   const __m128i top_base = _mm_unpacklo_epi8(top_values, zero);
   int y;
   for (y = 0; y < 4; ++y, dst += BPS) {
     const int val = top[-2 - y] - top[-1];
     const __m128i base = _mm_set1_epi16(val);
     const __m128i out = _mm_packus_epi16(_mm_add_epi16(base, top_base), zero);
-    WebPUint32ToMem(dst, _mm_cvtsi128_si32(out));
+    WebPInt32ToMem(dst, _mm_cvtsi128_si32(out));
   }
 }
 
diff --git a/third_party/libwebp/src/dsp/filters.c b/third_party/libwebp/src/dsp/filters.c
index 069a22e..85eee50 100644
--- a/third_party/libwebp/src/dsp/filters.c
+++ b/third_party/libwebp/src/dsp/filters.c
@@ -33,9 +33,9 @@
                                       uint8_t* dst, int length, int inverse) {
   int i;
   if (inverse) {
-    for (i = 0; i < length; ++i) dst[i] = src[i] + pred[i];
+    for (i = 0; i < length; ++i) dst[i] = (uint8_t)(src[i] + pred[i]);
   } else {
-    for (i = 0; i < length; ++i) dst[i] = src[i] - pred[i];
+    for (i = 0; i < length; ++i) dst[i] = (uint8_t)(src[i] - pred[i]);
   }
 }
 
@@ -155,7 +155,7 @@
       const int pred = GradientPredictor_C(preds[w - 1],
                                            preds[w - stride],
                                            preds[w - stride - 1]);
-      out[w] = in[w] + (inverse ? pred : -pred);
+      out[w] = (uint8_t)(in[w] + (inverse ? pred : -pred));
     }
     ++row;
     preds += stride;
@@ -194,7 +194,7 @@
   uint8_t pred = (prev == NULL) ? 0 : prev[0];
   int i;
   for (i = 0; i < width; ++i) {
-    out[i] = pred + in[i];
+    out[i] = (uint8_t)(pred + in[i]);
     pred = out[i];
   }
 }
@@ -206,7 +206,7 @@
     HorizontalUnfilter_C(NULL, in, out, width);
   } else {
     int i;
-    for (i = 0; i < width; ++i) out[i] = prev[i] + in[i];
+    for (i = 0; i < width; ++i) out[i] = (uint8_t)(prev[i] + in[i]);
   }
 }
 #endif  // !WEBP_NEON_OMIT_C_CODE
@@ -220,7 +220,7 @@
     int i;
     for (i = 0; i < width; ++i) {
       top = prev[i];  // need to read this first, in case prev==out
-      left = in[i] + GradientPredictor_C(left, top, top_left);
+      left = (uint8_t)(in[i] + GradientPredictor_C(left, top, top_left));
       top_left = top;
       out[i] = left;
     }
@@ -233,6 +233,7 @@
 WebPFilterFunc WebPFilters[WEBP_FILTER_LAST];
 WebPUnfilterFunc WebPUnfilters[WEBP_FILTER_LAST];
 
+extern VP8CPUInfo VP8GetCPUInfo;
 extern void VP8FiltersInitMIPSdspR2(void);
 extern void VP8FiltersInitMSA(void);
 extern void VP8FiltersInitNEON(void);
@@ -254,7 +255,7 @@
 #endif
 
   if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       VP8FiltersInitSSE2();
     }
@@ -271,7 +272,7 @@
 #endif
   }
 
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
   if (WEBP_NEON_OMIT_C_CODE ||
       (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
     VP8FiltersInitNEON();
diff --git a/third_party/libwebp/src/dsp/filters_sse2.c b/third_party/libwebp/src/dsp/filters_sse2.c
index 5a18895..5c33ec1 100644
--- a/third_party/libwebp/src/dsp/filters_sse2.c
+++ b/third_party/libwebp/src/dsp/filters_sse2.c
@@ -163,7 +163,8 @@
     _mm_storel_epi64((__m128i*)(out + i), H);
   }
   for (; i < length; ++i) {
-    out[i] = row[i] - GradientPredictor_SSE2(row[i - 1], top[i], top[i - 1]);
+    const int delta = GradientPredictor_SSE2(row[i - 1], top[i], top[i - 1]);
+    out[i] = (uint8_t)(row[i] - delta);
   }
 }
 
@@ -188,7 +189,7 @@
 
   // Filter line-by-line.
   while (row < last_row) {
-    out[0] = in[0] - in[-stride];
+    out[0] = (uint8_t)(in[0] - in[-stride]);
     GradientPredictDirect_SSE2(in + 1, in + 1 - stride, out + 1, width - 1);
     ++row;
     in += stride;
@@ -223,7 +224,7 @@
                                     uint8_t* out, int width) {
   int i;
   __m128i last;
-  out[0] = in[0] + (prev == NULL ? 0 : prev[0]);
+  out[0] = (uint8_t)(in[0] + (prev == NULL ? 0 : prev[0]));
   if (width <= 1) return;
   last = _mm_set_epi32(0, 0, 0, out[0]);
   for (i = 1; i + 8 <= width; i += 8) {
@@ -238,7 +239,7 @@
     _mm_storel_epi64((__m128i*)(out + i), A7);
     last = _mm_srli_epi64(A7, 56);
   }
-  for (; i < width; ++i) out[i] = in[i] + out[i - 1];
+  for (; i < width; ++i) out[i] = (uint8_t)(in[i] + out[i - 1]);
 }
 
 static void VerticalUnfilter_SSE2(const uint8_t* prev, const uint8_t* in,
@@ -259,7 +260,7 @@
       _mm_storeu_si128((__m128i*)&out[i +  0], C0);
       _mm_storeu_si128((__m128i*)&out[i + 16], C1);
     }
-    for (; i < width; ++i) out[i] = in[i] + prev[i];
+    for (; i < width; ++i) out[i] = (uint8_t)(in[i] + prev[i]);
   }
 }
 
@@ -296,7 +297,8 @@
       _mm_storel_epi64((__m128i*)&row[i], out);
     }
     for (; i < length; ++i) {
-      row[i] = in[i] + GradientPredictor_SSE2(row[i - 1], top[i], top[i - 1]);
+      const int delta = GradientPredictor_SSE2(row[i - 1], top[i], top[i - 1]);
+      row[i] = (uint8_t)(in[i] + delta);
     }
   }
 }
@@ -306,7 +308,7 @@
   if (prev == NULL) {
     HorizontalUnfilter_SSE2(NULL, in, out, width);
   } else {
-    out[0] = in[0] + prev[0];  // predict from above
+    out[0] = (uint8_t)(in[0] + prev[0]);  // predict from above
     GradientPredictInverse_SSE2(in + 1, prev + 1, out + 1, width - 1);
   }
 }
@@ -318,7 +320,12 @@
 
 WEBP_TSAN_IGNORE_FUNCTION void VP8FiltersInitSSE2(void) {
   WebPUnfilters[WEBP_FILTER_HORIZONTAL] = HorizontalUnfilter_SSE2;
+#if defined(CHROMIUM)
+  // TODO(crbug.com/654974)
+  (void)VerticalUnfilter_SSE2;
+#else
   WebPUnfilters[WEBP_FILTER_VERTICAL] = VerticalUnfilter_SSE2;
+#endif
   WebPUnfilters[WEBP_FILTER_GRADIENT] = GradientUnfilter_SSE2;
 
   WebPFilters[WEBP_FILTER_HORIZONTAL] = HorizontalFilter_SSE2;
diff --git a/third_party/libwebp/src/dsp/lossless.c b/third_party/libwebp/src/dsp/lossless.c
index 2667935..7be697a 100644
--- a/third_party/libwebp/src/dsp/lossless.c
+++ b/third_party/libwebp/src/dsp/lossless.c
@@ -29,8 +29,6 @@
 #include "src/dsp/lossless.h"
 #include "src/dsp/lossless_common.h"
 
-#define MAX_DIFF_COST (1e30f)
-
 //------------------------------------------------------------------------------
 // Image transforms.
 
@@ -57,7 +55,7 @@
 }
 
 static WEBP_INLINE int AddSubtractComponentFull(int a, int b, int c) {
-  return Clip255(a + b - c);
+  return Clip255((uint32_t)(a + b - c));
 }
 
 static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1,
@@ -74,7 +72,7 @@
 }
 
 static WEBP_INLINE int AddSubtractComponentHalf(int a, int b) {
-  return Clip255(a + (a - b) / 2);
+  return Clip255((uint32_t)(a + (a - b) / 2));
 }
 
 static WEBP_INLINE uint32_t ClampedAddSubtractHalf(uint32_t c0, uint32_t c1,
@@ -89,7 +87,7 @@
 
 // gcc <= 4.9 on ARM generates incorrect code in Select() when Sub3() is
 // inlined.
-#if defined(__arm__) && LOCAL_GCC_VERSION <= 0x409
+#if defined(__arm__) && defined(__GNUC__) && LOCAL_GCC_VERSION <= 0x409
 # define LOCAL_INLINE __attribute__ ((noinline))
 #else
 # define LOCAL_INLINE WEBP_INLINE
@@ -115,88 +113,107 @@
 //------------------------------------------------------------------------------
 // Predictors
 
-static uint32_t Predictor0_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor0_C(const uint32_t* const left,
+                          const uint32_t* const top) {
   (void)top;
   (void)left;
   return ARGB_BLACK;
 }
-static uint32_t Predictor1_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor1_C(const uint32_t* const left,
+                          const uint32_t* const top) {
   (void)top;
-  return left;
+  return *left;
 }
-static uint32_t Predictor2_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor2_C(const uint32_t* const left,
+                          const uint32_t* const top) {
   (void)left;
   return top[0];
 }
-static uint32_t Predictor3_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor3_C(const uint32_t* const left,
+                          const uint32_t* const top) {
   (void)left;
   return top[1];
 }
-static uint32_t Predictor4_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor4_C(const uint32_t* const left,
+                          const uint32_t* const top) {
   (void)left;
   return top[-1];
 }
-static uint32_t Predictor5_C(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average3(left, top[0], top[1]);
+uint32_t VP8LPredictor5_C(const uint32_t* const left,
+                          const uint32_t* const top) {
+  const uint32_t pred = Average3(*left, top[0], top[1]);
   return pred;
 }
-static uint32_t Predictor6_C(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average2(left, top[-1]);
+uint32_t VP8LPredictor6_C(const uint32_t* const left,
+                          const uint32_t* const top) {
+  const uint32_t pred = Average2(*left, top[-1]);
   return pred;
 }
-static uint32_t Predictor7_C(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average2(left, top[0]);
+uint32_t VP8LPredictor7_C(const uint32_t* const left,
+                          const uint32_t* const top) {
+  const uint32_t pred = Average2(*left, top[0]);
   return pred;
 }
-static uint32_t Predictor8_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor8_C(const uint32_t* const left,
+                          const uint32_t* const top) {
   const uint32_t pred = Average2(top[-1], top[0]);
   (void)left;
   return pred;
 }
-static uint32_t Predictor9_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor9_C(const uint32_t* const left,
+                          const uint32_t* const top) {
   const uint32_t pred = Average2(top[0], top[1]);
   (void)left;
   return pred;
 }
-static uint32_t Predictor10_C(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average4(left, top[-1], top[0], top[1]);
+uint32_t VP8LPredictor10_C(const uint32_t* const left,
+                           const uint32_t* const top) {
+  const uint32_t pred = Average4(*left, top[-1], top[0], top[1]);
   return pred;
 }
-static uint32_t Predictor11_C(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Select(top[0], left, top[-1]);
+uint32_t VP8LPredictor11_C(const uint32_t* const left,
+                           const uint32_t* const top) {
+  const uint32_t pred = Select(top[0], *left, top[-1]);
   return pred;
 }
-static uint32_t Predictor12_C(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = ClampedAddSubtractFull(left, top[0], top[-1]);
+uint32_t VP8LPredictor12_C(const uint32_t* const left,
+                           const uint32_t* const top) {
+  const uint32_t pred = ClampedAddSubtractFull(*left, top[0], top[-1]);
   return pred;
 }
-static uint32_t Predictor13_C(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = ClampedAddSubtractHalf(left, top[0], top[-1]);
+uint32_t VP8LPredictor13_C(const uint32_t* const left,
+                           const uint32_t* const top) {
+  const uint32_t pred = ClampedAddSubtractHalf(*left, top[0], top[-1]);
   return pred;
 }
 
-GENERATE_PREDICTOR_ADD(Predictor0_C, PredictorAdd0_C)
+static void PredictorAdd0_C(const uint32_t* in, const uint32_t* upper,
+                            int num_pixels, uint32_t* out) {
+  int x;
+  (void)upper;
+  for (x = 0; x < num_pixels; ++x) out[x] = VP8LAddPixels(in[x], ARGB_BLACK);
+}
 static void PredictorAdd1_C(const uint32_t* in, const uint32_t* upper,
                             int num_pixels, uint32_t* out) {
   int i;
   uint32_t left = out[-1];
+  (void)upper;
   for (i = 0; i < num_pixels; ++i) {
     out[i] = left = VP8LAddPixels(in[i], left);
   }
-  (void)upper;
 }
-GENERATE_PREDICTOR_ADD(Predictor2_C, PredictorAdd2_C)
-GENERATE_PREDICTOR_ADD(Predictor3_C, PredictorAdd3_C)
-GENERATE_PREDICTOR_ADD(Predictor4_C, PredictorAdd4_C)
-GENERATE_PREDICTOR_ADD(Predictor5_C, PredictorAdd5_C)
-GENERATE_PREDICTOR_ADD(Predictor6_C, PredictorAdd6_C)
-GENERATE_PREDICTOR_ADD(Predictor7_C, PredictorAdd7_C)
-GENERATE_PREDICTOR_ADD(Predictor8_C, PredictorAdd8_C)
-GENERATE_PREDICTOR_ADD(Predictor9_C, PredictorAdd9_C)
-GENERATE_PREDICTOR_ADD(Predictor10_C, PredictorAdd10_C)
-GENERATE_PREDICTOR_ADD(Predictor11_C, PredictorAdd11_C)
-GENERATE_PREDICTOR_ADD(Predictor12_C, PredictorAdd12_C)
-GENERATE_PREDICTOR_ADD(Predictor13_C, PredictorAdd13_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor2_C, PredictorAdd2_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor3_C, PredictorAdd3_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor4_C, PredictorAdd4_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor5_C, PredictorAdd5_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor6_C, PredictorAdd6_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor7_C, PredictorAdd7_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor8_C, PredictorAdd8_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor9_C, PredictorAdd9_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor10_C, PredictorAdd10_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor11_C, PredictorAdd11_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor12_C, PredictorAdd12_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor13_C, PredictorAdd13_C)
 
 //------------------------------------------------------------------------------
 
@@ -278,14 +295,14 @@
   int i;
   for (i = 0; i < num_pixels; ++i) {
     const uint32_t argb = src[i];
-    const uint32_t green = argb >> 8;
+    const int8_t green = (int8_t)(argb >> 8);
     const uint32_t red = argb >> 16;
     int new_red = red & 0xff;
     int new_blue = argb & 0xff;
-    new_red += ColorTransformDelta(m->green_to_red_, green);
+    new_red += ColorTransformDelta((int8_t)m->green_to_red_, green);
     new_red &= 0xff;
-    new_blue += ColorTransformDelta(m->green_to_blue_, green);
-    new_blue += ColorTransformDelta(m->red_to_blue_, new_red);
+    new_blue += ColorTransformDelta((int8_t)m->green_to_blue_, green);
+    new_blue += ColorTransformDelta((int8_t)m->red_to_blue_, (int8_t)new_red);
     new_blue &= 0xff;
     dst[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue);
   }
@@ -384,7 +401,7 @@
   assert(row_start < row_end);
   assert(row_end <= transform->ysize_);
   switch (transform->type_) {
-    case SUBTRACT_GREEN:
+    case SUBTRACT_GREEN_TRANSFORM:
       VP8LAddGreenToBlueAndRed(in, (row_end - row_start) * width, out);
       break;
     case PREDICTOR_TRANSFORM:
@@ -565,7 +582,6 @@
 
 // exposed plain-C implementations
 VP8LPredictorAddSubFunc VP8LPredictorsAdd_C[16];
-VP8LPredictorFunc VP8LPredictors_C[16];
 
 VP8LTransformColorInverseFunc VP8LTransformColorInverse;
 
@@ -578,7 +594,9 @@
 VP8LMapARGBFunc VP8LMapColor32b;
 VP8LMapAlphaFunc VP8LMapColor8b;
 
+extern VP8CPUInfo VP8GetCPUInfo;
 extern void VP8LDspInitSSE2(void);
+extern void VP8LDspInitSSE41(void);
 extern void VP8LDspInitNEON(void);
 extern void VP8LDspInitMIPSdspR2(void);
 extern void VP8LDspInitMSA(void);
@@ -603,8 +621,7 @@
 } while (0);
 
 WEBP_DSP_INIT_FUNC(VP8LDspInit) {
-  COPY_PREDICTOR_ARRAY(Predictor, VP8LPredictors)
-  COPY_PREDICTOR_ARRAY(Predictor, VP8LPredictors_C)
+  COPY_PREDICTOR_ARRAY(VP8LPredictor, VP8LPredictors)
   COPY_PREDICTOR_ARRAY(PredictorAdd, VP8LPredictorsAdd)
   COPY_PREDICTOR_ARRAY(PredictorAdd, VP8LPredictorsAdd_C)
 
@@ -626,9 +643,14 @@
 
   // If defined, use CPUInfo() to overwrite some pointers with faster versions.
   if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       VP8LDspInitSSE2();
+#if defined(WEBP_HAVE_SSE41)
+      if (VP8GetCPUInfo(kSSE4_1)) {
+        VP8LDspInitSSE41();
+      }
+#endif
     }
 #endif
 #if defined(WEBP_USE_MIPS_DSP_R2)
@@ -643,7 +665,7 @@
 #endif
   }
 
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
   if (WEBP_NEON_OMIT_C_CODE ||
       (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
     VP8LDspInitNEON();
diff --git a/third_party/libwebp/src/dsp/lossless.h b/third_party/libwebp/src/dsp/lossless.h
index b2bbdfc..de60d95 100644
--- a/third_party/libwebp/src/dsp/lossless.h
+++ b/third_party/libwebp/src/dsp/lossless.h
@@ -28,9 +28,39 @@
 //------------------------------------------------------------------------------
 // Decoding
 
-typedef uint32_t (*VP8LPredictorFunc)(uint32_t left, const uint32_t* const top);
+typedef uint32_t (*VP8LPredictorFunc)(const uint32_t* const left,
+                                      const uint32_t* const top);
 extern VP8LPredictorFunc VP8LPredictors[16];
-extern VP8LPredictorFunc VP8LPredictors_C[16];
+
+uint32_t VP8LPredictor0_C(const uint32_t* const left,
+                          const uint32_t* const top);
+uint32_t VP8LPredictor1_C(const uint32_t* const left,
+                          const uint32_t* const top);
+uint32_t VP8LPredictor2_C(const uint32_t* const left,
+                          const uint32_t* const top);
+uint32_t VP8LPredictor3_C(const uint32_t* const left,
+                          const uint32_t* const top);
+uint32_t VP8LPredictor4_C(const uint32_t* const left,
+                          const uint32_t* const top);
+uint32_t VP8LPredictor5_C(const uint32_t* const left,
+                          const uint32_t* const top);
+uint32_t VP8LPredictor6_C(const uint32_t* const left,
+                          const uint32_t* const top);
+uint32_t VP8LPredictor7_C(const uint32_t* const left,
+                          const uint32_t* const top);
+uint32_t VP8LPredictor8_C(const uint32_t* const left,
+                          const uint32_t* const top);
+uint32_t VP8LPredictor9_C(const uint32_t* const left,
+                          const uint32_t* const top);
+uint32_t VP8LPredictor10_C(const uint32_t* const left,
+                           const uint32_t* const top);
+uint32_t VP8LPredictor11_C(const uint32_t* const left,
+                           const uint32_t* const top);
+uint32_t VP8LPredictor12_C(const uint32_t* const left,
+                           const uint32_t* const top);
+uint32_t VP8LPredictor13_C(const uint32_t* const left,
+                           const uint32_t* const top);
+
 // These Add/Sub function expects upper[-1] and out[-1] to be readable.
 typedef void (*VP8LPredictorAddSubFunc)(const uint32_t* in,
                                         const uint32_t* upper, int num_pixels,
@@ -152,9 +182,9 @@
 // -----------------------------------------------------------------------------
 // Huffman-cost related functions.
 
-typedef double (*VP8LCostFunc)(const uint32_t* population, int length);
-typedef double (*VP8LCostCombinedFunc)(const uint32_t* X, const uint32_t* Y,
-                                       int length);
+typedef float (*VP8LCostFunc)(const uint32_t* population, int length);
+typedef float (*VP8LCostCombinedFunc)(const uint32_t* X, const uint32_t* Y,
+                                      int length);
 typedef float (*VP8LCombinedShannonEntropyFunc)(const int X[256],
                                                 const int Y[256]);
 
@@ -163,12 +193,12 @@
 extern VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy;
 
 typedef struct {        // small struct to hold counters
-  int counts[2];        // index: 0=zero steak, 1=non-zero streak
+  int counts[2];        // index: 0=zero streak, 1=non-zero streak
   int streaks[2][2];    // [zero/non-zero][streak<3 / streak>=3]
 } VP8LStreaks;
 
 typedef struct {            // small struct to hold bit entropy results
-  double entropy;           // entropy
+  float entropy;            // entropy
   uint32_t sum;             // sum of the population
   int nonzeros;             // number of non-zero elements in the population
   uint32_t max_val;         // maximum value in the population
@@ -194,10 +224,14 @@
 void VP8LBitsEntropyUnrefined(const uint32_t* const array, int n,
                               VP8LBitEntropy* const entropy);
 
-typedef void (*VP8LHistogramAddFunc)(const VP8LHistogram* const a,
-                                     const VP8LHistogram* const b,
-                                     VP8LHistogram* const out);
-extern VP8LHistogramAddFunc VP8LHistogramAdd;
+typedef void (*VP8LAddVectorFunc)(const uint32_t* a, const uint32_t* b,
+                                  uint32_t* out, int size);
+extern VP8LAddVectorFunc VP8LAddVector;
+typedef void (*VP8LAddVectorEqFunc)(const uint32_t* a, uint32_t* out, int size);
+extern VP8LAddVectorEqFunc VP8LAddVectorEq;
+void VP8LHistogramAdd(const VP8LHistogram* const a,
+                      const VP8LHistogram* const b,
+                      VP8LHistogram* const out);
 
 // -----------------------------------------------------------------------------
 // PrefixEncode()
diff --git a/third_party/libwebp/src/dsp/lossless_common.h b/third_party/libwebp/src/dsp/lossless_common.h
index a2648d1..616b40e 100644
--- a/third_party/libwebp/src/dsp/lossless_common.h
+++ b/third_party/libwebp/src/dsp/lossless_common.h
@@ -16,6 +16,10 @@
 #ifndef WEBP_DSP_LOSSLESS_COMMON_H_
 #define WEBP_DSP_LOSSLESS_COMMON_H_
 
+#if defined(STARBOARD)
+#include "starboard/client_porting/poem/assert_poem.h"
+#endif
+
 #include "src/webp/types.h"
 
 #include "src/utils/utils.h"
@@ -177,24 +181,13 @@
 static void PREDICTOR_ADD(const uint32_t* in, const uint32_t* upper, \
                           int num_pixels, uint32_t* out) {           \
   int x;                                                             \
+  assert(upper != NULL);                                             \
   for (x = 0; x < num_pixels; ++x) {                                 \
-    const uint32_t pred = (PREDICTOR)(out[x - 1], upper + x);        \
+    const uint32_t pred = (PREDICTOR)(&out[x - 1], upper + x);       \
     out[x] = VP8LAddPixels(in[x], pred);                             \
   }                                                                  \
 }
 
-// It subtracts the prediction from the input pixel and stores the residual
-// in the output pixel.
-#define GENERATE_PREDICTOR_SUB(PREDICTOR, PREDICTOR_SUB)             \
-static void PREDICTOR_SUB(const uint32_t* in, const uint32_t* upper, \
-                          int num_pixels, uint32_t* out) {           \
-  int x;                                                             \
-  for (x = 0; x < num_pixels; ++x) {                                 \
-    const uint32_t pred = (PREDICTOR)(in[x - 1], upper + x);         \
-    out[x] = VP8LSubPixels(in[x], pred);                             \
-  }                                                                  \
-}
-
 #ifdef __cplusplus
 }    // extern "C"
 #endif
diff --git a/third_party/libwebp/src/dsp/lossless_enc.c b/third_party/libwebp/src/dsp/lossless_enc.c
index d608326..cde1280 100644
--- a/third_party/libwebp/src/dsp/lossless_enc.c
+++ b/third_party/libwebp/src/dsp/lossless_enc.c
@@ -329,6 +329,15 @@
 static float FastSLog2Slow_C(uint32_t v) {
   assert(v >= LOG_LOOKUP_IDX_MAX);
   if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
+#if !defined(WEBP_HAVE_SLOW_CLZ_CTZ)
+    // use clz if available
+    const int log_cnt = BitsLog2Floor(v) - 7;
+    const uint32_t y = 1 << log_cnt;
+    int correction = 0;
+    const float v_f = (float)v;
+    const uint32_t orig_v = v;
+    v >>= log_cnt;
+#else
     int log_cnt = 0;
     uint32_t y = 1;
     int correction = 0;
@@ -339,6 +348,7 @@
       v = v >> 1;
       y = y << 1;
     } while (v >= LOG_LOOKUP_IDX_MAX);
+#endif
     // vf = (2^log_cnt) * Xf; where y = 2^log_cnt and Xf < 256
     // Xf = floor(Xf) * (1 + (v % y) / v)
     // log2(Xf) = log2(floor(Xf)) + log2(1 + (v % y) / v)
@@ -355,6 +365,14 @@
 static float FastLog2Slow_C(uint32_t v) {
   assert(v >= LOG_LOOKUP_IDX_MAX);
   if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
+#if !defined(WEBP_HAVE_SLOW_CLZ_CTZ)
+    // use clz if available
+    const int log_cnt = BitsLog2Floor(v) - 7;
+    const uint32_t y = 1 << log_cnt;
+    const uint32_t orig_v = v;
+    double log_2;
+    v >>= log_cnt;
+#else
     int log_cnt = 0;
     uint32_t y = 1;
     const uint32_t orig_v = v;
@@ -364,6 +382,7 @@
       v = v >> 1;
       y = y << 1;
     } while (v >= LOG_LOOKUP_IDX_MAX);
+#endif
     log_2 = kLog2Table[v] + log_cnt;
     if (orig_v >= APPROX_LOG_MAX) {
       // Since the division is still expensive, add this correction factor only
@@ -383,7 +402,7 @@
 // Compute the combined Shanon's entropy for distribution {X} and {X+Y}
 static float CombinedShannonEntropy_C(const int X[256], const int Y[256]) {
   int i;
-  double retval = 0.;
+  float retval = 0.f;
   int sumX = 0, sumXY = 0;
   for (i = 0; i < 256; ++i) {
     const int x = X[i];
@@ -399,7 +418,7 @@
     }
   }
   retval += VP8LFastSLog2(sumX) + VP8LFastSLog2(sumXY);
-  return (float)retval;
+  return retval;
 }
 
 void VP8LBitEntropyInit(VP8LBitEntropy* const entropy) {
@@ -503,11 +522,11 @@
 void VP8LSubtractGreenFromBlueAndRed_C(uint32_t* argb_data, int num_pixels) {
   int i;
   for (i = 0; i < num_pixels; ++i) {
-    const int argb = argb_data[i];
+    const int argb = (int)argb_data[i];
     const int green = (argb >> 8) & 0xff;
     const uint32_t new_r = (((argb >> 16) & 0xff) - green) & 0xff;
     const uint32_t new_b = (((argb >>  0) & 0xff) - green) & 0xff;
-    argb_data[i] = (argb & 0xff00ff00u) | (new_r << 16) | new_b;
+    argb_data[i] = ((uint32_t)argb & 0xff00ff00u) | (new_r << 16) | new_b;
   }
 }
 
@@ -515,19 +534,23 @@
   return ((int)color_pred * color) >> 5;
 }
 
+static WEBP_INLINE int8_t U32ToS8(uint32_t v) {
+  return (int8_t)(v & 0xff);
+}
+
 void VP8LTransformColor_C(const VP8LMultipliers* const m, uint32_t* data,
                           int num_pixels) {
   int i;
   for (i = 0; i < num_pixels; ++i) {
     const uint32_t argb = data[i];
-    const uint32_t green = argb >> 8;
-    const uint32_t red = argb >> 16;
+    const int8_t green = U32ToS8(argb >>  8);
+    const int8_t red   = U32ToS8(argb >> 16);
     int new_red = red & 0xff;
     int new_blue = argb & 0xff;
-    new_red -= ColorTransformDelta(m->green_to_red_, green);
+    new_red -= ColorTransformDelta((int8_t)m->green_to_red_, green);
     new_red &= 0xff;
-    new_blue -= ColorTransformDelta(m->green_to_blue_, green);
-    new_blue -= ColorTransformDelta(m->red_to_blue_, red);
+    new_blue -= ColorTransformDelta((int8_t)m->green_to_blue_, green);
+    new_blue -= ColorTransformDelta((int8_t)m->red_to_blue_, red);
     new_blue &= 0xff;
     data[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue);
   }
@@ -535,20 +558,20 @@
 
 static WEBP_INLINE uint8_t TransformColorRed(uint8_t green_to_red,
                                              uint32_t argb) {
-  const uint32_t green = argb >> 8;
+  const int8_t green = U32ToS8(argb >> 8);
   int new_red = argb >> 16;
-  new_red -= ColorTransformDelta(green_to_red, green);
+  new_red -= ColorTransformDelta((int8_t)green_to_red, green);
   return (new_red & 0xff);
 }
 
 static WEBP_INLINE uint8_t TransformColorBlue(uint8_t green_to_blue,
                                               uint8_t red_to_blue,
                                               uint32_t argb) {
-  const uint32_t green = argb >> 8;
-  const uint32_t red = argb >> 16;
-  uint8_t new_blue = argb;
-  new_blue -= ColorTransformDelta(green_to_blue, green);
-  new_blue -= ColorTransformDelta(red_to_blue, red);
+  const int8_t green = U32ToS8(argb >>  8);
+  const int8_t red   = U32ToS8(argb >> 16);
+  int new_blue = argb & 0xff;
+  new_blue -= ColorTransformDelta((int8_t)green_to_blue, green);
+  new_blue -= ColorTransformDelta((int8_t)red_to_blue, red);
   return (new_blue & 0xff);
 }
 
@@ -558,7 +581,7 @@
   while (tile_height-- > 0) {
     int x;
     for (x = 0; x < tile_width; ++x) {
-      ++histo[TransformColorRed(green_to_red, argb[x])];
+      ++histo[TransformColorRed((uint8_t)green_to_red, argb[x])];
     }
     argb += stride;
   }
@@ -571,7 +594,8 @@
   while (tile_height-- > 0) {
     int x;
     for (x = 0; x < tile_width; ++x) {
-      ++histo[TransformColorBlue(green_to_blue, red_to_blue, argb[x])];
+      ++histo[TransformColorBlue((uint8_t)green_to_blue, (uint8_t)red_to_blue,
+                                 argb[x])];
     }
     argb += stride;
   }
@@ -612,17 +636,17 @@
 
 //------------------------------------------------------------------------------
 
-static double ExtraCost_C(const uint32_t* population, int length) {
+static float ExtraCost_C(const uint32_t* population, int length) {
   int i;
-  double cost = 0.;
+  float cost = 0.f;
   for (i = 2; i < length - 2; ++i) cost += (i >> 1) * population[i + 2];
   return cost;
 }
 
-static double ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
+static float ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
                                   int length) {
   int i;
-  double cost = 0.;
+  float cost = 0.f;
   for (i = 2; i < length - 2; ++i) {
     const int xy = X[i + 2] + Y[i + 2];
     cost += (i >> 1) * xy;
@@ -632,176 +656,71 @@
 
 //------------------------------------------------------------------------------
 
-static void HistogramAdd_C(const VP8LHistogram* const a,
-                           const VP8LHistogram* const b,
-                           VP8LHistogram* const out) {
+static void AddVector_C(const uint32_t* a, const uint32_t* b, uint32_t* out,
+                        int size) {
+  int i;
+  for (i = 0; i < size; ++i) out[i] = a[i] + b[i];
+}
+
+static void AddVectorEq_C(const uint32_t* a, uint32_t* out, int size) {
+  int i;
+  for (i = 0; i < size; ++i) out[i] += a[i];
+}
+
+#define ADD(X, ARG, LEN) do {                                                  \
+  if (a->is_used_[X]) {                                                        \
+    if (b->is_used_[X]) {                                                      \
+      VP8LAddVector(a->ARG, b->ARG, out->ARG, (LEN));                          \
+    } else {                                                                   \
+      memcpy(&out->ARG[0], &a->ARG[0], (LEN) * sizeof(out->ARG[0]));           \
+    }                                                                          \
+  } else if (b->is_used_[X]) {                                                 \
+    memcpy(&out->ARG[0], &b->ARG[0], (LEN) * sizeof(out->ARG[0]));             \
+  } else {                                                                     \
+    memset(&out->ARG[0], 0, (LEN) * sizeof(out->ARG[0]));                      \
+  }                                                                            \
+} while (0)
+
+#define ADD_EQ(X, ARG, LEN) do {                                               \
+  if (a->is_used_[X]) {                                                        \
+    if (out->is_used_[X]) {                                                    \
+      VP8LAddVectorEq(a->ARG, out->ARG, (LEN));                                \
+    } else {                                                                   \
+      memcpy(&out->ARG[0], &a->ARG[0], (LEN) * sizeof(out->ARG[0]));           \
+    }                                                                          \
+  }                                                                            \
+} while (0)
+
+void VP8LHistogramAdd(const VP8LHistogram* const a,
+                      const VP8LHistogram* const b, VP8LHistogram* const out) {
   int i;
   const int literal_size = VP8LHistogramNumCodes(a->palette_code_bits_);
   assert(a->palette_code_bits_ == b->palette_code_bits_);
+
   if (b != out) {
-    for (i = 0; i < literal_size; ++i) {
-      out->literal_[i] = a->literal_[i] + b->literal_[i];
-    }
-    for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
-      out->distance_[i] = a->distance_[i] + b->distance_[i];
-    }
-    for (i = 0; i < NUM_LITERAL_CODES; ++i) {
-      out->red_[i] = a->red_[i] + b->red_[i];
-      out->blue_[i] = a->blue_[i] + b->blue_[i];
-      out->alpha_[i] = a->alpha_[i] + b->alpha_[i];
+    ADD(0, literal_, literal_size);
+    ADD(1, red_, NUM_LITERAL_CODES);
+    ADD(2, blue_, NUM_LITERAL_CODES);
+    ADD(3, alpha_, NUM_LITERAL_CODES);
+    ADD(4, distance_, NUM_DISTANCE_CODES);
+    for (i = 0; i < 5; ++i) {
+      out->is_used_[i] = (a->is_used_[i] | b->is_used_[i]);
     }
   } else {
-    for (i = 0; i < literal_size; ++i) {
-      out->literal_[i] += a->literal_[i];
-    }
-    for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
-      out->distance_[i] += a->distance_[i];
-    }
-    for (i = 0; i < NUM_LITERAL_CODES; ++i) {
-      out->red_[i] += a->red_[i];
-      out->blue_[i] += a->blue_[i];
-      out->alpha_[i] += a->alpha_[i];
-    }
+    ADD_EQ(0, literal_, literal_size);
+    ADD_EQ(1, red_, NUM_LITERAL_CODES);
+    ADD_EQ(2, blue_, NUM_LITERAL_CODES);
+    ADD_EQ(3, alpha_, NUM_LITERAL_CODES);
+    ADD_EQ(4, distance_, NUM_DISTANCE_CODES);
+    for (i = 0; i < 5; ++i) out->is_used_[i] |= a->is_used_[i];
   }
 }
+#undef ADD
+#undef ADD_EQ
 
 //------------------------------------------------------------------------------
 // Image transforms.
 
-static WEBP_INLINE uint32_t Average2(uint32_t a0, uint32_t a1) {
-  return (((a0 ^ a1) & 0xfefefefeu) >> 1) + (a0 & a1);
-}
-
-static WEBP_INLINE uint32_t Average3(uint32_t a0, uint32_t a1, uint32_t a2) {
-  return Average2(Average2(a0, a2), a1);
-}
-
-static WEBP_INLINE uint32_t Average4(uint32_t a0, uint32_t a1,
-                                     uint32_t a2, uint32_t a3) {
-  return Average2(Average2(a0, a1), Average2(a2, a3));
-}
-
-static WEBP_INLINE uint32_t Clip255(uint32_t a) {
-  if (a < 256) {
-    return a;
-  }
-  // return 0, when a is a negative integer.
-  // return 255, when a is positive.
-  return ~a >> 24;
-}
-
-static WEBP_INLINE int AddSubtractComponentFull(int a, int b, int c) {
-  return Clip255(a + b - c);
-}
-
-static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1,
-                                                   uint32_t c2) {
-  const int a = AddSubtractComponentFull(c0 >> 24, c1 >> 24, c2 >> 24);
-  const int r = AddSubtractComponentFull((c0 >> 16) & 0xff,
-                                         (c1 >> 16) & 0xff,
-                                         (c2 >> 16) & 0xff);
-  const int g = AddSubtractComponentFull((c0 >> 8) & 0xff,
-                                         (c1 >> 8) & 0xff,
-                                         (c2 >> 8) & 0xff);
-  const int b = AddSubtractComponentFull(c0 & 0xff, c1 & 0xff, c2 & 0xff);
-  return ((uint32_t)a << 24) | (r << 16) | (g << 8) | b;
-}
-
-static WEBP_INLINE int AddSubtractComponentHalf(int a, int b) {
-  return Clip255(a + (a - b) / 2);
-}
-
-static WEBP_INLINE uint32_t ClampedAddSubtractHalf(uint32_t c0, uint32_t c1,
-                                                   uint32_t c2) {
-  const uint32_t ave = Average2(c0, c1);
-  const int a = AddSubtractComponentHalf(ave >> 24, c2 >> 24);
-  const int r = AddSubtractComponentHalf((ave >> 16) & 0xff, (c2 >> 16) & 0xff);
-  const int g = AddSubtractComponentHalf((ave >> 8) & 0xff, (c2 >> 8) & 0xff);
-  const int b = AddSubtractComponentHalf((ave >> 0) & 0xff, (c2 >> 0) & 0xff);
-  return ((uint32_t)a << 24) | (r << 16) | (g << 8) | b;
-}
-
-// gcc-4.9 on ARM generates incorrect code in Select() when Sub3() is inlined.
-#if defined(__arm__) && \
-    (LOCAL_GCC_VERSION == 0x409 || LOCAL_GCC_VERSION == 0x408)
-# define LOCAL_INLINE __attribute__ ((noinline))
-#else
-# define LOCAL_INLINE WEBP_INLINE
-#endif
-
-static LOCAL_INLINE int Sub3(int a, int b, int c) {
-  const int pb = b - c;
-  const int pa = a - c;
-  return abs(pb) - abs(pa);
-}
-
-#undef LOCAL_INLINE
-
-static WEBP_INLINE uint32_t Select(uint32_t a, uint32_t b, uint32_t c) {
-  const int pa_minus_pb =
-      Sub3((a >> 24)       , (b >> 24)       , (c >> 24)       ) +
-      Sub3((a >> 16) & 0xff, (b >> 16) & 0xff, (c >> 16) & 0xff) +
-      Sub3((a >>  8) & 0xff, (b >>  8) & 0xff, (c >>  8) & 0xff) +
-      Sub3((a      ) & 0xff, (b      ) & 0xff, (c      ) & 0xff);
-  return (pa_minus_pb <= 0) ? a : b;
-}
-
-//------------------------------------------------------------------------------
-// Predictors
-
-static uint32_t Predictor2(uint32_t left, const uint32_t* const top) {
-  (void)left;
-  return top[0];
-}
-static uint32_t Predictor3(uint32_t left, const uint32_t* const top) {
-  (void)left;
-  return top[1];
-}
-static uint32_t Predictor4(uint32_t left, const uint32_t* const top) {
-  (void)left;
-  return top[-1];
-}
-static uint32_t Predictor5(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average3(left, top[0], top[1]);
-  return pred;
-}
-static uint32_t Predictor6(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average2(left, top[-1]);
-  return pred;
-}
-static uint32_t Predictor7(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average2(left, top[0]);
-  return pred;
-}
-static uint32_t Predictor8(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average2(top[-1], top[0]);
-  (void)left;
-  return pred;
-}
-static uint32_t Predictor9(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average2(top[0], top[1]);
-  (void)left;
-  return pred;
-}
-static uint32_t Predictor10(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average4(left, top[-1], top[0], top[1]);
-  return pred;
-}
-static uint32_t Predictor11(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Select(top[0], left, top[-1]);
-  return pred;
-}
-static uint32_t Predictor12(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = ClampedAddSubtractFull(left, top[0], top[-1]);
-  return pred;
-}
-static uint32_t Predictor13(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = ClampedAddSubtractHalf(left, top[0], top[-1]);
-  return pred;
-}
-
-//------------------------------------------------------------------------------
-
 static void PredictorSub0_C(const uint32_t* in, const uint32_t* upper,
                             int num_pixels, uint32_t* out) {
   int i;
@@ -816,18 +735,33 @@
   (void)upper;
 }
 
-GENERATE_PREDICTOR_SUB(Predictor2, PredictorSub2_C)
-GENERATE_PREDICTOR_SUB(Predictor3, PredictorSub3_C)
-GENERATE_PREDICTOR_SUB(Predictor4, PredictorSub4_C)
-GENERATE_PREDICTOR_SUB(Predictor5, PredictorSub5_C)
-GENERATE_PREDICTOR_SUB(Predictor6, PredictorSub6_C)
-GENERATE_PREDICTOR_SUB(Predictor7, PredictorSub7_C)
-GENERATE_PREDICTOR_SUB(Predictor8, PredictorSub8_C)
-GENERATE_PREDICTOR_SUB(Predictor9, PredictorSub9_C)
-GENERATE_PREDICTOR_SUB(Predictor10, PredictorSub10_C)
-GENERATE_PREDICTOR_SUB(Predictor11, PredictorSub11_C)
-GENERATE_PREDICTOR_SUB(Predictor12, PredictorSub12_C)
-GENERATE_PREDICTOR_SUB(Predictor13, PredictorSub13_C)
+// It subtracts the prediction from the input pixel and stores the residual
+// in the output pixel.
+#define GENERATE_PREDICTOR_SUB(PREDICTOR_I)                                \
+static void PredictorSub##PREDICTOR_I##_C(const uint32_t* in,              \
+                                          const uint32_t* upper,           \
+                                          int num_pixels, uint32_t* out) { \
+  int x;                                                                   \
+  assert(upper != NULL);                                                   \
+  for (x = 0; x < num_pixels; ++x) {                                       \
+    const uint32_t pred =                                                  \
+        VP8LPredictor##PREDICTOR_I##_C(&in[x - 1], upper + x);             \
+    out[x] = VP8LSubPixels(in[x], pred);                                   \
+  }                                                                        \
+}
+
+GENERATE_PREDICTOR_SUB(2)
+GENERATE_PREDICTOR_SUB(3)
+GENERATE_PREDICTOR_SUB(4)
+GENERATE_PREDICTOR_SUB(5)
+GENERATE_PREDICTOR_SUB(6)
+GENERATE_PREDICTOR_SUB(7)
+GENERATE_PREDICTOR_SUB(8)
+GENERATE_PREDICTOR_SUB(9)
+GENERATE_PREDICTOR_SUB(10)
+GENERATE_PREDICTOR_SUB(11)
+GENERATE_PREDICTOR_SUB(12)
+GENERATE_PREDICTOR_SUB(13)
 
 //------------------------------------------------------------------------------
 
@@ -848,7 +782,8 @@
 VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined;
 VP8LGetCombinedEntropyUnrefinedFunc VP8LGetCombinedEntropyUnrefined;
 
-VP8LHistogramAddFunc VP8LHistogramAdd;
+VP8LAddVectorFunc VP8LAddVector;
+VP8LAddVectorEqFunc VP8LAddVectorEq;
 
 VP8LVectorMismatchFunc VP8LVectorMismatch;
 VP8LBundleColorMapFunc VP8LBundleColorMap;
@@ -856,6 +791,7 @@
 VP8LPredictorAddSubFunc VP8LPredictorsSub[16];
 VP8LPredictorAddSubFunc VP8LPredictorsSub_C[16];
 
+extern VP8CPUInfo VP8GetCPUInfo;
 extern void VP8LEncDspInitSSE2(void);
 extern void VP8LEncDspInitSSE41(void);
 extern void VP8LEncDspInitNEON(void);
@@ -885,7 +821,8 @@
   VP8LGetEntropyUnrefined = GetEntropyUnrefined_C;
   VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_C;
 
-  VP8LHistogramAdd = HistogramAdd_C;
+  VP8LAddVector = AddVector_C;
+  VP8LAddVectorEq = AddVectorEq_C;
 
   VP8LVectorMismatch = VectorMismatch_C;
   VP8LBundleColorMap = VP8LBundleColorMap_C;
@@ -926,10 +863,10 @@
 
   // If defined, use CPUInfo() to overwrite some pointers with faster versions.
   if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       VP8LEncDspInitSSE2();
-#if defined(WEBP_USE_SSE41)
+#if defined(WEBP_HAVE_SSE41)
       if (VP8GetCPUInfo(kSSE4_1)) {
         VP8LEncDspInitSSE41();
       }
@@ -953,7 +890,7 @@
 #endif
   }
 
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
   if (WEBP_NEON_OMIT_C_CODE ||
       (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
     VP8LEncDspInitNEON();
@@ -971,7 +908,8 @@
   assert(VP8LCombinedShannonEntropy != NULL);
   assert(VP8LGetEntropyUnrefined != NULL);
   assert(VP8LGetCombinedEntropyUnrefined != NULL);
-  assert(VP8LHistogramAdd != NULL);
+  assert(VP8LAddVector != NULL);
+  assert(VP8LAddVectorEq != NULL);
   assert(VP8LVectorMismatch != NULL);
   assert(VP8LBundleColorMap != NULL);
   assert(VP8LPredictorsSub[0] != NULL);
diff --git a/third_party/libwebp/src/dsp/lossless_enc_mips32.c b/third_party/libwebp/src/dsp/lossless_enc_mips32.c
index 33e455c..53cd699 100644
--- a/third_party/libwebp/src/dsp/lossless_enc_mips32.c
+++ b/third_party/libwebp/src/dsp/lossless_enc_mips32.c
@@ -109,8 +109,8 @@
 //     cost += i * *(pop + 1);
 //     pop += 2;
 //   }
-//   return (double)cost;
-static double ExtraCost_MIPS32(const uint32_t* const population, int length) {
+//   return (float)cost;
+static float ExtraCost_MIPS32(const uint32_t* const population, int length) {
   int i, temp0, temp1;
   const uint32_t* pop = &population[4];
   const uint32_t* const LoopEnd = &population[length];
@@ -136,7 +136,7 @@
     : "memory", "hi", "lo"
   );
 
-  return (double)((int64_t)temp0 << 32 | temp1);
+  return (float)((int64_t)temp0 << 32 | temp1);
 }
 
 // C version of this function:
@@ -154,9 +154,9 @@
 //     pX += 2;
 //     pY += 2;
 //   }
-//   return (double)cost;
-static double ExtraCostCombined_MIPS32(const uint32_t* const X,
-                                       const uint32_t* const Y, int length) {
+//   return (float)cost;
+static float ExtraCostCombined_MIPS32(const uint32_t* const X,
+                                      const uint32_t* const Y, int length) {
   int i, temp0, temp1, temp2, temp3;
   const uint32_t* pX = &X[4];
   const uint32_t* pY = &Y[4];
@@ -189,7 +189,7 @@
     : "memory", "hi", "lo"
   );
 
-  return (double)((int64_t)temp0 << 32 | temp1);
+  return (float)((int64_t)temp0 << 32 | temp1);
 }
 
 #define HUFFMAN_COST_PASS                                 \
@@ -350,65 +350,29 @@
     ASM_END_COMMON_0                                    \
     ASM_END_COMMON_1
 
-#define ADD_VECTOR(A, B, OUT, SIZE, EXTRA_SIZE)  do {   \
-  const uint32_t* pa = (const uint32_t*)(A);            \
-  const uint32_t* pb = (const uint32_t*)(B);            \
-  uint32_t* pout = (uint32_t*)(OUT);                    \
-  const uint32_t* const LoopEnd = pa + (SIZE);          \
-  assert((SIZE) % 4 == 0);                              \
-  ASM_START                                             \
-  ADD_TO_OUT(0, 4, 8, 12, 1, pa, pb, pout)              \
-  ASM_END_0                                             \
-  if ((EXTRA_SIZE) > 0) {                               \
-    const int last = (EXTRA_SIZE);                      \
-    int i;                                              \
-    for (i = 0; i < last; ++i) pout[i] = pa[i] + pb[i]; \
-  }                                                     \
-} while (0)
-
-#define ADD_VECTOR_EQ(A, OUT, SIZE, EXTRA_SIZE)  do {   \
-  const uint32_t* pa = (const uint32_t*)(A);            \
-  uint32_t* pout = (uint32_t*)(OUT);                    \
-  const uint32_t* const LoopEnd = pa + (SIZE);          \
-  assert((SIZE) % 4 == 0);                              \
-  ASM_START                                             \
-  ADD_TO_OUT(0, 4, 8, 12, 0, pa, pout, pout)            \
-  ASM_END_1                                             \
-  if ((EXTRA_SIZE) > 0) {                               \
-    const int last = (EXTRA_SIZE);                      \
-    int i;                                              \
-    for (i = 0; i < last; ++i) pout[i] += pa[i];        \
-  }                                                     \
-} while (0)
-
-static void HistogramAdd_MIPS32(const VP8LHistogram* const a,
-                                const VP8LHistogram* const b,
-                                VP8LHistogram* const out) {
+static void AddVector_MIPS32(const uint32_t* pa, const uint32_t* pb,
+                             uint32_t* pout, int size) {
   uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
-  const int extra_cache_size = VP8LHistogramNumCodes(a->palette_code_bits_)
-                             - (NUM_LITERAL_CODES + NUM_LENGTH_CODES);
-  assert(a->palette_code_bits_ == b->palette_code_bits_);
-
-  if (b != out) {
-    ADD_VECTOR(a->literal_, b->literal_, out->literal_,
-               NUM_LITERAL_CODES + NUM_LENGTH_CODES, extra_cache_size);
-    ADD_VECTOR(a->distance_, b->distance_, out->distance_,
-               NUM_DISTANCE_CODES, 0);
-    ADD_VECTOR(a->red_, b->red_, out->red_, NUM_LITERAL_CODES, 0);
-    ADD_VECTOR(a->blue_, b->blue_, out->blue_, NUM_LITERAL_CODES, 0);
-    ADD_VECTOR(a->alpha_, b->alpha_, out->alpha_, NUM_LITERAL_CODES, 0);
-  } else {
-    ADD_VECTOR_EQ(a->literal_, out->literal_,
-                  NUM_LITERAL_CODES + NUM_LENGTH_CODES, extra_cache_size);
-    ADD_VECTOR_EQ(a->distance_, out->distance_, NUM_DISTANCE_CODES, 0);
-    ADD_VECTOR_EQ(a->red_, out->red_, NUM_LITERAL_CODES, 0);
-    ADD_VECTOR_EQ(a->blue_, out->blue_, NUM_LITERAL_CODES, 0);
-    ADD_VECTOR_EQ(a->alpha_, out->alpha_, NUM_LITERAL_CODES, 0);
-  }
+  const int end = ((size) / 4) * 4;
+  const uint32_t* const LoopEnd = pa + end;
+  int i;
+  ASM_START
+  ADD_TO_OUT(0, 4, 8, 12, 1, pa, pb, pout)
+  ASM_END_0
+  for (i = 0; i < size - end; ++i) pout[i] = pa[i] + pb[i];
 }
 
-#undef ADD_VECTOR_EQ
-#undef ADD_VECTOR
+static void AddVectorEq_MIPS32(const uint32_t* pa, uint32_t* pout, int size) {
+  uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
+  const int end = ((size) / 4) * 4;
+  const uint32_t* const LoopEnd = pa + end;
+  int i;
+  ASM_START
+  ADD_TO_OUT(0, 4, 8, 12, 0, pa, pout, pout)
+  ASM_END_1
+  for (i = 0; i < size - end; ++i) pout[i] += pa[i];
+}
+
 #undef ASM_END_1
 #undef ASM_END_0
 #undef ASM_END_COMMON_1
@@ -428,7 +392,8 @@
   VP8LExtraCostCombined = ExtraCostCombined_MIPS32;
   VP8LGetEntropyUnrefined = GetEntropyUnrefined_MIPS32;
   VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_MIPS32;
-  VP8LHistogramAdd = HistogramAdd_MIPS32;
+  VP8LAddVector = AddVector_MIPS32;
+  VP8LAddVectorEq = AddVectorEq_MIPS32;
 }
 
 #else  // !WEBP_USE_MIPS32
diff --git a/third_party/libwebp/src/dsp/lossless_enc_neon.c b/third_party/libwebp/src/dsp/lossless_enc_neon.c
index 7c7b73f..e32c796 100644
--- a/third_party/libwebp/src/dsp/lossless_enc_neon.c
+++ b/third_party/libwebp/src/dsp/lossless_enc_neon.c
@@ -25,7 +25,7 @@
 
 // vtbl?_u8 are marked unavailable for iOS arm64 with Xcode < 6.3, use
 // non-standard versions there.
-#if defined(__APPLE__) && defined(__aarch64__) && \
+#if defined(__APPLE__) && WEBP_AARCH64 && \
     defined(__apple_build_version__) && (__apple_build_version__< 6020037)
 #define USE_VTBLQ
 #endif
diff --git a/third_party/libwebp/src/dsp/lossless_enc_sse2.c b/third_party/libwebp/src/dsp/lossless_enc_sse2.c
index f84a990..66cbaab 100644
--- a/third_party/libwebp/src/dsp/lossless_enc_sse2.c
+++ b/third_party/libwebp/src/dsp/lossless_enc_sse2.c
@@ -54,8 +54,8 @@
   const __m128i mults_rb = MK_CST_16(CST_5b(m->green_to_red_),
                                      CST_5b(m->green_to_blue_));
   const __m128i mults_b2 = MK_CST_16(CST_5b(m->red_to_blue_), 0);
-  const __m128i mask_ag = _mm_set1_epi32(0xff00ff00);  // alpha-green masks
-  const __m128i mask_rb = _mm_set1_epi32(0x00ff00ff);  // red-blue masks
+  const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00);  // alpha-green masks
+  const __m128i mask_rb = _mm_set1_epi32(0x00ff00ff);       // red-blue masks
   int i;
   for (i = 0; i + 4 <= num_pixels; i += 4) {
     const __m128i in = _mm_loadu_si128((__m128i*)&argb_data[i]); // argb
@@ -170,12 +170,13 @@
 
 //------------------------------------------------------------------------------
 
+// Note we are adding uint32_t's as *signed* int32's (using _mm_add_epi32). But
+// that's ok since the histogram values are less than 1<<28 (max picture size).
 #define LINE_SIZE 16    // 8 or 16
 static void AddVector_SSE2(const uint32_t* a, const uint32_t* b, uint32_t* out,
                            int size) {
   int i;
-  assert(size % LINE_SIZE == 0);
-  for (i = 0; i < size; i += LINE_SIZE) {
+  for (i = 0; i + LINE_SIZE <= size; i += LINE_SIZE) {
     const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i +  0]);
     const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i +  4]);
 #if (LINE_SIZE == 16)
@@ -195,12 +196,14 @@
     _mm_storeu_si128((__m128i*)&out[i + 12], _mm_add_epi32(a3, b3));
 #endif
   }
+  for (; i < size; ++i) {
+    out[i] = a[i] + b[i];
+  }
 }
 
 static void AddVectorEq_SSE2(const uint32_t* a, uint32_t* out, int size) {
   int i;
-  assert(size % LINE_SIZE == 0);
-  for (i = 0; i < size; i += LINE_SIZE) {
+  for (i = 0; i + LINE_SIZE <= size; i += LINE_SIZE) {
     const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i +  0]);
     const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i +  4]);
 #if (LINE_SIZE == 16)
@@ -220,109 +223,64 @@
     _mm_storeu_si128((__m128i*)&out[i + 12], _mm_add_epi32(a3, b3));
 #endif
   }
+  for (; i < size; ++i) {
+    out[i] += a[i];
+  }
 }
 #undef LINE_SIZE
 
-// Note we are adding uint32_t's as *signed* int32's (using _mm_add_epi32). But
-// that's ok since the histogram values are less than 1<<28 (max picture size).
-static void HistogramAdd_SSE2(const VP8LHistogram* const a,
-                              const VP8LHistogram* const b,
-                              VP8LHistogram* const out) {
-  int i;
-  const int literal_size = VP8LHistogramNumCodes(a->palette_code_bits_);
-  assert(a->palette_code_bits_ == b->palette_code_bits_);
-  if (b != out) {
-    AddVector_SSE2(a->literal_, b->literal_, out->literal_, NUM_LITERAL_CODES);
-    AddVector_SSE2(a->red_, b->red_, out->red_, NUM_LITERAL_CODES);
-    AddVector_SSE2(a->blue_, b->blue_, out->blue_, NUM_LITERAL_CODES);
-    AddVector_SSE2(a->alpha_, b->alpha_, out->alpha_, NUM_LITERAL_CODES);
-  } else {
-    AddVectorEq_SSE2(a->literal_, out->literal_, NUM_LITERAL_CODES);
-    AddVectorEq_SSE2(a->red_, out->red_, NUM_LITERAL_CODES);
-    AddVectorEq_SSE2(a->blue_, out->blue_, NUM_LITERAL_CODES);
-    AddVectorEq_SSE2(a->alpha_, out->alpha_, NUM_LITERAL_CODES);
-  }
-  for (i = NUM_LITERAL_CODES; i < literal_size; ++i) {
-    out->literal_[i] = a->literal_[i] + b->literal_[i];
-  }
-  for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
-    out->distance_[i] = a->distance_[i] + b->distance_[i];
-  }
-}
-
 //------------------------------------------------------------------------------
 // Entropy
 
-// Checks whether the X or Y contribution is worth computing and adding.
-// Used in loop unrolling.
-#define ANALYZE_X_OR_Y(x_or_y, j)                                           \
-  do {                                                                      \
-    if ((x_or_y)[i + (j)] != 0) retval -= VP8LFastSLog2((x_or_y)[i + (j)]); \
-  } while (0)
-
-// Checks whether the X + Y contribution is worth computing and adding.
-// Used in loop unrolling.
-#define ANALYZE_XY(j)                  \
-  do {                                 \
-    if (tmp[j] != 0) {                 \
-      retval -= VP8LFastSLog2(tmp[j]); \
-      ANALYZE_X_OR_Y(X, j);            \
-    }                                  \
-  } while (0)
+// TODO(https://crbug.com/webp/499): this function produces different results
+// from the C code due to use of double/float resulting in output differences
+// when compared to -noasm.
+#if !(defined(WEBP_HAVE_SLOW_CLZ_CTZ) || defined(__i386__) || defined(_M_IX86))
 
 static float CombinedShannonEntropy_SSE2(const int X[256], const int Y[256]) {
   int i;
-  double retval = 0.;
-  int sumX, sumXY;
-  int32_t tmp[4];
-  __m128i zero = _mm_setzero_si128();
-  // Sums up X + Y, 4 ints at a time (and will merge it at the end for sumXY).
-  __m128i sumXY_128 = zero;
-  __m128i sumX_128 = zero;
+  float retval = 0.f;
+  int sumX = 0, sumXY = 0;
+  const __m128i zero = _mm_setzero_si128();
 
-  for (i = 0; i < 256; i += 4) {
-    const __m128i x = _mm_loadu_si128((const __m128i*)(X + i));
-    const __m128i y = _mm_loadu_si128((const __m128i*)(Y + i));
-
-    // Check if any X is non-zero: this actually provides a speedup as X is
-    // usually sparse.
-    if (_mm_movemask_epi8(_mm_cmpeq_epi32(x, zero)) != 0xFFFF) {
-      const __m128i xy_128 = _mm_add_epi32(x, y);
-      sumXY_128 = _mm_add_epi32(sumXY_128, xy_128);
-
-      sumX_128 = _mm_add_epi32(sumX_128, x);
-
-      // Analyze the different X + Y.
-      _mm_storeu_si128((__m128i*)tmp, xy_128);
-
-      ANALYZE_XY(0);
-      ANALYZE_XY(1);
-      ANALYZE_XY(2);
-      ANALYZE_XY(3);
-    } else {
-      // X is fully 0, so only deal with Y.
-      sumXY_128 = _mm_add_epi32(sumXY_128, y);
-
-      ANALYZE_X_OR_Y(Y, 0);
-      ANALYZE_X_OR_Y(Y, 1);
-      ANALYZE_X_OR_Y(Y, 2);
-      ANALYZE_X_OR_Y(Y, 3);
+  for (i = 0; i < 256; i += 16) {
+    const __m128i x0 = _mm_loadu_si128((const __m128i*)(X + i +  0));
+    const __m128i y0 = _mm_loadu_si128((const __m128i*)(Y + i +  0));
+    const __m128i x1 = _mm_loadu_si128((const __m128i*)(X + i +  4));
+    const __m128i y1 = _mm_loadu_si128((const __m128i*)(Y + i +  4));
+    const __m128i x2 = _mm_loadu_si128((const __m128i*)(X + i +  8));
+    const __m128i y2 = _mm_loadu_si128((const __m128i*)(Y + i +  8));
+    const __m128i x3 = _mm_loadu_si128((const __m128i*)(X + i + 12));
+    const __m128i y3 = _mm_loadu_si128((const __m128i*)(Y + i + 12));
+    const __m128i x4 = _mm_packs_epi16(_mm_packs_epi32(x0, x1),
+                                       _mm_packs_epi32(x2, x3));
+    const __m128i y4 = _mm_packs_epi16(_mm_packs_epi32(y0, y1),
+                                       _mm_packs_epi32(y2, y3));
+    const int32_t mx = _mm_movemask_epi8(_mm_cmpgt_epi8(x4, zero));
+    int32_t my = _mm_movemask_epi8(_mm_cmpgt_epi8(y4, zero)) | mx;
+    while (my) {
+      const int32_t j = BitsCtz(my);
+      int xy;
+      if ((mx >> j) & 1) {
+        const int x = X[i + j];
+        sumXY += x;
+        retval -= VP8LFastSLog2(x);
+      }
+      xy = X[i + j] + Y[i + j];
+      sumX += xy;
+      retval -= VP8LFastSLog2(xy);
+      my &= my - 1;
     }
   }
-
-  // Sum up sumX_128 to get sumX.
-  _mm_storeu_si128((__m128i*)tmp, sumX_128);
-  sumX = tmp[3] + tmp[2] + tmp[1] + tmp[0];
-
-  // Sum up sumXY_128 to get sumXY.
-  _mm_storeu_si128((__m128i*)tmp, sumXY_128);
-  sumXY = tmp[3] + tmp[2] + tmp[1] + tmp[0];
-
   retval += VP8LFastSLog2(sumX) + VP8LFastSLog2(sumXY);
-  return (float)retval;
+  return retval;
 }
-#undef ANALYZE_X_OR_Y
-#undef ANALYZE_XY
+
+#else
+
+#define DONT_USE_COMBINED_SHANNON_ENTROPY_SSE2_FUNC   // won't be faster
+
+#endif
 
 //------------------------------------------------------------------------------
 
@@ -384,7 +342,7 @@
   assert(xbits <= 3);
   switch (xbits) {
     case 0: {
-      const __m128i ff = _mm_set1_epi16(0xff00);
+      const __m128i ff = _mm_set1_epi16((short)0xff00);
       const __m128i zero = _mm_setzero_si128();
       // Store 0xff000000 | (row[x] << 8).
       for (x = 0; x + 16 <= width; x += 16, dst += 16) {
@@ -403,7 +361,7 @@
       break;
     }
     case 1: {
-      const __m128i ff = _mm_set1_epi16(0xff00);
+      const __m128i ff = _mm_set1_epi16((short)0xff00);
       const __m128i mul = _mm_set1_epi16(0x110);
       for (x = 0; x + 16 <= width; x += 16, dst += 8) {
         // 0a0b | (where a/b are 4 bits).
@@ -418,7 +376,7 @@
       break;
     }
     case 2: {
-      const __m128i mask_or = _mm_set1_epi32(0xff000000);
+      const __m128i mask_or = _mm_set1_epi32((int)0xff000000);
       const __m128i mul_cst = _mm_set1_epi16(0x0104);
       const __m128i mask_mul = _mm_set1_epi16(0x0f00);
       for (x = 0; x + 16 <= width; x += 16, dst += 4) {
@@ -469,31 +427,34 @@
 static void PredictorSub0_SSE2(const uint32_t* in, const uint32_t* upper,
                                int num_pixels, uint32_t* out) {
   int i;
-  const __m128i black = _mm_set1_epi32(ARGB_BLACK);
+  const __m128i black = _mm_set1_epi32((int)ARGB_BLACK);
   for (i = 0; i + 4 <= num_pixels; i += 4) {
     const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]);
     const __m128i res = _mm_sub_epi8(src, black);
     _mm_storeu_si128((__m128i*)&out[i], res);
   }
   if (i != num_pixels) {
-    VP8LPredictorsSub_C[0](in + i, upper + i, num_pixels - i, out + i);
+    VP8LPredictorsSub_C[0](in + i, NULL, num_pixels - i, out + i);
   }
+  (void)upper;
 }
 
-#define GENERATE_PREDICTOR_1(X, IN)                                           \
-static void PredictorSub##X##_SSE2(const uint32_t* in, const uint32_t* upper, \
-                                   int num_pixels, uint32_t* out) {           \
-  int i;                                                                      \
-  for (i = 0; i + 4 <= num_pixels; i += 4) {                                  \
-    const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]);              \
-    const __m128i pred = _mm_loadu_si128((const __m128i*)&(IN));              \
-    const __m128i res = _mm_sub_epi8(src, pred);                              \
-    _mm_storeu_si128((__m128i*)&out[i], res);                                 \
-  }                                                                           \
-  if (i != num_pixels) {                                                      \
-    VP8LPredictorsSub_C[(X)](in + i, upper + i, num_pixels - i, out + i);     \
-  }                                                                           \
-}
+#define GENERATE_PREDICTOR_1(X, IN)                                         \
+  static void PredictorSub##X##_SSE2(const uint32_t* const in,              \
+                                     const uint32_t* const upper,           \
+                                     int num_pixels, uint32_t* const out) { \
+    int i;                                                                  \
+    for (i = 0; i + 4 <= num_pixels; i += 4) {                              \
+      const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]);          \
+      const __m128i pred = _mm_loadu_si128((const __m128i*)&(IN));          \
+      const __m128i res = _mm_sub_epi8(src, pred);                          \
+      _mm_storeu_si128((__m128i*)&out[i], res);                             \
+    }                                                                       \
+    if (i != num_pixels) {                                                  \
+      VP8LPredictorsSub_C[(X)](in + i, WEBP_OFFSET_PTR(upper, i),           \
+                               num_pixels - i, out + i);                    \
+    }                                                                       \
+  }
 
 GENERATE_PREDICTOR_1(1, in[i - 1])       // Predictor1: L
 GENERATE_PREDICTOR_1(2, upper[i])        // Predictor2: T
@@ -675,8 +636,11 @@
   VP8LTransformColor = TransformColor_SSE2;
   VP8LCollectColorBlueTransforms = CollectColorBlueTransforms_SSE2;
   VP8LCollectColorRedTransforms = CollectColorRedTransforms_SSE2;
-  VP8LHistogramAdd = HistogramAdd_SSE2;
+  VP8LAddVector = AddVector_SSE2;
+  VP8LAddVectorEq = AddVectorEq_SSE2;
+#if !defined(DONT_USE_COMBINED_SHANNON_ENTROPY_SSE2_FUNC)
   VP8LCombinedShannonEntropy = CombinedShannonEntropy_SSE2;
+#endif
   VP8LVectorMismatch = VectorMismatch_SSE2;
   VP8LBundleColorMap = BundleColorMap_SSE2;
 
diff --git a/third_party/libwebp/src/dsp/lossless_enc_sse41.c b/third_party/libwebp/src/dsp/lossless_enc_sse41.c
index 2e12a71..ad358a6 100644
--- a/third_party/libwebp/src/dsp/lossless_enc_sse41.c
+++ b/third_party/libwebp/src/dsp/lossless_enc_sse41.c
@@ -44,46 +44,47 @@
 //------------------------------------------------------------------------------
 // Color Transform
 
-#define SPAN 8
+#define MK_CST_16(HI, LO) \
+  _mm_set1_epi32((int)(((uint32_t)(HI) << 16) | ((LO) & 0xffff)))
+
 static void CollectColorBlueTransforms_SSE41(const uint32_t* argb, int stride,
                                              int tile_width, int tile_height,
                                              int green_to_blue, int red_to_blue,
                                              int histo[]) {
-  const __m128i mults_r = _mm_set1_epi16(CST_5b(red_to_blue));
-  const __m128i mults_g = _mm_set1_epi16(CST_5b(green_to_blue));
-  const __m128i mask_g = _mm_set1_epi16(0xff00);   // green mask
-  const __m128i mask_gb = _mm_set1_epi32(0xffff);  // green/blue mask
-  const __m128i mask_b = _mm_set1_epi16(0x00ff);   // blue mask
-  const __m128i shuffler_lo = _mm_setr_epi8(-1, 2, -1, 6, -1, 10, -1, 14, -1,
-                                            -1, -1, -1, -1, -1, -1, -1);
-  const __m128i shuffler_hi = _mm_setr_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1,
-                                            2, -1, 6, -1, 10, -1, 14);
-  int y;
-  for (y = 0; y < tile_height; ++y) {
-    const uint32_t* const src = argb + y * stride;
-    int i, x;
-    for (x = 0; x + SPAN <= tile_width; x += SPAN) {
-      uint16_t values[SPAN];
-      const __m128i in0 = _mm_loadu_si128((__m128i*)&src[x + 0]);
-      const __m128i in1 = _mm_loadu_si128((__m128i*)&src[x + SPAN / 2]);
-      const __m128i r0 = _mm_shuffle_epi8(in0, shuffler_lo);
-      const __m128i r1 = _mm_shuffle_epi8(in1, shuffler_hi);
-      const __m128i r = _mm_or_si128(r0, r1);         // r 0
-      const __m128i gb0 = _mm_and_si128(in0, mask_gb);
-      const __m128i gb1 = _mm_and_si128(in1, mask_gb);
-      const __m128i gb = _mm_packus_epi32(gb0, gb1);  // g b
-      const __m128i g = _mm_and_si128(gb, mask_g);    // g 0
-      const __m128i A = _mm_mulhi_epi16(r, mults_r);  // x dbr
-      const __m128i B = _mm_mulhi_epi16(g, mults_g);  // x dbg
-      const __m128i C = _mm_sub_epi8(gb, B);          // x b'
-      const __m128i D = _mm_sub_epi8(C, A);           // x b''
-      const __m128i E = _mm_and_si128(D, mask_b);     // 0 b''
-      _mm_storeu_si128((__m128i*)values, E);
-      for (i = 0; i < SPAN; ++i) ++histo[values[i]];
+  const __m128i mult =
+      MK_CST_16(CST_5b(red_to_blue) + 256,CST_5b(green_to_blue));
+  const __m128i perm =
+      _mm_setr_epi8(-1, 1, -1, 2, -1, 5, -1, 6, -1, 9, -1, 10, -1, 13, -1, 14);
+  if (tile_width >= 4) {
+    int y;
+    for (y = 0; y < tile_height; ++y) {
+      const uint32_t* const src = argb + y * stride;
+      const __m128i A1 = _mm_loadu_si128((const __m128i*)src);
+      const __m128i B1 = _mm_shuffle_epi8(A1, perm);
+      const __m128i C1 = _mm_mulhi_epi16(B1, mult);
+      const __m128i D1 = _mm_sub_epi16(A1, C1);
+      __m128i E = _mm_add_epi16(_mm_srli_epi32(D1, 16), D1);
+      int x;
+      for (x = 4; x + 4 <= tile_width; x += 4) {
+        const __m128i A2 = _mm_loadu_si128((const __m128i*)(src + x));
+        __m128i B2, C2, D2;
+        ++histo[_mm_extract_epi8(E,  0)];
+        B2 = _mm_shuffle_epi8(A2, perm);
+        ++histo[_mm_extract_epi8(E,  4)];
+        C2 = _mm_mulhi_epi16(B2, mult);
+        ++histo[_mm_extract_epi8(E,  8)];
+        D2 = _mm_sub_epi16(A2, C2);
+        ++histo[_mm_extract_epi8(E, 12)];
+        E = _mm_add_epi16(_mm_srli_epi32(D2, 16), D2);
+      }
+      ++histo[_mm_extract_epi8(E,  0)];
+      ++histo[_mm_extract_epi8(E,  4)];
+      ++histo[_mm_extract_epi8(E,  8)];
+      ++histo[_mm_extract_epi8(E, 12)];
     }
   }
   {
-    const int left_over = tile_width & (SPAN - 1);
+    const int left_over = tile_width & 3;
     if (left_over > 0) {
       VP8LCollectColorBlueTransforms_C(argb + tile_width - left_over, stride,
                                        left_over, tile_height,
@@ -95,33 +96,37 @@
 static void CollectColorRedTransforms_SSE41(const uint32_t* argb, int stride,
                                             int tile_width, int tile_height,
                                             int green_to_red, int histo[]) {
-  const __m128i mults_g = _mm_set1_epi16(CST_5b(green_to_red));
-  const __m128i mask_g = _mm_set1_epi32(0x00ff00);  // green mask
-  const __m128i mask = _mm_set1_epi16(0xff);
 
-  int y;
-  for (y = 0; y < tile_height; ++y) {
-    const uint32_t* const src = argb + y * stride;
-    int i, x;
-    for (x = 0; x + SPAN <= tile_width; x += SPAN) {
-      uint16_t values[SPAN];
-      const __m128i in0 = _mm_loadu_si128((__m128i*)&src[x + 0]);
-      const __m128i in1 = _mm_loadu_si128((__m128i*)&src[x + SPAN / 2]);
-      const __m128i g0 = _mm_and_si128(in0, mask_g);  // 0 0  | g 0
-      const __m128i g1 = _mm_and_si128(in1, mask_g);
-      const __m128i g = _mm_packus_epi32(g0, g1);     // g 0
-      const __m128i A0 = _mm_srli_epi32(in0, 16);     // 0 0  | x r
-      const __m128i A1 = _mm_srli_epi32(in1, 16);
-      const __m128i A = _mm_packus_epi32(A0, A1);     // x r
-      const __m128i B = _mm_mulhi_epi16(g, mults_g);  // x dr
-      const __m128i C = _mm_sub_epi8(A, B);           // x r'
-      const __m128i D = _mm_and_si128(C, mask);       // 0 r'
-      _mm_storeu_si128((__m128i*)values, D);
-      for (i = 0; i < SPAN; ++i) ++histo[values[i]];
+  const __m128i mult = MK_CST_16(0, CST_5b(green_to_red));
+  const __m128i mask_g = _mm_set1_epi32(0x0000ff00);
+  if (tile_width >= 4) {
+    int y;
+    for (y = 0; y < tile_height; ++y) {
+      const uint32_t* const src = argb + y * stride;
+      const __m128i A1 = _mm_loadu_si128((const __m128i*)src);
+      const __m128i B1 = _mm_and_si128(A1, mask_g);
+      const __m128i C1 = _mm_madd_epi16(B1, mult);
+      __m128i D = _mm_sub_epi16(A1, C1);
+      int x;
+      for (x = 4; x + 4 <= tile_width; x += 4) {
+        const __m128i A2 = _mm_loadu_si128((const __m128i*)(src + x));
+        __m128i B2, C2;
+        ++histo[_mm_extract_epi8(D,  2)];
+        B2 = _mm_and_si128(A2, mask_g);
+        ++histo[_mm_extract_epi8(D,  6)];
+        C2 = _mm_madd_epi16(B2, mult);
+        ++histo[_mm_extract_epi8(D, 10)];
+        ++histo[_mm_extract_epi8(D, 14)];
+        D = _mm_sub_epi16(A2, C2);
+      }
+      ++histo[_mm_extract_epi8(D,  2)];
+      ++histo[_mm_extract_epi8(D,  6)];
+      ++histo[_mm_extract_epi8(D, 10)];
+      ++histo[_mm_extract_epi8(D, 14)];
     }
   }
   {
-    const int left_over = tile_width & (SPAN - 1);
+    const int left_over = tile_width & 3;
     if (left_over > 0) {
       VP8LCollectColorRedTransforms_C(argb + tile_width - left_over, stride,
                                       left_over, tile_height, green_to_red,
@@ -130,6 +135,8 @@
   }
 }
 
+#undef MK_CST_16
+
 //------------------------------------------------------------------------------
 // Entry point
 
diff --git a/third_party/libwebp/src/dsp/lossless_mips_dsp_r2.c b/third_party/libwebp/src/dsp/lossless_mips_dsp_r2.c
index 9888854..bfe5ea6 100644
--- a/third_party/libwebp/src/dsp/lossless_mips_dsp_r2.c
+++ b/third_party/libwebp/src/dsp/lossless_mips_dsp_r2.c
@@ -188,46 +188,51 @@
   return Average2(Average2(a0, a1), Average2(a2, a3));
 }
 
-static uint32_t Predictor5_MIPSdspR2(uint32_t left, const uint32_t* const top) {
-  return Average3(left, top[0], top[1]);
+static uint32_t Predictor5_MIPSdspR2(const uint32_t* const left,
+                                     const uint32_t* const top) {
+  return Average3(*left, top[0], top[1]);
 }
 
-static uint32_t Predictor6_MIPSdspR2(uint32_t left, const uint32_t* const top) {
-  return Average2(left, top[-1]);
+static uint32_t Predictor6_MIPSdspR2(const uint32_t* const left,
+                                     const uint32_t* const top) {
+  return Average2(*left, top[-1]);
 }
 
-static uint32_t Predictor7_MIPSdspR2(uint32_t left, const uint32_t* const top) {
-  return Average2(left, top[0]);
+static uint32_t Predictor7_MIPSdspR2(const uint32_t* const left,
+                                     const uint32_t* const top) {
+  return Average2(*left, top[0]);
 }
 
-static uint32_t Predictor8_MIPSdspR2(uint32_t left, const uint32_t* const top) {
+static uint32_t Predictor8_MIPSdspR2(const uint32_t* const left,
+                                     const uint32_t* const top) {
   (void)left;
   return Average2(top[-1], top[0]);
 }
 
-static uint32_t Predictor9_MIPSdspR2(uint32_t left, const uint32_t* const top) {
+static uint32_t Predictor9_MIPSdspR2(const uint32_t* const left,
+                                     const uint32_t* const top) {
   (void)left;
   return Average2(top[0], top[1]);
 }
 
-static uint32_t Predictor10_MIPSdspR2(uint32_t left,
+static uint32_t Predictor10_MIPSdspR2(const uint32_t* const left,
                                       const uint32_t* const top) {
-  return Average4(left, top[-1], top[0], top[1]);
+  return Average4(*left, top[-1], top[0], top[1]);
 }
 
-static uint32_t Predictor11_MIPSdspR2(uint32_t left,
+static uint32_t Predictor11_MIPSdspR2(const uint32_t* const left,
                                       const uint32_t* const top) {
-  return Select(top[0], left, top[-1]);
+  return Select(top[0], *left, top[-1]);
 }
 
-static uint32_t Predictor12_MIPSdspR2(uint32_t left,
+static uint32_t Predictor12_MIPSdspR2(const uint32_t* const left,
                                       const uint32_t* const top) {
-  return ClampedAddSubtractFull(left, top[0], top[-1]);
+  return ClampedAddSubtractFull(*left, top[0], top[-1]);
 }
 
-static uint32_t Predictor13_MIPSdspR2(uint32_t left,
+static uint32_t Predictor13_MIPSdspR2(const uint32_t* const left,
                                       const uint32_t* const top) {
-  return ClampedAddSubtractHalf(left, top[0], top[-1]);
+  return ClampedAddSubtractHalf(*left, top[0], top[-1]);
 }
 
 // Add green to blue and red channels (i.e. perform the inverse transform of
diff --git a/third_party/libwebp/src/dsp/lossless_neon.c b/third_party/libwebp/src/dsp/lossless_neon.c
index 76a1b6f..ddc9b61 100644
--- a/third_party/libwebp/src/dsp/lossless_neon.c
+++ b/third_party/libwebp/src/dsp/lossless_neon.c
@@ -188,17 +188,21 @@
   return avg;
 }
 
-static uint32_t Predictor5_NEON(uint32_t left, const uint32_t* const top) {
-  return Average3_NEON(left, top[0], top[1]);
+static uint32_t Predictor5_NEON(const uint32_t* const left,
+                                const uint32_t* const top) {
+  return Average3_NEON(*left, top[0], top[1]);
 }
-static uint32_t Predictor6_NEON(uint32_t left, const uint32_t* const top) {
-  return Average2_NEON(left, top[-1]);
+static uint32_t Predictor6_NEON(const uint32_t* const left,
+                                const uint32_t* const top) {
+  return Average2_NEON(*left, top[-1]);
 }
-static uint32_t Predictor7_NEON(uint32_t left, const uint32_t* const top) {
-  return Average2_NEON(left, top[0]);
+static uint32_t Predictor7_NEON(const uint32_t* const left,
+                                const uint32_t* const top) {
+  return Average2_NEON(*left, top[0]);
 }
-static uint32_t Predictor13_NEON(uint32_t left, const uint32_t* const top) {
-  return ClampedAddSubtractHalf_NEON(left, top[0], top[-1]);
+static uint32_t Predictor13_NEON(const uint32_t* const left,
+                                 const uint32_t* const top) {
+  return ClampedAddSubtractHalf_NEON(*left, top[0], top[-1]);
 }
 
 // Batch versions of those functions.
@@ -494,7 +498,7 @@
 
 // vtbl?_u8 are marked unavailable for iOS arm64 with Xcode < 6.3, use
 // non-standard versions there.
-#if defined(__APPLE__) && defined(__aarch64__) && \
+#if defined(__APPLE__) && WEBP_AARCH64 && \
     defined(__apple_build_version__) && (__apple_build_version__< 6020037)
 #define USE_VTBLQ
 #endif
diff --git a/third_party/libwebp/src/dsp/lossless_sse2.c b/third_party/libwebp/src/dsp/lossless_sse2.c
index 17d7576..4b6a532 100644
--- a/third_party/libwebp/src/dsp/lossless_sse2.c
+++ b/third_party/libwebp/src/dsp/lossless_sse2.c
@@ -18,7 +18,6 @@
 #include "src/dsp/common_sse2.h"
 #include "src/dsp/lossless.h"
 #include "src/dsp/lossless_common.h"
-#include <assert.h>
 #include <emmintrin.h>
 
 //------------------------------------------------------------------------------
@@ -28,23 +27,22 @@
                                                         uint32_t c1,
                                                         uint32_t c2) {
   const __m128i zero = _mm_setzero_si128();
-  const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c0), zero);
-  const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c1), zero);
-  const __m128i C2 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c2), zero);
+  const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c0), zero);
+  const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c1), zero);
+  const __m128i C2 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c2), zero);
   const __m128i V1 = _mm_add_epi16(C0, C1);
   const __m128i V2 = _mm_sub_epi16(V1, C2);
   const __m128i b = _mm_packus_epi16(V2, V2);
-  const uint32_t output = _mm_cvtsi128_si32(b);
-  return output;
+  return (uint32_t)_mm_cvtsi128_si32(b);
 }
 
 static WEBP_INLINE uint32_t ClampedAddSubtractHalf_SSE2(uint32_t c0,
                                                         uint32_t c1,
                                                         uint32_t c2) {
   const __m128i zero = _mm_setzero_si128();
-  const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c0), zero);
-  const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c1), zero);
-  const __m128i B0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c2), zero);
+  const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c0), zero);
+  const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c1), zero);
+  const __m128i B0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c2), zero);
   const __m128i avg = _mm_add_epi16(C1, C0);
   const __m128i A0 = _mm_srli_epi16(avg, 1);
   const __m128i A1 = _mm_sub_epi16(A0, B0);
@@ -53,16 +51,15 @@
   const __m128i A3 = _mm_srai_epi16(A2, 1);
   const __m128i A4 = _mm_add_epi16(A0, A3);
   const __m128i A5 = _mm_packus_epi16(A4, A4);
-  const uint32_t output = _mm_cvtsi128_si32(A5);
-  return output;
+  return (uint32_t)_mm_cvtsi128_si32(A5);
 }
 
 static WEBP_INLINE uint32_t Select_SSE2(uint32_t a, uint32_t b, uint32_t c) {
   int pa_minus_pb;
   const __m128i zero = _mm_setzero_si128();
-  const __m128i A0 = _mm_cvtsi32_si128(a);
-  const __m128i B0 = _mm_cvtsi32_si128(b);
-  const __m128i C0 = _mm_cvtsi32_si128(c);
+  const __m128i A0 = _mm_cvtsi32_si128((int)a);
+  const __m128i B0 = _mm_cvtsi32_si128((int)b);
+  const __m128i C0 = _mm_cvtsi32_si128((int)c);
   const __m128i AC0 = _mm_subs_epu8(A0, C0);
   const __m128i CA0 = _mm_subs_epu8(C0, A0);
   const __m128i BC0 = _mm_subs_epu8(B0, C0);
@@ -95,8 +92,8 @@
                                              __m128i* const avg) {
   // (a + b) >> 1 = ((a + b + 1) >> 1) - ((a ^ b) & 1)
   const __m128i ones = _mm_set1_epi8(1);
-  const __m128i A0 = _mm_cvtsi32_si128(a0);
-  const __m128i A1 = _mm_cvtsi32_si128(a1);
+  const __m128i A0 = _mm_cvtsi32_si128((int)a0);
+  const __m128i A1 = _mm_cvtsi32_si128((int)a1);
   const __m128i avg1 = _mm_avg_epu8(A0, A1);
   const __m128i one = _mm_and_si128(_mm_xor_si128(A0, A1), ones);
   *avg = _mm_sub_epi8(avg1, one);
@@ -104,8 +101,8 @@
 
 static WEBP_INLINE __m128i Average2_uint32_16_SSE2(uint32_t a0, uint32_t a1) {
   const __m128i zero = _mm_setzero_si128();
-  const __m128i A0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a0), zero);
-  const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a1), zero);
+  const __m128i A0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a0), zero);
+  const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a1), zero);
   const __m128i sum = _mm_add_epi16(A1, A0);
   return _mm_srli_epi16(sum, 1);
 }
@@ -113,19 +110,18 @@
 static WEBP_INLINE uint32_t Average2_SSE2(uint32_t a0, uint32_t a1) {
   __m128i output;
   Average2_uint32_SSE2(a0, a1, &output);
-  return _mm_cvtsi128_si32(output);
+  return (uint32_t)_mm_cvtsi128_si32(output);
 }
 
 static WEBP_INLINE uint32_t Average3_SSE2(uint32_t a0, uint32_t a1,
                                           uint32_t a2) {
   const __m128i zero = _mm_setzero_si128();
   const __m128i avg1 = Average2_uint32_16_SSE2(a0, a2);
-  const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a1), zero);
+  const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a1), zero);
   const __m128i sum = _mm_add_epi16(avg1, A1);
   const __m128i avg2 = _mm_srli_epi16(sum, 1);
   const __m128i A2 = _mm_packus_epi16(avg2, avg2);
-  const uint32_t output = _mm_cvtsi128_si32(A2);
-  return output;
+  return (uint32_t)_mm_cvtsi128_si32(A2);
 }
 
 static WEBP_INLINE uint32_t Average4_SSE2(uint32_t a0, uint32_t a1,
@@ -135,46 +131,54 @@
   const __m128i sum = _mm_add_epi16(avg2, avg1);
   const __m128i avg3 = _mm_srli_epi16(sum, 1);
   const __m128i A0 = _mm_packus_epi16(avg3, avg3);
-  const uint32_t output = _mm_cvtsi128_si32(A0);
-  return output;
+  return (uint32_t)_mm_cvtsi128_si32(A0);
 }
 
-static uint32_t Predictor5_SSE2(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average3_SSE2(left, top[0], top[1]);
+static uint32_t Predictor5_SSE2(const uint32_t* const left,
+                                const uint32_t* const top) {
+  const uint32_t pred = Average3_SSE2(*left, top[0], top[1]);
   return pred;
 }
-static uint32_t Predictor6_SSE2(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average2_SSE2(left, top[-1]);
+static uint32_t Predictor6_SSE2(const uint32_t* const left,
+                                const uint32_t* const top) {
+  const uint32_t pred = Average2_SSE2(*left, top[-1]);
   return pred;
 }
-static uint32_t Predictor7_SSE2(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average2_SSE2(left, top[0]);
+static uint32_t Predictor7_SSE2(const uint32_t* const left,
+                                const uint32_t* const top) {
+  const uint32_t pred = Average2_SSE2(*left, top[0]);
   return pred;
 }
-static uint32_t Predictor8_SSE2(uint32_t left, const uint32_t* const top) {
+static uint32_t Predictor8_SSE2(const uint32_t* const left,
+                                const uint32_t* const top) {
   const uint32_t pred = Average2_SSE2(top[-1], top[0]);
   (void)left;
   return pred;
 }
-static uint32_t Predictor9_SSE2(uint32_t left, const uint32_t* const top) {
+static uint32_t Predictor9_SSE2(const uint32_t* const left,
+                                const uint32_t* const top) {
   const uint32_t pred = Average2_SSE2(top[0], top[1]);
   (void)left;
   return pred;
 }
-static uint32_t Predictor10_SSE2(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Average4_SSE2(left, top[-1], top[0], top[1]);
+static uint32_t Predictor10_SSE2(const uint32_t* const left,
+                                 const uint32_t* const top) {
+  const uint32_t pred = Average4_SSE2(*left, top[-1], top[0], top[1]);
   return pred;
 }
-static uint32_t Predictor11_SSE2(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = Select_SSE2(top[0], left, top[-1]);
+static uint32_t Predictor11_SSE2(const uint32_t* const left,
+                                 const uint32_t* const top) {
+  const uint32_t pred = Select_SSE2(top[0], *left, top[-1]);
   return pred;
 }
-static uint32_t Predictor12_SSE2(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = ClampedAddSubtractFull_SSE2(left, top[0], top[-1]);
+static uint32_t Predictor12_SSE2(const uint32_t* const left,
+                                 const uint32_t* const top) {
+  const uint32_t pred = ClampedAddSubtractFull_SSE2(*left, top[0], top[-1]);
   return pred;
 }
-static uint32_t Predictor13_SSE2(uint32_t left, const uint32_t* const top) {
-  const uint32_t pred = ClampedAddSubtractHalf_SSE2(left, top[0], top[-1]);
+static uint32_t Predictor13_SSE2(const uint32_t* const left,
+                                 const uint32_t* const top) {
+  const uint32_t pred = ClampedAddSubtractHalf_SSE2(*left, top[0], top[-1]);
   return pred;
 }
 
@@ -184,22 +188,23 @@
 static void PredictorAdd0_SSE2(const uint32_t* in, const uint32_t* upper,
                                int num_pixels, uint32_t* out) {
   int i;
-  const __m128i black = _mm_set1_epi32(ARGB_BLACK);
+  const __m128i black = _mm_set1_epi32((int)ARGB_BLACK);
   for (i = 0; i + 4 <= num_pixels; i += 4) {
     const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]);
     const __m128i res = _mm_add_epi8(src, black);
     _mm_storeu_si128((__m128i*)&out[i], res);
   }
   if (i != num_pixels) {
-    VP8LPredictorsAdd_C[0](in + i, upper + i, num_pixels - i, out + i);
+    VP8LPredictorsAdd_C[0](in + i, NULL, num_pixels - i, out + i);
   }
+  (void)upper;
 }
 
 // Predictor1: left.
 static void PredictorAdd1_SSE2(const uint32_t* in, const uint32_t* upper,
                                int num_pixels, uint32_t* out) {
   int i;
-  __m128i prev = _mm_set1_epi32(out[-1]);
+  __m128i prev = _mm_set1_epi32((int)out[-1]);
   for (i = 0; i + 4 <= num_pixels; i += 4) {
     // a | b | c | d
     const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]);
@@ -276,12 +281,12 @@
 #undef GENERATE_PREDICTOR_2
 
 // Predictor10: average of (average of (L,TL), average of (T, TR)).
-#define DO_PRED10(OUT) do {               \
-  __m128i avgLTL, avg;                    \
-  Average2_m128i(&L, &TL, &avgLTL);       \
-  Average2_m128i(&avgTTR, &avgLTL, &avg); \
-  L = _mm_add_epi8(avg, src);             \
-  out[i + (OUT)] = _mm_cvtsi128_si32(L);  \
+#define DO_PRED10(OUT) do {                         \
+  __m128i avgLTL, avg;                              \
+  Average2_m128i(&L, &TL, &avgLTL);                 \
+  Average2_m128i(&avgTTR, &avgLTL, &avg);           \
+  L = _mm_add_epi8(avg, src);                       \
+  out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(L);  \
 } while (0)
 
 #define DO_PRED10_SHIFT do {                                  \
@@ -294,7 +299,7 @@
 static void PredictorAdd10_SSE2(const uint32_t* in, const uint32_t* upper,
                                 int num_pixels, uint32_t* out) {
   int i;
-  __m128i L = _mm_cvtsi32_si128(out[-1]);
+  __m128i L = _mm_cvtsi32_si128((int)out[-1]);
   for (i = 0; i + 4 <= num_pixels; i += 4) {
     __m128i src = _mm_loadu_si128((const __m128i*)&in[i]);
     __m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]);
@@ -327,7 +332,7 @@
   const __m128i B = _mm_andnot_si128(mask, T);                         \
   const __m128i pred = _mm_or_si128(A, B); /* pred = (pa > b)? L : T*/ \
   L = _mm_add_epi8(src, pred);                                         \
-  out[i + (OUT)] = _mm_cvtsi128_si32(L);                               \
+  out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(L);                     \
 } while (0)
 
 #define DO_PRED11_SHIFT do {                                \
@@ -342,7 +347,7 @@
                                 int num_pixels, uint32_t* out) {
   int i;
   __m128i pa;
-  __m128i L = _mm_cvtsi32_si128(out[-1]);
+  __m128i L = _mm_cvtsi32_si128((int)out[-1]);
   for (i = 0; i + 4 <= num_pixels; i += 4) {
     __m128i T = _mm_loadu_si128((const __m128i*)&upper[i]);
     __m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]);
@@ -375,12 +380,12 @@
 #undef DO_PRED11_SHIFT
 
 // Predictor12: ClampedAddSubtractFull.
-#define DO_PRED12(DIFF, LANE, OUT) do {            \
-  const __m128i all = _mm_add_epi16(L, (DIFF));    \
-  const __m128i alls = _mm_packus_epi16(all, all); \
-  const __m128i res = _mm_add_epi8(src, alls);     \
-  out[i + (OUT)] = _mm_cvtsi128_si32(res);         \
-  L = _mm_unpacklo_epi8(res, zero);                \
+#define DO_PRED12(DIFF, LANE, OUT) do {              \
+  const __m128i all = _mm_add_epi16(L, (DIFF));      \
+  const __m128i alls = _mm_packus_epi16(all, all);   \
+  const __m128i res = _mm_add_epi8(src, alls);       \
+  out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(res); \
+  L = _mm_unpacklo_epi8(res, zero);                  \
 } while (0)
 
 #define DO_PRED12_SHIFT(DIFF, LANE) do {                    \
@@ -393,7 +398,7 @@
                                 int num_pixels, uint32_t* out) {
   int i;
   const __m128i zero = _mm_setzero_si128();
-  const __m128i L8 = _mm_cvtsi32_si128(out[-1]);
+  const __m128i L8 = _mm_cvtsi32_si128((int)out[-1]);
   __m128i L = _mm_unpacklo_epi8(L8, zero);
   for (i = 0; i + 4 <= num_pixels; i += 4) {
     // Load 4 pixels at a time.
@@ -459,7 +464,7 @@
   const __m128i mults_b2 = MK_CST_16(CST(red_to_blue_), 0);
 #undef MK_CST_16
 #undef CST
-  const __m128i mask_ag = _mm_set1_epi32(0xff00ff00);  // alpha-green masks
+  const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00);  // alpha-green masks
   int i;
   for (i = 0; i + 4 <= num_pixels; i += 4) {
     const __m128i in = _mm_loadu_si128((const __m128i*)&src[i]); // argb
@@ -523,7 +528,7 @@
 
 static void ConvertBGRAToRGBA_SSE2(const uint32_t* src,
                                    int num_pixels, uint8_t* dst) {
-  const __m128i red_blue_mask = _mm_set1_epi32(0x00ff00ffu);
+  const __m128i red_blue_mask = _mm_set1_epi32(0x00ff00ff);
   const __m128i* in = (const __m128i*)src;
   __m128i* out = (__m128i*)dst;
   while (num_pixels >= 8) {
@@ -552,7 +557,7 @@
 static void ConvertBGRAToRGBA4444_SSE2(const uint32_t* src,
                                        int num_pixels, uint8_t* dst) {
   const __m128i mask_0x0f = _mm_set1_epi8(0x0f);
-  const __m128i mask_0xf0 = _mm_set1_epi8(0xf0);
+  const __m128i mask_0xf0 = _mm_set1_epi8((char)0xf0);
   const __m128i* in = (const __m128i*)src;
   __m128i* out = (__m128i*)dst;
   while (num_pixels >= 8) {
@@ -587,8 +592,8 @@
 
 static void ConvertBGRAToRGB565_SSE2(const uint32_t* src,
                                      int num_pixels, uint8_t* dst) {
-  const __m128i mask_0xe0 = _mm_set1_epi8(0xe0);
-  const __m128i mask_0xf8 = _mm_set1_epi8(0xf8);
+  const __m128i mask_0xe0 = _mm_set1_epi8((char)0xe0);
+  const __m128i mask_0xf8 = _mm_set1_epi8((char)0xf8);
   const __m128i mask_0x07 = _mm_set1_epi8(0x07);
   const __m128i* in = (const __m128i*)src;
   __m128i* out = (__m128i*)dst;
diff --git a/third_party/libwebp/src/dsp/lossless_sse41.c b/third_party/libwebp/src/dsp/lossless_sse41.c
new file mode 100644
index 0000000..bb7ce76
--- /dev/null
+++ b/third_party/libwebp/src/dsp/lossless_sse41.c
@@ -0,0 +1,133 @@
+// Copyright 2021 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// SSE41 variant of methods for lossless decoder
+
+#include "src/dsp/dsp.h"
+
+#if defined(WEBP_USE_SSE41)
+
+#include "src/dsp/common_sse41.h"
+#include "src/dsp/lossless.h"
+#include "src/dsp/lossless_common.h"
+
+//------------------------------------------------------------------------------
+// Color-space conversion functions
+
+static void TransformColorInverse_SSE41(const VP8LMultipliers* const m,
+                                        const uint32_t* const src,
+                                        int num_pixels, uint32_t* dst) {
+// sign-extended multiplying constants, pre-shifted by 5.
+#define CST(X)  (((int16_t)(m->X << 8)) >> 5)   // sign-extend
+  const __m128i mults_rb =
+      _mm_set1_epi32((int)((uint32_t)CST(green_to_red_) << 16 |
+                           (CST(green_to_blue_) & 0xffff)));
+  const __m128i mults_b2 = _mm_set1_epi32(CST(red_to_blue_));
+#undef CST
+  const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00);
+  const __m128i perm1 = _mm_setr_epi8(-1, 1, -1, 1, -1, 5, -1, 5,
+                                      -1, 9, -1, 9, -1, 13, -1, 13);
+  const __m128i perm2 = _mm_setr_epi8(-1, 2, -1, -1, -1, 6, -1, -1,
+                                      -1, 10, -1, -1, -1, 14, -1, -1);
+  int i;
+  for (i = 0; i + 4 <= num_pixels; i += 4) {
+    const __m128i A = _mm_loadu_si128((const __m128i*)(src + i));
+    const __m128i B = _mm_shuffle_epi8(A, perm1); // argb -> g0g0
+    const __m128i C = _mm_mulhi_epi16(B, mults_rb);
+    const __m128i D = _mm_add_epi8(A, C);
+    const __m128i E = _mm_shuffle_epi8(D, perm2);
+    const __m128i F = _mm_mulhi_epi16(E, mults_b2);
+    const __m128i G = _mm_add_epi8(D, F);
+    const __m128i out = _mm_blendv_epi8(G, A, mask_ag);
+    _mm_storeu_si128((__m128i*)&dst[i], out);
+  }
+  // Fall-back to C-version for left-overs.
+  if (i != num_pixels) {
+    VP8LTransformColorInverse_C(m, src + i, num_pixels - i, dst + i);
+  }
+}
+
+//------------------------------------------------------------------------------
+
+#define ARGB_TO_RGB_SSE41 do {                        \
+  while (num_pixels >= 16) {                          \
+    const __m128i in0 = _mm_loadu_si128(in + 0);      \
+    const __m128i in1 = _mm_loadu_si128(in + 1);      \
+    const __m128i in2 = _mm_loadu_si128(in + 2);      \
+    const __m128i in3 = _mm_loadu_si128(in + 3);      \
+    const __m128i a0 = _mm_shuffle_epi8(in0, perm0);  \
+    const __m128i a1 = _mm_shuffle_epi8(in1, perm1);  \
+    const __m128i a2 = _mm_shuffle_epi8(in2, perm2);  \
+    const __m128i a3 = _mm_shuffle_epi8(in3, perm3);  \
+    const __m128i b0 = _mm_blend_epi16(a0, a1, 0xc0); \
+    const __m128i b1 = _mm_blend_epi16(a1, a2, 0xf0); \
+    const __m128i b2 = _mm_blend_epi16(a2, a3, 0xfc); \
+    _mm_storeu_si128(out + 0, b0);                    \
+    _mm_storeu_si128(out + 1, b1);                    \
+    _mm_storeu_si128(out + 2, b2);                    \
+    in += 4;                                          \
+    out += 3;                                         \
+    num_pixels -= 16;                                 \
+  }                                                   \
+} while (0)
+
+static void ConvertBGRAToRGB_SSE41(const uint32_t* src, int num_pixels,
+                                   uint8_t* dst) {
+  const __m128i* in = (const __m128i*)src;
+  __m128i* out = (__m128i*)dst;
+  const __m128i perm0 = _mm_setr_epi8(2, 1, 0, 6, 5, 4, 10, 9,
+                                      8, 14, 13, 12, -1, -1, -1, -1);
+  const __m128i perm1 = _mm_shuffle_epi32(perm0, 0x39);
+  const __m128i perm2 = _mm_shuffle_epi32(perm0, 0x4e);
+  const __m128i perm3 = _mm_shuffle_epi32(perm0, 0x93);
+
+  ARGB_TO_RGB_SSE41;
+
+  // left-overs
+  if (num_pixels > 0) {
+    VP8LConvertBGRAToRGB_C((const uint32_t*)in, num_pixels, (uint8_t*)out);
+  }
+}
+
+static void ConvertBGRAToBGR_SSE41(const uint32_t* src,
+                                   int num_pixels, uint8_t* dst) {
+  const __m128i* in = (const __m128i*)src;
+  __m128i* out = (__m128i*)dst;
+  const __m128i perm0 = _mm_setr_epi8(0, 1, 2, 4, 5, 6, 8, 9, 10,
+                                      12, 13, 14, -1, -1, -1, -1);
+  const __m128i perm1 = _mm_shuffle_epi32(perm0, 0x39);
+  const __m128i perm2 = _mm_shuffle_epi32(perm0, 0x4e);
+  const __m128i perm3 = _mm_shuffle_epi32(perm0, 0x93);
+
+  ARGB_TO_RGB_SSE41;
+
+  // left-overs
+  if (num_pixels > 0) {
+    VP8LConvertBGRAToBGR_C((const uint32_t*)in, num_pixels, (uint8_t*)out);
+  }
+}
+
+#undef ARGB_TO_RGB_SSE41
+
+//------------------------------------------------------------------------------
+// Entry point
+
+extern void VP8LDspInitSSE41(void);
+
+WEBP_TSAN_IGNORE_FUNCTION void VP8LDspInitSSE41(void) {
+  VP8LTransformColorInverse = TransformColorInverse_SSE41;
+  VP8LConvertBGRAToRGB = ConvertBGRAToRGB_SSE41;
+  VP8LConvertBGRAToBGR = ConvertBGRAToBGR_SSE41;
+}
+
+#else  // !WEBP_USE_SSE41
+
+WEBP_DSP_INIT_STUB(VP8LDspInitSSE41)
+
+#endif  // WEBP_USE_SSE41
diff --git a/third_party/libwebp/src/dsp/msa_macro.h b/third_party/libwebp/src/dsp/msa_macro.h
index dfacda6..51f6c64 100644
--- a/third_party/libwebp/src/dsp/msa_macro.h
+++ b/third_party/libwebp/src/dsp/msa_macro.h
@@ -14,6 +14,10 @@
 #ifndef WEBP_DSP_MSA_MACRO_H_
 #define WEBP_DSP_MSA_MACRO_H_
 
+#include "src/dsp/dsp.h"
+
+#if defined(WEBP_USE_MSA)
+
 #include <stdint.h>
 #include <msa.h>
 
@@ -1389,4 +1393,5 @@
 } while (0)
 #define AVER_UB2_UB(...) AVER_UB2(v16u8, __VA_ARGS__)
 
-#endif  /* WEBP_DSP_MSA_MACRO_H_ */
+#endif  // WEBP_USE_MSA
+#endif  // WEBP_DSP_MSA_MACRO_H_
diff --git a/third_party/libwebp/src/dsp/neon.h b/third_party/libwebp/src/dsp/neon.h
index aa1dea1..14acb40 100644
--- a/third_party/libwebp/src/dsp/neon.h
+++ b/third_party/libwebp/src/dsp/neon.h
@@ -12,14 +12,16 @@
 #ifndef WEBP_DSP_NEON_H_
 #define WEBP_DSP_NEON_H_
 
-#include <arm_neon.h>
-
 #include "src/dsp/dsp.h"
 
+#if defined(WEBP_USE_NEON)
+
+#include <arm_neon.h>
+
 // Right now, some intrinsics functions seem slower, so we disable them
 // everywhere except newer clang/gcc or aarch64 where the inline assembly is
 // incompatible.
-#if LOCAL_CLANG_PREREQ(3,8) || LOCAL_GCC_PREREQ(4,9) || defined(__aarch64__)
+#if LOCAL_CLANG_PREREQ(3, 8) || LOCAL_GCC_PREREQ(4, 9) || WEBP_AARCH64
 #define WEBP_USE_INTRINSICS   // use intrinsics when possible
 #endif
 
@@ -44,7 +46,7 @@
 // if using intrinsics, this flag avoids some functions that make gcc-4.6.3
 // crash ("internal compiler error: in immed_double_const, at emit-rtl.").
 // (probably similar to gcc.gnu.org/bugzilla/show_bug.cgi?id=48183)
-#if !(LOCAL_CLANG_PREREQ(3,8) || LOCAL_GCC_PREREQ(4,8) || defined(__aarch64__))
+#if !(LOCAL_CLANG_PREREQ(3, 8) || LOCAL_GCC_PREREQ(4, 8) || WEBP_AARCH64)
 #define WORK_AROUND_GCC
 #endif
 
@@ -98,4 +100,5 @@
 } while (0)
 #endif
 
+#endif  // WEBP_USE_NEON
 #endif  // WEBP_DSP_NEON_H_
diff --git a/third_party/libwebp/src/dsp/quant.h b/third_party/libwebp/src/dsp/quant.h
new file mode 100644
index 0000000..bf7734c
--- /dev/null
+++ b/third_party/libwebp/src/dsp/quant.h
@@ -0,0 +1,90 @@
+// Copyright 2018 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+
+#ifndef WEBP_DSP_QUANT_H_
+#define WEBP_DSP_QUANT_H_
+
+#include <string.h>
+
+#include "src/dsp/dsp.h"
+#include "src/webp/types.h"
+
+#if defined(WEBP_USE_NEON) && !defined(WEBP_ANDROID_NEON) && \
+    !defined(WEBP_HAVE_NEON_RTCD)
+#include <arm_neon.h>
+
+#define IsFlat IsFlat_NEON
+
+static uint32_t horizontal_add_uint32x4(const uint32x4_t a) {
+#if WEBP_AARCH64
+  return vaddvq_u32(a);
+#else
+  const uint64x2_t b = vpaddlq_u32(a);
+  const uint32x2_t c = vadd_u32(vreinterpret_u32_u64(vget_low_u64(b)),
+                                vreinterpret_u32_u64(vget_high_u64(b)));
+  return vget_lane_u32(c, 0);
+#endif
+}
+
+static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks,
+                              int thresh) {
+  const int16x8_t tst_ones = vdupq_n_s16(-1);
+  uint32x4_t sum = vdupq_n_u32(0);
+
+  for (int i = 0; i < num_blocks; ++i) {
+    // Set DC to zero.
+    const int16x8_t a_0 = vsetq_lane_s16(0, vld1q_s16(levels), 0);
+    const int16x8_t a_1 = vld1q_s16(levels + 8);
+
+    const uint16x8_t b_0 = vshrq_n_u16(vtstq_s16(a_0, tst_ones), 15);
+    const uint16x8_t b_1 = vshrq_n_u16(vtstq_s16(a_1, tst_ones), 15);
+
+    sum = vpadalq_u16(sum, b_0);
+    sum = vpadalq_u16(sum, b_1);
+
+    levels += 16;
+  }
+  return thresh >= (int)horizontal_add_uint32x4(sum);
+}
+
+#else
+
+#define IsFlat IsFlat_C
+
+static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks,
+                              int thresh) {
+  int score = 0;
+  while (num_blocks-- > 0) {      // TODO(skal): refine positional scoring?
+    int i;
+    for (i = 1; i < 16; ++i) {    // omit DC, we're only interested in AC
+      score += (levels[i] != 0);
+      if (score > thresh) return 0;
+    }
+    levels += 16;
+  }
+  return 1;
+}
+
+#endif  // defined(WEBP_USE_NEON) && !defined(WEBP_ANDROID_NEON) &&
+        // !defined(WEBP_HAVE_NEON_RTCD)
+
+static WEBP_INLINE int IsFlatSource16(const uint8_t* src) {
+  const uint32_t v = src[0] * 0x01010101u;
+  int i;
+  for (i = 0; i < 16; ++i) {
+    if (memcmp(src + 0, &v, 4) || memcmp(src +  4, &v, 4) ||
+        memcmp(src + 8, &v, 4) || memcmp(src + 12, &v, 4)) {
+      return 0;
+    }
+    src += BPS;
+  }
+  return 1;
+}
+
+#endif  // WEBP_DSP_QUANT_H_
diff --git a/third_party/libwebp/src/dsp/rescaler.c b/third_party/libwebp/src/dsp/rescaler.c
index bd3e143..440b07d 100644
--- a/third_party/libwebp/src/dsp/rescaler.c
+++ b/third_party/libwebp/src/dsp/rescaler.c
@@ -25,6 +25,7 @@
 
 #define ROUNDER (WEBP_RESCALER_ONE >> 1)
 #define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
 
 //------------------------------------------------------------------------------
 // Row import
@@ -41,8 +42,9 @@
     int x_out = channel;
     // simple bilinear interpolation
     int accum = wrk->x_add;
-    int left = src[x_in];
-    int right = (wrk->src_width > 1) ? src[x_in + x_stride] : left;
+    rescaler_t left = (rescaler_t)src[x_in];
+    rescaler_t right =
+        (wrk->src_width > 1) ? (rescaler_t)src[x_in + x_stride] : left;
     x_in += x_stride;
     while (1) {
       wrk->frow[x_out] = right * wrk->x_add + (left - right) * accum;
@@ -53,7 +55,7 @@
         left = right;
         x_in += x_stride;
         assert(x_in < wrk->src_width * x_stride);
-        right = src[x_in];
+        right = (rescaler_t)src[x_in];
         accum += wrk->x_add;
       }
     }
@@ -112,8 +114,7 @@
     for (x_out = 0; x_out < x_out_max; ++x_out) {
       const uint32_t J = frow[x_out];
       const int v = (int)MULT_FIX(J, wrk->fy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
     }
   } else {
     const uint32_t B = WEBP_RESCALER_FRAC(-wrk->y_accum, wrk->y_sub);
@@ -123,8 +124,7 @@
                        + (uint64_t)B * irow[x_out];
       const uint32_t J = (uint32_t)((I + ROUNDER) >> WEBP_RESCALER_RFIX);
       const int v = (int)MULT_FIX(J, wrk->fy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
     }
   }
 }
@@ -141,22 +141,21 @@
   assert(!wrk->y_expand);
   if (yscale) {
     for (x_out = 0; x_out < x_out_max; ++x_out) {
-      const uint32_t frac = (uint32_t)MULT_FIX(frow[x_out], yscale);
+      const uint32_t frac = (uint32_t)MULT_FIX_FLOOR(frow[x_out], yscale);
       const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
       irow[x_out] = frac;   // new fractional start
     }
   } else {
     for (x_out = 0; x_out < x_out_max; ++x_out) {
       const int v = (int)MULT_FIX(irow[x_out], wrk->fxy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
       irow[x_out] = 0;
     }
   }
 }
 
+#undef MULT_FIX_FLOOR
 #undef MULT_FIX
 #undef ROUNDER
 
@@ -202,6 +201,7 @@
 WebPRescalerExportRowFunc WebPRescalerExportRowExpand;
 WebPRescalerExportRowFunc WebPRescalerExportRowShrink;
 
+extern VP8CPUInfo VP8GetCPUInfo;
 extern void WebPRescalerDspInitSSE2(void);
 extern void WebPRescalerDspInitMIPS32(void);
 extern void WebPRescalerDspInitMIPSdspR2(void);
@@ -219,7 +219,7 @@
   WebPRescalerImportRowShrink = WebPRescalerImportRowShrink_C;
 
   if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       WebPRescalerDspInitSSE2();
     }
@@ -241,7 +241,7 @@
 #endif
   }
 
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
   if (WEBP_NEON_OMIT_C_CODE ||
       (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
     WebPRescalerDspInitNEON();
diff --git a/third_party/libwebp/src/dsp/rescaler_mips32.c b/third_party/libwebp/src/dsp/rescaler_mips32.c
index 542f7e5..61f63c6 100644
--- a/third_party/libwebp/src/dsp/rescaler_mips32.c
+++ b/third_party/libwebp/src/dsp/rescaler_mips32.c
@@ -209,6 +209,7 @@
   }
 }
 
+#if 0  // disabled for now. TODO(skal): make match the C-code
 static void ExportRowShrink_MIPS32(WebPRescaler* const wrk) {
   const int x_out_max = wrk->dst_width * wrk->num_channels;
   uint8_t* dst = wrk->dst;
@@ -273,6 +274,7 @@
     );
   }
 }
+#endif  // 0
 
 //------------------------------------------------------------------------------
 // Entry point
@@ -283,7 +285,7 @@
   WebPRescalerImportRowExpand = ImportRowExpand_MIPS32;
   WebPRescalerImportRowShrink = ImportRowShrink_MIPS32;
   WebPRescalerExportRowExpand = ExportRowExpand_MIPS32;
-  WebPRescalerExportRowShrink = ExportRowShrink_MIPS32;
+//  WebPRescalerExportRowShrink = ExportRowShrink_MIPS32;
 }
 
 #else  // !WEBP_USE_MIPS32
diff --git a/third_party/libwebp/src/dsp/rescaler_mips_dsp_r2.c b/third_party/libwebp/src/dsp/rescaler_mips_dsp_r2.c
index b78aac1..419b741 100644
--- a/third_party/libwebp/src/dsp/rescaler_mips_dsp_r2.c
+++ b/third_party/libwebp/src/dsp/rescaler_mips_dsp_r2.c
@@ -20,10 +20,12 @@
 
 #define ROUNDER (WEBP_RESCALER_ONE >> 1)
 #define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
 
 //------------------------------------------------------------------------------
 // Row export
 
+#if 0  // disabled for now. TODO(skal): make match the C-code
 static void ExportRowShrink_MIPSdspR2(WebPRescaler* const wrk) {
   int i;
   const int x_out_max = wrk->dst_width * wrk->num_channels;
@@ -105,10 +107,9 @@
       );
     }
     for (i = 0; i < (x_out_max & 0x3); ++i) {
-      const uint32_t frac = (uint32_t)MULT_FIX(*frow++, yscale);
+      const uint32_t frac = (uint32_t)MULT_FIX_FLOOR(*frow++, yscale);
       const int v = (int)MULT_FIX(*irow - frac, wrk->fxy_scale);
-      assert(v >= 0 && v <= 255);
-      *dst++ = v;
+      *dst++ = (v > 255) ? 255u : (uint8_t)v;
       *irow++ = frac;   // new fractional start
     }
   } else {
@@ -154,13 +155,13 @@
       );
     }
     for (i = 0; i < (x_out_max & 0x3); ++i) {
-      const int v = (int)MULT_FIX(*irow, wrk->fxy_scale);
-      assert(v >= 0 && v <= 255);
-      *dst++ = v;
+      const int v = (int)MULT_FIX_FLOOR(*irow, wrk->fxy_scale);
+      *dst++ = (v > 255) ? 255u : (uint8_t)v;
       *irow++ = 0;
     }
   }
 }
+#endif  // 0
 
 static void ExportRowExpand_MIPSdspR2(WebPRescaler* const wrk) {
   int i;
@@ -216,8 +217,7 @@
     for (i = 0; i < (x_out_max & 0x3); ++i) {
       const uint32_t J = *frow++;
       const int v = (int)MULT_FIX(J, wrk->fy_scale);
-      assert(v >= 0 && v <= 255);
-      *dst++ = v;
+      *dst++ = (v > 255) ? 255u : (uint8_t)v;
     }
   } else {
     const uint32_t B = WEBP_RESCALER_FRAC(-wrk->y_accum, wrk->y_sub);
@@ -288,12 +288,12 @@
                        + (uint64_t)B * *irow++;
       const uint32_t J = (uint32_t)((I + ROUNDER) >> WEBP_RESCALER_RFIX);
       const int v = (int)MULT_FIX(J, wrk->fy_scale);
-      assert(v >= 0 && v <= 255);
-      *dst++ = v;
+      *dst++ = (v > 255) ? 255u : (uint8_t)v;
     }
   }
 }
 
+#undef MULT_FIX_FLOOR
 #undef MULT_FIX
 #undef ROUNDER
 
@@ -304,7 +304,7 @@
 
 WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitMIPSdspR2(void) {
   WebPRescalerExportRowExpand = ExportRowExpand_MIPSdspR2;
-  WebPRescalerExportRowShrink = ExportRowShrink_MIPSdspR2;
+//  WebPRescalerExportRowShrink = ExportRowShrink_MIPSdspR2;
 }
 
 #else  // !WEBP_USE_MIPS_DSP_R2
diff --git a/third_party/libwebp/src/dsp/rescaler_msa.c b/third_party/libwebp/src/dsp/rescaler_msa.c
index f3bc99f..256dbdd 100644
--- a/third_party/libwebp/src/dsp/rescaler_msa.c
+++ b/third_party/libwebp/src/dsp/rescaler_msa.c
@@ -22,6 +22,7 @@
 
 #define ROUNDER (WEBP_RESCALER_ONE >> 1)
 #define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
 
 #define CALC_MULT_FIX_16(in0, in1, in2, in3, scale, shift, dst) do {  \
   v4u32 tmp0, tmp1, tmp2, tmp3;                                       \
@@ -165,8 +166,7 @@
     for (x_out = 0; x_out < length; ++x_out) {
       const uint32_t J = frow[x_out];
       const int v = (int)MULT_FIX(J, wrk->fy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
     }
   }
 }
@@ -240,8 +240,7 @@
                        + (uint64_t)B * irow[x_out];
       const uint32_t J = (uint32_t)((I + ROUNDER) >> WEBP_RESCALER_RFIX);
       const int v = (int)MULT_FIX(J, wrk->fy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
     }
   }
 }
@@ -262,6 +261,7 @@
   }
 }
 
+#if 0  // disabled for now. TODO(skal): make match the C-code
 static WEBP_INLINE void ExportRowShrink_0(const uint32_t* frow, uint32_t* irow,
                                           uint8_t* dst, int length,
                                           const uint32_t yscale,
@@ -340,10 +340,9 @@
       length -= 4;
     }
     for (x_out = 0; x_out < length; ++x_out) {
-      const uint32_t frac = (uint32_t)MULT_FIX(frow[x_out], yscale);
+      const uint32_t frac = (uint32_t)MULT_FIX_FLOOR(frow[x_out], yscale);
       const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
       irow[x_out] = frac;
     }
   }
@@ -404,8 +403,7 @@
     }
     for (x_out = 0; x_out < length; ++x_out) {
       const int v = (int)MULT_FIX(irow[x_out], wrk->fxy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
       irow[x_out] = 0;
     }
   }
@@ -426,6 +424,7 @@
     ExportRowShrink_1(irow, dst, x_out_max, wrk);
   }
 }
+#endif  // 0
 
 //------------------------------------------------------------------------------
 // Entry point
@@ -434,7 +433,7 @@
 
 WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitMSA(void) {
   WebPRescalerExportRowExpand = RescalerExportRowExpand_MIPSdspR2;
-  WebPRescalerExportRowShrink = RescalerExportRowShrink_MIPSdspR2;
+//  WebPRescalerExportRowShrink = RescalerExportRowShrink_MIPSdspR2;
 }
 
 #else     // !WEBP_USE_MSA
diff --git a/third_party/libwebp/src/dsp/rescaler_neon.c b/third_party/libwebp/src/dsp/rescaler_neon.c
index 3eff9fb..b976a85 100644
--- a/third_party/libwebp/src/dsp/rescaler_neon.c
+++ b/third_party/libwebp/src/dsp/rescaler_neon.c
@@ -22,6 +22,7 @@
 
 #define ROUNDER (WEBP_RESCALER_ONE >> 1)
 #define MULT_FIX_C(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR_C(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
 
 #define LOAD_32x4(SRC, DST) const uint32x4_t DST = vld1q_u32((SRC))
 #define LOAD_32x8(SRC, DST0, DST1)                                    \
@@ -35,8 +36,11 @@
 
 #if (WEBP_RESCALER_RFIX == 32)
 #define MAKE_HALF_CST(C) vdupq_n_s32((int32_t)((C) >> 1))
-#define MULT_FIX(A, B) /* note: B is actualy scale>>1. See MAKE_HALF_CST */ \
+// note: B is actualy scale>>1. See MAKE_HALF_CST
+#define MULT_FIX(A, B) \
     vreinterpretq_u32_s32(vqrdmulhq_s32(vreinterpretq_s32_u32((A)), (B)))
+#define MULT_FIX_FLOOR(A, B) \
+    vreinterpretq_u32_s32(vqdmulhq_s32(vreinterpretq_s32_u32((A)), (B)))
 #else
 #error "MULT_FIX/WEBP_RESCALER_RFIX need some more work"
 #endif
@@ -77,14 +81,13 @@
       const uint32x4_t B1 = MULT_FIX(A1, fy_scale_half);
       const uint16x4_t C0 = vmovn_u32(B0);
       const uint16x4_t C1 = vmovn_u32(B1);
-      const uint8x8_t D = vmovn_u16(vcombine_u16(C0, C1));
+      const uint8x8_t D = vqmovn_u16(vcombine_u16(C0, C1));
       vst1_u8(dst + x_out, D);
     }
     for (; x_out < x_out_max; ++x_out) {
       const uint32_t J = frow[x_out];
       const int v = (int)MULT_FIX_C(J, fy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
     }
   } else {
     const uint32_t B = WEBP_RESCALER_FRAC(-wrk->y_accum, wrk->y_sub);
@@ -98,7 +101,7 @@
       const uint32x4_t D1 = MULT_FIX(C1, fy_scale_half);
       const uint16x4_t E0 = vmovn_u32(D0);
       const uint16x4_t E1 = vmovn_u32(D1);
-      const uint8x8_t F = vmovn_u16(vcombine_u16(E0, E1));
+      const uint8x8_t F = vqmovn_u16(vcombine_u16(E0, E1));
       vst1_u8(dst + x_out, F);
     }
     for (; x_out < x_out_max; ++x_out) {
@@ -106,8 +109,7 @@
                        + (uint64_t)B * irow[x_out];
       const uint32_t J = (uint32_t)((I + ROUNDER) >> WEBP_RESCALER_RFIX);
       const int v = (int)MULT_FIX_C(J, fy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
     }
   }
 }
@@ -131,23 +133,22 @@
     for (x_out = 0; x_out < max_span; x_out += 8) {
       LOAD_32x8(frow + x_out, in0, in1);
       LOAD_32x8(irow + x_out, in2, in3);
-      const uint32x4_t A0 = MULT_FIX(in0, yscale_half);
-      const uint32x4_t A1 = MULT_FIX(in1, yscale_half);
+      const uint32x4_t A0 = MULT_FIX_FLOOR(in0, yscale_half);
+      const uint32x4_t A1 = MULT_FIX_FLOOR(in1, yscale_half);
       const uint32x4_t B0 = vqsubq_u32(in2, A0);
       const uint32x4_t B1 = vqsubq_u32(in3, A1);
       const uint32x4_t C0 = MULT_FIX(B0, fxy_scale_half);
       const uint32x4_t C1 = MULT_FIX(B1, fxy_scale_half);
       const uint16x4_t D0 = vmovn_u32(C0);
       const uint16x4_t D1 = vmovn_u32(C1);
-      const uint8x8_t E = vmovn_u16(vcombine_u16(D0, D1));
+      const uint8x8_t E = vqmovn_u16(vcombine_u16(D0, D1));
       vst1_u8(dst + x_out, E);
       STORE_32x8(A0, A1, irow + x_out);
     }
     for (; x_out < x_out_max; ++x_out) {
-      const uint32_t frac = (uint32_t)MULT_FIX_C(frow[x_out], yscale);
-      const int v = (int)MULT_FIX_C(irow[x_out] - frac, wrk->fxy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      const uint32_t frac = (uint32_t)MULT_FIX_FLOOR_C(frow[x_out], yscale);
+      const int v = (int)MULT_FIX_C(irow[x_out] - frac, fxy_scale);
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
       irow[x_out] = frac;   // new fractional start
     }
   } else {
@@ -157,19 +158,24 @@
       const uint32x4_t A1 = MULT_FIX(in1, fxy_scale_half);
       const uint16x4_t B0 = vmovn_u32(A0);
       const uint16x4_t B1 = vmovn_u32(A1);
-      const uint8x8_t C = vmovn_u16(vcombine_u16(B0, B1));
+      const uint8x8_t C = vqmovn_u16(vcombine_u16(B0, B1));
       vst1_u8(dst + x_out, C);
       STORE_32x8(zero, zero, irow + x_out);
     }
     for (; x_out < x_out_max; ++x_out) {
       const int v = (int)MULT_FIX_C(irow[x_out], fxy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
       irow[x_out] = 0;
     }
   }
 }
 
+#undef MULT_FIX_FLOOR_C
+#undef MULT_FIX_C
+#undef MULT_FIX_FLOOR
+#undef MULT_FIX
+#undef ROUNDER
+
 //------------------------------------------------------------------------------
 
 extern void WebPRescalerDspInitNEON(void);
diff --git a/third_party/libwebp/src/dsp/rescaler_sse2.c b/third_party/libwebp/src/dsp/rescaler_sse2.c
index 64c50de..3f18e94 100644
--- a/third_party/libwebp/src/dsp/rescaler_sse2.c
+++ b/third_party/libwebp/src/dsp/rescaler_sse2.c
@@ -25,6 +25,7 @@
 
 #define ROUNDER (WEBP_RESCALER_ONE >> 1)
 #define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
 
 // input: 8 bytes ABCDEFGH -> output: A0E0B0F0C0G0D0H0
 static void LoadTwoPixels_SSE2(const uint8_t* const src, __m128i* out) {
@@ -84,7 +85,7 @@
       const __m128i mult = _mm_cvtsi32_si128(((x_add - accum) << 16) | accum);
       const __m128i out = _mm_madd_epi16(cur_pixels, mult);
       assert(sizeof(*frow) == sizeof(uint32_t));
-      WebPUint32ToMem((uint8_t*)frow, _mm_cvtsi128_si32(out));
+      WebPInt32ToMem((uint8_t*)frow, _mm_cvtsi128_si32(out));
       frow += 1;
       if (frow >= frow_end) break;
       accum -= wrk->x_sub;
@@ -131,7 +132,7 @@
     __m128i base = zero;
     accum += wrk->x_add;
     while (accum > 0) {
-      const __m128i A = _mm_cvtsi32_si128(WebPMemToUint32(src));
+      const __m128i A = _mm_cvtsi32_si128(WebPMemToInt32(src));
       src += 4;
       base = _mm_unpacklo_epi8(A, zero);
       // To avoid overflow, we need: base * x_add / x_sub < 32768
@@ -197,7 +198,7 @@
                                         const __m128i* const mult,
                                         uint8_t* const dst) {
   const __m128i rounder = _mm_set_epi32(0, ROUNDER, 0, ROUNDER);
-  const __m128i mask = _mm_set_epi32(0xffffffffu, 0, 0xffffffffu, 0);
+  const __m128i mask = _mm_set_epi32(~0, 0, ~0, 0);
   const __m128i B0 = _mm_mul_epu32(*A0, *mult);
   const __m128i B1 = _mm_mul_epu32(*A1, *mult);
   const __m128i B2 = _mm_mul_epu32(*A2, *mult);
@@ -244,8 +245,7 @@
     for (; x_out < x_out_max; ++x_out) {
       const uint32_t J = frow[x_out];
       const int v = (int)MULT_FIX(J, wrk->fy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
     }
   } else {
     const uint32_t B = WEBP_RESCALER_FRAC(-wrk->y_accum, wrk->y_sub);
@@ -278,8 +278,7 @@
                        + (uint64_t)B * irow[x_out];
       const uint32_t J = (uint32_t)((I + ROUNDER) >> WEBP_RESCALER_RFIX);
       const int v = (int)MULT_FIX(J, wrk->fy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
     }
   }
 }
@@ -298,20 +297,15 @@
     const int scale_xy = wrk->fxy_scale;
     const __m128i mult_xy = _mm_set_epi32(0, scale_xy, 0, scale_xy);
     const __m128i mult_y = _mm_set_epi32(0, yscale, 0, yscale);
-    const __m128i rounder = _mm_set_epi32(0, ROUNDER, 0, ROUNDER);
     for (x_out = 0; x_out + 8 <= x_out_max; x_out += 8) {
       __m128i A0, A1, A2, A3, B0, B1, B2, B3;
       LoadDispatchAndMult_SSE2(irow + x_out, NULL, &A0, &A1, &A2, &A3);
       LoadDispatchAndMult_SSE2(frow + x_out, &mult_y, &B0, &B1, &B2, &B3);
       {
-        const __m128i C0 = _mm_add_epi64(B0, rounder);
-        const __m128i C1 = _mm_add_epi64(B1, rounder);
-        const __m128i C2 = _mm_add_epi64(B2, rounder);
-        const __m128i C3 = _mm_add_epi64(B3, rounder);
-        const __m128i D0 = _mm_srli_epi64(C0, WEBP_RESCALER_RFIX);   // = frac
-        const __m128i D1 = _mm_srli_epi64(C1, WEBP_RESCALER_RFIX);
-        const __m128i D2 = _mm_srli_epi64(C2, WEBP_RESCALER_RFIX);
-        const __m128i D3 = _mm_srli_epi64(C3, WEBP_RESCALER_RFIX);
+        const __m128i D0 = _mm_srli_epi64(B0, WEBP_RESCALER_RFIX);   // = frac
+        const __m128i D1 = _mm_srli_epi64(B1, WEBP_RESCALER_RFIX);
+        const __m128i D2 = _mm_srli_epi64(B2, WEBP_RESCALER_RFIX);
+        const __m128i D3 = _mm_srli_epi64(B3, WEBP_RESCALER_RFIX);
         const __m128i E0 = _mm_sub_epi64(A0, D0);   // irow[x] - frac
         const __m128i E1 = _mm_sub_epi64(A1, D1);
         const __m128i E2 = _mm_sub_epi64(A2, D2);
@@ -326,10 +320,9 @@
       }
     }
     for (; x_out < x_out_max; ++x_out) {
-      const uint32_t frac = (int)MULT_FIX(frow[x_out], yscale);
+      const uint32_t frac = (int)MULT_FIX_FLOOR(frow[x_out], yscale);
       const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
       irow[x_out] = frac;   // new fractional start
     }
   } else {
@@ -345,13 +338,13 @@
     }
     for (; x_out < x_out_max; ++x_out) {
       const int v = (int)MULT_FIX(irow[x_out], scale);
-      assert(v >= 0 && v <= 255);
-      dst[x_out] = v;
+      dst[x_out] = (v > 255) ? 255u : (uint8_t)v;
       irow[x_out] = 0;
     }
   }
 }
 
+#undef MULT_FIX_FLOOR
 #undef MULT_FIX
 #undef ROUNDER
 
diff --git a/third_party/libwebp/src/dsp/ssim.c b/third_party/libwebp/src/dsp/ssim.c
index 989ce82..9a1341e 100644
--- a/third_party/libwebp/src/dsp/ssim.c
+++ b/third_party/libwebp/src/dsp/ssim.c
@@ -137,6 +137,7 @@
 VP8AccumulateSSEFunc VP8AccumulateSSE;
 #endif
 
+extern VP8CPUInfo VP8GetCPUInfo;
 extern void VP8SSIMDspInitSSE2(void);
 
 WEBP_DSP_INIT_FUNC(VP8SSIMDspInit) {
@@ -150,7 +151,7 @@
 #endif
 
   if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       VP8SSIMDspInitSSE2();
     }
diff --git a/third_party/libwebp/src/dsp/upsampling.c b/third_party/libwebp/src/dsp/upsampling.c
index 9b60da5..983b9c4 100644
--- a/third_party/libwebp/src/dsp/upsampling.c
+++ b/third_party/libwebp/src/dsp/upsampling.c
@@ -215,6 +215,7 @@
 
 WebPYUV444Converter WebPYUV444Converters[MODE_LAST];
 
+extern VP8CPUInfo VP8GetCPUInfo;
 extern void WebPInitYUV444ConvertersMIPSdspR2(void);
 extern void WebPInitYUV444ConvertersSSE2(void);
 extern void WebPInitYUV444ConvertersSSE41(void);
@@ -233,12 +234,12 @@
   WebPYUV444Converters[MODE_rgbA_4444] = WebPYuv444ToRgba4444_C;
 
   if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       WebPInitYUV444ConvertersSSE2();
     }
 #endif
-#if defined(WEBP_USE_SSE41)
+#if defined(WEBP_HAVE_SSE41)
     if (VP8GetCPUInfo(kSSE4_1)) {
       WebPInitYUV444ConvertersSSE41();
     }
@@ -278,12 +279,12 @@
 
   // If defined, use CPUInfo() to overwrite some pointers with faster versions.
   if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       WebPInitUpsamplersSSE2();
     }
 #endif
-#if defined(WEBP_USE_SSE41)
+#if defined(WEBP_HAVE_SSE41)
     if (VP8GetCPUInfo(kSSE4_1)) {
       WebPInitUpsamplersSSE41();
     }
@@ -300,7 +301,7 @@
 #endif
   }
 
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
   if (WEBP_NEON_OMIT_C_CODE ||
       (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
     WebPInitUpsamplersNEON();
diff --git a/third_party/libwebp/src/dsp/upsampling_msa.c b/third_party/libwebp/src/dsp/upsampling_msa.c
index d5bf4db..aa50c39 100644
--- a/third_party/libwebp/src/dsp/upsampling_msa.c
+++ b/third_party/libwebp/src/dsp/upsampling_msa.c
@@ -580,9 +580,9 @@
   const uint32_t l_uv = ((cur_u[0]) | ((cur_v[0]) << 16));               \
   const uint32_t uv0 = (3 * tl_uv + l_uv + 0x00020002u) >> 2;            \
   const uint8_t* ptop_y = &top_y[1];                                     \
-  uint8_t *ptop_dst = top_dst + XSTEP;                                   \
+  uint8_t* ptop_dst = top_dst + XSTEP;                                   \
   const uint8_t* pbot_y = &bot_y[1];                                     \
-  uint8_t *pbot_dst = bot_dst + XSTEP;                                   \
+  uint8_t* pbot_dst = bot_dst + XSTEP;                                   \
                                                                          \
   FUNC(top_y[0], uv0 & 0xff, (uv0 >> 16), top_dst);                      \
   if (bot_y != NULL) {                                                   \
diff --git a/third_party/libwebp/src/dsp/upsampling_neon.c b/third_party/libwebp/src/dsp/upsampling_neon.c
index ff05bab..f104697 100644
--- a/third_party/libwebp/src/dsp/upsampling_neon.c
+++ b/third_party/libwebp/src/dsp/upsampling_neon.c
@@ -64,8 +64,8 @@
 } while (0)
 
 // Turn the macro into a function for reducing code-size when non-critical
-static void Upsample16Pixels_NEON(const uint8_t *r1, const uint8_t *r2,
-                                  uint8_t *out) {
+static void Upsample16Pixels_NEON(const uint8_t* r1, const uint8_t* r2,
+                                  uint8_t* out) {
   UPSAMPLE_16PIXELS(r1, r2, out);
 }
 
@@ -117,7 +117,7 @@
   vst4_u8(out, v255_r_g_b);                                             \
 } while (0)
 
-#if !defined(WEBP_SWAP_16BIT_CSP)
+#if (WEBP_SWAP_16BIT_CSP == 0)
 #define ZIP_U8(lo, hi) vzip_u8((lo), (hi))
 #else
 #define ZIP_U8(lo, hi) vzip_u8((hi), (lo))
@@ -196,14 +196,14 @@
 }
 
 #define NEON_UPSAMPLE_FUNC(FUNC_NAME, FMT, XSTEP)                       \
-static void FUNC_NAME(const uint8_t *top_y, const uint8_t *bottom_y,    \
-                      const uint8_t *top_u, const uint8_t *top_v,       \
-                      const uint8_t *cur_u, const uint8_t *cur_v,       \
-                      uint8_t *top_dst, uint8_t *bottom_dst, int len) { \
+static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y,    \
+                      const uint8_t* top_u, const uint8_t* top_v,       \
+                      const uint8_t* cur_u, const uint8_t* cur_v,       \
+                      uint8_t* top_dst, uint8_t* bottom_dst, int len) { \
   int block;                                                            \
   /* 16 byte aligned array to cache reconstructed u and v */            \
   uint8_t uv_buf[2 * 32 + 15];                                          \
-  uint8_t *const r_uv = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15);     \
+  uint8_t* const r_uv = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15);     \
   const int uv_len = (len + 1) >> 1;                                    \
   /* 9 pixels must be read-able for each block */                       \
   const int num_blocks = (uv_len - 1) >> 3;                             \
diff --git a/third_party/libwebp/src/dsp/upsampling_sse2.c b/third_party/libwebp/src/dsp/upsampling_sse2.c
index 45a3746..9a81ae7 100644
--- a/third_party/libwebp/src/dsp/upsampling_sse2.c
+++ b/third_party/libwebp/src/dsp/upsampling_sse2.c
@@ -127,7 +127,7 @@
   int uv_pos, pos;                                                             \
   /* 16byte-aligned array to cache reconstructed u and v */                    \
   uint8_t uv_buf[14 * 32 + 15] = { 0 };                                        \
-  uint8_t* const r_u = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15);             \
+  uint8_t* const r_u = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~(uintptr_t)15);  \
   uint8_t* const r_v = r_u + 32;                                               \
                                                                                \
   assert(top_y != NULL);                                                       \
diff --git a/third_party/libwebp/src/dsp/yuv.c b/third_party/libwebp/src/dsp/yuv.c
index 0567aaa..cec404a 100644
--- a/third_party/libwebp/src/dsp/yuv.c
+++ b/third_party/libwebp/src/dsp/yuv.c
@@ -70,6 +70,7 @@
 
 WebPSamplerRowFunc WebPSamplers[MODE_LAST];
 
+extern VP8CPUInfo VP8GetCPUInfo;
 extern void WebPInitSamplersSSE2(void);
 extern void WebPInitSamplersSSE41(void);
 extern void WebPInitSamplersMIPS32(void);
@@ -90,16 +91,16 @@
 
   // If defined, use CPUInfo() to overwrite some pointers with faster versions.
   if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       WebPInitSamplersSSE2();
     }
-#endif  // WEBP_USE_SSE2
-#if defined(WEBP_USE_SSE41)
+#endif  // WEBP_HAVE_SSE2
+#if defined(WEBP_HAVE_SSE41)
     if (VP8GetCPUInfo(kSSE4_1)) {
       WebPInitSamplersSSE41();
     }
-#endif  // WEBP_USE_SSE41
+#endif  // WEBP_HAVE_SSE41
 #if defined(WEBP_USE_MIPS32)
     if (VP8GetCPUInfo(kMIPS32)) {
       WebPInitSamplersMIPS32();
@@ -202,50 +203,6 @@
 
 //-----------------------------------------------------------------------------
 
-#if !WEBP_NEON_OMIT_C_CODE
-#define MAX_Y ((1 << 10) - 1)    // 10b precision over 16b-arithmetic
-static uint16_t clip_y(int v) {
-  return (v < 0) ? 0 : (v > MAX_Y) ? MAX_Y : (uint16_t)v;
-}
-
-static uint64_t SharpYUVUpdateY_C(const uint16_t* ref, const uint16_t* src,
-                                  uint16_t* dst, int len) {
-  uint64_t diff = 0;
-  int i;
-  for (i = 0; i < len; ++i) {
-    const int diff_y = ref[i] - src[i];
-    const int new_y = (int)dst[i] + diff_y;
-    dst[i] = clip_y(new_y);
-    diff += (uint64_t)abs(diff_y);
-  }
-  return diff;
-}
-
-static void SharpYUVUpdateRGB_C(const int16_t* ref, const int16_t* src,
-                                int16_t* dst, int len) {
-  int i;
-  for (i = 0; i < len; ++i) {
-    const int diff_uv = ref[i] - src[i];
-    dst[i] += diff_uv;
-  }
-}
-
-static void SharpYUVFilterRow_C(const int16_t* A, const int16_t* B, int len,
-                                const uint16_t* best_y, uint16_t* out) {
-  int i;
-  for (i = 0; i < len; ++i, ++A, ++B) {
-    const int v0 = (A[0] * 9 + A[1] * 3 + B[0] * 3 + B[1] + 8) >> 4;
-    const int v1 = (A[1] * 9 + A[0] * 3 + B[1] * 3 + B[0] + 8) >> 4;
-    out[2 * i + 0] = clip_y(best_y[2 * i + 0] + v0);
-    out[2 * i + 1] = clip_y(best_y[2 * i + 1] + v1);
-  }
-}
-#endif  // !WEBP_NEON_OMIT_C_CODE
-
-#undef MAX_Y
-
-//-----------------------------------------------------------------------------
-
 void (*WebPConvertRGB24ToY)(const uint8_t* rgb, uint8_t* y, int width);
 void (*WebPConvertBGR24ToY)(const uint8_t* bgr, uint8_t* y, int width);
 void (*WebPConvertRGBA32ToUV)(const uint16_t* rgb,
@@ -255,18 +212,9 @@
 void (*WebPConvertARGBToUV)(const uint32_t* argb, uint8_t* u, uint8_t* v,
                             int src_width, int do_store);
 
-uint64_t (*WebPSharpYUVUpdateY)(const uint16_t* ref, const uint16_t* src,
-                                uint16_t* dst, int len);
-void (*WebPSharpYUVUpdateRGB)(const int16_t* ref, const int16_t* src,
-                              int16_t* dst, int len);
-void (*WebPSharpYUVFilterRow)(const int16_t* A, const int16_t* B, int len,
-                              const uint16_t* best_y, uint16_t* out);
-
 extern void WebPInitConvertARGBToYUVSSE2(void);
 extern void WebPInitConvertARGBToYUVSSE41(void);
 extern void WebPInitConvertARGBToYUVNEON(void);
-extern void WebPInitSharpYUVSSE2(void);
-extern void WebPInitSharpYUVNEON(void);
 
 WEBP_DSP_INIT_FUNC(WebPInitConvertARGBToYUV) {
   WebPConvertARGBToY = ConvertARGBToY_C;
@@ -277,40 +225,29 @@
 
   WebPConvertRGBA32ToUV = WebPConvertRGBA32ToUV_C;
 
-#if !WEBP_NEON_OMIT_C_CODE
-  WebPSharpYUVUpdateY = SharpYUVUpdateY_C;
-  WebPSharpYUVUpdateRGB = SharpYUVUpdateRGB_C;
-  WebPSharpYUVFilterRow = SharpYUVFilterRow_C;
-#endif
-
   if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
     if (VP8GetCPUInfo(kSSE2)) {
       WebPInitConvertARGBToYUVSSE2();
-      WebPInitSharpYUVSSE2();
     }
-#endif  // WEBP_USE_SSE2
-#if defined(WEBP_USE_SSE41)
+#endif  // WEBP_HAVE_SSE2
+#if defined(WEBP_HAVE_SSE41)
     if (VP8GetCPUInfo(kSSE4_1)) {
       WebPInitConvertARGBToYUVSSE41();
     }
-#endif  // WEBP_USE_SSE41
+#endif  // WEBP_HAVE_SSE41
   }
 
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
   if (WEBP_NEON_OMIT_C_CODE ||
       (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
     WebPInitConvertARGBToYUVNEON();
-    WebPInitSharpYUVNEON();
   }
-#endif  // WEBP_USE_NEON
+#endif  // WEBP_HAVE_NEON
 
   assert(WebPConvertARGBToY != NULL);
   assert(WebPConvertARGBToUV != NULL);
   assert(WebPConvertRGB24ToY != NULL);
   assert(WebPConvertBGR24ToY != NULL);
   assert(WebPConvertRGBA32ToUV != NULL);
-  assert(WebPSharpYUVUpdateY != NULL);
-  assert(WebPSharpYUVUpdateRGB != NULL);
-  assert(WebPSharpYUVFilterRow != NULL);
 }
diff --git a/third_party/libwebp/src/dsp/yuv.h b/third_party/libwebp/src/dsp/yuv.h
index eb78727..66a397d 100644
--- a/third_party/libwebp/src/dsp/yuv.h
+++ b/third_party/libwebp/src/dsp/yuv.h
@@ -10,7 +10,7 @@
 // inline YUV<->RGB conversion function
 //
 // The exact naming is Y'CbCr, following the ITU-R BT.601 standard.
-// More information at: http://en.wikipedia.org/wiki/YCbCr
+// More information at: https://en.wikipedia.org/wiki/YCbCr
 // Y = 0.2569 * R + 0.5044 * G + 0.0979 * B + 16
 // U = -0.1483 * R - 0.2911 * G + 0.4394 * B + 128
 // V = 0.4394 * R - 0.3679 * G - 0.0715 * B + 128
@@ -207,4 +207,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_DSP_YUV_H_ */
+#endif  // WEBP_DSP_YUV_H_
diff --git a/third_party/libwebp/src/dsp/yuv_neon.c b/third_party/libwebp/src/dsp/yuv_neon.c
index a34d602..ff77b00 100644
--- a/third_party/libwebp/src/dsp/yuv_neon.c
+++ b/third_party/libwebp/src/dsp/yuv_neon.c
@@ -173,116 +173,8 @@
   WebPConvertRGBA32ToUV = ConvertRGBA32ToUV_NEON;
 }
 
-//------------------------------------------------------------------------------
-
-#define MAX_Y ((1 << 10) - 1)    // 10b precision over 16b-arithmetic
-static uint16_t clip_y_NEON(int v) {
-  return (v < 0) ? 0 : (v > MAX_Y) ? MAX_Y : (uint16_t)v;
-}
-
-static uint64_t SharpYUVUpdateY_NEON(const uint16_t* ref, const uint16_t* src,
-                                     uint16_t* dst, int len) {
-  int i;
-  const int16x8_t zero = vdupq_n_s16(0);
-  const int16x8_t max = vdupq_n_s16(MAX_Y);
-  uint64x2_t sum = vdupq_n_u64(0);
-  uint64_t diff;
-
-  for (i = 0; i + 8 <= len; i += 8) {
-    const int16x8_t A = vreinterpretq_s16_u16(vld1q_u16(ref + i));
-    const int16x8_t B = vreinterpretq_s16_u16(vld1q_u16(src + i));
-    const int16x8_t C = vreinterpretq_s16_u16(vld1q_u16(dst + i));
-    const int16x8_t D = vsubq_s16(A, B);       // diff_y
-    const int16x8_t F = vaddq_s16(C, D);       // new_y
-    const uint16x8_t H =
-        vreinterpretq_u16_s16(vmaxq_s16(vminq_s16(F, max), zero));
-    const int16x8_t I = vabsq_s16(D);          // abs(diff_y)
-    vst1q_u16(dst + i, H);
-    sum = vpadalq_u32(sum, vpaddlq_u16(vreinterpretq_u16_s16(I)));
-  }
-  diff = vgetq_lane_u64(sum, 0) + vgetq_lane_u64(sum, 1);
-  for (; i < len; ++i) {
-    const int diff_y = ref[i] - src[i];
-    const int new_y = (int)(dst[i]) + diff_y;
-    dst[i] = clip_y_NEON(new_y);
-    diff += (uint64_t)(abs(diff_y));
-  }
-  return diff;
-}
-
-static void SharpYUVUpdateRGB_NEON(const int16_t* ref, const int16_t* src,
-                                   int16_t* dst, int len) {
-  int i;
-  for (i = 0; i + 8 <= len; i += 8) {
-    const int16x8_t A = vld1q_s16(ref + i);
-    const int16x8_t B = vld1q_s16(src + i);
-    const int16x8_t C = vld1q_s16(dst + i);
-    const int16x8_t D = vsubq_s16(A, B);   // diff_uv
-    const int16x8_t E = vaddq_s16(C, D);   // new_uv
-    vst1q_s16(dst + i, E);
-  }
-  for (; i < len; ++i) {
-    const int diff_uv = ref[i] - src[i];
-    dst[i] += diff_uv;
-  }
-}
-
-static void SharpYUVFilterRow_NEON(const int16_t* A, const int16_t* B, int len,
-                                   const uint16_t* best_y, uint16_t* out) {
-  int i;
-  const int16x8_t max = vdupq_n_s16(MAX_Y);
-  const int16x8_t zero = vdupq_n_s16(0);
-  for (i = 0; i + 8 <= len; i += 8) {
-    const int16x8_t a0 = vld1q_s16(A + i + 0);
-    const int16x8_t a1 = vld1q_s16(A + i + 1);
-    const int16x8_t b0 = vld1q_s16(B + i + 0);
-    const int16x8_t b1 = vld1q_s16(B + i + 1);
-    const int16x8_t a0b1 = vaddq_s16(a0, b1);
-    const int16x8_t a1b0 = vaddq_s16(a1, b0);
-    const int16x8_t a0a1b0b1 = vaddq_s16(a0b1, a1b0);  // A0+A1+B0+B1
-    const int16x8_t a0b1_2 = vaddq_s16(a0b1, a0b1);    // 2*(A0+B1)
-    const int16x8_t a1b0_2 = vaddq_s16(a1b0, a1b0);    // 2*(A1+B0)
-    const int16x8_t c0 = vshrq_n_s16(vaddq_s16(a0b1_2, a0a1b0b1), 3);
-    const int16x8_t c1 = vshrq_n_s16(vaddq_s16(a1b0_2, a0a1b0b1), 3);
-    const int16x8_t d0 = vaddq_s16(c1, a0);
-    const int16x8_t d1 = vaddq_s16(c0, a1);
-    const int16x8_t e0 = vrshrq_n_s16(d0, 1);
-    const int16x8_t e1 = vrshrq_n_s16(d1, 1);
-    const int16x8x2_t f = vzipq_s16(e0, e1);
-    const int16x8_t g0 = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i + 0));
-    const int16x8_t g1 = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i + 8));
-    const int16x8_t h0 = vaddq_s16(g0, f.val[0]);
-    const int16x8_t h1 = vaddq_s16(g1, f.val[1]);
-    const int16x8_t i0 = vmaxq_s16(vminq_s16(h0, max), zero);
-    const int16x8_t i1 = vmaxq_s16(vminq_s16(h1, max), zero);
-    vst1q_u16(out + 2 * i + 0, vreinterpretq_u16_s16(i0));
-    vst1q_u16(out + 2 * i + 8, vreinterpretq_u16_s16(i1));
-  }
-  for (; i < len; ++i) {
-    const int a0b1 = A[i + 0] + B[i + 1];
-    const int a1b0 = A[i + 1] + B[i + 0];
-    const int a0a1b0b1 = a0b1 + a1b0 + 8;
-    const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4;
-    const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4;
-    out[2 * i + 0] = clip_y_NEON(best_y[2 * i + 0] + v0);
-    out[2 * i + 1] = clip_y_NEON(best_y[2 * i + 1] + v1);
-  }
-}
-#undef MAX_Y
-
-//------------------------------------------------------------------------------
-
-extern void WebPInitSharpYUVNEON(void);
-
-WEBP_TSAN_IGNORE_FUNCTION void WebPInitSharpYUVNEON(void) {
-  WebPSharpYUVUpdateY = SharpYUVUpdateY_NEON;
-  WebPSharpYUVUpdateRGB = SharpYUVUpdateRGB_NEON;
-  WebPSharpYUVFilterRow = SharpYUVFilterRow_NEON;
-}
-
 #else  // !WEBP_USE_NEON
 
 WEBP_DSP_INIT_STUB(WebPInitConvertARGBToYUVNEON)
-WEBP_DSP_INIT_STUB(WebPInitSharpYUVNEON)
 
 #endif  // WEBP_USE_NEON
diff --git a/third_party/libwebp/src/dsp/yuv_sse2.c b/third_party/libwebp/src/dsp/yuv_sse2.c
index baa48d5..01a48f9 100644
--- a/third_party/libwebp/src/dsp/yuv_sse2.c
+++ b/third_party/libwebp/src/dsp/yuv_sse2.c
@@ -15,10 +15,12 @@
 
 #if defined(WEBP_USE_SSE2)
 
-#include "src/dsp/common_sse2.h"
 #include <stdlib.h>
 #include <emmintrin.h>
 
+#include "src/dsp/common_sse2.h"
+#include "src/utils/utils.h"
+
 //-----------------------------------------------------------------------------
 // Convert spans of 32 pixels to various RGB formats for the fancy upsampler.
 
@@ -74,7 +76,7 @@
 // Load and replicate the U/V samples
 static WEBP_INLINE __m128i Load_UV_HI_8_SSE2(const uint8_t* src) {
   const __m128i zero = _mm_setzero_si128();
-  const __m128i tmp0 = _mm_cvtsi32_si128(*(const uint32_t*)src);
+  const __m128i tmp0 = _mm_cvtsi32_si128(WebPMemToInt32(src));
   const __m128i tmp1 = _mm_unpacklo_epi8(zero, tmp0);
   return _mm_unpacklo_epi16(tmp1, tmp1);   // replicate samples
 }
@@ -130,7 +132,7 @@
   const __m128i rg0 = _mm_packus_epi16(*B, *A);
   const __m128i ba0 = _mm_packus_epi16(*R, *G);
 #endif
-  const __m128i mask_0xf0 = _mm_set1_epi8(0xf0);
+  const __m128i mask_0xf0 = _mm_set1_epi8((char)0xf0);
   const __m128i rb1 = _mm_unpacklo_epi8(rg0, ba0);  // rbrbrbrbrb...
   const __m128i ga1 = _mm_unpackhi_epi8(rg0, ba0);  // gagagagaga...
   const __m128i rb2 = _mm_and_si128(rb1, mask_0xf0);
@@ -147,9 +149,10 @@
   const __m128i r0 = _mm_packus_epi16(*R, *R);
   const __m128i g0 = _mm_packus_epi16(*G, *G);
   const __m128i b0 = _mm_packus_epi16(*B, *B);
-  const __m128i r1 = _mm_and_si128(r0, _mm_set1_epi8(0xf8));
+  const __m128i r1 = _mm_and_si128(r0, _mm_set1_epi8((char)0xf8));
   const __m128i b1 = _mm_and_si128(_mm_srli_epi16(b0, 3), _mm_set1_epi8(0x1f));
-  const __m128i g1 = _mm_srli_epi16(_mm_and_si128(g0, _mm_set1_epi8(0xe0)), 5);
+  const __m128i g1 =
+      _mm_srli_epi16(_mm_and_si128(g0, _mm_set1_epi8((char)0xe0)), 5);
   const __m128i g2 = _mm_slli_epi16(_mm_and_si128(g0, _mm_set1_epi8(0x1c)), 3);
   const __m128i rg = _mm_or_si128(r1, g1);
   const __m128i gb = _mm_or_si128(g2, b1);
@@ -747,128 +750,9 @@
   WebPConvertRGBA32ToUV = ConvertRGBA32ToUV_SSE2;
 }
 
-//------------------------------------------------------------------------------
-
-#define MAX_Y ((1 << 10) - 1)    // 10b precision over 16b-arithmetic
-static uint16_t clip_y(int v) {
-  return (v < 0) ? 0 : (v > MAX_Y) ? MAX_Y : (uint16_t)v;
-}
-
-static uint64_t SharpYUVUpdateY_SSE2(const uint16_t* ref, const uint16_t* src,
-                                     uint16_t* dst, int len) {
-  uint64_t diff = 0;
-  uint32_t tmp[4];
-  int i;
-  const __m128i zero = _mm_setzero_si128();
-  const __m128i max = _mm_set1_epi16(MAX_Y);
-  const __m128i one = _mm_set1_epi16(1);
-  __m128i sum = zero;
-
-  for (i = 0; i + 8 <= len; i += 8) {
-    const __m128i A = _mm_loadu_si128((const __m128i*)(ref + i));
-    const __m128i B = _mm_loadu_si128((const __m128i*)(src + i));
-    const __m128i C = _mm_loadu_si128((const __m128i*)(dst + i));
-    const __m128i D = _mm_sub_epi16(A, B);       // diff_y
-    const __m128i E = _mm_cmpgt_epi16(zero, D);  // sign (-1 or 0)
-    const __m128i F = _mm_add_epi16(C, D);       // new_y
-    const __m128i G = _mm_or_si128(E, one);      // -1 or 1
-    const __m128i H = _mm_max_epi16(_mm_min_epi16(F, max), zero);
-    const __m128i I = _mm_madd_epi16(D, G);      // sum(abs(...))
-    _mm_storeu_si128((__m128i*)(dst + i), H);
-    sum = _mm_add_epi32(sum, I);
-  }
-  _mm_storeu_si128((__m128i*)tmp, sum);
-  diff = tmp[3] + tmp[2] + tmp[1] + tmp[0];
-  for (; i < len; ++i) {
-    const int diff_y = ref[i] - src[i];
-    const int new_y = (int)dst[i] + diff_y;
-    dst[i] = clip_y(new_y);
-    diff += (uint64_t)abs(diff_y);
-  }
-  return diff;
-}
-
-static void SharpYUVUpdateRGB_SSE2(const int16_t* ref, const int16_t* src,
-                                   int16_t* dst, int len) {
-  int i = 0;
-  for (i = 0; i + 8 <= len; i += 8) {
-    const __m128i A = _mm_loadu_si128((const __m128i*)(ref + i));
-    const __m128i B = _mm_loadu_si128((const __m128i*)(src + i));
-    const __m128i C = _mm_loadu_si128((const __m128i*)(dst + i));
-    const __m128i D = _mm_sub_epi16(A, B);   // diff_uv
-    const __m128i E = _mm_add_epi16(C, D);   // new_uv
-    _mm_storeu_si128((__m128i*)(dst + i), E);
-  }
-  for (; i < len; ++i) {
-    const int diff_uv = ref[i] - src[i];
-    dst[i] += diff_uv;
-  }
-}
-
-static void SharpYUVFilterRow_SSE2(const int16_t* A, const int16_t* B, int len,
-                                   const uint16_t* best_y, uint16_t* out) {
-  int i;
-  const __m128i kCst8 = _mm_set1_epi16(8);
-  const __m128i max = _mm_set1_epi16(MAX_Y);
-  const __m128i zero = _mm_setzero_si128();
-  for (i = 0; i + 8 <= len; i += 8) {
-    const __m128i a0 = _mm_loadu_si128((const __m128i*)(A + i + 0));
-    const __m128i a1 = _mm_loadu_si128((const __m128i*)(A + i + 1));
-    const __m128i b0 = _mm_loadu_si128((const __m128i*)(B + i + 0));
-    const __m128i b1 = _mm_loadu_si128((const __m128i*)(B + i + 1));
-    const __m128i a0b1 = _mm_add_epi16(a0, b1);
-    const __m128i a1b0 = _mm_add_epi16(a1, b0);
-    const __m128i a0a1b0b1 = _mm_add_epi16(a0b1, a1b0);  // A0+A1+B0+B1
-    const __m128i a0a1b0b1_8 = _mm_add_epi16(a0a1b0b1, kCst8);
-    const __m128i a0b1_2 = _mm_add_epi16(a0b1, a0b1);    // 2*(A0+B1)
-    const __m128i a1b0_2 = _mm_add_epi16(a1b0, a1b0);    // 2*(A1+B0)
-    const __m128i c0 = _mm_srai_epi16(_mm_add_epi16(a0b1_2, a0a1b0b1_8), 3);
-    const __m128i c1 = _mm_srai_epi16(_mm_add_epi16(a1b0_2, a0a1b0b1_8), 3);
-    const __m128i d0 = _mm_add_epi16(c1, a0);
-    const __m128i d1 = _mm_add_epi16(c0, a1);
-    const __m128i e0 = _mm_srai_epi16(d0, 1);
-    const __m128i e1 = _mm_srai_epi16(d1, 1);
-    const __m128i f0 = _mm_unpacklo_epi16(e0, e1);
-    const __m128i f1 = _mm_unpackhi_epi16(e0, e1);
-    const __m128i g0 = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 0));
-    const __m128i g1 = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 8));
-    const __m128i h0 = _mm_add_epi16(g0, f0);
-    const __m128i h1 = _mm_add_epi16(g1, f1);
-    const __m128i i0 = _mm_max_epi16(_mm_min_epi16(h0, max), zero);
-    const __m128i i1 = _mm_max_epi16(_mm_min_epi16(h1, max), zero);
-    _mm_storeu_si128((__m128i*)(out + 2 * i + 0), i0);
-    _mm_storeu_si128((__m128i*)(out + 2 * i + 8), i1);
-  }
-  for (; i < len; ++i) {
-    //   (9 * A0 + 3 * A1 + 3 * B0 + B1 + 8) >> 4 =
-    // = (8 * A0 + 2 * (A1 + B0) + (A0 + A1 + B0 + B1 + 8)) >> 4
-    // We reuse the common sub-expressions.
-    const int a0b1 = A[i + 0] + B[i + 1];
-    const int a1b0 = A[i + 1] + B[i + 0];
-    const int a0a1b0b1 = a0b1 + a1b0 + 8;
-    const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4;
-    const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4;
-    out[2 * i + 0] = clip_y(best_y[2 * i + 0] + v0);
-    out[2 * i + 1] = clip_y(best_y[2 * i + 1] + v1);
-  }
-}
-
-#undef MAX_Y
-
-//------------------------------------------------------------------------------
-
-extern void WebPInitSharpYUVSSE2(void);
-
-WEBP_TSAN_IGNORE_FUNCTION void WebPInitSharpYUVSSE2(void) {
-  WebPSharpYUVUpdateY = SharpYUVUpdateY_SSE2;
-  WebPSharpYUVUpdateRGB = SharpYUVUpdateRGB_SSE2;
-  WebPSharpYUVFilterRow = SharpYUVFilterRow_SSE2;
-}
-
 #else  // !WEBP_USE_SSE2
 
 WEBP_DSP_INIT_STUB(WebPInitSamplersSSE2)
 WEBP_DSP_INIT_STUB(WebPInitConvertARGBToYUVSSE2)
-WEBP_DSP_INIT_STUB(WebPInitSharpYUVSSE2)
 
 #endif  // WEBP_USE_SSE2
diff --git a/third_party/libwebp/src/dsp/yuv_sse41.c b/third_party/libwebp/src/dsp/yuv_sse41.c
index 579d1f7..f79b802 100644
--- a/third_party/libwebp/src/dsp/yuv_sse41.c
+++ b/third_party/libwebp/src/dsp/yuv_sse41.c
@@ -15,10 +15,12 @@
 
 #if defined(WEBP_USE_SSE41)
 
-#include "src/dsp/common_sse41.h"
 #include <stdlib.h>
 #include <smmintrin.h>
 
+#include "src/dsp/common_sse41.h"
+#include "src/utils/utils.h"
+
 //-----------------------------------------------------------------------------
 // Convert spans of 32 pixels to various RGB formats for the fancy upsampler.
 
@@ -74,7 +76,7 @@
 // Load and replicate the U/V samples
 static WEBP_INLINE __m128i Load_UV_HI_8_SSE41(const uint8_t* src) {
   const __m128i zero = _mm_setzero_si128();
-  const __m128i tmp0 = _mm_cvtsi32_si128(*(const uint32_t*)src);
+  const __m128i tmp0 = _mm_cvtsi32_si128(WebPMemToInt32(src));
   const __m128i tmp1 = _mm_unpacklo_epi8(zero, tmp0);
   return _mm_unpacklo_epi16(tmp1, tmp1);   // replicate samples
 }
diff --git a/third_party/libwebp/src/enc/Makefile.am b/third_party/libwebp/src/enc/Makefile.am
index 27d5228..2fec804 100644
--- a/third_party/libwebp/src/enc/Makefile.am
+++ b/third_party/libwebp/src/enc/Makefile.am
@@ -37,6 +37,7 @@
 noinst_HEADERS =
 noinst_HEADERS += ../webp/format_constants.h
 
+libwebpencode_la_LIBADD = ../../sharpyuv/libsharpyuv.la
 libwebpencode_la_LDFLAGS = -lm
 libwebpencode_la_CPPFLAGS = $(AM_CPPFLAGS)
 libwebpencodeincludedir = $(includedir)/webp
diff --git a/third_party/libwebp/src/enc/alpha_enc.c b/third_party/libwebp/src/enc/alpha_enc.c
index dce9ca9..26f0034 100644
--- a/third_party/libwebp/src/enc/alpha_enc.c
+++ b/third_party/libwebp/src/enc/alpha_enc.c
@@ -13,6 +13,7 @@
 
 #include <assert.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include "src/enc/vp8i_enc.h"
 #include "src/dsp/dsp.h"
@@ -86,7 +87,7 @@
   // a decoder bug related to alpha with color cache.
   // See: https://code.google.com/p/webp/issues/detail?id=239
   // Need to re-enable this later.
-  ok = (VP8LEncodeStream(&config, &picture, bw, 0 /*use_cache*/) == VP8_ENC_OK);
+  ok = VP8LEncodeStream(&config, &picture, bw, /*use_cache=*/0);
   WebPPictureFree(&picture);
   ok = ok && !bw->error_;
   if (!ok) {
@@ -140,6 +141,11 @@
                               !reduce_levels, &tmp_bw, &result->stats);
     if (ok) {
       output = VP8LBitWriterFinish(&tmp_bw);
+      if (tmp_bw.error_) {
+        VP8LBitWriterWipeOut(&tmp_bw);
+        memset(&result->bw, 0, sizeof(result->bw));
+        return 0;
+      }
       output_size = VP8LBitWriterNumBytes(&tmp_bw);
       if (output_size > data_size) {
         // compressed size is larger than source! Revert to uncompressed mode.
@@ -148,6 +154,7 @@
       }
     } else {
       VP8LBitWriterWipeOut(&tmp_bw);
+      memset(&result->bw, 0, sizeof(result->bw));
       return 0;
     }
   }
@@ -162,7 +169,7 @@
   header = method | (filter << 2);
   if (reduce_levels) header |= ALPHA_PREPROCESSED_LEVELS << 4;
 
-  VP8BitWriterInit(&result->bw, ALPHA_HEADER_LEN + output_size);
+  if (!VP8BitWriterInit(&result->bw, ALPHA_HEADER_LEN + output_size)) ok = 0;
   ok = ok && VP8BitWriterAppend(&result->bw, &header, ALPHA_HEADER_LEN);
   ok = ok && VP8BitWriterAppend(&result->bw, output, output_size);
 
@@ -303,7 +310,7 @@
   int ok = 1;
   const int reduce_levels = (quality < 100);
 
-  // quick sanity checks
+  // quick correctness checks
   assert((uint64_t)data_size == (uint64_t)width * height);  // as per spec
   assert(enc != NULL && pic != NULL && pic->a != NULL);
   assert(output != NULL && output_size != NULL);
@@ -312,11 +319,11 @@
   assert(filter >= WEBP_FILTER_NONE && filter <= WEBP_FILTER_FAST);
 
   if (quality < 0 || quality > 100) {
-    return 0;
+    return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION);
   }
 
   if (method < ALPHA_NO_COMPRESSION || method > ALPHA_LOSSLESS_COMPRESSION) {
-    return 0;
+    return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION);
   }
 
   if (method == ALPHA_NO_COMPRESSION) {
@@ -326,7 +333,7 @@
 
   quant_alpha = (uint8_t*)WebPSafeMalloc(1ULL, data_size);
   if (quant_alpha == NULL) {
-    return 0;
+    return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
   }
 
   // Extract alpha data (width x height) from raw_data (stride x height).
@@ -346,6 +353,9 @@
     ok = ApplyFiltersAndEncode(quant_alpha, width, height, data_size, method,
                                filter, reduce_levels, effort_level, output,
                                output_size, pic->stats);
+    if (!ok) {
+      WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);  // imprecise
+    }
 #if !defined(WEBP_DISABLE_STATS)
     if (pic->stats != NULL) {  // need stats?
       pic->stats->coded_size += (int)(*output_size);
@@ -361,7 +371,7 @@
 //------------------------------------------------------------------------------
 // Main calls
 
-static int CompressAlphaJob(void* arg1, void* dummy) {
+static int CompressAlphaJob(void* arg1, void* unused) {
   VP8Encoder* const enc = (VP8Encoder*)arg1;
   const WebPConfig* config = enc->config_;
   uint8_t* alpha_data = NULL;
@@ -375,13 +385,13 @@
                    filter, effort_level, &alpha_data, &alpha_size)) {
     return 0;
   }
-  if (alpha_size != (uint32_t)alpha_size) {  // Sanity check.
+  if (alpha_size != (uint32_t)alpha_size) {  // Soundness check.
     WebPSafeFree(alpha_data);
     return 0;
   }
   enc->alpha_data_size_ = (uint32_t)alpha_size;
   enc->alpha_data_ = alpha_data;
-  (void)dummy;
+  (void)unused;
   return 1;
 }
 
@@ -405,7 +415,7 @@
       WebPWorker* const worker = &enc->alpha_worker_;
       // Makes sure worker is good to go.
       if (!WebPGetWorkerInterface()->Reset(worker)) {
-        return 0;
+        return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
       }
       WebPGetWorkerInterface()->Launch(worker);
       return 1;
diff --git a/third_party/libwebp/src/enc/analysis_enc.c b/third_party/libwebp/src/enc/analysis_enc.c
index a47ff7d..962eaa9 100644
--- a/third_party/libwebp/src/enc/analysis_enc.c
+++ b/third_party/libwebp/src/enc/analysis_enc.c
@@ -126,16 +126,6 @@
   histo->last_non_zero = 1;
 }
 
-static void MergeHistograms(const VP8Histogram* const in,
-                            VP8Histogram* const out) {
-  if (in->max_value > out->max_value) {
-    out->max_value = in->max_value;
-  }
-  if (in->last_non_zero > out->last_non_zero) {
-    out->last_non_zero = in->last_non_zero;
-  }
-}
-
 //------------------------------------------------------------------------------
 // Simplified k-Means, to assign Nb segments based on alpha-histogram
 
@@ -285,49 +275,6 @@
   return 0;
 }
 
-static int MBAnalyzeBestIntra4Mode(VP8EncIterator* const it,
-                                   int best_alpha) {
-  uint8_t modes[16];
-  const int max_mode = MAX_INTRA4_MODE;
-  int i4_alpha;
-  VP8Histogram total_histo;
-  int cur_histo = 0;
-  InitHistogram(&total_histo);
-
-  VP8IteratorStartI4(it);
-  do {
-    int mode;
-    int best_mode_alpha = DEFAULT_ALPHA;
-    VP8Histogram histos[2];
-    const uint8_t* const src = it->yuv_in_ + Y_OFF_ENC + VP8Scan[it->i4_];
-
-    VP8MakeIntra4Preds(it);
-    for (mode = 0; mode < max_mode; ++mode) {
-      int alpha;
-
-      InitHistogram(&histos[cur_histo]);
-      VP8CollectHistogram(src, it->yuv_p_ + VP8I4ModeOffsets[mode],
-                          0, 1, &histos[cur_histo]);
-      alpha = GetAlpha(&histos[cur_histo]);
-      if (IS_BETTER_ALPHA(alpha, best_mode_alpha)) {
-        best_mode_alpha = alpha;
-        modes[it->i4_] = mode;
-        cur_histo ^= 1;   // keep track of best histo so far.
-      }
-    }
-    // accumulate best histogram
-    MergeHistograms(&histos[cur_histo ^ 1], &total_histo);
-    // Note: we reuse the original samples for predictors
-  } while (VP8IteratorRotateI4(it, it->yuv_in_ + Y_OFF_ENC));
-
-  i4_alpha = GetAlpha(&total_histo);
-  if (IS_BETTER_ALPHA(i4_alpha, best_alpha)) {
-    VP8SetIntra4Mode(it, modes);
-    best_alpha = i4_alpha;
-  }
-  return best_alpha;
-}
-
 static int MBAnalyzeBestUVMode(VP8EncIterator* const it) {
   int best_alpha = DEFAULT_ALPHA;
   int smallest_alpha = 0;
@@ -371,13 +318,6 @@
     best_alpha = FastMBAnalyze(it);
   } else {
     best_alpha = MBAnalyzeBestIntra16Mode(it);
-    if (enc->method_ >= 5) {
-      // We go and make a fast decision for intra4/intra16.
-      // It's usually not a good and definitive pick, but helps seeding the
-      // stats about level bit-cost.
-      // TODO(skal): improve criterion.
-      best_alpha = MBAnalyzeBestIntra4Mode(it, best_alpha);
-    }
   }
   best_uv_alpha = MBAnalyzeBestUVMode(it);
 
@@ -451,14 +391,16 @@
   return ok;
 }
 
+#ifdef WEBP_USE_THREAD
 static void MergeJobs(const SegmentJob* const src, SegmentJob* const dst) {
   int i;
   for (i = 0; i <= MAX_ALPHA; ++i) dst->alphas[i] += src->alphas[i];
   dst->alpha += src->alpha;
   dst->uv_alpha += src->uv_alpha;
 }
+#endif
 
-// initialize the job struct with some TODOs
+// initialize the job struct with some tasks to perform
 static void InitSegmentJob(VP8Encoder* const enc, SegmentJob* const job,
                            int start_row, int end_row) {
   WebPGetWorkerInterface()->Init(&job->worker);
@@ -485,10 +427,10 @@
       (enc->method_ <= 1);  // for method 0 - 1, we need preds_[] to be filled.
   if (do_segments) {
     const int last_row = enc->mb_h_;
-    // We give a little more than a half work to the main thread.
-    const int split_row = (9 * last_row + 15) >> 4;
     const int total_mb = last_row * enc->mb_w_;
 #ifdef WEBP_USE_THREAD
+    // We give a little more than a half work to the main thread.
+    const int split_row = (9 * last_row + 15) >> 4;
     const int kMinSplitRow = 2;  // minimal rows needed for mt to be worth it
     const int do_mt = (enc->thread_level_ > 0) && (split_row >= kMinSplitRow);
 #else
@@ -498,6 +440,7 @@
         WebPGetWorkerInterface();
     SegmentJob main_job;
     if (do_mt) {
+#ifdef WEBP_USE_THREAD
       SegmentJob side_job;
       // Note the use of '&' instead of '&&' because we must call the functions
       // no matter what.
@@ -515,6 +458,7 @@
       }
       worker_interface->End(&side_job.worker);
       if (ok) MergeJobs(&side_job, &main_job);  // merge results together
+#endif  // WEBP_USE_THREAD
     } else {
       // Even for single-thread case, we use the generic Worker tools.
       InitSegmentJob(enc, &main_job, 0, last_row);
@@ -530,6 +474,10 @@
   } else {   // Use only one default segment.
     ResetAllMBInfo(enc);
   }
+  if (!ok) {
+    return WebPEncodingSetError(enc->pic_,
+                                VP8_ENC_ERROR_OUT_OF_MEMORY);  // imprecise
+  }
   return ok;
 }
 
diff --git a/third_party/libwebp/src/enc/backward_references_cost_enc.c b/third_party/libwebp/src/enc/backward_references_cost_enc.c
index 7175496..6968ef3 100644
--- a/third_party/libwebp/src/enc/backward_references_cost_enc.c
+++ b/third_party/libwebp/src/enc/backward_references_cost_enc.c
@@ -15,10 +15,11 @@
 //
 
 #include <assert.h>
+#include <float.h>
 
+#include "src/dsp/lossless_common.h"
 #include "src/enc/backward_references_enc.h"
 #include "src/enc/histogram_enc.h"
-#include "src/dsp/lossless_common.h"
 #include "src/utils/color_cache_utils.h"
 #include "src/utils/utils.h"
 
@@ -30,15 +31,15 @@
                                       const PixOrCopy v);
 
 typedef struct {
-  double alpha_[VALUES_IN_BYTE];
-  double red_[VALUES_IN_BYTE];
-  double blue_[VALUES_IN_BYTE];
-  double distance_[NUM_DISTANCE_CODES];
-  double* literal_;
+  float alpha_[VALUES_IN_BYTE];
+  float red_[VALUES_IN_BYTE];
+  float blue_[VALUES_IN_BYTE];
+  float distance_[NUM_DISTANCE_CODES];
+  float* literal_;
 } CostModel;
 
 static void ConvertPopulationCountTableToBitEstimates(
-    int num_symbols, const uint32_t population_counts[], double output[]) {
+    int num_symbols, const uint32_t population_counts[], float output[]) {
   uint32_t sum = 0;
   int nonzeros = 0;
   int i;
@@ -51,7 +52,7 @@
   if (nonzeros <= 1) {
     memset(output, 0, num_symbols * sizeof(*output));
   } else {
-    const double logsum = VP8LFastLog2(sum);
+    const float logsum = VP8LFastLog2(sum);
     for (i = 0; i < num_symbols; ++i) {
       output[i] = logsum - VP8LFastLog2(population_counts[i]);
     }
@@ -67,7 +68,7 @@
 
   // The following code is similar to VP8LHistogramCreate but converts the
   // distance to plane code.
-  VP8LHistogramInit(histo, cache_bits);
+  VP8LHistogramInit(histo, cache_bits, /*init_arrays=*/ 1);
   while (VP8LRefsCursorOk(&c)) {
     VP8LHistogramAddSinglePixOrCopy(histo, c.cur_pos, VP8LDistanceToPlaneCode,
                                     xsize);
@@ -75,8 +76,8 @@
   }
 
   ConvertPopulationCountTableToBitEstimates(
-      VP8LHistogramNumCodes(histo->palette_code_bits_),
-      histo->literal_, m->literal_);
+      VP8LHistogramNumCodes(histo->palette_code_bits_), histo->literal_,
+      m->literal_);
   ConvertPopulationCountTableToBitEstimates(
       VALUES_IN_BYTE, histo->red_, m->red_);
   ConvertPopulationCountTableToBitEstimates(
@@ -92,27 +93,27 @@
   return ok;
 }
 
-static WEBP_INLINE double GetLiteralCost(const CostModel* const m, uint32_t v) {
+static WEBP_INLINE float GetLiteralCost(const CostModel* const m, uint32_t v) {
   return m->alpha_[v >> 24] +
          m->red_[(v >> 16) & 0xff] +
          m->literal_[(v >> 8) & 0xff] +
          m->blue_[v & 0xff];
 }
 
-static WEBP_INLINE double GetCacheCost(const CostModel* const m, uint32_t idx) {
+static WEBP_INLINE float GetCacheCost(const CostModel* const m, uint32_t idx) {
   const int literal_idx = VALUES_IN_BYTE + NUM_LENGTH_CODES + idx;
   return m->literal_[literal_idx];
 }
 
-static WEBP_INLINE double GetLengthCost(const CostModel* const m,
-                                        uint32_t length) {
+static WEBP_INLINE float GetLengthCost(const CostModel* const m,
+                                       uint32_t length) {
   int code, extra_bits;
   VP8LPrefixEncodeBits(length, &code, &extra_bits);
   return m->literal_[VALUES_IN_BYTE + code] + extra_bits;
 }
 
-static WEBP_INLINE double GetDistanceCost(const CostModel* const m,
-                                          uint32_t distance) {
+static WEBP_INLINE float GetDistanceCost(const CostModel* const m,
+                                         uint32_t distance) {
   int code, extra_bits;
   VP8LPrefixEncodeBits(distance, &code, &extra_bits);
   return m->distance_[code] + extra_bits;
@@ -122,20 +123,20 @@
     const uint32_t* const argb, VP8LColorCache* const hashers,
     const CostModel* const cost_model, int idx, int use_color_cache,
     float prev_cost, float* const cost, uint16_t* const dist_array) {
-  double cost_val = prev_cost;
+  float cost_val = prev_cost;
   const uint32_t color = argb[idx];
   const int ix = use_color_cache ? VP8LColorCacheContains(hashers, color) : -1;
   if (ix >= 0) {
     // use_color_cache is true and hashers contains color
-    const double mul0 = 0.68;
+    const float mul0 = 0.68f;
     cost_val += GetCacheCost(cost_model, ix) * mul0;
   } else {
-    const double mul1 = 0.82;
+    const float mul1 = 0.82f;
     if (use_color_cache) VP8LColorCacheInsert(hashers, color);
     cost_val += GetLiteralCost(cost_model, color) * mul1;
   }
   if (cost[idx] > cost_val) {
-    cost[idx] = (float)cost_val;
+    cost[idx] = cost_val;
     dist_array[idx] = 1;  // only one is inserted.
   }
 }
@@ -172,7 +173,7 @@
 
 // The GetLengthCost(cost_model, k) are cached in a CostCacheInterval.
 typedef struct {
-  double cost_;
+  float cost_;
   int start_;
   int end_;       // Exclusive.
 } CostCacheInterval;
@@ -187,7 +188,7 @@
   int count_;  // The number of stored intervals.
   CostCacheInterval* cache_intervals_;
   size_t cache_intervals_size_;
-  double cost_cache_[MAX_LENGTH];  // Contains the GetLengthCost(cost_model, k).
+  float cost_cache_[MAX_LENGTH];  // Contains the GetLengthCost(cost_model, k).
   float* costs_;
   uint16_t* dist_array_;
   // Most of the time, we only need few intervals -> use a free-list, to avoid
@@ -262,10 +263,13 @@
   CostManagerInitFreeList(manager);
 
   // Fill in the cost_cache_.
-  manager->cache_intervals_size_ = 1;
-  manager->cost_cache_[0] = GetLengthCost(cost_model, 0);
-  for (i = 1; i < cost_cache_size; ++i) {
+  // Has to be done in two passes due to a GCC bug on i686
+  // related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=323
+  for (i = 0; i < cost_cache_size; ++i) {
     manager->cost_cache_[i] = GetLengthCost(cost_model, i);
+  }
+  manager->cache_intervals_size_ = 1;
+  for (i = 1; i < cost_cache_size; ++i) {
     // Get the number of bound intervals.
     if (manager->cost_cache_[i] != manager->cost_cache_[i - 1]) {
       ++manager->cache_intervals_size_;
@@ -294,7 +298,7 @@
     cur->end_ = 1;
     cur->cost_ = manager->cost_cache_[0];
     for (i = 1; i < cost_cache_size; ++i) {
-      const double cost_val = manager->cost_cache_[i];
+      const float cost_val = manager->cost_cache_[i];
       if (cost_val != cur->cost_) {
         ++cur;
         // Initialize an interval.
@@ -303,6 +307,8 @@
       }
       cur->end_ = i + 1;
     }
+    assert((size_t)(cur - manager->cache_intervals_) + 1 ==
+           manager->cache_intervals_size_);
   }
 
   manager->costs_ = (float*)WebPSafeMalloc(pix_count, sizeof(*manager->costs_));
@@ -311,7 +317,7 @@
     return 0;
   }
   // Set the initial costs_ high for every pixel as we will keep the minimum.
-  for (i = 0; i < pix_count; ++i) manager->costs_[i] = 1e38f;
+  for (i = 0; i < pix_count; ++i) manager->costs_[i] = FLT_MAX;
 
   return 1;
 }
@@ -457,7 +463,7 @@
 // If handling the interval or one of its subintervals becomes to heavy, its
 // contribution is added to the costs right away.
 static WEBP_INLINE void PushInterval(CostManager* const manager,
-                                     double distance_cost, int position,
+                                     float distance_cost, int position,
                                      int len) {
   size_t i;
   CostInterval* interval = manager->head_;
@@ -474,7 +480,7 @@
       const int k = j - position;
       float cost_tmp;
       assert(k >= 0 && k < MAX_LENGTH);
-      cost_tmp = (float)(distance_cost + manager->cost_cache_[k]);
+      cost_tmp = distance_cost + manager->cost_cache_[k];
 
       if (manager->costs_[j] > cost_tmp) {
         manager->costs_[j] = cost_tmp;
@@ -492,7 +498,7 @@
     const int end = position + (cost_cache_intervals[i].end_ > len
                                  ? len
                                  : cost_cache_intervals[i].end_);
-    const float cost = (float)(distance_cost + cost_cache_intervals[i].cost_);
+    const float cost = distance_cost + cost_cache_intervals[i].cost_;
 
     for (; interval != NULL && interval->start_ < end;
          interval = interval_next) {
@@ -570,22 +576,21 @@
   const int pix_count = xsize * ysize;
   const int use_color_cache = (cache_bits > 0);
   const size_t literal_array_size =
-      sizeof(double) * (NUM_LITERAL_CODES + NUM_LENGTH_CODES +
-                        ((cache_bits > 0) ? (1 << cache_bits) : 0));
+      sizeof(float) * (VP8LHistogramNumCodes(cache_bits));
   const size_t cost_model_size = sizeof(CostModel) + literal_array_size;
   CostModel* const cost_model =
       (CostModel*)WebPSafeCalloc(1ULL, cost_model_size);
   VP8LColorCache hashers;
   CostManager* cost_manager =
-      (CostManager*)WebPSafeMalloc(1ULL, sizeof(*cost_manager));
+      (CostManager*)WebPSafeCalloc(1ULL, sizeof(*cost_manager));
   int offset_prev = -1, len_prev = -1;
-  double offset_cost = -1;
+  float offset_cost = -1.f;
   int first_offset_is_constant = -1;  // initialized with 'impossible' value
   int reach = 0;
 
   if (cost_model == NULL || cost_manager == NULL) goto Error;
 
-  cost_model->literal_ = (double*)(cost_model + 1);
+  cost_model->literal_ = (float*)(cost_model + 1);
   if (use_color_cache) {
     cc_init = VP8LColorCacheInit(&hashers, cache_bits);
     if (!cc_init) goto Error;
@@ -675,7 +680,7 @@
   }
 
   ok = !refs->error_;
-Error:
+ Error:
   if (cc_init) VP8LColorCacheClear(&hashers);
   CostManagerClear(cost_manager);
   WebPSafeFree(cost_model);
diff --git a/third_party/libwebp/src/enc/backward_references_enc.c b/third_party/libwebp/src/enc/backward_references_enc.c
index 3923018..dc98bf1 100644
--- a/third_party/libwebp/src/enc/backward_references_enc.c
+++ b/third_party/libwebp/src/enc/backward_references_enc.c
@@ -10,16 +10,20 @@
 // Author: Jyrki Alakuijala (jyrki@google.com)
 //
 
+#include "src/enc/backward_references_enc.h"
+
 #include <assert.h>
+#include <float.h>
 #include <math.h>
 
-#include "src/enc/backward_references_enc.h"
-#include "src/enc/histogram_enc.h"
+#include "src/dsp/dsp.h"
 #include "src/dsp/lossless.h"
 #include "src/dsp/lossless_common.h"
-#include "src/dsp/dsp.h"
+#include "src/enc/histogram_enc.h"
+#include "src/enc/vp8i_enc.h"
 #include "src/utils/color_cache_utils.h"
 #include "src/utils/utils.h"
+#include "src/webp/encode.h"
 
 #define MIN_BLOCK_SIZE 256  // minimum block size for backward references
 
@@ -103,6 +107,20 @@
   }
 }
 
+// Swaps the content of two VP8LBackwardRefs.
+static void BackwardRefsSwap(VP8LBackwardRefs* const refs1,
+                             VP8LBackwardRefs* const refs2) {
+  const int point_to_refs1 =
+      (refs1->tail_ != NULL && refs1->tail_ == &refs1->refs_);
+  const int point_to_refs2 =
+      (refs2->tail_ != NULL && refs2->tail_ == &refs2->refs_);
+  const VP8LBackwardRefs tmp = *refs1;
+  *refs1 = *refs2;
+  *refs2 = tmp;
+  if (point_to_refs2) refs1->tail_ = &refs1->refs_;
+  if (point_to_refs1) refs2->tail_ = &refs2->refs_;
+}
+
 void VP8LBackwardRefsInit(VP8LBackwardRefs* const refs, int block_size) {
   assert(refs != NULL);
   memset(refs, 0, sizeof(*refs));
@@ -154,6 +172,22 @@
   return b;
 }
 
+// Return 1 on success, 0 on error.
+static int BackwardRefsClone(const VP8LBackwardRefs* const from,
+                             VP8LBackwardRefs* const to) {
+  const PixOrCopyBlock* block_from = from->refs_;
+  VP8LClearBackwardRefs(to);
+  while (block_from != NULL) {
+    PixOrCopyBlock* const block_to = BackwardRefsNewBlock(to);
+    if (block_to == NULL) return 0;
+    memcpy(block_to->start_, block_from->start_,
+           block_from->size_ * sizeof(PixOrCopy));
+    block_to->size_ = block_from->size_;
+    block_from = block_from->next_;
+  }
+  return 1;
+}
+
 extern void VP8LBackwardRefsCursorAdd(VP8LBackwardRefs* const refs,
                                       const PixOrCopy v);
 void VP8LBackwardRefsCursorAdd(VP8LBackwardRefs* const refs,
@@ -191,13 +225,14 @@
 
 // -----------------------------------------------------------------------------
 
-#define HASH_MULTIPLIER_HI (0xc6a4a793ULL)
-#define HASH_MULTIPLIER_LO (0x5bd1e996ULL)
+static const uint32_t kHashMultiplierHi = 0xc6a4a793u;
+static const uint32_t kHashMultiplierLo = 0x5bd1e996u;
 
-static WEBP_INLINE uint32_t GetPixPairHash64(const uint32_t* const argb) {
+static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE
+uint32_t GetPixPairHash64(const uint32_t* const argb) {
   uint32_t key;
-  key  = (argb[1] * HASH_MULTIPLIER_HI) & 0xffffffffu;
-  key += (argb[0] * HASH_MULTIPLIER_LO) & 0xffffffffu;
+  key  = argb[1] * kHashMultiplierHi;
+  key += argb[0] * kHashMultiplierLo;
   key = key >> (32 - HASH_BITS);
   return key;
 }
@@ -223,10 +258,13 @@
 
 int VP8LHashChainFill(VP8LHashChain* const p, int quality,
                       const uint32_t* const argb, int xsize, int ysize,
-                      int low_effort) {
+                      int low_effort, const WebPPicture* const pic,
+                      int percent_range, int* const percent) {
   const int size = xsize * ysize;
   const int iter_max = GetMaxItersForQuality(quality);
   const uint32_t window_size = GetWindowSizeForHashChain(quality, xsize);
+  int remaining_percent = percent_range;
+  int percent_start = *percent;
   int pos;
   int argb_comp;
   uint32_t base_position;
@@ -244,7 +282,12 @@
 
   hash_to_first_index =
       (int32_t*)WebPSafeMalloc(HASH_SIZE, sizeof(*hash_to_first_index));
-  if (hash_to_first_index == NULL) return 0;
+  if (hash_to_first_index == NULL) {
+    return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+  }
+
+  percent_range = remaining_percent / 2;
+  remaining_percent -= percent_range;
 
   // Set the int32_t array to -1.
   memset(hash_to_first_index, 0xff, HASH_SIZE * sizeof(*hash_to_first_index));
@@ -291,12 +334,22 @@
       hash_to_first_index[hash_code] = pos++;
       argb_comp = argb_comp_next;
     }
+
+    if (!WebPReportProgress(
+            pic, percent_start + percent_range * pos / (size - 2), percent)) {
+      WebPSafeFree(hash_to_first_index);
+      return 0;
+    }
   }
   // Process the penultimate pixel.
   chain[pos] = hash_to_first_index[GetPixPairHash64(argb + pos)];
 
   WebPSafeFree(hash_to_first_index);
 
+  percent_start += percent_range;
+  if (!WebPReportProgress(pic, percent_start, percent)) return 0;
+  percent_range = remaining_percent;
+
   // Find the best match interval at each pixel, defined by an offset to the
   // pixel and a length. The right-most pixel cannot match anything to the right
   // (hence a best length of 0) and the left-most pixel nothing to the left
@@ -385,8 +438,17 @@
         max_base_position = base_position;
       }
     }
+
+    if (!WebPReportProgress(pic,
+                            percent_start + percent_range *
+                                                (size - 2 - base_position) /
+                                                (size - 2),
+                            percent)) {
+      return 0;
+    }
   }
-  return 1;
+
+  return WebPReportProgress(pic, percent_start + percent_range, percent);
 }
 
 static WEBP_INLINE void AddSingleLiteral(uint32_t pixel, int use_color_cache,
@@ -696,7 +758,7 @@
                                   int* const best_cache_bits) {
   int i;
   const int cache_bits_max = (quality <= 25) ? 0 : *best_cache_bits;
-  double entropy_min = MAX_ENTROPY;
+  float entropy_min = MAX_ENTROPY;
   int cc_init[MAX_COLOR_CACHE_BITS + 1] = { 0 };
   VP8LColorCache hashers[MAX_COLOR_CACHE_BITS + 1];
   VP8LRefsCursor c = VP8LRefsCursorInit(refs);
@@ -715,6 +777,7 @@
   for (i = 0; i <= cache_bits_max; ++i) {
     histos[i] = VP8LAllocateHistogram(i);
     if (histos[i] == NULL) goto Error;
+    VP8LHistogramInit(histos[i], i, /*init_arrays=*/ 1);
     if (i == 0) continue;
     cc_init[i] = VP8LColorCacheInit(&hashers[i], i);
     if (!cc_init[i]) goto Error;
@@ -751,12 +814,18 @@
         }
       }
     } else {
+      int code, extra_bits, extra_bits_value;
       // We should compute the contribution of the (distance,length)
       // histograms but those are the same independently from the cache size.
       // As those constant contributions are in the end added to the other
-      // histogram contributions, we can safely ignore them.
+      // histogram contributions, we can ignore them, except for the length
+      // prefix that is part of the literal_ histogram.
       int len = PixOrCopyLength(v);
       uint32_t argb_prev = *argb ^ 0xffffffffu;
+      VP8LPrefixEncode(len, &code, &extra_bits, &extra_bits_value);
+      for (i = 0; i <= cache_bits_max; ++i) {
+        ++histos[i]->literal_[NUM_LITERAL_CODES + code];
+      }
       // Update the color caches.
       do {
         if (*argb != argb_prev) {
@@ -774,14 +843,14 @@
   }
 
   for (i = 0; i <= cache_bits_max; ++i) {
-    const double entropy = VP8LHistogramEstimateBits(histos[i]);
+    const float entropy = VP8LHistogramEstimateBits(histos[i]);
     if (i == 0 || entropy < entropy_min) {
       entropy_min = entropy;
       *best_cache_bits = i;
     }
   }
   ok = 1;
-Error:
+ Error:
   for (i = 0; i <= cache_bits_max; ++i) {
     if (cc_init[i]) VP8LColorCacheClear(&hashers[i]);
     VP8LFreeHistogram(histos[i]);
@@ -840,16 +909,21 @@
     int xsize, int ysize, const uint32_t* const argb, int cache_bits,
     const VP8LHashChain* const hash_chain,
     const VP8LBackwardRefs* const refs_src, VP8LBackwardRefs* const refs_dst);
-static VP8LBackwardRefs* GetBackwardReferences(
-    int width, int height, const uint32_t* const argb, int quality,
-    int lz77_types_to_try, int* const cache_bits,
-    const VP8LHashChain* const hash_chain, VP8LBackwardRefs* best,
-    VP8LBackwardRefs* worst) {
-  const int cache_bits_initial = *cache_bits;
-  double bit_cost_best = -1;
+static int GetBackwardReferences(int width, int height,
+                                 const uint32_t* const argb, int quality,
+                                 int lz77_types_to_try, int cache_bits_max,
+                                 int do_no_cache,
+                                 const VP8LHashChain* const hash_chain,
+                                 VP8LBackwardRefs* const refs,
+                                 int* const cache_bits_best) {
   VP8LHistogram* histo = NULL;
-  int lz77_type, lz77_type_best = 0;
+  int i, lz77_type;
+  // Index 0 is for a color cache, index 1 for no cache (if needed).
+  int lz77_types_best[2] = {0, 0};
+  float bit_costs_best[2] = {FLT_MAX, FLT_MAX};
   VP8LHashChain hash_chain_box;
+  VP8LBackwardRefs* const refs_tmp = &refs[do_no_cache ? 2 : 1];
+  int status = 0;
   memset(&hash_chain_box, 0, sizeof(hash_chain_box));
 
   histo = VP8LAllocateHistogram(MAX_COLOR_CACHE_BITS);
@@ -858,86 +932,134 @@
   for (lz77_type = 1; lz77_types_to_try;
        lz77_types_to_try &= ~lz77_type, lz77_type <<= 1) {
     int res = 0;
-    double bit_cost;
-    int cache_bits_tmp = cache_bits_initial;
+    float bit_cost = 0.f;
     if ((lz77_types_to_try & lz77_type) == 0) continue;
     switch (lz77_type) {
       case kLZ77RLE:
-        res = BackwardReferencesRle(width, height, argb, 0, worst);
+        res = BackwardReferencesRle(width, height, argb, 0, refs_tmp);
         break;
       case kLZ77Standard:
         // Compute LZ77 with no cache (0 bits), as the ideal LZ77 with a color
         // cache is not that different in practice.
-        res = BackwardReferencesLz77(width, height, argb, 0, hash_chain, worst);
+        res = BackwardReferencesLz77(width, height, argb, 0, hash_chain,
+                                     refs_tmp);
         break;
       case kLZ77Box:
         if (!VP8LHashChainInit(&hash_chain_box, width * height)) goto Error;
         res = BackwardReferencesLz77Box(width, height, argb, 0, hash_chain,
-                                        &hash_chain_box, worst);
+                                        &hash_chain_box, refs_tmp);
         break;
       default:
         assert(0);
     }
     if (!res) goto Error;
 
-    // Next, try with a color cache and update the references.
-    if (!CalculateBestCacheSize(argb, quality, worst, &cache_bits_tmp)) {
-      goto Error;
-    }
-    if (cache_bits_tmp > 0) {
-      if (!BackwardRefsWithLocalCache(argb, cache_bits_tmp, worst)) {
-        goto Error;
+    // Start with the no color cache case.
+    for (i = 1; i >= 0; --i) {
+      int cache_bits = (i == 1) ? 0 : cache_bits_max;
+
+      if (i == 1 && !do_no_cache) continue;
+
+      if (i == 0) {
+        // Try with a color cache.
+        if (!CalculateBestCacheSize(argb, quality, refs_tmp, &cache_bits)) {
+          goto Error;
+        }
+        if (cache_bits > 0) {
+          if (!BackwardRefsWithLocalCache(argb, cache_bits, refs_tmp)) {
+            goto Error;
+          }
+        }
+      }
+
+      if (i == 0 && do_no_cache && cache_bits == 0) {
+        // No need to re-compute bit_cost as it was computed at i == 1.
+      } else {
+        VP8LHistogramCreate(histo, refs_tmp, cache_bits);
+        bit_cost = VP8LHistogramEstimateBits(histo);
+      }
+
+      if (bit_cost < bit_costs_best[i]) {
+        if (i == 1) {
+          // Do not swap as the full cache analysis would have the wrong
+          // VP8LBackwardRefs to start with.
+          if (!BackwardRefsClone(refs_tmp, &refs[1])) goto Error;
+        } else {
+          BackwardRefsSwap(refs_tmp, &refs[0]);
+        }
+        bit_costs_best[i] = bit_cost;
+        lz77_types_best[i] = lz77_type;
+        if (i == 0) *cache_bits_best = cache_bits;
       }
     }
-
-    // Keep the best backward references.
-    VP8LHistogramCreate(histo, worst, cache_bits_tmp);
-    bit_cost = VP8LHistogramEstimateBits(histo);
-    if (lz77_type_best == 0 || bit_cost < bit_cost_best) {
-      VP8LBackwardRefs* const tmp = worst;
-      worst = best;
-      best = tmp;
-      bit_cost_best = bit_cost;
-      *cache_bits = cache_bits_tmp;
-      lz77_type_best = lz77_type;
-    }
   }
-  assert(lz77_type_best > 0);
+  assert(lz77_types_best[0] > 0);
+  assert(!do_no_cache || lz77_types_best[1] > 0);
 
   // Improve on simple LZ77 but only for high quality (TraceBackwards is
   // costly).
-  if ((lz77_type_best == kLZ77Standard || lz77_type_best == kLZ77Box) &&
-      quality >= 25) {
-    const VP8LHashChain* const hash_chain_tmp =
-        (lz77_type_best == kLZ77Standard) ? hash_chain : &hash_chain_box;
-    if (VP8LBackwardReferencesTraceBackwards(width, height, argb, *cache_bits,
-                                             hash_chain_tmp, best, worst)) {
-      double bit_cost_trace;
-      VP8LHistogramCreate(histo, worst, *cache_bits);
+  for (i = 1; i >= 0; --i) {
+    if (i == 1 && !do_no_cache) continue;
+    if ((lz77_types_best[i] == kLZ77Standard ||
+         lz77_types_best[i] == kLZ77Box) &&
+        quality >= 25) {
+      const VP8LHashChain* const hash_chain_tmp =
+          (lz77_types_best[i] == kLZ77Standard) ? hash_chain : &hash_chain_box;
+      const int cache_bits = (i == 1) ? 0 : *cache_bits_best;
+      float bit_cost_trace;
+      if (!VP8LBackwardReferencesTraceBackwards(width, height, argb, cache_bits,
+                                                hash_chain_tmp, &refs[i],
+                                                refs_tmp)) {
+        goto Error;
+      }
+      VP8LHistogramCreate(histo, refs_tmp, cache_bits);
       bit_cost_trace = VP8LHistogramEstimateBits(histo);
-      if (bit_cost_trace < bit_cost_best) best = worst;
+      if (bit_cost_trace < bit_costs_best[i]) {
+        BackwardRefsSwap(refs_tmp, &refs[i]);
+      }
+    }
+
+    BackwardReferences2DLocality(width, &refs[i]);
+
+    if (i == 1 && lz77_types_best[0] == lz77_types_best[1] &&
+        *cache_bits_best == 0) {
+      // If the best cache size is 0 and we have the same best LZ77, just copy
+      // the data over and stop here.
+      if (!BackwardRefsClone(&refs[1], &refs[0])) goto Error;
+      break;
+    }
+  }
+  status = 1;
+
+ Error:
+  VP8LHashChainClear(&hash_chain_box);
+  VP8LFreeHistogram(histo);
+  return status;
+}
+
+int VP8LGetBackwardReferences(
+    int width, int height, const uint32_t* const argb, int quality,
+    int low_effort, int lz77_types_to_try, int cache_bits_max, int do_no_cache,
+    const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs,
+    int* const cache_bits_best, const WebPPicture* const pic, int percent_range,
+    int* const percent) {
+  if (low_effort) {
+    VP8LBackwardRefs* refs_best;
+    *cache_bits_best = cache_bits_max;
+    refs_best = GetBackwardReferencesLowEffort(
+        width, height, argb, cache_bits_best, hash_chain, refs);
+    if (refs_best == NULL) {
+      return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+    }
+    // Set it in first position.
+    BackwardRefsSwap(refs_best, &refs[0]);
+  } else {
+    if (!GetBackwardReferences(width, height, argb, quality, lz77_types_to_try,
+                               cache_bits_max, do_no_cache, hash_chain, refs,
+                               cache_bits_best)) {
+      return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
     }
   }
 
-  BackwardReferences2DLocality(width, best);
-
-Error:
-  VP8LHashChainClear(&hash_chain_box);
-  VP8LFreeHistogram(histo);
-  return best;
-}
-
-VP8LBackwardRefs* VP8LGetBackwardReferences(
-    int width, int height, const uint32_t* const argb, int quality,
-    int low_effort, int lz77_types_to_try, int* const cache_bits,
-    const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs_tmp1,
-    VP8LBackwardRefs* const refs_tmp2) {
-  if (low_effort) {
-    return GetBackwardReferencesLowEffort(width, height, argb, cache_bits,
-                                          hash_chain, refs_tmp1);
-  } else {
-    return GetBackwardReferences(width, height, argb, quality,
-                                 lz77_types_to_try, cache_bits, hash_chain,
-                                 refs_tmp1, refs_tmp2);
-  }
+  return WebPReportProgress(pic, *percent + percent_range, percent);
 }
diff --git a/third_party/libwebp/src/enc/backward_references_enc.h b/third_party/libwebp/src/enc/backward_references_enc.h
index a99eac7..1689be2 100644
--- a/third_party/libwebp/src/enc/backward_references_enc.h
+++ b/third_party/libwebp/src/enc/backward_references_enc.h
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 #endif
 #include "src/webp/types.h"
+#include "src/webp/encode.h"
 #include "src/webp/format_constants.h"
 
 #ifdef __cplusplus
@@ -137,10 +138,11 @@
 
 // Must be called first, to set size.
 int VP8LHashChainInit(VP8LHashChain* const p, int size);
-// Pre-compute the best matches for argb.
+// Pre-compute the best matches for argb. pic and percent are for progress.
 int VP8LHashChainFill(VP8LHashChain* const p, int quality,
                       const uint32_t* const argb, int xsize, int ysize,
-                      int low_effort);
+                      int low_effort, const WebPPicture* const pic,
+                      int percent_range, int* const percent);
 void VP8LHashChainClear(VP8LHashChain* const p);  // release memory
 
 static WEBP_INLINE int VP8LHashChainFindOffset(const VP8LHashChain* const p,
@@ -222,14 +224,22 @@
 // Evaluates best possible backward references for specified quality.
 // The input cache_bits to 'VP8LGetBackwardReferences' sets the maximum cache
 // bits to use (passing 0 implies disabling the local color cache).
-// The optimal cache bits is evaluated and set for the *cache_bits parameter.
-// The return value is the pointer to the best of the two backward refs viz,
-// refs[0] or refs[1].
-VP8LBackwardRefs* VP8LGetBackwardReferences(
+// The optimal cache bits is evaluated and set for the *cache_bits_best
+// parameter with the matching refs_best.
+// If do_no_cache == 0, refs is an array of 2 values and the best
+// VP8LBackwardRefs is put in the first element.
+// If do_no_cache != 0, refs is an array of 3 values and the best
+// VP8LBackwardRefs is put in the first element, the best value with no-cache in
+// the second element.
+// In both cases, the last element is used as temporary internally.
+// pic and percent are for progress.
+// Returns false in case of error (stored in pic->error_code).
+int VP8LGetBackwardReferences(
     int width, int height, const uint32_t* const argb, int quality,
-    int low_effort, int lz77_types_to_try, int* const cache_bits,
-    const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs_tmp1,
-    VP8LBackwardRefs* const refs_tmp2);
+    int low_effort, int lz77_types_to_try, int cache_bits_max, int do_no_cache,
+    const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs,
+    int* const cache_bits_best, const WebPPicture* const pic, int percent_range,
+    int* const percent);
 
 #ifdef __cplusplus
 }
diff --git a/third_party/libwebp/src/enc/config_enc.c b/third_party/libwebp/src/enc/config_enc.c
index 9d48289..3518b41 100644
--- a/third_party/libwebp/src/enc/config_enc.c
+++ b/third_party/libwebp/src/enc/config_enc.c
@@ -39,6 +39,8 @@
   config->partitions = 0;
   config->segments = 4;
   config->pass = 1;
+  config->qmin = 0;
+  config->qmax = 100;
   config->show_compressed = 0;
   config->preprocessing = 0;
   config->autofilter = 0;
@@ -106,6 +108,9 @@
   if (config->filter_type < 0 || config->filter_type > 1) return 0;
   if (config->autofilter < 0 || config->autofilter > 1) return 0;
   if (config->pass < 1 || config->pass > 10) return 0;
+  if (config->qmin < 0 || config->qmax > 100 || config->qmin > config->qmax) {
+    return 0;
+  }
   if (config->show_compressed < 0 || config->show_compressed > 1) return 0;
   if (config->preprocessing < 0 || config->preprocessing > 7) return 0;
   if (config->partitions < 0 || config->partitions > 3) return 0;
diff --git a/third_party/libwebp/src/enc/cost_enc.h b/third_party/libwebp/src/enc/cost_enc.h
index ba51ddd..cf594bc 100644
--- a/third_party/libwebp/src/enc/cost_enc.h
+++ b/third_party/libwebp/src/enc/cost_enc.h
@@ -84,4 +84,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_ENC_COST_ENC_H_ */
+#endif  // WEBP_ENC_COST_ENC_H_
diff --git a/third_party/libwebp/src/enc/frame_enc.c b/third_party/libwebp/src/enc/frame_enc.c
index 20bc99f..3c96774 100644
--- a/third_party/libwebp/src/enc/frame_enc.c
+++ b/third_party/libwebp/src/enc/frame_enc.c
@@ -37,10 +37,15 @@
 // we allow 2k of extra head-room in PARTITION0 limit.
 #define PARTITION0_SIZE_LIMIT ((VP8_MAX_PARTITION0_SIZE - 2048ULL) << 11)
 
+static float Clamp(float v, float min, float max) {
+  return (v < min) ? min : (v > max) ? max : v;
+}
+
 typedef struct {  // struct for organizing convergence in either size or PSNR
   int is_first;
   float dq;
   float q, last_q;
+  float qmin, qmax;
   double value, last_value;   // PSNR or size
   double target;
   int do_size_search;
@@ -53,7 +58,9 @@
 
   s->is_first = 1;
   s->dq = 10.f;
-  s->q = s->last_q = enc->config_->quality;
+  s->qmin = 1.f * enc->config_->qmin;
+  s->qmax = 1.f * enc->config_->qmax;
+  s->q = s->last_q = Clamp(enc->config_->quality, s->qmin, s->qmax);
   s->target = do_size_search ? (double)target_size
             : (target_PSNR > 0.) ? target_PSNR
             : 40.;   // default, just in case
@@ -62,10 +69,6 @@
   return do_size_search;
 }
 
-static float Clamp(float v, float min, float max) {
-  return (v < min) ? min : (v > max) ? max : v;
-}
-
 static float ComputeNextQ(PassStats* const s) {
   float dq;
   if (s->is_first) {
@@ -81,7 +84,7 @@
   s->dq = Clamp(dq, -30.f, 30.f);
   s->last_q = s->q;
   s->last_value = s->value;
-  s->q = Clamp(s->q + s->dq, 0.f, 100.f);
+  s->q = Clamp(s->q + s->dq, s->qmin, s->qmax);
   return s->q;
 }
 
@@ -692,7 +695,7 @@
   }
   if (!ok) {
     VP8EncFreeBitWriters(enc);  // malloc error occurred
-    WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
+    return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
   }
   return ok;
 }
@@ -722,6 +725,7 @@
   } else {
     // Something bad happened -> need to do some memory cleanup.
     VP8EncFreeBitWriters(enc);
+    return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
   }
   return ok;
 }
@@ -757,6 +761,11 @@
     // *then* decide how to code the skip decision if there's one.
     if (!VP8Decimate(&it, &info, rd_opt) || dont_use_skip) {
       CodeResiduals(it.bw_, &it, &info);
+      if (it.bw_->error_) {
+        // enc->pic_->error_code is set in PostLoopFinalize().
+        ok = 0;
+        break;
+      }
     } else {   // reset predictors after a skip
       ResetAfterSkip(&it);
     }
@@ -781,6 +790,7 @@
   // Roughly refresh the proba eight times per pass
   int max_count = (enc->mb_w_ * enc->mb_h_) >> 3;
   int num_pass_left = enc->config_->pass;
+  int remaining_progress = 40;  // percents
   const int do_search = enc->do_search_;
   VP8EncIterator it;
   VP8EncProba* const proba = &enc->proba_;
@@ -808,6 +818,9 @@
     uint64_t size_p0 = 0;
     uint64_t distortion = 0;
     int cnt = max_count;
+    // The final number of passes is not trivial to know in advance.
+    const int pass_progress = remaining_progress / (2 + num_pass_left);
+    remaining_progress -= pass_progress;
     VP8IteratorInit(enc, &it);
     SetLoopParams(enc, stats.q);
     if (is_last_pass) {
@@ -835,7 +848,7 @@
         StoreSideInfo(&it);
         VP8StoreFilterStats(&it);
         VP8IteratorExport(&it);
-        ok = VP8IteratorProgress(&it, 20);
+        ok = VP8IteratorProgress(&it, pass_progress);
       }
       VP8IteratorSaveBoundary(&it);
     } while (ok && VP8IteratorNext(&it));
@@ -854,9 +867,10 @@
     }
 
 #if (DEBUG_SEARCH > 0)
-    printf("#%2d metric:%.1lf -> %.1lf   last_q=%.2lf q=%.2lf dq=%.2lf\n",
+    printf("#%2d metric:%.1lf -> %.1lf   last_q=%.2lf q=%.2lf dq=%.2lf "
+           " range:[%.1f, %.1f]\n",
            num_pass_left, stats.last_value, stats.value,
-           stats.last_q, stats.q, stats.dq);
+           stats.last_q, stats.q, stats.dq, stats.qmin, stats.qmax);
 #endif
     if (enc->max_i4_header_bits_ > 0 && size_p0 > PARTITION0_SIZE_LIMIT) {
       ++num_pass_left;
@@ -880,7 +894,8 @@
     ok = VP8EmitTokens(&enc->tokens_, enc->parts_ + 0,
                        (const uint8_t*)proba->coeffs_, 1);
   }
-  ok = ok && WebPReportProgress(enc->pic_, enc->percent_ + 20, &enc->percent_);
+  ok = ok && WebPReportProgress(enc->pic_, enc->percent_ + remaining_progress,
+                                &enc->percent_);
   return PostLoopFinalize(&it, ok);
 }
 
diff --git a/third_party/libwebp/src/enc/histogram_enc.c b/third_party/libwebp/src/enc/histogram_enc.c
index ce1a1bd..d11255d 100644
--- a/third_party/libwebp/src/enc/histogram_enc.c
+++ b/third_party/libwebp/src/enc/histogram_enc.c
@@ -13,19 +13,21 @@
 #include "src/webp/config.h"
 #endif
 
+#include <float.h>
 #if defined(STARBOARD)
 #include "starboard/client_porting/poem/assert_poem.h"
 #else
 #include <math.h>
 #endif
 
-#include "src/enc/backward_references_enc.h"
-#include "src/enc/histogram_enc.h"
 #include "src/dsp/lossless.h"
 #include "src/dsp/lossless_common.h"
+#include "src/enc/backward_references_enc.h"
+#include "src/enc/histogram_enc.h"
+#include "src/enc/vp8i_enc.h"
 #include "src/utils/utils.h"
 
-#define MAX_COST 1.e38
+#define MAX_BIT_COST FLT_MAX
 
 // Number of partitions for the three dominant (literal, red and blue) symbol
 // costs.
@@ -55,10 +57,12 @@
                           VP8LHistogram* const dst) {
   uint32_t* const dst_literal = dst->literal_;
   const int dst_cache_bits = dst->palette_code_bits_;
+  const int literal_size = VP8LHistogramNumCodes(dst_cache_bits);
   const int histo_size = VP8LGetHistogramSize(dst_cache_bits);
   assert(src->palette_code_bits_ == dst_cache_bits);
   memcpy(dst, src, histo_size);
   dst->literal_ = dst_literal;
+  memcpy(dst->literal_, src->literal_, literal_size * sizeof(*dst->literal_));
 }
 
 int VP8LGetHistogramSize(int cache_bits) {
@@ -95,9 +99,19 @@
   VP8LHistogramStoreRefs(refs, p);
 }
 
-void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits) {
+void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits,
+                       int init_arrays) {
   p->palette_code_bits_ = palette_code_bits;
-  HistogramClear(p);
+  if (init_arrays) {
+    HistogramClear(p);
+  } else {
+    p->trivial_symbol_ = 0;
+    p->bit_cost_ = 0.;
+    p->literal_cost_ = 0.;
+    p->red_cost_ = 0.;
+    p->blue_cost_ = 0.;
+    memset(p->is_used_, 0, sizeof(p->is_used_));
+  }
 }
 
 VP8LHistogram* VP8LAllocateHistogram(int cache_bits) {
@@ -108,37 +122,84 @@
   histo = (VP8LHistogram*)memory;
   // literal_ won't necessary be aligned.
   histo->literal_ = (uint32_t*)(memory + sizeof(VP8LHistogram));
-  VP8LHistogramInit(histo, cache_bits);
+  VP8LHistogramInit(histo, cache_bits, /*init_arrays=*/ 0);
   return histo;
 }
 
+// Resets the pointers of the histograms to point to the bit buffer in the set.
+static void HistogramSetResetPointers(VP8LHistogramSet* const set,
+                                      int cache_bits) {
+  int i;
+  const int histo_size = VP8LGetHistogramSize(cache_bits);
+  uint8_t* memory = (uint8_t*) (set->histograms);
+  memory += set->max_size * sizeof(*set->histograms);
+  for (i = 0; i < set->max_size; ++i) {
+    memory = (uint8_t*) WEBP_ALIGN(memory);
+    set->histograms[i] = (VP8LHistogram*) memory;
+    // literal_ won't necessary be aligned.
+    set->histograms[i]->literal_ = (uint32_t*)(memory + sizeof(VP8LHistogram));
+    memory += histo_size;
+  }
+}
+
+// Returns the total size of the VP8LHistogramSet.
+static size_t HistogramSetTotalSize(int size, int cache_bits) {
+  const int histo_size = VP8LGetHistogramSize(cache_bits);
+  return (sizeof(VP8LHistogramSet) + size * (sizeof(VP8LHistogram*) +
+          histo_size + WEBP_ALIGN_CST));
+}
+
 VP8LHistogramSet* VP8LAllocateHistogramSet(int size, int cache_bits) {
   int i;
   VP8LHistogramSet* set;
-  const int histo_size = VP8LGetHistogramSize(cache_bits);
-  const size_t total_size =
-      sizeof(*set) + size * (sizeof(*set->histograms) +
-      histo_size + WEBP_ALIGN_CST);
+  const size_t total_size = HistogramSetTotalSize(size, cache_bits);
   uint8_t* memory = (uint8_t*)WebPSafeMalloc(total_size, sizeof(*memory));
   if (memory == NULL) return NULL;
 
   set = (VP8LHistogramSet*)memory;
   memory += sizeof(*set);
   set->histograms = (VP8LHistogram**)memory;
-  memory += size * sizeof(*set->histograms);
   set->max_size = size;
   set->size = size;
+  HistogramSetResetPointers(set, cache_bits);
   for (i = 0; i < size; ++i) {
-    memory = (uint8_t*)WEBP_ALIGN(memory);
-    set->histograms[i] = (VP8LHistogram*)memory;
-    // literal_ won't necessary be aligned.
-    set->histograms[i]->literal_ = (uint32_t*)(memory + sizeof(VP8LHistogram));
-    VP8LHistogramInit(set->histograms[i], cache_bits);
-    memory += histo_size;
+    VP8LHistogramInit(set->histograms[i], cache_bits, /*init_arrays=*/ 0);
   }
   return set;
 }
 
+void VP8LHistogramSetClear(VP8LHistogramSet* const set) {
+  int i;
+  const int cache_bits = set->histograms[0]->palette_code_bits_;
+  const int size = set->max_size;
+  const size_t total_size = HistogramSetTotalSize(size, cache_bits);
+  uint8_t* memory = (uint8_t*)set;
+
+  memset(memory, 0, total_size);
+  memory += sizeof(*set);
+  set->histograms = (VP8LHistogram**)memory;
+  set->max_size = size;
+  set->size = size;
+  HistogramSetResetPointers(set, cache_bits);
+  for (i = 0; i < size; ++i) {
+    set->histograms[i]->palette_code_bits_ = cache_bits;
+  }
+}
+
+// Removes the histogram 'i' from 'set' by setting it to NULL.
+static void HistogramSetRemoveHistogram(VP8LHistogramSet* const set, int i,
+                                        int* const num_used) {
+  assert(set->histograms[i] != NULL);
+  set->histograms[i] = NULL;
+  --*num_used;
+  // If we remove the last valid one, shrink until the next valid one.
+  if (i == set->size - 1) {
+    while (set->size >= 1 && set->histograms[set->size - 1] == NULL) {
+      --set->size;
+    }
+  }
+}
+
 // -----------------------------------------------------------------------------
 
 void VP8LHistogramAddSinglePixOrCopy(VP8LHistogram* const histo,
@@ -153,6 +214,7 @@
   } else if (PixOrCopyIsCacheIdx(v)) {
     const int literal_ix =
         NUM_LITERAL_CODES + NUM_LENGTH_CODES + PixOrCopyCacheIdx(v);
+    assert(histo->palette_code_bits_ != 0);
     ++histo->literal_[literal_ix];
   } else {
     int code, extra_bits;
@@ -172,8 +234,8 @@
 // -----------------------------------------------------------------------------
 // Entropy-related functions.
 
-static WEBP_INLINE double BitsEntropyRefine(const VP8LBitEntropy* entropy) {
-  double mix;
+static WEBP_INLINE float BitsEntropyRefine(const VP8LBitEntropy* entropy) {
+  float mix;
   if (entropy->nonzeros < 5) {
     if (entropy->nonzeros <= 1) {
       return 0;
@@ -182,66 +244,67 @@
     // Let's mix in a bit of entropy to favor good clustering when
     // distributions of these are combined.
     if (entropy->nonzeros == 2) {
-      return 0.99 * entropy->sum + 0.01 * entropy->entropy;
+      return 0.99f * entropy->sum + 0.01f * entropy->entropy;
     }
     // No matter what the entropy says, we cannot be better than min_limit
     // with Huffman coding. I am mixing a bit of entropy into the
     // min_limit since it produces much better (~0.5 %) compression results
     // perhaps because of better entropy clustering.
     if (entropy->nonzeros == 3) {
-      mix = 0.95;
+      mix = 0.95f;
     } else {
-      mix = 0.7;  // nonzeros == 4.
+      mix = 0.7f;  // nonzeros == 4.
     }
   } else {
-    mix = 0.627;
+    mix = 0.627f;
   }
 
   {
-    double min_limit = 2 * entropy->sum - entropy->max_val;
-    min_limit = mix * min_limit + (1.0 - mix) * entropy->entropy;
+    float min_limit = 2.f * entropy->sum - entropy->max_val;
+    min_limit = mix * min_limit + (1.f - mix) * entropy->entropy;
     return (entropy->entropy < min_limit) ? min_limit : entropy->entropy;
   }
 }
 
-double VP8LBitsEntropy(const uint32_t* const array, int n) {
+float VP8LBitsEntropy(const uint32_t* const array, int n) {
   VP8LBitEntropy entropy;
   VP8LBitsEntropyUnrefined(array, n, &entropy);
 
   return BitsEntropyRefine(&entropy);
 }
 
-static double InitialHuffmanCost(void) {
+static float InitialHuffmanCost(void) {
   // Small bias because Huffman code length is typically not stored in
   // full length.
   static const int kHuffmanCodeOfHuffmanCodeSize = CODE_LENGTH_CODES * 3;
-  static const double kSmallBias = 9.1;
+  static const float kSmallBias = 9.1f;
   return kHuffmanCodeOfHuffmanCodeSize - kSmallBias;
 }
 
 // Finalize the Huffman cost based on streak numbers and length type (<3 or >=3)
-static double FinalHuffmanCost(const VP8LStreaks* const stats) {
+static float FinalHuffmanCost(const VP8LStreaks* const stats) {
   // The constants in this function are experimental and got rounded from
   // their original values in 1/8 when switched to 1/1024.
-  double retval = InitialHuffmanCost();
+  float retval = InitialHuffmanCost();
   // Second coefficient: Many zeros in the histogram are covered efficiently
   // by a run-length encode. Originally 2/8.
-  retval += stats->counts[0] * 1.5625 + 0.234375 * stats->streaks[0][1];
+  retval += stats->counts[0] * 1.5625f + 0.234375f * stats->streaks[0][1];
   // Second coefficient: Constant values are encoded less efficiently, but still
   // RLE'ed. Originally 6/8.
-  retval += stats->counts[1] * 2.578125 + 0.703125 * stats->streaks[1][1];
+  retval += stats->counts[1] * 2.578125f + 0.703125f * stats->streaks[1][1];
   // 0s are usually encoded more efficiently than non-0s.
   // Originally 15/8.
-  retval += 1.796875 * stats->streaks[0][0];
+  retval += 1.796875f * stats->streaks[0][0];
   // Originally 26/8.
-  retval += 3.28125 * stats->streaks[1][0];
+  retval += 3.28125f * stats->streaks[1][0];
   return retval;
 }
 
 // Get the symbol entropy for the distribution 'population'.
 // Set 'trivial_sym', if there's only one symbol present in the distribution.
-static double PopulationCost(const uint32_t* const population, int length,
-                             uint32_t* const trivial_sym) {
+static float PopulationCost(const uint32_t* const population, int length,
+                            uint32_t* const trivial_sym,
+                            uint8_t* const is_used) {
   VP8LBitEntropy bit_entropy;
   VP8LStreaks stats;
   VP8LGetEntropyUnrefined(population, length, &bit_entropy, &stats);
@@ -249,15 +312,18 @@
     *trivial_sym = (bit_entropy.nonzeros == 1) ? bit_entropy.nonzero_code
                                                : VP8L_NON_TRIVIAL_SYM;
   }
+  // The histogram is used if there is at least one non-zero streak.
+  *is_used = (stats.streaks[1][0] != 0 || stats.streaks[1][1] != 0);
 
   return BitsEntropyRefine(&bit_entropy) + FinalHuffmanCost(&stats);
 }
 
 // trivial_at_end is 1 if the two histograms only have one element that is
 // non-zero: both the zero-th one, or both the last one.
-static WEBP_INLINE double GetCombinedEntropy(const uint32_t* const X,
-                                             const uint32_t* const Y,
-                                             int length, int trivial_at_end) {
+static WEBP_INLINE float GetCombinedEntropy(const uint32_t* const X,
+                                            const uint32_t* const Y, int length,
+                                            int is_X_used, int is_Y_used,
+                                            int trivial_at_end) {
   VP8LStreaks stats;
   if (trivial_at_end) {
     // This configuration is due to palettization that transforms an indexed
@@ -266,28 +332,43 @@
     // Only FinalHuffmanCost needs to be evaluated.
     memset(&stats, 0, sizeof(stats));
     // Deal with the non-zero value at index 0 or length-1.
-    stats.streaks[1][0] += 1;
+    stats.streaks[1][0] = 1;
     // Deal with the following/previous zero streak.
-    stats.counts[0] += 1;
-    stats.streaks[0][1] += length - 1;
+    stats.counts[0] = 1;
+    stats.streaks[0][1] = length - 1;
     return FinalHuffmanCost(&stats);
   } else {
     VP8LBitEntropy bit_entropy;
-    VP8LGetCombinedEntropyUnrefined(X, Y, length, &bit_entropy, &stats);
+    if (is_X_used) {
+      if (is_Y_used) {
+        VP8LGetCombinedEntropyUnrefined(X, Y, length, &bit_entropy, &stats);
+      } else {
+        VP8LGetEntropyUnrefined(X, length, &bit_entropy, &stats);
+      }
+    } else {
+      if (is_Y_used) {
+        VP8LGetEntropyUnrefined(Y, length, &bit_entropy, &stats);
+      } else {
+        memset(&stats, 0, sizeof(stats));
+        stats.counts[0] = 1;
+        stats.streaks[0][length > 3] = length;
+        VP8LBitEntropyInit(&bit_entropy);
+      }
+    }
 
     return BitsEntropyRefine(&bit_entropy) + FinalHuffmanCost(&stats);
   }
 }
 
 // Estimates the Entropy + Huffman + other block overhead size cost.
-double VP8LHistogramEstimateBits(const VP8LHistogram* const p) {
+float VP8LHistogramEstimateBits(VP8LHistogram* const p) {
   return
-      PopulationCost(
-          p->literal_, VP8LHistogramNumCodes(p->palette_code_bits_), NULL)
-      + PopulationCost(p->red_, NUM_LITERAL_CODES, NULL)
-      + PopulationCost(p->blue_, NUM_LITERAL_CODES, NULL)
-      + PopulationCost(p->alpha_, NUM_LITERAL_CODES, NULL)
-      + PopulationCost(p->distance_, NUM_DISTANCE_CODES, NULL)
+      PopulationCost(p->literal_, VP8LHistogramNumCodes(p->palette_code_bits_),
+                     NULL, &p->is_used_[0])
+      + PopulationCost(p->red_, NUM_LITERAL_CODES, NULL, &p->is_used_[1])
+      + PopulationCost(p->blue_, NUM_LITERAL_CODES, NULL, &p->is_used_[2])
+      + PopulationCost(p->alpha_, NUM_LITERAL_CODES, NULL, &p->is_used_[3])
+      + PopulationCost(p->distance_, NUM_DISTANCE_CODES, NULL, &p->is_used_[4])
       + VP8LExtraCost(p->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES)
       + VP8LExtraCost(p->distance_, NUM_DISTANCE_CODES);
 }
@@ -297,13 +378,13 @@
 
 static int GetCombinedHistogramEntropy(const VP8LHistogram* const a,
                                        const VP8LHistogram* const b,
-                                       double cost_threshold,
-                                       double* cost) {
+                                       float cost_threshold, float* cost) {
   const int palette_code_bits = a->palette_code_bits_;
   int trivial_at_end = 0;
   assert(a->palette_code_bits_ == b->palette_code_bits_);
   *cost += GetCombinedEntropy(a->literal_, b->literal_,
-                              VP8LHistogramNumCodes(palette_code_bits), 0);
+                              VP8LHistogramNumCodes(palette_code_bits),
+                              a->is_used_[0], b->is_used_[0], 0);
   *cost += VP8LExtraCostCombined(a->literal_ + NUM_LITERAL_CODES,
                                  b->literal_ + NUM_LITERAL_CODES,
                                  NUM_LENGTH_CODES);
@@ -323,19 +404,23 @@
   }
 
   *cost +=
-      GetCombinedEntropy(a->red_, b->red_, NUM_LITERAL_CODES, trivial_at_end);
+      GetCombinedEntropy(a->red_, b->red_, NUM_LITERAL_CODES, a->is_used_[1],
+                         b->is_used_[1], trivial_at_end);
   if (*cost > cost_threshold) return 0;
 
   *cost +=
-      GetCombinedEntropy(a->blue_, b->blue_, NUM_LITERAL_CODES, trivial_at_end);
-  if (*cost > cost_threshold) return 0;
-
-  *cost += GetCombinedEntropy(a->alpha_, b->alpha_, NUM_LITERAL_CODES,
-                              trivial_at_end);
+      GetCombinedEntropy(a->blue_, b->blue_, NUM_LITERAL_CODES, a->is_used_[2],
+                         b->is_used_[2], trivial_at_end);
   if (*cost > cost_threshold) return 0;
 
   *cost +=
-      GetCombinedEntropy(a->distance_, b->distance_, NUM_DISTANCE_CODES, 0);
+      GetCombinedEntropy(a->alpha_, b->alpha_, NUM_LITERAL_CODES,
+                         a->is_used_[3], b->is_used_[3], trivial_at_end);
+  if (*cost > cost_threshold) return 0;
+
+  *cost +=
+      GetCombinedEntropy(a->distance_, b->distance_, NUM_DISTANCE_CODES,
+                         a->is_used_[4], b->is_used_[4], 0);
   *cost +=
       VP8LExtraCostCombined(a->distance_, b->distance_, NUM_DISTANCE_CODES);
   if (*cost > cost_threshold) return 0;
@@ -358,12 +443,11 @@
 // Since the previous score passed is 'cost_threshold', we only need to compare
 // the partial cost against 'cost_threshold + C(a) + C(b)' to possibly bail-out
 // early.
-static double HistogramAddEval(const VP8LHistogram* const a,
-                               const VP8LHistogram* const b,
-                               VP8LHistogram* const out,
-                               double cost_threshold) {
-  double cost = 0;
-  const double sum_cost = a->bit_cost_ + b->bit_cost_;
+static float HistogramAddEval(const VP8LHistogram* const a,
+                              const VP8LHistogram* const b,
+                              VP8LHistogram* const out, float cost_threshold) {
+  float cost = 0;
+  const float sum_cost = a->bit_cost_ + b->bit_cost_;
   cost_threshold += sum_cost;
 
   if (GetCombinedHistogramEntropy(a, b, cost_threshold, &cost)) {
@@ -378,10 +462,12 @@
 // Same as HistogramAddEval(), except that the resulting histogram
 // is not stored. Only the cost C(a+b) - C(a) is evaluated. We omit
 // the term C(b) which is constant over all the evaluations.
-static double HistogramAddThresh(const VP8LHistogram* const a,
-                                 const VP8LHistogram* const b,
-                                 double cost_threshold) {
-  double cost = -a->bit_cost_;
+static float HistogramAddThresh(const VP8LHistogram* const a,
+                                const VP8LHistogram* const b,
+                                float cost_threshold) {
+  float cost;
+  assert(a != NULL && b != NULL);
+  cost = -a->bit_cost_;
   GetCombinedHistogramEntropy(a, b, cost_threshold, &cost);
   return cost;
 }
@@ -390,24 +476,22 @@
 
 // The structure to keep track of cost range for the three dominant entropy
 // symbols.
-// TODO(skal): Evaluate if float can be used here instead of double for
-// representing the entropy costs.
 typedef struct {
-  double literal_max_;
-  double literal_min_;
-  double red_max_;
-  double red_min_;
-  double blue_max_;
-  double blue_min_;
+  float literal_max_;
+  float literal_min_;
+  float red_max_;
+  float red_min_;
+  float blue_max_;
+  float blue_min_;
 } DominantCostRange;
 
 static void DominantCostRangeInit(DominantCostRange* const c) {
   c->literal_max_ = 0.;
-  c->literal_min_ = MAX_COST;
+  c->literal_min_ = MAX_BIT_COST;
   c->red_max_ = 0.;
-  c->red_min_ = MAX_COST;
+  c->red_min_ = MAX_BIT_COST;
   c->blue_max_ = 0.;
-  c->blue_min_ = MAX_COST;
+  c->blue_min_ = MAX_BIT_COST;
 }
 
 static void UpdateDominantCostRange(
@@ -422,17 +506,19 @@
 
 static void UpdateHistogramCost(VP8LHistogram* const h) {
   uint32_t alpha_sym, red_sym, blue_sym;
-  const double alpha_cost =
-      PopulationCost(h->alpha_, NUM_LITERAL_CODES, &alpha_sym);
-  const double distance_cost =
-      PopulationCost(h->distance_, NUM_DISTANCE_CODES, NULL) +
+  const float alpha_cost =
+      PopulationCost(h->alpha_, NUM_LITERAL_CODES, &alpha_sym, &h->is_used_[3]);
+  const float distance_cost =
+      PopulationCost(h->distance_, NUM_DISTANCE_CODES, NULL, &h->is_used_[4]) +
       VP8LExtraCost(h->distance_, NUM_DISTANCE_CODES);
   const int num_codes = VP8LHistogramNumCodes(h->palette_code_bits_);
-  h->literal_cost_ = PopulationCost(h->literal_, num_codes, NULL) +
-                     VP8LExtraCost(h->literal_ + NUM_LITERAL_CODES,
-                                   NUM_LENGTH_CODES);
-  h->red_cost_ = PopulationCost(h->red_, NUM_LITERAL_CODES, &red_sym);
-  h->blue_cost_ = PopulationCost(h->blue_, NUM_LITERAL_CODES, &blue_sym);
+  h->literal_cost_ =
+      PopulationCost(h->literal_, num_codes, NULL, &h->is_used_[0]) +
+          VP8LExtraCost(h->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES);
+  h->red_cost_ =
+      PopulationCost(h->red_, NUM_LITERAL_CODES, &red_sym, &h->is_used_[1]);
+  h->blue_cost_ =
+      PopulationCost(h->blue_, NUM_LITERAL_CODES, &blue_sym, &h->is_used_[2]);
   h->bit_cost_ = h->literal_cost_ + h->red_cost_ + h->blue_cost_ +
                  alpha_cost + distance_cost;
   if ((alpha_sym | red_sym | blue_sym) == VP8L_NON_TRIVIAL_SYM) {
@@ -443,10 +529,10 @@
   }
 }
 
-static int GetBinIdForEntropy(double min, double max, double val) {
-  const double range = max - min;
+static int GetBinIdForEntropy(float min, float max, float val) {
+  const float range = max - min;
   if (range > 0.) {
-    const double delta = val - min;
+    const float delta = val - min;
     return (int)((NUM_PARTITIONS - 1e-6) * delta / range);
   } else {
     return 0;
@@ -477,6 +563,7 @@
   VP8LHistogram** const histograms = image_histo->histograms;
   VP8LRefsCursor c = VP8LRefsCursorInit(backward_refs);
   assert(histo_bits > 0);
+  VP8LHistogramSetClear(image_histo);
   while (VP8LRefsCursorOk(&c)) {
     const PixOrCopy* const v = c.cur_pos;
     const int ix = (y >> histo_bits) * histo_xsize + (x >> histo_bits);
@@ -491,17 +578,37 @@
 }
 
 // Copies the histograms and computes its bit_cost.
-static void HistogramCopyAndAnalyze(
-    VP8LHistogramSet* const orig_histo, VP8LHistogramSet* const image_histo) {
-  int i;
-  const int histo_size = orig_histo->size;
+static const uint16_t kInvalidHistogramSymbol = (uint16_t)(-1);
+static void HistogramCopyAndAnalyze(VP8LHistogramSet* const orig_histo,
+                                    VP8LHistogramSet* const image_histo,
+                                    int* const num_used,
+                                    uint16_t* const histogram_symbols) {
+  int i, cluster_id;
+  int num_used_orig = *num_used;
   VP8LHistogram** const orig_histograms = orig_histo->histograms;
   VP8LHistogram** const histograms = image_histo->histograms;
-  for (i = 0; i < histo_size; ++i) {
+  assert(image_histo->max_size == orig_histo->max_size);
+  for (cluster_id = 0, i = 0; i < orig_histo->max_size; ++i) {
     VP8LHistogram* const histo = orig_histograms[i];
     UpdateHistogramCost(histo);
-    // Copy histograms from orig_histo[] to image_histo[].
-    HistogramCopy(histo, histograms[i]);
+
+    // Skip the histogram if it is completely empty, which can happen for tiles
+    // with no information (when they are skipped because of LZ77).
+    if (!histo->is_used_[0] && !histo->is_used_[1] && !histo->is_used_[2]
+        && !histo->is_used_[3] && !histo->is_used_[4]) {
+      // The first histogram is always used. If an histogram is empty, we set
+      // its id to be the same as the previous one: this will improve
+      // compressibility for later LZ77.
+      assert(i > 0);
+      HistogramSetRemoveHistogram(image_histo, i, num_used);
+      HistogramSetRemoveHistogram(orig_histo, i, &num_used_orig);
+      histogram_symbols[i] = kInvalidHistogramSymbol;
+    } else {
+      // Copy histograms from orig_histo[] to image_histo[].
+      HistogramCopy(histo, histograms[i]);
+      histogram_symbols[i] = cluster_id++;
+      assert(cluster_id <= image_histo->max_size);
+    }
   }
 }
 
@@ -518,29 +625,29 @@
 
   // Analyze the dominant (literal, red and blue) entropy costs.
   for (i = 0; i < histo_size; ++i) {
+    if (histograms[i] == NULL) continue;
     UpdateDominantCostRange(histograms[i], &cost_range);
   }
 
   // bin-hash histograms on three of the dominant (literal, red and blue)
   // symbol costs and store the resulting bin_id for each histogram.
   for (i = 0; i < histo_size; ++i) {
+    // bin_map[i] is not set to a special value as its use will later be guarded
+    // by another (histograms[i] == NULL).
+    if (histograms[i] == NULL) continue;
     bin_map[i] = GetHistoBinIndex(histograms[i], &cost_range, low_effort);
   }
 }
 
-// Compact image_histo[] by merging some histograms with same bin_id together if
-// it's advantageous.
-static void HistogramCombineEntropyBin(VP8LHistogramSet* const image_histo,
-                                       VP8LHistogram* cur_combo,
-                                       const uint16_t* const bin_map,
-                                       int bin_map_size, int num_bins,
-                                       double combine_cost_factor,
-                                       int low_effort) {
+// Merges some histograms with same bin_id together if it's advantageous.
+// Sets the remaining histograms to NULL.
+static void HistogramCombineEntropyBin(
+    VP8LHistogramSet* const image_histo, int* num_used,
+    const uint16_t* const clusters, uint16_t* const cluster_mappings,
+    VP8LHistogram* cur_combo, const uint16_t* const bin_map, int num_bins,
+    float combine_cost_factor, int low_effort) {
   VP8LHistogram** const histograms = image_histo->histograms;
   int idx;
-  // Work in-place: processed histograms are put at the beginning of
-  // image_histo[]. At the end, we just have to truncate the array.
-  int size = 0;
   struct {
     int16_t first;    // position of the histogram that accumulates all
                       // histograms with the same bin_id
@@ -553,23 +660,25 @@
     bin_info[idx].num_combine_failures = 0;
   }
 
-  for (idx = 0; idx < bin_map_size; ++idx) {
-    const int bin_id = bin_map[idx];
-    const int first = bin_info[bin_id].first;
-    assert(size <= idx);
+  // By default, a cluster matches itself.
+  for (idx = 0; idx < *num_used; ++idx) cluster_mappings[idx] = idx;
+  for (idx = 0; idx < image_histo->size; ++idx) {
+    int bin_id, first;
+    if (histograms[idx] == NULL) continue;
+    bin_id = bin_map[idx];
+    first = bin_info[bin_id].first;
     if (first == -1) {
-      // just move histogram #idx to its final position
-      histograms[size] = histograms[idx];
-      bin_info[bin_id].first = size++;
+      bin_info[bin_id].first = idx;
     } else if (low_effort) {
       HistogramAdd(histograms[idx], histograms[first], histograms[first]);
+      HistogramSetRemoveHistogram(image_histo, idx, num_used);
+      cluster_mappings[clusters[idx]] = clusters[first];
     } else {
       // try to merge #idx into #first (both share the same bin_id)
-      const double bit_cost = histograms[idx]->bit_cost_;
-      const double bit_cost_thresh = -bit_cost * combine_cost_factor;
-      const double curr_cost_diff =
-          HistogramAddEval(histograms[first], histograms[idx],
-                           cur_combo, bit_cost_thresh);
+      const float bit_cost = histograms[idx]->bit_cost_;
+      const float bit_cost_thresh = -bit_cost * combine_cost_factor;
+      const float curr_cost_diff = HistogramAddEval(
+          histograms[first], histograms[idx], cur_combo, bit_cost_thresh);
       if (curr_cost_diff < bit_cost_thresh) {
         // Try to merge two histograms only if the combo is a trivial one or
         // the two candidate histograms are already non-trivial.
@@ -585,19 +694,18 @@
             bin_info[bin_id].num_combine_failures >= max_combine_failures) {
           // move the (better) merged histogram to its final slot
           HistogramSwap(&cur_combo, &histograms[first]);
+          HistogramSetRemoveHistogram(image_histo, idx, num_used);
+          cluster_mappings[clusters[idx]] = clusters[first];
         } else {
-          histograms[size++] = histograms[idx];
           ++bin_info[bin_id].num_combine_failures;
         }
-      } else {
-        histograms[size++] = histograms[idx];
       }
     }
   }
-  image_histo->size = size;
   if (low_effort) {
     // for low_effort case, update the final cost when everything is merged
-    for (idx = 0; idx < size; ++idx) {
+    for (idx = 0; idx < image_histo->size; ++idx) {
+      if (histograms[idx] == NULL) continue;
       UpdateHistogramCost(histograms[idx]);
     }
   }
@@ -618,8 +726,8 @@
 typedef struct {
   int idx1;
   int idx2;
-  double cost_diff;
-  double cost_combo;
+  float cost_diff;
+  float cost_combo;
 } HistogramPair;
 
 typedef struct {
@@ -628,16 +736,9 @@
   int max_size;
 } HistoQueue;
 
-static int HistoQueueInit(HistoQueue* const histo_queue, const int max_index) {
+static int HistoQueueInit(HistoQueue* const histo_queue, const int max_size) {
   histo_queue->size = 0;
-  // max_index^2 for the queue size is safe. If you look at
-  // HistogramCombineGreedy, and imagine that UpdateQueueFront always pushes
-  // data to the queue, you insert at most:
-  // - max_index*(max_index-1)/2 (the first two for loops)
-  // - max_index - 1 in the last for loop at the first iteration of the while
-  //   loop, max_index - 2 at the second iteration ... therefore
-  //   max_index*(max_index-1)/2 overall too
-  histo_queue->max_size = max_index * max_index;
+  histo_queue->max_size = max_size;
   // We allocate max_size + 1 because the last element at index "size" is
   // used as temporary data (and it could be up to max_size).
   histo_queue->queue = (HistogramPair*)WebPSafeMalloc(
@@ -678,17 +779,29 @@
   }
 }
 
+// Update the cost diff and combo of a pair of histograms. This needs to be
+// called when the the histograms have been merged with a third one.
+static void HistoQueueUpdatePair(const VP8LHistogram* const h1,
+                                 const VP8LHistogram* const h2, float threshold,
+                                 HistogramPair* const pair) {
+  const float sum_cost = h1->bit_cost_ + h2->bit_cost_;
+  pair->cost_combo = 0.;
+  GetCombinedHistogramEntropy(h1, h2, sum_cost + threshold, &pair->cost_combo);
+  pair->cost_diff = pair->cost_combo - sum_cost;
+}
+
 // Create a pair from indices "idx1" and "idx2" provided its cost
 // is inferior to "threshold", a negative entropy.
 // It returns the cost of the pair, or 0. if it superior to threshold.
-static double HistoQueuePush(HistoQueue* const histo_queue,
-                             VP8LHistogram** const histograms, int idx1,
-                             int idx2, double threshold) {
+static float HistoQueuePush(HistoQueue* const histo_queue,
+                            VP8LHistogram** const histograms, int idx1,
+                            int idx2, float threshold) {
   const VP8LHistogram* h1;
   const VP8LHistogram* h2;
   HistogramPair pair;
-  double sum_cost;
 
+  // Stop here if the queue is full.
+  if (histo_queue->size == histo_queue->max_size) return 0.;
   assert(threshold <= 0.);
   if (idx1 > idx2) {
     const int tmp = idx2;
@@ -699,16 +812,12 @@
   pair.idx2 = idx2;
   h1 = histograms[idx1];
   h2 = histograms[idx2];
-  sum_cost = h1->bit_cost_ + h2->bit_cost_;
-  pair.cost_combo = 0.;
-  GetCombinedHistogramEntropy(h1, h2, sum_cost + threshold, &pair.cost_combo);
-  pair.cost_diff = pair.cost_combo - sum_cost;
+
+  HistoQueueUpdatePair(h1, h2, threshold, &pair);
 
   // Do not even consider the pair if it does not improve the entropy.
   if (pair.cost_diff >= threshold) return 0.;
 
-  // We cannot add more elements than the capacity.
-  assert(histo_queue->size < histo_queue->max_size);
   histo_queue->queue[histo_queue->size++] = pair;
   HistoQueueUpdateHead(histo_queue, &histo_queue->queue[histo_queue->size - 1]);
 
@@ -719,42 +828,43 @@
 
 // Combines histograms by continuously choosing the one with the highest cost
 // reduction.
-static int HistogramCombineGreedy(VP8LHistogramSet* const image_histo) {
+static int HistogramCombineGreedy(VP8LHistogramSet* const image_histo,
+                                  int* const num_used) {
   int ok = 0;
-  int image_histo_size = image_histo->size;
+  const int image_histo_size = image_histo->size;
   int i, j;
   VP8LHistogram** const histograms = image_histo->histograms;
-  // Indexes of remaining histograms.
-  int* const clusters =
-      (int*)WebPSafeMalloc(image_histo_size, sizeof(*clusters));
   // Priority queue of histogram pairs.
   HistoQueue histo_queue;
 
-  if (!HistoQueueInit(&histo_queue, image_histo_size) || clusters == NULL) {
+  // image_histo_size^2 for the queue size is safe. If you look at
+  // HistogramCombineGreedy, and imagine that UpdateQueueFront always pushes
+  // data to the queue, you insert at most:
+  // - image_histo_size*(image_histo_size-1)/2 (the first two for loops)
+  // - image_histo_size - 1 in the last for loop at the first iteration of
+  //   the while loop, image_histo_size - 2 at the second iteration ...
+  //   therefore image_histo_size*(image_histo_size-1)/2 overall too
+  if (!HistoQueueInit(&histo_queue, image_histo_size * image_histo_size)) {
     goto End;
   }
 
   for (i = 0; i < image_histo_size; ++i) {
-    // Initialize clusters indexes.
-    clusters[i] = i;
+    if (image_histo->histograms[i] == NULL) continue;
     for (j = i + 1; j < image_histo_size; ++j) {
-      // Initialize positions array.
+      // Initialize queue.
+      if (image_histo->histograms[j] == NULL) continue;
       HistoQueuePush(&histo_queue, histograms, i, j, 0.);
     }
   }
 
-  while (image_histo_size > 1 && histo_queue.size > 0) {
+  while (histo_queue.size > 0) {
     const int idx1 = histo_queue.queue[0].idx1;
     const int idx2 = histo_queue.queue[0].idx2;
     HistogramAdd(histograms[idx2], histograms[idx1], histograms[idx1]);
     histograms[idx1]->bit_cost_ = histo_queue.queue[0].cost_combo;
+
     // Remove merged histogram.
-    for (i = 0; i + 1 < image_histo_size; ++i) {
-      if (clusters[i] >= idx2) {
-        clusters[i] = clusters[i + 1];
-      }
-    }
-    --image_histo_size;
+    HistogramSetRemoveHistogram(image_histo, idx2, num_used);
 
     // Remove pairs intersecting the just combined best pair.
     for (i = 0; i < histo_queue.size;) {
@@ -769,24 +879,15 @@
     }
 
     // Push new pairs formed with combined histogram to the queue.
-    for (i = 0; i < image_histo_size; ++i) {
-      if (clusters[i] != idx1) {
-        HistoQueuePush(&histo_queue, histograms, idx1, clusters[i], 0.);
-      }
-    }
-  }
-  // Move remaining histograms to the beginning of the array.
-  for (i = 0; i < image_histo_size; ++i) {
-    if (i != clusters[i]) {  // swap the two histograms
-      HistogramSwap(&histograms[i], &histograms[clusters[i]]);
+    for (i = 0; i < image_histo->size; ++i) {
+      if (i == idx1 || image_histo->histograms[i] == NULL) continue;
+      HistoQueuePush(&histo_queue, image_histo->histograms, idx1, i, 0.);
     }
   }
 
-  image_histo->size = image_histo_size;
   ok = 1;
 
  End:
-  WebPSafeFree(clusters);
   HistoQueueClear(&histo_queue);
   return ok;
 }
@@ -794,47 +895,68 @@
 // Perform histogram aggregation using a stochastic approach.
 // 'do_greedy' is set to 1 if a greedy approach needs to be performed
 // afterwards, 0 otherwise.
+static int PairComparison(const void* idx1, const void* idx2) {
+  // To be used with bsearch: <0 when *idx1<*idx2, >0 if >, 0 when ==.
+  return (*(int*) idx1 - *(int*) idx2);
+}
 static int HistogramCombineStochastic(VP8LHistogramSet* const image_histo,
-                                      int min_cluster_size,
+                                      int* const num_used, int min_cluster_size,
                                       int* const do_greedy) {
-  int iter;
+  int j, iter;
   uint32_t seed = 1;
   int tries_with_no_success = 0;
-  int image_histo_size = image_histo->size;
-  const int outer_iters = image_histo_size;
+  const int outer_iters = *num_used;
   const int num_tries_no_success = outer_iters / 2;
   VP8LHistogram** const histograms = image_histo->histograms;
-  // Priority queue of histogram pairs. Its size of "kCostHeapSizeSqrt"^2
+  // Priority queue of histogram pairs. Its size of 'kHistoQueueSize'
   // impacts the quality of the compression and the speed: the smaller the
   // faster but the worse for the compression.
   HistoQueue histo_queue;
-  const int kHistoQueueSizeSqrt = 3;
+  const int kHistoQueueSize = 9;
   int ok = 0;
+  // mapping from an index in image_histo with no NULL histogram to the full
+  // blown image_histo.
+  int* mappings;
 
-  if (!HistoQueueInit(&histo_queue, kHistoQueueSizeSqrt)) {
-    goto End;
+  if (*num_used < min_cluster_size) {
+    *do_greedy = 1;
+    return 1;
   }
-  // Collapse similar histograms in 'image_histo'.
-  ++min_cluster_size;
-  for (iter = 0; iter < outer_iters && image_histo_size >= min_cluster_size &&
-                 ++tries_with_no_success < num_tries_no_success;
-       ++iter) {
-    double best_cost =
-        (histo_queue.size == 0) ? 0. : histo_queue.queue[0].cost_diff;
-    int best_idx1 = -1, best_idx2 = 1;
-    int j;
-    const uint32_t rand_range = (image_histo_size - 1) * image_histo_size;
-    // image_histo_size / 2 was chosen empirically. Less means faster but worse
-    // compression.
-    const int num_tries = image_histo_size / 2;
 
-    for (j = 0; j < num_tries; ++j) {
-      double curr_cost;
+  mappings = (int*) WebPSafeMalloc(*num_used, sizeof(*mappings));
+  if (mappings == NULL) return 0;
+  if (!HistoQueueInit(&histo_queue, kHistoQueueSize)) goto End;
+  // Fill the initial mapping.
+  for (j = 0, iter = 0; iter < image_histo->size; ++iter) {
+    if (histograms[iter] == NULL) continue;
+    mappings[j++] = iter;
+  }
+  assert(j == *num_used);
+
+  // Collapse similar histograms in 'image_histo'.
+  for (iter = 0;
+       iter < outer_iters && *num_used >= min_cluster_size &&
+           ++tries_with_no_success < num_tries_no_success;
+       ++iter) {
+    int* mapping_index;
+    float best_cost =
+        (histo_queue.size == 0) ? 0.f : histo_queue.queue[0].cost_diff;
+    int best_idx1 = -1, best_idx2 = 1;
+    const uint32_t rand_range = (*num_used - 1) * (*num_used);
+    // (*num_used) / 2 was chosen empirically. Less means faster but worse
+    // compression.
+    const int num_tries = (*num_used) / 2;
+
+    // Pick random samples.
+    for (j = 0; *num_used >= 2 && j < num_tries; ++j) {
+      float curr_cost;
       // Choose two different histograms at random and try to combine them.
       const uint32_t tmp = MyRand(&seed) % rand_range;
-      const uint32_t idx1 = tmp / (image_histo_size - 1);
-      uint32_t idx2 = tmp % (image_histo_size - 1);
+      uint32_t idx1 = tmp / (*num_used - 1);
+      uint32_t idx2 = tmp % (*num_used - 1);
       if (idx2 >= idx1) ++idx2;
+      idx1 = mappings[idx1];
+      idx2 = mappings[idx2];
 
       // Calculate cost reduction on combination.
       curr_cost =
@@ -847,18 +969,21 @@
     }
     if (histo_queue.size == 0) continue;
 
-    // Merge the two best histograms.
+    // Get the best histograms.
     best_idx1 = histo_queue.queue[0].idx1;
     best_idx2 = histo_queue.queue[0].idx2;
     assert(best_idx1 < best_idx2);
-    HistogramAddEval(histograms[best_idx1], histograms[best_idx2],
-                     histograms[best_idx1], 0);
-    // Swap the best_idx2 histogram with the last one (which is now unused).
-    --image_histo_size;
-    if (best_idx2 != image_histo_size) {
-      HistogramSwap(&histograms[image_histo_size], &histograms[best_idx2]);
-    }
-    histograms[image_histo_size] = NULL;
+    // Pop best_idx2 from mappings.
+    mapping_index = (int*) bsearch(&best_idx2, mappings, *num_used,
+                                   sizeof(best_idx2), &PairComparison);
+    assert(mapping_index != NULL);
+    memmove(mapping_index, mapping_index + 1, sizeof(*mapping_index) *
+        ((*num_used) - (mapping_index - mappings) - 1));
+    // Merge the histograms and remove best_idx2 from the queue.
+    HistogramAdd(histograms[best_idx2], histograms[best_idx1],
+                 histograms[best_idx1]);
+    histograms[best_idx1]->bit_cost_ = histo_queue.queue[0].cost_combo;
+    HistogramSetRemoveHistogram(image_histo, best_idx2, num_used);
     // Parse the queue and update each pair that deals with best_idx1,
     // best_idx2 or image_histo_size.
     for (j = 0; j < histo_queue.size;) {
@@ -881,12 +1006,6 @@
         p->idx2 = best_idx1;
         do_eval = 1;
       }
-      if (p->idx2 == image_histo_size) {
-        // No need to re-evaluate here as it does not involve a pair
-        // containing best_idx1 or best_idx2.
-        p->idx2 = best_idx2;
-      }
-      assert(p->idx2 < image_histo_size);
       // Make sure the index order is respected.
       if (p->idx1 > p->idx2) {
         const int tmp = p->idx2;
@@ -895,8 +1014,7 @@
       }
       if (do_eval) {
         // Re-evaluate the cost of an updated pair.
-        GetCombinedHistogramEntropy(histograms[p->idx1], histograms[p->idx2], 0,
-                                    &p->cost_diff);
+        HistoQueueUpdatePair(histograms[p->idx1], histograms[p->idx2], 0., p);
         if (p->cost_diff >= 0.) {
           HistoQueuePopPair(&histo_queue, p);
           continue;
@@ -905,15 +1023,14 @@
       HistoQueueUpdateHead(&histo_queue, p);
       ++j;
     }
-
     tries_with_no_success = 0;
   }
-  image_histo->size = image_histo_size;
-  *do_greedy = (image_histo->size <= min_cluster_size);
+  *do_greedy = (*num_used <= min_cluster_size);
   ok = 1;
 
-End:
+ End:
   HistoQueueClear(&histo_queue);
+  WebPSafeFree(mappings);
   return ok;
 }
 
@@ -921,23 +1038,29 @@
 // Histogram refinement
 
 // Find the best 'out' histogram for each of the 'in' histograms.
+// At call-time, 'out' contains the histograms of the clusters.
 // Note: we assume that out[]->bit_cost_ is already up-to-date.
 static void HistogramRemap(const VP8LHistogramSet* const in,
-                           const VP8LHistogramSet* const out,
+                           VP8LHistogramSet* const out,
                            uint16_t* const symbols) {
   int i;
   VP8LHistogram** const in_histo = in->histograms;
   VP8LHistogram** const out_histo = out->histograms;
-  const int in_size = in->size;
+  const int in_size = out->max_size;
   const int out_size = out->size;
   if (out_size > 1) {
     for (i = 0; i < in_size; ++i) {
       int best_out = 0;
-      double best_bits = MAX_COST;
+      float best_bits = MAX_BIT_COST;
       int k;
+      if (in_histo[i] == NULL) {
+        // Arbitrarily set to the previous value if unused to help future LZ77.
+        symbols[i] = symbols[i - 1];
+        continue;
+      }
       for (k = 0; k < out_size; ++k) {
-        const double cur_bits =
-            HistogramAddThresh(out_histo[k], in_histo[i], best_bits);
+        float cur_bits;
+        cur_bits = HistogramAddThresh(out_histo[k], in_histo[i], best_bits);
         if (k == 0 || cur_bits < best_bits) {
           best_bits = cur_bits;
           best_out = k;
@@ -953,37 +1076,104 @@
   }
 
   // Recompute each out based on raw and symbols.
-  for (i = 0; i < out_size; ++i) {
-    HistogramClear(out_histo[i]);
-  }
+  VP8LHistogramSetClear(out);
+  out->size = out_size;
 
   for (i = 0; i < in_size; ++i) {
-    const int idx = symbols[i];
+    int idx;
+    if (in_histo[i] == NULL) continue;
+    idx = symbols[i];
     HistogramAdd(in_histo[i], out_histo[idx], out_histo[idx]);
   }
 }
 
-static double GetCombineCostFactor(int histo_size, int quality) {
-  double combine_cost_factor = 0.16;
+static float GetCombineCostFactor(int histo_size, int quality) {
+  float combine_cost_factor = 0.16f;
   if (quality < 90) {
-    if (histo_size > 256) combine_cost_factor /= 2.;
-    if (histo_size > 512) combine_cost_factor /= 2.;
-    if (histo_size > 1024) combine_cost_factor /= 2.;
-    if (quality <= 50) combine_cost_factor /= 2.;
+    if (histo_size > 256) combine_cost_factor /= 2.f;
+    if (histo_size > 512) combine_cost_factor /= 2.f;
+    if (histo_size > 1024) combine_cost_factor /= 2.f;
+    if (quality <= 50) combine_cost_factor /= 2.f;
   }
   return combine_cost_factor;
 }
 
+// Given a HistogramSet 'set', the mapping of clusters 'cluster_mapping' and the
+// current assignment of the cells in 'symbols', merge the clusters and
+// assign the smallest possible clusters values.
+static void OptimizeHistogramSymbols(const VP8LHistogramSet* const set,
+                                     uint16_t* const cluster_mappings,
+                                     int num_clusters,
+                                     uint16_t* const cluster_mappings_tmp,
+                                     uint16_t* const symbols) {
+  int i, cluster_max;
+  int do_continue = 1;
+  // First, assign the lowest cluster to each pixel.
+  while (do_continue) {
+    do_continue = 0;
+    for (i = 0; i < num_clusters; ++i) {
+      int k;
+      k = cluster_mappings[i];
+      while (k != cluster_mappings[k]) {
+        cluster_mappings[k] = cluster_mappings[cluster_mappings[k]];
+        k = cluster_mappings[k];
+      }
+      if (k != cluster_mappings[i]) {
+        do_continue = 1;
+        cluster_mappings[i] = k;
+      }
+    }
+  }
+  // Create a mapping from a cluster id to its minimal version.
+  cluster_max = 0;
+  memset(cluster_mappings_tmp, 0,
+         set->max_size * sizeof(*cluster_mappings_tmp));
+  assert(cluster_mappings[0] == 0);
+  // Re-map the ids.
+  for (i = 0; i < set->max_size; ++i) {
+    int cluster;
+    if (symbols[i] == kInvalidHistogramSymbol) continue;
+    cluster = cluster_mappings[symbols[i]];
+    assert(symbols[i] < num_clusters);
+    if (cluster > 0 && cluster_mappings_tmp[cluster] == 0) {
+      ++cluster_max;
+      cluster_mappings_tmp[cluster] = cluster_max;
+    }
+    symbols[i] = cluster_mappings_tmp[cluster];
+  }
+
+  // Make sure all cluster values are used.
+  cluster_max = 0;
+  for (i = 0; i < set->max_size; ++i) {
+    if (symbols[i] == kInvalidHistogramSymbol) continue;
+    if (symbols[i] <= cluster_max) continue;
+    ++cluster_max;
+    assert(symbols[i] == cluster_max);
+  }
+}
+
+static void RemoveEmptyHistograms(VP8LHistogramSet* const image_histo) {
+  uint32_t size;
+  int i;
+  for (i = 0, size = 0; i < image_histo->size; ++i) {
+    if (image_histo->histograms[i] == NULL) continue;
+    image_histo->histograms[size++] = image_histo->histograms[i];
+  }
+  image_histo->size = size;
+}
+
 int VP8LGetHistoImageSymbols(int xsize, int ysize,
-                             const VP8LBackwardRefs* const refs,
-                             int quality, int low_effort,
-                             int histo_bits, int cache_bits,
+                             const VP8LBackwardRefs* const refs, int quality,
+                             int low_effort, int histogram_bits, int cache_bits,
                              VP8LHistogramSet* const image_histo,
                              VP8LHistogram* const tmp_histo,
-                             uint16_t* const histogram_symbols) {
-  int ok = 0;
-  const int histo_xsize = histo_bits ? VP8LSubSampleSize(xsize, histo_bits) : 1;
-  const int histo_ysize = histo_bits ? VP8LSubSampleSize(ysize, histo_bits) : 1;
+                             uint16_t* const histogram_symbols,
+                             const WebPPicture* const pic, int percent_range,
+                             int* const percent) {
+  const int histo_xsize =
+      histogram_bits ? VP8LSubSampleSize(xsize, histogram_bits) : 1;
+  const int histo_ysize =
+      histogram_bits ? VP8LSubSampleSize(ysize, histogram_bits) : 1;
   const int image_histo_raw_size = histo_xsize * histo_ysize;
   VP8LHistogramSet* const orig_histo =
       VP8LAllocateHistogramSet(image_histo_raw_size, cache_bits);
@@ -991,28 +1181,39 @@
   // histograms of small sizes (as bin_map will be very sparse) and
   // maximum quality q==100 (to preserve the compression gains at that level).
   const int entropy_combine_num_bins = low_effort ? NUM_PARTITIONS : BIN_SIZE;
-  const int entropy_combine =
-      (orig_histo->size > entropy_combine_num_bins * 2) && (quality < 100);
-
-  if (orig_histo == NULL) goto Error;
+  int entropy_combine;
+  uint16_t* const map_tmp =
+      WebPSafeMalloc(2 * image_histo_raw_size, sizeof(map_tmp));
+  uint16_t* const cluster_mappings = map_tmp + image_histo_raw_size;
+  int num_used = image_histo_raw_size;
+  if (orig_histo == NULL || map_tmp == NULL) {
+    WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+    goto Error;
+  }
 
   // Construct the histograms from backward references.
-  HistogramBuild(xsize, histo_bits, refs, orig_histo);
+  HistogramBuild(xsize, histogram_bits, refs, orig_histo);
   // Copies the histograms and computes its bit_cost.
-  HistogramCopyAndAnalyze(orig_histo, image_histo);
+  // histogram_symbols is optimized
+  HistogramCopyAndAnalyze(orig_histo, image_histo, &num_used,
+                          histogram_symbols);
+
+  entropy_combine =
+      (num_used > entropy_combine_num_bins * 2) && (quality < 100);
 
   if (entropy_combine) {
-    const int bin_map_size = orig_histo->size;
-    // Reuse histogram_symbols storage. By definition, it's guaranteed to be ok.
-    uint16_t* const bin_map = histogram_symbols;
-    const double combine_cost_factor =
+    uint16_t* const bin_map = map_tmp;
+    const float combine_cost_factor =
         GetCombineCostFactor(image_histo_raw_size, quality);
+    const uint32_t num_clusters = num_used;
 
-    HistogramAnalyzeEntropyBin(orig_histo, bin_map, low_effort);
+    HistogramAnalyzeEntropyBin(image_histo, bin_map, low_effort);
     // Collapse histograms with similar entropy.
-    HistogramCombineEntropyBin(image_histo, tmp_histo, bin_map, bin_map_size,
-                               entropy_combine_num_bins, combine_cost_factor,
-                               low_effort);
+    HistogramCombineEntropyBin(
+        image_histo, &num_used, histogram_symbols, cluster_mappings, tmp_histo,
+        bin_map, entropy_combine_num_bins, combine_cost_factor, low_effort);
+    OptimizeHistogramSymbols(image_histo, cluster_mappings, num_clusters,
+                             map_tmp, histogram_symbols);
   }
 
   // Don't combine the histograms using stochastic and greedy heuristics for
@@ -1022,21 +1223,30 @@
     // cubic ramp between 1 and MAX_HISTO_GREEDY:
     const int threshold_size = (int)(1 + (x * x * x) * (MAX_HISTO_GREEDY - 1));
     int do_greedy;
-    if (!HistogramCombineStochastic(image_histo, threshold_size, &do_greedy)) {
+    if (!HistogramCombineStochastic(image_histo, &num_used, threshold_size,
+                                    &do_greedy)) {
+      WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
       goto Error;
     }
-    if (do_greedy && !HistogramCombineGreedy(image_histo)) {
-      goto Error;
+    if (do_greedy) {
+      RemoveEmptyHistograms(image_histo);
+      if (!HistogramCombineGreedy(image_histo, &num_used)) {
+        WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+        goto Error;
+      }
     }
   }
 
-  // TODO(vrabaud): Optimize HistogramRemap for low-effort compression mode.
   // Find the optimal map from original histograms to the final ones.
+  RemoveEmptyHistograms(image_histo);
   HistogramRemap(orig_histo, image_histo, histogram_symbols);
 
-  ok = 1;
+  if (!WebPReportProgress(pic, *percent + percent_range, percent)) {
+    goto Error;
+  }
 
  Error:
   VP8LFreeHistogramSet(orig_histo);
-  return ok;
+  WebPSafeFree(map_tmp);
+  return (pic->error_code == VP8_ENC_OK);
 }
diff --git a/third_party/libwebp/src/enc/histogram_enc.h b/third_party/libwebp/src/enc/histogram_enc.h
index 0f9f48d..914e605 100644
--- a/third_party/libwebp/src/enc/histogram_enc.h
+++ b/third_party/libwebp/src/enc/histogram_enc.h
@@ -44,10 +44,11 @@
   int palette_code_bits_;
   uint32_t trivial_symbol_;  // True, if histograms for Red, Blue & Alpha
                              // literal symbols are single valued.
-  double bit_cost_;          // cached value of bit cost.
-  double literal_cost_;      // Cached values of dominant entropy costs:
-  double red_cost_;          // literal, red & blue.
-  double blue_cost_;
+  float bit_cost_;           // cached value of bit cost.
+  float literal_cost_;       // Cached values of dominant entropy costs:
+  float red_cost_;           // literal, red & blue.
+  float blue_cost_;
+  uint8_t is_used_[5];       // 5 for literal, red, blue, alpha, distance
 } VP8LHistogram;
 
 // Collection of histograms with fixed capacity, allocated as one
@@ -67,11 +68,13 @@
                          const VP8LBackwardRefs* const refs,
                          int palette_code_bits);
 
-// Return the size of the histogram for a given palette_code_bits.
-int VP8LGetHistogramSize(int palette_code_bits);
+// Return the size of the histogram for a given cache_bits.
+int VP8LGetHistogramSize(int cache_bits);
 
 // Set the palette_code_bits and reset the stats.
-void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits);
+// If init_arrays is true, the arrays are also filled with 0's.
+void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits,
+                       int init_arrays);
 
 // Collect all the references into a histogram (without reset)
 void VP8LHistogramStoreRefs(const VP8LBackwardRefs* const refs,
@@ -87,6 +90,9 @@
 // using 'cache_bits'. Return NULL in case of memory error.
 VP8LHistogramSet* VP8LAllocateHistogramSet(int size, int cache_bits);
 
+// Set the histograms in set to 0.
+void VP8LHistogramSetClear(VP8LHistogramSet* const set);
+
 // Allocate and initialize histogram object with specified 'cache_bits'.
 // Returns NULL in case of memory error.
 // Special case of VP8LAllocateHistogramSet, with size equals 1.
@@ -103,21 +109,23 @@
       ((palette_code_bits > 0) ? (1 << palette_code_bits) : 0);
 }
 
-// Builds the histogram image.
+// Builds the histogram image. pic and percent are for progress.
+// Returns false in case of error (stored in pic->error_code).
 int VP8LGetHistoImageSymbols(int xsize, int ysize,
-                             const VP8LBackwardRefs* const refs,
-                             int quality, int low_effort,
-                             int histogram_bits, int cache_bits,
-                             VP8LHistogramSet* const image_in,
+                             const VP8LBackwardRefs* const refs, int quality,
+                             int low_effort, int histogram_bits, int cache_bits,
+                             VP8LHistogramSet* const image_histo,
                              VP8LHistogram* const tmp_histo,
-                             uint16_t* const histogram_symbols);
+                             uint16_t* const histogram_symbols,
+                             const WebPPicture* const pic, int percent_range,
+                             int* const percent);
 
 // Returns the entropy for the symbols in the input array.
-double VP8LBitsEntropy(const uint32_t* const array, int n);
+float VP8LBitsEntropy(const uint32_t* const array, int n);
 
 // Estimate how many bits the combined entropy of literals and distance
 // approximately maps to.
-double VP8LHistogramEstimateBits(const VP8LHistogram* const p);
+float VP8LHistogramEstimateBits(VP8LHistogram* const p);
 
 #ifdef __cplusplus
 }
diff --git a/third_party/libwebp/src/enc/iterator_enc.c b/third_party/libwebp/src/enc/iterator_enc.c
index 1df9cb0..4d6b618 100644
--- a/third_party/libwebp/src/enc/iterator_enc.c
+++ b/third_party/libwebp/src/enc/iterator_enc.c
@@ -132,7 +132,7 @@
   for (; i < total_len; ++i) dst[i] = dst[len - 1];
 }
 
-void VP8IteratorImport(VP8EncIterator* const it, uint8_t* tmp_32) {
+void VP8IteratorImport(VP8EncIterator* const it, uint8_t* const tmp_32) {
   const VP8Encoder* const enc = it->enc_;
   const int x = it->x_, y = it->y_;
   const WebPPicture* const pic = enc->pic_;
diff --git a/third_party/libwebp/src/enc/picture_csp_enc.c b/third_party/libwebp/src/enc/picture_csp_enc.c
index 00a8f25..c623d89 100644
--- a/third_party/libwebp/src/enc/picture_csp_enc.c
+++ b/third_party/libwebp/src/enc/picture_csp_enc.c
@@ -22,12 +22,19 @@
 
 #include <stdlib.h>
 
+#include "sharpyuv/sharpyuv.h"
+#include "sharpyuv/sharpyuv_csp.h"
 #include "src/enc/vp8i_enc.h"
 #include "src/utils/random_utils.h"
 #include "src/utils/utils.h"
 #include "src/dsp/dsp.h"
 #include "src/dsp/lossless.h"
 #include "src/dsp/yuv.h"
+#include "src/dsp/cpu.h"
+
+#if defined(WEBP_USE_THREAD) && !defined(_WIN32)
+#include <pthread.h>
+#endif
 
 // Uncomment to disable gamma-compression during RGB->U/V averaging
 #define USE_GAMMA_COMPRESSION
@@ -68,16 +75,16 @@
 // Checking for the presence of non-opaque alpha.
 int WebPPictureHasTransparency(const WebPPicture* picture) {
   if (picture == NULL) return 0;
-  if (!picture->use_argb) {
-    return CheckNonOpaque(picture->a, picture->width, picture->height,
-                          1, picture->a_stride);
-  } else {
-    const int alpha_offset = ALPHA_OFFSET;
-    return CheckNonOpaque((const uint8_t*)picture->argb + alpha_offset,
-                          picture->width, picture->height,
-                          4, picture->argb_stride * sizeof(*picture->argb));
+  if (picture->use_argb) {
+    if (picture->argb != NULL) {
+      return CheckNonOpaque((const uint8_t*)picture->argb + ALPHA_OFFSET,
+                            picture->width, picture->height,
+                            4, picture->argb_stride * sizeof(*picture->argb));
+    }
+    return 0;
   }
-  return 0;
+  return CheckNonOpaque(picture->a, picture->width, picture->height,
+                        1, picture->a_stride);
 }
 
 //------------------------------------------------------------------------------
@@ -85,29 +92,31 @@
 
 #if defined(USE_GAMMA_COMPRESSION)
 
-// gamma-compensates loss of resolution during chroma subsampling
-#define kGamma 0.80      // for now we use a different gamma value than kGammaF
-#define kGammaFix 12     // fixed-point precision for linear values
-#define kGammaScale ((1 << kGammaFix) - 1)
-#define kGammaTabFix 7   // fixed-point fractional bits precision
-#define kGammaTabScale (1 << kGammaTabFix)
-#define kGammaTabRounder (kGammaTabScale >> 1)
-#define kGammaTabSize (1 << (kGammaFix - kGammaTabFix))
+// Gamma correction compensates loss of resolution during chroma subsampling.
+#define GAMMA_FIX 12      // fixed-point precision for linear values
+#define GAMMA_TAB_FIX 7   // fixed-point fractional bits precision
+#define GAMMA_TAB_SIZE (1 << (GAMMA_FIX - GAMMA_TAB_FIX))
+static const double kGamma = 0.80;
+static const int kGammaScale = ((1 << GAMMA_FIX) - 1);
+static const int kGammaTabScale = (1 << GAMMA_TAB_FIX);
+static const int kGammaTabRounder = (1 << GAMMA_TAB_FIX >> 1);
 
-static int kLinearToGammaTab[kGammaTabSize + 1];
+static int kLinearToGammaTab[GAMMA_TAB_SIZE + 1];
 static uint16_t kGammaToLinearTab[256];
 static volatile int kGammaTablesOk = 0;
+static void InitGammaTables(void);
+extern VP8CPUInfo VP8GetCPUInfo;
 
-static WEBP_TSAN_IGNORE_FUNCTION void InitGammaTables(void) {
+WEBP_DSP_INIT_FUNC(InitGammaTables) {
   if (!kGammaTablesOk) {
     int v;
-    const double scale = (double)(1 << kGammaTabFix) / kGammaScale;
+    const double scale = (double)(1 << GAMMA_TAB_FIX) / kGammaScale;
     const double norm = 1. / 255.;
     for (v = 0; v <= 255; ++v) {
       kGammaToLinearTab[v] =
           (uint16_t)(pow(norm * v, kGamma) * kGammaScale + .5);
     }
-    for (v = 0; v <= kGammaTabSize; ++v) {
+    for (v = 0; v <= GAMMA_TAB_SIZE; ++v) {
       kLinearToGammaTab[v] = (int)(255. * pow(scale * v, 1. / kGamma) + .5);
     }
     kGammaTablesOk = 1;
@@ -119,12 +128,12 @@
 }
 
 static WEBP_INLINE int Interpolate(int v) {
-  const int tab_pos = v >> (kGammaTabFix + 2);    // integer part
+  const int tab_pos = v >> (GAMMA_TAB_FIX + 2);    // integer part
   const int x = v & ((kGammaTabScale << 2) - 1);  // fractional part
   const int v0 = kLinearToGammaTab[tab_pos];
   const int v1 = kLinearToGammaTab[tab_pos + 1];
   const int y = v1 * x + v0 * ((kGammaTabScale << 2) - x);   // interpolate
-  assert(tab_pos + 1 < kGammaTabSize + 1);
+  assert(tab_pos + 1 < GAMMA_TAB_SIZE + 1);
   return y;
 }
 
@@ -132,7 +141,7 @@
 // U/V value, suitable for RGBToU/V calls.
 static WEBP_INLINE int LinearToGamma(uint32_t base_value, int shift) {
   const int y = Interpolate(base_value << shift);   // final uplifted value
-  return (y + kGammaTabRounder) >> kGammaTabFix;    // descale
+  return (y + kGammaTabRounder) >> GAMMA_TAB_FIX;    // descale
 }
 
 #else
@@ -166,414 +175,26 @@
 //------------------------------------------------------------------------------
 // Sharp RGB->YUV conversion
 
-static const int kNumIterations = 4;
 static const int kMinDimensionIterativeConversion = 4;
 
-// We could use SFIX=0 and only uint8_t for fixed_y_t, but it produces some
-// banding sometimes. Better use extra precision.
-#define SFIX 2                // fixed-point precision of RGB and Y/W
-typedef int16_t fixed_t;      // signed type with extra SFIX precision for UV
-typedef uint16_t fixed_y_t;   // unsigned type with extra SFIX precision for W
-
-#define SHALF (1 << SFIX >> 1)
-#define MAX_Y_T ((256 << SFIX) - 1)
-#define SROUNDER (1 << (YUV_FIX + SFIX - 1))
-
-#if defined(USE_GAMMA_COMPRESSION)
-
-// We use tables of different size and precision for the Rec709 / BT2020
-// transfer function.
-#define kGammaF (1./0.45)
-static uint32_t kLinearToGammaTabS[kGammaTabSize + 2];
-#define GAMMA_TO_LINEAR_BITS 14
-static uint32_t kGammaToLinearTabS[MAX_Y_T + 1];   // size scales with Y_FIX
-static volatile int kGammaTablesSOk = 0;
-
-static WEBP_TSAN_IGNORE_FUNCTION void InitGammaTablesS(void) {
-  assert(2 * GAMMA_TO_LINEAR_BITS < 32);  // we use uint32_t intermediate values
-  if (!kGammaTablesSOk) {
-    int v;
-    const double norm = 1. / MAX_Y_T;
-    const double scale = 1. / kGammaTabSize;
-    const double a = 0.09929682680944;
-    const double thresh = 0.018053968510807;
-    const double final_scale = 1 << GAMMA_TO_LINEAR_BITS;
-    for (v = 0; v <= MAX_Y_T; ++v) {
-      const double g = norm * v;
-      double value;
-      if (g <= thresh * 4.5) {
-        value = g / 4.5;
-      } else {
-        const double a_rec = 1. / (1. + a);
-        value = pow(a_rec * (g + a), kGammaF);
-      }
-      kGammaToLinearTabS[v] = (uint32_t)(value * final_scale + .5);
-    }
-    for (v = 0; v <= kGammaTabSize; ++v) {
-      const double g = scale * v;
-      double value;
-      if (g <= thresh) {
-        value = 4.5 * g;
-      } else {
-        value = (1. + a) * pow(g, 1. / kGammaF) - a;
-      }
-      // we already incorporate the 1/2 rounding constant here
-      kLinearToGammaTabS[v] =
-          (uint32_t)(MAX_Y_T * value) + (1 << GAMMA_TO_LINEAR_BITS >> 1);
-    }
-    // to prevent small rounding errors to cause read-overflow:
-    kLinearToGammaTabS[kGammaTabSize + 1] = kLinearToGammaTabS[kGammaTabSize];
-    kGammaTablesSOk = 1;
-  }
-}
-
-// return value has a fixed-point precision of GAMMA_TO_LINEAR_BITS
-static WEBP_INLINE uint32_t GammaToLinearS(int v) {
-  return kGammaToLinearTabS[v];
-}
-
-static WEBP_INLINE uint32_t LinearToGammaS(uint32_t value) {
-  // 'value' is in GAMMA_TO_LINEAR_BITS fractional precision
-  const uint32_t v = value * kGammaTabSize;
-  const uint32_t tab_pos = v >> GAMMA_TO_LINEAR_BITS;
-  // fractional part, in GAMMA_TO_LINEAR_BITS fixed-point precision
-  const uint32_t x = v - (tab_pos << GAMMA_TO_LINEAR_BITS);  // fractional part
-  // v0 / v1 are in GAMMA_TO_LINEAR_BITS fixed-point precision (range [0..1])
-  const uint32_t v0 = kLinearToGammaTabS[tab_pos + 0];
-  const uint32_t v1 = kLinearToGammaTabS[tab_pos + 1];
-  // Final interpolation. Note that rounding is already included.
-  const uint32_t v2 = (v1 - v0) * x;    // note: v1 >= v0.
-  const uint32_t result = v0 + (v2 >> GAMMA_TO_LINEAR_BITS);
-  return result;
-}
-
-#else
-
-static void InitGammaTablesS(void) {}
-static WEBP_INLINE uint32_t GammaToLinearS(int v) {
-  return (v << GAMMA_TO_LINEAR_BITS) / MAX_Y_T;
-}
-static WEBP_INLINE uint32_t LinearToGammaS(uint32_t value) {
-  return (MAX_Y_T * value) >> GAMMA_TO_LINEAR_BITS;
-}
-
-#endif    // USE_GAMMA_COMPRESSION
-
-//------------------------------------------------------------------------------
-
-static uint8_t clip_8b(fixed_t v) {
-  return (!(v & ~0xff)) ? (uint8_t)v : (v < 0) ? 0u : 255u;
-}
-
-static fixed_y_t clip_y(int y) {
-  return (!(y & ~MAX_Y_T)) ? (fixed_y_t)y : (y < 0) ? 0 : MAX_Y_T;
-}
-
-//------------------------------------------------------------------------------
-
-static int RGBToGray(int r, int g, int b) {
-  const int luma = 13933 * r + 46871 * g + 4732 * b + YUV_HALF;
-  return (luma >> YUV_FIX);
-}
-
-static uint32_t ScaleDown(int a, int b, int c, int d) {
-  const uint32_t A = GammaToLinearS(a);
-  const uint32_t B = GammaToLinearS(b);
-  const uint32_t C = GammaToLinearS(c);
-  const uint32_t D = GammaToLinearS(d);
-  return LinearToGammaS((A + B + C + D + 2) >> 2);
-}
-
-static WEBP_INLINE void UpdateW(const fixed_y_t* src, fixed_y_t* dst, int w) {
-  int i;
-  for (i = 0; i < w; ++i) {
-    const uint32_t R = GammaToLinearS(src[0 * w + i]);
-    const uint32_t G = GammaToLinearS(src[1 * w + i]);
-    const uint32_t B = GammaToLinearS(src[2 * w + i]);
-    const uint32_t Y = RGBToGray(R, G, B);
-    dst[i] = (fixed_y_t)LinearToGammaS(Y);
-  }
-}
-
-static void UpdateChroma(const fixed_y_t* src1, const fixed_y_t* src2,
-                         fixed_t* dst, int uv_w) {
-  int i;
-  for (i = 0; i < uv_w; ++i) {
-    const int r = ScaleDown(src1[0 * uv_w + 0], src1[0 * uv_w + 1],
-                            src2[0 * uv_w + 0], src2[0 * uv_w + 1]);
-    const int g = ScaleDown(src1[2 * uv_w + 0], src1[2 * uv_w + 1],
-                            src2[2 * uv_w + 0], src2[2 * uv_w + 1]);
-    const int b = ScaleDown(src1[4 * uv_w + 0], src1[4 * uv_w + 1],
-                            src2[4 * uv_w + 0], src2[4 * uv_w + 1]);
-    const int W = RGBToGray(r, g, b);
-    dst[0 * uv_w] = (fixed_t)(r - W);
-    dst[1 * uv_w] = (fixed_t)(g - W);
-    dst[2 * uv_w] = (fixed_t)(b - W);
-    dst  += 1;
-    src1 += 2;
-    src2 += 2;
-  }
-}
-
-static void StoreGray(const fixed_y_t* rgb, fixed_y_t* y, int w) {
-  int i;
-  for (i = 0; i < w; ++i) {
-    y[i] = RGBToGray(rgb[0 * w + i], rgb[1 * w + i], rgb[2 * w + i]);
-  }
-}
-
-//------------------------------------------------------------------------------
-
-static WEBP_INLINE fixed_y_t Filter2(int A, int B, int W0) {
-  const int v0 = (A * 3 + B + 2) >> 2;
-  return clip_y(v0 + W0);
-}
-
-//------------------------------------------------------------------------------
-
-static WEBP_INLINE fixed_y_t UpLift(uint8_t a) {  // 8bit -> SFIX
-  return ((fixed_y_t)a << SFIX) | SHALF;
-}
-
-static void ImportOneRow(const uint8_t* const r_ptr,
-                         const uint8_t* const g_ptr,
-                         const uint8_t* const b_ptr,
-                         int step,
-                         int pic_width,
-                         fixed_y_t* const dst) {
-  int i;
-  const int w = (pic_width + 1) & ~1;
-  for (i = 0; i < pic_width; ++i) {
-    const int off = i * step;
-    dst[i + 0 * w] = UpLift(r_ptr[off]);
-    dst[i + 1 * w] = UpLift(g_ptr[off]);
-    dst[i + 2 * w] = UpLift(b_ptr[off]);
-  }
-  if (pic_width & 1) {  // replicate rightmost pixel
-    dst[pic_width + 0 * w] = dst[pic_width + 0 * w - 1];
-    dst[pic_width + 1 * w] = dst[pic_width + 1 * w - 1];
-    dst[pic_width + 2 * w] = dst[pic_width + 2 * w - 1];
-  }
-}
-
-static void InterpolateTwoRows(const fixed_y_t* const best_y,
-                               const fixed_t* prev_uv,
-                               const fixed_t* cur_uv,
-                               const fixed_t* next_uv,
-                               int w,
-                               fixed_y_t* out1,
-                               fixed_y_t* out2) {
-  const int uv_w = w >> 1;
-  const int len = (w - 1) >> 1;   // length to filter
-  int k = 3;
-  while (k-- > 0) {   // process each R/G/B segments in turn
-    // special boundary case for i==0
-    out1[0] = Filter2(cur_uv[0], prev_uv[0], best_y[0]);
-    out2[0] = Filter2(cur_uv[0], next_uv[0], best_y[w]);
-
-    WebPSharpYUVFilterRow(cur_uv, prev_uv, len, best_y + 0 + 1, out1 + 1);
-    WebPSharpYUVFilterRow(cur_uv, next_uv, len, best_y + w + 1, out2 + 1);
-
-    // special boundary case for i == w - 1 when w is even
-    if (!(w & 1)) {
-      out1[w - 1] = Filter2(cur_uv[uv_w - 1], prev_uv[uv_w - 1],
-                            best_y[w - 1 + 0]);
-      out2[w - 1] = Filter2(cur_uv[uv_w - 1], next_uv[uv_w - 1],
-                            best_y[w - 1 + w]);
-    }
-    out1 += w;
-    out2 += w;
-    prev_uv += uv_w;
-    cur_uv  += uv_w;
-    next_uv += uv_w;
-  }
-}
-
-static WEBP_INLINE uint8_t ConvertRGBToY(int r, int g, int b) {
-  const int luma = 16839 * r + 33059 * g + 6420 * b + SROUNDER;
-  return clip_8b(16 + (luma >> (YUV_FIX + SFIX)));
-}
-
-static WEBP_INLINE uint8_t ConvertRGBToU(int r, int g, int b) {
-  const int u =  -9719 * r - 19081 * g + 28800 * b + SROUNDER;
-  return clip_8b(128 + (u >> (YUV_FIX + SFIX)));
-}
-
-static WEBP_INLINE uint8_t ConvertRGBToV(int r, int g, int b) {
-  const int v = +28800 * r - 24116 * g -  4684 * b + SROUNDER;
-  return clip_8b(128 + (v >> (YUV_FIX + SFIX)));
-}
-
-static int ConvertWRGBToYUV(const fixed_y_t* best_y, const fixed_t* best_uv,
-                            WebPPicture* const picture) {
-  int i, j;
-  uint8_t* dst_y = picture->y;
-  uint8_t* dst_u = picture->u;
-  uint8_t* dst_v = picture->v;
-  const fixed_t* const best_uv_base = best_uv;
-  const int w = (picture->width + 1) & ~1;
-  const int h = (picture->height + 1) & ~1;
-  const int uv_w = w >> 1;
-  const int uv_h = h >> 1;
-  for (best_uv = best_uv_base, j = 0; j < picture->height; ++j) {
-    for (i = 0; i < picture->width; ++i) {
-      const int off = (i >> 1);
-      const int W = best_y[i];
-      const int r = best_uv[off + 0 * uv_w] + W;
-      const int g = best_uv[off + 1 * uv_w] + W;
-      const int b = best_uv[off + 2 * uv_w] + W;
-      dst_y[i] = ConvertRGBToY(r, g, b);
-    }
-    best_y += w;
-    best_uv += (j & 1) * 3 * uv_w;
-    dst_y += picture->y_stride;
-  }
-  for (best_uv = best_uv_base, j = 0; j < uv_h; ++j) {
-    for (i = 0; i < uv_w; ++i) {
-      const int off = i;
-      const int r = best_uv[off + 0 * uv_w];
-      const int g = best_uv[off + 1 * uv_w];
-      const int b = best_uv[off + 2 * uv_w];
-      dst_u[i] = ConvertRGBToU(r, g, b);
-      dst_v[i] = ConvertRGBToV(r, g, b);
-    }
-    best_uv += 3 * uv_w;
-    dst_u += picture->uv_stride;
-    dst_v += picture->uv_stride;
-  }
-  return 1;
-}
-
 //------------------------------------------------------------------------------
 // Main function
 
-#define SAFE_ALLOC(W, H, T) ((T*)WebPSafeMalloc((W) * (H), sizeof(T)))
-
 static int PreprocessARGB(const uint8_t* r_ptr,
                           const uint8_t* g_ptr,
                           const uint8_t* b_ptr,
                           int step, int rgb_stride,
                           WebPPicture* const picture) {
-  // we expand the right/bottom border if needed
-  const int w = (picture->width + 1) & ~1;
-  const int h = (picture->height + 1) & ~1;
-  const int uv_w = w >> 1;
-  const int uv_h = h >> 1;
-  uint64_t prev_diff_y_sum = ~0;
-  int j, iter;
-
-  // TODO(skal): allocate one big memory chunk. But for now, it's easier
-  // for valgrind debugging to have several chunks.
-  fixed_y_t* const tmp_buffer = SAFE_ALLOC(w * 3, 2, fixed_y_t);   // scratch
-  fixed_y_t* const best_y_base = SAFE_ALLOC(w, h, fixed_y_t);
-  fixed_y_t* const target_y_base = SAFE_ALLOC(w, h, fixed_y_t);
-  fixed_y_t* const best_rgb_y = SAFE_ALLOC(w, 2, fixed_y_t);
-  fixed_t* const best_uv_base = SAFE_ALLOC(uv_w * 3, uv_h, fixed_t);
-  fixed_t* const target_uv_base = SAFE_ALLOC(uv_w * 3, uv_h, fixed_t);
-  fixed_t* const best_rgb_uv = SAFE_ALLOC(uv_w * 3, 1, fixed_t);
-  fixed_y_t* best_y = best_y_base;
-  fixed_y_t* target_y = target_y_base;
-  fixed_t* best_uv = best_uv_base;
-  fixed_t* target_uv = target_uv_base;
-  const uint64_t diff_y_threshold = (uint64_t)(3.0 * w * h);
-  int ok;
-
-  if (best_y_base == NULL || best_uv_base == NULL ||
-      target_y_base == NULL || target_uv_base == NULL ||
-      best_rgb_y == NULL || best_rgb_uv == NULL ||
-      tmp_buffer == NULL) {
-    ok = WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
-    goto End;
+  const int ok = SharpYuvConvert(
+      r_ptr, g_ptr, b_ptr, step, rgb_stride, /*rgb_bit_depth=*/8,
+      picture->y, picture->y_stride, picture->u, picture->uv_stride, picture->v,
+      picture->uv_stride, /*yuv_bit_depth=*/8, picture->width,
+      picture->height, SharpYuvGetConversionMatrix(kSharpYuvMatrixWebp));
+  if (!ok) {
+    return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
   }
-  assert(picture->width >= kMinDimensionIterativeConversion);
-  assert(picture->height >= kMinDimensionIterativeConversion);
-
-  WebPInitConvertARGBToYUV();
-
-  // Import RGB samples to W/RGB representation.
-  for (j = 0; j < picture->height; j += 2) {
-    const int is_last_row = (j == picture->height - 1);
-    fixed_y_t* const src1 = tmp_buffer + 0 * w;
-    fixed_y_t* const src2 = tmp_buffer + 3 * w;
-
-    // prepare two rows of input
-    ImportOneRow(r_ptr, g_ptr, b_ptr, step, picture->width, src1);
-    if (!is_last_row) {
-      ImportOneRow(r_ptr + rgb_stride, g_ptr + rgb_stride, b_ptr + rgb_stride,
-                   step, picture->width, src2);
-    } else {
-      memcpy(src2, src1, 3 * w * sizeof(*src2));
-    }
-    StoreGray(src1, best_y + 0, w);
-    StoreGray(src2, best_y + w, w);
-
-    UpdateW(src1, target_y, w);
-    UpdateW(src2, target_y + w, w);
-    UpdateChroma(src1, src2, target_uv, uv_w);
-    memcpy(best_uv, target_uv, 3 * uv_w * sizeof(*best_uv));
-    best_y += 2 * w;
-    best_uv += 3 * uv_w;
-    target_y += 2 * w;
-    target_uv += 3 * uv_w;
-    r_ptr += 2 * rgb_stride;
-    g_ptr += 2 * rgb_stride;
-    b_ptr += 2 * rgb_stride;
-  }
-
-  // Iterate and resolve clipping conflicts.
-  for (iter = 0; iter < kNumIterations; ++iter) {
-    const fixed_t* cur_uv = best_uv_base;
-    const fixed_t* prev_uv = best_uv_base;
-    uint64_t diff_y_sum = 0;
-
-    best_y = best_y_base;
-    best_uv = best_uv_base;
-    target_y = target_y_base;
-    target_uv = target_uv_base;
-    for (j = 0; j < h; j += 2) {
-      fixed_y_t* const src1 = tmp_buffer + 0 * w;
-      fixed_y_t* const src2 = tmp_buffer + 3 * w;
-      {
-        const fixed_t* const next_uv = cur_uv + ((j < h - 2) ? 3 * uv_w : 0);
-        InterpolateTwoRows(best_y, prev_uv, cur_uv, next_uv, w, src1, src2);
-        prev_uv = cur_uv;
-        cur_uv = next_uv;
-      }
-
-      UpdateW(src1, best_rgb_y + 0 * w, w);
-      UpdateW(src2, best_rgb_y + 1 * w, w);
-      UpdateChroma(src1, src2, best_rgb_uv, uv_w);
-
-      // update two rows of Y and one row of RGB
-      diff_y_sum += WebPSharpYUVUpdateY(target_y, best_rgb_y, best_y, 2 * w);
-      WebPSharpYUVUpdateRGB(target_uv, best_rgb_uv, best_uv, 3 * uv_w);
-
-      best_y += 2 * w;
-      best_uv += 3 * uv_w;
-      target_y += 2 * w;
-      target_uv += 3 * uv_w;
-    }
-    // test exit condition
-    if (iter > 0) {
-      if (diff_y_sum < diff_y_threshold) break;
-      if (diff_y_sum > prev_diff_y_sum) break;
-    }
-    prev_diff_y_sum = diff_y_sum;
-  }
-  // final reconstruction
-  ok = ConvertWRGBToYUV(best_y_base, best_uv_base, picture);
-
- End:
-  WebPSafeFree(best_y_base);
-  WebPSafeFree(best_uv_base);
-  WebPSafeFree(target_y_base);
-  WebPSafeFree(target_uv_base);
-  WebPSafeFree(best_rgb_y);
-  WebPSafeFree(best_rgb_uv);
-  WebPSafeFree(tmp_buffer);
   return ok;
 }
-#undef SAFE_ALLOC
 
 //------------------------------------------------------------------------------
 // "Fast" regular RGB->YUV
@@ -598,8 +219,8 @@
 // and constant are adjusted very tightly to fit 32b arithmetic.
 // In particular, they use the fact that the operands for 'v / a' are actually
 // derived as v = (a0.p0 + a1.p1 + a2.p2 + a3.p3) and a = a0 + a1 + a2 + a3
-// with ai in [0..255] and pi in [0..1<<kGammaFix). The constraint to avoid
-// overflow is: kGammaFix + kAlphaFix <= 31.
+// with ai in [0..255] and pi in [0..1<<GAMMA_FIX). The constraint to avoid
+// overflow is: GAMMA_FIX + kAlphaFix <= 31.
 static const uint32_t kInvAlpha[4 * 0xff + 1] = {
   0,  /* alpha = 0 */
   524288, 262144, 174762, 131072, 104857, 87381, 74898, 65536,
@@ -825,11 +446,20 @@
     dst[0] = SUM4(r_ptr + j, step);
     dst[1] = SUM4(g_ptr + j, step);
     dst[2] = SUM4(b_ptr + j, step);
+    // MemorySanitizer may raise false positives with data that passes through
+    // RGBA32PackedToPlanar_16b_SSE41() due to incorrect modeling of shuffles.
+    // See https://crbug.com/webp/573.
+#ifdef WEBP_MSAN
+    dst[3] = 0;
+#endif
   }
   if (width & 1) {
     dst[0] = SUM2(r_ptr + j);
     dst[1] = SUM2(g_ptr + j);
     dst[2] = SUM2(b_ptr + j);
+#ifdef WEBP_MSAN
+    dst[3] = 0;
+#endif
   }
 }
 
@@ -846,6 +476,8 @@
   }
 }
 
+extern void SharpYuvInit(VP8CPUInfo cpu_info_func);
+
 static int ImportYUVAFromRGBA(const uint8_t* r_ptr,
                               const uint8_t* g_ptr,
                               const uint8_t* b_ptr,
@@ -870,18 +502,18 @@
     use_iterative_conversion = 0;
   }
 
-  if (!WebPPictureAllocYUVA(picture, width, height)) {
+  if (!WebPPictureAllocYUVA(picture)) {
     return 0;
   }
   if (has_alpha) {
     assert(step == 4);
 #if defined(USE_GAMMA_COMPRESSION) && defined(USE_INVERSE_ALPHA_TABLE)
-    assert(kAlphaFix + kGammaFix <= 31);
+    assert(kAlphaFix + GAMMA_FIX <= 31);
 #endif
   }
 
   if (use_iterative_conversion) {
-    InitGammaTablesS();
+    SharpYuvInit(VP8GetCPUInfo);
     if (!PreprocessARGB(r_ptr, g_ptr, b_ptr, step, rgb_stride, picture)) {
       return 0;
     }
@@ -910,7 +542,9 @@
     WebPInitConvertARGBToYUV();
     InitGammaTables();
 
-    if (tmp_rgb == NULL) return 0;  // malloc error
+    if (tmp_rgb == NULL) {
+      return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
+    }
 
     // Downsample Y/U/V planes, two rows at a time
     for (y = 0; y < (height >> 1); ++y) {
@@ -1051,7 +685,7 @@
     return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION);
   }
   // Allocate a new argb buffer (discarding the previous one).
-  if (!WebPPictureAllocARGB(picture, picture->width, picture->height)) return 0;
+  if (!WebPPictureAllocARGB(picture)) return 0;
   picture->use_argb = 1;
 
   // Convert
@@ -1061,7 +695,7 @@
     const int height = picture->height;
     const int argb_stride = 4 * picture->argb_stride;
     uint8_t* dst = (uint8_t*)picture->argb;
-    const uint8_t *cur_u = picture->u, *cur_v = picture->v, *cur_y = picture->y;
+    const uint8_t* cur_u = picture->u, *cur_v = picture->v, *cur_y = picture->y;
     WebPUpsampleLinePairFunc upsample =
         WebPGetLinePairConverter(ALPHA_OFFSET > 0);
 
@@ -1113,6 +747,8 @@
   const int width = picture->width;
   const int height = picture->height;
 
+  if (abs(rgb_stride) < (import_alpha ? 4 : 3) * width) return 0;
+
   if (!picture->use_argb) {
     const uint8_t* a_ptr = import_alpha ? rgb + 3 : NULL;
     return ImportYUVAFromRGBA(r_ptr, g_ptr, b_ptr, a_ptr, step, rgb_stride,
@@ -1170,24 +806,24 @@
 #if !defined(WEBP_REDUCE_CSP)
 
 int WebPPictureImportBGR(WebPPicture* picture,
-                         const uint8_t* rgb, int rgb_stride) {
-  return (picture != NULL && rgb != NULL)
-             ? Import(picture, rgb, rgb_stride, 3, 1, 0)
+                         const uint8_t* bgr, int bgr_stride) {
+  return (picture != NULL && bgr != NULL)
+             ? Import(picture, bgr, bgr_stride, 3, 1, 0)
              : 0;
 }
 
 int WebPPictureImportBGRA(WebPPicture* picture,
-                          const uint8_t* rgba, int rgba_stride) {
-  return (picture != NULL && rgba != NULL)
-             ? Import(picture, rgba, rgba_stride, 4, 1, 1)
+                          const uint8_t* bgra, int bgra_stride) {
+  return (picture != NULL && bgra != NULL)
+             ? Import(picture, bgra, bgra_stride, 4, 1, 1)
              : 0;
 }
 
 
 int WebPPictureImportBGRX(WebPPicture* picture,
-                          const uint8_t* rgba, int rgba_stride) {
-  return (picture != NULL && rgba != NULL)
-             ? Import(picture, rgba, rgba_stride, 4, 1, 0)
+                          const uint8_t* bgrx, int bgrx_stride) {
+  return (picture != NULL && bgrx != NULL)
+             ? Import(picture, bgrx, bgrx_stride, 4, 1, 0)
              : 0;
 }
 
@@ -1208,9 +844,9 @@
 }
 
 int WebPPictureImportRGBX(WebPPicture* picture,
-                          const uint8_t* rgba, int rgba_stride) {
-  return (picture != NULL && rgba != NULL)
-             ? Import(picture, rgba, rgba_stride, 4, 0, 0)
+                          const uint8_t* rgbx, int rgbx_stride) {
+  return (picture != NULL && rgbx != NULL)
+             ? Import(picture, rgbx, rgbx_stride, 4, 0, 0)
              : 0;
 }
 
diff --git a/third_party/libwebp/src/enc/picture_enc.c b/third_party/libwebp/src/enc/picture_enc.c
index 81ce345..7a939e7 100644
--- a/third_party/libwebp/src/enc/picture_enc.c
+++ b/third_party/libwebp/src/enc/picture_enc.c
@@ -51,6 +51,22 @@
 
 //------------------------------------------------------------------------------
 
+int WebPValidatePicture(const WebPPicture* const picture) {
+  if (picture == NULL) return 0;
+  if (picture->width <= 0 || picture->height <= 0) {
+    return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
+  }
+  if (picture->width <= 0 || picture->width / 4 > INT_MAX / 4 ||
+      picture->height <= 0 || picture->height / 4 > INT_MAX / 4) {
+    return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
+  }
+  if (picture->colorspace != WEBP_YUV420 &&
+      picture->colorspace != WEBP_YUV420A) {
+    return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION);
+  }
+  return 1;
+}
+
 static void WebPPictureResetBufferARGB(WebPPicture* const picture) {
   picture->memory_argb_ = NULL;
   picture->argb = NULL;
@@ -69,18 +85,17 @@
   WebPPictureResetBufferYUVA(picture);
 }
 
-int WebPPictureAllocARGB(WebPPicture* const picture, int width, int height) {
+int WebPPictureAllocARGB(WebPPicture* const picture) {
   void* memory;
+  const int width = picture->width;
+  const int height = picture->height;
   const uint64_t argb_size = (uint64_t)width * height;
 
-  assert(picture != NULL);
+  if (!WebPValidatePicture(picture)) return 0;
 
   WebPSafeFree(picture->memory_argb_);
   WebPPictureResetBufferARGB(picture);
 
-  if (width <= 0 || height <= 0) {
-    return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
-  }
   // allocate a new buffer.
   memory = WebPSafeMalloc(argb_size + WEBP_ALIGN_CST, sizeof(*picture->argb));
   if (memory == NULL) {
@@ -92,10 +107,10 @@
   return 1;
 }
 
-int WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height) {
-  const WebPEncCSP uv_csp =
-      (WebPEncCSP)((int)picture->colorspace & WEBP_CSP_UV_MASK);
+int WebPPictureAllocYUVA(WebPPicture* const picture) {
   const int has_alpha = (int)picture->colorspace & WEBP_CSP_ALPHA_BIT;
+  const int width = picture->width;
+  const int height = picture->height;
   const int y_stride = width;
   const int uv_width = (int)(((int64_t)width + 1) >> 1);
   const int uv_height = (int)(((int64_t)height + 1) >> 1);
@@ -104,15 +119,11 @@
   uint64_t y_size, uv_size, a_size, total_size;
   uint8_t* mem;
 
-  assert(picture != NULL);
+  if (!WebPValidatePicture(picture)) return 0;
 
   WebPSafeFree(picture->memory_);
   WebPPictureResetBufferYUVA(picture);
 
-  if (uv_csp != WEBP_YUV420) {
-    return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION);
-  }
-
   // alpha
   a_width = has_alpha ? width : 0;
   a_stride = a_width;
@@ -158,15 +169,12 @@
 
 int WebPPictureAlloc(WebPPicture* picture) {
   if (picture != NULL) {
-    const int width = picture->width;
-    const int height = picture->height;
-
     WebPPictureFree(picture);   // erase previous buffer
 
     if (!picture->use_argb) {
-      return WebPPictureAllocYUVA(picture, width, height);
+      return WebPPictureAllocYUVA(picture);
     } else {
-      return WebPPictureAllocARGB(picture, width, height);
+      return WebPPictureAllocARGB(picture);
     }
   }
   return 1;
diff --git a/third_party/libwebp/src/enc/picture_rescale_enc.c b/third_party/libwebp/src/enc/picture_rescale_enc.c
index 58a6ae7..ea90d82 100644
--- a/third_party/libwebp/src/enc/picture_rescale_enc.c
+++ b/third_party/libwebp/src/enc/picture_rescale_enc.c
@@ -13,14 +13,15 @@
 
 #include "src/webp/encode.h"
 
-#if !defined(WEBP_REDUCE_SIZE)
-
 #include <assert.h>
 #include <stdlib.h>
 
 #include "src/enc/vp8i_enc.h"
+
+#if !defined(WEBP_REDUCE_SIZE)
 #include "src/utils/rescaler_utils.h"
 #include "src/utils/utils.h"
+#endif  // !defined(WEBP_REDUCE_SIZE)
 
 #define HALVE(x) (((x) + 1) >> 1)
 
@@ -56,6 +57,7 @@
   return 1;
 }
 
+#if !defined(WEBP_REDUCE_SIZE)
 int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst) {
   if (src == NULL || dst == NULL) return 0;
   if (src == dst) return 1;
@@ -81,6 +83,7 @@
   }
   return 1;
 }
+#endif  // !defined(WEBP_REDUCE_SIZE)
 
 int WebPPictureIsView(const WebPPicture* picture) {
   if (picture == NULL) return 0;
@@ -120,6 +123,7 @@
   return 1;
 }
 
+#if !defined(WEBP_REDUCE_SIZE)
 //------------------------------------------------------------------------------
 // Picture cropping
 
@@ -133,7 +137,9 @@
   PictureGrabSpecs(pic, &tmp);
   tmp.width = width;
   tmp.height = height;
-  if (!WebPPictureAlloc(&tmp)) return 0;
+  if (!WebPPictureAlloc(&tmp)) {
+    return WebPEncodingSetError(pic, tmp.error_code);
+  }
 
   if (!pic->use_argb) {
     const int y_offset = top * pic->y_stride + left;
@@ -164,22 +170,25 @@
 //------------------------------------------------------------------------------
 // Simple picture rescaler
 
-static void RescalePlane(const uint8_t* src,
-                         int src_width, int src_height, int src_stride,
-                         uint8_t* dst,
-                         int dst_width, int dst_height, int dst_stride,
-                         rescaler_t* const work,
-                         int num_channels) {
+static int RescalePlane(const uint8_t* src,
+                        int src_width, int src_height, int src_stride,
+                        uint8_t* dst,
+                        int dst_width, int dst_height, int dst_stride,
+                        rescaler_t* const work,
+                        int num_channels) {
   WebPRescaler rescaler;
   int y = 0;
-  WebPRescalerInit(&rescaler, src_width, src_height,
-                   dst, dst_width, dst_height, dst_stride,
-                   num_channels, work);
+  if (!WebPRescalerInit(&rescaler, src_width, src_height,
+                        dst, dst_width, dst_height, dst_stride,
+                        num_channels, work)) {
+    return 0;
+  }
   while (y < src_height) {
     y += WebPRescalerImport(&rescaler, src_height - y,
                             src + y * src_stride, src_stride);
     WebPRescalerExport(&rescaler);
   }
+  return 1;
 }
 
 static void AlphaMultiplyARGB(WebPPicture* const pic, int inverse) {
@@ -195,73 +204,76 @@
   }
 }
 
-int WebPPictureRescale(WebPPicture* pic, int width, int height) {
+int WebPPictureRescale(WebPPicture* picture, int width, int height) {
   WebPPicture tmp;
   int prev_width, prev_height;
   rescaler_t* work;
 
-  if (pic == NULL) return 0;
-  prev_width = pic->width;
-  prev_height = pic->height;
+  if (picture == NULL) return 0;
+  prev_width = picture->width;
+  prev_height = picture->height;
   if (!WebPRescalerGetScaledDimensions(
           prev_width, prev_height, &width, &height)) {
-    return 0;
+    return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
   }
 
-  PictureGrabSpecs(pic, &tmp);
+  PictureGrabSpecs(picture, &tmp);
   tmp.width = width;
   tmp.height = height;
-  if (!WebPPictureAlloc(&tmp)) return 0;
+  if (!WebPPictureAlloc(&tmp)) {
+    return WebPEncodingSetError(picture, tmp.error_code);
+  }
 
-  if (!pic->use_argb) {
+  if (!picture->use_argb) {
     work = (rescaler_t*)WebPSafeMalloc(2ULL * width, sizeof(*work));
     if (work == NULL) {
       WebPPictureFree(&tmp);
-      return 0;
+      return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
     }
     // If present, we need to rescale alpha first (for AlphaMultiplyY).
-    if (pic->a != NULL) {
+    if (picture->a != NULL) {
       WebPInitAlphaProcessing();
-      RescalePlane(pic->a, prev_width, prev_height, pic->a_stride,
-                   tmp.a, width, height, tmp.a_stride, work, 1);
+      if (!RescalePlane(picture->a, prev_width, prev_height, picture->a_stride,
+                        tmp.a, width, height, tmp.a_stride, work, 1)) {
+        return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
+      }
     }
 
     // We take transparency into account on the luma plane only. That's not
     // totally exact blending, but still is a good approximation.
-    AlphaMultiplyY(pic, 0);
-    RescalePlane(pic->y, prev_width, prev_height, pic->y_stride,
-                 tmp.y, width, height, tmp.y_stride, work, 1);
+    AlphaMultiplyY(picture, 0);
+    if (!RescalePlane(picture->y, prev_width, prev_height, picture->y_stride,
+                      tmp.y, width, height, tmp.y_stride, work, 1) ||
+        !RescalePlane(picture->u, HALVE(prev_width), HALVE(prev_height),
+                      picture->uv_stride, tmp.u, HALVE(width), HALVE(height),
+                      tmp.uv_stride, work, 1) ||
+        !RescalePlane(picture->v, HALVE(prev_width), HALVE(prev_height),
+                      picture->uv_stride, tmp.v, HALVE(width), HALVE(height),
+                      tmp.uv_stride, work, 1)) {
+      return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
+    }
     AlphaMultiplyY(&tmp, 1);
-
-    RescalePlane(pic->u,
-                 HALVE(prev_width), HALVE(prev_height), pic->uv_stride,
-                 tmp.u,
-                 HALVE(width), HALVE(height), tmp.uv_stride, work, 1);
-    RescalePlane(pic->v,
-                 HALVE(prev_width), HALVE(prev_height), pic->uv_stride,
-                 tmp.v,
-                 HALVE(width), HALVE(height), tmp.uv_stride, work, 1);
   } else {
     work = (rescaler_t*)WebPSafeMalloc(2ULL * width * 4, sizeof(*work));
     if (work == NULL) {
       WebPPictureFree(&tmp);
-      return 0;
+      return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
     }
     // In order to correctly interpolate colors, we need to apply the alpha
     // weighting first (black-matting), scale the RGB values, and remove
     // the premultiplication afterward (while preserving the alpha channel).
     WebPInitAlphaProcessing();
-    AlphaMultiplyARGB(pic, 0);
-    RescalePlane((const uint8_t*)pic->argb, prev_width, prev_height,
-                 pic->argb_stride * 4,
-                 (uint8_t*)tmp.argb, width, height,
-                 tmp.argb_stride * 4,
-                 work, 4);
+    AlphaMultiplyARGB(picture, 0);
+    if (!RescalePlane((const uint8_t*)picture->argb, prev_width, prev_height,
+                      picture->argb_stride * 4, (uint8_t*)tmp.argb, width,
+                      height, tmp.argb_stride * 4, work, 4)) {
+      return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
+    }
     AlphaMultiplyARGB(&tmp, 1);
   }
-  WebPPictureFree(pic);
+  WebPPictureFree(picture);
   WebPSafeFree(work);
-  *pic = tmp;
+  *picture = tmp;
   return 1;
 }
 
@@ -273,23 +285,6 @@
   return 0;
 }
 
-int WebPPictureIsView(const WebPPicture* picture) {
-  (void)picture;
-  return 0;
-}
-
-int WebPPictureView(const WebPPicture* src,
-                    int left, int top, int width, int height,
-                    WebPPicture* dst) {
-  (void)src;
-  (void)left;
-  (void)top;
-  (void)width;
-  (void)height;
-  (void)dst;
-  return 0;
-}
-
 int WebPPictureCrop(WebPPicture* pic,
                     int left, int top, int width, int height) {
   (void)pic;
diff --git a/third_party/libwebp/src/enc/picture_tools_enc.c b/third_party/libwebp/src/enc/picture_tools_enc.c
index 01dc6ca..894cb5f 100644
--- a/third_party/libwebp/src/enc/picture_tools_enc.c
+++ b/third_party/libwebp/src/enc/picture_tools_enc.c
@@ -21,10 +21,6 @@
 #include "src/enc/vp8i_enc.h"
 #include "src/dsp/yuv.h"
 
-static WEBP_INLINE uint32_t MakeARGB32(int r, int g, int b) {
-  return (0xff000000u | (r << 16) | (g << 8) | b);
-}
-
 //------------------------------------------------------------------------------
 // Helper: clean up fully transparent area to help compressibility.
 
@@ -92,6 +88,19 @@
   return (count == 0);
 }
 
+void WebPReplaceTransparentPixels(WebPPicture* const pic, uint32_t color) {
+  if (pic != NULL && pic->use_argb) {
+    int y = pic->height;
+    uint32_t* argb = pic->argb;
+    color &= 0xffffffu;   // force alpha=0
+    WebPInitAlphaProcessing();
+    while (y-- > 0) {
+      WebPAlphaReplace(argb, pic->width, color);
+      argb += pic->argb_stride;
+    }
+  }
+}
+
 void WebPCleanupTransparentArea(WebPPicture* pic) {
   int x, y, w, h;
   if (pic == NULL) return;
@@ -174,24 +183,6 @@
 #undef SIZE
 #undef SIZE2
 
-void WebPCleanupTransparentAreaLossless(WebPPicture* const pic) {
-  int x, y, w, h;
-  uint32_t* argb;
-  assert(pic != NULL && pic->use_argb);
-  w = pic->width;
-  h = pic->height;
-  argb = pic->argb;
-
-  for (y = 0; y < h; ++y) {
-    for (x = 0; x < w; ++x) {
-      if ((argb[x] & 0xff000000) == 0) {
-        argb[x] = 0x00000000;
-      }
-    }
-    argb += pic->argb_stride;
-  }
-}
-
 //------------------------------------------------------------------------------
 // Blend color and remove transparency info
 
@@ -200,58 +191,68 @@
 #define BLEND_10BIT(V0, V1, ALPHA) \
     ((((V0) * (1020 - (ALPHA)) + (V1) * (ALPHA)) * 0x101 + 1024) >> 18)
 
-void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb) {
+static WEBP_INLINE uint32_t MakeARGB32(int r, int g, int b) {
+  return (0xff000000u | (r << 16) | (g << 8) | b);
+}
+
+void WebPBlendAlpha(WebPPicture* picture, uint32_t background_rgb) {
   const int red = (background_rgb >> 16) & 0xff;
   const int green = (background_rgb >> 8) & 0xff;
   const int blue = (background_rgb >> 0) & 0xff;
   int x, y;
-  if (pic == NULL) return;
-  if (!pic->use_argb) {
-    const int uv_width = (pic->width >> 1);  // omit last pixel during u/v loop
+  if (picture == NULL) return;
+  if (!picture->use_argb) {
+    // omit last pixel during u/v loop
+    const int uv_width = (picture->width >> 1);
     const int Y0 = VP8RGBToY(red, green, blue, YUV_HALF);
     // VP8RGBToU/V expects the u/v values summed over four pixels
     const int U0 = VP8RGBToU(4 * red, 4 * green, 4 * blue, 4 * YUV_HALF);
     const int V0 = VP8RGBToV(4 * red, 4 * green, 4 * blue, 4 * YUV_HALF);
-    const int has_alpha = pic->colorspace & WEBP_CSP_ALPHA_BIT;
-    if (!has_alpha || pic->a == NULL) return;    // nothing to do
-    for (y = 0; y < pic->height; ++y) {
+    const int has_alpha = picture->colorspace & WEBP_CSP_ALPHA_BIT;
+    uint8_t* y_ptr = picture->y;
+    uint8_t* u_ptr = picture->u;
+    uint8_t* v_ptr = picture->v;
+    uint8_t* a_ptr = picture->a;
+    if (!has_alpha || a_ptr == NULL) return;    // nothing to do
+    for (y = 0; y < picture->height; ++y) {
       // Luma blending
-      uint8_t* const y_ptr = pic->y + y * pic->y_stride;
-      uint8_t* const a_ptr = pic->a + y * pic->a_stride;
-      for (x = 0; x < pic->width; ++x) {
-        const int alpha = a_ptr[x];
+      for (x = 0; x < picture->width; ++x) {
+        const uint8_t alpha = a_ptr[x];
         if (alpha < 0xff) {
-          y_ptr[x] = BLEND(Y0, y_ptr[x], a_ptr[x]);
+          y_ptr[x] = BLEND(Y0, y_ptr[x], alpha);
         }
       }
       // Chroma blending every even line
       if ((y & 1) == 0) {
-        uint8_t* const u = pic->u + (y >> 1) * pic->uv_stride;
-        uint8_t* const v = pic->v + (y >> 1) * pic->uv_stride;
         uint8_t* const a_ptr2 =
-            (y + 1 == pic->height) ? a_ptr : a_ptr + pic->a_stride;
+            (y + 1 == picture->height) ? a_ptr : a_ptr + picture->a_stride;
         for (x = 0; x < uv_width; ++x) {
           // Average four alpha values into a single blending weight.
           // TODO(skal): might lead to visible contouring. Can we do better?
-          const int alpha =
+          const uint32_t alpha =
               a_ptr[2 * x + 0] + a_ptr[2 * x + 1] +
               a_ptr2[2 * x + 0] + a_ptr2[2 * x + 1];
-          u[x] = BLEND_10BIT(U0, u[x], alpha);
-          v[x] = BLEND_10BIT(V0, v[x], alpha);
+          u_ptr[x] = BLEND_10BIT(U0, u_ptr[x], alpha);
+          v_ptr[x] = BLEND_10BIT(V0, v_ptr[x], alpha);
         }
-        if (pic->width & 1) {   // rightmost pixel
-          const int alpha = 2 * (a_ptr[2 * x + 0] + a_ptr2[2 * x + 0]);
-          u[x] = BLEND_10BIT(U0, u[x], alpha);
-          v[x] = BLEND_10BIT(V0, v[x], alpha);
+        if (picture->width & 1) {  // rightmost pixel
+          const uint32_t alpha = 2 * (a_ptr[2 * x + 0] + a_ptr2[2 * x + 0]);
+          u_ptr[x] = BLEND_10BIT(U0, u_ptr[x], alpha);
+          v_ptr[x] = BLEND_10BIT(V0, v_ptr[x], alpha);
         }
+      } else {
+        u_ptr += picture->uv_stride;
+        v_ptr += picture->uv_stride;
       }
-      memset(a_ptr, 0xff, pic->width);
+      memset(a_ptr, 0xff, picture->width);  // reset alpha value to opaque
+      a_ptr += picture->a_stride;
+      y_ptr += picture->y_stride;
     }
   } else {
-    uint32_t* argb = pic->argb;
+    uint32_t* argb = picture->argb;
     const uint32_t background = MakeARGB32(red, green, blue);
-    for (y = 0; y < pic->height; ++y) {
-      for (x = 0; x < pic->width; ++x) {
+    for (y = 0; y < picture->height; ++y) {
+      for (x = 0; x < picture->width; ++x) {
         const int alpha = (argb[x] >> 24) & 0xff;
         if (alpha != 0xff) {
           if (alpha > 0) {
@@ -267,7 +268,7 @@
           }
         }
       }
-      argb += pic->argb_stride;
+      argb += picture->argb_stride;
     }
   }
 }
diff --git a/third_party/libwebp/src/enc/predictor_enc.c b/third_party/libwebp/src/enc/predictor_enc.c
index df9f666..04a2a98 100644
--- a/third_party/libwebp/src/enc/predictor_enc.c
+++ b/third_party/libwebp/src/enc/predictor_enc.c
@@ -23,6 +23,7 @@
 
 #include "src/dsp/lossless.h"
 #include "src/dsp/lossless_common.h"
+#include "src/enc/vp8i_enc.h"
 #include "src/enc/vp8li_enc.h"
 
 #define MAX_DIFF_COST (1e30f)
@@ -38,10 +39,10 @@
 // Methods to calculate Entropy (Shannon).
 
 static float PredictionCostSpatial(const int counts[256], int weight_0,
-                                   double exp_val) {
+                                   float exp_val) {
   const int significant_symbols = 256 >> 4;
-  const double exp_decay_factor = 0.6;
-  double bits = weight_0 * counts[0];
+  const float exp_decay_factor = 0.6f;
+  float bits = (float)weight_0 * counts[0];
   int i;
   for (i = 1; i < significant_symbols; ++i) {
     bits += exp_val * (counts[i] + counts[256 - i]);
@@ -53,9 +54,9 @@
 static float PredictionCostSpatialHistogram(const int accumulated[4][256],
                                             const int tile[4][256]) {
   int i;
-  double retval = 0;
+  float retval = 0.f;
   for (i = 0; i < 4; ++i) {
-    const double kExpValue = 0.94;
+    const float kExpValue = 0.94f;
     retval += PredictionCostSpatial(tile[i], 1, kExpValue);
     retval += VP8LCombinedShannonEntropy(tile[i], accumulated[i]);
   }
@@ -184,12 +185,15 @@
   }
 }
 
+static WEBP_INLINE uint8_t NearLosslessDiff(uint8_t a, uint8_t b) {
+  return (uint8_t)((((int)(a) - (int)(b))) & 0xff);
+}
+
 // Quantize every component of the difference between the actual pixel value and
 // its prediction to a multiple of a quantization (a power of 2, not larger than
 // max_quantization which is a power of 2, smaller than max_diff). Take care if
 // value and predict have undergone subtract green, which means that red and
 // blue are represented as offsets from green.
-#define NEAR_LOSSLESS_DIFF(a, b) (uint8_t)((((int)(a) - (int)(b))) & 0xff)
 static uint32_t NearLossless(uint32_t value, uint32_t predict,
                              int max_quantization, int max_diff,
                              int used_subtract_green) {
@@ -206,7 +210,7 @@
   }
   if ((value >> 24) == 0 || (value >> 24) == 0xff) {
     // Preserve transparency of fully transparent or fully opaque pixels.
-    a = NEAR_LOSSLESS_DIFF(value >> 24, predict >> 24);
+    a = NearLosslessDiff((value >> 24) & 0xff, (predict >> 24) & 0xff);
   } else {
     a = NearLosslessComponent(value >> 24, predict >> 24, 0xff, quantization);
   }
@@ -219,16 +223,15 @@
     // The amount by which green has been adjusted during quantization. It is
     // subtracted from red and blue for compensation, to avoid accumulating two
     // quantization errors in them.
-    green_diff = NEAR_LOSSLESS_DIFF(new_green, value >> 8);
+    green_diff = NearLosslessDiff(new_green, (value >> 8) & 0xff);
   }
-  r = NearLosslessComponent(NEAR_LOSSLESS_DIFF(value >> 16, green_diff),
+  r = NearLosslessComponent(NearLosslessDiff((value >> 16) & 0xff, green_diff),
                             (predict >> 16) & 0xff, 0xff - new_green,
                             quantization);
-  b = NearLosslessComponent(NEAR_LOSSLESS_DIFF(value, green_diff),
+  b = NearLosslessComponent(NearLosslessDiff(value & 0xff, green_diff),
                             predict & 0xff, 0xff - new_green, quantization);
   return ((uint32_t)a << 24) | ((uint32_t)r << 16) | ((uint32_t)g << 8) | b;
 }
-#undef NEAR_LOSSLESS_DIFF
 #endif  // (WEBP_NEAR_LOSSLESS == 1)
 
 // Stores the difference between the pixel and its prediction in "out".
@@ -254,7 +257,7 @@
       } else if (x == 0) {
         predict = upper_row[x];  // Top.
       } else {
-        predict = pred_func(current_row[x - 1], upper_row + x);
+        predict = pred_func(&current_row[x - 1], upper_row + x);
       }
 #if (WEBP_NEAR_LOSSLESS == 1)
       if (max_quantization == 1 || mode == 0 || y == 0 || y == height - 1 ||
@@ -477,12 +480,15 @@
 // with respect to predictions. If near_lossless_quality < 100, applies
 // near lossless processing, shaving off more bits of residuals for lower
 // qualities.
-void VP8LResidualImage(int width, int height, int bits, int low_effort,
-                       uint32_t* const argb, uint32_t* const argb_scratch,
-                       uint32_t* const image, int near_lossless_quality,
-                       int exact, int used_subtract_green) {
+int VP8LResidualImage(int width, int height, int bits, int low_effort,
+                      uint32_t* const argb, uint32_t* const argb_scratch,
+                      uint32_t* const image, int near_lossless_quality,
+                      int exact, int used_subtract_green,
+                      const WebPPicture* const pic, int percent_range,
+                      int* const percent) {
   const int tiles_per_row = VP8LSubSampleSize(width, bits);
   const int tiles_per_col = VP8LSubSampleSize(height, bits);
+  int percent_start = *percent;
   int tile_y;
   int histo[4][256];
   const int max_quantization = 1 << VP8LNearLosslessBits(near_lossless_quality);
@@ -496,17 +502,24 @@
     for (tile_y = 0; tile_y < tiles_per_col; ++tile_y) {
       int tile_x;
       for (tile_x = 0; tile_x < tiles_per_row; ++tile_x) {
-        const int pred = GetBestPredictorForTile(width, height, tile_x, tile_y,
-            bits, histo, argb_scratch, argb, max_quantization, exact,
-            used_subtract_green, image);
+        const int pred = GetBestPredictorForTile(
+            width, height, tile_x, tile_y, bits, histo, argb_scratch, argb,
+            max_quantization, exact, used_subtract_green, image);
         image[tile_y * tiles_per_row + tile_x] = ARGB_BLACK | (pred << 8);
       }
+
+      if (!WebPReportProgress(
+              pic, percent_start + percent_range * tile_y / tiles_per_col,
+              percent)) {
+        return 0;
+      }
     }
   }
 
   CopyImageWithPrediction(width, height, bits, image, argb_scratch, argb,
                           low_effort, max_quantization, exact,
                           used_subtract_green);
+  return WebPReportProgress(pic, percent_start + percent_range, percent);
 }
 
 //------------------------------------------------------------------------------
@@ -537,7 +550,7 @@
                                       const int counts[256]) {
   // Favor low entropy, locally and globally.
   // Favor small absolute values for PredictionCostSpatial
-  static const double kExpValue = 2.4;
+  static const float kExpValue = 2.4f;
   return VP8LCombinedShannonEntropy(counts, accumulated) +
          PredictionCostSpatial(counts, 3, kExpValue);
 }
@@ -592,7 +605,7 @@
       }
     }
   }
-  best_tx->green_to_red_ = green_to_red_best;
+  best_tx->green_to_red_ = (green_to_red_best & 0xff);
 }
 
 static float GetPredictionCostCrossColorBlue(
@@ -671,8 +684,8 @@
       break;  // out of iter-loop.
     }
   }
-  best_tx->green_to_blue_ = green_to_blue_best;
-  best_tx->red_to_blue_ = red_to_blue_best;
+  best_tx->green_to_blue_ = green_to_blue_best & 0xff;
+  best_tx->red_to_blue_ = red_to_blue_best & 0xff;
 }
 #undef kGreenRedToBlueMaxIters
 #undef kGreenRedToBlueNumAxis
@@ -719,11 +732,14 @@
   }
 }
 
-void VP8LColorSpaceTransform(int width, int height, int bits, int quality,
-                             uint32_t* const argb, uint32_t* image) {
+int VP8LColorSpaceTransform(int width, int height, int bits, int quality,
+                            uint32_t* const argb, uint32_t* image,
+                            const WebPPicture* const pic, int percent_range,
+                            int* const percent) {
   const int max_tile_size = 1 << bits;
   const int tile_xsize = VP8LSubSampleSize(width, bits);
   const int tile_ysize = VP8LSubSampleSize(height, bits);
+  int percent_start = *percent;
   int accumulated_red_histo[256] = { 0 };
   int accumulated_blue_histo[256] = { 0 };
   int tile_x, tile_y;
@@ -773,5 +789,11 @@
         }
       }
     }
+    if (!WebPReportProgress(
+            pic, percent_start + percent_range * tile_y / tile_ysize,
+            percent)) {
+      return 0;
+    }
   }
+  return 1;
 }
diff --git a/third_party/libwebp/src/enc/quant_enc.c b/third_party/libwebp/src/enc/quant_enc.c
index 0ba889b..ad731a8 100644
--- a/third_party/libwebp/src/enc/quant_enc.c
+++ b/third_party/libwebp/src/enc/quant_enc.c
@@ -23,6 +23,7 @@
 
 #include <stdlib.h>  // for abs()
 
+#include "src/dsp/quant.h"
 #include "src/enc/vp8i_enc.h"
 #include "src/enc/cost_enc.h"
 
@@ -40,7 +41,7 @@
 
 // number of non-zero coeffs below which we consider the block very flat
 // (and apply a penalty to complex predictions)
-#define FLATNESS_LIMIT_I16 10      // I16 mode
+#define FLATNESS_LIMIT_I16 0       // I16 mode (special case)
 #define FLATNESS_LIMIT_I4  3       // I4 mode
 #define FLATNESS_LIMIT_UV  2       // UV mode
 #define FLATNESS_PENALTY   140     // roughly ~1bit per block
@@ -540,7 +541,8 @@
   rd->score = MAX_COST;
 }
 
-static void CopyScore(VP8ModeScore* const dst, const VP8ModeScore* const src) {
+static void CopyScore(VP8ModeScore* WEBP_RESTRICT const dst,
+                      const VP8ModeScore* WEBP_RESTRICT const src) {
   dst->D  = src->D;
   dst->SD = src->SD;
   dst->R  = src->R;
@@ -549,7 +551,8 @@
   dst->score = src->score;
 }
 
-static void AddScore(VP8ModeScore* const dst, const VP8ModeScore* const src) {
+static void AddScore(VP8ModeScore* WEBP_RESTRICT const dst,
+                     const VP8ModeScore* WEBP_RESTRICT const src) {
   dst->D  += src->D;
   dst->SD += src->SD;
   dst->R  += src->R;
@@ -592,15 +595,18 @@
   return rate * lambda + RD_DISTO_MULT * distortion;
 }
 
-static int TrellisQuantizeBlock(const VP8Encoder* const enc,
+// Coefficient type.
+enum { TYPE_I16_AC = 0, TYPE_I16_DC = 1, TYPE_CHROMA_A = 2, TYPE_I4_AC = 3 };
+
+static int TrellisQuantizeBlock(const VP8Encoder* WEBP_RESTRICT const enc,
                                 int16_t in[16], int16_t out[16],
                                 int ctx0, int coeff_type,
-                                const VP8Matrix* const mtx,
+                                const VP8Matrix* WEBP_RESTRICT const mtx,
                                 int lambda) {
   const ProbaArray* const probas = enc->proba_.coeffs_[coeff_type];
   CostArrayPtr const costs =
       (CostArrayPtr)enc->proba_.remapped_costs_[coeff_type];
-  const int first = (coeff_type == 0) ? 1 : 0;
+  const int first = (coeff_type == TYPE_I16_AC) ? 1 : 0;
   Node nodes[16][NUM_NODES];
   ScoreState score_states[2][NUM_NODES];
   ScoreState* ss_cur = &SCORE_STATE(0, MIN_DELTA);
@@ -664,16 +670,17 @@
     // test all alternate level values around level0.
     for (m = -MIN_DELTA; m <= MAX_DELTA; ++m) {
       Node* const cur = &NODE(n, m);
-      int level = level0 + m;
+      const int level = level0 + m;
       const int ctx = (level > 2) ? 2 : level;
       const int band = VP8EncBands[n + 1];
       score_t base_score;
-      score_t best_cur_score = MAX_COST;
-      int best_prev = 0;   // default, in case
+      score_t best_cur_score;
+      int best_prev;
+      score_t cost, score;
 
-      ss_cur[m].score = MAX_COST;
       ss_cur[m].costs = costs[n + 1][ctx];
       if (level < 0 || level > thresh_level) {
+        ss_cur[m].score = MAX_COST;
         // Node is dead.
         continue;
       }
@@ -689,18 +696,24 @@
       }
 
       // Inspect all possible non-dead predecessors. Retain only the best one.
-      for (p = -MIN_DELTA; p <= MAX_DELTA; ++p) {
+      // The base_score is added to all scores so it is only added for the final
+      // value after the loop.
+      cost = VP8LevelCost(ss_prev[-MIN_DELTA].costs, level);
+      best_cur_score =
+          ss_prev[-MIN_DELTA].score + RDScoreTrellis(lambda, cost, 0);
+      best_prev = -MIN_DELTA;
+      for (p = -MIN_DELTA + 1; p <= MAX_DELTA; ++p) {
         // Dead nodes (with ss_prev[p].score >= MAX_COST) are automatically
         // eliminated since their score can't be better than the current best.
-        const score_t cost = VP8LevelCost(ss_prev[p].costs, level);
+        cost = VP8LevelCost(ss_prev[p].costs, level);
         // Examine node assuming it's a non-terminal one.
-        const score_t score =
-            base_score + ss_prev[p].score + RDScoreTrellis(lambda, cost, 0);
+        score = ss_prev[p].score + RDScoreTrellis(lambda, cost, 0);
         if (score < best_cur_score) {
           best_cur_score = score;
           best_prev = p;
         }
       }
+      best_cur_score += base_score;
       // Store best finding in current node.
       cur->sign = sign;
       cur->level = level;
@@ -708,11 +721,11 @@
       ss_cur[m].score = best_cur_score;
 
       // Now, record best terminal node (and thus best entry in the graph).
-      if (level != 0) {
+      if (level != 0 && best_cur_score < best_score) {
         const score_t last_pos_cost =
             (n < 15) ? VP8BitCost(0, probas[band][ctx][0]) : 0;
         const score_t last_pos_score = RDScoreTrellis(lambda, last_pos_cost, 0);
-        const score_t score = best_cur_score + last_pos_score;
+        score = best_cur_score + last_pos_score;
         if (score < best_score) {
           best_score = score;
           best_path[0] = n;                     // best eob position
@@ -724,10 +737,16 @@
   }
 
   // Fresh start
-  memset(in + first, 0, (16 - first) * sizeof(*in));
-  memset(out + first, 0, (16 - first) * sizeof(*out));
+  // Beware! We must preserve in[0]/out[0] value for TYPE_I16_AC case.
+  if (coeff_type == TYPE_I16_AC) {
+    memset(in + 1, 0, 15 * sizeof(*in));
+    memset(out + 1, 0, 15 * sizeof(*out));
+  } else {
+    memset(in, 0, 16 * sizeof(*in));
+    memset(out, 0, 16 * sizeof(*out));
+  }
   if (best_path[0] == -1) {
-    return 0;   // skip!
+    return 0;  // skip!
   }
 
   {
@@ -758,9 +777,9 @@
 // all at once. Output is the reconstructed block in *yuv_out, and the
 // quantized levels in *levels.
 
-static int ReconstructIntra16(VP8EncIterator* const it,
-                              VP8ModeScore* const rd,
-                              uint8_t* const yuv_out,
+static int ReconstructIntra16(VP8EncIterator* WEBP_RESTRICT const it,
+                              VP8ModeScore* WEBP_RESTRICT const rd,
+                              uint8_t* WEBP_RESTRICT const yuv_out,
                               int mode) {
   const VP8Encoder* const enc = it->enc_;
   const uint8_t* const ref = it->yuv_p_ + VP8I16ModeOffsets[mode];
@@ -782,9 +801,9 @@
     for (y = 0, n = 0; y < 4; ++y) {
       for (x = 0; x < 4; ++x, ++n) {
         const int ctx = it->top_nz_[x] + it->left_nz_[y];
-        const int non_zero =
-            TrellisQuantizeBlock(enc, tmp[n], rd->y_ac_levels[n], ctx, 0,
-                                 &dqm->y1_, dqm->lambda_trellis_i16_);
+        const int non_zero = TrellisQuantizeBlock(
+            enc, tmp[n], rd->y_ac_levels[n], ctx, TYPE_I16_AC, &dqm->y1_,
+            dqm->lambda_trellis_i16_);
         it->top_nz_[x] = it->left_nz_[y] = non_zero;
         rd->y_ac_levels[n][0] = 0;
         nz |= non_zero << n;
@@ -810,10 +829,10 @@
   return nz;
 }
 
-static int ReconstructIntra4(VP8EncIterator* const it,
+static int ReconstructIntra4(VP8EncIterator* WEBP_RESTRICT const it,
                              int16_t levels[16],
-                             const uint8_t* const src,
-                             uint8_t* const yuv_out,
+                             const uint8_t* WEBP_RESTRICT const src,
+                             uint8_t* WEBP_RESTRICT const yuv_out,
                              int mode) {
   const VP8Encoder* const enc = it->enc_;
   const uint8_t* const ref = it->yuv_p_ + VP8I4ModeOffsets[mode];
@@ -825,7 +844,7 @@
   if (DO_TRELLIS_I4 && it->do_trellis_) {
     const int x = it->i4_ & 3, y = it->i4_ >> 2;
     const int ctx = it->top_nz_[x] + it->left_nz_[y];
-    nz = TrellisQuantizeBlock(enc, tmp, levels, ctx, 3, &dqm->y1_,
+    nz = TrellisQuantizeBlock(enc, tmp, levels, ctx, TYPE_I4_AC, &dqm->y1_,
                               dqm->lambda_trellis_i4_);
   } else {
     nz = VP8EncQuantizeBlock(tmp, levels, &dqm->y1_);
@@ -846,7 +865,8 @@
 
 // Quantize as usual, but also compute and return the quantization error.
 // Error is already divided by DSHIFT.
-static int QuantizeSingle(int16_t* const v, const VP8Matrix* const mtx) {
+static int QuantizeSingle(int16_t* WEBP_RESTRICT const v,
+                          const VP8Matrix* WEBP_RESTRICT const mtx) {
   int V = *v;
   const int sign = (V < 0);
   if (sign) V = -V;
@@ -860,9 +880,10 @@
   return (sign ? -V : V) >> DSCALE;
 }
 
-static void CorrectDCValues(const VP8EncIterator* const it,
-                            const VP8Matrix* const mtx,
-                            int16_t tmp[][16], VP8ModeScore* const rd) {
+static void CorrectDCValues(const VP8EncIterator* WEBP_RESTRICT const it,
+                            const VP8Matrix* WEBP_RESTRICT const mtx,
+                            int16_t tmp[][16],
+                            VP8ModeScore* WEBP_RESTRICT const rd) {
   //         | top[0] | top[1]
   // --------+--------+---------
   // left[0] | tmp[0]   tmp[1]  <->   err0 err1
@@ -893,8 +914,8 @@
   }
 }
 
-static void StoreDiffusionErrors(VP8EncIterator* const it,
-                                 const VP8ModeScore* const rd) {
+static void StoreDiffusionErrors(VP8EncIterator* WEBP_RESTRICT const it,
+                                 const VP8ModeScore* WEBP_RESTRICT const rd) {
   int ch;
   for (ch = 0; ch <= 1; ++ch) {
     int8_t* const top = it->top_derr_[it->x_][ch];
@@ -913,8 +934,9 @@
 
 //------------------------------------------------------------------------------
 
-static int ReconstructUV(VP8EncIterator* const it, VP8ModeScore* const rd,
-                         uint8_t* const yuv_out, int mode) {
+static int ReconstructUV(VP8EncIterator* WEBP_RESTRICT const it,
+                         VP8ModeScore* WEBP_RESTRICT const rd,
+                         uint8_t* WEBP_RESTRICT const yuv_out, int mode) {
   const VP8Encoder* const enc = it->enc_;
   const uint8_t* const ref = it->yuv_p_ + VP8UVModeOffsets[mode];
   const uint8_t* const src = it->yuv_in_ + U_OFF_ENC;
@@ -934,9 +956,9 @@
       for (y = 0; y < 2; ++y) {
         for (x = 0; x < 2; ++x, ++n) {
           const int ctx = it->top_nz_[4 + ch + x] + it->left_nz_[4 + ch + y];
-          const int non_zero =
-              TrellisQuantizeBlock(enc, tmp[n], rd->uv_levels[n], ctx, 2,
-                                   &dqm->uv_, dqm->lambda_trellis_uv_);
+          const int non_zero = TrellisQuantizeBlock(
+              enc, tmp[n], rd->uv_levels[n], ctx, TYPE_CHROMA_A, &dqm->uv_,
+              dqm->lambda_trellis_uv_);
           it->top_nz_[4 + ch + x] = it->left_nz_[4 + ch + y] = non_zero;
           nz |= non_zero << n;
         }
@@ -985,20 +1007,8 @@
   SwapPtr(&it->yuv_out_, &it->yuv_out2_);
 }
 
-static score_t IsFlat(const int16_t* levels, int num_blocks, score_t thresh) {
-  score_t score = 0;
-  while (num_blocks-- > 0) {      // TODO(skal): refine positional scoring?
-    int i;
-    for (i = 1; i < 16; ++i) {    // omit DC, we're only interested in AC
-      score += (levels[i] != 0);
-      if (score > thresh) return 0;
-    }
-    levels += 16;
-  }
-  return 1;
-}
-
-static void PickBestIntra16(VP8EncIterator* const it, VP8ModeScore* rd) {
+static void PickBestIntra16(VP8EncIterator* WEBP_RESTRICT const it,
+                            VP8ModeScore* WEBP_RESTRICT rd) {
   const int kNumBlocks = 16;
   VP8SegmentInfo* const dqm = &it->enc_->dqm_[it->mb_->segment_];
   const int lambda = dqm->lambda_i16_;
@@ -1008,6 +1018,7 @@
   VP8ModeScore* rd_cur = &rd_tmp;
   VP8ModeScore* rd_best = rd;
   int mode;
+  int is_flat = IsFlatSource16(it->yuv_in_ + Y_OFF_ENC);
 
   rd->mode_i16 = -1;
   for (mode = 0; mode < NUM_PRED_MODES; ++mode) {
@@ -1023,10 +1034,14 @@
         tlambda ? MULT_8B(tlambda, VP8TDisto16x16(src, tmp_dst, kWeightY)) : 0;
     rd_cur->H = VP8FixedCostsI16[mode];
     rd_cur->R = VP8GetCostLuma16(it, rd_cur);
-    if (mode > 0 &&
-        IsFlat(rd_cur->y_ac_levels[0], kNumBlocks, FLATNESS_LIMIT_I16)) {
-      // penalty to avoid flat area to be mispredicted by complex mode
-      rd_cur->R += FLATNESS_PENALTY * kNumBlocks;
+    if (is_flat) {
+      // refine the first impression (which was in pixel space)
+      is_flat = IsFlat(rd_cur->y_ac_levels[0], kNumBlocks, FLATNESS_LIMIT_I16);
+      if (is_flat) {
+        // Block is very flat. We put emphasis on the distortion being very low!
+        rd_cur->D *= 2;
+        rd_cur->SD *= 2;
+      }
     }
 
     // Since we always examine Intra16 first, we can overwrite *rd directly.
@@ -1053,7 +1068,7 @@
 //------------------------------------------------------------------------------
 
 // return the cost array corresponding to the surrounding prediction modes.
-static const uint16_t* GetCostModeI4(VP8EncIterator* const it,
+static const uint16_t* GetCostModeI4(VP8EncIterator* WEBP_RESTRICT const it,
                                      const uint8_t modes[16]) {
   const int preds_w = it->enc_->preds_w_;
   const int x = (it->i4_ & 3), y = it->i4_ >> 2;
@@ -1062,7 +1077,8 @@
   return VP8FixedCostsI4[top][left];
 }
 
-static int PickBestIntra4(VP8EncIterator* const it, VP8ModeScore* const rd) {
+static int PickBestIntra4(VP8EncIterator* WEBP_RESTRICT const it,
+                          VP8ModeScore* WEBP_RESTRICT const rd) {
   const VP8Encoder* const enc = it->enc_;
   const VP8SegmentInfo* const dqm = &enc->dqm_[it->mb_->segment_];
   const int lambda = dqm->lambda_i4_;
@@ -1107,7 +1123,8 @@
                   : 0;
       rd_tmp.H = mode_costs[mode];
 
-      // Add flatness penalty
+      // Add flatness penalty, to avoid flat area to be mispredicted
+      // by a complex mode.
       if (mode > 0 && IsFlat(tmp_levels, kNumBlocks, FLATNESS_LIMIT_I4)) {
         rd_tmp.R = FLATNESS_PENALTY * kNumBlocks;
       } else {
@@ -1157,7 +1174,8 @@
 
 //------------------------------------------------------------------------------
 
-static void PickBestUV(VP8EncIterator* const it, VP8ModeScore* const rd) {
+static void PickBestUV(VP8EncIterator* WEBP_RESTRICT const it,
+                       VP8ModeScore* WEBP_RESTRICT const rd) {
   const int kNumBlocks = 8;
   const VP8SegmentInfo* const dqm = &it->enc_->dqm_[it->mb_->segment_];
   const int lambda = dqm->lambda_uv_;
@@ -1209,7 +1227,8 @@
 //------------------------------------------------------------------------------
 // Final reconstruction and quantization.
 
-static void SimpleQuantize(VP8EncIterator* const it, VP8ModeScore* const rd) {
+static void SimpleQuantize(VP8EncIterator* WEBP_RESTRICT const it,
+                           VP8ModeScore* WEBP_RESTRICT const rd) {
   const VP8Encoder* const enc = it->enc_;
   const int is_i16 = (it->mb_->type_ == 1);
   int nz = 0;
@@ -1234,9 +1253,9 @@
 }
 
 // Refine intra16/intra4 sub-modes based on distortion only (not rate).
-static void RefineUsingDistortion(VP8EncIterator* const it,
+static void RefineUsingDistortion(VP8EncIterator* WEBP_RESTRICT const it,
                                   int try_both_modes, int refine_uv_mode,
-                                  VP8ModeScore* const rd) {
+                                  VP8ModeScore* WEBP_RESTRICT const rd) {
   score_t best_score = MAX_COST;
   int nz = 0;
   int mode;
@@ -1262,11 +1281,19 @@
       if (mode > 0 && VP8FixedCostsI16[mode] > bit_limit) {
         continue;
       }
+
       if (score < best_score) {
         best_mode = mode;
         best_score = score;
       }
     }
+    if (it->x_ == 0 || it->y_ == 0) {
+      // avoid starting a checkerboard resonance from the border. See bug #432.
+      if (IsFlatSource16(src)) {
+        best_mode = (it->x_ == 0) ? 0 : 2;
+        try_both_modes = 0;  // stick to i16
+      }
+    }
     VP8SetIntra16Mode(it, best_mode);
     // we'll reconstruct later, if i16 mode actually gets selected
   }
@@ -1342,7 +1369,8 @@
 //------------------------------------------------------------------------------
 // Entry point
 
-int VP8Decimate(VP8EncIterator* const it, VP8ModeScore* const rd,
+int VP8Decimate(VP8EncIterator* WEBP_RESTRICT const it,
+                VP8ModeScore* WEBP_RESTRICT const rd,
                 VP8RDLevel rd_opt) {
   int is_skipped;
   const int method = it->enc_->method_;
diff --git a/third_party/libwebp/src/enc/syntax_enc.c b/third_party/libwebp/src/enc/syntax_enc.c
index a9e5a6c..9b8f524 100644
--- a/third_party/libwebp/src/enc/syntax_enc.c
+++ b/third_party/libwebp/src/enc/syntax_enc.c
@@ -258,7 +258,10 @@
     buf[3 * p + 1] = (part_size >>  8) & 0xff;
     buf[3 * p + 2] = (part_size >> 16) & 0xff;
   }
-  return p ? pic->writer(buf, 3 * p, pic) : 1;
+  if (p && !pic->writer(buf, 3 * p, pic)) {
+    return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
+  }
+  return 1;
 }
 
 //------------------------------------------------------------------------------
@@ -349,7 +352,7 @@
                                        (enc->alpha_data_size_ & 1);
     riff_size += CHUNK_HEADER_SIZE + padded_alpha_size;
   }
-  // Sanity check.
+  // RIFF size should fit in 32-bits.
   if (riff_size > 0xfffffffeU) {
     return WebPEncodingSetError(pic, VP8_ENC_ERROR_FILE_TOO_BIG);
   }
@@ -381,6 +384,7 @@
 
   enc->coded_size_ = (int)(CHUNK_HEADER_SIZE + riff_size);
   ok = ok && WebPReportProgress(pic, final_percent, &enc->percent_);
+  if (!ok) WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
   return ok;
 }
 
diff --git a/third_party/libwebp/src/enc/vp8i_enc.h b/third_party/libwebp/src/enc/vp8i_enc.h
index 64dbfa4..04b1a9c 100644
--- a/third_party/libwebp/src/enc/vp8i_enc.h
+++ b/third_party/libwebp/src/enc/vp8i_enc.h
@@ -33,8 +33,8 @@
 
 // version numbers
 #define ENC_MAJ_VERSION 1
-#define ENC_MIN_VERSION 0
-#define ENC_REV_VERSION 0
+#define ENC_MIN_VERSION 3
+#define ENC_REV_VERSION 1
 
 enum { MAX_LF_LEVELS = 64,       // Maximum loop filter level
        MAX_VARIABLE_LEVEL = 67,  // last (inclusive) level with variable cost
@@ -251,7 +251,7 @@
   int           percent0_;         // saved initial progress percent
 
   DError        left_derr_;        // left error diffusion (u/v)
-  DError       *top_derr_;         // top diffusion error - NULL if disabled
+  DError*       top_derr_;         // top diffusion error - NULL if disabled
 
   uint8_t* y_left_;    // left luma samples (addressable from index -1 to 15).
   uint8_t* u_left_;    // left u samples (addressable from index -1 to 7)
@@ -280,7 +280,7 @@
 // Import uncompressed samples from source.
 // If tmp_32 is not NULL, import boundary samples too.
 // tmp_32 is a 32-bytes scratch buffer that must be aligned in memory.
-void VP8IteratorImport(VP8EncIterator* const it, uint8_t* tmp_32);
+void VP8IteratorImport(VP8EncIterator* const it, uint8_t* const tmp_32);
 // export decimated samples
 void VP8IteratorExport(const VP8EncIterator* const it);
 // go to next macroblock. Returns false if not finished.
@@ -288,8 +288,7 @@
 // save the yuv_out_ boundary values to top_/left_ arrays for next iterations.
 void VP8IteratorSaveBoundary(VP8EncIterator* const it);
 // Report progression based on macroblock rows. Return 0 for user-abort request.
-int VP8IteratorProgress(const VP8EncIterator* const it,
-                        int final_delta_percent);
+int VP8IteratorProgress(const VP8EncIterator* const it, int delta);
 // Intra4x4 iterations
 void VP8IteratorStartI4(VP8EncIterator* const it);
 // returns true if not done.
@@ -473,7 +472,8 @@
 // Sets up segment's quantization values, base_quant_ and filter strengths.
 void VP8SetSegmentParams(VP8Encoder* const enc, float quality);
 // Pick best modes and fills the levels. Returns true if skipped.
-int VP8Decimate(VP8EncIterator* const it, VP8ModeScore* const rd,
+int VP8Decimate(VP8EncIterator* WEBP_RESTRICT const it,
+                VP8ModeScore* WEBP_RESTRICT const rd,
                 VP8RDLevel rd_opt);
 
   // in alpha.c
@@ -493,23 +493,28 @@
 
   // misc utils for picture_*.c:
 
+// Returns true if 'picture' is non-NULL and dimensions/colorspace are within
+// their valid ranges. If returning false, the 'error_code' in 'picture' is
+// updated.
+int WebPValidatePicture(const WebPPicture* const picture);
+
 // Remove reference to the ARGB/YUVA buffer (doesn't free anything).
 void WebPPictureResetBuffers(WebPPicture* const picture);
 
-// Allocates ARGB buffer of given dimension (previous one is always free'd).
-// Preserves the YUV(A) buffer. Returns false in case of error (invalid param,
-// out-of-memory).
-int WebPPictureAllocARGB(WebPPicture* const picture, int width, int height);
+// Allocates ARGB buffer according to set width/height (previous one is
+// always free'd). Preserves the YUV(A) buffer. Returns false in case of error
+// (invalid param, out-of-memory).
+int WebPPictureAllocARGB(WebPPicture* const picture);
 
-// Allocates YUVA buffer of given dimension (previous one is always free'd).
-// Uses picture->csp to determine whether an alpha buffer is needed.
+// Allocates YUVA buffer according to set width/height (previous one is always
+// free'd). Uses picture->csp to determine whether an alpha buffer is needed.
 // Preserves the ARGB buffer.
 // Returns false in case of error (invalid param, out-of-memory).
-int WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height);
+int WebPPictureAllocYUVA(WebPPicture* const picture);
 
-// Clean-up the RGB samples under fully transparent area, to help lossless
-// compressibility (no guarantee, though). Assumes that pic->use_argb is true.
-void WebPCleanupTransparentAreaLossless(WebPPicture* const pic);
+// Replace samples that are fully transparent by 'color' to help compressibility
+// (no guarantee, though). Assumes pic->use_argb is true.
+void WebPReplaceTransparentPixels(WebPPicture* const pic, uint32_t color);
 
 //------------------------------------------------------------------------------
 
@@ -517,4 +522,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_ENC_VP8I_ENC_H_ */
+#endif  // WEBP_ENC_VP8I_ENC_H_
diff --git a/third_party/libwebp/src/enc/vp8l_enc.c b/third_party/libwebp/src/enc/vp8l_enc.c
index 27cd218..872619e 100644
--- a/third_party/libwebp/src/enc/vp8l_enc.c
+++ b/third_party/libwebp/src/enc/vp8l_enc.c
@@ -20,15 +20,16 @@
 #include "starboard/client_porting/poem/string_poem.h"
 #endif
 
+#include "src/dsp/lossless.h"
+#include "src/dsp/lossless_common.h"
 #include "src/enc/backward_references_enc.h"
 #include "src/enc/histogram_enc.h"
 #include "src/enc/vp8i_enc.h"
 #include "src/enc/vp8li_enc.h"
-#include "src/dsp/lossless.h"
-#include "src/dsp/lossless_common.h"
 #include "src/utils/bit_writer_utils.h"
 #include "src/utils/huffman_encode_utils.h"
 #include "src/utils/utils.h"
+#include "src/webp/encode.h"
 #include "src/webp/format_constants.h"
 
 // Maximum number of histogram images (sub-blocks).
@@ -70,25 +71,22 @@
   *col2 = tmp;
 }
 
-static void GreedyMinimizeDeltas(uint32_t palette[], int num_colors) {
-  // Find greedily always the closest color of the predicted color to minimize
-  // deltas in the palette. This reduces storage needs since the
-  // palette is stored with delta encoding.
-  uint32_t predict = 0x00000000;
-  int i, k;
-  for (i = 0; i < num_colors; ++i) {
-    int best_ix = i;
-    uint32_t best_score = ~0U;
-    for (k = i; k < num_colors; ++k) {
-      const uint32_t cur_score = PaletteColorDistance(palette[k], predict);
-      if (best_score > cur_score) {
-        best_score = cur_score;
-        best_ix = k;
-      }
+static WEBP_INLINE int SearchColorNoIdx(const uint32_t sorted[], uint32_t color,
+                                        int num_colors) {
+  int low = 0, hi = num_colors;
+  if (sorted[low] == color) return low;  // loop invariant: sorted[low] != color
+  while (1) {
+    const int mid = (low + hi) >> 1;
+    if (sorted[mid] == color) {
+      return mid;
+    } else if (sorted[mid] < color) {
+      low = mid;
+    } else {
+      hi = mid;
     }
-    SwapColor(&palette[best_ix], &palette[i]);
-    predict = palette[i];
   }
+  assert(0);
+  return 0;
 }
 
 // The palette has been sorted by alpha. This function checks if the other
@@ -97,7 +95,8 @@
 // no benefit to re-organize them greedily. A monotonic development
 // would be spotted in green-only situations (like lossy alpha) or gray-scale
 // images.
-static int PaletteHasNonMonotonousDeltas(uint32_t palette[], int num_colors) {
+static int PaletteHasNonMonotonousDeltas(const uint32_t* const palette,
+                                         int num_colors) {
   uint32_t predict = 0x000000;
   int i;
   uint8_t sign_found = 0x00;
@@ -120,28 +119,217 @@
   return (sign_found & (sign_found << 1)) != 0;  // two consequent signs.
 }
 
-// -----------------------------------------------------------------------------
-// Palette
+static void PaletteSortMinimizeDeltas(const uint32_t* const palette_sorted,
+                                      int num_colors, uint32_t* const palette) {
+  uint32_t predict = 0x00000000;
+  int i, k;
+  memcpy(palette, palette_sorted, num_colors * sizeof(*palette));
+  if (!PaletteHasNonMonotonousDeltas(palette_sorted, num_colors)) return;
+  // Find greedily always the closest color of the predicted color to minimize
+  // deltas in the palette. This reduces storage needs since the
+  // palette is stored with delta encoding.
+  for (i = 0; i < num_colors; ++i) {
+    int best_ix = i;
+    uint32_t best_score = ~0U;
+    for (k = i; k < num_colors; ++k) {
+      const uint32_t cur_score = PaletteColorDistance(palette[k], predict);
+      if (best_score > cur_score) {
+        best_score = cur_score;
+        best_ix = k;
+      }
+    }
+    SwapColor(&palette[best_ix], &palette[i]);
+    predict = palette[i];
+  }
+}
 
-// If number of colors in the image is less than or equal to MAX_PALETTE_SIZE,
-// creates a palette and returns true, else returns false.
-static int AnalyzeAndCreatePalette(const WebPPicture* const pic,
-                                   int low_effort,
-                                   uint32_t palette[MAX_PALETTE_SIZE],
-                                   int* const palette_size) {
-  const int num_colors = WebPGetColorPalette(pic, palette);
-  if (num_colors > MAX_PALETTE_SIZE) {
-    *palette_size = 0;
+// Sort palette in increasing order and prepare an inverse mapping array.
+static void PrepareMapToPalette(const uint32_t palette[], uint32_t num_colors,
+                                uint32_t sorted[], uint32_t idx_map[]) {
+  uint32_t i;
+  memcpy(sorted, palette, num_colors * sizeof(*sorted));
+  qsort(sorted, num_colors, sizeof(*sorted), PaletteCompareColorsForQsort);
+  for (i = 0; i < num_colors; ++i) {
+    idx_map[SearchColorNoIdx(sorted, palette[i], num_colors)] = i;
+  }
+}
+
+// -----------------------------------------------------------------------------
+// Modified Zeng method from "A Survey on Palette Reordering
+// Methods for Improving the Compression of Color-Indexed Images" by Armando J.
+// Pinho and Antonio J. R. Neves.
+
+// Finds the biggest cooccurrence in the matrix.
+static void CoOccurrenceFindMax(const uint32_t* const cooccurrence,
+                                uint32_t num_colors, uint8_t* const c1,
+                                uint8_t* const c2) {
+  // Find the index that is most frequently located adjacent to other
+  // (different) indexes.
+  uint32_t best_sum = 0u;
+  uint32_t i, j, best_cooccurrence;
+  *c1 = 0u;
+  for (i = 0; i < num_colors; ++i) {
+    uint32_t sum = 0;
+    for (j = 0; j < num_colors; ++j) sum += cooccurrence[i * num_colors + j];
+    if (sum > best_sum) {
+      best_sum = sum;
+      *c1 = i;
+    }
+  }
+  // Find the index that is most frequently found adjacent to *c1.
+  *c2 = 0u;
+  best_cooccurrence = 0u;
+  for (i = 0; i < num_colors; ++i) {
+    if (cooccurrence[*c1 * num_colors + i] > best_cooccurrence) {
+      best_cooccurrence = cooccurrence[*c1 * num_colors + i];
+      *c2 = i;
+    }
+  }
+  assert(*c1 != *c2);
+}
+
+// Builds the cooccurrence matrix
+static int CoOccurrenceBuild(const WebPPicture* const pic,
+                             const uint32_t* const palette, uint32_t num_colors,
+                             uint32_t* cooccurrence) {
+  uint32_t *lines, *line_top, *line_current, *line_tmp;
+  int x, y;
+  const uint32_t* src = pic->argb;
+  uint32_t prev_pix = ~src[0];
+  uint32_t prev_idx = 0u;
+  uint32_t idx_map[MAX_PALETTE_SIZE] = {0};
+  uint32_t palette_sorted[MAX_PALETTE_SIZE];
+  lines = (uint32_t*)WebPSafeMalloc(2 * pic->width, sizeof(*lines));
+  if (lines == NULL) {
+    return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+  }
+  line_top = &lines[0];
+  line_current = &lines[pic->width];
+  PrepareMapToPalette(palette, num_colors, palette_sorted, idx_map);
+  for (y = 0; y < pic->height; ++y) {
+    for (x = 0; x < pic->width; ++x) {
+      const uint32_t pix = src[x];
+      if (pix != prev_pix) {
+        prev_idx = idx_map[SearchColorNoIdx(palette_sorted, pix, num_colors)];
+        prev_pix = pix;
+      }
+      line_current[x] = prev_idx;
+      // 4-connectivity is what works best as mentioned in "On the relation
+      // between Memon's and the modified Zeng's palette reordering methods".
+      if (x > 0 && prev_idx != line_current[x - 1]) {
+        const uint32_t left_idx = line_current[x - 1];
+        ++cooccurrence[prev_idx * num_colors + left_idx];
+        ++cooccurrence[left_idx * num_colors + prev_idx];
+      }
+      if (y > 0 && prev_idx != line_top[x]) {
+        const uint32_t top_idx = line_top[x];
+        ++cooccurrence[prev_idx * num_colors + top_idx];
+        ++cooccurrence[top_idx * num_colors + prev_idx];
+      }
+    }
+    line_tmp = line_top;
+    line_top = line_current;
+    line_current = line_tmp;
+    src += pic->argb_stride;
+  }
+  WebPSafeFree(lines);
+  return 1;
+}
+
+struct Sum {
+  uint8_t index;
+  uint32_t sum;
+};
+
+// Implements the modified Zeng method from "A Survey on Palette Reordering
+// Methods for Improving the Compression of Color-Indexed Images" by Armando J.
+// Pinho and Antonio J. R. Neves.
+static int PaletteSortModifiedZeng(
+    const WebPPicture* const pic, const uint32_t* const palette_sorted,
+    uint32_t num_colors, uint32_t* const palette) {
+  uint32_t i, j, ind;
+  uint8_t remapping[MAX_PALETTE_SIZE];
+  uint32_t* cooccurrence;
+  struct Sum sums[MAX_PALETTE_SIZE];
+  uint32_t first, last;
+  uint32_t num_sums;
+  // TODO(vrabaud) check whether one color images should use palette or not.
+  if (num_colors <= 1) return 1;
+  // Build the co-occurrence matrix.
+  cooccurrence =
+      (uint32_t*)WebPSafeCalloc(num_colors * num_colors, sizeof(*cooccurrence));
+  if (cooccurrence == NULL) {
+    return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+  }
+  if (!CoOccurrenceBuild(pic, palette_sorted, num_colors, cooccurrence)) {
+    WebPSafeFree(cooccurrence);
     return 0;
   }
-  *palette_size = num_colors;
-  qsort(palette, num_colors, sizeof(*palette), PaletteCompareColorsForQsort);
-  if (!low_effort && PaletteHasNonMonotonousDeltas(palette, num_colors)) {
-    GreedyMinimizeDeltas(palette, num_colors);
+
+  // Initialize the mapping list with the two best indices.
+  CoOccurrenceFindMax(cooccurrence, num_colors, &remapping[0], &remapping[1]);
+
+  // We need to append and prepend to the list of remapping. To this end, we
+  // actually define the next start/end of the list as indices in a vector (with
+  // a wrap around when the end is reached).
+  first = 0;
+  last = 1;
+  num_sums = num_colors - 2;  // -2 because we know the first two values
+  if (num_sums > 0) {
+    // Initialize the sums with the first two remappings and find the best one
+    struct Sum* best_sum = &sums[0];
+    best_sum->index = 0u;
+    best_sum->sum = 0u;
+    for (i = 0, j = 0; i < num_colors; ++i) {
+      if (i == remapping[0] || i == remapping[1]) continue;
+      sums[j].index = i;
+      sums[j].sum = cooccurrence[i * num_colors + remapping[0]] +
+                    cooccurrence[i * num_colors + remapping[1]];
+      if (sums[j].sum > best_sum->sum) best_sum = &sums[j];
+      ++j;
+    }
+
+    while (num_sums > 0) {
+      const uint8_t best_index = best_sum->index;
+      // Compute delta to know if we need to prepend or append the best index.
+      int32_t delta = 0;
+      const int32_t n = num_colors - num_sums;
+      for (ind = first, j = 0; (ind + j) % num_colors != last + 1; ++j) {
+        const uint16_t l_j = remapping[(ind + j) % num_colors];
+        delta += (n - 1 - 2 * (int32_t)j) *
+                 (int32_t)cooccurrence[best_index * num_colors + l_j];
+      }
+      if (delta > 0) {
+        first = (first == 0) ? num_colors - 1 : first - 1;
+        remapping[first] = best_index;
+      } else {
+        ++last;
+        remapping[last] = best_index;
+      }
+      // Remove best_sum from sums.
+      *best_sum = sums[num_sums - 1];
+      --num_sums;
+      // Update all the sums and find the best one.
+      best_sum = &sums[0];
+      for (i = 0; i < num_sums; ++i) {
+        sums[i].sum += cooccurrence[best_index * num_colors + sums[i].index];
+        if (sums[i].sum > best_sum->sum) best_sum = &sums[i];
+      }
+    }
+  }
+  assert((last + 1) % num_colors == first);
+  WebPSafeFree(cooccurrence);
+
+  // Re-map the palette.
+  for (i = 0; i < num_colors; ++i) {
+    palette[i] = palette_sorted[remapping[(first + i) % num_colors]];
   }
   return 1;
 }
 
+// -----------------------------------------------------------------------------
+// Palette
+
 // These five modes are evaluated and their respective entropy is computed.
 typedef enum {
   kDirect = 0,
@@ -149,10 +337,18 @@
   kSubGreen = 2,
   kSpatialSubGreen = 3,
   kPalette = 4,
-  kNumEntropyIx = 5
+  kPaletteAndSpatial = 5,
+  kNumEntropyIx = 6
 } EntropyIx;
 
 typedef enum {
+  kSortedDefault = 0,
+  kMinimizeDelta = 1,
+  kModifiedZeng = 2,
+  kUnusedPalette = 3,
+} PaletteSorting;
+
+typedef enum {
   kHistoAlpha = 0,
   kHistoAlphaPred,
   kHistoGreen,
@@ -169,10 +365,11 @@
   kHistoTotal  // Must be last.
 } HistoIx;
 
-static void AddSingleSubGreen(int p, uint32_t* const r, uint32_t* const b) {
-  const int green = p >> 8;  // The upper bits are masked away later.
-  ++r[((p >> 16) - green) & 0xff];
-  ++b[((p >>  0) - green) & 0xff];
+static void AddSingleSubGreen(uint32_t p,
+                              uint32_t* const r, uint32_t* const b) {
+  const int green = (int)p >> 8;  // The upper bits are masked away later.
+  ++r[(((int)p >> 16) - green) & 0xff];
+  ++b[(((int)p >>  0) - green) & 0xff];
 }
 
 static void AddSingle(uint32_t p,
@@ -246,8 +443,8 @@
       curr_row += argb_stride;
     }
     {
-      double entropy_comp[kHistoTotal];
-      double entropy[kNumEntropyIx];
+      float entropy_comp[kHistoTotal];
+      float entropy[kNumEntropyIx];
       int k;
       int last_mode_to_analyze = use_palette ? kPalette : kSpatialSubGreen;
       int j;
@@ -359,14 +556,21 @@
 }
 
 // Set of parameters to be used in each iteration of the cruncher.
-#define CRUNCH_CONFIGS_LZ77_MAX 2
+#define CRUNCH_SUBCONFIGS_MAX 2
+typedef struct {
+  int lz77_;
+  int do_no_cache_;
+} CrunchSubConfig;
 typedef struct {
   int entropy_idx_;
-  int lz77s_types_to_try_[CRUNCH_CONFIGS_LZ77_MAX];
-  int lz77s_types_to_try_size_;
+  PaletteSorting palette_sorting_type_;
+  CrunchSubConfig sub_configs_[CRUNCH_SUBCONFIGS_MAX];
+  int sub_configs_size_;
 } CrunchConfig;
 
-#define CRUNCH_CONFIGS_MAX kNumEntropyIx
+// +2 because we add a palette sorting configuration for kPalette and
+// kPaletteAndSpatial.
+#define CRUNCH_CONFIGS_MAX (kNumEntropyIx + 2)
 
 static int EncoderAnalyze(VP8LEncoder* const enc,
                           CrunchConfig crunch_configs[CRUNCH_CONFIGS_MAX],
@@ -381,11 +585,20 @@
   int i;
   int use_palette;
   int n_lz77s;
+  // If set to 0, analyze the cache with the computed cache value. If 1, also
+  // analyze with no-cache.
+  int do_no_cache = 0;
   assert(pic != NULL && pic->argb != NULL);
 
-  use_palette =
-      AnalyzeAndCreatePalette(pic, low_effort,
-                              enc->palette_, &enc->palette_size_);
+  // Check whether a palette is possible.
+  enc->palette_size_ = WebPGetColorPalette(pic, enc->palette_sorted_);
+  use_palette = (enc->palette_size_ <= MAX_PALETTE_SIZE);
+  if (!use_palette) {
+    enc->palette_size_ = 0;
+  } else {
+    qsort(enc->palette_sorted_, enc->palette_size_,
+          sizeof(*enc->palette_sorted_), PaletteCompareColorsForQsort);
+  }
 
   // Empirical bit sizes.
   enc->histo_bits_ = GetHistoBits(method, use_palette,
@@ -395,6 +608,8 @@
   if (low_effort) {
     // AnalyzeEntropy is somewhat slow.
     crunch_configs[0].entropy_idx_ = use_palette ? kPalette : kSpatialSubGreen;
+    crunch_configs[0].palette_sorting_type_ =
+        use_palette ? kSortedDefault : kUnusedPalette;
     n_lz77s = 1;
     *crunch_configs_size = 1;
   } else {
@@ -407,29 +622,59 @@
       return 0;
     }
     if (method == 6 && config->quality == 100) {
+      do_no_cache = 1;
       // Go brute force on all transforms.
       *crunch_configs_size = 0;
       for (i = 0; i < kNumEntropyIx; ++i) {
-        if (i != kPalette || use_palette) {
+        // We can only apply kPalette or kPaletteAndSpatial if we can indeed use
+        // a palette.
+        if ((i != kPalette && i != kPaletteAndSpatial) || use_palette) {
           assert(*crunch_configs_size < CRUNCH_CONFIGS_MAX);
-          crunch_configs[(*crunch_configs_size)++].entropy_idx_ = i;
+          crunch_configs[(*crunch_configs_size)].entropy_idx_ = i;
+          if (use_palette && (i == kPalette || i == kPaletteAndSpatial)) {
+            crunch_configs[(*crunch_configs_size)].palette_sorting_type_ =
+                kMinimizeDelta;
+            ++*crunch_configs_size;
+            // Also add modified Zeng's method.
+            crunch_configs[(*crunch_configs_size)].entropy_idx_ = i;
+            crunch_configs[(*crunch_configs_size)].palette_sorting_type_ =
+                kModifiedZeng;
+          } else {
+            crunch_configs[(*crunch_configs_size)].palette_sorting_type_ =
+                kUnusedPalette;
+          }
+          ++*crunch_configs_size;
         }
       }
     } else {
       // Only choose the guessed best transform.
       *crunch_configs_size = 1;
       crunch_configs[0].entropy_idx_ = min_entropy_ix;
+      crunch_configs[0].palette_sorting_type_ =
+          use_palette ? kMinimizeDelta : kUnusedPalette;
+      if (config->quality >= 75 && method == 5) {
+        // Test with and without color cache.
+        do_no_cache = 1;
+        // If we have a palette, also check in combination with spatial.
+        if (min_entropy_ix == kPalette) {
+          *crunch_configs_size = 2;
+          crunch_configs[1].entropy_idx_ = kPaletteAndSpatial;
+          crunch_configs[1].palette_sorting_type_ = kMinimizeDelta;
+        }
+      }
     }
   }
   // Fill in the different LZ77s.
-  assert(n_lz77s <= CRUNCH_CONFIGS_LZ77_MAX);
+  assert(n_lz77s <= CRUNCH_SUBCONFIGS_MAX);
   for (i = 0; i < *crunch_configs_size; ++i) {
     int j;
     for (j = 0; j < n_lz77s; ++j) {
-      crunch_configs[i].lz77s_types_to_try_[j] =
+      assert(j < CRUNCH_SUBCONFIGS_MAX);
+      crunch_configs[i].sub_configs_[j].lz77_ =
           (j == 0) ? kLZ77Standard | kLZ77RLE : kLZ77Box;
+      crunch_configs[i].sub_configs_[j].do_no_cache_ = do_no_cache;
     }
-    crunch_configs[i].lz77s_types_to_try_size_ = n_lz77s;
+    crunch_configs[i].sub_configs_size_ = n_lz77s;
   }
   return 1;
 }
@@ -445,7 +690,7 @@
   int i;
   if (!VP8LHashChainInit(&enc->hash_chain_, pix_cnt)) return 0;
 
-  for (i = 0; i < 3; ++i) VP8LBackwardRefsInit(&enc->refs_[i], refs_block_size);
+  for (i = 0; i < 4; ++i) VP8LBackwardRefsInit(&enc->refs_[i], refs_block_size);
 
   return 1;
 }
@@ -467,6 +712,7 @@
   for (i = 0; i < histogram_image_size; ++i) {
     const VP8LHistogram* const histo = histogram_image->histograms[i];
     HuffmanTreeCode* const codes = &huffman_codes[5 * i];
+    assert(histo != NULL);
     for (k = 0; k < 5; ++k) {
       const int num_symbols =
           (k == 0) ? VP8LHistogramNumCodes(histo->palette_code_bits_) :
@@ -712,11 +958,11 @@
   VP8LPutBits(bw, (bits << depth) | symbol, depth + n_bits);
 }
 
-static WebPEncodingError StoreImageToBitMask(
+static int StoreImageToBitMask(
     VP8LBitWriter* const bw, int width, int histo_bits,
     const VP8LBackwardRefs* const refs,
     const uint16_t* histogram_symbols,
-    const HuffmanTreeCode* const huffman_codes) {
+    const HuffmanTreeCode* const huffman_codes, const WebPPicture* const pic) {
   const int histo_xsize = histo_bits ? VP8LSubSampleSize(width, histo_bits) : 1;
   const int tile_mask = (histo_bits == 0) ? 0 : -(1 << histo_bits);
   // x and y trace the position in the image.
@@ -769,51 +1015,55 @@
     }
     VP8LRefsCursorNext(&c);
   }
-  return bw->error_ ? VP8_ENC_ERROR_OUT_OF_MEMORY : VP8_ENC_OK;
+  if (bw->error_) {
+    return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+  }
+  return 1;
 }
 
-// Special case of EncodeImageInternal() for cache-bits=0, histo_bits=31
-static WebPEncodingError EncodeImageNoHuffman(VP8LBitWriter* const bw,
-                                              const uint32_t* const argb,
-                                              VP8LHashChain* const hash_chain,
-                                              VP8LBackwardRefs* const refs_tmp1,
-                                              VP8LBackwardRefs* const refs_tmp2,
-                                              int width, int height,
-                                              int quality, int low_effort) {
+// Special case of EncodeImageInternal() for cache-bits=0, histo_bits=31.
+// pic and percent are for progress.
+static int EncodeImageNoHuffman(VP8LBitWriter* const bw,
+                                const uint32_t* const argb,
+                                VP8LHashChain* const hash_chain,
+                                VP8LBackwardRefs* const refs_array, int width,
+                                int height, int quality, int low_effort,
+                                const WebPPicture* const pic, int percent_range,
+                                int* const percent) {
   int i;
   int max_tokens = 0;
-  WebPEncodingError err = VP8_ENC_OK;
   VP8LBackwardRefs* refs;
   HuffmanTreeToken* tokens = NULL;
-  HuffmanTreeCode huffman_codes[5] = { { 0, NULL, NULL } };
-  const uint16_t histogram_symbols[1] = { 0 };    // only one tree, one symbol
+  HuffmanTreeCode huffman_codes[5] = {{0, NULL, NULL}};
+  const uint16_t histogram_symbols[1] = {0};  // only one tree, one symbol
   int cache_bits = 0;
   VP8LHistogramSet* histogram_image = NULL;
   HuffmanTree* const huff_tree = (HuffmanTree*)WebPSafeMalloc(
-        3ULL * CODE_LENGTH_CODES, sizeof(*huff_tree));
+      3ULL * CODE_LENGTH_CODES, sizeof(*huff_tree));
   if (huff_tree == NULL) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+    WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
     goto Error;
   }
 
   // Calculate backward references from ARGB image.
-  if (!VP8LHashChainFill(hash_chain, quality, argb, width, height,
-                         low_effort)) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+  if (!VP8LHashChainFill(hash_chain, quality, argb, width, height, low_effort,
+                         pic, percent_range / 2, percent)) {
     goto Error;
   }
-  refs = VP8LGetBackwardReferences(width, height, argb, quality, 0,
-                                   kLZ77Standard | kLZ77RLE, &cache_bits,
-                                   hash_chain, refs_tmp1, refs_tmp2);
-  if (refs == NULL) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+  if (!VP8LGetBackwardReferences(width, height, argb, quality, /*low_effort=*/0,
+                                 kLZ77Standard | kLZ77RLE, cache_bits,
+                                 /*do_no_cache=*/0, hash_chain, refs_array,
+                                 &cache_bits, pic,
+                                 percent_range - percent_range / 2, percent)) {
     goto Error;
   }
+  refs = &refs_array[0];
   histogram_image = VP8LAllocateHistogramSet(1, cache_bits);
   if (histogram_image == NULL) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+    WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
     goto Error;
   }
+  VP8LHistogramSetClear(histogram_image);
 
   // Build histogram image and symbols from backward references.
   VP8LHistogramStoreRefs(refs, histogram_image->histograms[0]);
@@ -821,7 +1071,7 @@
   // Create Huffman bit lengths and codes for each histogram image.
   assert(histogram_image->size == 1);
   if (!GetHuffBitLengthsAndCodes(histogram_image, huffman_codes)) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+    WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
     goto Error;
   }
 
@@ -838,7 +1088,7 @@
 
   tokens = (HuffmanTreeToken*)WebPSafeMalloc(max_tokens, sizeof(*tokens));
   if (tokens == NULL) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+    WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
     goto Error;
   }
 
@@ -850,27 +1100,32 @@
   }
 
   // Store actual literals.
-  err = StoreImageToBitMask(bw, width, 0, refs, histogram_symbols,
-                            huffman_codes);
+  if (!StoreImageToBitMask(bw, width, 0, refs, histogram_symbols, huffman_codes,
+                           pic)) {
+    goto Error;
+  }
 
  Error:
   WebPSafeFree(tokens);
   WebPSafeFree(huff_tree);
   VP8LFreeHistogramSet(histogram_image);
   WebPSafeFree(huffman_codes[0].codes);
-  return err;
+  return (pic->error_code == VP8_ENC_OK);
 }
 
-static WebPEncodingError EncodeImageInternal(
+// pic and percent are for progress.
+static int EncodeImageInternal(
     VP8LBitWriter* const bw, const uint32_t* const argb,
-    VP8LHashChain* const hash_chain, VP8LBackwardRefs refs_array[3], int width,
+    VP8LHashChain* const hash_chain, VP8LBackwardRefs refs_array[4], int width,
     int height, int quality, int low_effort, int use_cache,
     const CrunchConfig* const config, int* cache_bits, int histogram_bits,
-    size_t init_byte_position, int* const hdr_size, int* const data_size) {
-  WebPEncodingError err = VP8_ENC_OK;
+    size_t init_byte_position, int* const hdr_size, int* const data_size,
+    const WebPPicture* const pic, int percent_range, int* const percent) {
   const uint32_t histogram_image_xysize =
       VP8LSubSampleSize(width, histogram_bits) *
       VP8LSubSampleSize(height, histogram_bits);
+  int remaining_percent = percent_range;
+  int percent_start = *percent;
   VP8LHistogramSet* histogram_image = NULL;
   VP8LHistogram* tmp_histo = NULL;
   int histogram_image_size = 0;
@@ -879,112 +1134,135 @@
       3ULL * CODE_LENGTH_CODES, sizeof(*huff_tree));
   HuffmanTreeToken* tokens = NULL;
   HuffmanTreeCode* huffman_codes = NULL;
-  VP8LBackwardRefs* refs_best;
-  VP8LBackwardRefs* refs_tmp;
-  uint16_t* const histogram_symbols =
-      (uint16_t*)WebPSafeMalloc(histogram_image_xysize,
-                                sizeof(*histogram_symbols));
-  int lz77s_idx;
+  uint16_t* const histogram_symbols = (uint16_t*)WebPSafeMalloc(
+      histogram_image_xysize, sizeof(*histogram_symbols));
+  int sub_configs_idx;
+  int cache_bits_init, write_histogram_image;
   VP8LBitWriter bw_init = *bw, bw_best;
   int hdr_size_tmp;
+  VP8LHashChain hash_chain_histogram;  // histogram image hash chain
+  size_t bw_size_best = ~(size_t)0;
   assert(histogram_bits >= MIN_HUFFMAN_BITS);
   assert(histogram_bits <= MAX_HUFFMAN_BITS);
   assert(hdr_size != NULL);
   assert(data_size != NULL);
 
-  if (histogram_symbols == NULL) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+  memset(&hash_chain_histogram, 0, sizeof(hash_chain_histogram));
+  if (!VP8LBitWriterInit(&bw_best, 0)) {
+    WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
     goto Error;
   }
 
+  // Make sure we can allocate the different objects.
+  if (huff_tree == NULL || histogram_symbols == NULL ||
+      !VP8LHashChainInit(&hash_chain_histogram, histogram_image_xysize)) {
+    WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+    goto Error;
+  }
+
+  percent_range = remaining_percent / 5;
+  if (!VP8LHashChainFill(hash_chain, quality, argb, width, height,
+                         low_effort, pic, percent_range, percent)) {
+    goto Error;
+  }
+  percent_start += percent_range;
+  remaining_percent -= percent_range;
+
   if (use_cache) {
     // If the value is different from zero, it has been set during the
     // palette analysis.
-    if (*cache_bits == 0) *cache_bits = MAX_COLOR_CACHE_BITS;
+    cache_bits_init = (*cache_bits == 0) ? MAX_COLOR_CACHE_BITS : *cache_bits;
   } else {
-    *cache_bits = 0;
+    cache_bits_init = 0;
   }
-  // 'best_refs' is the reference to the best backward refs and points to one
-  // of refs_array[0] or refs_array[1].
-  // Calculate backward references from ARGB image.
-  if (huff_tree == NULL ||
-      !VP8LHashChainFill(hash_chain, quality, argb, width, height,
-                         low_effort) ||
-      !VP8LBitWriterInit(&bw_best, 0) ||
-      (config->lz77s_types_to_try_size_ > 1 &&
-       !VP8LBitWriterClone(bw, &bw_best))) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+  // If several iterations will happen, clone into bw_best.
+  if ((config->sub_configs_size_ > 1 || config->sub_configs_[0].do_no_cache_) &&
+      !VP8LBitWriterClone(bw, &bw_best)) {
+    WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
     goto Error;
   }
-  for (lz77s_idx = 0; lz77s_idx < config->lz77s_types_to_try_size_;
-       ++lz77s_idx) {
-    refs_best = VP8LGetBackwardReferences(
-        width, height, argb, quality, low_effort,
-        config->lz77s_types_to_try_[lz77s_idx], cache_bits, hash_chain,
-        &refs_array[0], &refs_array[1]);
-    if (refs_best == NULL) {
-      err = VP8_ENC_ERROR_OUT_OF_MEMORY;
-      goto Error;
-    }
-    // Keep the best references aside and use the other element from the first
-    // two as a temporary for later usage.
-    refs_tmp = &refs_array[refs_best == &refs_array[0] ? 1 : 0];
 
-    histogram_image =
-        VP8LAllocateHistogramSet(histogram_image_xysize, *cache_bits);
-    tmp_histo = VP8LAllocateHistogram(*cache_bits);
-    if (histogram_image == NULL || tmp_histo == NULL) {
-      err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+  for (sub_configs_idx = 0; sub_configs_idx < config->sub_configs_size_;
+       ++sub_configs_idx) {
+    const CrunchSubConfig* const sub_config =
+        &config->sub_configs_[sub_configs_idx];
+    int cache_bits_best, i_cache;
+    int i_remaining_percent = remaining_percent / config->sub_configs_size_;
+    int i_percent_range = i_remaining_percent / 4;
+    i_remaining_percent -= i_percent_range;
+
+    if (!VP8LGetBackwardReferences(
+            width, height, argb, quality, low_effort, sub_config->lz77_,
+            cache_bits_init, sub_config->do_no_cache_, hash_chain,
+            &refs_array[0], &cache_bits_best, pic, i_percent_range, percent)) {
       goto Error;
     }
 
-    // Build histogram image and symbols from backward references.
-    if (!VP8LGetHistoImageSymbols(width, height, refs_best, quality, low_effort,
-                                  histogram_bits, *cache_bits, histogram_image,
-                                  tmp_histo, histogram_symbols)) {
-      err = VP8_ENC_ERROR_OUT_OF_MEMORY;
-      goto Error;
-    }
-    // Create Huffman bit lengths and codes for each histogram image.
-    histogram_image_size = histogram_image->size;
-    bit_array_size = 5 * histogram_image_size;
-    huffman_codes = (HuffmanTreeCode*)WebPSafeCalloc(bit_array_size,
-                                                     sizeof(*huffman_codes));
-    // Note: some histogram_image entries may point to tmp_histos[], so the
-    // latter need to outlive the following call to GetHuffBitLengthsAndCodes().
-    if (huffman_codes == NULL ||
-        !GetHuffBitLengthsAndCodes(histogram_image, huffman_codes)) {
-      err = VP8_ENC_ERROR_OUT_OF_MEMORY;
-      goto Error;
-    }
-    // Free combined histograms.
-    VP8LFreeHistogramSet(histogram_image);
-    histogram_image = NULL;
+    for (i_cache = 0; i_cache < (sub_config->do_no_cache_ ? 2 : 1); ++i_cache) {
+      const int cache_bits_tmp = (i_cache == 0) ? cache_bits_best : 0;
+      // Speed-up: no need to study the no-cache case if it was already studied
+      // in i_cache == 0.
+      if (i_cache == 1 && cache_bits_best == 0) break;
 
-    // Free scratch histograms.
-    VP8LFreeHistogram(tmp_histo);
-    tmp_histo = NULL;
+      // Reset the bit writer for this iteration.
+      VP8LBitWriterReset(&bw_init, bw);
 
-    // Color Cache parameters.
-    if (*cache_bits > 0) {
-      VP8LPutBits(bw, 1, 1);
-      VP8LPutBits(bw, *cache_bits, 4);
-    } else {
-      VP8LPutBits(bw, 0, 1);
-    }
+      // Build histogram image and symbols from backward references.
+      histogram_image =
+          VP8LAllocateHistogramSet(histogram_image_xysize, cache_bits_tmp);
+      tmp_histo = VP8LAllocateHistogram(cache_bits_tmp);
+      if (histogram_image == NULL || tmp_histo == NULL) {
+        WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+        goto Error;
+      }
 
-    // Huffman image + meta huffman.
-    {
-      const int write_histogram_image = (histogram_image_size > 1);
+      i_percent_range = i_remaining_percent / 3;
+      i_remaining_percent -= i_percent_range;
+      if (!VP8LGetHistoImageSymbols(
+              width, height, &refs_array[i_cache], quality, low_effort,
+              histogram_bits, cache_bits_tmp, histogram_image, tmp_histo,
+              histogram_symbols, pic, i_percent_range, percent)) {
+        goto Error;
+      }
+      // Create Huffman bit lengths and codes for each histogram image.
+      histogram_image_size = histogram_image->size;
+      bit_array_size = 5 * histogram_image_size;
+      huffman_codes = (HuffmanTreeCode*)WebPSafeCalloc(bit_array_size,
+                                                       sizeof(*huffman_codes));
+      // Note: some histogram_image entries may point to tmp_histos[], so the
+      // latter need to outlive the following call to
+      // GetHuffBitLengthsAndCodes().
+      if (huffman_codes == NULL ||
+          !GetHuffBitLengthsAndCodes(histogram_image, huffman_codes)) {
+        WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+        goto Error;
+      }
+      // Free combined histograms.
+      VP8LFreeHistogramSet(histogram_image);
+      histogram_image = NULL;
+
+      // Free scratch histograms.
+      VP8LFreeHistogram(tmp_histo);
+      tmp_histo = NULL;
+
+      // Color Cache parameters.
+      if (cache_bits_tmp > 0) {
+        VP8LPutBits(bw, 1, 1);
+        VP8LPutBits(bw, cache_bits_tmp, 4);
+      } else {
+        VP8LPutBits(bw, 0, 1);
+      }
+
+      // Huffman image + meta huffman.
+      write_histogram_image = (histogram_image_size > 1);
       VP8LPutBits(bw, write_histogram_image, 1);
       if (write_histogram_image) {
-        uint32_t* const histogram_argb =
-            (uint32_t*)WebPSafeMalloc(histogram_image_xysize,
-                                      sizeof(*histogram_argb));
+        uint32_t* const histogram_argb = (uint32_t*)WebPSafeMalloc(
+            histogram_image_xysize, sizeof(*histogram_argb));
         int max_index = 0;
         uint32_t i;
         if (histogram_argb == NULL) {
-          err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+          WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
           goto Error;
         }
         for (i = 0; i < histogram_image_xysize; ++i) {
@@ -997,73 +1275,84 @@
         histogram_image_size = max_index;
 
         VP8LPutBits(bw, histogram_bits - 2, 3);
-        err = EncodeImageNoHuffman(
-            bw, histogram_argb, hash_chain, refs_tmp, &refs_array[2],
-            VP8LSubSampleSize(width, histogram_bits),
-            VP8LSubSampleSize(height, histogram_bits), quality, low_effort);
+        i_percent_range = i_remaining_percent / 2;
+        i_remaining_percent -= i_percent_range;
+        if (!EncodeImageNoHuffman(
+                bw, histogram_argb, &hash_chain_histogram, &refs_array[2],
+                VP8LSubSampleSize(width, histogram_bits),
+                VP8LSubSampleSize(height, histogram_bits), quality, low_effort,
+                pic, i_percent_range, percent)) {
+          WebPSafeFree(histogram_argb);
+          goto Error;
+        }
         WebPSafeFree(histogram_argb);
-        if (err != VP8_ENC_OK) goto Error;
       }
-    }
 
-    // Store Huffman codes.
-    {
-      int i;
-      int max_tokens = 0;
-      // Find maximum number of symbols for the huffman tree-set.
-      for (i = 0; i < 5 * histogram_image_size; ++i) {
-        HuffmanTreeCode* const codes = &huffman_codes[i];
-        if (max_tokens < codes->num_symbols) {
-          max_tokens = codes->num_symbols;
+      // Store Huffman codes.
+      {
+        int i;
+        int max_tokens = 0;
+        // Find maximum number of symbols for the huffman tree-set.
+        for (i = 0; i < 5 * histogram_image_size; ++i) {
+          HuffmanTreeCode* const codes = &huffman_codes[i];
+          if (max_tokens < codes->num_symbols) {
+            max_tokens = codes->num_symbols;
+          }
+        }
+        tokens = (HuffmanTreeToken*)WebPSafeMalloc(max_tokens, sizeof(*tokens));
+        if (tokens == NULL) {
+          WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+          goto Error;
+        }
+        for (i = 0; i < 5 * histogram_image_size; ++i) {
+          HuffmanTreeCode* const codes = &huffman_codes[i];
+          StoreHuffmanCode(bw, huff_tree, tokens, codes);
+          ClearHuffmanTreeIfOnlyOneSymbol(codes);
         }
       }
-      tokens = (HuffmanTreeToken*)WebPSafeMalloc(max_tokens, sizeof(*tokens));
-      if (tokens == NULL) {
-        err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+      // Store actual literals.
+      hdr_size_tmp = (int)(VP8LBitWriterNumBytes(bw) - init_byte_position);
+      if (!StoreImageToBitMask(bw, width, histogram_bits, &refs_array[i_cache],
+                               histogram_symbols, huffman_codes, pic)) {
         goto Error;
       }
-      for (i = 0; i < 5 * histogram_image_size; ++i) {
-        HuffmanTreeCode* const codes = &huffman_codes[i];
-        StoreHuffmanCode(bw, huff_tree, tokens, codes);
-        ClearHuffmanTreeIfOnlyOneSymbol(codes);
+      // Keep track of the smallest image so far.
+      if (VP8LBitWriterNumBytes(bw) < bw_size_best) {
+        bw_size_best = VP8LBitWriterNumBytes(bw);
+        *cache_bits = cache_bits_tmp;
+        *hdr_size = hdr_size_tmp;
+        *data_size =
+            (int)(VP8LBitWriterNumBytes(bw) - init_byte_position - *hdr_size);
+        VP8LBitWriterSwap(bw, &bw_best);
       }
-    }
-    // Store actual literals.
-    hdr_size_tmp = (int)(VP8LBitWriterNumBytes(bw) - init_byte_position);
-    err = StoreImageToBitMask(bw, width, histogram_bits, refs_best,
-                              histogram_symbols, huffman_codes);
-    // Keep track of the smallest image so far.
-    if (lz77s_idx == 0 ||
-        VP8LBitWriterNumBytes(bw) < VP8LBitWriterNumBytes(&bw_best)) {
-      *hdr_size = hdr_size_tmp;
-      *data_size =
-          (int)(VP8LBitWriterNumBytes(bw) - init_byte_position - *hdr_size);
-      VP8LBitWriterSwap(bw, &bw_best);
-    }
-    // Reset the bit writer for the following iteration if any.
-    if (config->lz77s_types_to_try_size_ > 1) VP8LBitWriterReset(&bw_init, bw);
-    WebPSafeFree(tokens);
-    tokens = NULL;
-    if (huffman_codes != NULL) {
-      WebPSafeFree(huffman_codes->codes);
-      WebPSafeFree(huffman_codes);
-      huffman_codes = NULL;
+      WebPSafeFree(tokens);
+      tokens = NULL;
+      if (huffman_codes != NULL) {
+        WebPSafeFree(huffman_codes->codes);
+        WebPSafeFree(huffman_codes);
+        huffman_codes = NULL;
+      }
     }
   }
   VP8LBitWriterSwap(bw, &bw_best);
 
+  if (!WebPReportProgress(pic, percent_start + remaining_percent, percent)) {
+    goto Error;
+  }
+
  Error:
   WebPSafeFree(tokens);
   WebPSafeFree(huff_tree);
   VP8LFreeHistogramSet(histogram_image);
   VP8LFreeHistogram(tmp_histo);
+  VP8LHashChainClear(&hash_chain_histogram);
   if (huffman_codes != NULL) {
     WebPSafeFree(huffman_codes->codes);
     WebPSafeFree(huffman_codes);
   }
   WebPSafeFree(histogram_symbols);
   VP8LBitWriterWipeOut(&bw_best);
-  return err;
+  return (pic->error_code == VP8_ENC_OK);
 }
 
 // -----------------------------------------------------------------------------
@@ -1072,72 +1361,73 @@
 static void ApplySubtractGreen(VP8LEncoder* const enc, int width, int height,
                                VP8LBitWriter* const bw) {
   VP8LPutBits(bw, TRANSFORM_PRESENT, 1);
-  VP8LPutBits(bw, SUBTRACT_GREEN, 2);
+  VP8LPutBits(bw, SUBTRACT_GREEN_TRANSFORM, 2);
   VP8LSubtractGreenFromBlueAndRed(enc->argb_, width * height);
 }
 
-static WebPEncodingError ApplyPredictFilter(const VP8LEncoder* const enc,
-                                            int width, int height,
-                                            int quality, int low_effort,
-                                            int used_subtract_green,
-                                            VP8LBitWriter* const bw) {
+static int ApplyPredictFilter(const VP8LEncoder* const enc, int width,
+                              int height, int quality, int low_effort,
+                              int used_subtract_green, VP8LBitWriter* const bw,
+                              int percent_range, int* const percent) {
   const int pred_bits = enc->transform_bits_;
   const int transform_width = VP8LSubSampleSize(width, pred_bits);
   const int transform_height = VP8LSubSampleSize(height, pred_bits);
   // we disable near-lossless quantization if palette is used.
-  const int near_lossless_strength = enc->use_palette_ ? 100
-                                   : enc->config_->near_lossless;
+  const int near_lossless_strength =
+      enc->use_palette_ ? 100 : enc->config_->near_lossless;
 
-  VP8LResidualImage(width, height, pred_bits, low_effort, enc->argb_,
-                    enc->argb_scratch_, enc->transform_data_,
-                    near_lossless_strength, enc->config_->exact,
-                    used_subtract_green);
+  if (!VP8LResidualImage(
+          width, height, pred_bits, low_effort, enc->argb_, enc->argb_scratch_,
+          enc->transform_data_, near_lossless_strength, enc->config_->exact,
+          used_subtract_green, enc->pic_, percent_range / 2, percent)) {
+    return 0;
+  }
   VP8LPutBits(bw, TRANSFORM_PRESENT, 1);
   VP8LPutBits(bw, PREDICTOR_TRANSFORM, 2);
   assert(pred_bits >= 2);
   VP8LPutBits(bw, pred_bits - 2, 3);
   return EncodeImageNoHuffman(
       bw, enc->transform_data_, (VP8LHashChain*)&enc->hash_chain_,
-      (VP8LBackwardRefs*)&enc->refs_[0],  // cast const away
-      (VP8LBackwardRefs*)&enc->refs_[1], transform_width, transform_height,
-      quality, low_effort);
+      (VP8LBackwardRefs*)&enc->refs_[0], transform_width, transform_height,
+      quality, low_effort, enc->pic_, percent_range - percent_range / 2,
+      percent);
 }
 
-static WebPEncodingError ApplyCrossColorFilter(const VP8LEncoder* const enc,
-                                               int width, int height,
-                                               int quality, int low_effort,
-                                               VP8LBitWriter* const bw) {
+static int ApplyCrossColorFilter(const VP8LEncoder* const enc, int width,
+                                 int height, int quality, int low_effort,
+                                 VP8LBitWriter* const bw, int percent_range,
+                                 int* const percent) {
   const int ccolor_transform_bits = enc->transform_bits_;
   const int transform_width = VP8LSubSampleSize(width, ccolor_transform_bits);
   const int transform_height = VP8LSubSampleSize(height, ccolor_transform_bits);
 
-  VP8LColorSpaceTransform(width, height, ccolor_transform_bits, quality,
-                          enc->argb_, enc->transform_data_);
+  if (!VP8LColorSpaceTransform(width, height, ccolor_transform_bits, quality,
+                               enc->argb_, enc->transform_data_, enc->pic_,
+                               percent_range / 2, percent)) {
+    return 0;
+  }
   VP8LPutBits(bw, TRANSFORM_PRESENT, 1);
   VP8LPutBits(bw, CROSS_COLOR_TRANSFORM, 2);
   assert(ccolor_transform_bits >= 2);
   VP8LPutBits(bw, ccolor_transform_bits - 2, 3);
   return EncodeImageNoHuffman(
       bw, enc->transform_data_, (VP8LHashChain*)&enc->hash_chain_,
-      (VP8LBackwardRefs*)&enc->refs_[0],  // cast const away
-      (VP8LBackwardRefs*)&enc->refs_[1], transform_width, transform_height,
-      quality, low_effort);
+      (VP8LBackwardRefs*)&enc->refs_[0], transform_width, transform_height,
+      quality, low_effort, enc->pic_, percent_range - percent_range / 2,
+      percent);
 }
 
 // -----------------------------------------------------------------------------
 
-static WebPEncodingError WriteRiffHeader(const WebPPicture* const pic,
-                                         size_t riff_size, size_t vp8l_size) {
+static int WriteRiffHeader(const WebPPicture* const pic, size_t riff_size,
+                           size_t vp8l_size) {
   uint8_t riff[RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE + VP8L_SIGNATURE_SIZE] = {
     'R', 'I', 'F', 'F', 0, 0, 0, 0, 'W', 'E', 'B', 'P',
     'V', 'P', '8', 'L', 0, 0, 0, 0, VP8L_MAGIC_BYTE,
   };
   PutLE32(riff + TAG_SIZE, (uint32_t)riff_size);
   PutLE32(riff + RIFF_HEADER_SIZE + TAG_SIZE, (uint32_t)vp8l_size);
-  if (!pic->writer(riff, sizeof(riff), pic)) {
-    return VP8_ENC_ERROR_BAD_WRITE;
-  }
-  return VP8_ENC_OK;
+  return pic->writer(riff, sizeof(riff), pic);
 }
 
 static int WriteImageSize(const WebPPicture* const pic,
@@ -1157,36 +1447,32 @@
   return !bw->error_;
 }
 
-static WebPEncodingError WriteImage(const WebPPicture* const pic,
-                                    VP8LBitWriter* const bw,
-                                    size_t* const coded_size) {
-  WebPEncodingError err = VP8_ENC_OK;
+static int WriteImage(const WebPPicture* const pic, VP8LBitWriter* const bw,
+                      size_t* const coded_size) {
   const uint8_t* const webpll_data = VP8LBitWriterFinish(bw);
   const size_t webpll_size = VP8LBitWriterNumBytes(bw);
   const size_t vp8l_size = VP8L_SIGNATURE_SIZE + webpll_size;
   const size_t pad = vp8l_size & 1;
   const size_t riff_size = TAG_SIZE + CHUNK_HEADER_SIZE + vp8l_size + pad;
+  *coded_size = 0;
 
-  err = WriteRiffHeader(pic, riff_size, vp8l_size);
-  if (err != VP8_ENC_OK) goto Error;
+  if (bw->error_) {
+    return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+  }
 
-  if (!pic->writer(webpll_data, webpll_size, pic)) {
-    err = VP8_ENC_ERROR_BAD_WRITE;
-    goto Error;
+  if (!WriteRiffHeader(pic, riff_size, vp8l_size) ||
+      !pic->writer(webpll_data, webpll_size, pic)) {
+    return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
   }
 
   if (pad) {
     const uint8_t pad_byte[1] = { 0 };
     if (!pic->writer(pad_byte, 1, pic)) {
-      err = VP8_ENC_ERROR_BAD_WRITE;
-      goto Error;
+      return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
     }
   }
   *coded_size = CHUNK_HEADER_SIZE + riff_size;
-  return VP8_ENC_OK;
-
- Error:
-  return err;
+  return 1;
 }
 
 // -----------------------------------------------------------------------------
@@ -1202,18 +1488,16 @@
 // Flags influencing the memory allocated:
 //  enc->transform_bits_
 //  enc->use_predict_, enc->use_cross_color_
-static WebPEncodingError AllocateTransformBuffer(VP8LEncoder* const enc,
-                                                 int width, int height) {
-  WebPEncodingError err = VP8_ENC_OK;
+static int AllocateTransformBuffer(VP8LEncoder* const enc, int width,
+                                   int height) {
   const uint64_t image_size = width * height;
   // VP8LResidualImage needs room for 2 scanlines of uint32 pixels with an extra
   // pixel in each, plus 2 regular scanlines of bytes.
   // TODO(skal): Clean up by using arithmetic in bytes instead of words.
   const uint64_t argb_scratch_size =
-      enc->use_predict_
-          ? (width + 1) * 2 +
-            (width * 2 + sizeof(uint32_t) - 1) / sizeof(uint32_t)
-          : 0;
+      enc->use_predict_ ? (width + 1) * 2 + (width * 2 + sizeof(uint32_t) - 1) /
+                                                sizeof(uint32_t)
+                        : 0;
   const uint64_t transform_data_size =
       (enc->use_predict_ || enc->use_cross_color_)
           ? VP8LSubSampleSize(width, enc->transform_bits_) *
@@ -1221,17 +1505,15 @@
           : 0;
   const uint64_t max_alignment_in_words =
       (WEBP_ALIGN_CST + sizeof(uint32_t) - 1) / sizeof(uint32_t);
-  const uint64_t mem_size =
-      image_size + max_alignment_in_words +
-      argb_scratch_size + max_alignment_in_words +
-      transform_data_size;
+  const uint64_t mem_size = image_size + max_alignment_in_words +
+                            argb_scratch_size + max_alignment_in_words +
+                            transform_data_size;
   uint32_t* mem = enc->transform_mem_;
   if (mem == NULL || mem_size > enc->transform_mem_size_) {
     ClearTransformBuffer(enc);
     mem = (uint32_t*)WebPSafeMalloc(mem_size, sizeof(*mem));
     if (mem == NULL) {
-      err = VP8_ENC_ERROR_OUT_OF_MEMORY;
-      goto Error;
+      return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
     }
     enc->transform_mem_ = mem;
     enc->transform_mem_size_ = (size_t)mem_size;
@@ -1244,47 +1526,34 @@
   enc->transform_data_ = mem;
 
   enc->current_width_ = width;
- Error:
-  return err;
+  return 1;
 }
 
-static WebPEncodingError MakeInputImageCopy(VP8LEncoder* const enc) {
-  WebPEncodingError err = VP8_ENC_OK;
+static int MakeInputImageCopy(VP8LEncoder* const enc) {
   const WebPPicture* const picture = enc->pic_;
   const int width = picture->width;
   const int height = picture->height;
-  int y;
-  err = AllocateTransformBuffer(enc, width, height);
-  if (err != VP8_ENC_OK) return err;
-  if (enc->argb_content_ == kEncoderARGB) return VP8_ENC_OK;
-  for (y = 0; y < height; ++y) {
-    memcpy(enc->argb_ + y * width,
-           picture->argb + y * picture->argb_stride,
-           width * sizeof(*enc->argb_));
+
+  if (!AllocateTransformBuffer(enc, width, height)) return 0;
+  if (enc->argb_content_ == kEncoderARGB) return 1;
+
+  {
+    uint32_t* dst = enc->argb_;
+    const uint32_t* src = picture->argb;
+    int y;
+    for (y = 0; y < height; ++y) {
+      memcpy(dst, src, width * sizeof(*dst));
+      dst += width;
+      src += picture->argb_stride;
+    }
   }
   enc->argb_content_ = kEncoderARGB;
   assert(enc->current_width_ == width);
-  return VP8_ENC_OK;
+  return 1;
 }
 
 // -----------------------------------------------------------------------------
 
-static WEBP_INLINE int SearchColorNoIdx(const uint32_t sorted[], uint32_t color,
-                                        int hi) {
-  int low = 0;
-  if (sorted[low] == color) return low;  // loop invariant: sorted[low] != color
-  while (1) {
-    const int mid = (low + hi) >> 1;
-    if (sorted[mid] == color) {
-      return mid;
-    } else if (sorted[mid] < color) {
-      low = mid;
-    } else {
-      hi = mid;
-    }
-  }
-}
-
 #define APPLY_PALETTE_GREEDY_MAX 4
 
 static WEBP_INLINE uint32_t SearchColorGreedy(const uint32_t palette[],
@@ -1319,17 +1588,6 @@
          (32 - PALETTE_INV_SIZE_BITS);
 }
 
-// Sort palette in increasing order and prepare an inverse mapping array.
-static void PrepareMapToPalette(const uint32_t palette[], int num_colors,
-                                uint32_t sorted[], uint32_t idx_map[]) {
-  int i;
-  memcpy(sorted, palette, num_colors * sizeof(*sorted));
-  qsort(sorted, num_colors, sizeof(*sorted), PaletteCompareColorsForQsort);
-  for (i = 0; i < num_colors; ++i) {
-    idx_map[SearchColorNoIdx(sorted, palette[i], num_colors)] = i;
-  }
-}
-
 // Use 1 pixel cache for ARGB pixels.
 #define APPLY_PALETTE_FOR(COLOR_INDEX) do {         \
   uint32_t prev_pix = palette[0];                   \
@@ -1353,16 +1611,18 @@
 // using 'row' as a temporary buffer of size 'width'.
 // We assume that all src[] values have a corresponding entry in the palette.
 // Note: src[] can be the same as dst[]
-static WebPEncodingError ApplyPalette(const uint32_t* src, uint32_t src_stride,
-                                      uint32_t* dst, uint32_t dst_stride,
-                                      const uint32_t* palette, int palette_size,
-                                      int width, int height, int xbits) {
+static int ApplyPalette(const uint32_t* src, uint32_t src_stride, uint32_t* dst,
+                        uint32_t dst_stride, const uint32_t* palette,
+                        int palette_size, int width, int height, int xbits,
+                        const WebPPicture* const pic) {
   // TODO(skal): this tmp buffer is not needed if VP8LBundleColorMap() can be
   // made to work in-place.
   uint8_t* const tmp_row = (uint8_t*)WebPSafeMalloc(width, sizeof(*tmp_row));
   int x, y;
 
-  if (tmp_row == NULL) return VP8_ENC_ERROR_OUT_OF_MEMORY;
+  if (tmp_row == NULL) {
+    return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+  }
 
   if (palette_size < APPLY_PALETTE_GREEDY_MAX) {
     APPLY_PALETTE_FOR(SearchColorGreedy(palette, palette_size, pix));
@@ -1407,7 +1667,7 @@
     }
   }
   WebPSafeFree(tmp_row);
-  return VP8_ENC_OK;
+  return 1;
 }
 #undef APPLY_PALETTE_FOR
 #undef PALETTE_INV_SIZE_BITS
@@ -1415,9 +1675,7 @@
 #undef APPLY_PALETTE_GREEDY_MAX
 
 // Note: Expects "enc->palette_" to be set properly.
-static WebPEncodingError MapImageFromPalette(VP8LEncoder* const enc,
-                                             int in_place) {
-  WebPEncodingError err = VP8_ENC_OK;
+static int MapImageFromPalette(VP8LEncoder* const enc, int in_place) {
   const WebPPicture* const pic = enc->pic_;
   const int width = pic->width;
   const int height = pic->height;
@@ -1435,19 +1693,22 @@
     xbits = (palette_size <= 16) ? 1 : 0;
   }
 
-  err = AllocateTransformBuffer(enc, VP8LSubSampleSize(width, xbits), height);
-  if (err != VP8_ENC_OK) return err;
-
-  err = ApplyPalette(src, src_stride,
+  if (!AllocateTransformBuffer(enc, VP8LSubSampleSize(width, xbits), height)) {
+    return 0;
+  }
+  if (!ApplyPalette(src, src_stride,
                      enc->argb_, enc->current_width_,
-                     palette, palette_size, width, height, xbits);
+                     palette, palette_size, width, height, xbits, pic)) {
+    return 0;
+  }
   enc->argb_content_ = kEncoderPalette;
-  return err;
+  return 1;
 }
 
 // Save palette_[] to bitstream.
 static WebPEncodingError EncodePalette(VP8LBitWriter* const bw, int low_effort,
-                                       VP8LEncoder* const enc) {
+                                       VP8LEncoder* const enc,
+                                       int percent_range, int* const percent) {
   int i;
   uint32_t tmp_palette[MAX_PALETTE_SIZE];
   const int palette_size = enc->palette_size_;
@@ -1461,8 +1722,8 @@
   }
   tmp_palette[0] = palette[0];
   return EncodeImageNoHuffman(bw, tmp_palette, &enc->hash_chain_,
-                              &enc->refs_[0], &enc->refs_[1], palette_size, 1,
-                              20 /* quality */, low_effort);
+                              &enc->refs_[0], palette_size, 1, /*quality=*/20,
+                              low_effort, enc->pic_, percent_range, percent);
 }
 
 // -----------------------------------------------------------------------------
@@ -1488,7 +1749,7 @@
   if (enc != NULL) {
     int i;
     VP8LHashChainClear(&enc->hash_chain_);
-    for (i = 0; i < 3; ++i) VP8LBackwardRefsClear(&enc->refs_[i]);
+    for (i = 0; i < 4; ++i) VP8LBackwardRefsClear(&enc->refs_[i]);
     ClearTransformBuffer(enc);
     WebPSafeFree(enc);
   }
@@ -1506,7 +1767,6 @@
   CrunchConfig crunch_configs_[CRUNCH_CONFIGS_MAX];
   int num_crunch_configs_;
   int red_and_blue_always_zero_;
-  WebPEncodingError err_;
   WebPAuxStats* stats_;
 } StreamEncodeContext;
 
@@ -1523,7 +1783,6 @@
 #if !defined(WEBP_DISABLE_STATS)
   WebPAuxStats* const stats = params->stats_;
 #endif
-  WebPEncodingError err = VP8_ENC_OK;
   const int quality = (int)config->quality;
   const int low_effort = (config->method == 0);
 #if (WEBP_NEAR_LOSSLESS == 1)
@@ -1531,6 +1790,7 @@
 #endif
   const int height = picture->height;
   const size_t byte_position = VP8LBitWriterNumBytes(bw);
+  int percent = 2;  // for WebPProgressHook
 #if (WEBP_NEAR_LOSSLESS == 1)
   int use_near_lossless = 0;
 #endif
@@ -1538,24 +1798,28 @@
   int data_size = 0;
   int use_delta_palette = 0;
   int idx;
-  size_t best_size = 0;
+  size_t best_size = ~(size_t)0;
   VP8LBitWriter bw_init = *bw, bw_best;
   (void)data2;
 
   if (!VP8LBitWriterInit(&bw_best, 0) ||
       (num_crunch_configs > 1 && !VP8LBitWriterClone(bw, &bw_best))) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+    WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
     goto Error;
   }
 
   for (idx = 0; idx < num_crunch_configs; ++idx) {
     const int entropy_idx = crunch_configs[idx].entropy_idx_;
-    enc->use_palette_ = (entropy_idx == kPalette);
+    int remaining_percent = 97 / num_crunch_configs, percent_range;
+    enc->use_palette_ =
+        (entropy_idx == kPalette) || (entropy_idx == kPaletteAndSpatial);
     enc->use_subtract_green_ =
         (entropy_idx == kSubGreen) || (entropy_idx == kSpatialSubGreen);
-    enc->use_predict_ =
-        (entropy_idx == kSpatial) || (entropy_idx == kSpatialSubGreen);
-    if (low_effort) {
+    enc->use_predict_ = (entropy_idx == kSpatial) ||
+                        (entropy_idx == kSpatialSubGreen) ||
+                        (entropy_idx == kPaletteAndSpatial);
+    // When using a palette, R/B==0, hence no need to test for cross-color.
+    if (low_effort || enc->use_palette_) {
       enc->use_cross_color_ = 0;
     } else {
       enc->use_cross_color_ = red_and_blue_always_zero ? 0 : enc->use_predict_;
@@ -1570,11 +1834,10 @@
     use_near_lossless = (config->near_lossless < 100) && !enc->use_palette_ &&
                         !enc->use_predict_;
     if (use_near_lossless) {
-      err = AllocateTransformBuffer(enc, width, height);
-      if (err != VP8_ENC_OK) goto Error;
+      if (!AllocateTransformBuffer(enc, width, height)) goto Error;
       if ((enc->argb_content_ != kEncoderNearLossless) &&
           !VP8ApplyNearLossless(picture, config->near_lossless, enc->argb_)) {
-        err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+        WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
         goto Error;
       }
       enc->argb_content_ = kEncoderNearLossless;
@@ -1587,10 +1850,26 @@
 
     // Encode palette
     if (enc->use_palette_) {
-      err = EncodePalette(bw, low_effort, enc);
-      if (err != VP8_ENC_OK) goto Error;
-      err = MapImageFromPalette(enc, use_delta_palette);
-      if (err != VP8_ENC_OK) goto Error;
+      if (crunch_configs[idx].palette_sorting_type_ == kSortedDefault) {
+        // Nothing to do, we have already sorted the palette.
+        memcpy(enc->palette_, enc->palette_sorted_,
+               enc->palette_size_ * sizeof(*enc->palette_));
+      } else if (crunch_configs[idx].palette_sorting_type_ == kMinimizeDelta) {
+        PaletteSortMinimizeDeltas(enc->palette_sorted_, enc->palette_size_,
+                                  enc->palette_);
+      } else {
+        assert(crunch_configs[idx].palette_sorting_type_ == kModifiedZeng);
+        if (!PaletteSortModifiedZeng(enc->pic_, enc->palette_sorted_,
+                                      enc->palette_size_, enc->palette_)) {
+          goto Error;
+        }
+      }
+      percent_range = remaining_percent / 4;
+      if (!EncodePalette(bw, low_effort, enc, percent_range, &percent)) {
+        goto Error;
+      }
+      remaining_percent -= percent_range;
+      if (!MapImageFromPalette(enc, use_delta_palette)) goto Error;
       // If using a color cache, do not have it bigger than the number of
       // colors.
       if (use_cache && enc->palette_size_ < (1 << MAX_COLOR_CACHE_BITS)) {
@@ -1601,8 +1880,7 @@
       // In case image is not packed.
       if (enc->argb_content_ != kEncoderNearLossless &&
           enc->argb_content_ != kEncoderPalette) {
-        err = MakeInputImageCopy(enc);
-        if (err != VP8_ENC_OK) goto Error;
+        if (!MakeInputImageCopy(enc)) goto Error;
       }
 
       // -----------------------------------------------------------------------
@@ -1613,15 +1891,22 @@
       }
 
       if (enc->use_predict_) {
-        err = ApplyPredictFilter(enc, enc->current_width_, height, quality,
-                                 low_effort, enc->use_subtract_green_, bw);
-        if (err != VP8_ENC_OK) goto Error;
+        percent_range = remaining_percent / 3;
+        if (!ApplyPredictFilter(enc, enc->current_width_, height, quality,
+                                low_effort, enc->use_subtract_green_, bw,
+                                percent_range, &percent)) {
+          goto Error;
+        }
+        remaining_percent -= percent_range;
       }
 
       if (enc->use_cross_color_) {
-        err = ApplyCrossColorFilter(enc, enc->current_width_, height, quality,
-                                    low_effort, bw);
-        if (err != VP8_ENC_OK) goto Error;
+        percent_range = remaining_percent / 2;
+        if (!ApplyCrossColorFilter(enc, enc->current_width_, height, quality,
+                                   low_effort, bw, percent_range, &percent)) {
+          goto Error;
+        }
+        remaining_percent -= percent_range;
       }
     }
 
@@ -1629,15 +1914,16 @@
 
     // -------------------------------------------------------------------------
     // Encode and write the transformed image.
-    err = EncodeImageInternal(bw, enc->argb_, &enc->hash_chain_, enc->refs_,
-                              enc->current_width_, height, quality, low_effort,
-                              use_cache, &crunch_configs[idx],
-                              &enc->cache_bits_, enc->histo_bits_,
-                              byte_position, &hdr_size, &data_size);
-    if (err != VP8_ENC_OK) goto Error;
+    if (!EncodeImageInternal(
+            bw, enc->argb_, &enc->hash_chain_, enc->refs_, enc->current_width_,
+            height, quality, low_effort, use_cache, &crunch_configs[idx],
+            &enc->cache_bits_, enc->histo_bits_, byte_position, &hdr_size,
+            &data_size, picture, remaining_percent, &percent)) {
+      goto Error;
+    }
 
     // If we are better than what we already have.
-    if (idx == 0 || VP8LBitWriterNumBytes(bw) < best_size) {
+    if (VP8LBitWriterNumBytes(bw) < best_size) {
       best_size = VP8LBitWriterNumBytes(bw);
       // Store the BitWriter.
       VP8LBitWriterSwap(bw, &bw_best);
@@ -1664,18 +1950,15 @@
   }
   VP8LBitWriterSwap(&bw_best, bw);
 
-Error:
+ Error:
   VP8LBitWriterWipeOut(&bw_best);
-  params->err_ = err;
   // The hook should return false in case of error.
-  return (err == VP8_ENC_OK);
+  return (params->picture_->error_code == VP8_ENC_OK);
 }
 
-WebPEncodingError VP8LEncodeStream(const WebPConfig* const config,
-                                   const WebPPicture* const picture,
-                                   VP8LBitWriter* const bw_main,
-                                   int use_cache) {
-  WebPEncodingError err = VP8_ENC_OK;
+int VP8LEncodeStream(const WebPConfig* const config,
+                     const WebPPicture* const picture,
+                     VP8LBitWriter* const bw_main, int use_cache) {
   VP8LEncoder* const enc_main = VP8LEncoderNew(config, picture);
   VP8LEncoder* enc_side = NULL;
   CrunchConfig crunch_configs[CRUNCH_CONFIGS_MAX];
@@ -1687,15 +1970,23 @@
   // The main thread uses picture->stats, the side thread uses stats_side.
   WebPAuxStats stats_side;
   VP8LBitWriter bw_side;
+  WebPPicture picture_side;
   const WebPWorkerInterface* const worker_interface = WebPGetWorkerInterface();
   int ok_main;
 
+  if (enc_main == NULL || !VP8LBitWriterInit(&bw_side, 0)) {
+    VP8LEncoderDelete(enc_main);
+    return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
+  }
+
+  // Avoid "garbage value" error from Clang's static analysis tool.
+  WebPPictureInit(&picture_side);
+
   // Analyze image (entropy, num_palettes etc)
-  if (enc_main == NULL ||
-      !EncoderAnalyze(enc_main, crunch_configs, &num_crunch_configs_main,
+  if (!EncoderAnalyze(enc_main, crunch_configs, &num_crunch_configs_main,
                       &red_and_blue_always_zero) ||
-      !EncoderInit(enc_main) || !VP8LBitWriterInit(&bw_side, 0)) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+      !EncoderInit(enc_main)) {
+    WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
     goto Error;
   }
 
@@ -1724,25 +2015,32 @@
       StreamEncodeContext* const param =
           (idx == 0) ? &params_main : &params_side;
       param->config_ = config;
-      param->picture_ = picture;
       param->use_cache_ = use_cache;
       param->red_and_blue_always_zero_ = red_and_blue_always_zero;
       if (idx == 0) {
+        param->picture_ = picture;
         param->stats_ = picture->stats;
         param->bw_ = bw_main;
         param->enc_ = enc_main;
       } else {
+        // Create a side picture (error_code is not thread-safe).
+        if (!WebPPictureView(picture, /*left=*/0, /*top=*/0, picture->width,
+                             picture->height, &picture_side)) {
+          assert(0);
+        }
+        picture_side.progress_hook = NULL;  // Progress hook is not thread-safe.
+        param->picture_ = &picture_side;  // No need to free a view afterwards.
         param->stats_ = (picture->stats == NULL) ? NULL : &stats_side;
         // Create a side bit writer.
         if (!VP8LBitWriterClone(bw_main, &bw_side)) {
-          err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+          WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
           goto Error;
         }
         param->bw_ = &bw_side;
         // Create a side encoder.
-        enc_side = VP8LEncoderNew(config, picture);
+        enc_side = VP8LEncoderNew(config, &picture_side);
         if (enc_side == NULL || !EncoderInit(enc_side)) {
-          err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+          WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
           goto Error;
         }
         // Copy the values that were computed for the main encoder.
@@ -1751,6 +2049,8 @@
         enc_side->palette_size_ = enc_main->palette_size_;
         memcpy(enc_side->palette_, enc_main->palette_,
                sizeof(enc_main->palette_));
+        memcpy(enc_side->palette_sorted_, enc_main->palette_sorted_,
+               sizeof(enc_main->palette_sorted_));
         param->enc_ = enc_side;
       }
       // Create the workers.
@@ -1764,7 +2064,7 @@
   // Start the second thread if needed.
   if (num_crunch_configs_side != 0) {
     if (!worker_interface->Reset(&worker_side)) {
-      err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+      WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
       goto Error;
     }
 #if !defined(WEBP_DISABLE_STATS)
@@ -1774,8 +2074,6 @@
       memcpy(&stats_side, picture->stats, sizeof(stats_side));
     }
 #endif
-    // This line is only useful to remove a Clang static analyzer warning.
-    params_side.err_ = VP8_ENC_OK;
     worker_interface->Launch(&worker_side);
   }
   // Execute the main thread.
@@ -1787,7 +2085,10 @@
     const int ok_side = worker_interface->Sync(&worker_side);
     worker_interface->End(&worker_side);
     if (!ok_main || !ok_side) {
-      err = ok_main ? params_side.err_ : params_main.err_;
+      if (picture->error_code == VP8_ENC_OK) {
+        assert(picture_side.error_code != VP8_ENC_OK);
+        WebPEncodingSetError(picture, picture_side.error_code);
+      }
       goto Error;
     }
     if (VP8LBitWriterNumBytes(&bw_side) < VP8LBitWriterNumBytes(bw_main)) {
@@ -1798,22 +2099,17 @@
       }
 #endif
     }
-  } else {
-    if (!ok_main) {
-      err = params_main.err_;
-      goto Error;
-    }
   }
 
-Error:
+ Error:
   VP8LBitWriterWipeOut(&bw_side);
   VP8LEncoderDelete(enc_main);
   VP8LEncoderDelete(enc_side);
-  return err;
+  return (picture->error_code == VP8_ENC_OK);
 }
 
 #undef CRUNCH_CONFIGS_MAX
-#undef CRUNCH_CONFIGS_LZ77_MAX
+#undef CRUNCH_SUBCONFIGS_MAX
 
 int VP8LEncodeImage(const WebPConfig* const config,
                     const WebPPicture* const picture) {
@@ -1822,15 +2118,12 @@
   size_t coded_size;
   int percent = 0;
   int initial_size;
-  WebPEncodingError err = VP8_ENC_OK;
   VP8LBitWriter bw;
 
   if (picture == NULL) return 0;
 
   if (config == NULL || picture->argb == NULL) {
-    err = VP8_ENC_ERROR_NULL_PARAMETER;
-    WebPEncodingSetError(picture, err);
-    return 0;
+    return WebPEncodingSetError(picture, VP8_ENC_ERROR_NULL_PARAMETER);
   }
 
   width = picture->width;
@@ -1840,13 +2133,13 @@
   initial_size = (config->image_hint == WEBP_HINT_GRAPH) ?
       width * height : width * height * 2;
   if (!VP8LBitWriterInit(&bw, initial_size)) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+    WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
     goto Error;
   }
 
   if (!WebPReportProgress(picture, 1, &percent)) {
  UserAbort:
-    err = VP8_ENC_ERROR_USER_ABORT;
+    WebPEncodingSetError(picture, VP8_ENC_ERROR_USER_ABORT);
     goto Error;
   }
   // Reset stats (for pure lossless coding)
@@ -1862,28 +2155,26 @@
 
   // Write image size.
   if (!WriteImageSize(picture, &bw)) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+    WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
     goto Error;
   }
 
   has_alpha = WebPPictureHasTransparency(picture);
   // Write the non-trivial Alpha flag and lossless version.
   if (!WriteRealAlphaAndVersion(&bw, has_alpha)) {
-    err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+    WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
     goto Error;
   }
 
-  if (!WebPReportProgress(picture, 5, &percent)) goto UserAbort;
+  if (!WebPReportProgress(picture, 2, &percent)) goto UserAbort;
 
   // Encode main image stream.
-  err = VP8LEncodeStream(config, picture, &bw, 1 /*use_cache*/);
-  if (err != VP8_ENC_OK) goto Error;
+  if (!VP8LEncodeStream(config, picture, &bw, 1 /*use_cache*/)) goto Error;
 
-  if (!WebPReportProgress(picture, 90, &percent)) goto UserAbort;
+  if (!WebPReportProgress(picture, 99, &percent)) goto UserAbort;
 
   // Finish the RIFF chunk.
-  err = WriteImage(picture, &bw, &coded_size);
-  if (err != VP8_ENC_OK) goto Error;
+  if (!WriteImage(picture, &bw, &coded_size)) goto Error;
 
   if (!WebPReportProgress(picture, 100, &percent)) goto UserAbort;
 
@@ -1902,13 +2193,11 @@
   }
 
  Error:
-  if (bw.error_) err = VP8_ENC_ERROR_OUT_OF_MEMORY;
-  VP8LBitWriterWipeOut(&bw);
-  if (err != VP8_ENC_OK) {
-    WebPEncodingSetError(picture, err);
-    return 0;
+  if (bw.error_) {
+    WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
   }
-  return 1;
+  VP8LBitWriterWipeOut(&bw);
+  return (picture->error_code == VP8_ENC_OK);
 }
 
 //------------------------------------------------------------------------------
diff --git a/third_party/libwebp/src/enc/vp8li_enc.h b/third_party/libwebp/src/enc/vp8li_enc.h
index 298a4a0..3d35e16 100644
--- a/third_party/libwebp/src/enc/vp8li_enc.h
+++ b/third_party/libwebp/src/enc/vp8li_enc.h
@@ -69,9 +69,11 @@
   int use_palette_;
   int palette_size_;
   uint32_t palette_[MAX_PALETTE_SIZE];
+  // Sorted version of palette_ for cache purposes.
+  uint32_t palette_sorted_[MAX_PALETTE_SIZE];
 
   // Some 'scratch' (potentially large) objects.
-  struct VP8LBackwardRefs refs_[3];  // Backward Refs array for temporaries.
+  struct VP8LBackwardRefs refs_[4];  // Backward Refs array for temporaries.
   VP8LHashChain hash_chain_;         // HashChain data for constructing
                                      // backward references.
 } VP8LEncoder;
@@ -87,9 +89,10 @@
 
 // Encodes the main image stream using the supplied bit writer.
 // If 'use_cache' is false, disables the use of color cache.
-WebPEncodingError VP8LEncodeStream(const WebPConfig* const config,
-                                   const WebPPicture* const picture,
-                                   VP8LBitWriter* const bw, int use_cache);
+// Returns false in case of error (stored in picture->error_code).
+int VP8LEncodeStream(const WebPConfig* const config,
+                     const WebPPicture* const picture, VP8LBitWriter* const bw,
+                     int use_cache);
 
 #if (WEBP_NEAR_LOSSLESS == 1)
 // in near_lossless.c
@@ -101,13 +104,18 @@
 //------------------------------------------------------------------------------
 // Image transforms in predictor.c.
 
-void VP8LResidualImage(int width, int height, int bits, int low_effort,
-                       uint32_t* const argb, uint32_t* const argb_scratch,
-                       uint32_t* const image, int near_lossless, int exact,
-                       int used_subtract_green);
+// pic and percent are for progress.
+// Returns false in case of error (stored in pic->error_code).
+int VP8LResidualImage(int width, int height, int bits, int low_effort,
+                      uint32_t* const argb, uint32_t* const argb_scratch,
+                      uint32_t* const image, int near_lossless, int exact,
+                      int used_subtract_green, const WebPPicture* const pic,
+                      int percent_range, int* const percent);
 
-void VP8LColorSpaceTransform(int width, int height, int bits, int quality,
-                             uint32_t* const argb, uint32_t* image);
+int VP8LColorSpaceTransform(int width, int height, int bits, int quality,
+                            uint32_t* const argb, uint32_t* image,
+                            const WebPPicture* const pic, int percent_range,
+                            int* const percent);
 
 //------------------------------------------------------------------------------
 
@@ -115,4 +123,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_ENC_VP8LI_ENC_H_ */
+#endif  // WEBP_ENC_VP8LI_ENC_H_
diff --git a/third_party/libwebp/src/enc/webp_enc.c b/third_party/libwebp/src/enc/webp_enc.c
index ead0092..58df3e8 100644
--- a/third_party/libwebp/src/enc/webp_enc.c
+++ b/third_party/libwebp/src/enc/webp_enc.c
@@ -313,7 +313,10 @@
                          WebPEncodingError error) {
   assert((int)error < VP8_ENC_ERROR_LAST);
   assert((int)error >= VP8_ENC_OK);
-  ((WebPPicture*)pic)->error_code = error;
+  // The oldest error reported takes precedence over the new one.
+  if (pic->error_code == VP8_ENC_OK) {
+    ((WebPPicture*)pic)->error_code = error;
+  }
   return 0;
 }
 
@@ -323,8 +326,7 @@
     *percent_store = percent;
     if (pic->progress_hook && !pic->progress_hook(percent, pic)) {
       // user abort requested
-      WebPEncodingSetError(pic, VP8_ENC_ERROR_USER_ABORT);
-      return 0;
+      return WebPEncodingSetError(pic, VP8_ENC_ERROR_USER_ABORT);
     }
   }
   return 1;  // ok
@@ -335,16 +337,14 @@
   int ok = 0;
   if (pic == NULL) return 0;
 
-  WebPEncodingSetError(pic, VP8_ENC_OK);  // all ok so far
+  pic->error_code = VP8_ENC_OK;  // all ok so far
   if (config == NULL) {  // bad params
     return WebPEncodingSetError(pic, VP8_ENC_ERROR_NULL_PARAMETER);
   }
   if (!WebPValidateConfig(config)) {
     return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION);
   }
-  if (pic->width <= 0 || pic->height <= 0) {
-    return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION);
-  }
+  if (!WebPValidatePicture(pic)) return 0;
   if (pic->width > WEBP_MAX_DIMENSION || pic->height > WEBP_MAX_DIMENSION) {
     return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION);
   }
@@ -406,7 +406,7 @@
     }
 
     if (!config->exact) {
-      WebPCleanupTransparentAreaLossless(pic);
+      WebPReplaceTransparentPixels(pic, 0x000000);
     }
 
     ok = VP8LEncodeImage(config, pic);  // Sets pic->error in case of problem.
diff --git a/third_party/libwebp/src/libwebp.pc.in b/third_party/libwebp/src/libwebp.pc.in
index 733bb6d..783090e 100644
--- a/third_party/libwebp/src/libwebp.pc.in
+++ b/third_party/libwebp/src/libwebp.pc.in
@@ -6,6 +6,7 @@
 Name: libwebp
 Description: Library for the WebP graphics format
 Version: @PACKAGE_VERSION@
+Requires.private: libsharpyuv
 Cflags: -I${includedir}
-Libs: -L${libdir} -lwebp
+Libs: -L${libdir} -l@webp_libname_prefix@webp
 Libs.private: -lm @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
diff --git a/third_party/libwebp/src/libwebp.rc b/third_party/libwebp/src/libwebp.rc
index d554124..5ce33db 100644
--- a/third_party/libwebp/src/libwebp.rc
+++ b/third_party/libwebp/src/libwebp.rc
@@ -6,8 +6,8 @@
 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,0
- PRODUCTVERSION 1,0,0,0
+ FILEVERSION 1,0,3,1
+ PRODUCTVERSION 1,0,3,1
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -24,12 +24,12 @@
         BEGIN
             VALUE "CompanyName", "Google, Inc."
             VALUE "FileDescription", "libwebp DLL"
-            VALUE "FileVersion", "1.0.0"
+            VALUE "FileVersion", "1.3.1"
             VALUE "InternalName", "libwebp.dll"
-            VALUE "LegalCopyright", "Copyright (C) 2018"
+            VALUE "LegalCopyright", "Copyright (C) 2023"
             VALUE "OriginalFilename", "libwebp.dll"
             VALUE "ProductName", "WebP Image Codec"
-            VALUE "ProductVersion", "1.0.0"
+            VALUE "ProductVersion", "1.3.1"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/third_party/libwebp/src/libwebpdecoder.pc.in b/third_party/libwebp/src/libwebpdecoder.pc.in
index 3ef647a..134de0e 100644
--- a/third_party/libwebp/src/libwebpdecoder.pc.in
+++ b/third_party/libwebp/src/libwebpdecoder.pc.in
@@ -7,5 +7,5 @@
 Description: Library for the WebP graphics format (decode only)
 Version: @PACKAGE_VERSION@
 Cflags: -I${includedir}
-Libs: -L${libdir} -lwebpdecoder
+Libs: -L${libdir} -l@webp_libname_prefix@webpdecoder
 Libs.private: -lm @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
diff --git a/third_party/libwebp/src/libwebpdecoder.rc b/third_party/libwebp/src/libwebpdecoder.rc
index 8a2def4..1a5a253 100644
--- a/third_party/libwebp/src/libwebpdecoder.rc
+++ b/third_party/libwebp/src/libwebpdecoder.rc
@@ -6,8 +6,8 @@
 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,0
- PRODUCTVERSION 1,0,0,0
+ FILEVERSION 1,0,3,1
+ PRODUCTVERSION 1,0,3,1
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -24,12 +24,12 @@
         BEGIN
             VALUE "CompanyName", "Google, Inc."
             VALUE "FileDescription", "libwebpdecoder DLL"
-            VALUE "FileVersion", "1.0.0"
+            VALUE "FileVersion", "1.3.1"
             VALUE "InternalName", "libwebpdecoder.dll"
-            VALUE "LegalCopyright", "Copyright (C) 2018"
+            VALUE "LegalCopyright", "Copyright (C) 2023"
             VALUE "OriginalFilename", "libwebpdecoder.dll"
             VALUE "ProductName", "WebP Image Decoder"
-            VALUE "ProductVersion", "1.0.0"
+            VALUE "ProductVersion", "1.3.1"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/third_party/libwebp/src/mux/Makefile.am b/third_party/libwebp/src/mux/Makefile.am
index 447bcce..71ec3aa 100644
--- a/third_party/libwebp/src/mux/Makefile.am
+++ b/third_party/libwebp/src/mux/Makefile.am
@@ -17,6 +17,6 @@
 noinst_HEADERS += ../webp/format_constants.h
 
 libwebpmux_la_LIBADD = ../libwebp.la
-libwebpmux_la_LDFLAGS = -no-undefined -version-info 3:2:0 -lm
+libwebpmux_la_LDFLAGS = -no-undefined -version-info 3:12:0 -lm
 libwebpmuxincludedir = $(includedir)/webp
 pkgconfig_DATA = libwebpmux.pc
diff --git a/third_party/libwebp/src/mux/anim_encode.c b/third_party/libwebp/src/mux/anim_encode.c
index 7be9906..7078d9a 100644
--- a/third_party/libwebp/src/mux/anim_encode.c
+++ b/third_party/libwebp/src/mux/anim_encode.c
@@ -248,9 +248,6 @@
 
   enc = (WebPAnimEncoder*)WebPSafeCalloc(1, sizeof(*enc));
   if (enc == NULL) return NULL;
-  // sanity inits, so we can call WebPAnimEncoderDelete():
-  enc->encoded_frames_ = NULL;
-  enc->mux_ = NULL;
   MarkNoError(enc);
 
   // Dimensions and options.
@@ -421,7 +418,7 @@
   const int max_allowed_diff_lossy = QualityToMaxDiff(quality);
   const int max_allowed_diff = is_lossless ? 0 : max_allowed_diff_lossy;
 
-  // Sanity checks.
+  // Assumption/correctness checks.
   assert(src->width == dst->width && src->height == dst->height);
   assert(rect->x_offset_ + rect->width_ <= dst->width);
   assert(rect->y_offset_ + rect->height_ <= dst->height);
@@ -949,7 +946,8 @@
   int new_duration;
 
   assert(enc->count_ >= 1);
-  assert(prev_enc_frame->sub_frame_.duration ==
+  assert(!prev_enc_frame->is_key_frame_ ||
+         prev_enc_frame->sub_frame_.duration ==
          prev_enc_frame->key_frame_.duration);
   assert(prev_enc_frame->sub_frame_.duration ==
          (prev_enc_frame->sub_frame_.duration & (MAX_DURATION - 1)));
@@ -966,7 +964,7 @@
       0x10, 0x88, 0x88, 0x08
     };
     const WebPData lossless_1x1 = {
-        lossless_1x1_bytes, sizeof(lossless_1x1_bytes)
+      lossless_1x1_bytes, sizeof(lossless_1x1_bytes)
     };
     const uint8_t lossy_1x1_bytes[] = {
       0x52, 0x49, 0x46, 0x46, 0x40, 0x00, 0x00, 0x00, 0x57, 0x45, 0x42, 0x50,
@@ -1358,6 +1356,12 @@
     if (!IncreasePreviousDuration(enc, (int)prev_frame_duration)) {
       return 0;
     }
+    // IncreasePreviousDuration() may add a frame to avoid exceeding
+    // MAX_DURATION which could cause CacheFrame() to over read encoded_frames_
+    // before the next flush.
+    if (enc->count_ == enc->size_ && !FlushFrames(enc)) {
+      return 0;
+    }
   } else {
     enc->first_timestamp_ = timestamp;
   }
diff --git a/third_party/libwebp/src/mux/animi.h b/third_party/libwebp/src/mux/animi.h
index 8889953..34c45ba 100644
--- a/third_party/libwebp/src/mux/animi.h
+++ b/third_party/libwebp/src/mux/animi.h
@@ -40,4 +40,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_MUX_ANIMI_H_ */
+#endif  // WEBP_MUX_ANIMI_H_
diff --git a/third_party/libwebp/src/mux/libwebpmux.pc.in b/third_party/libwebp/src/mux/libwebpmux.pc.in
index a96fac7..c770daa 100644
--- a/third_party/libwebp/src/mux/libwebpmux.pc.in
+++ b/third_party/libwebp/src/mux/libwebpmux.pc.in
@@ -6,7 +6,7 @@
 Name: libwebpmux
 Description: Library for manipulating the WebP graphics format container
 Version: @PACKAGE_VERSION@
-Requires: libwebp >= 0.2.0
+Requires.private: libwebp >= 0.2.0
 Cflags: -I${includedir}
-Libs: -L${libdir} -lwebpmux
+Libs: -L${libdir} -l@webp_libname_prefix@webpmux
 Libs.private: -lm
diff --git a/third_party/libwebp/src/mux/libwebpmux.rc b/third_party/libwebp/src/mux/libwebpmux.rc
index 8c7d5f6..75afcaa 100644
--- a/third_party/libwebp/src/mux/libwebpmux.rc
+++ b/third_party/libwebp/src/mux/libwebpmux.rc
@@ -6,8 +6,8 @@
 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,0
- PRODUCTVERSION 1,0,0,0
+ FILEVERSION 1,0,3,1
+ PRODUCTVERSION 1,0,3,1
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -24,12 +24,12 @@
         BEGIN
             VALUE "CompanyName", "Google, Inc."
             VALUE "FileDescription", "libwebpmux DLL"
-            VALUE "FileVersion", "1.0.0"
+            VALUE "FileVersion", "1.3.1"
             VALUE "InternalName", "libwebpmux.dll"
-            VALUE "LegalCopyright", "Copyright (C) 2018"
+            VALUE "LegalCopyright", "Copyright (C) 2023"
             VALUE "OriginalFilename", "libwebpmux.dll"
             VALUE "ProductName", "WebP Image Muxer"
-            VALUE "ProductVersion", "1.0.0"
+            VALUE "ProductVersion", "1.3.1"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/third_party/libwebp/src/mux/muxedit.c b/third_party/libwebp/src/mux/muxedit.c
index 7a027b3..63e71a0 100644
--- a/third_party/libwebp/src/mux/muxedit.c
+++ b/third_party/libwebp/src/mux/muxedit.c
@@ -69,12 +69,13 @@
   if (idx == (INDEX)) {                                                        \
     err = ChunkAssignData(&chunk, data, copy_data, tag);                       \
     if (err == WEBP_MUX_OK) {                                                  \
-      err = ChunkSetNth(&chunk, (LIST), nth);                                  \
+      err = ChunkSetHead(&chunk, (LIST));                                      \
+      if (err != WEBP_MUX_OK) ChunkRelease(&chunk);                            \
     }                                                                          \
     return err;                                                                \
   }
 
-static WebPMuxError MuxSet(WebPMux* const mux, uint32_t tag, uint32_t nth,
+static WebPMuxError MuxSet(WebPMux* const mux, uint32_t tag,
                            const WebPData* const data, int copy_data) {
   WebPChunk chunk;
   WebPMuxError err = WEBP_MUX_NOT_FOUND;
@@ -190,7 +191,7 @@
   if (err != WEBP_MUX_OK && err != WEBP_MUX_NOT_FOUND) return err;
 
   // Add the given chunk.
-  return MuxSet(mux, tag, 1, chunk_data, copy_data);
+  return MuxSet(mux, tag, chunk_data, copy_data);
 }
 
 // Creates a chunk from given 'data' and sets it as 1st chunk in 'chunk_list'.
@@ -202,7 +203,7 @@
   ChunkInit(&chunk);
   err = ChunkAssignData(&chunk, data, copy_data, tag);
   if (err != WEBP_MUX_OK) goto Err;
-  err = ChunkSetNth(&chunk, chunk_list, 1);
+  err = ChunkSetHead(&chunk, chunk_list);
   if (err != WEBP_MUX_OK) goto Err;
   return WEBP_MUX_OK;
  Err:
@@ -235,7 +236,6 @@
   WebPMuxImage wpi;
   WebPMuxError err;
 
-  // Sanity checks.
   if (mux == NULL || bitstream == NULL || bitstream->bytes == NULL ||
       bitstream->size > MAX_CHUNK_PAYLOAD) {
     return WEBP_MUX_INVALID_ARGUMENT;
@@ -266,14 +266,13 @@
                               int copy_data) {
   WebPMuxImage wpi;
   WebPMuxError err;
-  const WebPData* const bitstream = &info->bitstream;
 
-  // Sanity checks.
   if (mux == NULL || info == NULL) return WEBP_MUX_INVALID_ARGUMENT;
 
   if (info->id != WEBP_CHUNK_ANMF) return WEBP_MUX_INVALID_ARGUMENT;
 
-  if (bitstream->bytes == NULL || bitstream->size > MAX_CHUNK_PAYLOAD) {
+  if (info->bitstream.bytes == NULL ||
+      info->bitstream.size > MAX_CHUNK_PAYLOAD) {
     return WEBP_MUX_INVALID_ARGUMENT;
   }
 
@@ -287,7 +286,7 @@
   }
 
   MuxImageInit(&wpi);
-  err = SetAlphaAndImageChunks(bitstream, copy_data, &wpi);
+  err = SetAlphaAndImageChunks(&info->bitstream, copy_data, &wpi);
   if (err != WEBP_MUX_OK) goto Err;
   assert(wpi.img_ != NULL);  // As SetAlphaAndImageChunks() was successful.
 
@@ -342,7 +341,7 @@
   // Set the animation parameters.
   PutLE32(data, params->bgcolor);
   PutLE16(data + 4, params->loop_count);
-  return MuxSet(mux, kChunks[IDX_ANIM].tag, 1, &anim, 1);
+  return MuxSet(mux, kChunks[IDX_ANIM].tag, &anim, 1);
 }
 
 WebPMuxError WebPMuxSetCanvasSize(WebPMux* mux,
@@ -540,7 +539,7 @@
   PutLE24(data + 4, width - 1);   // canvas width.
   PutLE24(data + 7, height - 1);  // canvas height.
 
-  return MuxSet(mux, kChunks[IDX_VP8X].tag, 1, &vp8x, 1);
+  return MuxSet(mux, kChunks[IDX_VP8X].tag, &vp8x, 1);
 }
 
 // Cleans up 'mux' by removing any unnecessary chunks.
diff --git a/third_party/libwebp/src/mux/muxi.h b/third_party/libwebp/src/mux/muxi.h
index f1e1e97..fc44d6f 100644
--- a/third_party/libwebp/src/mux/muxi.h
+++ b/third_party/libwebp/src/mux/muxi.h
@@ -14,6 +14,7 @@
 #ifndef WEBP_MUX_MUXI_H_
 #define WEBP_MUX_MUXI_H_
 
+#include <assert.h>
 #include <stdlib.h>
 #include "src/dec/vp8i_dec.h"
 #include "src/dec/vp8li_dec.h"
@@ -27,8 +28,8 @@
 // Defines and constants.
 
 #define MUX_MAJ_VERSION 1
-#define MUX_MIN_VERSION 0
-#define MUX_REV_VERSION 0
+#define MUX_MIN_VERSION 3
+#define MUX_REV_VERSION 1
 
 // Chunk object.
 typedef struct WebPChunk WebPChunk;
@@ -126,11 +127,14 @@
 WebPMuxError ChunkAssignData(WebPChunk* chunk, const WebPData* const data,
                              int copy_data, uint32_t tag);
 
-// Sets 'chunk' at nth position in the 'chunk_list'.
-// nth = 0 has the special meaning "last of the list".
+// Sets 'chunk' as the only element in 'chunk_list' if it is empty.
 // On success ownership is transferred from 'chunk' to the 'chunk_list'.
-WebPMuxError ChunkSetNth(WebPChunk* chunk, WebPChunk** chunk_list,
-                         uint32_t nth);
+WebPMuxError ChunkSetHead(WebPChunk* const chunk, WebPChunk** const chunk_list);
+// Sets 'chunk' at last position in the 'chunk_list'.
+// On success ownership is transferred from 'chunk' to the 'chunk_list'.
+// *chunk_list also points towards the last valid element of the initial
+// *chunk_list.
+WebPMuxError ChunkAppend(WebPChunk* const chunk, WebPChunk*** const chunk_list);
 
 // Releases chunk and returns chunk->next_.
 WebPChunk* ChunkRelease(WebPChunk* const chunk);
@@ -143,13 +147,13 @@
 
 // Returns size of the chunk including chunk header and padding byte (if any).
 static WEBP_INLINE size_t SizeWithPadding(size_t chunk_size) {
+  assert(chunk_size <= MAX_CHUNK_PAYLOAD);
   return CHUNK_HEADER_SIZE + ((chunk_size + 1) & ~1U);
 }
 
 // Size of a chunk including header and padding.
 static WEBP_INLINE size_t ChunkDiskSize(const WebPChunk* chunk) {
   const size_t data_size = chunk->data_.size;
-  SB_DCHECK(data_size < MAX_CHUNK_PAYLOAD);
   return SizeWithPadding(data_size);
 }
 
@@ -227,4 +231,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_MUX_MUXI_H_ */
+#endif  // WEBP_MUX_MUXI_H_
diff --git a/third_party/libwebp/src/mux/muxinternal.c b/third_party/libwebp/src/mux/muxinternal.c
index 941222c..9fc41e0 100644
--- a/third_party/libwebp/src/mux/muxinternal.c
+++ b/third_party/libwebp/src/mux/muxinternal.c
@@ -116,27 +116,6 @@
   return ((nth > 0) && (iter > 0)) ? NULL : first;
 }
 
-// Outputs a pointer to 'prev_chunk->next_',
-//   where 'prev_chunk' is the pointer to the chunk at position (nth - 1).
-// Returns true if nth chunk was found.
-static int ChunkSearchListToSet(WebPChunk** chunk_list, uint32_t nth,
-                                WebPChunk*** const location) {
-  uint32_t count = 0;
-  assert(chunk_list != NULL);
-  *location = chunk_list;
-
-  while (*chunk_list != NULL) {
-    WebPChunk* const cur_chunk = *chunk_list;
-    ++count;
-    if (count == nth) return 1;  // Found.
-    chunk_list = &cur_chunk->next_;
-    *location = chunk_list;
-  }
-
-  // *chunk_list is ok to be NULL if adding at last location.
-  return (nth == 0 || (count == nth - 1)) ? 1 : 0;
-}
-
 //------------------------------------------------------------------------------
 // Chunk writer methods.
 
@@ -161,11 +140,12 @@
   return WEBP_MUX_OK;
 }
 
-WebPMuxError ChunkSetNth(WebPChunk* chunk, WebPChunk** chunk_list,
-                         uint32_t nth) {
+WebPMuxError ChunkSetHead(WebPChunk* const chunk,
+                          WebPChunk** const chunk_list) {
   WebPChunk* new_chunk;
 
-  if (!ChunkSearchListToSet(chunk_list, nth, &chunk_list)) {
+  assert(chunk_list != NULL);
+  if (*chunk_list != NULL) {
     return WEBP_MUX_NOT_FOUND;
   }
 
@@ -173,11 +153,27 @@
   if (new_chunk == NULL) return WEBP_MUX_MEMORY_ERROR;
   *new_chunk = *chunk;
   chunk->owner_ = 0;
-  new_chunk->next_ = *chunk_list;
+  new_chunk->next_ = NULL;
   *chunk_list = new_chunk;
   return WEBP_MUX_OK;
 }
 
+WebPMuxError ChunkAppend(WebPChunk* const chunk,
+                         WebPChunk*** const chunk_list) {
+  WebPMuxError err;
+  assert(chunk_list != NULL && *chunk_list != NULL);
+
+  if (**chunk_list == NULL) {
+    err = ChunkSetHead(chunk, *chunk_list);
+  } else {
+    WebPChunk* last_chunk = **chunk_list;
+    while (last_chunk->next_ != NULL) last_chunk = last_chunk->next_;
+    err = ChunkSetHead(chunk, &last_chunk->next_);
+    if (err == WEBP_MUX_OK) *chunk_list = &last_chunk->next_;
+  }
+  return err;
+}
+
 //------------------------------------------------------------------------------
 // Chunk deletion method(s).
 
@@ -237,9 +233,11 @@
 WebPMuxImage* MuxImageRelease(WebPMuxImage* const wpi) {
   WebPMuxImage* next;
   if (wpi == NULL) return NULL;
-  ChunkDelete(wpi->header_);
-  ChunkDelete(wpi->alpha_);
-  ChunkDelete(wpi->img_);
+  // There should be at most one chunk of header_, alpha_, img_ but we call
+  // ChunkListDelete to be safe
+  ChunkListDelete(&wpi->header_);
+  ChunkListDelete(&wpi->alpha_);
+  ChunkListDelete(&wpi->img_);
   ChunkListDelete(&wpi->unknown_);
 
   next = wpi->next_;
diff --git a/third_party/libwebp/src/mux/muxread.c b/third_party/libwebp/src/mux/muxread.c
index 0b55286..9862ec6 100644
--- a/third_party/libwebp/src/mux/muxread.c
+++ b/third_party/libwebp/src/mux/muxread.c
@@ -56,9 +56,10 @@
   uint32_t chunk_size;
   WebPData chunk_data;
 
-  // Sanity checks.
+  // Correctness checks.
   if (data_size < CHUNK_HEADER_SIZE) return WEBP_MUX_NOT_ENOUGH_DATA;
   chunk_size = GetLE32(data + TAG_SIZE);
+  if (chunk_size > MAX_CHUNK_PAYLOAD) return WEBP_MUX_BAD_DATA;
 
   {
     const size_t chunk_disk_size = SizeWithPadding(chunk_size);
@@ -99,9 +100,10 @@
                          WebPMuxImage* const wpi) {
   const uint8_t* bytes = chunk->data_.bytes;
   size_t size = chunk->data_.size;
-  const uint8_t* const last = bytes + size;
+  const uint8_t* const last = (bytes == NULL) ? NULL : bytes + size;
   WebPChunk subchunk;
   size_t subchunk_size;
+  WebPChunk** unknown_chunk_list = &wpi->unknown_;
   ChunkInit(&subchunk);
 
   assert(chunk->tag_ == kChunks[IDX_ANMF].tag);
@@ -114,9 +116,12 @@
     // Each of ANMF chunk contain a header at the beginning. So, its size should
     // be at least 'hdr_size'.
     if (size < hdr_size) goto Fail;
-    ChunkAssignData(&subchunk, &temp, copy_data, chunk->tag_);
+    if (ChunkAssignData(&subchunk, &temp, copy_data,
+                        chunk->tag_) != WEBP_MUX_OK) {
+      goto Fail;
+    }
   }
-  ChunkSetNth(&subchunk, &wpi->header_, 1);
+  if (ChunkSetHead(&subchunk, &wpi->header_) != WEBP_MUX_OK) goto Fail;
   wpi->is_partial_ = 1;  // Waiting for ALPH and/or VP8/VP8L chunks.
 
   // Rest of the chunks.
@@ -133,22 +138,26 @@
     switch (ChunkGetIdFromTag(subchunk.tag_)) {
       case WEBP_CHUNK_ALPHA:
         if (wpi->alpha_ != NULL) goto Fail;  // Consecutive ALPH chunks.
-        if (ChunkSetNth(&subchunk, &wpi->alpha_, 1) != WEBP_MUX_OK) goto Fail;
+        if (ChunkSetHead(&subchunk, &wpi->alpha_) != WEBP_MUX_OK) goto Fail;
         wpi->is_partial_ = 1;  // Waiting for a VP8 chunk.
         break;
       case WEBP_CHUNK_IMAGE:
-        if (ChunkSetNth(&subchunk, &wpi->img_, 1) != WEBP_MUX_OK) goto Fail;
+        if (wpi->img_ != NULL) goto Fail;  // Only 1 image chunk allowed.
+        if (ChunkSetHead(&subchunk, &wpi->img_) != WEBP_MUX_OK) goto Fail;
         if (!MuxImageFinalize(wpi)) goto Fail;
         wpi->is_partial_ = 0;  // wpi is completely filled.
         break;
       case WEBP_CHUNK_UNKNOWN:
-        if (wpi->is_partial_) goto Fail;  // Encountered an unknown chunk
-                                          // before some image chunks.
-        if (ChunkSetNth(&subchunk, &wpi->unknown_, 0) != WEBP_MUX_OK) goto Fail;
+        if (wpi->is_partial_) {
+          goto Fail;  // Encountered an unknown chunk
+                      // before some image chunks.
+        }
+        if (ChunkAppend(&subchunk, &unknown_chunk_list) != WEBP_MUX_OK) {
+          goto Fail;
+        }
         break;
       default:
         goto Fail;
-        break;
     }
     subchunk_size = ChunkDiskSize(&subchunk);
     bytes += subchunk_size;
@@ -175,9 +184,11 @@
   const uint8_t* data;
   size_t size;
   WebPChunk chunk;
+  // Stores the end of the chunk lists so that it is faster to append data to
+  // their ends.
+  WebPChunk** chunk_list_ends[WEBP_CHUNK_NIL + 1] = { NULL };
   ChunkInit(&chunk);
 
-  // Sanity checks.
   if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_MUX_ABI_VERSION)) {
     return NULL;  // version mismatch
   }
@@ -187,7 +198,7 @@
   size = bitstream->size;
 
   if (data == NULL) return NULL;
-  if (size < RIFF_HEADER_SIZE) return NULL;
+  if (size < RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE) return NULL;
   if (GetLE32(data + 0) != MKFOURCC('R', 'I', 'F', 'F') ||
       GetLE32(data + CHUNK_HEADER_SIZE) != MKFOURCC('W', 'E', 'B', 'P')) {
     return NULL;
@@ -196,8 +207,6 @@
   mux = WebPMuxNew();
   if (mux == NULL) return NULL;
 
-  if (size < RIFF_HEADER_SIZE + TAG_SIZE) goto Err;
-
   tag = GetLE32(data + RIFF_HEADER_SIZE);
   if (tag != kChunks[IDX_VP8].tag &&
       tag != kChunks[IDX_VP8L].tag &&
@@ -205,13 +214,17 @@
     goto Err;  // First chunk should be VP8, VP8L or VP8X.
   }
 
-  riff_size = SizeWithPadding(GetLE32(data + TAG_SIZE));
-  if (riff_size > MAX_CHUNK_PAYLOAD || riff_size > size) {
-    goto Err;
-  } else {
-    if (riff_size < size) {  // Redundant data after last chunk.
-      size = riff_size;  // To make sure we don't read any data beyond mux_size.
-    }
+  riff_size = GetLE32(data + TAG_SIZE);
+  if (riff_size > MAX_CHUNK_PAYLOAD) goto Err;
+
+  // Note this padding is historical and differs from demux.c which does not
+  // pad the file size.
+  riff_size = SizeWithPadding(riff_size);
+  if (riff_size < CHUNK_HEADER_SIZE) goto Err;
+  if (riff_size > size) goto Err;
+  // There's no point in reading past the end of the RIFF chunk.
+  if (size > riff_size + CHUNK_HEADER_SIZE) {
+    size = riff_size + CHUNK_HEADER_SIZE;
   }
 
   end = data + size;
@@ -226,7 +239,6 @@
   while (data != end) {
     size_t data_size;
     WebPChunkId id;
-    WebPChunk** chunk_list;
     if (ChunkVerifyAndAssign(&chunk, data, size, riff_size,
                              copy_data) != WEBP_MUX_OK) {
       goto Err;
@@ -236,11 +248,11 @@
     switch (id) {
       case WEBP_CHUNK_ALPHA:
         if (wpi->alpha_ != NULL) goto Err;  // Consecutive ALPH chunks.
-        if (ChunkSetNth(&chunk, &wpi->alpha_, 1) != WEBP_MUX_OK) goto Err;
+        if (ChunkSetHead(&chunk, &wpi->alpha_) != WEBP_MUX_OK) goto Err;
         wpi->is_partial_ = 1;  // Waiting for a VP8 chunk.
         break;
       case WEBP_CHUNK_IMAGE:
-        if (ChunkSetNth(&chunk, &wpi->img_, 1) != WEBP_MUX_OK) goto Err;
+        if (ChunkSetHead(&chunk, &wpi->img_) != WEBP_MUX_OK) goto Err;
         if (!MuxImageFinalize(wpi)) goto Err;
         wpi->is_partial_ = 0;  // wpi is completely filled.
  PushImage:
@@ -253,13 +265,16 @@
         if (!MuxImageParse(&chunk, copy_data, wpi)) goto Err;
         ChunkRelease(&chunk);
         goto PushImage;
-        break;
       default:  // A non-image chunk.
         if (wpi->is_partial_) goto Err;  // Encountered a non-image chunk before
                                          // getting all chunks of an image.
-        chunk_list = MuxGetChunkListFromId(mux, id);  // List to add this chunk.
-        if (ChunkSetNth(&chunk, chunk_list, 0) != WEBP_MUX_OK) goto Err;
+        if (chunk_list_ends[id] == NULL) {
+          chunk_list_ends[id] =
+              MuxGetChunkListFromId(mux, id);  // List to add this chunk.
+        }
+        if (ChunkAppend(&chunk, &chunk_list_ends[id]) != WEBP_MUX_OK) goto Err;
         if (id == WEBP_CHUNK_VP8X) {  // grab global specs
+          if (data_size < CHUNK_HEADER_SIZE + VP8X_CHUNK_SIZE) goto Err;
           mux->canvas_width_ = GetLE24(data + 12) + 1;
           mux->canvas_height_ = GetLE24(data + 15) + 1;
         }
@@ -385,6 +400,10 @@
   uint8_t* const data = (uint8_t*)WebPSafeMalloc(1ULL, size);
   if (data == NULL) return WEBP_MUX_MEMORY_ERROR;
 
+  // There should be at most one alpha_ chunk and exactly one img_ chunk.
+  assert(wpi->alpha_ == NULL || wpi->alpha_->next_ == NULL);
+  assert(wpi->img_ != NULL && wpi->img_->next_ == NULL);
+
   // Main RIFF header.
   dst = MuxEmitRiffHeader(data, size);
 
@@ -464,7 +483,6 @@
   WebPMuxError err;
   WebPMuxImage* wpi;
 
-  // Sanity checks.
   if (mux == NULL || frame == NULL) {
     return WEBP_MUX_INVALID_ARGUMENT;
   }
diff --git a/third_party/libwebp/src/utils/Makefile.am b/third_party/libwebp/src/utils/Makefile.am
index fbb0fe7..a4bff8b 100644
--- a/third_party/libwebp/src/utils/Makefile.am
+++ b/third_party/libwebp/src/utils/Makefile.am
@@ -9,6 +9,7 @@
 commondir = $(includedir)/webp
 
 noinst_HEADERS =
+noinst_HEADERS += ../dsp/cpu.h
 noinst_HEADERS += ../dsp/dsp.h
 noinst_HEADERS += ../webp/decode.h
 noinst_HEADERS += ../webp/encode.h
diff --git a/third_party/libwebp/src/utils/bit_reader_inl_utils.h b/third_party/libwebp/src/utils/bit_reader_inl_utils.h
index bf11a07..ecb6039 100644
--- a/third_party/libwebp/src/utils/bit_reader_inl_utils.h
+++ b/third_party/libwebp/src/utils/bit_reader_inl_utils.h
@@ -57,7 +57,7 @@
 
 // makes sure br->value_ has at least BITS bits worth of data
 static WEBP_UBSAN_IGNORE_UNDEF WEBP_INLINE
-void VP8LoadNewBytes(VP8BitReader* const br) {
+void VP8LoadNewBytes(VP8BitReader* WEBP_RESTRICT const br) {
   SB_DCHECK(br != NULL && br->buf_ != NULL);
   // Read 'BITS' bits at a time if possible.
   if (br->buf_ < br->buf_max_) {
@@ -106,7 +106,8 @@
 }
 
 // Read a bit with proba 'prob'. Speed-critical function!
-static WEBP_INLINE int VP8GetBit(VP8BitReader* const br, int prob) {
+static WEBP_INLINE int VP8GetBit(VP8BitReader* WEBP_RESTRICT const br,
+                                 int prob, const char label[]) {
   // Don't move this declaration! It makes a big speed difference to store
   // 'range' *before* calling VP8LoadNewBytes(), even if this function doesn't
   // alter br->range_ value.
@@ -131,13 +132,15 @@
       br->bits_ -= shift;
     }
     br->range_ = range - 1;
+    BT_TRACK(br);
     return bit;
   }
 }
 
 // simplified version of VP8GetBit() for prob=0x80 (note shift is always 1 here)
 static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE
-int VP8GetSigned(VP8BitReader* const br, int v) {
+int VP8GetSigned(VP8BitReader* WEBP_RESTRICT const br, int v,
+                 const char label[]) {
   if (br->bits_ < 0) {
     VP8LoadNewBytes(br);
   }
@@ -147,14 +150,16 @@
     const range_t value = (range_t)(br->value_ >> pos);
     const int32_t mask = (int32_t)(split - value) >> 31;  // -1 or 0
     br->bits_ -= 1;
-    br->range_ += mask;
+    br->range_ += (range_t)mask;
     br->range_ |= 1;
-    br->value_ -= (bit_t)((split + 1) & mask) << pos;
+    br->value_ -= (bit_t)((split + 1) & (uint32_t)mask) << pos;
+    BT_TRACK(br);
     return (v ^ mask) - mask;
   }
 }
 
-static WEBP_INLINE int VP8GetBitAlt(VP8BitReader* const br, int prob) {
+static WEBP_INLINE int VP8GetBitAlt(VP8BitReader* WEBP_RESTRICT const br,
+                                    int prob, const char label[]) {
   // Don't move this declaration! It makes a big speed difference to store
   // 'range' *before* calling VP8LoadNewBytes(), even if this function doesn't
   // alter br->range_ value.
@@ -181,6 +186,7 @@
       br->bits_ -= shift;
     }
     br->range_ = range;
+    BT_TRACK(br);
     return bit;
   }
 }
@@ -189,4 +195,4 @@
 }    // extern "C"
 #endif
 
-#endif   // WEBP_UTILS_BIT_READER_INL_UTILS_H_
+#endif  // WEBP_UTILS_BIT_READER_INL_UTILS_H_
diff --git a/third_party/libwebp/src/utils/bit_reader_utils.c b/third_party/libwebp/src/utils/bit_reader_utils.c
index 17bbe8e..88fcbb3 100644
--- a/third_party/libwebp/src/utils/bit_reader_utils.c
+++ b/third_party/libwebp/src/utils/bit_reader_utils.c
@@ -19,6 +19,7 @@
 #include "starboard/client_porting/poem/assert_poem.h"
 #endif
 
+#include "src/dsp/cpu.h"
 #include "src/utils/bit_reader_inl_utils.h"
 #include "src/utils/utils.h"
 
@@ -106,17 +107,18 @@
 //------------------------------------------------------------------------------
 // Higher-level calls
 
-uint32_t VP8GetValue(VP8BitReader* const br, int bits) {
+uint32_t VP8GetValue(VP8BitReader* const br, int bits, const char label[]) {
   uint32_t v = 0;
   while (bits-- > 0) {
-    v |= VP8GetBit(br, 0x80) << bits;
+    v |= VP8GetBit(br, 0x80, label) << bits;
   }
   return v;
 }
 
-int32_t VP8GetSignedValue(VP8BitReader* const br, int bits) {
-  const int value = VP8GetValue(br, bits);
-  return VP8Get(br) ? -value : value;
+int32_t VP8GetSignedValue(VP8BitReader* const br, int bits,
+                          const char label[]) {
+  const int value = VP8GetValue(br, bits, label);
+  return VP8Get(br, label) ? -value : value;
 }
 
 //------------------------------------------------------------------------------
@@ -124,7 +126,7 @@
 
 #define VP8L_LOG8_WBITS 4  // Number of bytes needed to store VP8L_WBITS bits.
 
-#if defined(__arm__) || defined(_M_ARM) || defined(__aarch64__) || \
+#if defined(__arm__) || defined(_M_ARM) || WEBP_AARCH64 || \
     defined(__i386__) || defined(_M_IX86) || \
     defined(__x86_64__) || defined(_M_X64)
 #define VP8L_USE_FAST_LOAD
@@ -224,3 +226,78 @@
 }
 
 //------------------------------------------------------------------------------
+// Bit-tracing tool
+
+#if (BITTRACE > 0)
+
+#include <stdlib.h>   // for atexit()
+#include <stdio.h>
+#include <string.h>
+
+#define MAX_NUM_LABELS 32
+static struct {
+  const char* label;
+  int size;
+  int count;
+} kLabels[MAX_NUM_LABELS];
+
+static int last_label = 0;
+static int last_pos = 0;
+static const uint8_t* buf_start = NULL;
+static int init_done = 0;
+
+static void PrintBitTraces(void) {
+  int i;
+  int scale = 1;
+  int total = 0;
+  const char* units = "bits";
+#if (BITTRACE == 2)
+  scale = 8;
+  units = "bytes";
+#endif
+  for (i = 0; i < last_label; ++i) total += kLabels[i].size;
+  if (total < 1) total = 1;   // avoid rounding errors
+  printf("=== Bit traces ===\n");
+  for (i = 0; i < last_label; ++i) {
+    const int skip = 16 - (int)strlen(kLabels[i].label);
+    const int value = (kLabels[i].size + scale - 1) / scale;
+    assert(skip > 0);
+    printf("%s \%*s: %6d %s   \t[%5.2f%%] [count: %7d]\n",
+           kLabels[i].label, skip, "", value, units,
+           100.f * kLabels[i].size / total,
+           kLabels[i].count);
+  }
+  total = (total + scale - 1) / scale;
+  printf("Total: %d %s\n", total, units);
+}
+
+void BitTrace(const struct VP8BitReader* const br, const char label[]) {
+  int i, pos;
+  if (!init_done) {
+    memset(kLabels, 0, sizeof(kLabels));
+    atexit(PrintBitTraces);
+    buf_start = br->buf_;
+    init_done = 1;
+  }
+  pos = (int)(br->buf_ - buf_start) * 8 - br->bits_;
+  // if there's a too large jump, we've changed partition -> reset counter
+  if (abs(pos - last_pos) > 32) {
+    buf_start = br->buf_;
+    pos = 0;
+    last_pos = 0;
+  }
+  if (br->range_ >= 0x7f) pos += kVP8Log2Range[br->range_ - 0x7f];
+  for (i = 0; i < last_label; ++i) {
+    if (!strcmp(label, kLabels[i].label)) break;
+  }
+  if (i == MAX_NUM_LABELS) abort();   // overflow!
+  kLabels[i].label = label;
+  kLabels[i].size += pos - last_pos;
+  kLabels[i].count += 1;
+  if (i == last_label) ++last_label;
+  last_pos = pos;
+}
+
+#endif  // BITTRACE > 0
+
+//------------------------------------------------------------------------------
diff --git a/third_party/libwebp/src/utils/bit_reader_utils.h b/third_party/libwebp/src/utils/bit_reader_utils.h
index 45878cf..1dd80b8 100644
--- a/third_party/libwebp/src/utils/bit_reader_utils.h
+++ b/third_party/libwebp/src/utils/bit_reader_utils.h
@@ -24,8 +24,30 @@
 #endif
 #endif
 
+#include "src/dsp/cpu.h"
 #include "src/webp/types.h"
 
+// Warning! This macro triggers quite some MACRO wizardry around func signature!
+#if !defined(BITTRACE)
+#define BITTRACE 0    // 0 = off, 1 = print bits, 2 = print bytes
+#endif
+
+#if (BITTRACE > 0)
+struct VP8BitReader;
+extern void BitTrace(const struct VP8BitReader* const br, const char label[]);
+#define BT_TRACK(br) BitTrace(br, label)
+#define VP8Get(BR, L) VP8GetValue(BR, 1, L)
+#else
+#define BT_TRACK(br)
+// We'll REMOVE the 'const char label[]' from all signatures and calls (!!):
+#define VP8GetValue(BR, N, L) VP8GetValue(BR, N)
+#define VP8Get(BR, L) VP8GetValue(BR, 1, L)
+#define VP8GetSignedValue(BR, N, L) VP8GetSignedValue(BR, N)
+#define VP8GetBit(BR, P, L) VP8GetBit(BR, P)
+#define VP8GetBitAlt(BR, P, L) VP8GetBitAlt(BR, P)
+#define VP8GetSigned(BR, V, L) VP8GetSigned(BR, V)
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -48,7 +70,7 @@
 #define BITS 56
 #elif defined(__arm__) || defined(_M_ARM)      // ARM
 #define BITS 24
-#elif defined(__aarch64__)                     // ARM 64bit
+#elif WEBP_AARCH64                             // ARM 64bit
 #define BITS 56
 #elif defined(__mips__)                        // MIPS
 #define BITS 24
@@ -97,17 +119,15 @@
 void VP8RemapBitReader(VP8BitReader* const br, ptrdiff_t offset);
 
 // return the next value made of 'num_bits' bits
-uint32_t VP8GetValue(VP8BitReader* const br, int num_bits);
-static WEBP_INLINE uint32_t VP8Get(VP8BitReader* const br) {
-  return VP8GetValue(br, 1);
-}
+uint32_t VP8GetValue(VP8BitReader* const br, int num_bits, const char label[]);
 
 // return the next value with sign-extension.
-int32_t VP8GetSignedValue(VP8BitReader* const br, int num_bits);
+int32_t VP8GetSignedValue(VP8BitReader* const br, int num_bits,
+                          const char label[]);
 
 // bit_reader_inl.h will implement the following methods:
-//   static WEBP_INLINE int VP8GetBit(VP8BitReader* const br, int prob)
-//   static WEBP_INLINE int VP8GetSigned(VP8BitReader* const br, int v)
+//   static WEBP_INLINE int VP8GetBit(VP8BitReader* const br, int prob, ...)
+//   static WEBP_INLINE int VP8GetSigned(VP8BitReader* const br, int v, ...)
 // and should be included by the .c files that actually need them.
 // This is to avoid recompiling the whole library whenever this file is touched,
 // and also allowing platform-specific ad-hoc hacks.
@@ -177,4 +197,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_UTILS_BIT_READER_UTILS_H_ */
+#endif  // WEBP_UTILS_BIT_READER_UTILS_H_
diff --git a/third_party/libwebp/src/utils/bit_writer_utils.c b/third_party/libwebp/src/utils/bit_writer_utils.c
index 6aaf5f3..8c6d0cf 100644
--- a/third_party/libwebp/src/utils/bit_writer_utils.c
+++ b/third_party/libwebp/src/utils/bit_writer_utils.c
@@ -76,7 +76,7 @@
       const int value = (bits & 0x100) ? 0x00 : 0xff;
       for (; bw->run_ > 0; --bw->run_) bw->buf_[pos++] = value;
     }
-    bw->buf_[pos++] = bits;
+    bw->buf_[pos++] = bits & 0xff;
     bw->pos_ = pos;
   } else {
     bw->run_++;   // delay writing of bytes 0xff, pending eventual carry.
@@ -254,6 +254,7 @@
   dst->bits_ = src->bits_;
   dst->used_ = src->used_;
   dst->error_ = src->error_;
+  dst->cur_ = dst->buf_ + current_size;
   return 1;
 }
 
@@ -283,7 +284,7 @@
   // If needed, make some room by flushing some bits out.
   if (bw->cur_ + VP8L_WRITER_BYTES > bw->end_) {
     const uint64_t extra_size = (bw->end_ - bw->buf_) + MIN_EXTRA_SIZE;
-    if (extra_size != (size_t)extra_size ||
+    if (!CheckSizeOverflow(extra_size) ||
         !VP8LBitWriterResize(bw, (size_t)extra_size)) {
       bw->cur_ = bw->buf_;
       bw->error_ = 1;
@@ -319,7 +320,7 @@
     while (used >= VP8L_WRITER_BITS) {
       if (bw->cur_ + VP8L_WRITER_BYTES > bw->end_) {
         const uint64_t extra_size = (bw->end_ - bw->buf_) + MIN_EXTRA_SIZE;
-        if (extra_size != (size_t)extra_size ||
+        if (!CheckSizeOverflow(extra_size) ||
             !VP8LBitWriterResize(bw, (size_t)extra_size)) {
           bw->cur_ = bw->buf_;
           bw->error_ = 1;
diff --git a/third_party/libwebp/src/utils/bit_writer_utils.h b/third_party/libwebp/src/utils/bit_writer_utils.h
index 2cf5976..b9d5102 100644
--- a/third_party/libwebp/src/utils/bit_writer_utils.h
+++ b/third_party/libwebp/src/utils/bit_writer_utils.h
@@ -151,4 +151,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_UTILS_BIT_WRITER_UTILS_H_ */
+#endif  // WEBP_UTILS_BIT_WRITER_UTILS_H_
diff --git a/third_party/libwebp/src/utils/color_cache_utils.c b/third_party/libwebp/src/utils/color_cache_utils.c
index d49ec76..d1e3d13 100644
--- a/third_party/libwebp/src/utils/color_cache_utils.c
+++ b/third_party/libwebp/src/utils/color_cache_utils.c
@@ -27,22 +27,22 @@
 //------------------------------------------------------------------------------
 // VP8LColorCache.
 
-int VP8LColorCacheInit(VP8LColorCache* const cc, int hash_bits) {
+int VP8LColorCacheInit(VP8LColorCache* const color_cache, int hash_bits) {
   const int hash_size = 1 << hash_bits;
-  assert(cc != NULL);
+  assert(color_cache != NULL);
   assert(hash_bits > 0);
-  cc->colors_ = (uint32_t*)WebPSafeCalloc((uint64_t)hash_size,
-                                          sizeof(*cc->colors_));
-  if (cc->colors_ == NULL) return 0;
-  cc->hash_shift_ = 32 - hash_bits;
-  cc->hash_bits_ = hash_bits;
+  color_cache->colors_ = (uint32_t*)WebPSafeCalloc(
+      (uint64_t)hash_size, sizeof(*color_cache->colors_));
+  if (color_cache->colors_ == NULL) return 0;
+  color_cache->hash_shift_ = 32 - hash_bits;
+  color_cache->hash_bits_ = hash_bits;
   return 1;
 }
 
-void VP8LColorCacheClear(VP8LColorCache* const cc) {
-  if (cc != NULL) {
-    WebPSafeFree(cc->colors_);
-    cc->colors_ = NULL;
+void VP8LColorCacheClear(VP8LColorCache* const color_cache) {
+  if (color_cache != NULL) {
+    WebPSafeFree(color_cache->colors_);
+    color_cache->colors_ = NULL;
   }
 }
 
diff --git a/third_party/libwebp/src/utils/color_cache_utils.h b/third_party/libwebp/src/utils/color_cache_utils.h
index 7ba2d52..227d9c4 100644
--- a/third_party/libwebp/src/utils/color_cache_utils.h
+++ b/third_party/libwebp/src/utils/color_cache_utils.h
@@ -21,6 +21,7 @@
 #include <assert.h>
 #endif
 
+#include "src/dsp/dsp.h"
 #include "src/webp/types.h"
 
 #ifdef __cplusplus
@@ -29,15 +30,16 @@
 
 // Main color cache struct.
 typedef struct {
-  uint32_t *colors_;  // color entries
+  uint32_t* colors_;  // color entries
   int hash_shift_;    // Hash shift: 32 - hash_bits_.
   int hash_bits_;
 } VP8LColorCache;
 
-static const uint64_t kHashMul = 0x1e35a7bdull;
+static const uint32_t kHashMul = 0x1e35a7bdu;
 
-static WEBP_INLINE int VP8LHashPix(uint32_t argb, int shift) {
-  return (int)(((argb * kHashMul) & 0xffffffffu) >> shift);
+static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE
+int VP8LHashPix(uint32_t argb, int shift) {
+  return (int)((argb * kHashMul) >> shift);
 }
 
 static WEBP_INLINE uint32_t VP8LColorCacheLookup(
diff --git a/third_party/libwebp/src/utils/endian_inl_utils.h b/third_party/libwebp/src/utils/endian_inl_utils.h
index 8ca9fb7..3630a29 100644
--- a/third_party/libwebp/src/utils/endian_inl_utils.h
+++ b/third_party/libwebp/src/utils/endian_inl_utils.h
@@ -12,10 +12,6 @@
 #ifndef WEBP_UTILS_ENDIAN_INL_UTILS_H_
 #define WEBP_UTILS_ENDIAN_INL_UTILS_H_
 
-#if defined(STARBOARD)
-#include "starboard/byte_swap.h"
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include "src/webp/config.h"
 #endif
@@ -44,9 +40,6 @@
 #endif  // !HAVE_CONFIG_H
 
 static WEBP_INLINE uint16_t BSwap16(uint16_t x) {
-#if defined(STARBOARD)
-  return SbByteSwapU16(x);
-#else
 #if defined(HAVE_BUILTIN_BSWAP16)
   return __builtin_bswap16(x);
 #elif defined(_MSC_VER)
@@ -55,13 +48,9 @@
   // gcc will recognize a 'rorw $8, ...' here:
   return (x >> 8) | ((x & 0xff) << 8);
 #endif  // HAVE_BUILTIN_BSWAP16
-#endif  // defined(STARBOARD)
 }
 
 static WEBP_INLINE uint32_t BSwap32(uint32_t x) {
-#if defined(STARBOARD)
-  return SbByteSwapU32(x);
-#else
 #if defined(WEBP_USE_MIPS32_R2)
   uint32_t ret;
   __asm__ volatile (
@@ -82,13 +71,9 @@
 #else
   return (x >> 24) | ((x >> 8) & 0xff00) | ((x << 8) & 0xff0000) | (x << 24);
 #endif  // HAVE_BUILTIN_BSWAP32
-#endif  // defined(STARBOARD)
 }
 
 static WEBP_INLINE uint64_t BSwap64(uint64_t x) {
-#if defined(STARBOARD)
-  return SbByteSwapU64(x);
-#else
 #if defined(HAVE_BUILTIN_BSWAP64)
   return __builtin_bswap64(x);
 #elif defined(__x86_64__)
@@ -103,7 +88,6 @@
   x = ((x & 0xff00ff00ff00ff00ull) >>  8) | ((x & 0x00ff00ff00ff00ffull) <<  8);
   return x;
 #endif  // HAVE_BUILTIN_BSWAP64
-#endif  // defined(STARBOARD)
 }
 
 #endif  // WEBP_UTILS_ENDIAN_INL_UTILS_H_
diff --git a/third_party/libwebp/src/utils/filters_utils.h b/third_party/libwebp/src/utils/filters_utils.h
index 410f2fc..61da66e 100644
--- a/third_party/libwebp/src/utils/filters_utils.h
+++ b/third_party/libwebp/src/utils/filters_utils.h
@@ -29,4 +29,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_UTILS_FILTERS_UTILS_H_ */
+#endif  // WEBP_UTILS_FILTERS_UTILS_H_
diff --git a/third_party/libwebp/src/utils/huffman_encode_utils.c b/third_party/libwebp/src/utils/huffman_encode_utils.c
index 6f3b1bb..585db91 100644
--- a/third_party/libwebp/src/utils/huffman_encode_utils.c
+++ b/third_party/libwebp/src/utils/huffman_encode_utils.c
@@ -161,7 +161,7 @@
 // especially when population counts are longer than 2**tree_limit, but
 // we are not planning to use this with extremely long blocks.
 //
-// See http://en.wikipedia.org/wiki/Huffman_coding
+// See https://en.wikipedia.org/wiki/Huffman_coding
 static void GenerateOptimalTree(const uint32_t* const histogram,
                                 int histogram_size,
                                 HuffmanTree* tree, int tree_depth_limit,
@@ -404,8 +404,7 @@
 // Main entry point
 
 void VP8LCreateHuffmanTree(uint32_t* const histogram, int tree_depth_limit,
-                           uint8_t* const buf_rle,
-                           HuffmanTree* const huff_tree,
+                           uint8_t* const buf_rle, HuffmanTree* const huff_tree,
                            HuffmanTreeCode* const huff_code) {
   const int num_symbols = huff_code->num_symbols;
   memset(buf_rle, 0, num_symbols * sizeof(*buf_rle));
diff --git a/third_party/libwebp/src/utils/huffman_encode_utils.h b/third_party/libwebp/src/utils/huffman_encode_utils.h
index 3e6763c..3f7f1d8 100644
--- a/third_party/libwebp/src/utils/huffman_encode_utils.h
+++ b/third_party/libwebp/src/utils/huffman_encode_utils.h
@@ -51,7 +51,7 @@
 // huffman code tree.
 void VP8LCreateHuffmanTree(uint32_t* const histogram, int tree_depth_limit,
                            uint8_t* const buf_rle, HuffmanTree* const huff_tree,
-                           HuffmanTreeCode* const tree);
+                           HuffmanTreeCode* const huff_code);
 
 #ifdef __cplusplus
 }
diff --git a/third_party/libwebp/src/utils/huffman_utils.c b/third_party/libwebp/src/utils/huffman_utils.c
index 7a69963..90c2fbf 100644
--- a/third_party/libwebp/src/utils/huffman_utils.c
+++ b/third_party/libwebp/src/utils/huffman_utils.c
@@ -91,7 +91,8 @@
 
   assert(code_lengths_size != 0);
   assert(code_lengths != NULL);
-  assert(root_table != NULL);
+  assert((root_table != NULL && sorted != NULL) ||
+         (root_table == NULL && sorted == NULL));
   assert(root_bits > 0);
 
   // Build histogram of code lengths.
@@ -120,22 +121,28 @@
   for (symbol = 0; symbol < code_lengths_size; ++symbol) {
     const int symbol_code_length = code_lengths[symbol];
     if (code_lengths[symbol] > 0) {
-      sorted[offset[symbol_code_length]++] = symbol;
+      if (sorted != NULL) {
+        sorted[offset[symbol_code_length]++] = symbol;
+      } else {
+        offset[symbol_code_length]++;
+      }
     }
   }
 
   // Special case code with only one value.
   if (offset[MAX_ALLOWED_CODE_LENGTH] == 1) {
-    HuffmanCode code;
-    code.bits = 0;
-    code.value = (uint16_t)sorted[0];
-    ReplicateValue(table, 1, total_size, code);
+    if (sorted != NULL) {
+      HuffmanCode code;
+      code.bits = 0;
+      code.value = (uint16_t)sorted[0];
+      ReplicateValue(table, 1, total_size, code);
+    }
     return total_size;
   }
 
   {
     int step;              // step size to replicate values in current table
-    uint32_t low = -1;     // low bits for current root entry
+    uint32_t low = 0xffffffffu;        // low bits for current root entry
     uint32_t mask = total_size - 1;    // mask for low bits
     uint32_t key = 0;      // reversed prefix code
     int num_nodes = 1;     // number of Huffman tree nodes
@@ -151,6 +158,7 @@
       if (num_open < 0) {
         return 0;
       }
+      if (root_table == NULL) continue;
       for (; count[len] > 0; --count[len]) {
         HuffmanCode code;
         code.bits = (uint8_t)len;
@@ -169,6 +177,7 @@
       if (num_open < 0) {
         return 0;
       }
+      if (root_table == NULL) continue;
       for (; count[len] > 0; --count[len]) {
         HuffmanCode code;
         if ((key & mask) != low) {
@@ -206,7 +215,10 @@
                           const int code_lengths[], int code_lengths_size) {
   int total_size;
   assert(code_lengths_size <= MAX_CODE_LENGTHS_SIZE);
-  if (code_lengths_size <= SORTED_SIZE_CUTOFF) {
+  if (root_table == NULL) {
+    total_size = BuildHuffmanTable(NULL, root_bits,
+                                   code_lengths, code_lengths_size, NULL);
+  } else if (code_lengths_size <= SORTED_SIZE_CUTOFF) {
     // use local stack-allocated array.
     uint16_t sorted[SORTED_SIZE_CUTOFF];
     total_size = BuildHuffmanTable(root_table, root_bits,
diff --git a/third_party/libwebp/src/utils/huffman_utils.h b/third_party/libwebp/src/utils/huffman_utils.h
index 862ffc1..9d97ab2 100644
--- a/third_party/libwebp/src/utils/huffman_utils.h
+++ b/third_party/libwebp/src/utils/huffman_utils.h
@@ -82,6 +82,8 @@
 // the huffman table.
 // Returns built table size or 0 in case of error (invalid tree or
 // memory error).
+// If root_table is NULL, it returns 0 if a lookup cannot be built, something
+// > 0 otherwise (but not the table size).
 int VP8LBuildHuffmanTable(HuffmanCode* const root_table, int root_bits,
                           const int code_lengths[], int code_lengths_size);
 
diff --git a/third_party/libwebp/src/utils/quant_levels_dec_utils.c b/third_party/libwebp/src/utils/quant_levels_dec_utils.c
index 3818a78..97e7893 100644
--- a/third_party/libwebp/src/utils/quant_levels_dec_utils.c
+++ b/third_party/libwebp/src/utils/quant_levels_dec_utils.c
@@ -30,7 +30,7 @@
 
 #define DFIX 4           // extra precision for ordered dithering
 #define DSIZE 4          // dithering size (must be a power of two)
-// cf. http://en.wikipedia.org/wiki/Ordered_dithering
+// cf. https://en.wikipedia.org/wiki/Ordered_dithering
 static const uint8_t kOrderedDither[DSIZE][DSIZE] = {
   {  0,  8,  2, 10 },     // coefficients are in DFIX fixed-point precision
   { 12,  4, 14,  6 },
@@ -261,9 +261,15 @@
 
 int WebPDequantizeLevels(uint8_t* const data, int width, int height, int stride,
                          int strength) {
-  const int radius = 4 * strength / 100;
+  int radius = 4 * strength / 100;
+
   if (strength < 0 || strength > 100) return 0;
   if (data == NULL || width <= 0 || height <= 0) return 0;  // bad params
+
+  // limit the filter size to not exceed the image dimensions
+  if (2 * radius + 1 > width) radius = (width - 1) >> 1;
+  if (2 * radius + 1 > height) radius = (height - 1) >> 1;
+
   if (radius > 0) {
     SmoothParams p;
     memset(&p, 0, sizeof(p));
diff --git a/third_party/libwebp/src/utils/quant_levels_dec_utils.h b/third_party/libwebp/src/utils/quant_levels_dec_utils.h
index f822107..327f19f 100644
--- a/third_party/libwebp/src/utils/quant_levels_dec_utils.h
+++ b/third_party/libwebp/src/utils/quant_levels_dec_utils.h
@@ -32,4 +32,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_UTILS_QUANT_LEVELS_DEC_UTILS_H_ */
+#endif  // WEBP_UTILS_QUANT_LEVELS_DEC_UTILS_H_
diff --git a/third_party/libwebp/src/utils/quant_levels_utils.h b/third_party/libwebp/src/utils/quant_levels_utils.h
index 75df2ba..9ee3ea0 100644
--- a/third_party/libwebp/src/utils/quant_levels_utils.h
+++ b/third_party/libwebp/src/utils/quant_levels_utils.h
@@ -33,4 +33,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_UTILS_QUANT_LEVELS_UTILS_H_ */
+#endif  // WEBP_UTILS_QUANT_LEVELS_UTILS_H_
diff --git a/third_party/libwebp/src/utils/random_utils.h b/third_party/libwebp/src/utils/random_utils.h
index 5b8ce5d..c84a24f 100644
--- a/third_party/libwebp/src/utils/random_utils.h
+++ b/third_party/libwebp/src/utils/random_utils.h
@@ -64,4 +64,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_UTILS_RANDOM_UTILS_H_ */
+#endif  // WEBP_UTILS_RANDOM_UTILS_H_
diff --git a/third_party/libwebp/src/utils/rescaler_utils.c b/third_party/libwebp/src/utils/rescaler_utils.c
index 90e2ea7..a0581a1 100644
--- a/third_party/libwebp/src/utils/rescaler_utils.c
+++ b/third_party/libwebp/src/utils/rescaler_utils.c
@@ -12,66 +12,74 @@
 // Author: Skal (pascal.massimino@gmail.com)
 
 #include <assert.h>
+#include <limits.h>
 #include <stdlib.h>
 #include <string.h>
 #include "src/dsp/dsp.h"
 #include "src/utils/rescaler_utils.h"
+#include "src/utils/utils.h"
 
 //------------------------------------------------------------------------------
 
-void WebPRescalerInit(WebPRescaler* const wrk, int src_width, int src_height,
-                      uint8_t* const dst,
-                      int dst_width, int dst_height, int dst_stride,
-                      int num_channels, rescaler_t* const work) {
+int WebPRescalerInit(WebPRescaler* const rescaler,
+                     int src_width, int src_height,
+                     uint8_t* const dst,
+                     int dst_width, int dst_height, int dst_stride,
+                     int num_channels, rescaler_t* const work) {
   const int x_add = src_width, x_sub = dst_width;
   const int y_add = src_height, y_sub = dst_height;
-  wrk->x_expand = (src_width < dst_width);
-  wrk->y_expand = (src_height < dst_height);
-  wrk->src_width = src_width;
-  wrk->src_height = src_height;
-  wrk->dst_width = dst_width;
-  wrk->dst_height = dst_height;
-  wrk->src_y = 0;
-  wrk->dst_y = 0;
-  wrk->dst = dst;
-  wrk->dst_stride = dst_stride;
-  wrk->num_channels = num_channels;
+  const uint64_t total_size = 2ull * dst_width * num_channels * sizeof(*work);
+  if (!CheckSizeOverflow(total_size)) return 0;
+
+  rescaler->x_expand = (src_width < dst_width);
+  rescaler->y_expand = (src_height < dst_height);
+  rescaler->src_width = src_width;
+  rescaler->src_height = src_height;
+  rescaler->dst_width = dst_width;
+  rescaler->dst_height = dst_height;
+  rescaler->src_y = 0;
+  rescaler->dst_y = 0;
+  rescaler->dst = dst;
+  rescaler->dst_stride = dst_stride;
+  rescaler->num_channels = num_channels;
 
   // for 'x_expand', we use bilinear interpolation
-  wrk->x_add = wrk->x_expand ? (x_sub - 1) : x_add;
-  wrk->x_sub = wrk->x_expand ? (x_add - 1) : x_sub;
-  if (!wrk->x_expand) {  // fx_scale is not used otherwise
-    wrk->fx_scale = WEBP_RESCALER_FRAC(1, wrk->x_sub);
+  rescaler->x_add = rescaler->x_expand ? (x_sub - 1) : x_add;
+  rescaler->x_sub = rescaler->x_expand ? (x_add - 1) : x_sub;
+  if (!rescaler->x_expand) {  // fx_scale is not used otherwise
+    rescaler->fx_scale = WEBP_RESCALER_FRAC(1, rescaler->x_sub);
   }
   // vertical scaling parameters
-  wrk->y_add = wrk->y_expand ? y_add - 1 : y_add;
-  wrk->y_sub = wrk->y_expand ? y_sub - 1 : y_sub;
-  wrk->y_accum = wrk->y_expand ? wrk->y_sub : wrk->y_add;
-  if (!wrk->y_expand) {
+  rescaler->y_add = rescaler->y_expand ? y_add - 1 : y_add;
+  rescaler->y_sub = rescaler->y_expand ? y_sub - 1 : y_sub;
+  rescaler->y_accum = rescaler->y_expand ? rescaler->y_sub : rescaler->y_add;
+  if (!rescaler->y_expand) {
     // This is WEBP_RESCALER_FRAC(dst_height, x_add * y_add) without the cast.
-    // Its value is <= WEBP_RESCALER_ONE, because dst_height <= wrk->y_add, and
-    // wrk->x_add >= 1;
-    const uint64_t ratio =
-        (uint64_t)dst_height * WEBP_RESCALER_ONE / (wrk->x_add * wrk->y_add);
+    // Its value is <= WEBP_RESCALER_ONE, because dst_height <= rescaler->y_add
+    // and rescaler->x_add >= 1;
+    const uint64_t num = (uint64_t)dst_height * WEBP_RESCALER_ONE;
+    const uint64_t den = (uint64_t)rescaler->x_add * rescaler->y_add;
+    const uint64_t ratio = num / den;
     if (ratio != (uint32_t)ratio) {
       // When ratio == WEBP_RESCALER_ONE, we can't represent the ratio with the
       // current fixed-point precision. This happens when src_height ==
-      // wrk->y_add (which == src_height), and wrk->x_add == 1.
+      // rescaler->y_add (which == src_height), and rescaler->x_add == 1.
       // => We special-case fxy_scale = 0, in WebPRescalerExportRow().
-      wrk->fxy_scale = 0;
+      rescaler->fxy_scale = 0;
     } else {
-      wrk->fxy_scale = (uint32_t)ratio;
+      rescaler->fxy_scale = (uint32_t)ratio;
     }
-    wrk->fy_scale = WEBP_RESCALER_FRAC(1, wrk->y_sub);
+    rescaler->fy_scale = WEBP_RESCALER_FRAC(1, rescaler->y_sub);
   } else {
-    wrk->fy_scale = WEBP_RESCALER_FRAC(1, wrk->x_add);
-    // wrk->fxy_scale is unused here.
+    rescaler->fy_scale = WEBP_RESCALER_FRAC(1, rescaler->x_add);
+    // rescaler->fxy_scale is unused here.
   }
-  wrk->irow = work;
-  wrk->frow = work + num_channels * dst_width;
-  memset(work, 0, 2 * dst_width * num_channels * sizeof(*work));
+  rescaler->irow = work;
+  rescaler->frow = work + num_channels * dst_width;
+  memset(work, 0, (size_t)total_size);
 
   WebPRescalerDspInit();
+  return 1;
 }
 
 int WebPRescalerGetScaledDimensions(int src_width, int src_height,
@@ -82,19 +90,20 @@
   {
     int width = *scaled_width;
     int height = *scaled_height;
+    const int max_size = INT_MAX / 2;
 
     // if width is unspecified, scale original proportionally to height ratio.
-    if (width == 0) {
+    if (width == 0 && src_height > 0) {
       width =
-          (int)(((uint64_t)src_width * height + src_height / 2) / src_height);
+          (int)(((uint64_t)src_width * height + src_height - 1) / src_height);
     }
     // if height is unspecified, scale original proportionally to width ratio.
-    if (height == 0) {
+    if (height == 0 && src_width > 0) {
       height =
-          (int)(((uint64_t)src_height * width + src_width / 2) / src_width);
+          (int)(((uint64_t)src_height * width + src_width - 1) / src_width);
     }
     // Check if the overall dimensions still make sense.
-    if (width <= 0 || height <= 0) {
+    if (width <= 0 || height <= 0 || width > max_size || height > max_size) {
       return 0;
     }
 
@@ -107,31 +116,34 @@
 //------------------------------------------------------------------------------
 // all-in-one calls
 
-int WebPRescaleNeededLines(const WebPRescaler* const wrk, int max_num_lines) {
-  const int num_lines = (wrk->y_accum + wrk->y_sub - 1) / wrk->y_sub;
+int WebPRescaleNeededLines(const WebPRescaler* const rescaler,
+                           int max_num_lines) {
+  const int num_lines =
+      (rescaler->y_accum + rescaler->y_sub - 1) / rescaler->y_sub;
   return (num_lines > max_num_lines) ? max_num_lines : num_lines;
 }
 
-int WebPRescalerImport(WebPRescaler* const wrk, int num_lines,
+int WebPRescalerImport(WebPRescaler* const rescaler, int num_lines,
                        const uint8_t* src, int src_stride) {
   int total_imported = 0;
-  while (total_imported < num_lines && !WebPRescalerHasPendingOutput(wrk)) {
-    if (wrk->y_expand) {
-      rescaler_t* const tmp = wrk->irow;
-      wrk->irow = wrk->frow;
-      wrk->frow = tmp;
+  while (total_imported < num_lines &&
+         !WebPRescalerHasPendingOutput(rescaler)) {
+    if (rescaler->y_expand) {
+      rescaler_t* const tmp = rescaler->irow;
+      rescaler->irow = rescaler->frow;
+      rescaler->frow = tmp;
     }
-    WebPRescalerImportRow(wrk, src);
-    if (!wrk->y_expand) {     // Accumulate the contribution of the new row.
+    WebPRescalerImportRow(rescaler, src);
+    if (!rescaler->y_expand) {    // Accumulate the contribution of the new row.
       int x;
-      for (x = 0; x < wrk->num_channels * wrk->dst_width; ++x) {
-        wrk->irow[x] += wrk->frow[x];
+      for (x = 0; x < rescaler->num_channels * rescaler->dst_width; ++x) {
+        rescaler->irow[x] += rescaler->frow[x];
       }
     }
-    ++wrk->src_y;
+    ++rescaler->src_y;
     src += src_stride;
     ++total_imported;
-    wrk->y_accum -= wrk->y_sub;
+    rescaler->y_accum -= rescaler->y_sub;
   }
   return total_imported;
 }
diff --git a/third_party/libwebp/src/utils/rescaler_utils.h b/third_party/libwebp/src/utils/rescaler_utils.h
index 8890e6f..ef201ef 100644
--- a/third_party/libwebp/src/utils/rescaler_utils.h
+++ b/third_party/libwebp/src/utils/rescaler_utils.h
@@ -47,12 +47,13 @@
 };
 
 // Initialize a rescaler given scratch area 'work' and dimensions of src & dst.
-void WebPRescalerInit(WebPRescaler* const rescaler,
-                      int src_width, int src_height,
-                      uint8_t* const dst,
-                      int dst_width, int dst_height, int dst_stride,
-                      int num_channels,
-                      rescaler_t* const work);
+// Returns false in case of error.
+int WebPRescalerInit(WebPRescaler* const rescaler,
+                     int src_width, int src_height,
+                     uint8_t* const dst,
+                     int dst_width, int dst_height, int dst_stride,
+                     int num_channels,
+                     rescaler_t* const work);
 
 // If either 'scaled_width' or 'scaled_height' (but not both) is 0 the value
 // will be calculated preserving the aspect ratio, otherwise the values are
@@ -98,4 +99,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_UTILS_RESCALER_UTILS_H_ */
+#endif  // WEBP_UTILS_RESCALER_UTILS_H_
diff --git a/third_party/libwebp/src/utils/thread_utils.c b/third_party/libwebp/src/utils/thread_utils.c
index 2052b6b..4e470e1 100644
--- a/third_party/libwebp/src/utils/thread_utils.c
+++ b/third_party/libwebp/src/utils/thread_utils.c
@@ -73,7 +73,7 @@
 #endif
 
 static int pthread_create(pthread_t* const thread, const void* attr,
-                          unsigned int (__stdcall *start)(void*), void* arg) {
+                          unsigned int (__stdcall* start)(void*), void* arg) {
   (void)attr;
 #ifdef USE_CREATE_THREAD
   *thread = CreateThread(NULL,   /* lpThreadAttributes */
@@ -217,8 +217,12 @@
       done = 1;
     }
     // signal to the main thread that we're done (for Sync())
-    pthread_cond_signal(&impl->condition_);
+    // Note the associated mutex does not need to be held when signaling the
+    // condition. Unlocking the mutex first may improve performance in some
+    // implementations, avoiding the case where the waiting thread can't
+    // reacquire the mutex when woken.
     pthread_mutex_unlock(&impl->mutex_);
+    pthread_cond_signal(&impl->condition_);
   }
   return THREAD_RETURN(NULL);    // Thread is finished
 }
@@ -240,7 +244,13 @@
     // assign new status and release the working thread if needed
     if (new_status != OK) {
       worker->status_ = new_status;
+      // Note the associated mutex does not need to be held when signaling the
+      // condition. Unlocking the mutex first may improve performance in some
+      // implementations, avoiding the case where the waiting thread can't
+      // reacquire the mutex when woken.
+      pthread_mutex_unlock(&impl->mutex_);
       pthread_cond_signal(&impl->condition_);
+      return;
     }
   }
   pthread_mutex_unlock(&impl->mutex_);
diff --git a/third_party/libwebp/src/utils/thread_utils.h b/third_party/libwebp/src/utils/thread_utils.h
index c8ae6c9..29ad49f 100644
--- a/third_party/libwebp/src/utils/thread_utils.h
+++ b/third_party/libwebp/src/utils/thread_utils.h
@@ -87,4 +87,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_UTILS_THREAD_UTILS_H_ */
+#endif  // WEBP_UTILS_THREAD_UTILS_H_
diff --git a/third_party/libwebp/src/utils/utils.c b/third_party/libwebp/src/utils/utils.c
index d85850c..4989abf 100644
--- a/third_party/libwebp/src/utils/utils.c
+++ b/third_party/libwebp/src/utils/utils.c
@@ -28,7 +28,7 @@
 // alloc/free etc) is printed. For debugging/tuning purpose only (it's slow,
 // and not multi-thread safe!).
 // An interesting alternative is valgrind's 'massif' tool:
-//    http://valgrind.org/docs/manual/ms-manual.html
+//    https://valgrind.org/docs/manual/ms-manual.html
 // Here is an example command line:
 /*    valgrind --tool=massif --massif-out-file=massif.out \
                --stacks=yes --alloc-fn=WebPSafeMalloc --alloc-fn=WebPSafeCalloc
@@ -108,6 +108,9 @@
 #if defined(MALLOC_LIMIT)
     {
       const char* const malloc_limit_str = getenv("MALLOC_LIMIT");
+#if MALLOC_LIMIT > 1
+      mem_limit = (size_t)MALLOC_LIMIT;
+#endif
       if (malloc_limit_str != NULL) {
         mem_limit = atoi(malloc_limit_str);
       }
@@ -176,16 +179,16 @@
   const uint64_t total_size = nmemb * size;
   if (nmemb == 0) return 1;
   if ((uint64_t)size > WEBP_MAX_ALLOCABLE_MEMORY / nmemb) return 0;
-  if (total_size != (size_t)total_size) return 0;
+  if (!CheckSizeOverflow(total_size)) return 0;
 #if defined(PRINT_MEM_INFO) && defined(MALLOC_FAIL_AT)
   if (countdown_to_fail > 0 && --countdown_to_fail == 0) {
     return 0;    // fake fail!
   }
 #endif
-#if defined(MALLOC_LIMIT)
+#if defined(PRINT_MEM_INFO) && defined(MALLOC_LIMIT)
   if (mem_limit > 0) {
     const uint64_t new_total_mem = (uint64_t)total_mem + total_size;
-    if (new_total_mem != (size_t)new_total_mem ||
+    if (!CheckSizeOverflow(new_total_mem) ||
         new_total_mem > mem_limit) {
       return 0;   // fake fail!
     }
@@ -223,9 +226,14 @@
   free(ptr);
 }
 
-// Public API function.
+// Public API functions.
+
+void* WebPMalloc(size_t size) {
+  return WebPSafeMalloc(1, size);
+}
+
 void WebPFree(void* ptr) {
-  free(ptr);
+  WebPSafeFree(ptr);
 }
 
 //------------------------------------------------------------------------------
@@ -233,7 +241,7 @@
 void WebPCopyPlane(const uint8_t* src, int src_stride,
                    uint8_t* dst, int dst_stride, int width, int height) {
   assert(src != NULL && dst != NULL);
-  assert(src_stride >= width && dst_stride >= width);
+  assert(abs(src_stride) >= width && abs(dst_stride) >= width);
   while (height-- > 0) {
     memcpy(dst, src, width);
     src += src_stride;
diff --git a/third_party/libwebp/src/utils/utils.h b/third_party/libwebp/src/utils/utils.h
index 4b2bf1c..51ea15c 100644
--- a/third_party/libwebp/src/utils/utils.h
+++ b/third_party/libwebp/src/utils/utils.h
@@ -47,6 +47,10 @@
 #endif
 #endif  // WEBP_MAX_ALLOCABLE_MEMORY
 
+static WEBP_INLINE int CheckSizeOverflow(uint64_t size) {
+  return size == (size_t)size;
+}
+
 // size-checking safe malloc/calloc: verify that the requested size is not too
 // large, or return NULL. You don't need to call these for constructs like
 // malloc(sizeof(foo)), but only if there's picture-dependent size involved
@@ -65,7 +69,8 @@
 // Alignment
 
 #define WEBP_ALIGN_CST 31
-#define WEBP_ALIGN(PTR) (((uintptr_t)(PTR) + WEBP_ALIGN_CST) & ~WEBP_ALIGN_CST)
+#define WEBP_ALIGN(PTR) (((uintptr_t)(PTR) + WEBP_ALIGN_CST) & \
+                         ~(uintptr_t)WEBP_ALIGN_CST)
 
 #if !defined(STARBOARD)
 #include <string.h>
@@ -77,10 +82,19 @@
   memcpy(&A, ptr, sizeof(A));
   return A;
 }
+
+static WEBP_INLINE int32_t WebPMemToInt32(const uint8_t* const ptr) {
+  return (int32_t)WebPMemToUint32(ptr);
+}
+
 static WEBP_INLINE void WebPUint32ToMem(uint8_t* const ptr, uint32_t val) {
   memcpy(ptr, &val, sizeof(val));
 }
 
+static WEBP_INLINE void WebPInt32ToMem(uint8_t* const ptr, int val) {
+  WebPUint32ToMem(ptr, (uint32_t)val);
+}
+
 //------------------------------------------------------------------------------
 // Reading/writing data.
 
@@ -100,14 +114,14 @@
 // Store 16, 24 or 32 bits in little-endian order.
 static WEBP_INLINE void PutLE16(uint8_t* const data, int val) {
   SB_DCHECK(val < (1 << 16));
-  data[0] = (val >> 0);
-  data[1] = (val >> 8);
+  data[0] = (val >> 0) & 0xff;
+  data[1] = (val >> 8) & 0xff;
 }
 
 static WEBP_INLINE void PutLE24(uint8_t* const data, int val) {
   SB_DCHECK(val < (1 << 24));
   PutLE16(data, val & 0xffff);
-  data[2] = (val >> 16);
+  data[2] = (val >> 16) & 0xff;
 }
 
 static WEBP_INLINE void PutLE32(uint8_t* const data, uint32_t val) {
@@ -115,6 +129,33 @@
   PutLE16(data + 2, (int)(val >> 16));
 }
 
+// use GNU builtins where available.
+#if !defined(STARBOARD) && defined(__GNUC__) && \
+    ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4)
+// Returns (int)floor(log2(n)). n must be > 0.
+static WEBP_INLINE int BitsLog2Floor(uint32_t n) {
+  return 31 ^ __builtin_clz(n);
+}
+// counts the number of trailing zero
+static WEBP_INLINE int BitsCtz(uint32_t n) { return __builtin_ctz(n); }
+#elif !defined(STARBOARD) && defined(_MSC_VER) && _MSC_VER > 1310 && \
+      (defined(_M_X64) || defined(_M_IX86))
+#include <intrin.h>
+#pragma intrinsic(_BitScanReverse)
+#pragma intrinsic(_BitScanForward)
+
+static WEBP_INLINE int BitsLog2Floor(uint32_t n) {
+  unsigned long first_set_bit;  // NOLINT (runtime/int)
+  _BitScanReverse(&first_set_bit, n);
+  return first_set_bit;
+}
+static WEBP_INLINE int BitsCtz(uint32_t n) {
+  unsigned long first_set_bit;  // NOLINT (runtime/int)
+  _BitScanForward(&first_set_bit, n);
+  return first_set_bit;
+}
+#else   // default: use the (slow) C-version.
+#define WEBP_HAVE_SLOW_CLZ_CTZ   // signal that the Clz/Ctz function are slow
 // Returns 31 ^ clz(n) = log2(n). This is the default C-implementation, either
 // based on table or not. Can be used as fallback if clz() is not available.
 #define WEBP_NEED_LOG_TABLE_8BIT
@@ -128,25 +169,16 @@
   return log_value + WebPLogTable8bit[n];
 }
 
-// Returns (int)floor(log2(n)). n must be > 0.
-// use GNU builtins where available.
-#if !defined(STARBOARD) && defined(__GNUC__) && \
-    ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4)
-static WEBP_INLINE int BitsLog2Floor(uint32_t n) {
-  return 31 ^ __builtin_clz(n);
-}
-#elif !defined(STARBOARD) && defined(_MSC_VER) && _MSC_VER > 1310 && \
-      (defined(_M_X64) || defined(_M_IX86))
-#include <intrin.h>
-#pragma intrinsic(_BitScanReverse)
-
-static WEBP_INLINE int BitsLog2Floor(uint32_t n) {
-  unsigned long first_set_bit;
-  _BitScanReverse(&first_set_bit, n);
-  return first_set_bit;
-}
-#else   // default: use the C-version.
 static WEBP_INLINE int BitsLog2Floor(uint32_t n) { return WebPLog2FloorC(n); }
+
+static WEBP_INLINE int BitsCtz(uint32_t n) {
+  int i;
+  for (i = 0; i < 32; ++i, n >>= 1) {
+    if (n & 1) return i;
+  }
+  return 32;
+}
+
 #endif
 
 //------------------------------------------------------------------------------
@@ -183,4 +215,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_UTILS_UTILS_H_ */
+#endif  // WEBP_UTILS_UTILS_H_
diff --git a/third_party/libwebp/src/webp/decode.h b/third_party/libwebp/src/webp/decode.h
index 2165e96..0177b12 100644
--- a/third_party/libwebp/src/webp/decode.h
+++ b/third_party/libwebp/src/webp/decode.h
@@ -20,7 +20,7 @@
 extern "C" {
 #endif
 
-#define WEBP_DECODER_ABI_VERSION 0x0208    // MAJOR(8b) + MINOR(8b)
+#define WEBP_DECODER_ABI_VERSION 0x0209    // MAJOR(8b) + MINOR(8b)
 
 // Note: forward declaring enumerations is not allowed in (strict) C and C++,
 // the types are left here for reference.
@@ -42,6 +42,12 @@
 // This function will also validate the header, returning true on success,
 // false otherwise. '*width' and '*height' are only valid on successful return.
 // Pointers 'width' and 'height' can be passed NULL if deemed irrelevant.
+// Note: The following chunk sequences (before the raw VP8/VP8L data) are
+// considered valid by this function:
+// RIFF + VP8(L)
+// RIFF + VP8X + (optional chunks) + VP8(L)
+// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose.
+// VP8(L)     <-- Not a valid WebP format: only allowed for internal purpose.
 WEBP_EXTERN int WebPGetInfo(const uint8_t* data, size_t data_size,
                             int* width, int* height);
 
@@ -75,19 +81,17 @@
 // returned is the Y samples buffer. Upon return, *u and *v will point to
 // the U and V chroma data. These U and V buffers need NOT be passed to
 // WebPFree(), unlike the returned Y luma one. The dimension of the U and V
-// planes are both (*width + 1) / 2 and (*height + 1)/ 2.
+// planes are both (*width + 1) / 2 and (*height + 1) / 2.
 // Upon return, the Y buffer has a stride returned as '*stride', while U and V
 // have a common stride returned as '*uv_stride'.
-// Return NULL in case of error.
-// (*) Also named Y'CbCr. See: http://en.wikipedia.org/wiki/YCbCr
+// 'width' and 'height' may be NULL, the other pointers must not be.
+// Returns NULL in case of error.
+// (*) Also named Y'CbCr. See: https://en.wikipedia.org/wiki/YCbCr
 WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,
                                    int* width, int* height,
                                    uint8_t** u, uint8_t** v,
                                    int* stride, int* uv_stride);
 
-// Releases memory returned by the WebPDecode*() functions above.
-WEBP_EXTERN void WebPFree(void* ptr);
-
 // These five functions are variants of the above ones, that decode the image
 // directly into a pre-allocated buffer 'output_buffer'. The maximum storage
 // available in this buffer is indicated by 'output_buffer_size'. If this
@@ -425,6 +429,12 @@
 // Returns VP8_STATUS_OK when the features are successfully retrieved. Returns
 // VP8_STATUS_NOT_ENOUGH_DATA when more data is needed to retrieve the
 // features from headers. Returns error in other cases.
+// Note: The following chunk sequences (before the raw VP8/VP8L data) are
+// considered valid by this function:
+// RIFF + VP8(L)
+// RIFF + VP8X + (optional chunks) + VP8(L)
+// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose.
+// VP8(L)     <-- Not a valid WebP format: only allowed for internal purpose.
 static WEBP_INLINE VP8StatusCode WebPGetFeatures(
     const uint8_t* data, size_t data_size,
     WebPBitstreamFeatures* features) {
@@ -444,7 +454,7 @@
   int scaled_width, scaled_height;    // final resolution
   int use_threads;                    // if true, use multi-threaded decoding
   int dithering_strength;             // dithering strength (0=Off, 100=full)
-  int flip;                           // flip output vertically
+  int flip;                           // if true, flip output vertically
   int alpha_dithering_strength;       // alpha dithering strength in [0..100]
 
   uint32_t pad[5];                    // padding for later use
@@ -491,4 +501,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_WEBP_DECODE_H_ */
+#endif  // WEBP_WEBP_DECODE_H_
diff --git a/third_party/libwebp/src/webp/demux.h b/third_party/libwebp/src/webp/demux.h
index 555d641..846eeb1 100644
--- a/third_party/libwebp/src/webp/demux.h
+++ b/third_party/libwebp/src/webp/demux.h
@@ -360,4 +360,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_WEBP_DEMUX_H_ */
+#endif  // WEBP_WEBP_DEMUX_H_
diff --git a/third_party/libwebp/src/webp/encode.h b/third_party/libwebp/src/webp/encode.h
index 7ec3543..56b68e2 100644
--- a/third_party/libwebp/src/webp/encode.h
+++ b/third_party/libwebp/src/webp/encode.h
@@ -20,7 +20,7 @@
 extern "C" {
 #endif
 
-#define WEBP_ENCODER_ABI_VERSION 0x020e    // MAJOR(8b) + MINOR(8b)
+#define WEBP_ENCODER_ABI_VERSION 0x020f    // MAJOR(8b) + MINOR(8b)
 
 // Note: forward declaring enumerations is not allowed in (strict) C and C++,
 // the types are left here for reference.
@@ -62,6 +62,10 @@
 // These functions are the equivalent of the above, but compressing in a
 // lossless manner. Files are usually larger than lossy format, but will
 // not suffer any compression loss.
+// Note these functions, like the lossy versions, use the library's default
+// settings. For lossless this means 'exact' is disabled. RGB values in
+// transparent areas will be modified to improve compression. To avoid this,
+// use WebPEncode() and set WebPConfig::exact to 1.
 WEBP_EXTERN size_t WebPEncodeLosslessRGB(const uint8_t* rgb,
                                          int width, int height, int stride,
                                          uint8_t** output);
@@ -75,9 +79,6 @@
                                           int width, int height, int stride,
                                           uint8_t** output);
 
-// Releases memory returned by the WebPEncode*() functions above.
-WEBP_EXTERN void WebPFree(void* ptr);
-
 //------------------------------------------------------------------------------
 // Coding parameters
 
@@ -147,7 +148,8 @@
   int use_delta_palette;  // reserved for future lossless feature
   int use_sharp_yuv;      // if needed, use sharp (and slow) RGB->YUV conversion
 
-  uint32_t pad[2];        // padding for later use
+  int qmin;               // minimum permissible quality factor
+  int qmax;               // maximum permissible quality factor
 };
 
 // Enumerate some predefined settings for WebPConfig, depending on the type
@@ -290,6 +292,11 @@
 #define WEBP_MAX_DIMENSION 16383
 
 // Main exchange structure (input samples, output bytes, statistics)
+//
+// Once WebPPictureInit() has been called, it's ok to make all the INPUT fields
+// (use_argb, y/u/v, argb, ...) point to user-owned data, even if
+// WebPPictureAlloc() has been called. Depending on the value use_argb,
+// it's guaranteed that either *argb or *y/*u/*v content will be kept untouched.
 struct WebPPicture {
   //   INPUT
   //////////////
@@ -302,7 +309,7 @@
   // YUV input (mostly used for input to lossy compression)
   WebPEncCSP colorspace;     // colorspace: should be YUV420 for now (=Y'CbCr).
   int width, height;         // dimensions (less or equal to WEBP_MAX_DIMENSION)
-  uint8_t *y, *u, *v;        // pointers to luma/chroma planes.
+  uint8_t* y, *u, *v;        // pointers to luma/chroma planes.
   int y_stride, uv_stride;   // luma/chroma strides.
   uint8_t* a;                // pointer to the alpha plane
   int a_stride;              // stride of the alpha plane
@@ -346,7 +353,7 @@
   uint32_t pad3[3];       // padding for later use
 
   // Unused for now
-  uint8_t *pad4, *pad5;
+  uint8_t* pad4, *pad5;
   uint32_t pad6[8];       // padding for later use
 
   // PRIVATE FIELDS
@@ -434,7 +441,7 @@
 // the original dimension will be lost). Picture 'dst' need not be initialized
 // with WebPPictureInit() if it is different from 'src', since its content will
 // be overwritten.
-// Returns false in case of memory allocation error or invalid parameters.
+// Returns false in case of invalid parameters.
 WEBP_EXTERN int WebPPictureView(const WebPPicture* src,
                                 int left, int top, int width, int height,
                                 WebPPicture* dst);
@@ -448,7 +455,7 @@
 // dimension will be calculated preserving the aspect ratio.
 // No gamma correction is applied.
 // Returns false in case of error (invalid parameter or insufficient memory).
-WEBP_EXTERN int WebPPictureRescale(WebPPicture* pic, int width, int height);
+WEBP_EXTERN int WebPPictureRescale(WebPPicture* picture, int width, int height);
 
 // Colorspace conversion function to import RGB samples.
 // Previous buffer will be free'd, if any.
@@ -519,7 +526,7 @@
 // Remove the transparency information (if present) by blending the color with
 // the background color 'background_rgb' (specified as 24bit RGB triplet).
 // After this call, all alpha values are reset to 0xff.
-WEBP_EXTERN void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb);
+WEBP_EXTERN void WebPBlendAlpha(WebPPicture* picture, uint32_t background_rgb);
 
 //------------------------------------------------------------------------------
 // Main call
@@ -542,4 +549,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_WEBP_ENCODE_H_ */
+#endif  // WEBP_WEBP_ENCODE_H_
diff --git a/third_party/libwebp/src/webp/format_constants.h b/third_party/libwebp/src/webp/format_constants.h
index 329fc8a..999035c 100644
--- a/third_party/libwebp/src/webp/format_constants.h
+++ b/third_party/libwebp/src/webp/format_constants.h
@@ -55,7 +55,7 @@
 typedef enum {
   PREDICTOR_TRANSFORM      = 0,
   CROSS_COLOR_TRANSFORM    = 1,
-  SUBTRACT_GREEN           = 2,
+  SUBTRACT_GREEN_TRANSFORM = 2,
   COLOR_INDEXING_TRANSFORM = 3
 } VP8LImageTransformType;
 
@@ -84,4 +84,4 @@
 // overflow a uint32_t.
 #define MAX_CHUNK_PAYLOAD (~0U - CHUNK_HEADER_SIZE - 1)
 
-#endif  /* WEBP_WEBP_FORMAT_CONSTANTS_H_ */
+#endif  // WEBP_WEBP_FORMAT_CONSTANTS_H_
diff --git a/third_party/libwebp/src/webp/mux.h b/third_party/libwebp/src/webp/mux.h
index 28bb4a4..7d27489 100644
--- a/third_party/libwebp/src/webp/mux.h
+++ b/third_party/libwebp/src/webp/mux.h
@@ -57,7 +57,7 @@
   WebPMuxGetChunk(mux, "ICCP", &icc_profile);
   // ... (Consume icc_data).
   WebPMuxDelete(mux);
-  free(data);
+  WebPFree(data);
 */
 
 // Note: forward declaring enumerations is not allowed in (strict) C and C++,
@@ -245,7 +245,7 @@
     WebPMux* mux, const WebPMuxFrameInfo* frame, int copy_data);
 
 // Gets the nth frame from the mux object.
-// The content of 'frame->bitstream' is allocated using malloc(), and NOT
+// The content of 'frame->bitstream' is allocated using WebPMalloc(), and NOT
 // owned by the 'mux' object. It MUST be deallocated by the caller by calling
 // WebPDataClear().
 // nth=0 has a special meaning - last position.
@@ -376,10 +376,10 @@
 // Assembles all chunks in WebP RIFF format and returns in 'assembled_data'.
 // This function also validates the mux object.
 // Note: The content of 'assembled_data' will be ignored and overwritten.
-// Also, the content of 'assembled_data' is allocated using malloc(), and NOT
-// owned by the 'mux' object. It MUST be deallocated by the caller by calling
-// WebPDataClear(). It's always safe to call WebPDataClear() upon return,
-// even in case of error.
+// Also, the content of 'assembled_data' is allocated using WebPMalloc(), and
+// NOT owned by the 'mux' object. It MUST be deallocated by the caller by
+// calling WebPDataClear(). It's always safe to call WebPDataClear() upon
+// return, even in case of error.
 // Parameters:
 //   mux - (in/out) object whose chunks are to be assembled
 //   assembled_data - (out) assembled WebP data
@@ -527,4 +527,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_WEBP_MUX_H_ */
+#endif  // WEBP_WEBP_MUX_H_
diff --git a/third_party/libwebp/src/webp/mux_types.h b/third_party/libwebp/src/webp/mux_types.h
index fcc9304..087e9f9 100644
--- a/third_party/libwebp/src/webp/mux_types.h
+++ b/third_party/libwebp/src/webp/mux_types.h
@@ -17,8 +17,6 @@
 #if defined(STARBOARD)
 #include "starboard/common/log.h"
 #include "starboard/memory.h"
-#else
-#include <stdlib.h>  // free()
 #include <string.h>  // memset()
 #endif
 #include "./types.h"
@@ -61,6 +59,7 @@
 
 // Data type used to describe 'raw' data, e.g., chunk data
 // (ICC profile, metadata) and WebP compressed image data.
+// 'bytes' memory must be allocated using WebPMalloc() and such.
 struct WebPData {
   const uint8_t* bytes;
   size_t size;
@@ -73,11 +72,11 @@
   }
 }
 
-// Clears the contents of the 'webp_data' object by calling free(). Does not
-// deallocate the object itself.
+// Clears the contents of the 'webp_data' object by calling WebPFree().
+// Does not deallocate the object itself.
 static WEBP_INLINE void WebPDataClear(WebPData* webp_data) {
   if (webp_data != NULL) {
-    SbMemoryDeallocate((void*)webp_data->bytes);
+    WebPFree((void*)webp_data->bytes);
     WebPDataInit(webp_data);
   }
 }
@@ -88,7 +87,7 @@
   if (src == NULL || dst == NULL) return 0;
   WebPDataInit(dst);
   if (src->bytes != NULL && src->size != 0) {
-    dst->bytes = (uint8_t*)SbMemoryAllocate(src->size);
+    dst->bytes = (uint8_t*)WebPMalloc(src->size);
     if (dst->bytes == NULL) return 0;
     memcpy((void*)dst->bytes, src->bytes, src->size);
     dst->size = src->size;
@@ -100,4 +99,4 @@
 }    // extern "C"
 #endif
 
-#endif  /* WEBP_WEBP_MUX_TYPES_H_ */
+#endif  // WEBP_WEBP_MUX_TYPES_H_
diff --git a/third_party/libwebp/src/webp/types.h b/third_party/libwebp/src/webp/types.h
index 5c35487..e2a6350 100644
--- a/third_party/libwebp/src/webp/types.h
+++ b/third_party/libwebp/src/webp/types.h
@@ -7,7 +7,7 @@
 // be found in the AUTHORS file in the root of the source tree.
 // -----------------------------------------------------------------------------
 //
-//  Common types
+//  Common types + memory wrappers
 //
 // Author: Skal (pascal.massimino@gmail.com)
 
@@ -48,11 +48,31 @@
 # if defined(__GNUC__) && __GNUC__ >= 4
 #  define WEBP_EXTERN extern __attribute__ ((visibility ("default")))
 # else
-#  define WEBP_EXTERN extern
+#  if defined(_MSC_VER) && defined(WEBP_DLL)
+#   define WEBP_EXTERN __declspec(dllexport)
+#  else
+#   define WEBP_EXTERN extern
+#  endif
 # endif  /* __GNUC__ >= 4 */
 #endif  /* WEBP_EXTERN */
 
 // Macro to check ABI compatibility (same major revision number)
 #define WEBP_ABI_IS_INCOMPATIBLE(a, b) (((a) >> 8) != ((b) >> 8))
 
-#endif  /* WEBP_WEBP_TYPES_H_ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Allocates 'size' bytes of memory. Returns NULL upon error. Memory
+// must be deallocated by calling WebPFree(). This function is made available
+// by the core 'libwebp' library.
+WEBP_EXTERN void* WebPMalloc(size_t size);
+
+// Releases memory returned by the WebPDecode*() functions (from decode.h).
+WEBP_EXTERN void WebPFree(void* ptr);
+
+#ifdef __cplusplus
+}    // extern "C"
+#endif
+
+#endif  // WEBP_WEBP_TYPES_H_
diff --git a/third_party/libwebp/swig/README b/third_party/libwebp/swig/README.md
similarity index 78%
rename from third_party/libwebp/swig/README
rename to third_party/libwebp/swig/README.md
index 725c071..7fa1c38 100644
--- a/third_party/libwebp/swig/README
+++ b/third_party/libwebp/swig/README.md
@@ -1,15 +1,20 @@
-Building:
-=========
+# SWIG bindings
 
-JNI SWIG bindings:
-------------------
+## Building
+
+### JNI SWIG bindings
+
+```shell
  $ gcc -shared -fPIC -fno-strict-aliasing -O2 \
        -I/path/to/your/jdk/includes \
        libwebp_java_wrap.c \
        -lwebp \
        -o libwebp_jni.so
+```
 
--------------------------------------- BEGIN PSEUDO EXAMPLE
+Example usage:
+
+```java
 import com.google.webp.libwebp;
 
 import java.lang.reflect.Method;
@@ -33,17 +38,23 @@
     }
   }
 }
--------------------------------------- END PSEUDO EXAMPLE
+```
 
+```shell
  $ javac -cp libwebp.jar libwebp_jni_example.java
  $ java -Djava.library.path=. -cp libwebp.jar:. libwebp_jni_example
+```
 
-Python SWIG bindings:
----------------------
+### Python SWIG bindings:
+
+```shell
  $ python setup.py build_ext
  $ python setup.py install --prefix=pylocal
+```
 
--------------------------------------- BEGIN PSEUDO EXAMPLE
+Example usage:
+
+```python
 import glob
 import sys
 sys.path.append(glob.glob('pylocal/lib/python*/site-packages')[0])
@@ -53,4 +64,4 @@
 
 print "libwebp attributes:"
 for attr in dir(libwebp): print attr
--------------------------------------- END PSEUDO EXAMPLE
+```
diff --git a/third_party/libwebp/swig/libwebp.py b/third_party/libwebp/swig/libwebp.py
index 4ff11f8..2d126b5 100644
--- a/third_party/libwebp/swig/libwebp.py
+++ b/third_party/libwebp/swig/libwebp.py
@@ -1,13 +1,22 @@
 # This file was automatically generated by SWIG (http://www.swig.org).
-# Version 2.0.4
+# Version 3.0.12
 #
 # Do not make changes to this file unless you know what you are doing--modify
 # the SWIG interface file instead.
 
-
-
-from sys import version_info
-if version_info >= (2,6,0):
+from sys import version_info as _swig_python_version_info
+if _swig_python_version_info >= (2, 7, 0):
+    def swig_import_helper():
+        import importlib
+        pkg = __name__.rpartition('.')[0]
+        mname = '.'.join((pkg, '_libwebp')).lstrip('.')
+        try:
+            return importlib.import_module(mname)
+        except ImportError:
+            return importlib.import_module('_libwebp')
+    _libwebp = swig_import_helper()
+    del swig_import_helper
+elif _swig_python_version_info >= (2, 6, 0):
     def swig_import_helper():
         from os.path import dirname
         import imp
@@ -17,122 +26,143 @@
         except ImportError:
             import _libwebp
             return _libwebp
-        if fp is not None:
-            try:
-                _mod = imp.load_module('_libwebp', fp, pathname, description)
-            finally:
+        try:
+            _mod = imp.load_module('_libwebp', fp, pathname, description)
+        finally:
+            if fp is not None:
                 fp.close()
-            return _mod
+        return _mod
     _libwebp = swig_import_helper()
     del swig_import_helper
 else:
     import _libwebp
-del version_info
+del _swig_python_version_info
+
 try:
     _swig_property = property
 except NameError:
-    pass # Python < 2.2 doesn't have 'property'.
-def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
-    if (name == "thisown"): return self.this.own(value)
+    pass  # Python < 2.2 doesn't have 'property'.
+
+try:
+    import builtins as __builtin__
+except ImportError:
+    import __builtin__
+
+def _swig_setattr_nondynamic(self, class_type, name, value, static=1):
+    if (name == "thisown"):
+        return self.this.own(value)
     if (name == "this"):
         if type(value).__name__ == 'SwigPyObject':
             self.__dict__[name] = value
             return
-    method = class_type.__swig_setmethods__.get(name,None)
-    if method: return method(self,value)
+    method = class_type.__swig_setmethods__.get(name, None)
+    if method:
+        return method(self, value)
     if (not static):
-        self.__dict__[name] = value
+        if _newclass:
+            object.__setattr__(self, name, value)
+        else:
+            self.__dict__[name] = value
     else:
         raise AttributeError("You cannot add attributes to %s" % self)
 
-def _swig_setattr(self,class_type,name,value):
-    return _swig_setattr_nondynamic(self,class_type,name,value,0)
 
-def _swig_getattr(self,class_type,name):
-    if (name == "thisown"): return self.this.own()
-    method = class_type.__swig_getmethods__.get(name,None)
-    if method: return method(self)
-    raise AttributeError(name)
+def _swig_setattr(self, class_type, name, value):
+    return _swig_setattr_nondynamic(self, class_type, name, value, 0)
+
+
+def _swig_getattr(self, class_type, name):
+    if (name == "thisown"):
+        return self.this.own()
+    method = class_type.__swig_getmethods__.get(name, None)
+    if method:
+        return method(self)
+    raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name))
+
 
 def _swig_repr(self):
-    try: strthis = "proxy of " + self.this.__repr__()
-    except: strthis = ""
+    try:
+        strthis = "proxy of " + self.this.__repr__()
+    except __builtin__.Exception:
+        strthis = ""
     return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
 
 try:
     _object = object
     _newclass = 1
-except AttributeError:
-    class _object : pass
+except __builtin__.Exception:
+    class _object:
+        pass
     _newclass = 0
 
 
-
 def WebPGetDecoderVersion():
-  """WebPGetDecoderVersion() -> int"""
-  return _libwebp.WebPGetDecoderVersion()
+    """WebPGetDecoderVersion() -> int"""
+    return _libwebp.WebPGetDecoderVersion()
 
-def WebPGetInfo(*args):
-  """WebPGetInfo(uint8_t data) -> (width, height)"""
-  return _libwebp.WebPGetInfo(*args)
+def WebPGetInfo(data):
+    """WebPGetInfo(uint8_t data) -> (width, height)"""
+    return _libwebp.WebPGetInfo(data)
 
-def WebPDecodeRGB(*args):
-  """WebPDecodeRGB(uint8_t data) -> (rgb, width, height)"""
-  return _libwebp.WebPDecodeRGB(*args)
+def WebPDecodeRGB(data):
+    """WebPDecodeRGB(uint8_t data) -> (rgb, width, height)"""
+    return _libwebp.WebPDecodeRGB(data)
 
-def WebPDecodeRGBA(*args):
-  """WebPDecodeRGBA(uint8_t data) -> (rgb, width, height)"""
-  return _libwebp.WebPDecodeRGBA(*args)
+def WebPDecodeRGBA(data):
+    """WebPDecodeRGBA(uint8_t data) -> (rgb, width, height)"""
+    return _libwebp.WebPDecodeRGBA(data)
 
-def WebPDecodeARGB(*args):
-  """WebPDecodeARGB(uint8_t data) -> (rgb, width, height)"""
-  return _libwebp.WebPDecodeARGB(*args)
+def WebPDecodeARGB(data):
+    """WebPDecodeARGB(uint8_t data) -> (rgb, width, height)"""
+    return _libwebp.WebPDecodeARGB(data)
 
-def WebPDecodeBGR(*args):
-  """WebPDecodeBGR(uint8_t data) -> (rgb, width, height)"""
-  return _libwebp.WebPDecodeBGR(*args)
+def WebPDecodeBGR(data):
+    """WebPDecodeBGR(uint8_t data) -> (rgb, width, height)"""
+    return _libwebp.WebPDecodeBGR(data)
 
-def WebPDecodeBGRA(*args):
-  """WebPDecodeBGRA(uint8_t data) -> (rgb, width, height)"""
-  return _libwebp.WebPDecodeBGRA(*args)
+def WebPDecodeBGRA(data):
+    """WebPDecodeBGRA(uint8_t data) -> (rgb, width, height)"""
+    return _libwebp.WebPDecodeBGRA(data)
 
 def WebPGetEncoderVersion():
-  """WebPGetEncoderVersion() -> int"""
-  return _libwebp.WebPGetEncoderVersion()
+    """WebPGetEncoderVersion() -> int"""
+    return _libwebp.WebPGetEncoderVersion()
 
-def wrap_WebPEncodeRGB(*args):
-  """private, do not call directly."""
-  return _libwebp.wrap_WebPEncodeRGB(*args)
+def wrap_WebPEncodeRGB(rgb, unused1, unused2, width, height, stride, quality_factor):
+    """private, do not call directly."""
+    return _libwebp.wrap_WebPEncodeRGB(rgb, unused1, unused2, width, height, stride, quality_factor)
 
-def wrap_WebPEncodeBGR(*args):
-  """private, do not call directly."""
-  return _libwebp.wrap_WebPEncodeBGR(*args)
+def wrap_WebPEncodeBGR(rgb, unused1, unused2, width, height, stride, quality_factor):
+    """private, do not call directly."""
+    return _libwebp.wrap_WebPEncodeBGR(rgb, unused1, unused2, width, height, stride, quality_factor)
 
-def wrap_WebPEncodeRGBA(*args):
-  """private, do not call directly."""
-  return _libwebp.wrap_WebPEncodeRGBA(*args)
+def wrap_WebPEncodeRGBA(rgb, unused1, unused2, width, height, stride, quality_factor):
+    """private, do not call directly."""
+    return _libwebp.wrap_WebPEncodeRGBA(rgb, unused1, unused2, width, height, stride, quality_factor)
 
-def wrap_WebPEncodeBGRA(*args):
-  """private, do not call directly."""
-  return _libwebp.wrap_WebPEncodeBGRA(*args)
+def wrap_WebPEncodeBGRA(rgb, unused1, unused2, width, height, stride, quality_factor):
+    """private, do not call directly."""
+    return _libwebp.wrap_WebPEncodeBGRA(rgb, unused1, unused2, width, height, stride, quality_factor)
 
-def wrap_WebPEncodeLosslessRGB(*args):
-  """private, do not call directly."""
-  return _libwebp.wrap_WebPEncodeLosslessRGB(*args)
+def wrap_WebPEncodeLosslessRGB(rgb, unused1, unused2, width, height, stride):
+    """private, do not call directly."""
+    return _libwebp.wrap_WebPEncodeLosslessRGB(rgb, unused1, unused2, width, height, stride)
 
-def wrap_WebPEncodeLosslessBGR(*args):
-  """private, do not call directly."""
-  return _libwebp.wrap_WebPEncodeLosslessBGR(*args)
+def wrap_WebPEncodeLosslessBGR(rgb, unused1, unused2, width, height, stride):
+    """private, do not call directly."""
+    return _libwebp.wrap_WebPEncodeLosslessBGR(rgb, unused1, unused2, width, height, stride)
 
-def wrap_WebPEncodeLosslessRGBA(*args):
-  """private, do not call directly."""
-  return _libwebp.wrap_WebPEncodeLosslessRGBA(*args)
+def wrap_WebPEncodeLosslessRGBA(rgb, unused1, unused2, width, height, stride):
+    """private, do not call directly."""
+    return _libwebp.wrap_WebPEncodeLosslessRGBA(rgb, unused1, unused2, width, height, stride)
 
-def wrap_WebPEncodeLosslessBGRA(*args):
-  """private, do not call directly."""
-  return _libwebp.wrap_WebPEncodeLosslessBGRA(*args)
+def wrap_WebPEncodeLosslessBGRA(rgb, unused1, unused2, width, height, stride):
+    """private, do not call directly."""
+    return _libwebp.wrap_WebPEncodeLosslessBGRA(rgb, unused1, unused2, width, height, stride)
+
 _UNUSED = 1
 
+
 def WebPEncodeRGB(rgb, width, height, stride, quality_factor):
   """WebPEncodeRGB(uint8_t rgb, int width, int height, int stride, float quality_factor) -> lossy_webp"""
   webp = wrap_WebPEncodeRGB(
@@ -141,6 +171,7 @@
     return None
   return webp[0]
 
+
 def WebPEncodeRGBA(rgb, width, height, stride, quality_factor):
   """WebPEncodeRGBA(uint8_t rgb, int width, int height, int stride, float quality_factor) -> lossy_webp"""
   webp = wrap_WebPEncodeRGBA(
@@ -149,6 +180,7 @@
     return None
   return webp[0]
 
+
 def WebPEncodeBGR(rgb, width, height, stride, quality_factor):
   """WebPEncodeBGR(uint8_t rgb, int width, int height, int stride, float quality_factor) -> lossy_webp"""
   webp = wrap_WebPEncodeBGR(
@@ -157,6 +189,7 @@
     return None
   return webp[0]
 
+
 def WebPEncodeBGRA(rgb, width, height, stride, quality_factor):
   """WebPEncodeBGRA(uint8_t rgb, int width, int height, int stride, float quality_factor) -> lossy_webp"""
   webp = wrap_WebPEncodeBGRA(
@@ -165,6 +198,7 @@
     return None
   return webp[0]
 
+
 def WebPEncodeLosslessRGB(rgb, width, height, stride):
   """WebPEncodeLosslessRGB(uint8_t rgb, int width, int height, int stride) -> lossless_webp"""
   webp = wrap_WebPEncodeLosslessRGB(rgb, _UNUSED, _UNUSED, width, height, stride)
@@ -172,6 +206,7 @@
     return None
   return webp[0]
 
+
 def WebPEncodeLosslessRGBA(rgb, width, height, stride):
   """WebPEncodeLosslessRGBA(uint8_t rgb, int width, int height, int stride) -> lossless_webp"""
   webp = wrap_WebPEncodeLosslessRGBA(rgb, _UNUSED, _UNUSED, width, height, stride)
@@ -179,6 +214,7 @@
     return None
   return webp[0]
 
+
 def WebPEncodeLosslessBGR(rgb, width, height, stride):
   """WebPEncodeLosslessBGR(uint8_t rgb, int width, int height, int stride) -> lossless_webp"""
   webp = wrap_WebPEncodeLosslessBGR(rgb, _UNUSED, _UNUSED, width, height, stride)
@@ -186,6 +222,7 @@
     return None
   return webp[0]
 
+
 def WebPEncodeLosslessBGRA(rgb, width, height, stride):
   """WebPEncodeLosslessBGRA(uint8_t rgb, int width, int height, int stride) -> lossless_webp"""
   webp = wrap_WebPEncodeLosslessBGRA(rgb, _UNUSED, _UNUSED, width, height, stride)
diff --git a/third_party/libwebp/swig/libwebp.swig b/third_party/libwebp/swig/libwebp.swig
index 17748b9..ca38298 100644
--- a/third_party/libwebp/swig/libwebp.swig
+++ b/third_party/libwebp/swig/libwebp.swig
@@ -32,6 +32,9 @@
 
 #ifdef SWIGPYTHON
 %module(package="com.google.webp") libwebp
+%begin %{
+#define SWIG_PYTHON_STRICT_BYTE_CHAR
+%}
 #else
 %module libwebp
 #endif  /* SWIGPYTHON */
diff --git a/third_party/libwebp/swig/libwebp_python_wrap.c b/third_party/libwebp/swig/libwebp_python_wrap.c
index b29f834..3aa2728 100644
--- a/third_party/libwebp/swig/libwebp_python_wrap.c
+++ b/third_party/libwebp/swig/libwebp_python_wrap.c
@@ -1,6 +1,6 @@
 /* ----------------------------------------------------------------------------
  * This file was automatically generated by SWIG (http://www.swig.org).
- * Version 2.0.4
+ * Version 3.0.12
  *
  * This file is not intended to be easily readable and contains a number of
  * coding conventions designed to improve portability and efficiency. Do not make
@@ -8,7 +8,14 @@
  * interface file instead.
  * ----------------------------------------------------------------------------- */
 
+#define SWIG_PYTHON_STRICT_BYTE_CHAR
+
+
+
+#ifndef SWIGPYTHON
 #define SWIGPYTHON
+#endif
+
 #define SWIG_PYTHON_DIRECTOR_NO_VTABLE
 
 /* -----------------------------------------------------------------------------
@@ -78,9 +85,11 @@
 #endif
 
 /* exporting methods */
-#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-#  ifndef GCC_HASCLASSVISIBILITY
-#    define GCC_HASCLASSVISIBILITY
+#if defined(__GNUC__)
+#  if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#    ifndef GCC_HASCLASSVISIBILITY
+#      define GCC_HASCLASSVISIBILITY
+#    endif
 #  endif
 #endif
 
@@ -119,10 +128,29 @@
 # define _SCL_SECURE_NO_DEPRECATE
 #endif
 
+/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */
+#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES)
+# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
+#endif
+
+/* Intel's compiler complains if a variable which was never initialised is
+ * cast to void, which is a common idiom which we use to indicate that we
+ * are aware a variable isn't used.  So we just silence that warning.
+ * See: https://github.com/swig/swig/issues/192 for more discussion.
+ */
+#ifdef __INTEL_COMPILER
+# pragma warning disable 592
+#endif
 
 
-/* Python.h has to appear first */
-#include <Python.h>
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+# undef _DEBUG
+# include <Python.h>
+# define _DEBUG
+#else
+# include <Python.h>
+#endif
 
 /* -----------------------------------------------------------------------------
  * swigrun.swg
@@ -294,7 +322,7 @@
   return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
 }
 #else /* no cast-rank mode */
-#  define SWIG_AddCast
+#  define SWIG_AddCast(r) (r)
 #  define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
 #endif
 
@@ -358,18 +386,18 @@
 
 /*
   Check type equivalence in a name list like <name1>|<name2>|...
-  Return 0 if not equal, 1 if equal
+  Return 0 if equal, -1 if nb < tb, 1 if nb > tb
 */
 SWIGRUNTIME int
-SWIG_TypeEquiv(const char *nb, const char *tb) {
-  int equiv = 0;
+SWIG_TypeCmp(const char *nb, const char *tb) {
+  int equiv = 1;
   const char* te = tb + strlen(tb);
   const char* ne = nb;
-  while (!equiv && *ne) {
+  while (equiv != 0 && *ne) {
     for (nb = ne; *ne; ++ne) {
       if (*ne == '|') break;
     }
-    equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+    equiv = SWIG_TypeNameComp(nb, ne, tb, te);
     if (*ne) ++ne;
   }
   return equiv;
@@ -377,24 +405,13 @@
 
 /*
   Check type equivalence in a name list like <name1>|<name2>|...
-  Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+  Return 0 if not equal, 1 if equal
 */
 SWIGRUNTIME int
-SWIG_TypeCompare(const char *nb, const char *tb) {
-  int equiv = 0;
-  const char* te = tb + strlen(tb);
-  const char* ne = nb;
-  while (!equiv && *ne) {
-    for (nb = ne; *ne; ++ne) {
-      if (*ne == '|') break;
-    }
-    equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
-    if (*ne) ++ne;
-  }
-  return equiv;
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+  return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
 }
 
-
 /*
   Check the typename
 */
@@ -541,14 +558,14 @@
   swig_module_info *iter = start;
   do {
     if (iter->size) {
-      register size_t l = 0;
-      register size_t r = iter->size - 1;
+      size_t l = 0;
+      size_t r = iter->size - 1;
       do {
         /* since l+r >= 0, we can (>> 1) instead (/ 2) */
-        register size_t i = (l + r) >> 1;
+        size_t i = (l + r) >> 1;
         const char *iname = iter->types[i]->name;
         if (iname) {
-          register int compare = strcmp(name, iname);
+          int compare = strcmp(name, iname);
           if (compare == 0) {
             return iter->types[i];
           } else if (compare < 0) {
@@ -592,7 +609,7 @@
        of the str field (the human readable name) */
     swig_module_info *iter = start;
     do {
-      register size_t i = 0;
+      size_t i = 0;
       for (; i < iter->size; ++i) {
         if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name)))
           return iter->types[i];
@@ -611,10 +628,10 @@
 SWIGRUNTIME char *
 SWIG_PackData(char *c, void *ptr, size_t sz) {
   static const char hex[17] = "0123456789abcdef";
-  register const unsigned char *u = (unsigned char *) ptr;
-  register const unsigned char *eu =  u + sz;
+  const unsigned char *u = (unsigned char *) ptr;
+  const unsigned char *eu =  u + sz;
   for (; u != eu; ++u) {
-    register unsigned char uu = *u;
+    unsigned char uu = *u;
     *(c++) = hex[(uu & 0xf0) >> 4];
     *(c++) = hex[uu & 0xf];
   }
@@ -626,22 +643,22 @@
 */
 SWIGRUNTIME const char *
 SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
-  register unsigned char *u = (unsigned char *) ptr;
-  register const unsigned char *eu = u + sz;
+  unsigned char *u = (unsigned char *) ptr;
+  const unsigned char *eu = u + sz;
   for (; u != eu; ++u) {
-    register char d = *(c++);
-    register unsigned char uu;
+    char d = *(c++);
+    unsigned char uu;
     if ((d >= '0') && (d <= '9'))
-      uu = ((d - '0') << 4);
+      uu = (unsigned char)((d - '0') << 4);
     else if ((d >= 'a') && (d <= 'f'))
-      uu = ((d - ('a'-10)) << 4);
+      uu = (unsigned char)((d - ('a'-10)) << 4);
     else
       return (char *) 0;
     d = *(c++);
     if ((d >= '0') && (d <= '9'))
-      uu |= (d - '0');
+      uu |= (unsigned char)(d - '0');
     else if ((d >= 'a') && (d <= 'f'))
-      uu |= (d - ('a'-10));
+      uu |= (unsigned char)(d - ('a'-10));
     else
       return (char *) 0;
     *u = uu;
@@ -732,8 +749,10 @@
 #define PyInt_Check(x) PyLong_Check(x)
 #define PyInt_AsLong(x) PyLong_AsLong(x)
 #define PyInt_FromLong(x) PyLong_FromLong(x)
+#define PyInt_FromSize_t(x) PyLong_FromSize_t(x)
 #define PyString_Check(name) PyBytes_Check(name)
 #define PyString_FromString(x) PyUnicode_FromString(x)
+#define PyString_FromStringAndSize(x, y) PyBytes_FromStringAndSize(x, y)
 #define PyString_Format(fmt, args)  PyUnicode_Format(fmt, args)
 #define PyString_AsString(str) PyBytes_AsString(str)
 #define PyString_Size(str) PyBytes_Size(str)
@@ -823,10 +842,6 @@
 }
 #endif
 
-/* Add PyObject_Del for old Pythons */
-#if PY_VERSION_HEX < 0x01060000
-# define PyObject_Del(op) PyMem_DEL((op))
-#endif
 #ifndef PyObject_DEL
 # define PyObject_DEL PyObject_Del
 #endif
@@ -901,6 +916,10 @@
 }
 #endif
 
+#if PY_VERSION_HEX < 0x02050000
+#define PyInt_FromSize_t(x) PyInt_FromLong((long)x)
+#endif
+
 #if PY_VERSION_HEX < 0x02040000
 #define Py_VISIT(op)                            \
   do {                                          \
@@ -937,6 +956,7 @@
 #if PY_VERSION_HEX < 0x03020000
 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type)
 #define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name)
+#define Py_hash_t long
 #endif
 
 /* -----------------------------------------------------------------------------
@@ -1172,7 +1192,7 @@
 
 /* Runtime API */
 
-#define SWIG_GetModule(clientdata)                      SWIG_Python_GetModule()
+#define SWIG_GetModule(clientdata)                      SWIG_Python_GetModule(clientdata)
 #define SWIG_SetModule(clientdata, pointer)             SWIG_Python_SetModule(pointer)
 #define SWIG_NewClientData(obj)                         SwigPyClientData_New(obj)
 
@@ -1198,7 +1218,7 @@
 SWIGINTERN void
 SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) {
   SWIG_PYTHON_THREAD_BEGIN_BLOCK;
-  PyErr_SetString(errtype, (char *) msg);
+  PyErr_SetString(errtype, msg);
   SWIG_PYTHON_THREAD_END_BLOCK;
 }
 
@@ -1217,7 +1237,11 @@
 
 SWIGINTERN void
 SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) {
+#if PY_VERSION_HEX < 0x02030000
   PyDict_SetItemString(d, (char *)name, obj);
+#else
+  PyDict_SetItemString(d, name, obj);
+#endif
   Py_DECREF(obj);
   if (public_interface)
     SwigPyBuiltin_AddPublicSymbol(public_interface, name);
@@ -1227,7 +1251,11 @@
 
 SWIGINTERN void
 SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) {
+#if PY_VERSION_HEX < 0x02030000
   PyDict_SetItemString(d, (char *)name, obj);
+#else
+  PyDict_SetItemString(d, name, obj);
+#endif
   Py_DECREF(obj);
 }
 
@@ -1280,7 +1308,7 @@
 
 /* Unpack the argument tuple */
 
-SWIGINTERN int
+SWIGINTERN Py_ssize_t
 SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs)
 {
   if (!args) {
@@ -1294,7 +1322,7 @@
   }
   if (!PyTuple_Check(args)) {
     if (min <= 1 && max >= 1) {
-      register int i;
+      Py_ssize_t i;
       objs[0] = args;
       for (i = 1; i < max; ++i) {
         objs[i] = 0;
@@ -1304,7 +1332,7 @@
     PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple");
     return 0;
   } else {
-    register Py_ssize_t l = PyTuple_GET_SIZE(args);
+    Py_ssize_t l = PyTuple_GET_SIZE(args);
     if (l < min) {
       PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d",
                    name, (min == max ? "" : "at least "), (int)min, (int)l);
@@ -1314,7 +1342,7 @@
                    name, (min == max ? "" : "at most "), (int)max, (int)l);
       return 0;
     } else {
-      register int i;
+      Py_ssize_t i;
       for (i = 0; i < l; ++i) {
         objs[i] = PyTuple_GET_ITEM(args, i);
       }
@@ -1500,6 +1528,23 @@
 #endif
 } SwigPyObject;
 
+
+#ifdef SWIGPYTHON_BUILTIN
+
+SWIGRUNTIME PyObject *
+SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args))
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+
+  if (!sobj->dict)
+    sobj->dict = PyDict_New();
+
+  Py_INCREF(sobj->dict);
+  return sobj->dict;
+}
+
+#endif
+
 SWIGRUNTIME PyObject *
 SwigPyObject_long(SwigPyObject *v)
 {
@@ -1548,7 +1593,7 @@
 #endif
 {
   const char *name = SWIG_TypePrettyName(v->ty);
-  PyObject *repr = SWIG_Python_str_FromFormat("<Swig Object of type '%s' at %p>", name, (void *)v);
+  PyObject *repr = SWIG_Python_str_FromFormat("<Swig Object of type '%s' at %p>", (name ? name : "unknown"), (void *)v);
   if (v->next) {
 # ifdef METH_NOARGS
     PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next);
@@ -1567,32 +1612,12 @@
   return repr;
 }
 
-SWIGRUNTIME int
-SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
-{
-  char *str;
-#ifdef METH_NOARGS
-  PyObject *repr = SwigPyObject_repr(v);
-#else
-  PyObject *repr = SwigPyObject_repr(v, NULL);
-#endif
-  if (repr) {
-    str = SWIG_Python_str_AsChar(repr);
-    fputs(str, fp);
-    SWIG_Python_str_DelForPy3(str);
-    Py_DECREF(repr);
-    return 0;
-  } else {
-    return 1;
-  }
-}
-
+/* We need a version taking two PyObject* parameters so it's a valid
+ * PyCFunction to use in swigobject_methods[]. */
 SWIGRUNTIME PyObject *
-SwigPyObject_str(SwigPyObject *v)
+SwigPyObject_repr2(PyObject *v, PyObject *SWIGUNUSEDPARM(args))
 {
-  char result[SWIG_BUFFER_SIZE];
-  return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
-    SWIG_Python_str_FromChar(result) : 0;
+  return SwigPyObject_repr((SwigPyObject*)v);
 }
 
 SWIGRUNTIME int
@@ -1666,6 +1691,17 @@
     if (destroy) {
       /* destroy is always a VARARGS method */
       PyObject *res;
+
+      /* PyObject_CallFunction() has the potential to silently drop
+         the active active exception.  In cases of unnamed temporary
+         variable or where we just finished iterating over a generator
+         StopIteration will be active right now, and this needs to
+         remain true upon return from SwigPyObject_dealloc.  So save
+         and restore. */
+
+      PyObject *val = NULL, *type = NULL, *tb = NULL;
+      PyErr_Fetch(&val, &type, &tb);
+
       if (data->delargs) {
         /* we need to create a temporary object to carry the destroy operation */
         PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0);
@@ -1676,6 +1712,11 @@
         PyObject *mself = PyCFunction_GET_SELF(destroy);
         res = ((*meth)(mself, v));
       }
+      if (!res)
+        PyErr_WriteUnraisable(destroy);
+
+      PyErr_Restore(val, type, tb);
+
       Py_XDECREF(res);
     }
 #if !defined(SWIG_PYTHON_SILENT_MEMLEAK)
@@ -1699,6 +1740,7 @@
   next = tmp;
 #endif
   if (!SwigPyObject_Check(next)) {
+    PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject");
     return NULL;
   }
   sobj->next = next;
@@ -1707,11 +1749,7 @@
 }
 
 SWIGRUNTIME PyObject*
-#ifdef METH_NOARGS
-SwigPyObject_next(PyObject* v)
-#else
 SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
-#endif
 {
   SwigPyObject *sobj = (SwigPyObject *) v;
   if (sobj->next) {
@@ -1746,14 +1784,30 @@
   return SWIG_Py_Void();
 }
 
+#ifdef METH_NOARGS
+static PyObject*
+SwigPyObject_disown2(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+{
+  return SwigPyObject_disown(v);
+}
+
+static PyObject*
+SwigPyObject_acquire2(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+{
+  return SwigPyObject_acquire(v);
+}
+#endif
+
 SWIGINTERN PyObject*
 SwigPyObject_own(PyObject *v, PyObject *args)
 {
   PyObject *val = 0;
 #if (PY_VERSION_HEX < 0x02020000)
   if (!PyArg_ParseTuple(args,(char *)"|O:own",&val))
-#else
+#elif (PY_VERSION_HEX < 0x02050000)
   if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val))
+#else
+  if (!PyArg_UnpackTuple(args, "own", 0, 1, &val))
 #endif
     {
       return NULL;
@@ -1784,23 +1838,23 @@
 #ifdef METH_O
 static PyMethodDef
 swigobject_methods[] = {
-  {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_NOARGS,  (char *)"releases ownership of the pointer"},
-  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS,  (char *)"aquires ownership of the pointer"},
+  {(char *)"disown",  (PyCFunction)SwigPyObject_disown2, METH_NOARGS,  (char *)"releases ownership of the pointer"},
+  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire2,METH_NOARGS,  (char *)"acquires ownership of the pointer"},
   {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
   {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_O,       (char *)"appends another 'this' object"},
   {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_NOARGS,  (char *)"returns the next 'this' object"},
-  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,    METH_NOARGS,  (char *)"returns object representation"},
+  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr2,   METH_NOARGS,  (char *)"returns object representation"},
   {0, 0, 0, 0}
 };
 #else
 static PyMethodDef
 swigobject_methods[] = {
   {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_VARARGS,  (char *)"releases ownership of the pointer"},
-  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS,  (char *)"aquires ownership of the pointer"},
+  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS,  (char *)"acquires ownership of the pointer"},
   {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS,  (char *)"returns/sets ownership of the pointer"},
   {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_VARARGS,  (char *)"appends another 'this' object"},
   {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_VARARGS,  (char *)"returns the next 'this' object"},
-  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,   METH_VARARGS,  (char *)"returns object representation"},
+  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,    METH_VARARGS,  (char *)"returns object representation"},
   {0, 0, 0, 0}
 };
 #endif
@@ -1852,7 +1906,9 @@
     (unaryfunc)SwigPyObject_oct,  /*nb_oct*/
     (unaryfunc)SwigPyObject_hex,  /*nb_hex*/
 #endif
-#if PY_VERSION_HEX >= 0x03000000 /* 3.0 */
+#if PY_VERSION_HEX >= 0x03050000 /* 3.5 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */
+#elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */
     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */
 #elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */
     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */
@@ -1867,7 +1923,6 @@
   static int type_init = 0;
   if (!type_init) {
     const PyTypeObject tmp = {
-      /* PyObject header changed in Python 3 */
 #if PY_VERSION_HEX >= 0x03000000
       PyVarObject_HEAD_INIT(NULL, 0)
 #else
@@ -1878,7 +1933,7 @@
       sizeof(SwigPyObject),                 /* tp_basicsize */
       0,                                    /* tp_itemsize */
       (destructor)SwigPyObject_dealloc,     /* tp_dealloc */
-      (printfunc)SwigPyObject_print,        /* tp_print */
+      0,                                    /* tp_print */
 #if PY_VERSION_HEX < 0x02020000
       (getattrfunc)SwigPyObject_getattr,    /* tp_getattr */
 #else
@@ -1886,7 +1941,7 @@
 #endif
       (setattrfunc)0,                       /* tp_setattr */
 #if PY_VERSION_HEX >= 0x03000000
-    0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */
+      0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */
 #else
       (cmpfunc)SwigPyObject_compare,        /* tp_compare */
 #endif
@@ -1896,7 +1951,7 @@
       0,                                    /* tp_as_mapping */
       (hashfunc)0,                          /* tp_hash */
       (ternaryfunc)0,                       /* tp_call */
-      (reprfunc)SwigPyObject_str,           /* tp_str */
+      0,                                    /* tp_str */
       PyObject_GenericGetAttr,              /* tp_getattro */
       0,                                    /* tp_setattro */
       0,                                    /* tp_as_buffer */
@@ -1932,10 +1987,19 @@
       0,                                    /* tp_del */
 #endif
 #if PY_VERSION_HEX >= 0x02060000
-      0,                                    /* tp_version */
+      0,                                    /* tp_version_tag */
+#endif
+#if PY_VERSION_HEX >= 0x03040000
+      0,                                    /* tp_finalize */
 #endif
 #ifdef COUNT_ALLOCS
-      0,0,0,0                               /* tp_alloc -> tp_next */
+      0,                                    /* tp_allocs */
+      0,                                    /* tp_frees */
+      0,                                    /* tp_maxalloc */
+#if PY_VERSION_HEX >= 0x02050000
+      0,                                    /* tp_prev */
+#endif
+      0                                     /* tp_next */
 #endif
     };
     swigpyobject_type = tmp;
@@ -2050,7 +2114,6 @@
   static int type_init = 0;
   if (!type_init) {
     const PyTypeObject tmp = {
-      /* PyObject header changed in Python 3 */
 #if PY_VERSION_HEX>=0x03000000
       PyVarObject_HEAD_INIT(NULL, 0)
 #else
@@ -2111,10 +2174,19 @@
       0,                                    /* tp_del */
 #endif
 #if PY_VERSION_HEX >= 0x02060000
-      0,                                    /* tp_version */
+      0,                                    /* tp_version_tag */
+#endif
+#if PY_VERSION_HEX >= 0x03040000
+      0,                                    /* tp_finalize */
 #endif
 #ifdef COUNT_ALLOCS
-      0,0,0,0                               /* tp_alloc -> tp_next */
+      0,                                    /* tp_allocs */
+      0,                                    /* tp_frees */
+      0,                                    /* tp_maxalloc */
+#if PY_VERSION_HEX >= 0x02050000
+      0,                                    /* tp_prev */
+#endif
+      0                                     /* tp_next */
 #endif
     };
     swigpypacked_type = tmp;
@@ -2273,10 +2345,11 @@
 SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
   int res;
   SwigPyObject *sobj;
+  int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
 
   if (!obj)
     return SWIG_ERROR;
-  if (obj == Py_None) {
+  if (obj == Py_None && !implicit_conv) {
     if (ptr)
       *ptr = 0;
     return SWIG_OK;
@@ -2325,7 +2398,7 @@
     }
     res = SWIG_OK;
   } else {
-    if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+    if (implicit_conv) {
       SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
       if (data && !data->implicitconv) {
         PyObject *klass = data->klass;
@@ -2360,6 +2433,13 @@
         }
       }
     }
+    if (!SWIG_IsOK(res) && obj == Py_None) {
+      if (ptr)
+        *ptr = 0;
+      if (PyErr_Occurred())
+        PyErr_Clear();
+      res = SWIG_OK;
+    }
   }
   return res;
 }
@@ -2447,24 +2527,30 @@
     }
   } else {
 #if PY_VERSION_HEX >= 0x03000000
-    inst = PyBaseObject_Type.tp_new((PyTypeObject*) data->newargs, Py_None, Py_None);
-    PyObject_SetAttr(inst, SWIG_This(), swig_this);
-    Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
+    inst = ((PyTypeObject*) data->newargs)->tp_new((PyTypeObject*) data->newargs, Py_None, Py_None);
+    if (inst) {
+      PyObject_SetAttr(inst, SWIG_This(), swig_this);
+      Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
+    }
 #else
     PyObject *dict = PyDict_New();
-    PyDict_SetItem(dict, SWIG_This(), swig_this);
-    inst = PyInstance_NewRaw(data->newargs, dict);
-    Py_DECREF(dict);
+    if (dict) {
+      PyDict_SetItem(dict, SWIG_This(), swig_this);
+      inst = PyInstance_NewRaw(data->newargs, dict);
+      Py_DECREF(dict);
+    }
 #endif
   }
   return inst;
 #else
 #if (PY_VERSION_HEX >= 0x02010000)
-  PyObject *inst;
+  PyObject *inst = 0;
   PyObject *dict = PyDict_New();
-  PyDict_SetItem(dict, SWIG_This(), swig_this);
-  inst = PyInstance_NewRaw(data->newargs, dict);
-  Py_DECREF(dict);
+  if (dict) {
+    PyDict_SetItem(dict, SWIG_This(), swig_this);
+    inst = PyInstance_NewRaw(data->newargs, dict);
+    Py_DECREF(dict);
+  }
   return (PyObject *) inst;
 #else
   PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
@@ -2515,7 +2601,7 @@
 SWIGINTERN PyObject *
 SWIG_Python_InitShadowInstance(PyObject *args) {
   PyObject *obj[2];
-  if (!SWIG_Python_UnpackTuple(args,(char*)"swiginit", 2, 2, obj)) {
+  if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) {
     return NULL;
   } else {
     SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]);
@@ -2551,18 +2637,21 @@
           newobj = (SwigPyObject *) newobj->next;
         newobj->next = next_self;
         newobj = (SwigPyObject *)next_self;
+#ifdef SWIGPYTHON_BUILTIN
+        newobj->dict = 0;
+#endif
       }
     } else {
       newobj = PyObject_New(SwigPyObject, clientdata->pytype);
+#ifdef SWIGPYTHON_BUILTIN
+      newobj->dict = 0;
+#endif
     }
     if (newobj) {
       newobj->ptr = ptr;
       newobj->ty = type;
       newobj->own = own;
       newobj->next = 0;
-#ifdef SWIGPYTHON_BUILTIN
-      newobj->dict = 0;
-#endif
       return (PyObject*) newobj;
     }
     return SWIG_Py_Void();
@@ -2571,12 +2660,10 @@
   assert(!(flags & SWIG_BUILTIN_TP_INIT));
 
   robj = SwigPyObject_New(ptr, type, own);
-  if (clientdata && !(flags & SWIG_POINTER_NOSHADOW)) {
+  if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) {
     PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj);
-    if (inst) {
-      Py_DECREF(robj);
-      robj = inst;
-    }
+    Py_DECREF(robj);
+    robj = inst;
   }
   return robj;
 }
@@ -2597,7 +2684,7 @@
 #endif
 
 SWIGRUNTIME swig_module_info *
-SWIG_Python_GetModule(void) {
+SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) {
   static void *type_pointer = (void *)0;
   /* first check if module already created */
   if (!type_pointer) {
@@ -2627,13 +2714,11 @@
 {
   PyObject *dict;
   if (!PyModule_Check(m)) {
-    PyErr_SetString(PyExc_TypeError,
-                    "PyModule_AddObject() needs module as first arg");
+    PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg");
     return SWIG_ERROR;
   }
   if (!o) {
-    PyErr_SetString(PyExc_TypeError,
-                    "PyModule_AddObject() needs non-NULL value");
+    PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value");
     return SWIG_ERROR;
   }
 
@@ -2679,7 +2764,7 @@
 SWIGRUNTIME void
 SWIG_Python_SetModule(swig_module_info *swig_module) {
 #if PY_VERSION_HEX >= 0x03000000
- /* Add a dummy module object into sys.modules */
+ /* Add a placeholder module object into sys.modules */
   PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION);
 #else
   static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */
@@ -2723,7 +2808,7 @@
     descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj);
 #endif
   } else {
-    swig_module_info *swig_module = SWIG_Python_GetModule();
+    swig_module_info *swig_module = SWIG_GetModule(0);
     descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type);
     if (descriptor) {
 #ifdef SWIGPY_USE_CAPSULE
@@ -2791,7 +2876,7 @@
 {
   SwigPyObject *v = (SwigPyObject *)self;
   swig_type_info *ty = v ? v->ty : 0;
-  return ty ? ty->str : (char*)"";
+  return ty ? ty->str : "";
 }
 
 SWIGRUNTIME void
@@ -2848,23 +2933,24 @@
   return result;
 }
 
+#ifdef SWIGPYTHON_BUILTIN
 SWIGRUNTIME int
 SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
   PyTypeObject *tp = obj->ob_type;
   PyObject *descr;
   PyObject *encoded_name;
   descrsetfunc f;
-  int res;
+  int res = -1;
 
-#ifdef Py_USING_UNICODE
+# ifdef Py_USING_UNICODE
   if (PyString_Check(name)) {
     name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL);
     if (!name)
       return -1;
   } else if (!PyUnicode_Check(name))
-#else
+# else
   if (!PyString_Check(name))
-#endif
+# endif
   {
     PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name);
     return -1;
@@ -2877,7 +2963,6 @@
       goto done;
   }
 
-  res = -1;
   descr = _PyType_Lookup(tp, name);
   f = NULL;
   if (descr != NULL)
@@ -2899,6 +2984,7 @@
   Py_DECREF(name);
   return res;
 }
+#endif
 
 
 #ifdef __cplusplus
@@ -2946,7 +3032,7 @@
 #endif
 #define SWIG_name    "_libwebp"
 
-#define SWIGVERSION 0x020004
+#define SWIGVERSION 0x030012
 #define SWIG_VERSION SWIGVERSION
 
 
@@ -2954,13 +3040,10 @@
 #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),(void**)(a))
 
 
-  #define SWIG_From_long   PyInt_FromLong
-
-
-SWIGINTERNINLINE PyObject *
-SWIG_From_int  (int value)
+SWIGINTERNINLINE PyObject*
+  SWIG_From_int  (int value)
 {
-  return SWIG_From_long  (value);
+  return PyInt_FromLong((long) value);
 }
 
 
@@ -2981,13 +3064,18 @@
 SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
 {
 #if PY_VERSION_HEX>=0x03000000
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+  if (PyBytes_Check(obj))
+#else
   if (PyUnicode_Check(obj))
+#endif
 #else
   if (PyString_Check(obj))
 #endif
   {
     char *cstr; Py_ssize_t len;
 #if PY_VERSION_HEX>=0x03000000
+#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
     if (!alloc && cptr) {
         /* We can't allow converting without allocation, since the internal
            representation of string in Python 3 is UCS-2/UCS-4 but we require
@@ -2996,8 +3084,9 @@
         return SWIG_RuntimeError;
     }
     obj = PyUnicode_AsUTF8String(obj);
-    PyBytes_AsStringAndSize(obj, &cstr, &len);
     if(alloc) *alloc = SWIG_NEWOBJ;
+#endif
+    PyBytes_AsStringAndSize(obj, &cstr, &len);
 #else
     PyString_AsStringAndSize(obj, &cstr, &len);
 #endif
@@ -3017,27 +3106,58 @@
 #else
         if (*alloc == SWIG_NEWOBJ)
 #endif
-          {
-            *cptr = (char *)memcpy((char *)malloc((len + 1)*sizeof(char)), cstr, sizeof(char)*(len + 1));
-            *alloc = SWIG_NEWOBJ;
-          }
-        else {
+        {
+          *cptr = (char *)memcpy(malloc((len + 1)*sizeof(char)), cstr, sizeof(char)*(len + 1));
+          *alloc = SWIG_NEWOBJ;
+        } else {
           *cptr = cstr;
           *alloc = SWIG_OLDOBJ;
         }
       } else {
-        #if PY_VERSION_HEX>=0x03000000
-        assert(0); /* Should never reach here in Python 3 */
-        #endif
+#if PY_VERSION_HEX>=0x03000000
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+        *cptr = PyBytes_AsString(obj);
+#else
+        assert(0); /* Should never reach here with Unicode strings in Python 3 */
+#endif
+#else
         *cptr = SWIG_Python_str_AsChar(obj);
+#endif
       }
     }
     if (psize) *psize = len + 1;
-#if PY_VERSION_HEX>=0x03000000
+#if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
     Py_XDECREF(obj);
 #endif
     return SWIG_OK;
   } else {
+#if defined(SWIG_PYTHON_2_UNICODE)
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+#error "Cannot use both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at once"
+#endif
+#if PY_VERSION_HEX<0x03000000
+    if (PyUnicode_Check(obj)) {
+      char *cstr; Py_ssize_t len;
+      if (!alloc && cptr) {
+        return SWIG_RuntimeError;
+      }
+      obj = PyUnicode_AsUTF8String(obj);
+      if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) {
+        if (cptr) {
+          if (alloc) *alloc = SWIG_NEWOBJ;
+          *cptr = (char *)memcpy(malloc((len + 1)*sizeof(char)), cstr, sizeof(char)*(len + 1));
+        }
+        if (psize) *psize = len + 1;
+
+        Py_XDECREF(obj);
+        return SWIG_OK;
+      } else {
+        Py_XDECREF(obj);
+      }
+    }
+#endif
+#endif
+
     swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
     if (pchar_descriptor) {
       void* vptr = 0;
@@ -3060,9 +3180,11 @@
   if (PyFloat_Check(obj)) {
     if (val) *val = PyFloat_AsDouble(obj);
     return SWIG_OK;
+#if PY_VERSION_HEX < 0x03000000
   } else if (PyInt_Check(obj)) {
-    if (val) *val = PyInt_AsLong(obj);
+    if (val) *val = (double) PyInt_AsLong(obj);
     return SWIG_OK;
+#endif
   } else if (PyLong_Check(obj)) {
     double v = PyLong_AsDouble(obj);
     if (!PyErr_Occurred()) {
@@ -3136,6 +3258,7 @@
 SWIGINTERN int
 SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
 {
+#if PY_VERSION_HEX < 0x03000000
   if (PyInt_Check(obj)) {
     long v = PyInt_AsLong(obj);
     if (v >= 0) {
@@ -3144,13 +3267,16 @@
     } else {
       return SWIG_OverflowError;
     }
-  } else if (PyLong_Check(obj)) {
+  } else
+#endif
+  if (PyLong_Check(obj)) {
     unsigned long v = PyLong_AsUnsignedLong(obj);
     if (!PyErr_Occurred()) {
       if (val) *val = v;
       return SWIG_OK;
     } else {
       PyErr_Clear();
+      return SWIG_OverflowError;
     }
   }
 #ifdef SWIG_PYTHON_CAST_MODE
@@ -3177,12 +3303,79 @@
 }
 
 
+#include <limits.h>
+#if !defined(SWIG_NO_LLONG_MAX)
+# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
+#   define LLONG_MAX __LONG_LONG_MAX__
+#   define LLONG_MIN (-LLONG_MAX - 1LL)
+#   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
+# endif
+#endif
+
+
+#if defined(LLONG_MAX) && !defined(SWIG_LONG_LONG_AVAILABLE)
+#  define SWIG_LONG_LONG_AVAILABLE
+#endif
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERN int
+SWIG_AsVal_unsigned_SS_long_SS_long (PyObject *obj, unsigned long long *val)
+{
+  int res = SWIG_TypeError;
+  if (PyLong_Check(obj)) {
+    unsigned long long v = PyLong_AsUnsignedLongLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+      res = SWIG_OverflowError;
+    }
+  } else {
+    unsigned long v;
+    res = SWIG_AsVal_unsigned_SS_long (obj,&v);
+    if (SWIG_IsOK(res)) {
+      if (val) *val = v;
+      return res;
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    const double mant_max = 1LL << DBL_MANT_DIG;
+    double d;
+    res = SWIG_AsVal_double (obj,&d);
+    if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, 0, mant_max))
+      return SWIG_OverflowError;
+    if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) {
+      if (val) *val = (unsigned long long)(d);
+      return SWIG_AddCast(res);
+    }
+    res = SWIG_TypeError;
+  }
+#endif
+  return res;
+}
+#endif
+
+
 SWIGINTERNINLINE int
 SWIG_AsVal_size_t (PyObject * obj, size_t *val)
 {
-  unsigned long v;
-  int res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0);
-  if (SWIG_IsOK(res) && val) *val = (size_t)(v);
+  int res = SWIG_TypeError;
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(size_t) <= sizeof(unsigned long)) {
+#endif
+    unsigned long v;
+    res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = (size_t)(v);
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else if (sizeof(size_t) <= sizeof(unsigned long long)) {
+    unsigned long long v;
+    res = SWIG_AsVal_unsigned_SS_long_SS_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = (size_t)(v);
+  }
+#endif
   return res;
 }
 
@@ -3316,29 +3509,23 @@
 
 
 
-#include <limits.h>
-#if !defined(SWIG_NO_LLONG_MAX)
-# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
-#   define LLONG_MAX __LONG_LONG_MAX__
-#   define LLONG_MIN (-LLONG_MAX - 1LL)
-#   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
-# endif
-#endif
-
-
 SWIGINTERN int
 SWIG_AsVal_long (PyObject *obj, long* val)
 {
+#if PY_VERSION_HEX < 0x03000000
   if (PyInt_Check(obj)) {
     if (val) *val = PyInt_AsLong(obj);
     return SWIG_OK;
-  } else if (PyLong_Check(obj)) {
+  } else
+#endif
+  if (PyLong_Check(obj)) {
     long v = PyLong_AsLong(obj);
     if (!PyErr_Occurred()) {
       if (val) *val = v;
       return SWIG_OK;
     } else {
       PyErr_Clear();
+      return SWIG_OverflowError;
     }
   }
 #ifdef SWIG_PYTHON_CAST_MODE
@@ -3381,13 +3568,51 @@
 }
 
 
+/* Getting isfinite working pre C99 across multiple platforms is non-trivial. Users can provide SWIG_isfinite on older platforms. */
+#ifndef SWIG_isfinite
+/* isfinite() is a macro for C99 */
+# if defined(isfinite)
+#  define SWIG_isfinite(X) (isfinite(X))
+# elif defined __cplusplus && __cplusplus >= 201103L
+/* Use a template so that this works whether isfinite() is std::isfinite() or
+ * in the global namespace.  The reality seems to vary between compiler
+ * versions.
+ *
+ * Make sure namespace std exists to avoid compiler warnings.
+ *
+ * extern "C++" is required as this fragment can end up inside an extern "C" { } block
+ */
+namespace std { }
+extern "C++" template<typename T>
+inline int SWIG_isfinite_func(T x) {
+  using namespace std;
+  return isfinite(x);
+}
+#  define SWIG_isfinite(X) (SWIG_isfinite_func(X))
+# elif defined(_MSC_VER)
+#  define SWIG_isfinite(X) (_finite(X))
+# elif defined(__sun) && defined(__SVR4)
+#  include <ieeefp.h>
+#  define SWIG_isfinite(X) (finite(X))
+# endif
+#endif
+
+
+/* Accept infinite as a valid float value unless we are unable to check if a value is finite */
+#ifdef SWIG_isfinite
+# define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX) && SWIG_isfinite(X))
+#else
+# define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX))
+#endif
+
+
 SWIGINTERN int
 SWIG_AsVal_float (PyObject * obj, float *val)
 {
   double v;
   int res = SWIG_AsVal_double (obj, &v);
   if (SWIG_IsOK(res)) {
-    if ((v < -FLT_MAX || v > FLT_MAX)) {
+    if (SWIG_Float_Overflow_Check(v)) {
       return SWIG_OverflowError;
     } else {
       if (val) *val = (float)(v);
@@ -4663,23 +4888,23 @@
 
 
 static PyMethodDef SwigMethods[] = {
-         { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL},
-         { (char *)"WebPGetDecoderVersion", _wrap_WebPGetDecoderVersion, METH_VARARGS, (char *)"WebPGetDecoderVersion() -> int"},
-         { (char *)"WebPGetInfo", _wrap_WebPGetInfo, METH_VARARGS, (char *)"WebPGetInfo(uint8_t data) -> (width, height)"},
-         { (char *)"WebPDecodeRGB", _wrap_WebPDecodeRGB, METH_VARARGS, (char *)"WebPDecodeRGB(uint8_t data) -> (rgb, width, height)"},
-         { (char *)"WebPDecodeRGBA", _wrap_WebPDecodeRGBA, METH_VARARGS, (char *)"WebPDecodeRGBA(uint8_t data) -> (rgb, width, height)"},
-         { (char *)"WebPDecodeARGB", _wrap_WebPDecodeARGB, METH_VARARGS, (char *)"WebPDecodeARGB(uint8_t data) -> (rgb, width, height)"},
-         { (char *)"WebPDecodeBGR", _wrap_WebPDecodeBGR, METH_VARARGS, (char *)"WebPDecodeBGR(uint8_t data) -> (rgb, width, height)"},
-         { (char *)"WebPDecodeBGRA", _wrap_WebPDecodeBGRA, METH_VARARGS, (char *)"WebPDecodeBGRA(uint8_t data) -> (rgb, width, height)"},
-         { (char *)"WebPGetEncoderVersion", _wrap_WebPGetEncoderVersion, METH_VARARGS, (char *)"WebPGetEncoderVersion() -> int"},
-         { (char *)"wrap_WebPEncodeRGB", _wrap_wrap_WebPEncodeRGB, METH_VARARGS, (char *)"private, do not call directly."},
-         { (char *)"wrap_WebPEncodeBGR", _wrap_wrap_WebPEncodeBGR, METH_VARARGS, (char *)"private, do not call directly."},
-         { (char *)"wrap_WebPEncodeRGBA", _wrap_wrap_WebPEncodeRGBA, METH_VARARGS, (char *)"private, do not call directly."},
-         { (char *)"wrap_WebPEncodeBGRA", _wrap_wrap_WebPEncodeBGRA, METH_VARARGS, (char *)"private, do not call directly."},
-         { (char *)"wrap_WebPEncodeLosslessRGB", _wrap_wrap_WebPEncodeLosslessRGB, METH_VARARGS, (char *)"private, do not call directly."},
-         { (char *)"wrap_WebPEncodeLosslessBGR", _wrap_wrap_WebPEncodeLosslessBGR, METH_VARARGS, (char *)"private, do not call directly."},
-         { (char *)"wrap_WebPEncodeLosslessRGBA", _wrap_wrap_WebPEncodeLosslessRGBA, METH_VARARGS, (char *)"private, do not call directly."},
-         { (char *)"wrap_WebPEncodeLosslessBGRA", _wrap_wrap_WebPEncodeLosslessBGRA, METH_VARARGS, (char *)"private, do not call directly."},
+         { "SWIG_PyInstanceMethod_New", SWIG_PyInstanceMethod_New, METH_O, NULL},
+         { "WebPGetDecoderVersion", _wrap_WebPGetDecoderVersion, METH_VARARGS, (char *)"WebPGetDecoderVersion() -> int"},
+         { "WebPGetInfo", _wrap_WebPGetInfo, METH_VARARGS, (char *)"WebPGetInfo(uint8_t data) -> (width, height)"},
+         { "WebPDecodeRGB", _wrap_WebPDecodeRGB, METH_VARARGS, (char *)"WebPDecodeRGB(uint8_t data) -> (rgb, width, height)"},
+         { "WebPDecodeRGBA", _wrap_WebPDecodeRGBA, METH_VARARGS, (char *)"WebPDecodeRGBA(uint8_t data) -> (rgb, width, height)"},
+         { "WebPDecodeARGB", _wrap_WebPDecodeARGB, METH_VARARGS, (char *)"WebPDecodeARGB(uint8_t data) -> (rgb, width, height)"},
+         { "WebPDecodeBGR", _wrap_WebPDecodeBGR, METH_VARARGS, (char *)"WebPDecodeBGR(uint8_t data) -> (rgb, width, height)"},
+         { "WebPDecodeBGRA", _wrap_WebPDecodeBGRA, METH_VARARGS, (char *)"WebPDecodeBGRA(uint8_t data) -> (rgb, width, height)"},
+         { "WebPGetEncoderVersion", _wrap_WebPGetEncoderVersion, METH_VARARGS, (char *)"WebPGetEncoderVersion() -> int"},
+         { "wrap_WebPEncodeRGB", _wrap_wrap_WebPEncodeRGB, METH_VARARGS, (char *)"private, do not call directly."},
+         { "wrap_WebPEncodeBGR", _wrap_wrap_WebPEncodeBGR, METH_VARARGS, (char *)"private, do not call directly."},
+         { "wrap_WebPEncodeRGBA", _wrap_wrap_WebPEncodeRGBA, METH_VARARGS, (char *)"private, do not call directly."},
+         { "wrap_WebPEncodeBGRA", _wrap_wrap_WebPEncodeBGRA, METH_VARARGS, (char *)"private, do not call directly."},
+         { "wrap_WebPEncodeLosslessRGB", _wrap_wrap_WebPEncodeLosslessRGB, METH_VARARGS, (char *)"private, do not call directly."},
+         { "wrap_WebPEncodeLosslessBGR", _wrap_wrap_WebPEncodeLosslessBGR, METH_VARARGS, (char *)"private, do not call directly."},
+         { "wrap_WebPEncodeLosslessRGBA", _wrap_wrap_WebPEncodeLosslessRGBA, METH_VARARGS, (char *)"private, do not call directly."},
+         { "wrap_WebPEncodeLosslessBGRA", _wrap_wrap_WebPEncodeLosslessBGRA, METH_VARARGS, (char *)"private, do not call directly."},
          { NULL, NULL, 0, NULL }
 };
 
@@ -4728,7 +4953,7 @@
  * array with the correct data and linking the correct swig_cast_info
  * structures together.
  *
- * The generated swig_type_info structures are assigned staticly to an initial
+ * The generated swig_type_info structures are assigned statically to an initial
  * array. We just loop through that array, and handle each type individually.
  * First we lookup if this type has been already loaded, and if so, use the
  * loaded structure instead of the generated one. Then we have to fill in the
@@ -4772,9 +4997,7 @@
 SWIG_InitializeModule(void *clientdata) {
   size_t i;
   swig_module_info *module_head, *iter;
-  int found, init;
-
-  clientdata = clientdata;
+  int init;
 
   /* check to see if the circular list has been setup, if not, set it up */
   if (swig_module.next==0) {
@@ -4793,27 +5016,23 @@
     /* This is the first module loaded for this interpreter */
     /* so set the swig module into the interpreter */
     SWIG_SetModule(clientdata, &swig_module);
-    module_head = &swig_module;
   } else {
     /* the interpreter has loaded a SWIG module, but has it loaded this one? */
-    found=0;
     iter=module_head;
     do {
       if (iter==&swig_module) {
-        found=1;
-        break;
+        /* Our module is already in the list, so there's nothing more to do. */
+        return;
       }
       iter=iter->next;
     } while (iter!= module_head);
 
-    /* if the is found in the list, then all is done and we may leave */
-    if (found) return;
-    /* otherwise we must add out module into the list */
+    /* otherwise we must add our module into the list */
     swig_module.next = module_head->next;
     module_head->next = &swig_module;
   }
 
-  /* When multiple interpeters are used, a module could have already been initialized in
+  /* When multiple interpreters are used, a module could have already been initialized in
        a different interpreter, but not yet have a pointer in this interpreter.
        In this case, we do not want to continue adding types... everything should be
        set up already */
@@ -5060,7 +5279,7 @@
       var = var->next;
     }
     if (res == NULL && !PyErr_Occurred()) {
-      PyErr_SetString(PyExc_NameError,"Unknown C global variable");
+      PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n);
     }
     return res;
   }
@@ -5077,7 +5296,7 @@
       var = var->next;
     }
     if (res == 1 && !PyErr_Occurred()) {
-      PyErr_SetString(PyExc_NameError,"Unknown C global variable");
+      PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n);
     }
     return res;
   }
@@ -5089,7 +5308,6 @@
     static int type_init = 0;
     if (!type_init) {
       const PyTypeObject tmp = {
-        /* PyObject header changed in Python 3 */
 #if PY_VERSION_HEX >= 0x03000000
         PyVarObject_HEAD_INIT(NULL, 0)
 #else
@@ -5127,10 +5345,19 @@
         0,                                  /* tp_del */
 #endif
 #if PY_VERSION_HEX >= 0x02060000
-        0,                                  /* tp_version */
+        0,                                  /* tp_version_tag */
+#endif
+#if PY_VERSION_HEX >= 0x03040000
+        0,                                  /* tp_finalize */
 #endif
 #ifdef COUNT_ALLOCS
-        0,0,0,0                             /* tp_alloc -> tp_next */
+        0,                                  /* tp_allocs */
+        0,                                  /* tp_frees */
+        0,                                  /* tp_maxalloc */
+#if PY_VERSION_HEX >= 0x02050000
+        0,                                  /* tp_prev */
+#endif
+        0                                   /* tp_next */
 #endif
       };
       varlink_type = tmp;
@@ -5219,7 +5446,9 @@
     size_t i;
     for (i = 0; methods[i].ml_name; ++i) {
       const char *c = methods[i].ml_doc;
-      if (c && (c = strstr(c, "swig_ptr: "))) {
+      if (!c) continue;
+      c = strstr(c, "swig_ptr: ");
+      if (c) {
         int j;
         swig_const_info *ci = 0;
         const char *name = c + 10;
@@ -5240,9 +5469,9 @@
             char *ndoc = (char*)malloc(ldoc + lptr + 10);
             if (ndoc) {
               char *buff = ndoc;
-              strncpy(buff, methods[i].ml_doc, ldoc);
+              memcpy(buff, methods[i].ml_doc, ldoc);
               buff += ldoc;
-              strncpy(buff, "swig_ptr: ", 10);
+              memcpy(buff, "swig_ptr: ", 10);
               buff += 10;
               SWIG_PackVoidPtr(buff, ptr, ty->name, lptr);
               methods[i].ml_doc = ndoc;
@@ -5304,23 +5533,24 @@
     (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL
   };
   static SwigPyGetSet thisown_getset_closure = {
-    (PyCFunction) SwigPyObject_own,
-    (PyCFunction) SwigPyObject_own
+    SwigPyObject_own,
+    SwigPyObject_own
   };
   static PyGetSetDef thisown_getset_def = {
     (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure
   };
-  PyObject *metatype_args;
   PyTypeObject *builtin_pytype;
   int builtin_base_count;
   swig_type_info *builtin_basetype;
   PyObject *tuple;
   PyGetSetDescrObject *static_getset;
   PyTypeObject *metatype;
+  PyTypeObject *swigpyobject;
   SwigPyClientData *cd;
   PyObject *public_interface, *public_symbol;
   PyObject *this_descr;
   PyObject *thisown_descr;
+  PyObject *self = 0;
   int i;
 
   (void)builtin_pytype;
@@ -5328,15 +5558,11 @@
   (void)builtin_basetype;
   (void)tuple;
   (void)static_getset;
+  (void)self;
 
-  /* metatype is used to implement static member variables. */
-  metatype_args = Py_BuildValue("(s(O){})", "SwigPyObjectType", &PyType_Type);
-  assert(metatype_args);
-  metatype = (PyTypeObject *) PyType_Type.tp_call((PyObject *) &PyType_Type, metatype_args, NULL);
+  /* Metaclass is used to implement static member variables */
+  metatype = SwigPyObjectType();
   assert(metatype);
-  Py_DECREF(metatype_args);
-  metatype->tp_setattro = (setattrofunc) &SwigPyObjectType_setattro;
-  assert(PyType_Ready(metatype) >= 0);
 #endif
 
   /* Fix SwigMethods to carry the callback ptrs when needed */
@@ -5347,18 +5573,22 @@
 #else
   m = Py_InitModule((char *) SWIG_name, SwigMethods);
 #endif
+
   md = d = PyModule_GetDict(m);
+  (void)md;
 
   SWIG_InitializeModule(0);
 
 #ifdef SWIGPYTHON_BUILTIN
+  swigpyobject = SwigPyObject_TypeOnce();
+
   SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject");
   assert(SwigPyObject_stype);
   cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
   if (!cd) {
     SwigPyObject_stype->clientdata = &SwigPyObject_clientdata;
-    SwigPyObject_clientdata.pytype = SwigPyObject_TypeOnce();
-  } else if (SwigPyObject_TypeOnce()->tp_basicsize != cd->pytype->tp_basicsize) {
+    SwigPyObject_clientdata.pytype = swigpyobject;
+  } else if (swigpyobject->tp_basicsize != cd->pytype->tp_basicsize) {
     PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules.");
 # if PY_VERSION_HEX >= 0x03000000
     return NULL;
diff --git a/third_party/libwebp/tests/README.md b/third_party/libwebp/tests/README.md
new file mode 100644
index 0000000..91daba2
--- /dev/null
+++ b/third_party/libwebp/tests/README.md
@@ -0,0 +1,18 @@
+# Tests
+
+This is a collection of tests for the libwebp libraries, currently covering
+fuzzing through the APIs. Additional test vector coverage can be found at:
+https://chromium.googlesource.com/webm/libwebp-test-data
+
+## Building
+
+### Fuzzers
+
+Follow the [build instructions](../doc/building.md) for libwebp, optionally
+adding build flags for various sanitizers (e.g., -fsanitize=address).
+
+`fuzzer/makefile.unix` can then be used to compile the fuzzer targets:
+
+```shell
+$ make -C fuzzer -f makefile.unix
+```
diff --git a/third_party/libwebp/tests/fuzzer/advanced_api_fuzzer.c b/third_party/libwebp/tests/fuzzer/advanced_api_fuzzer.c
new file mode 100644
index 0000000..c8fb176
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/advanced_api_fuzzer.c
@@ -0,0 +1,139 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include <stdint.h>
+#include <string.h>
+
+#include "./fuzz_utils.h"
+#include "src/utils/rescaler_utils.h"
+#include "src/webp/decode.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
+  WebPDecoderConfig config;
+  if (!WebPInitDecoderConfig(&config)) return 0;
+  if (WebPGetFeatures(data, size, &config.input) != VP8_STATUS_OK) return 0;
+  if ((size_t)config.input.width * config.input.height > kFuzzPxLimit) return 0;
+
+  // Using two independent criteria ensures that all combinations of options
+  // can reach each path at the decoding stage, with meaningful differences.
+
+  const uint8_t value = FuzzHash(data, size);
+  const float factor = value / 255.f;  // 0-1
+
+  config.options.flip = value & 1;
+  config.options.bypass_filtering = value & 2;
+  config.options.no_fancy_upsampling = value & 4;
+  config.options.use_threads = value & 8;
+  if (size & 1) {
+    config.options.use_cropping = 1;
+    config.options.crop_width = (int)(config.input.width * (1 - factor));
+    config.options.crop_height = (int)(config.input.height * (1 - factor));
+    config.options.crop_left = config.input.width - config.options.crop_width;
+    config.options.crop_top = config.input.height - config.options.crop_height;
+  }
+  if (size & 2) {
+    int strength = (int)(factor * 100);
+    config.options.dithering_strength = strength;
+    config.options.alpha_dithering_strength = 100 - strength;
+  }
+  if (size & 4) {
+    config.options.use_scaling = 1;
+    config.options.scaled_width = (int)(config.input.width * factor * 2);
+    config.options.scaled_height = (int)(config.input.height * factor * 2);
+  }
+
+#if defined(WEBP_REDUCE_CSP)
+  config.output.colorspace = (value & 1)
+                                 ? ((value & 2) ? MODE_RGBA : MODE_BGRA)
+                                 : ((value & 2) ? MODE_rgbA : MODE_bgrA);
+#else
+  config.output.colorspace = (WEBP_CSP_MODE)(value % MODE_LAST);
+#endif  // WEBP_REDUCE_CSP
+
+  for (int i = 0; i < 2; ++i) {
+    if (i == 1) {
+      // Use the bitstream data to generate extreme ranges for the options. An
+      // alternative approach would be to use a custom corpus containing webp
+      // files prepended with sizeof(config.options) zeroes to allow the fuzzer
+      // to modify these independently.
+      const int data_offset = 50;
+      if (data_offset + sizeof(config.options) >= size) break;
+      memcpy(&config.options, data + data_offset, sizeof(config.options));
+
+      // Skip easily avoidable out-of-memory fuzzing errors.
+      if (config.options.use_scaling) {
+        int scaled_width = config.options.scaled_width;
+        int scaled_height = config.options.scaled_height;
+        if (WebPRescalerGetScaledDimensions(config.input.width,
+                                            config.input.height, &scaled_width,
+                                            &scaled_height)) {
+          size_t fuzz_px_limit = kFuzzPxLimit;
+          if (scaled_width != config.input.width ||
+              scaled_height != config.input.height) {
+            // Using the WebPRescalerImport internally can significantly slow
+            // down the execution. Avoid timeouts due to that.
+            fuzz_px_limit /= 2;
+          }
+          // A big output canvas can lead to out-of-memory and timeout issues,
+          // but a big internal working buffer can too. Also, rescaling from a
+          // very wide input image to a very tall canvas can be as slow as
+          // decoding a huge number of pixels. Avoid timeouts due to these.
+          const uint64_t max_num_operations =
+              (uint64_t)Max(scaled_width, config.input.width) *
+              Max(scaled_height, config.input.height);
+          if (max_num_operations > fuzz_px_limit) {
+            break;
+          }
+        }
+      }
+    }
+    if (size % 3) {
+      // Decodes incrementally in chunks of increasing size.
+      WebPIDecoder* idec = WebPIDecode(NULL, 0, &config);
+      if (!idec) return 0;
+      VP8StatusCode status;
+      if (size & 8) {
+        size_t available_size = value + 1;
+        while (1) {
+          if (available_size > size) available_size = size;
+          status = WebPIUpdate(idec, data, available_size);
+          if (status != VP8_STATUS_SUSPENDED || available_size == size) break;
+          available_size *= 2;
+        }
+      } else {
+        // WebPIAppend expects new data and its size with each call.
+        // Implemented here by simply advancing the pointer into data.
+        const uint8_t* new_data = data;
+        size_t new_size = value + 1;
+        while (1) {
+          if (new_data + new_size > data + size) {
+            new_size = data + size - new_data;
+          }
+          status = WebPIAppend(idec, new_data, new_size);
+          if (status != VP8_STATUS_SUSPENDED || new_size == 0) break;
+          new_data += new_size;
+          new_size *= 2;
+        }
+      }
+      WebPIDelete(idec);
+    } else {
+      WebPDecode(data, size, &config);
+    }
+
+    WebPFreeDecBuffer(&config.output);
+  }
+  return 0;
+}
diff --git a/third_party/libwebp/tests/fuzzer/animation_api_fuzzer.c b/third_party/libwebp/tests/fuzzer/animation_api_fuzzer.c
new file mode 100644
index 0000000..187ed24
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/animation_api_fuzzer.c
@@ -0,0 +1,78 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "./fuzz_utils.h"
+#include "src/webp/decode.h"
+#include "src/webp/demux.h"
+#include "src/webp/mux_types.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
+  WebPData webp_data;
+  WebPDataInit(&webp_data);
+  webp_data.size = size;
+  webp_data.bytes = data;
+
+  // WebPAnimDecoderNew uses WebPDemux internally to calloc canvas size.
+  WebPDemuxer* const demux = WebPDemux(&webp_data);
+  if (!demux) return 0;
+  const uint32_t cw = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
+  const uint32_t ch = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
+  if ((size_t)cw * ch > kFuzzPxLimit) {
+    WebPDemuxDelete(demux);
+    return 0;
+  }
+
+  // In addition to canvas size, check each frame separately.
+  WebPIterator iter;
+  for (int i = 0; i < kFuzzFrameLimit; i++) {
+    if (!WebPDemuxGetFrame(demux, i + 1, &iter)) break;
+    int w, h;
+    if (WebPGetInfo(iter.fragment.bytes, iter.fragment.size, &w, &h)) {
+      if ((size_t)w * h > kFuzzPxLimit) {  // image size of the frame payload
+        WebPDemuxReleaseIterator(&iter);
+        WebPDemuxDelete(demux);
+        return 0;
+      }
+    }
+  }
+
+  WebPDemuxReleaseIterator(&iter);
+  WebPDemuxDelete(demux);
+
+  WebPAnimDecoderOptions dec_options;
+  if (!WebPAnimDecoderOptionsInit(&dec_options)) return 0;
+
+  dec_options.use_threads = size & 1;
+  // Animations only support 4 (of 12) modes.
+  dec_options.color_mode = (WEBP_CSP_MODE)(size % MODE_LAST);
+  if (dec_options.color_mode != MODE_BGRA &&
+      dec_options.color_mode != MODE_rgbA &&
+      dec_options.color_mode != MODE_bgrA) {
+    dec_options.color_mode = MODE_RGBA;
+  }
+
+  WebPAnimDecoder* dec = WebPAnimDecoderNew(&webp_data, &dec_options);
+  if (!dec) return 0;
+
+  for (int i = 0; i < kFuzzFrameLimit; i++) {
+    uint8_t* buf;
+    int timestamp;
+    if (!WebPAnimDecoderGetNext(dec, &buf, &timestamp)) break;
+  }
+
+  WebPAnimDecoderDelete(dec);
+  return 0;
+}
diff --git a/third_party/libwebp/tests/fuzzer/animdecoder_fuzzer.cc b/third_party/libwebp/tests/fuzzer/animdecoder_fuzzer.cc
new file mode 100644
index 0000000..a79712d
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/animdecoder_fuzzer.cc
@@ -0,0 +1,52 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "examples/anim_util.h"
+#include "imageio/imageio_util.h"
+#include "src/webp/demux.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+  // WebPAnimDecoderGetInfo() is too late to check the canvas size as
+  // WebPAnimDecoderNew() will handle the allocations.
+  WebPBitstreamFeatures features;
+  if (WebPGetFeatures(data, size, &features) == VP8_STATUS_OK) {
+    if (!ImgIoUtilCheckSizeArgumentsOverflow(features.width * 4,
+                                             features.height)) {
+      return 0;
+    }
+  }
+
+  // decode everything as an animation
+  WebPData webp_data = { data, size };
+  WebPAnimDecoder* const dec = WebPAnimDecoderNew(&webp_data, NULL);
+  if (dec == NULL) return 0;
+
+  WebPAnimInfo info;
+  if (!WebPAnimDecoderGetInfo(dec, &info)) goto End;
+  if (!ImgIoUtilCheckSizeArgumentsOverflow(info.canvas_width * 4,
+                                           info.canvas_height)) {
+    goto End;
+  }
+
+  while (WebPAnimDecoderHasMoreFrames(dec)) {
+    uint8_t* buf;
+    int timestamp;
+    if (!WebPAnimDecoderGetNext(dec, &buf, &timestamp)) break;
+  }
+ End:
+  WebPAnimDecoderDelete(dec);
+  return 0;
+}
diff --git a/third_party/libwebp/tests/fuzzer/animencoder_fuzzer.cc b/third_party/libwebp/tests/fuzzer/animencoder_fuzzer.cc
new file mode 100644
index 0000000..1bd7871
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/animencoder_fuzzer.cc
@@ -0,0 +1,177 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "./fuzz_utils.h"
+#include "src/webp/encode.h"
+#include "src/webp/mux.h"
+
+namespace {
+
+const VP8CPUInfo default_VP8GetCPUInfo = VP8GetCPUInfo;
+
+int AddFrame(WebPAnimEncoder** const enc,
+             const WebPAnimEncoderOptions& anim_config, int* const width,
+             int* const height, int timestamp_ms, const uint8_t data[],
+             size_t size, uint32_t* const bit_pos) {
+  if (enc == nullptr || width == nullptr || height == nullptr) {
+    fprintf(stderr, "NULL parameters.\n");
+    if (enc != nullptr) WebPAnimEncoderDelete(*enc);
+    abort();
+  }
+
+  // Init the source picture.
+  WebPPicture pic;
+  if (!WebPPictureInit(&pic)) {
+    fprintf(stderr, "WebPPictureInit failed.\n");
+    WebPAnimEncoderDelete(*enc);
+    abort();
+  }
+  pic.use_argb = Extract(1, data, size, bit_pos);
+
+  // Read the source picture.
+  if (!ExtractSourcePicture(&pic, data, size, bit_pos)) {
+    const WebPEncodingError error_code = pic.error_code;
+    WebPPictureFree(&pic);
+    if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0;
+    fprintf(stderr, "Can't read input image. Error code: %d\n", error_code);
+    abort();
+  }
+
+  // Crop and scale.
+  if (*enc == nullptr) {  // First frame will set canvas width and height.
+    if (!ExtractAndCropOrScale(&pic, data, size, bit_pos)) {
+      const WebPEncodingError error_code = pic.error_code;
+      WebPPictureFree(&pic);
+      if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0;
+      fprintf(stderr, "ExtractAndCropOrScale failed. Error code: %d\n",
+              error_code);
+      abort();
+    }
+  } else {  // Other frames will be resized to the first frame's dimensions.
+    if (!WebPPictureRescale(&pic, *width, *height)) {
+      const WebPEncodingError error_code = pic.error_code;
+      WebPAnimEncoderDelete(*enc);
+      WebPPictureFree(&pic);
+      if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0;
+      fprintf(stderr,
+              "WebPPictureRescale failed. Size: %d,%d. Error code: %d\n",
+              *width, *height, error_code);
+      abort();
+    }
+  }
+
+  // Create encoder if it doesn't exist.
+  if (*enc == nullptr) {
+    *width = pic.width;
+    *height = pic.height;
+    *enc = WebPAnimEncoderNew(*width, *height, &anim_config);
+    if (*enc == nullptr) {
+      WebPPictureFree(&pic);
+      return 0;
+    }
+  }
+
+  // Create frame encoding config.
+  WebPConfig config;
+  if (!ExtractWebPConfig(&config, data, size, bit_pos)) {
+    fprintf(stderr, "ExtractWebPConfig failed.\n");
+    WebPAnimEncoderDelete(*enc);
+    WebPPictureFree(&pic);
+    abort();
+  }
+  // Skip slow settings on big images, it's likely to timeout.
+  if (pic.width * pic.height > 32 * 32) {
+    config.method = (config.method > 4) ? 4 : config.method;
+    config.quality = (config.quality > 99.0f) ? 99.0f : config.quality;
+    config.alpha_quality =
+        (config.alpha_quality > 99) ? 99 : config.alpha_quality;
+  }
+
+  // Encode.
+  if (!WebPAnimEncoderAdd(*enc, &pic, timestamp_ms, &config)) {
+    const WebPEncodingError error_code = pic.error_code;
+    WebPAnimEncoderDelete(*enc);
+    WebPPictureFree(&pic);
+    if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0;
+    fprintf(stderr, "WebPEncode failed. Error code: %d\n", error_code);
+    abort();
+  }
+
+  WebPPictureFree(&pic);
+  return 1;
+}
+
+}  // namespace
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
+  WebPAnimEncoder* enc = nullptr;
+  int width = 0, height = 0, timestamp_ms = 0;
+  uint32_t bit_pos = 0;
+
+  ExtractAndDisableOptimizations(default_VP8GetCPUInfo, data, size, &bit_pos);
+
+  // Extract a configuration from the packed bits.
+  WebPAnimEncoderOptions anim_config;
+  if (!WebPAnimEncoderOptionsInit(&anim_config)) {
+    fprintf(stderr, "WebPAnimEncoderOptionsInit failed.\n");
+    abort();
+  }
+  anim_config.minimize_size = Extract(1, data, size, &bit_pos);
+  anim_config.kmax = Extract(15, data, size, &bit_pos);
+  const int min_kmin = (anim_config.kmax > 1) ? (anim_config.kmax / 2) : 0;
+  const int max_kmin = (anim_config.kmax > 1) ? (anim_config.kmax - 1) : 0;
+  anim_config.kmin =
+      min_kmin + Extract((uint32_t)(max_kmin - min_kmin), data, size, &bit_pos);
+  anim_config.allow_mixed = Extract(1, data, size, &bit_pos);
+  anim_config.verbose = 0;
+
+  const int nb_frames = 1 + Extract(15, data, size, &bit_pos);
+
+  // For each frame.
+  for (int i = 0; i < nb_frames; ++i) {
+    if (!AddFrame(&enc, anim_config, &width, &height, timestamp_ms, data, size,
+                  &bit_pos)) {
+      return 0;
+    }
+
+    timestamp_ms += (1 << (2 + Extract(15, data, size, &bit_pos))) +
+                    Extract(1, data, size, &bit_pos);  // [1..131073], arbitrary
+  }
+
+  // Assemble.
+  if (!WebPAnimEncoderAdd(enc, nullptr, timestamp_ms, nullptr)) {
+    fprintf(stderr, "Last WebPAnimEncoderAdd failed: %s.\n",
+            WebPAnimEncoderGetError(enc));
+    WebPAnimEncoderDelete(enc);
+    abort();
+  }
+  WebPData webp_data;
+  WebPDataInit(&webp_data);
+  if (!WebPAnimEncoderAssemble(enc, &webp_data)) {
+    fprintf(stderr, "WebPAnimEncoderAssemble failed: %s.\n",
+            WebPAnimEncoderGetError(enc));
+    WebPAnimEncoderDelete(enc);
+    WebPDataClear(&webp_data);
+    abort();
+  }
+
+  WebPAnimEncoderDelete(enc);
+  WebPDataClear(&webp_data);
+  return 0;
+}
diff --git a/third_party/libwebp/tests/fuzzer/enc_dec_fuzzer.cc b/third_party/libwebp/tests/fuzzer/enc_dec_fuzzer.cc
new file mode 100644
index 0000000..187b516
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/enc_dec_fuzzer.cc
@@ -0,0 +1,141 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "./fuzz_utils.h"
+#include "src/webp/decode.h"
+#include "src/webp/encode.h"
+
+namespace {
+
+const VP8CPUInfo default_VP8GetCPUInfo = VP8GetCPUInfo;
+
+}  // namespace
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
+  uint32_t bit_pos = 0;
+
+  ExtractAndDisableOptimizations(default_VP8GetCPUInfo, data, size, &bit_pos);
+
+  // Init the source picture.
+  WebPPicture pic;
+  if (!WebPPictureInit(&pic)) {
+    fprintf(stderr, "WebPPictureInit failed.\n");
+    abort();
+  }
+  pic.use_argb = Extract(1, data, size, &bit_pos);
+
+  // Read the source picture.
+  if (!ExtractSourcePicture(&pic, data, size, &bit_pos)) {
+    const WebPEncodingError error_code = pic.error_code;
+    WebPPictureFree(&pic);
+    if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0;
+    fprintf(stderr, "Can't read input image. Error code: %d\n", error_code);
+    abort();
+  }
+
+  // Crop and scale.
+  if (!ExtractAndCropOrScale(&pic, data, size, &bit_pos)) {
+    const WebPEncodingError error_code = pic.error_code;
+    WebPPictureFree(&pic);
+    if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0;
+    fprintf(stderr, "ExtractAndCropOrScale failed. Error code: %d\n",
+            error_code);
+    abort();
+  }
+
+  // Extract a configuration from the packed bits.
+  WebPConfig config;
+  if (!ExtractWebPConfig(&config, data, size, &bit_pos)) {
+    fprintf(stderr, "ExtractWebPConfig failed.\n");
+    abort();
+  }
+  // Skip slow settings on big images, it's likely to timeout.
+  if (pic.width * pic.height > 32 * 32) {
+    if (config.lossless) {
+      if (config.quality > 99.0f && config.method >= 5) {
+        config.quality = 99.0f;
+        config.method = 5;
+      }
+    } else {
+      if (config.quality > 99.0f && config.method == 6) {
+        config.quality = 99.0f;
+      }
+    }
+    if (config.alpha_quality == 100 && config.method == 6) {
+      config.alpha_quality = 99;
+    }
+  }
+
+  // Encode.
+  WebPMemoryWriter memory_writer;
+  WebPMemoryWriterInit(&memory_writer);
+  pic.writer = WebPMemoryWrite;
+  pic.custom_ptr = &memory_writer;
+  if (!WebPEncode(&config, &pic)) {
+    const WebPEncodingError error_code = pic.error_code;
+    WebPMemoryWriterClear(&memory_writer);
+    WebPPictureFree(&pic);
+    if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0;
+    fprintf(stderr, "WebPEncode failed. Error code: %d\n", error_code);
+    abort();
+  }
+
+  // Try decoding the result.
+  int w, h;
+  const uint8_t* const out_data = memory_writer.mem;
+  const size_t out_size = memory_writer.size;
+  uint8_t* const rgba = WebPDecodeBGRA(out_data, out_size, &w, &h);
+  if (rgba == nullptr || w != pic.width || h != pic.height) {
+    fprintf(stderr, "WebPDecodeBGRA failed.\n");
+    WebPFree(rgba);
+    WebPMemoryWriterClear(&memory_writer);
+    WebPPictureFree(&pic);
+    abort();
+  }
+
+  // Compare the results if exact encoding.
+  if (pic.use_argb && config.lossless && config.near_lossless == 100) {
+    const uint32_t* src1 = (const uint32_t*)rgba;
+    const uint32_t* src2 = pic.argb;
+    for (int y = 0; y < h; ++y, src1 += w, src2 += pic.argb_stride) {
+      for (int x = 0; x < w; ++x) {
+        uint32_t v1 = src1[x], v2 = src2[x];
+        if (!config.exact) {
+          if ((v1 & 0xff000000u) == 0 || (v2 & 0xff000000u) == 0) {
+            // Only keep alpha for comparison of fully transparent area.
+            v1 &= 0xff000000u;
+            v2 &= 0xff000000u;
+          }
+        }
+        if (v1 != v2) {
+          fprintf(stderr, "Lossless compression failed pixel-exactness.\n");
+          WebPFree(rgba);
+          WebPMemoryWriterClear(&memory_writer);
+          WebPPictureFree(&pic);
+          abort();
+        }
+      }
+    }
+  }
+
+  WebPFree(rgba);
+  WebPMemoryWriterClear(&memory_writer);
+  WebPPictureFree(&pic);
+  return 0;
+}
diff --git a/third_party/libwebp/tests/fuzzer/fuzz.dict b/third_party/libwebp/tests/fuzzer/fuzz.dict
new file mode 100644
index 0000000..627c72e
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/fuzz.dict
@@ -0,0 +1,17 @@
+# https://developers.google.com/speed/webp/docs/riff_container
+
+# FourCC
+"ALPH"
+"ANIM"
+"ANMF"
+"EXIF"
+"ICCP"
+"RIFF"
+"VP8 "
+"VP8L"
+"VP8X"
+"WEBP"
+"XMP "
+
+# VP8 signature
+"\x9D\x01\x2A"
diff --git a/third_party/libwebp/tests/fuzzer/fuzz_utils.h b/third_party/libwebp/tests/fuzzer/fuzz_utils.h
new file mode 100644
index 0000000..c3fc366
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/fuzz_utils.h
@@ -0,0 +1,223 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef WEBP_TESTS_FUZZER_FUZZ_UTILS_H_
+#define WEBP_TESTS_FUZZER_FUZZ_UTILS_H_
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "./img_alpha.h"
+#include "./img_grid.h"
+#include "./img_peak.h"
+#include "src/dsp/dsp.h"
+#include "src/webp/encode.h"
+
+//------------------------------------------------------------------------------
+// Arbitrary limits to prevent OOM, timeout, or slow execution.
+
+// The decoded image size, and for animations additionally the canvas size.
+// Enabling some sanitizers slow down runtime significantly.
+// Use a very low threshold in this case to avoid timeouts.
+#if defined(__SANITIZE_ADDRESS__)  // GCC
+static const size_t kFuzzPxLimit = 1024 * 1024 / 10;
+#elif !defined(__has_feature)  // Clang
+static const size_t kFuzzPxLimit = 1024 * 1024;
+#elif __has_feature(address_sanitizer) || __has_feature(memory_sanitizer)
+static const size_t kFuzzPxLimit = 1024 * 1024 / 18;
+#else
+static const size_t kFuzzPxLimit = 1024 * 1024;
+#endif
+
+// Demuxed or decoded animation frames.
+static const int kFuzzFrameLimit = 3;
+
+// Reads and sums (up to) 128 spread-out bytes.
+static WEBP_INLINE uint8_t FuzzHash(const uint8_t* const data, size_t size) {
+  uint8_t value = 0;
+  size_t incr = size / 128;
+  if (!incr) incr = 1;
+  for (size_t i = 0; i < size; i += incr) value += data[i];
+  return value;
+}
+
+//------------------------------------------------------------------------------
+// Extract an integer in [0, max_value].
+
+static WEBP_INLINE uint32_t Extract(uint32_t max_value,
+                                    const uint8_t data[], size_t size,
+                                    uint32_t* const bit_pos) {
+  uint32_t v = 0;
+  uint32_t range = 1;
+  while (*bit_pos < 8 * size && range <= max_value) {
+    const uint8_t mask = 1u << (*bit_pos & 7);
+    v = (v << 1) | !!(data[*bit_pos >> 3] & mask);
+    range <<= 1;
+    ++*bit_pos;
+  }
+  return v % (max_value + 1);
+}
+
+//------------------------------------------------------------------------------
+// Some functions to override VP8GetCPUInfo and disable some optimizations.
+
+#ifdef __cplusplus
+extern "C" VP8CPUInfo VP8GetCPUInfo;
+#else
+extern VP8CPUInfo VP8GetCPUInfo;
+#endif
+static VP8CPUInfo GetCPUInfo;
+
+static WEBP_INLINE int GetCPUInfoNoSSE41(CPUFeature feature) {
+  if (feature == kSSE4_1 || feature == kAVX) return 0;
+  return GetCPUInfo(feature);
+}
+
+static WEBP_INLINE int GetCPUInfoNoAVX(CPUFeature feature) {
+  if (feature == kAVX) return 0;
+  return GetCPUInfo(feature);
+}
+
+static WEBP_INLINE int GetCPUInfoForceSlowSSSE3(CPUFeature feature) {
+  if (feature == kSlowSSSE3 && GetCPUInfo(kSSE3)) {
+    return 1;  // we have SSE3 -> force SlowSSSE3
+  }
+  return GetCPUInfo(feature);
+}
+
+static WEBP_INLINE int GetCPUInfoOnlyC(CPUFeature feature) {
+  (void)feature;
+  return 0;
+}
+
+static WEBP_INLINE void ExtractAndDisableOptimizations(
+    VP8CPUInfo default_VP8GetCPUInfo, const uint8_t data[], size_t size,
+    uint32_t* const bit_pos) {
+  GetCPUInfo = default_VP8GetCPUInfo;
+  const VP8CPUInfo kVP8CPUInfos[5] = {GetCPUInfoOnlyC, GetCPUInfoForceSlowSSSE3,
+                                      GetCPUInfoNoSSE41, GetCPUInfoNoAVX,
+                                      GetCPUInfo};
+  int VP8GetCPUInfo_index = Extract(4, data, size, bit_pos);
+  VP8GetCPUInfo = kVP8CPUInfos[VP8GetCPUInfo_index];
+}
+
+//------------------------------------------------------------------------------
+
+static WEBP_INLINE int ExtractWebPConfig(WebPConfig* const config,
+                                         const uint8_t data[], size_t size,
+                                         uint32_t* const bit_pos) {
+  if (config == NULL || !WebPConfigInit(config)) return 0;
+  config->lossless = Extract(1, data, size, bit_pos);
+  config->quality = Extract(100, data, size, bit_pos);
+  config->method = Extract(6, data, size, bit_pos);
+  config->image_hint =
+      (WebPImageHint)Extract(WEBP_HINT_LAST - 1, data, size, bit_pos);
+  config->segments = 1 + Extract(3, data, size, bit_pos);
+  config->sns_strength = Extract(100, data, size, bit_pos);
+  config->filter_strength = Extract(100, data, size, bit_pos);
+  config->filter_sharpness = Extract(7, data, size, bit_pos);
+  config->filter_type = Extract(1, data, size, bit_pos);
+  config->autofilter = Extract(1, data, size, bit_pos);
+  config->alpha_compression = Extract(1, data, size, bit_pos);
+  config->alpha_filtering = Extract(2, data, size, bit_pos);
+  config->alpha_quality = Extract(100, data, size, bit_pos);
+  config->pass = 1 + Extract(9, data, size, bit_pos);
+  config->show_compressed = 1;
+  config->preprocessing = Extract(2, data, size, bit_pos);
+  config->partitions = Extract(3, data, size, bit_pos);
+  config->partition_limit = 10 * Extract(10, data, size, bit_pos);
+  config->emulate_jpeg_size = Extract(1, data, size, bit_pos);
+  config->thread_level = Extract(1, data, size, bit_pos);
+  config->low_memory = Extract(1, data, size, bit_pos);
+  config->near_lossless = 20 * Extract(5, data, size, bit_pos);
+  config->exact = Extract(1, data, size, bit_pos);
+  config->use_delta_palette = Extract(1, data, size, bit_pos);
+  config->use_sharp_yuv = Extract(1, data, size, bit_pos);
+  return WebPValidateConfig(config);
+}
+
+//------------------------------------------------------------------------------
+
+static WEBP_INLINE int ExtractSourcePicture(WebPPicture* const pic,
+                                            const uint8_t data[], size_t size,
+                                            uint32_t* const bit_pos) {
+  if (pic == NULL) return 0;
+
+  // Pick a source picture.
+  const uint8_t* kImagesData[] = {
+      kImgAlphaData,
+      kImgGridData,
+      kImgPeakData
+  };
+  const int kImagesWidth[] = {
+      kImgAlphaWidth,
+      kImgGridWidth,
+      kImgPeakWidth
+  };
+  const int kImagesHeight[] = {
+      kImgAlphaHeight,
+      kImgGridHeight,
+      kImgPeakHeight
+  };
+  const size_t kNbImages = sizeof(kImagesData) / sizeof(kImagesData[0]);
+  const size_t image_index = Extract(kNbImages - 1, data, size, bit_pos);
+  const uint8_t* const image_data = kImagesData[image_index];
+  pic->width = kImagesWidth[image_index];
+  pic->height = kImagesHeight[image_index];
+  pic->argb_stride = pic->width * 4 * sizeof(uint8_t);
+
+  // Read the bytes.
+  return WebPPictureImportRGBA(pic, image_data, pic->argb_stride);
+}
+
+//------------------------------------------------------------------------------
+
+static WEBP_INLINE int Max(int a, int b) { return ((a < b) ? b : a); }
+
+static WEBP_INLINE int ExtractAndCropOrScale(WebPPicture* const pic,
+                                             const uint8_t data[], size_t size,
+                                             uint32_t* const bit_pos) {
+  if (pic == NULL) return 0;
+#if !defined(WEBP_REDUCE_SIZE)
+  const int alter_input = Extract(1, data, size, bit_pos);
+  const int crop_or_scale = Extract(1, data, size, bit_pos);
+  const int width_ratio = 1 + Extract(7, data, size, bit_pos);
+  const int height_ratio = 1 + Extract(7, data, size, bit_pos);
+  if (alter_input) {
+    if (crop_or_scale) {
+      const uint32_t left_ratio = 1 + Extract(7, data, size, bit_pos);
+      const uint32_t top_ratio = 1 + Extract(7, data, size, bit_pos);
+      const int cropped_width = Max(1, pic->width / width_ratio);
+      const int cropped_height = Max(1, pic->height / height_ratio);
+      const int cropped_left = (pic->width - cropped_width) / left_ratio;
+      const int cropped_top = (pic->height - cropped_height) / top_ratio;
+      return WebPPictureCrop(pic, cropped_left, cropped_top, cropped_width,
+                             cropped_height);
+    } else {
+      const int scaled_width = 1 + (pic->width * width_ratio) / 8;
+      const int scaled_height = 1 + (pic->height * height_ratio) / 8;
+      return WebPPictureRescale(pic, scaled_width, scaled_height);
+    }
+  }
+#else   // defined(WEBP_REDUCE_SIZE)
+  (void)data;
+  (void)size;
+  (void)bit_pos;
+#endif  // !defined(WEBP_REDUCE_SIZE)
+  return 1;
+}
+
+#endif  // WEBP_TESTS_FUZZER_FUZZ_UTILS_H_
diff --git a/third_party/libwebp/tests/fuzzer/img_alpha.h b/third_party/libwebp/tests/fuzzer/img_alpha.h
new file mode 100644
index 0000000..fac63fe
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/img_alpha.h
@@ -0,0 +1,381 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef WEBP_TESTS_FUZZER_IMG_ALPHA_H_
+#define WEBP_TESTS_FUZZER_IMG_ALPHA_H_
+
+#include <stdint.h>
+
+static const int kImgAlphaWidth = 32;
+static const int kImgAlphaHeight = 32;
+
+/*Pixel format: Red: 8 bit, Green: 8 bit, Blue: 8 bit, Fix 0xFF: 8 bit*/
+static const uint8_t kImgAlphaData[] = {
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfd, 0xff, 0xfe, 0xfd, 0xfc, 0xff,
+    0xfe, 0xfd, 0xfb, 0xff, 0xfe, 0xfc, 0xfb, 0xff, 0xfe, 0xfc, 0xfa, 0xff,
+    0xfe, 0xfc, 0xf9, 0xff, 0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf7, 0xff,
+    0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfa, 0xf6, 0xff, 0xfe, 0xf9, 0xf5, 0xff,
+    0xfd, 0xf9, 0xf3, 0xff, 0xfd, 0xf8, 0xf2, 0xff, 0xfd, 0xf7, 0xf1, 0xff,
+    0xfc, 0xf7, 0xf0, 0xff, 0xfc, 0xf6, 0xef, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff,
+    0xfe, 0xfe, 0xfd, 0xff, 0xfe, 0xfd, 0xfc, 0xff, 0xfe, 0xfd, 0xfb, 0xff,
+    0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfb, 0xf9, 0xff,
+    0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfa, 0xf7, 0xff,
+    0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfd, 0xf9, 0xf4, 0xff,
+    0xfd, 0xf8, 0xf2, 0xff, 0xfc, 0xf7, 0xf1, 0xff, 0xfc, 0xf7, 0xf0, 0xff,
+    0xfc, 0xf7, 0xef, 0xff, 0xfc, 0xf6, 0xee, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfd, 0xff, 0xfe, 0xfd, 0xfd, 0xff,
+    0xfe, 0xfd, 0xfc, 0xff, 0xfe, 0xfd, 0xfb, 0xff, 0xfe, 0xfc, 0xfa, 0xff,
+    0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xf9, 0xff, 0xfe, 0xfb, 0xf8, 0xff,
+    0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfb, 0xf6, 0xff, 0xfe, 0xfa, 0xf5, 0xff,
+    0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xf9, 0xf4, 0xff, 0xfe, 0xf8, 0xf3, 0xff,
+    0xfd, 0xf8, 0xf2, 0xff, 0xfc, 0xf7, 0xf1, 0xff, 0xfc, 0xf5, 0xf0, 0xff,
+    0xfc, 0xf6, 0xee, 0xff, 0xfc, 0xf5, 0xed, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xff,
+    0xfc, 0xfb, 0xfb, 0xff, 0xfd, 0xfc, 0xfc, 0xff, 0xfe, 0xfd, 0xfb, 0xff,
+    0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xf9, 0xff,
+    0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf7, 0xff,
+    0xfe, 0xfb, 0xf6, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfa, 0xf5, 0xff,
+    0xfe, 0xf9, 0xf4, 0xff, 0xfe, 0xf9, 0xf3, 0xff, 0xfe, 0xf8, 0xf2, 0xff,
+    0xfd, 0xf7, 0xf1, 0xff, 0xfc, 0xf6, 0xf0, 0xff, 0xfc, 0xf6, 0xee, 0xff,
+    0xfc, 0xf5, 0xec, 0xff, 0xfb, 0xf5, 0xec, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xfb, 0xfb, 0xfb, 0xff,
+    0xfa, 0xf9, 0xf9, 0xff, 0xf7, 0xf6, 0xf6, 0xff, 0xfd, 0xfc, 0xfa, 0xff,
+    0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xf9, 0xff, 0xfe, 0xfb, 0xf9, 0xff,
+    0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfb, 0xf6, 0xff,
+    0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfa, 0xf3, 0xff,
+    0xfe, 0xfa, 0xf4, 0xfb, 0xfe, 0xf9, 0xf4, 0xeb, 0xfe, 0xfb, 0xf6, 0xdc,
+    0xfd, 0xfa, 0xf6, 0xcf, 0xfd, 0xfa, 0xf5, 0xcc, 0xfc, 0xf9, 0xf4, 0xcb,
+    0xfd, 0xf8, 0xf3, 0xc7, 0xfc, 0xf8, 0xf2, 0xc7,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xff,
+    0xfb, 0xfa, 0xfa, 0xff, 0xf8, 0xf7, 0xf7, 0xff, 0xf6, 0xf4, 0xf4, 0xff,
+    0xf7, 0xf5, 0xf5, 0xff, 0xf5, 0xf5, 0xf4, 0xff, 0xf8, 0xf7, 0xf7, 0xff,
+    0xfd, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf7, 0xff,
+    0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfa, 0xf6, 0xff, 0xfe, 0xfa, 0xf5, 0xff,
+    0xfe, 0xfa, 0xf4, 0xff, 0xfd, 0xfa, 0xf4, 0xfc, 0xfe, 0xfc, 0xf9, 0xcf,
+    0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xa8, 0xff, 0xff, 0xff, 0xa4,
+    0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0x94,
+    0xff, 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0x8b,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xfd, 0xfc, 0xfc, 0xff, 0xfa, 0xf9, 0xf9, 0xff,
+    0xf6, 0xf5, 0xf4, 0xff, 0xf5, 0xf3, 0xf3, 0xff, 0xf4, 0xf2, 0xf1, 0xff,
+    0xf2, 0xf1, 0xf0, 0xff, 0xf2, 0xf0, 0xf0, 0xff, 0xf0, 0xee, 0xee, 0xff,
+    0xf1, 0xf0, 0xef, 0xff, 0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf6, 0xff,
+    0xfe, 0xfa, 0xf6, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfb, 0xf4, 0xff,
+    0xfe, 0xfb, 0xf5, 0xf3, 0xff, 0xfe, 0xfe, 0xb4, 0xff, 0xff, 0xff, 0xac,
+    0xff, 0xff, 0xff, 0xa7, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xff, 0xff, 0x9c,
+    0xff, 0xff, 0xff, 0x98, 0xff, 0xff, 0xff, 0x93, 0xff, 0xff, 0xff, 0x8f,
+    0xff, 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0x84,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff,
+    0xfc, 0xfb, 0xfb, 0xff, 0xf9, 0xf8, 0xf8, 0xff, 0xf6, 0xf5, 0xf4, 0xff,
+    0xf3, 0xf1, 0xf1, 0xff, 0xf0, 0xed, 0xed, 0xff, 0xef, 0xec, 0xeb, 0xff,
+    0xee, 0xeb, 0xeb, 0xff, 0xf0, 0xee, 0xee, 0xff, 0xea, 0xe7, 0xe7, 0xff,
+    0xec, 0xe9, 0xe9, 0xff, 0xf5, 0xf2, 0xf0, 0xff, 0xfe, 0xfb, 0xf6, 0xff,
+    0xfe, 0xfb, 0xf5, 0xff, 0xfe, 0xfa, 0xf4, 0xff, 0xfe, 0xfb, 0xf6, 0xeb,
+    0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xab, 0xff, 0xff, 0xff, 0xa4,
+    0xff, 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0x97,
+    0xff, 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, 0x87,
+    0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0x7c,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xfd, 0xfc, 0xfc, 0xff, 0xfb, 0xfb, 0xfa, 0xff,
+    0xf8, 0xf6, 0xf6, 0xff, 0xf4, 0xf3, 0xf2, 0xff, 0xf2, 0xf0, 0xf0, 0xff,
+    0xef, 0xec, 0xeb, 0xff, 0xef, 0xec, 0xeb, 0xff, 0xeb, 0xe7, 0xe6, 0xff,
+    0xea, 0xe6, 0xe5, 0xff, 0xeb, 0xe8, 0xe8, 0xff, 0xe9, 0xe6, 0xe7, 0xff,
+    0xe5, 0xe2, 0xe2, 0xff, 0xed, 0xeb, 0xeb, 0xff, 0xf7, 0xf5, 0xf2, 0xff,
+    0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfb, 0xf5, 0xf8, 0xff, 0xff, 0xff, 0xac,
+    0xff, 0xff, 0xff, 0xa8, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xff, 0xff, 0x9f,
+    0xff, 0xff, 0xff, 0x98, 0xff, 0xff, 0xff, 0x94, 0xff, 0xff, 0xff, 0x8f,
+    0xff, 0xff, 0xff, 0x8b, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0x80,
+    0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, 0x77,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xfc, 0xfc, 0xfc, 0xff, 0xf8, 0xf7, 0xf7, 0xff, 0xf6, 0xf5, 0xf4, 0xff,
+    0xf3, 0xf1, 0xf0, 0xff, 0xf1, 0xef, 0xef, 0xff, 0xef, 0xed, 0xec, 0xff,
+    0xec, 0xe8, 0xe7, 0xff, 0xe9, 0xe6, 0xe6, 0xff, 0xec, 0xe9, 0xe9, 0xff,
+    0xe4, 0xe0, 0xdf, 0xff, 0xec, 0xe9, 0xe9, 0xff, 0xea, 0xe6, 0xe6, 0xff,
+    0xe6, 0xe2, 0xe2, 0xff, 0xea, 0xe8, 0xe8, 0xff, 0xec, 0xe8, 0xe7, 0xff,
+    0xfc, 0xf9, 0xf4, 0xff, 0xfe, 0xfd, 0xfa, 0xc3, 0xff, 0xff, 0xff, 0xa7,
+    0xff, 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0x9c, 0xff, 0xff, 0xff, 0x97,
+    0xff, 0xff, 0xff, 0x93, 0xff, 0xff, 0xff, 0x8c, 0xfe, 0xfc, 0xf9, 0xa3,
+    0xfc, 0xfb, 0xf5, 0xb0, 0xfc, 0xf9, 0xf1, 0xbb, 0xfb, 0xf8, 0xf1, 0xb8,
+    0xfb, 0xf8, 0xef, 0xb4, 0xfb, 0xf9, 0xf2, 0xa4,
+    0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfc, 0xfc, 0xfc, 0xff,
+    0xf8, 0xf7, 0xf7, 0xff, 0xf5, 0xf3, 0xf3, 0xff, 0xf1, 0xef, 0xef, 0xff,
+    0xef, 0xec, 0xeb, 0xff, 0xeb, 0xe7, 0xe7, 0xff, 0xea, 0xe7, 0xe6, 0xff,
+    0xe7, 0xe3, 0xe2, 0xff, 0xe4, 0xdf, 0xde, 0xff, 0xe6, 0xe2, 0xe2, 0xff,
+    0xe4, 0xe1, 0xe0, 0xff, 0xe6, 0xe3, 0xe2, 0xff, 0xe0, 0xdc, 0xdc, 0xff,
+    0xe3, 0xdf, 0xdf, 0xff, 0xe8, 0xe5, 0xe5, 0xff, 0xe4, 0xe1, 0xe2, 0xff,
+    0xec, 0xe8, 0xe5, 0xf8, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, 0xa0,
+    0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0x97, 0xff, 0xff, 0xff, 0x90,
+    0xfe, 0xfe, 0xfb, 0x9c, 0xfc, 0xf9, 0xef, 0xf7, 0xfc, 0xf8, 0xed, 0xff,
+    0xfc, 0xf7, 0xeb, 0xff, 0xfb, 0xf7, 0xeb, 0xff, 0xfa, 0xf6, 0xe9, 0xff,
+    0xfa, 0xf5, 0xe7, 0xff, 0xf8, 0xf4, 0xe5, 0xff,
+    0xfd, 0xfd, 0xfd, 0xff, 0xfa, 0xfa, 0xfa, 0xff, 0xfc, 0xfc, 0xfc, 0xff,
+    0xf8, 0xf7, 0xf7, 0xff, 0xf1, 0xef, 0xee, 0xff, 0xed, 0xea, 0xe9, 0xff,
+    0xea, 0xe6, 0xe5, 0xff, 0xe7, 0xe3, 0xe2, 0xff, 0xe4, 0xe0, 0xdf, 0xff,
+    0xe3, 0xde, 0xdd, 0xff, 0xe2, 0xde, 0xdd, 0xff, 0xe5, 0xe1, 0xe1, 0xff,
+    0xde, 0xda, 0xda, 0xff, 0xe0, 0xdd, 0xdc, 0xff, 0xe1, 0xdd, 0xdd, 0xff,
+    0xe3, 0xe0, 0xdf, 0xff, 0xe4, 0xe1, 0xe1, 0xff, 0xe3, 0xe0, 0xe0, 0xff,
+    0xec, 0xea, 0xea, 0xe8, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0x98,
+    0xff, 0xff, 0xff, 0x93, 0xff, 0xff, 0xff, 0x8f, 0xfe, 0xfe, 0xfe, 0x8c,
+    0xfd, 0xfb, 0xef, 0xff, 0xfd, 0xfb, 0xed, 0xff, 0xfd, 0xf8, 0xec, 0xff,
+    0xfc, 0xf8, 0xeb, 0xff, 0xfc, 0xf7, 0xea, 0xff, 0xfb, 0xf6, 0xe9, 0xff,
+    0xfa, 0xf6, 0xe7, 0xff, 0xfa, 0xf5, 0xe5, 0xff,
+    0xfa, 0xfa, 0xfa, 0xff, 0xf8, 0xf7, 0xf8, 0xff, 0xf6, 0xf6, 0xf6, 0xff,
+    0xf1, 0xf0, 0xf0, 0xff, 0xed, 0xec, 0xec, 0xff, 0xe9, 0xe6, 0xe5, 0xff,
+    0xe6, 0xe1, 0xe0, 0xff, 0xe2, 0xde, 0xdc, 0xff, 0xe0, 0xda, 0xd8, 0xff,
+    0xdd, 0xd7, 0xd5, 0xff, 0xde, 0xda, 0xd9, 0xff, 0xde, 0xda, 0xda, 0xff,
+    0xdc, 0xd7, 0xd8, 0xff, 0xdf, 0xdc, 0xdc, 0xff, 0xe5, 0xe3, 0xe4, 0xff,
+    0xe1, 0xde, 0xde, 0xff, 0xde, 0xdc, 0xdc, 0xff, 0xe9, 0xe7, 0xe8, 0xff,
+    0xe8, 0xe7, 0xe6, 0xe7, 0xff, 0xff, 0xff, 0x97, 0xff, 0xff, 0xff, 0x93,
+    0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, 0x88, 0xfe, 0xfe, 0xfa, 0x9b,
+    0xfc, 0xfb, 0xee, 0xff, 0xfc, 0xfa, 0xed, 0xff, 0xfb, 0xfa, 0xeb, 0xff,
+    0xfb, 0xf8, 0xeb, 0xff, 0xfb, 0xf7, 0xea, 0xff, 0xfa, 0xf6, 0xe8, 0xff,
+    0xf8, 0xf6, 0xe6, 0xff, 0xf7, 0xf5, 0xe3, 0xff,
+    0xf9, 0xf9, 0xf9, 0xff, 0xf7, 0xf6, 0xf7, 0xff, 0xf5, 0xf4, 0xf4, 0xff,
+    0xf0, 0xee, 0xef, 0xff, 0xe8, 0xe7, 0xe7, 0xff, 0xe7, 0xe4, 0xe3, 0xff,
+    0xe2, 0xdd, 0xdb, 0xff, 0xdf, 0xd9, 0xd7, 0xff, 0xdc, 0xd6, 0xd4, 0xff,
+    0xd8, 0xd2, 0xcf, 0xff, 0xd8, 0xd2, 0xd1, 0xff, 0xe0, 0xdc, 0xdc, 0xff,
+    0xdb, 0xd7, 0xd7, 0xff, 0xdb, 0xd7, 0xd7, 0xff, 0xe7, 0xe5, 0xe5, 0xff,
+    0xde, 0xda, 0xdb, 0xff, 0xdb, 0xd8, 0xd9, 0xff, 0xe0, 0xde, 0xde, 0xff,
+    0xed, 0xeb, 0xec, 0xe4, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x8b,
+    0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0x80, 0xfe, 0xfe, 0xfa, 0x94,
+    0xfd, 0xfb, 0xee, 0xff, 0xfd, 0xfb, 0xed, 0xff, 0xfc, 0xfb, 0xec, 0xff,
+    0xfc, 0xfa, 0xea, 0xff, 0xf8, 0xf7, 0xe9, 0xff, 0xf8, 0xf6, 0xe7, 0xff,
+    0xf7, 0xf7, 0xe5, 0xff, 0xf7, 0xf5, 0xe3, 0xff,
+    0xf9, 0xf9, 0xf9, 0xff, 0xf5, 0xf4, 0xf4, 0xff, 0xf2, 0xf2, 0xf2, 0xff,
+    0xe9, 0xe6, 0xe6, 0xff, 0xe9, 0xe7, 0xe6, 0xff, 0xe9, 0xe7, 0xe7, 0xff,
+    0xe0, 0xdb, 0xda, 0xff, 0xda, 0xd3, 0xd2, 0xff, 0xd6, 0xd0, 0xce, 0xff,
+    0xd4, 0xcd, 0xcb, 0xff, 0xd0, 0xc8, 0xc7, 0xff, 0xd7, 0xd2, 0xd1, 0xff,
+    0xd8, 0xd3, 0xd3, 0xff, 0xd4, 0xd1, 0xd1, 0xff, 0xe6, 0xe3, 0xe2, 0xff,
+    0xdd, 0xda, 0xda, 0xff, 0xe3, 0xe1, 0xe1, 0xff, 0xe0, 0xde, 0xde, 0xff,
+    0xe7, 0xe5, 0xe5, 0xe3, 0xff, 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0x84,
+    0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7b, 0xfe, 0xfe, 0xfb, 0x88,
+    0xfc, 0xfc, 0xef, 0xff, 0xfb, 0xfc, 0xee, 0xff, 0xfb, 0xfa, 0xeb, 0xff,
+    0xfa, 0xfa, 0xea, 0xff, 0xf9, 0xf9, 0xe7, 0xff, 0xf7, 0xf7, 0xe6, 0xff,
+    0xf6, 0xf5, 0xe5, 0xff, 0xf7, 0xf5, 0xe3, 0xff,
+    0xf8, 0xf7, 0xf7, 0xff, 0xf4, 0xf4, 0xf4, 0xff, 0xf2, 0xf2, 0xf1, 0xff,
+    0xe8, 0xe6, 0xe6, 0xff, 0xe4, 0xe1, 0xe1, 0xff, 0xdd, 0xda, 0xda, 0xff,
+    0xe7, 0xe3, 0xe3, 0xff, 0xd6, 0xcf, 0xcd, 0xff, 0xd4, 0xcc, 0xca, 0xff,
+    0xcf, 0xc7, 0xc5, 0xff, 0xcc, 0xc3, 0xc1, 0xff, 0xd3, 0xce, 0xcc, 0xff,
+    0xd9, 0xd4, 0xd4, 0xff, 0xda, 0xd6, 0xd6, 0xff, 0xe3, 0xe1, 0xe0, 0xff,
+    0xdb, 0xd8, 0xd7, 0xff, 0xe4, 0xe2, 0xe2, 0xff, 0xe1, 0xde, 0xdf, 0xff,
+    0xe3, 0xe1, 0xe1, 0xf0, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0x7c,
+    0xff, 0xff, 0xff, 0x78, 0xff, 0xff, 0xff, 0x73, 0xff, 0xff, 0xff, 0x6f,
+    0xfb, 0xfc, 0xed, 0xff, 0xfa, 0xfb, 0xed, 0xff, 0xfb, 0xfa, 0xeb, 0xff,
+    0xfa, 0xf9, 0xe9, 0xff, 0xfa, 0xf9, 0xe7, 0xff, 0xf8, 0xf9, 0xe7, 0xff,
+    0xf7, 0xf5, 0xe3, 0xff, 0xf7, 0xf4, 0xe1, 0xff,
+    0xf2, 0xf2, 0xf2, 0xff, 0xf0, 0xf0, 0xf0, 0xff, 0xf0, 0xf0, 0xef, 0xff,
+    0xe5, 0xe3, 0xe3, 0xff, 0xdd, 0xd9, 0xd9, 0xff, 0xdf, 0xdc, 0xdc, 0xff,
+    0xe6, 0xe3, 0xe3, 0xff, 0xe1, 0xda, 0xdb, 0xff, 0xd2, 0xca, 0xc7, 0xff,
+    0xca, 0xc2, 0xc0, 0xff, 0xc7, 0xbe, 0xbc, 0xff, 0xc8, 0xc2, 0xc0, 0xff,
+    0xd2, 0xcf, 0xce, 0xff, 0xd5, 0xcf, 0xd0, 0xff, 0xd5, 0xd1, 0xd1, 0xff,
+    0xda, 0xd6, 0xd7, 0xff, 0xde, 0xdc, 0xdd, 0xff, 0xde, 0xdd, 0xdc, 0xff,
+    0xe2, 0xe0, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, 0x77,
+    0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x6c, 0xff, 0xff, 0xff, 0x67,
+    0xfa, 0xfd, 0xed, 0xf8, 0xf9, 0xfc, 0xeb, 0xff, 0xf9, 0xfb, 0xea, 0xff,
+    0xf8, 0xf9, 0xe8, 0xff, 0xf7, 0xf9, 0xe6, 0xff, 0xf7, 0xf8, 0xe6, 0xff,
+    0xf6, 0xf5, 0xe4, 0xff, 0xf6, 0xf4, 0xe1, 0xff,
+    0xe7, 0xe7, 0xe7, 0xff, 0xe3, 0xe4, 0xe3, 0xff, 0xe1, 0xe2, 0xe2, 0xff,
+    0xe4, 0xe4, 0xe4, 0xff, 0xd7, 0xd6, 0xd5, 0xff, 0xd5, 0xd4, 0xd4, 0xff,
+    0xdd, 0xdc, 0xdc, 0xff, 0xdc, 0xda, 0xda, 0xff, 0xd0, 0xc9, 0xc9, 0xff,
+    0xc9, 0xbf, 0xbe, 0xff, 0xc2, 0xba, 0xb8, 0xff, 0xc0, 0xb8, 0xb6, 0xff,
+    0xcc, 0xc7, 0xc7, 0xff, 0xd2, 0xcd, 0xcd, 0xff, 0xd2, 0xce, 0xcf, 0xff,
+    0xd1, 0xcc, 0xcd, 0xff, 0xdf, 0xde, 0xde, 0xff, 0xe7, 0xe6, 0xe6, 0xff,
+    0xe4, 0xe3, 0xe3, 0xff, 0xfd, 0xfd, 0xfd, 0x78, 0xff, 0xff, 0xff, 0x70,
+    0xff, 0xff, 0xff, 0x6b, 0xff, 0xff, 0xff, 0x67, 0xff, 0xff, 0xff, 0x60,
+    0xfc, 0xfe, 0xef, 0xcf, 0xf9, 0xfc, 0xec, 0xff, 0xfa, 0xfa, 0xe9, 0xff,
+    0xf8, 0xfa, 0xe8, 0xff, 0xf7, 0xf7, 0xe5, 0xff, 0xf6, 0xf7, 0xe5, 0xff,
+    0xf5, 0xf5, 0xe3, 0xff, 0xf6, 0xf4, 0xe0, 0xff,
+    0xdc, 0xdd, 0xdd, 0xff, 0xdb, 0xdc, 0xdc, 0xff, 0xd3, 0xd4, 0xd4, 0xff,
+    0xd8, 0xd8, 0xd8, 0xff, 0xd1, 0xd1, 0xd1, 0xff, 0xd0, 0xd0, 0xd0, 0xff,
+    0xca, 0xcb, 0xcb, 0xff, 0xcc, 0xcc, 0xcd, 0xff, 0xcb, 0xcb, 0xcb, 0xff,
+    0xc6, 0xc1, 0xc1, 0xff, 0xc0, 0xbc, 0xba, 0xff, 0xba, 0xb1, 0xaf, 0xff,
+    0xc5, 0xbf, 0xc0, 0xff, 0xd6, 0xd2, 0xd2, 0xff, 0xc4, 0xbf, 0xbf, 0xff,
+    0xd3, 0xce, 0xcd, 0xff, 0xd3, 0xd1, 0xd2, 0xff, 0xe3, 0xe2, 0xe2, 0xff,
+    0xe6, 0xe4, 0xe4, 0xff, 0xee, 0xee, 0xed, 0x9b, 0xff, 0xff, 0xff, 0x68,
+    0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0x5b,
+    0xfd, 0xfe, 0xf6, 0x80, 0xf9, 0xfc, 0xeb, 0xff, 0xf7, 0xfa, 0xeb, 0xff,
+    0xf7, 0xf9, 0xe9, 0xff, 0xf6, 0xf8, 0xe8, 0xff, 0xf6, 0xf7, 0xe5, 0xff,
+    0xf5, 0xf4, 0xe4, 0xff, 0xf5, 0xf4, 0xe3, 0xff,
+    0xd7, 0xd8, 0xd8, 0xff, 0xd4, 0xd5, 0xd4, 0xff, 0xd2, 0xd3, 0xd3, 0xff,
+    0xcf, 0xd0, 0xd0, 0xff, 0xcc, 0xce, 0xcd, 0xff, 0xc9, 0xca, 0xca, 0xff,
+    0xc5, 0xc6, 0xc6, 0xff, 0xc3, 0xc4, 0xc4, 0xff, 0xbf, 0xbf, 0xbd, 0xff,
+    0xbe, 0xbf, 0xbf, 0xff, 0xba, 0xba, 0xba, 0xff, 0xb4, 0xb1, 0xb1, 0xff,
+    0xbb, 0xba, 0xb9, 0xff, 0xc9, 0xc8, 0xc7, 0xff, 0xe2, 0xde, 0xde, 0xff,
+    0xc1, 0xbd, 0xbd, 0xff, 0xd6, 0xd5, 0xd5, 0xff, 0xde, 0xdd, 0xdc, 0xff,
+    0xdc, 0xda, 0xda, 0xff, 0xe6, 0xe5, 0xe5, 0xcf, 0xff, 0xff, 0xff, 0x63,
+    0xff, 0xff, 0xff, 0x5c, 0xff, 0xff, 0xff, 0x58, 0xff, 0xff, 0xff, 0x53,
+    0xff, 0xff, 0xff, 0x4f, 0xf9, 0xfc, 0xeb, 0xfb, 0xf6, 0xf9, 0xeb, 0xff,
+    0xf6, 0xf9, 0xea, 0xff, 0xf6, 0xf9, 0xe8, 0xff, 0xf5, 0xf5, 0xe4, 0xff,
+    0xf6, 0xf6, 0xe4, 0xff, 0xf5, 0xf4, 0xe2, 0xff,
+    0xd3, 0xd4, 0xd4, 0xff, 0xcc, 0xcd, 0xcd, 0xff, 0xce, 0xcf, 0xcf, 0xff,
+    0xc9, 0xcb, 0xcb, 0xff, 0xc6, 0xc7, 0xc7, 0xff, 0xc3, 0xc5, 0xc4, 0xff,
+    0xc0, 0xc1, 0xc1, 0xff, 0xbb, 0xbd, 0xbc, 0xff, 0xb7, 0xb9, 0xb8, 0xff,
+    0xb6, 0xb7, 0xb7, 0xff, 0xb4, 0xb7, 0xb6, 0xff, 0xaf, 0xaf, 0xaf, 0xff,
+    0xb0, 0xb2, 0xb2, 0xff, 0xb5, 0xb5, 0xb5, 0xff, 0xc1, 0xc0, 0xc0, 0xff,
+    0xc9, 0xc6, 0xc7, 0xff, 0xb3, 0xad, 0xae, 0xff, 0xcf, 0xcd, 0xce, 0xff,
+    0xe3, 0xe2, 0xe2, 0xff, 0xe4, 0xe2, 0xe2, 0xff, 0xfd, 0xfd, 0xfd, 0x60,
+    0xff, 0xff, 0xff, 0x57, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0x4c,
+    0xff, 0xff, 0xff, 0x47, 0xfa, 0xfb, 0xef, 0xa8, 0xf8, 0xfc, 0xed, 0xff,
+    0xf7, 0xf9, 0xea, 0xff, 0xf6, 0xf7, 0xe7, 0xff, 0xf6, 0xf4, 0xe7, 0xff,
+    0xf5, 0xf4, 0xe5, 0xff, 0xf4, 0xf3, 0xe3, 0xff,
+    0xce, 0xcf, 0xcf, 0xff, 0xc8, 0xc9, 0xc9, 0xff, 0xc6, 0xc8, 0xc8, 0xff,
+    0xc4, 0xc6, 0xc6, 0xff, 0xc2, 0xc3, 0xc3, 0xff, 0xba, 0xbd, 0xbc, 0xff,
+    0xbc, 0xbe, 0xbe, 0xff, 0xb5, 0xb8, 0xb7, 0xff, 0xb4, 0xb6, 0xb5, 0xff,
+    0xb0, 0xb2, 0xb2, 0xff, 0xaf, 0xb1, 0xb0, 0xff, 0xaa, 0xad, 0xac, 0xff,
+    0xaa, 0xad, 0xac, 0xff, 0xa7, 0xa9, 0xa8, 0xff, 0xa4, 0xa5, 0xa5, 0xff,
+    0xa7, 0xa8, 0xa8, 0xff, 0xc4, 0xc3, 0xc3, 0xff, 0xb8, 0xb7, 0xb7, 0xff,
+    0xc0, 0xbf, 0xbe, 0xff, 0xd0, 0xce, 0xce, 0xff, 0xe3, 0xe2, 0xe2, 0x94,
+    0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0x44,
+    0xff, 0xff, 0xff, 0x40, 0xed, 0xe7, 0xe6, 0x48, 0xba, 0xad, 0xa1, 0xff,
+    0xd6, 0xcf, 0xc1, 0xff, 0xf4, 0xf3, 0xe4, 0xff, 0xf5, 0xf4, 0xe5, 0xff,
+    0xf5, 0xf3, 0xe5, 0xff, 0xf5, 0xf5, 0xe5, 0xff,
+    0xc7, 0xc9, 0xc8, 0xff, 0xc5, 0xc6, 0xc6, 0xff, 0xc1, 0xc2, 0xc2, 0xff,
+    0xbd, 0xbe, 0xbe, 0xff, 0xba, 0xbc, 0xbb, 0xff, 0xb3, 0xb4, 0xb4, 0xff,
+    0xb2, 0xb5, 0xb4, 0xff, 0xb1, 0xb4, 0xb3, 0xff, 0xac, 0xaf, 0xae, 0xff,
+    0xa8, 0xaa, 0xa9, 0xff, 0xa8, 0xab, 0xaa, 0xff, 0xa1, 0xa4, 0xa3, 0xff,
+    0xa1, 0xa4, 0xa3, 0xff, 0xa3, 0xa5, 0xa4, 0xff, 0x9f, 0xa1, 0xa0, 0xff,
+    0x99, 0x9b, 0x9a, 0xff, 0x98, 0x9a, 0x9a, 0xff, 0x97, 0x9a, 0x99, 0xff,
+    0xa0, 0xa0, 0xa0, 0xff, 0x9b, 0x9b, 0x9b, 0xff, 0x9f, 0xa0, 0x9f, 0xe8,
+    0xff, 0xff, 0xff, 0x48, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0x3f,
+    0xff, 0xff, 0xff, 0x3b, 0xff, 0xff, 0xff, 0x34, 0xbb, 0xa7, 0xa5, 0xd8,
+    0xb9, 0xa9, 0xa6, 0xff, 0xb9, 0xac, 0xa0, 0xff, 0xf8, 0xfa, 0xe7, 0xff,
+    0xf5, 0xf4, 0xe6, 0xff, 0xf4, 0xf3, 0xe4, 0xff,
+    0xc0, 0xc0, 0xbf, 0xff, 0xbb, 0xbb, 0xbb, 0xff, 0xbb, 0xbc, 0xbb, 0xff,
+    0xb6, 0xb6, 0xb6, 0xff, 0xb0, 0xb1, 0xb1, 0xff, 0xad, 0xad, 0xad, 0xff,
+    0xa8, 0xa7, 0xa7, 0xff, 0xa8, 0xa9, 0xa9, 0xff, 0xa5, 0xa6, 0xa6, 0xff,
+    0xa4, 0xa6, 0xa5, 0xff, 0xa3, 0xa6, 0xa6, 0xff, 0x9b, 0x9d, 0x9c, 0xff,
+    0x96, 0x99, 0x99, 0xff, 0x9b, 0x9d, 0x9d, 0xff, 0x97, 0x99, 0x98, 0xff,
+    0x8e, 0x91, 0x91, 0xff, 0x98, 0x9b, 0x9b, 0xff, 0x89, 0x8c, 0x8b, 0xff,
+    0x87, 0x8b, 0x89, 0xff, 0x84, 0x7f, 0x81, 0xff, 0x82, 0x82, 0x83, 0xff,
+    0xc0, 0xbe, 0xbf, 0x67, 0xff, 0xff, 0xff, 0x3c, 0xff, 0xff, 0xff, 0x37,
+    0xff, 0xff, 0xff, 0x33, 0xff, 0xff, 0xff, 0x2f, 0xc6, 0xbb, 0xb9, 0x50,
+    0xac, 0x9c, 0x99, 0xff, 0xa8, 0x98, 0x91, 0xff, 0xbd, 0xb0, 0xa5, 0xff,
+    0xf6, 0xf5, 0xe6, 0xff, 0xf4, 0xf3, 0xe4, 0xff,
+    0xbb, 0xbb, 0xba, 0xff, 0xb3, 0xb3, 0xb3, 0xff, 0xb3, 0xb4, 0xb4, 0xff,
+    0xae, 0xaf, 0xae, 0xff, 0xad, 0xae, 0xae, 0xff, 0xb2, 0xb4, 0xb4, 0xfc,
+    0xa8, 0xa8, 0xa9, 0xf3, 0xa7, 0xa7, 0xa7, 0xf3, 0x9e, 0x9f, 0x9d, 0xfc,
+    0x9b, 0x9c, 0x9a, 0xff, 0x9c, 0x9e, 0x9e, 0xff, 0x94, 0x96, 0x94, 0xff,
+    0x90, 0x90, 0x90, 0xff, 0x96, 0x98, 0x99, 0xff, 0x8d, 0x8f, 0x8e, 0xff,
+    0x83, 0x83, 0x84, 0xff, 0x8f, 0x92, 0x91, 0xff, 0x83, 0x85, 0x85, 0xff,
+    0x87, 0x87, 0x87, 0xff, 0x7c, 0x7d, 0x7d, 0xff, 0x78, 0x74, 0x72, 0xff,
+    0x95, 0x93, 0x92, 0x97, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xff, 0x30,
+    0xff, 0xff, 0xff, 0x2c, 0xff, 0xff, 0xff, 0x27, 0xff, 0xff, 0xff, 0x23,
+    0xa2, 0x93, 0x94, 0xe7, 0x96, 0x83, 0x81, 0xff, 0xa8, 0x91, 0x8b, 0xff,
+    0xc4, 0xbc, 0xb2, 0xff, 0xf5, 0xf5, 0xe4, 0xff,
+    0xb7, 0xb9, 0xb8, 0xff, 0xaf, 0xaf, 0xae, 0xff, 0xaf, 0xaf, 0xaf, 0xff,
+    0xac, 0xad, 0xae, 0xff, 0xa8, 0xaa, 0xa9, 0xff, 0xae, 0xaf, 0xaf, 0xec,
+    0xc6, 0xc7, 0xc7, 0xb4, 0xc5, 0xc6, 0xc6, 0xb3, 0x9a, 0x99, 0x99, 0xeb,
+    0x91, 0x91, 0x90, 0xff, 0x94, 0x95, 0x95, 0xff, 0x95, 0x96, 0x96, 0xff,
+    0x8c, 0x8e, 0x8e, 0xff, 0x86, 0x88, 0x87, 0xff, 0x83, 0x82, 0x82, 0xff,
+    0x80, 0x81, 0x81, 0xff, 0x82, 0x84, 0x84, 0xff, 0x7b, 0x79, 0x7a, 0xff,
+    0x73, 0x74, 0x73, 0xff, 0x79, 0x7a, 0x7b, 0xff, 0x75, 0x73, 0x72, 0xff,
+    0x6f, 0x70, 0x6e, 0xfc, 0xe8, 0xe7, 0xe7, 0x37, 0xff, 0xff, 0xff, 0x2b,
+    0xff, 0xff, 0xff, 0x24, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x1c,
+    0x70, 0x6e, 0x6d, 0xeb, 0x6c, 0x69, 0x66, 0xff, 0x83, 0x78, 0x7b, 0xff,
+    0x83, 0x7f, 0x78, 0xff, 0xdc, 0xd5, 0xcd, 0xff,
+    0xb3, 0xb5, 0xb4, 0xff, 0xa9, 0xa9, 0xaa, 0xff, 0xa7, 0xa8, 0xa7, 0xff,
+    0xa7, 0xa8, 0xa7, 0xff, 0xa6, 0xa8, 0xa8, 0xff, 0xab, 0xac, 0xab, 0xe3,
+    0xdb, 0xdc, 0xdc, 0x97, 0xd9, 0xda, 0xda, 0x93, 0x99, 0x99, 0x98, 0xe0,
+    0x94, 0x95, 0x95, 0xff, 0x8e, 0x8f, 0x8e, 0xff, 0x8f, 0x93, 0x92, 0xff,
+    0x88, 0x8a, 0x89, 0xff, 0x79, 0x78, 0x78, 0xff, 0x80, 0x82, 0x82, 0xff,
+    0x7f, 0x81, 0x81, 0xff, 0x7f, 0x7d, 0x7e, 0xff, 0x76, 0x72, 0x72, 0xff,
+    0x70, 0x70, 0x70, 0xff, 0x73, 0x73, 0x73, 0xff, 0x67, 0x66, 0x64, 0xff,
+    0x6b, 0x6b, 0x6a, 0xff, 0x70, 0x73, 0x72, 0xd4, 0xff, 0xff, 0xff, 0x23,
+    0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x1b, 0x79, 0x74, 0x72, 0x67,
+    0x63, 0x61, 0x61, 0xff, 0x63, 0x62, 0x60, 0xff, 0x5e, 0x5c, 0x5a, 0xff,
+    0x61, 0x5f, 0x5c, 0xff, 0x6b, 0x63, 0x5e, 0xff,
+    0xae, 0xaf, 0xaf, 0xff, 0xa9, 0xa9, 0xa9, 0xff, 0x9c, 0x9b, 0x99, 0xff,
+    0x9d, 0x9c, 0x9b, 0xff, 0x9c, 0x9c, 0x9c, 0xff, 0x9c, 0x9c, 0x9d, 0xf7,
+    0xaa, 0xac, 0xac, 0xd4, 0xa5, 0xa7, 0xa6, 0xd3, 0x98, 0x9a, 0x9a, 0xf4,
+    0x8d, 0x8e, 0x8e, 0xff, 0x85, 0x85, 0x85, 0xff, 0x85, 0x86, 0x86, 0xff,
+    0x82, 0x84, 0x84, 0xff, 0x7b, 0x7b, 0x7b, 0xff, 0x7e, 0x82, 0x81, 0xff,
+    0x79, 0x7b, 0x7b, 0xff, 0x79, 0x7b, 0x7b, 0xff, 0x72, 0x73, 0x73, 0xff,
+    0x70, 0x6e, 0x6e, 0xff, 0x6d, 0x6d, 0x6d, 0xff, 0x61, 0x5f, 0x5d, 0xff,
+    0x5d, 0x5d, 0x5b, 0xff, 0x64, 0x60, 0x61, 0xff, 0x5e, 0x5d, 0x5d, 0xec,
+    0x6a, 0x69, 0x67, 0xa0, 0x67, 0x66, 0x64, 0xbc, 0x59, 0x56, 0x55, 0xff,
+    0x54, 0x51, 0x4e, 0xff, 0x56, 0x52, 0x51, 0xff, 0x55, 0x52, 0x4f, 0xff,
+    0x52, 0x4e, 0x49, 0xff, 0x54, 0x54, 0x52, 0xff,
+    0xa9, 0xac, 0xab, 0xff, 0xa1, 0xa0, 0xa0, 0xff, 0x9a, 0x99, 0x98, 0xff,
+    0x97, 0x97, 0x96, 0xff, 0x95, 0x94, 0x94, 0xff, 0x8e, 0x8c, 0x8c, 0xff,
+    0x95, 0x98, 0x97, 0xfc, 0x90, 0x91, 0x91, 0xfc, 0x95, 0x96, 0x96, 0xff,
+    0x86, 0x86, 0x86, 0xff, 0x81, 0x82, 0x80, 0xff, 0x7d, 0x7e, 0x7b, 0xff,
+    0x78, 0x79, 0x78, 0xff, 0x71, 0x70, 0x6e, 0xff, 0x72, 0x71, 0x70, 0xff,
+    0x72, 0x73, 0x72, 0xff, 0x70, 0x70, 0x6e, 0xff, 0x6d, 0x6a, 0x6a, 0xff,
+    0x64, 0x64, 0x63, 0xff, 0x69, 0x68, 0x67, 0xff, 0x61, 0x5f, 0x5e, 0xff,
+    0x59, 0x57, 0x57, 0xff, 0x5f, 0x5f, 0x5e, 0xff, 0x55, 0x55, 0x53, 0xff,
+    0x57, 0x58, 0x57, 0xff, 0x51, 0x53, 0x50, 0xff, 0x54, 0x51, 0x51, 0xff,
+    0x4c, 0x4b, 0x4a, 0xff, 0x49, 0x4a, 0x47, 0xff, 0x4f, 0x51, 0x4e, 0xff,
+    0x4f, 0x4d, 0x49, 0xff, 0x4c, 0x4b, 0x46, 0xff,
+    0xa7, 0xaa, 0xaa, 0xff, 0x99, 0x98, 0x98, 0xff, 0x95, 0x92, 0x92, 0xff,
+    0x94, 0x93, 0x92, 0xff, 0x8a, 0x87, 0x84, 0xff, 0x85, 0x80, 0x7f, 0xff,
+    0x8d, 0x90, 0x8f, 0xff, 0x85, 0x85, 0x85, 0xff, 0x8e, 0x8e, 0x8e, 0xff,
+    0x80, 0x80, 0x81, 0xff, 0x7c, 0x7d, 0x7b, 0xff, 0x79, 0x79, 0x78, 0xff,
+    0x78, 0x79, 0x78, 0xff, 0x6e, 0x6c, 0x6b, 0xff, 0x68, 0x66, 0x66, 0xff,
+    0x69, 0x6a, 0x67, 0xff, 0x60, 0x5e, 0x5d, 0xff, 0x5b, 0x58, 0x57, 0xff,
+    0x58, 0x56, 0x55, 0xff, 0x61, 0x5e, 0x5d, 0xff, 0x54, 0x53, 0x52, 0xff,
+    0x60, 0x5d, 0x5c, 0xff, 0x5b, 0x5b, 0x5a, 0xff, 0x59, 0x5a, 0x58, 0xff,
+    0x48, 0x43, 0x42, 0xff, 0x44, 0x40, 0x40, 0xff, 0x48, 0x46, 0x44, 0xff,
+    0x4a, 0x46, 0x46, 0xff, 0x4c, 0x4f, 0x4c, 0xff, 0x49, 0x4a, 0x48, 0xff,
+    0x47, 0x46, 0x41, 0xff, 0x44, 0x43, 0x3f, 0xff,
+    0xa2, 0xa4, 0xa4, 0xff, 0x96, 0x95, 0x96, 0xff, 0x8e, 0x8c, 0x8a, 0xff,
+    0x89, 0x86, 0x86, 0xff, 0x82, 0x7c, 0x7c, 0xff, 0x83, 0x80, 0x7f, 0xff,
+    0x82, 0x82, 0x80, 0xff, 0x82, 0x83, 0x81, 0xff, 0x82, 0x85, 0x85, 0xff,
+    0x7c, 0x7c, 0x7c, 0xff, 0x77, 0x78, 0x75, 0xff, 0x75, 0x77, 0x76, 0xff,
+    0x71, 0x72, 0x70, 0xff, 0x68, 0x66, 0x65, 0xff, 0x62, 0x60, 0x5f, 0xff,
+    0x5f, 0x5e, 0x5c, 0xff, 0x5a, 0x52, 0x4f, 0xff, 0x5b, 0x53, 0x4f, 0xff,
+    0x50, 0x49, 0x49, 0xff, 0x5c, 0x58, 0x57, 0xff, 0x50, 0x4b, 0x49, 0xff,
+    0x57, 0x54, 0x53, 0xff, 0x4f, 0x4f, 0x4e, 0xff, 0x53, 0x57, 0x55, 0xff,
+    0x48, 0x45, 0x44, 0xff, 0x3c, 0x33, 0x33, 0xff, 0x49, 0x45, 0x43, 0xff,
+    0x41, 0x3f, 0x3d, 0xff, 0x49, 0x46, 0x44, 0xff, 0x4a, 0x48, 0x47, 0xff,
+    0x3f, 0x3c, 0x3a, 0xff, 0x43, 0x41, 0x3e, 0xff,
+    0x99, 0x9c, 0x9a, 0xff, 0x90, 0x8e, 0x8f, 0xff, 0x8c, 0x8b, 0x89, 0xff,
+    0x81, 0x7c, 0x7c, 0xff, 0x7d, 0x78, 0x78, 0xff, 0x82, 0x82, 0x80, 0xff,
+    0x77, 0x74, 0x73, 0xff, 0x75, 0x73, 0x73, 0xff, 0x78, 0x76, 0x76, 0xff,
+    0x70, 0x6f, 0x6f, 0xff, 0x6d, 0x6c, 0x6b, 0xff, 0x6e, 0x6f, 0x6d, 0xff,
+    0x68, 0x68, 0x66, 0xff, 0x5f, 0x5b, 0x5b, 0xff, 0x5b, 0x56, 0x56, 0xff,
+    0x5a, 0x58, 0x57, 0xff, 0x53, 0x49, 0x47, 0xff, 0x4e, 0x45, 0x43, 0xff,
+    0x49, 0x43, 0x41, 0xff, 0x5f, 0x5b, 0x5a, 0xff, 0x46, 0x3f, 0x3e, 0xff,
+    0x4b, 0x48, 0x47, 0xff, 0x42, 0x3f, 0x3f, 0xff, 0x4d, 0x50, 0x50, 0xff,
+    0x52, 0x52, 0x51, 0xff, 0x37, 0x31, 0x30, 0xff, 0x3d, 0x38, 0x37, 0xff,
+    0x3f, 0x39, 0x38, 0xff, 0x40, 0x3c, 0x3b, 0xff, 0x4a, 0x48, 0x47, 0xff,
+    0x3f, 0x3d, 0x3b, 0xff, 0x46, 0x45, 0x43, 0xff,
+};
+
+#endif  // WEBP_TESTS_FUZZER_IMG_ALPHA_H_
diff --git a/third_party/libwebp/tests/fuzzer/img_grid.h b/third_party/libwebp/tests/fuzzer/img_grid.h
new file mode 100644
index 0000000..f269bbd
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/img_grid.h
@@ -0,0 +1,125 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef WEBP_TESTS_FUZZER_IMG_GRID_H_
+#define WEBP_TESTS_FUZZER_IMG_GRID_H_
+
+#include <stdint.h>
+
+static const int kImgGridWidth = 16;
+static const int kImgGridHeight = 16;
+
+/*Pixel format: Red: 8 bit, Green: 8 bit, Blue: 8 bit, Fix 0xFF: 8 bit*/
+static const uint8_t kImgGridData[] = {
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+    0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0x00, 0x00, 0xff,
+};
+
+#endif  // WEBP_TESTS_FUZZER_IMG_GRID_H_
diff --git a/third_party/libwebp/tests/fuzzer/img_peak.h b/third_party/libwebp/tests/fuzzer/img_peak.h
new file mode 100644
index 0000000..d17ba1e
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/img_peak.h
@@ -0,0 +1,5533 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef WEBP_TESTS_FUZZER_IMG_PEAK_H_
+#define WEBP_TESTS_FUZZER_IMG_PEAK_H_
+
+#include <stdint.h>
+
+static const int kImgPeakWidth = 128;
+static const int kImgPeakHeight = 128;
+
+/*Pixel format: Red: 8 bit, Green: 8 bit, Blue: 8 bit, Fix 0xFF: 8 bit*/
+static const uint8_t kImgPeakData[] = {
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xe4, 0xe2, 0xd8, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xec, 0xdb, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf7, 0xdd, 0xcc, 0xff, 0xec, 0xd6, 0xc4, 0xff, 0xd9, 0xc6, 0xb4, 0xff,
+    0xa7, 0x94, 0x84, 0xff, 0xa9, 0x9b, 0x8c, 0xff, 0xa9, 0x9b, 0x8c, 0xff,
+    0xc5, 0xb7, 0xb4, 0xff, 0xc0, 0xaa, 0x9c, 0xff, 0xc4, 0xb2, 0xac, 0xff,
+    0xe6, 0xd6, 0xcc, 0xff, 0xee, 0xdd, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xde, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf7, 0xdd, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xc0, 0xaa, 0x9c, 0xff,
+    0x9c, 0x7e, 0x6c, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x94, 0x79, 0x6c, 0xff,
+    0x94, 0x79, 0x6c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x9e, 0x8b, 0x84, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0xbf, 0xaa, 0xa4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xd6, 0xc5, 0xbc, 0xff,
+    0xec, 0xdb, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xde, 0xd4, 0xff,
+    0xd4, 0xb8, 0xac, 0xff, 0x94, 0x79, 0x6c, 0xff, 0x84, 0x6e, 0x5c, 0xff,
+    0x94, 0x79, 0x6c, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x8a, 0x76, 0x6c, 0xff,
+    0x9e, 0x8b, 0x84, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0xa8, 0x93, 0x8c, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x8f, 0x86, 0x7c, 0xff,
+    0xc4, 0xb2, 0xac, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0xa8, 0x9b, 0x94, 0xff,
+    0xd9, 0xcc, 0xbc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xdc, 0xbe, 0xb4, 0xff, 0xac, 0x8e, 0x7c, 0xff, 0x9c, 0x81, 0x74, 0xff,
+    0x7c, 0x62, 0x54, 0xff, 0x80, 0x67, 0x5c, 0xff, 0xa4, 0x89, 0x7c, 0xff,
+    0xbc, 0xa4, 0x9c, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0xac, 0x8d, 0x84, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xad, 0x9a, 0x9c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0xa8, 0x9b, 0x94, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc7, 0xb8, 0xac, 0xff,
+    0xa8, 0x9b, 0x94, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xe4, 0xd2, 0xc4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xec, 0xd6, 0xc4, 0xff, 0xa4, 0x89, 0x7c, 0xff,
+    0x7c, 0x5c, 0x4c, 0xff, 0x7e, 0x67, 0x54, 0xff, 0x7c, 0x62, 0x54, 0xff,
+    0x80, 0x67, 0x5c, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x8c, 0x6d, 0x6c, 0xff,
+    0xac, 0x8d, 0x84, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0xac, 0x8d, 0x8c, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x9c, 0x7a, 0x7c, 0xff,
+    0x8e, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff,
+    0x96, 0x86, 0x8c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0xd7, 0xcc, 0xc4, 0xff, 0xd6, 0xc5, 0xbc, 0xff, 0xb0, 0xa3, 0x9c, 0xff,
+    0xc7, 0xb8, 0xac, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xec, 0xd6, 0xc4, 0xff, 0x94, 0x76, 0x64, 0xff, 0x7c, 0x5c, 0x4c, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x80, 0x67, 0x5c, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x9c, 0x80, 0x7c, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x8e, 0x72, 0x74, 0xff, 0xa4, 0x85, 0x84, 0xff,
+    0xa4, 0x85, 0x84, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x8e, 0x72, 0x74, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xad, 0x9a, 0x9c, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb1, 0xaa, 0xa4, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xa8, 0x93, 0x8c, 0xff,
+    0xa8, 0x93, 0x8c, 0xff, 0xc4, 0xb2, 0xac, 0xff, 0xee, 0xdd, 0xd4, 0xff,
+    0xef, 0xe2, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xe7, 0xce, 0xbc, 0xff,
+    0x84, 0x6e, 0x5c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7f, 0x6a, 0x64, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xa4, 0x85, 0x84, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0xa4, 0x85, 0x84, 0xff, 0xcc, 0xaa, 0xac, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8e, 0x72, 0x74, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0x8f, 0x86, 0x7c, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xdc, 0xbe, 0xb4, 0xff,
+    0xee, 0xdd, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0x84, 0x6e, 0x5c, 0xff,
+    0x6f, 0x56, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x94, 0x79, 0x6c, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0xbd, 0xa6, 0xa4, 0xff, 0xb4, 0x96, 0x94, 0xff, 0x8e, 0x79, 0x74, 0xff,
+    0x8e, 0x72, 0x74, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0xdc, 0xba, 0xbc, 0xff,
+    0xc6, 0xb1, 0xb4, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x9c, 0x7a, 0x7c, 0xff, 0x84, 0x77, 0x74, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0x9c, 0x93, 0x8c, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xad, 0x9a, 0x9c, 0xff,
+    0x8f, 0x86, 0x7c, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0xee, 0xdd, 0xd4, 0xff, 0xee, 0xdd, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xe7, 0xce, 0xbc, 0xff, 0x9c, 0x7e, 0x6c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0xd4, 0xc6, 0xc4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xef, 0xe2, 0xdc, 0xff, 0xc4, 0xba, 0xbc, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xe4, 0xce, 0xcc, 0xff,
+    0xec, 0xde, 0xdc, 0xff, 0xf8, 0xea, 0xec, 0xff, 0xc5, 0xb7, 0xb4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0x84, 0x77, 0x74, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xa8, 0x9b, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xee, 0xdd, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xd4, 0xc2, 0xac, 0xff,
+    0x7e, 0x67, 0x54, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff,
+    0x74, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0xc6, 0xb1, 0xb4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xdc, 0xba, 0xbc, 0xff,
+    0xcf, 0xc6, 0xcc, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0xad, 0x9e, 0x9e, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0xec, 0xdb, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xe7, 0xce, 0xbc, 0xff, 0x7c, 0x62, 0x54, 0xff,
+    0x6f, 0x56, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x8d, 0x72, 0x6b, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x9e, 0x8b, 0x84, 0xff,
+    0xb0, 0xa3, 0x9c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x77, 0x66, 0x6c, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0xd5, 0xcd, 0xcc, 0xff,
+    0x94, 0x8b, 0x84, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0xba, 0xb0, 0xa4, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xba, 0xb0, 0xa4, 0xff,
+    0xec, 0xd6, 0xc4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xc7, 0xb2, 0xa4, 0xff, 0x7e, 0x67, 0x54, 0xff, 0x6f, 0x56, 0x44, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff,
+    0x78, 0x66, 0x64, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x72, 0x62, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0xe6, 0xd6, 0xcc, 0xff, 0xef, 0xe2, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xec, 0xdb, 0xcc, 0xff, 0x9c, 0x7e, 0x6c, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x7c, 0x5c, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x9c, 0x7a, 0x74, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x8a, 0x76, 0x6c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x94, 0x8b, 0x84, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xc4, 0xb2, 0xac, 0xff,
+    0xcc, 0xbd, 0xbc, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xd7, 0xcc, 0xc4, 0xff,
+    0xc9, 0xc0, 0xb4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc5, 0xb7, 0xb4, 0xff,
+    0xc5, 0xb7, 0xb4, 0xff, 0xd9, 0xcc, 0xbc, 0xff, 0xef, 0xe2, 0xdc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xec, 0xd6, 0xc4, 0xff, 0x84, 0x6e, 0x5c, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x80, 0x67, 0x5c, 0xff,
+    0x8d, 0x72, 0x6b, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x6b, 0x56, 0x5c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x7f, 0x6a, 0x64, 0xff,
+    0x78, 0x66, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xd9, 0xd4, 0xcc, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xd6, 0xc5, 0xbc, 0xff,
+    0xef, 0xe2, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xd9, 0xc6, 0xb4, 0xff,
+    0x7e, 0x67, 0x54, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x7e, 0x67, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x4e, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x80, 0x67, 0x5c, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7f, 0x72, 0x6c, 0xff,
+    0x7c, 0x72, 0x64, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x94, 0x8b, 0x84, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xe4, 0xde, 0xdc, 0xff, 0xcc, 0xc2, 0xbc, 0xff,
+    0xcc, 0xc2, 0xbc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xd9, 0xc6, 0xb4, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6f, 0x56, 0x44, 0xff,
+    0x7c, 0x62, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x7c, 0x5c, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x7d, 0x62, 0x5c, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x8d, 0x72, 0x6b, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x8d, 0x72, 0x6b, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x75, 0x62, 0x64, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8b, 0x84, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xb1, 0xaa, 0xa4, 0xff,
+    0xc7, 0xb8, 0xac, 0xff, 0xda, 0xd4, 0xc4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xd4, 0xb8, 0xac, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x7c, 0x5c, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff, 0x7c, 0x5c, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5e, 0x5c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x7c, 0x5e, 0x5c, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x94, 0x8b, 0x84, 0xff,
+    0x8d, 0x72, 0x6b, 0xff, 0x75, 0x56, 0x54, 0xff, 0x9c, 0x80, 0x7c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x75, 0x56, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0x94, 0x8b, 0x84, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0xa4, 0x9e, 0xa4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xc5, 0xb7, 0xb4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xd7, 0xcc, 0xc4, 0xff,
+    0xef, 0xe2, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xac, 0x8e, 0x7c, 0xff,
+    0x7c, 0x5c, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x6f, 0x56, 0x44, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x7c, 0x62, 0x54, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7d, 0x62, 0x5c, 0xff,
+    0x8c, 0x6e, 0x64, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x7d, 0x62, 0x5c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0xb4, 0x9b, 0x94, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x7c, 0x72, 0x64, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xcc, 0xbd, 0xbc, 0xff,
+    0x88, 0x8a, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc2, 0xc2, 0xbc, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xa4, 0x86, 0x74, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x7c, 0x62, 0x54, 0xff,
+    0x7d, 0x62, 0x5c, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x7d, 0x62, 0x5c, 0xff,
+    0x8e, 0x72, 0x74, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x7d, 0x62, 0x5c, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x74, 0x4e, 0x4c, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x7c, 0x5e, 0x5c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xbc, 0xa4, 0x9c, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9e, 0x8b, 0x84, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0xc4, 0xba, 0xbc, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0xb1, 0xaa, 0xa4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb1, 0xaa, 0xa4, 0xff,
+    0xc9, 0xc0, 0xb4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xac, 0x8e, 0x7c, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x80, 0x67, 0x5c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x62, 0x64, 0xff,
+    0x9c, 0x7a, 0x74, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x9c, 0x7a, 0x7c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0xbc, 0xa4, 0x9c, 0xff,
+    0x7f, 0x72, 0x6c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7c, 0x5e, 0x5c, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xa8, 0x9b, 0x94, 0xff,
+    0xc6, 0xb1, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0x78, 0x66, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xb0, 0xa3, 0x9c, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xf7, 0xdd, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0x94, 0x79, 0x6c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6f, 0x56, 0x44, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x64, 0x5a, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x75, 0x62, 0x64, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x8c, 0x6d, 0x6c, 0xff,
+    0x8c, 0x6d, 0x6c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8c, 0x6d, 0x6c, 0xff,
+    0x7c, 0x5e, 0x5c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x72, 0x62, 0x5c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x78, 0x66, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0xa4, 0x9e, 0xa4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xec, 0xdb, 0xcc, 0xff,
+    0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xf7, 0xdd, 0xcc, 0xff, 0x94, 0x76, 0x64, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x6f, 0x56, 0x44, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x74, 0x4e, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x8e, 0x79, 0x74, 0xff,
+    0x7c, 0x5e, 0x5c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x7d, 0x62, 0x5c, 0xff,
+    0x8c, 0x6e, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x7f, 0x6a, 0x64, 0xff,
+    0x78, 0x66, 0x64, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff,
+    0x7c, 0x5e, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x80, 0x67, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x50, 0x4e, 0x44, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xbf, 0xaa, 0xa4, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xd9, 0xcc, 0xbc, 0xff,
+    0xef, 0xe2, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x7c, 0x5c, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x7c, 0x5e, 0x5c, 0xff, 0x8c, 0x6d, 0x6c, 0xff, 0x9c, 0x80, 0x7c, 0xff,
+    0x8d, 0x72, 0x6b, 0xff, 0x69, 0x55, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x80, 0x67, 0x5c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x90, 0x7f, 0x74, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x90, 0x7f, 0x74, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x8e, 0x79, 0x74, 0xff, 0xac, 0x8d, 0x8c, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xc6, 0xb1, 0xb4, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xba, 0xb0, 0xa4, 0xff,
+    0xe6, 0xd6, 0xcc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xac, 0x8e, 0x7c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x78, 0x66, 0x64, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0xbf, 0xaa, 0xa4, 0xff,
+    0xad, 0x9e, 0x9e, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x9c, 0x80, 0x7c, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x80, 0x67, 0x5c, 0xff, 0x8a, 0x76, 0x6c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x9c, 0x7a, 0x74, 0xff, 0xad, 0x9a, 0x9c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x94, 0x8b, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0x84, 0x79, 0x7c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xa8, 0x9b, 0x94, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xe2, 0xdc, 0xcc, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0x94, 0x79, 0x6c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7c, 0x62, 0x54, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0xbc, 0xa4, 0x9c, 0xff, 0xc5, 0xb7, 0xb4, 0xff,
+    0xac, 0x8d, 0x8c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x7d, 0x62, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x75, 0x62, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x75, 0x62, 0x64, 0xff, 0x96, 0x86, 0x8c, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0xd4, 0xc6, 0xc4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xd9, 0xd4, 0xcc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0x9c, 0x7e, 0x6c, 0xff, 0x7c, 0x62, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x94, 0x79, 0x6c, 0xff, 0xbc, 0xa4, 0x9c, 0xff, 0xc7, 0xb8, 0xac, 0xff,
+    0x70, 0x66, 0x5c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7d, 0x62, 0x5c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x7c, 0x72, 0x64, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7d, 0x62, 0x5c, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0x75, 0x56, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x75, 0x62, 0x64, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0x7c, 0x5e, 0x5c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x6b, 0x56, 0x5c, 0xff,
+    0x6b, 0x56, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xc5, 0xb7, 0xb4, 0xff,
+    0xe2, 0xdc, 0xcc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xac, 0x8d, 0x84, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x74, 0x4e, 0x44, 0xff,
+    0x74, 0x4e, 0x44, 0xff, 0x75, 0x56, 0x54, 0xff, 0x74, 0x4e, 0x4c, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x8a, 0x76, 0x6c, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0x8a, 0x76, 0x6c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x7c, 0x5e, 0x5c, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0xbd, 0xa6, 0xa4, 0xff, 0x84, 0x77, 0x74, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x8d, 0x72, 0x6b, 0xff, 0x96, 0x85, 0x84, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff,
+    0x96, 0x86, 0x8c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x9e, 0x8b, 0x84, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xcc, 0xbe, 0xc4, 0xff, 0xa1, 0xa2, 0x9c, 0xff, 0xc7, 0xb8, 0xac, 0xff,
+    0xd7, 0xcc, 0xc4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xb4, 0x9a, 0x8c, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x74, 0x4e, 0x44, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x7d, 0x62, 0x5c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x9c, 0x80, 0x7c, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x8c, 0x6d, 0x6c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x7d, 0x62, 0x5c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0xad, 0x9a, 0x9c, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xa4, 0x9e, 0xa4, 0xff,
+    0x9e, 0x8e, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xc4, 0xba, 0xbc, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xb0, 0xa3, 0x9c, 0xff,
+    0xbc, 0xb6, 0xac, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xb1, 0xa3, 0x94, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xd9, 0xcc, 0xbc, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x7c, 0x72, 0x64, 0xff,
+    0x8f, 0x86, 0x7c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8e, 0x72, 0x74, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff,
+    0xbc, 0xaa, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff,
+    0xbd, 0xa6, 0xa4, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0xad, 0x9a, 0x9c, 0xff,
+    0xad, 0x9e, 0x9e, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x7f, 0x72, 0x6c, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xb0, 0xa3, 0x9c, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xea, 0xe4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0x7c, 0x72, 0x64, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x64, 0x5a, 0x4c, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5c, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x50, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x8c, 0x6d, 0x6c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x7f, 0x6a, 0x64, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x7d, 0x62, 0x5c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8e, 0x79, 0x74, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xad, 0x9a, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xc6, 0xb1, 0xb4, 0xff,
+    0xa4, 0x9e, 0xa4, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0x9e, 0x8e, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0xc5, 0xb7, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0xbc, 0xb6, 0xac, 0xff, 0xbf, 0xaa, 0xa4, 0xff, 0xc9, 0xc0, 0xb4, 0xff,
+    0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x94, 0x8b, 0x84, 0xff, 0x90, 0x7f, 0x74, 0xff, 0x71, 0x6a, 0x64, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x50, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x74, 0x4e, 0x4c, 0xff, 0x5c, 0x3e, 0x34, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x7f, 0x6a, 0x64, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x80, 0x67, 0x5c, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x77, 0x66, 0x6c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x78, 0x66, 0x64, 0xff, 0x77, 0x66, 0x6c, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xad, 0x9a, 0x9c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xbc, 0xaa, 0xac, 0xff,
+    0x9e, 0x8e, 0x94, 0xff, 0x9c, 0x7a, 0x7c, 0xff, 0x84, 0x79, 0x7c, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xcc, 0xc2, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xc5, 0xb7, 0xb4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xb0, 0xa3, 0x9c, 0xff,
+    0xd7, 0xcc, 0xc4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0x94, 0x8b, 0x84, 0xff, 0x90, 0x7f, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff,
+    0x7f, 0x72, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x7f, 0x6a, 0x64, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x72, 0x62, 0x5c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x72, 0x62, 0x5c, 0xff, 0x77, 0x66, 0x6c, 0xff, 0x75, 0x62, 0x64, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0x8e, 0x72, 0x74, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0x96, 0x86, 0x8c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc2, 0xbc, 0xff,
+    0xc4, 0xbe, 0xc4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0xa9, 0x9b, 0x8c, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xf2, 0xe4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xea, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x9c, 0x93, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x94, 0x8b, 0x84, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x5c, 0x42, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x70, 0x66, 0x5c, 0xff, 0x7f, 0x6a, 0x64, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x75, 0x62, 0x64, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0x7f, 0x72, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0xb0, 0xa3, 0x9c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x78, 0x77, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0xad, 0x9a, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xbc, 0xaa, 0xac, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xa8, 0x9b, 0x94, 0xff, 0xb0, 0xaa, 0x9c, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x92, 0x92, 0x8c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xdc, 0xdc, 0xdc, 0xff,
+    0xc8, 0xca, 0xc4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xc5, 0xb7, 0xb4, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x75, 0x62, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x74, 0x4e, 0x4c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x50, 0x4e, 0x44, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x7f, 0x6a, 0x64, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x75, 0x56, 0x54, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x7f, 0x72, 0x6c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x94, 0x8b, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9c, 0x80, 0x7c, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0xad, 0x9e, 0x9e, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0xc5, 0xb7, 0xb4, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xe4, 0xde, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf2, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xe4, 0xde, 0xdc, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0x75, 0x62, 0x64, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x74, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x70, 0x66, 0x5c, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x75, 0x62, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0x94, 0x8b, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x75, 0x62, 0x64, 0xff, 0x8e, 0x79, 0x74, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xad, 0x9e, 0x9e, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x94, 0x8e, 0x94, 0xff,
+    0xc5, 0xb7, 0xb4, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xc7, 0xb8, 0xac, 0xff,
+    0xf4, 0xea, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xb1, 0xaa, 0xa4, 0xff,
+    0x9c, 0x93, 0x8c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xe4, 0xde, 0xdc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xbd, 0xa6, 0xa4, 0xff,
+    0x9c, 0x7a, 0x7c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x7c, 0x5e, 0x5c, 0xff,
+    0x74, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x94, 0x8b, 0x84, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x9c, 0x93, 0x8c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x96, 0x86, 0x8c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xad, 0x9e, 0x9e, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xa1, 0xa2, 0x9c, 0xff,
+    0xc5, 0xb7, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0x9c, 0x93, 0x8c, 0xff,
+    0xef, 0xe2, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf2, 0xe4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0x94, 0x8e, 0x94, 0xff,
+    0x8b, 0x8b, 0x8c, 0xff, 0x71, 0x72, 0x6c, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xdc, 0xd6, 0xdc, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xbe, 0xc4, 0xff,
+    0xc6, 0xb1, 0xb4, 0xff, 0xb4, 0x96, 0x94, 0xff, 0x75, 0x62, 0x64, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x7d, 0x62, 0x5c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb0, 0xa3, 0x9c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0xec, 0xde, 0xdc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0xd6, 0xc5, 0xbc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x92, 0x92, 0x8c, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xbc, 0xaa, 0xac, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7f, 0x6a, 0x64, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0x9c, 0x93, 0x8c, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x89, 0x86, 0x84, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xdc, 0xd6, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x9c, 0x80, 0x7c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x84, 0x77, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xcc, 0xbe, 0xc4, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0xad, 0x9a, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xb0, 0xa3, 0x9c, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x71, 0x72, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0x94, 0x8e, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x53, 0x41, 0x3c, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x72, 0x62, 0x5c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x7f, 0x72, 0x6c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xa4, 0x9e, 0xa4, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xb1, 0xaa, 0xa4, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xa4, 0x9e, 0xa4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x7b, 0x7a, 0x7c, 0xff,
+    0x8b, 0x8b, 0x8c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x71, 0x72, 0x74, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x58, 0x49, 0x4c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff, 0x94, 0x8b, 0x84, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x84, 0x77, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0xa4, 0x9e, 0xa4, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xc5, 0xb7, 0xb4, 0xff,
+    0xe4, 0xe2, 0xd8, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x94, 0x8e, 0x94, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x75, 0x62, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x72, 0x62, 0x5c, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x77, 0x66, 0x6c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x75, 0x62, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x96, 0x86, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xc2, 0xc2, 0xbc, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xd6, 0xc5, 0xbc, 0xff,
+    0xb0, 0xa3, 0x9c, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xfc, 0xf2, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0x78, 0x77, 0x74, 0xff, 0x71, 0x72, 0x74, 0xff,
+    0x78, 0x77, 0x74, 0xff, 0x83, 0x82, 0x84, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xa4, 0x9e, 0xa4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x8c, 0x86, 0x8c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x78, 0x66, 0x64, 0xff, 0x96, 0x85, 0x84, 0xff, 0x7c, 0x72, 0x64, 0xff,
+    0x6b, 0x56, 0x5c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0x9e, 0x8e, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xf8, 0xea, 0xec, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc2, 0xc2, 0xbc, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0x8b, 0x8b, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff,
+    0x78, 0x66, 0x64, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x6b, 0x56, 0x5c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x84, 0x79, 0x7c, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xad, 0x9a, 0x9c, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xbe, 0xc4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xc8, 0xca, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xc2, 0xbc, 0xff,
+    0xcc, 0xc2, 0xbc, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xee, 0xdd, 0xd4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0x6b, 0x56, 0x5c, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xd5, 0xcd, 0xcc, 0xff,
+    0x77, 0x66, 0x6c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x7f, 0x72, 0x6c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x3e, 0x34, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xc4, 0xbe, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xcc, 0xc2, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x9c, 0x92, 0x84, 0xff,
+    0xe2, 0xdc, 0xcc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0x83, 0x82, 0x84, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x6b, 0x56, 0x5c, 0xff,
+    0xc5, 0xb7, 0xb4, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x72, 0x62, 0x5c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x7f, 0x72, 0x6c, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x75, 0x62, 0x64, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xc4, 0xba, 0xbc, 0xff,
+    0xad, 0x9e, 0x9e, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0xa4, 0x9e, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8e, 0x94, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xcc, 0xbe, 0xc4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xcc, 0xbd, 0xbc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0x8f, 0x86, 0x7c, 0xff,
+    0xa8, 0x9b, 0x94, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0x94, 0x8e, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x96, 0x86, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xc4, 0xba, 0xbc, 0xff,
+    0xd4, 0xc6, 0xc4, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x55, 0x55, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x71, 0x6a, 0x64, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x89, 0x86, 0x84, 0xff,
+    0x9c, 0x93, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0x9e, 0x8e, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xe4, 0xe1, 0xe4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc4, 0xbe, 0xc4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xd5, 0xcd, 0xcc, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xb1, 0xaa, 0xa4, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xfb, 0xf9, 0xec, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xcf, 0xc6, 0xcc, 0xff, 0xac, 0xa9, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0x7b, 0x7a, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xa4, 0x9e, 0xa4, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x71, 0x6a, 0x64, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x50, 0x4e, 0x44, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x3e, 0x34, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x3e, 0x34, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0xad, 0x9e, 0x9e, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0x78, 0x77, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xc5, 0xb7, 0xb4, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xcf, 0xc6, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xd4, 0xc6, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xc2, 0xbc, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0xe6, 0xd6, 0xcc, 0xff,
+    0xfc, 0xf2, 0xe4, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb1, 0xaa, 0xa4, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x78, 0x77, 0x74, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x7f, 0x6a, 0x64, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x7f, 0x72, 0x6c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xd5, 0xcd, 0xcc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xbd, 0xbc, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xa8, 0x9b, 0x94, 0xff,
+    0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xdc, 0xdc, 0xdc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8e, 0x94, 0xff,
+    0xc4, 0xbe, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x74, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x8f, 0x86, 0x7c, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0x96, 0x85, 0x84, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0x78, 0x66, 0x64, 0xff, 0x77, 0x66, 0x6c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0x89, 0x86, 0x84, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xb1, 0xaa, 0xa4, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xac, 0xa9, 0xac, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xdc, 0xd6, 0xdc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xcc, 0xbe, 0xc4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0x94, 0x8b, 0x84, 0xff,
+    0xba, 0xb0, 0xa4, 0xff, 0xf4, 0xea, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xe4, 0xe2, 0xd8, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xd7, 0xcc, 0xc4, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x3e, 0x34, 0xff,
+    0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x72, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x84, 0x79, 0x7c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xb1, 0xaa, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xc4, 0xbe, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xc4, 0xbe, 0xc4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0xcc, 0xbe, 0xac, 0xff, 0xfb, 0xf9, 0xec, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xa8, 0x9b, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x81, 0x72, 0x74, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0x6b, 0x56, 0x5c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa4, 0x9e, 0xa4, 0xff,
+    0xbd, 0xa6, 0xa4, 0xff, 0x84, 0x77, 0x74, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x74, 0x4e, 0x4c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x78, 0x66, 0x64, 0xff, 0x96, 0x85, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x78, 0x77, 0x74, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0x83, 0x82, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xf8, 0xea, 0xec, 0xff, 0xec, 0xe2, 0xe4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xcf, 0xc6, 0xcc, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0x90, 0x7f, 0x74, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xfb, 0xf9, 0xec, 0xff,
+    0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xc2, 0xc2, 0xbc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0x9c, 0x9a, 0x94, 0xff,
+    0x94, 0x8e, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9c, 0x9a, 0x94, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x58, 0x49, 0x4c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x7d, 0x62, 0x5c, 0xff,
+    0x53, 0x41, 0x3c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa4, 0x9e, 0xa4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xe4, 0xe1, 0xe4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xe4, 0xd2, 0xd4, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xd9, 0xd4, 0xcc, 0xff,
+    0xa8, 0x9b, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xd7, 0xcc, 0xc4, 0xff,
+    0xfb, 0xf9, 0xec, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xc4, 0xbe, 0xc4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa1, 0xa2, 0x9c, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x9c, 0x93, 0x8c, 0xff, 0xc4, 0xb2, 0xac, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x58, 0x49, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x72, 0x62, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x89, 0x86, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0x89, 0x86, 0x84, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xc4, 0xba, 0xbc, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xe4, 0xde, 0xdc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xf2, 0xf0, 0xec, 0xff,
+    0xcc, 0xbe, 0xc4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xd4, 0xc6, 0xc4, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0xfb, 0xf9, 0xec, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0x92, 0x92, 0x8c, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x75, 0x62, 0x64, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0x80, 0x67, 0x5c, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x89, 0x86, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0xa1, 0xa2, 0x9c, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xa4, 0x9e, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xfc, 0xf6, 0xf4, 0xff, 0xdc, 0xd6, 0xdc, 0xff,
+    0xd4, 0xc6, 0xc4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xd4, 0xc6, 0xc4, 0xff,
+    0xdc, 0xd6, 0xdc, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xa8, 0x93, 0x8c, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x58, 0x49, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x3e, 0x34, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x3e, 0x34, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0x9c, 0x9a, 0x94, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc2, 0xc2, 0xbc, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xd5, 0xcd, 0xcc, 0xff,
+    0xdc, 0xdc, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xec, 0xe2, 0xe4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0xcc, 0xc2, 0xbc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0xb0, 0xa3, 0x9c, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x94, 0x8e, 0x94, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xac, 0xa9, 0xac, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc8, 0xca, 0xc4, 0xff,
+    0xc2, 0xc2, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x64, 0x4e, 0x54, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x6b, 0x56, 0x5c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xa8, 0x9b, 0x94, 0xff,
+    0xbc, 0xaa, 0xac, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff,
+    0x69, 0x4e, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x53, 0x41, 0x3c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x8f, 0x86, 0x7c, 0xff,
+    0x78, 0x77, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0xad, 0x9e, 0x9e, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xa4, 0x9e, 0xa4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc8, 0xca, 0xc4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xf4, 0xf2, 0xf4, 0xff,
+    0xf4, 0xf2, 0xf4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xc4, 0xbe, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0xa8, 0x9b, 0x94, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x78, 0x77, 0x74, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0x88, 0x8a, 0x84, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x58, 0x49, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff,
+    0x58, 0x49, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x75, 0x62, 0x64, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x6c, 0x66, 0x6c, 0xff, 0x83, 0x82, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xc6, 0xb1, 0xb4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x69, 0x4e, 0x44, 0xff,
+    0x74, 0x5b, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x92, 0x92, 0x8c, 0xff,
+    0xa4, 0x9e, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xc6, 0xb1, 0xb4, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xc2, 0xbc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xcf, 0xc6, 0xcc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xec, 0xe2, 0xe4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xc4, 0xbe, 0xc4, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xf4, 0xea, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0x7b, 0x7a, 0x7c, 0xff,
+    0x83, 0x82, 0x84, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x71, 0x6a, 0x64, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0xdc, 0xba, 0xbc, 0xff, 0xc6, 0xb1, 0xb4, 0xff,
+    0x6b, 0x56, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x84, 0x77, 0x74, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x84, 0x79, 0x7c, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x89, 0x86, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x84, 0x79, 0x7c, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xac, 0xa9, 0xac, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc5, 0xb7, 0xb4, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xd7, 0xcc, 0xc4, 0xff,
+    0xfb, 0xf9, 0xec, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0xdc, 0xdc, 0xdc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa1, 0xa2, 0x9c, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x49, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xc4, 0xba, 0xbc, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xcc, 0xbe, 0xc4, 0xff, 0xc4, 0xba, 0xbc, 0xff,
+    0x8e, 0x72, 0x74, 0xff, 0x69, 0x55, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x78, 0x77, 0x74, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff, 0x84, 0x79, 0x7c, 0xff,
+    0xa8, 0x9b, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x92, 0x92, 0x8c, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xec, 0xea, 0xec, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcf, 0xc6, 0xcc, 0xff,
+    0xad, 0x9e, 0x9e, 0xff, 0x89, 0x86, 0x84, 0xff, 0xa8, 0x9b, 0x94, 0xff,
+    0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x71, 0x72, 0x6c, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0x92, 0x92, 0x8c, 0xff, 0x71, 0x72, 0x74, 0xff,
+    0x83, 0x82, 0x84, 0xff, 0x92, 0x92, 0x8c, 0xff, 0x83, 0x82, 0x84, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x83, 0x82, 0x84, 0xff,
+    0xa1, 0xa2, 0x9c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xa4, 0x9e, 0xa4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x75, 0x62, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x3e, 0x34, 0xff,
+    0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x54, 0x46, 0x3c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x94, 0x8e, 0x94, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc8, 0xca, 0xc4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xf4, 0xea, 0xe4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xc4, 0xba, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff,
+    0xd4, 0xc6, 0xc4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x90, 0x7f, 0x74, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x88, 0x8a, 0x84, 0xff, 0x71, 0x72, 0x74, 0xff, 0x64, 0x6a, 0x6c, 0xff,
+    0x8b, 0x8b, 0x8c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0x83, 0x82, 0x84, 0xff, 0x89, 0x86, 0x84, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0x96, 0x85, 0x84, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x7f, 0x72, 0x6c, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa4, 0x9e, 0xa4, 0xff,
+    0x9e, 0x8e, 0x94, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x89, 0x86, 0x84, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xe4, 0xe1, 0xe4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0x94, 0x8b, 0x84, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0x88, 0x8a, 0x84, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x83, 0x82, 0x84, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x6a, 0x64, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0x8b, 0x8b, 0x8c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x89, 0x86, 0x84, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0x8b, 0x8b, 0x8c, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x6a, 0x53, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x6c, 0x4a, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x90, 0x7f, 0x74, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcf, 0xc6, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xc8, 0xca, 0xc4, 0xff,
+    0xe4, 0xe1, 0xe4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xac, 0xa9, 0xac, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xc4, 0xba, 0xbc, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x94, 0x8b, 0x84, 0xff, 0xb4, 0xae, 0x9c, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x63, 0x6a, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x78, 0x77, 0x74, 0xff,
+    0x78, 0x77, 0x74, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0x83, 0x82, 0x84, 0xff, 0x75, 0x62, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0x84, 0x79, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9e, 0x8e, 0x94, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd9, 0xd4, 0xcc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xc8, 0xca, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0x9c, 0x93, 0x8c, 0xff,
+    0x88, 0x8a, 0x84, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x6a, 0x6c, 0xff,
+    0x88, 0x8a, 0x84, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x6c, 0x66, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x83, 0x82, 0x84, 0xff,
+    0x7b, 0x7a, 0x7c, 0xff, 0x71, 0x72, 0x6c, 0xff, 0x78, 0x77, 0x74, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x5c, 0x42, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x69, 0x4e, 0x4c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff,
+    0x75, 0x62, 0x64, 0xff, 0x96, 0x85, 0x84, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0x89, 0x86, 0x84, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x9c, 0x9a, 0x94, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xa4, 0x9e, 0xa4, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xc2, 0xc2, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff,
+    0xcf, 0xc6, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xd4, 0xc6, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc6, 0xb1, 0xb4, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xfb, 0xf9, 0xec, 0xff,
+    0xfb, 0xf9, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x64, 0x6a, 0x6c, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x71, 0x72, 0x74, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x66, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x71, 0x72, 0x74, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff,
+    0x5c, 0x42, 0x3c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x58, 0x49, 0x4c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x96, 0x85, 0x84, 0xff,
+    0x8e, 0x7a, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xb1, 0xaa, 0xa4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xd7, 0xd6, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xdc, 0xdc, 0xdc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0xcc, 0xbe, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0x92, 0x92, 0x8c, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x63, 0x6a, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x83, 0x82, 0x84, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x71, 0x72, 0x6c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x53, 0x41, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x8e, 0x7a, 0x7c, 0xff,
+    0x78, 0x77, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x75, 0x62, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x8c, 0x81, 0x84, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xd7, 0xd6, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xcf, 0xc6, 0xcc, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xcc, 0xbd, 0xbc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x94, 0x8e, 0x94, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x78, 0x77, 0x74, 0xff,
+    0x88, 0x8a, 0x84, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x61, 0x48, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x58, 0x49, 0x4c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x89, 0x86, 0x84, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xd4, 0xc6, 0xc4, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x69, 0x55, 0x54, 0xff, 0x75, 0x62, 0x64, 0xff,
+    0x94, 0x8c, 0x8c, 0xff, 0x89, 0x86, 0x84, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xb1, 0xaa, 0xa4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0x8b, 0x8b, 0x8c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xbe, 0xc4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xb4, 0xaa, 0xac, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xd7, 0xd6, 0xd4, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xe2, 0xdc, 0xcc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x94, 0x8e, 0x94, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xc5, 0xb7, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0x9e, 0x8e, 0x94, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff,
+    0xdc, 0xdc, 0xdc, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xe4, 0xe2, 0xd8, 0xff,
+    0xfb, 0xfe, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x64, 0x6a, 0x6c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x6b, 0x56, 0x5c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0xb1, 0xaa, 0xa4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xe4, 0xce, 0xcc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xc4, 0xbe, 0xc4, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xac, 0xa9, 0xac, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xe4, 0xe1, 0xe4, 0xff,
+    0xec, 0xea, 0xec, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xbe, 0xc4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0xcc, 0xbe, 0xc4, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xd8, 0xdc, 0xd4, 0xff, 0xe8, 0xe7, 0xe4, 0xff,
+    0xfb, 0xf9, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x78, 0x77, 0x74, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb1, 0xaa, 0xa4, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xe6, 0xd6, 0xd6, 0xff, 0xcc, 0xbd, 0xbc, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9e, 0x8b, 0x84, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xdc, 0xdc, 0xdc, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xd7, 0xd6, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xe8, 0xe7, 0xe4, 0xff,
+    0xe8, 0xe7, 0xe4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xd5, 0xcd, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff,
+    0xcf, 0xc6, 0xcc, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xc5, 0xb7, 0xb4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x78, 0x77, 0x74, 0xff,
+    0x8b, 0x8b, 0x8c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0xe4, 0xe1, 0xe4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xe8, 0xe7, 0xe4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xe4, 0xde, 0xdc, 0xff, 0xe4, 0xe1, 0xe4, 0xff,
+    0xf4, 0xf2, 0xf4, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xcf, 0xc6, 0xcc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xcf, 0xc6, 0xcc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xac, 0xa9, 0xac, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xe8, 0xe7, 0xe4, 0xff,
+    0xfb, 0xf9, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff,
+    0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x66, 0x6c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x7b, 0x7a, 0x7c, 0xff,
+    0x89, 0x86, 0x84, 0xff, 0x83, 0x82, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xbc, 0xb1, 0xb4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x84, 0x79, 0x7c, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0xdc, 0xdc, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xe4, 0xe1, 0xe4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xdc, 0xdc, 0xdc, 0xff,
+    0xec, 0xea, 0xec, 0xff, 0xec, 0xea, 0xec, 0xff, 0xd7, 0xd6, 0xd4, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xd7, 0xd6, 0xd4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd9, 0xd4, 0xcc, 0xff,
+    0xd8, 0xdc, 0xd4, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfb, 0xf9, 0xec, 0xff,
+    0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x71, 0x72, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x71, 0x72, 0x6c, 0xff, 0x7b, 0x7a, 0x7c, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0xa4, 0x9e, 0xa4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x84, 0x79, 0x7c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff,
+    0xd8, 0xdc, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd7, 0xd6, 0xd4, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xcc, 0xc5, 0xc4, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xcf, 0xc6, 0xcc, 0xff,
+    0xbc, 0xb6, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc8, 0xca, 0xc4, 0xff,
+    0xc8, 0xca, 0xc4, 0xff, 0xf2, 0xf0, 0xec, 0xff, 0xf2, 0xf0, 0xec, 0xff,
+    0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff,
+    0xfb, 0xfe, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff,
+    0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x7b, 0x7a, 0x7c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x78, 0x77, 0x74, 0xff,
+    0x83, 0x82, 0x84, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0xb3, 0xae, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff,
+    0xdc, 0xdc, 0xdc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff,
+    0xcf, 0xc6, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcf, 0xc6, 0xcc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0x8b, 0x8b, 0x8c, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xd9, 0xd4, 0xcc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xd8, 0xdc, 0xd4, 0xff, 0xfc, 0xfe, 0xf4, 0xff,
+    0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x7b, 0x7a, 0x7c, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x6b, 0x56, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x8c, 0x86, 0x8c, 0xff, 0xac, 0xa9, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff,
+    0xe4, 0xe1, 0xe4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff,
+    0xd7, 0xd6, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff,
+    0xdc, 0xdc, 0xdc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xe4, 0xe1, 0xe4, 0xff,
+    0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xa1, 0xa2, 0x9c, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xd8, 0xdc, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xf2, 0xf0, 0xec, 0xff,
+    0xfb, 0xf9, 0xec, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xfb, 0xf9, 0xec, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x71, 0x6a, 0x64, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0x94, 0x8c, 0x8c, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xd6, 0xd2, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff,
+    0xe4, 0xe1, 0xe4, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xe4, 0xe1, 0xe4, 0xff,
+    0xdc, 0xdc, 0xdc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xc8, 0xca, 0xc4, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xe8, 0xe7, 0xe4, 0xff,
+    0xfb, 0xf9, 0xec, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xe4, 0xe2, 0xd8, 0xff,
+    0xc9, 0xc0, 0xb4, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xb1, 0xa3, 0x94, 0xff,
+    0xbc, 0xa4, 0x9c, 0xff, 0xc0, 0xaa, 0x9c, 0xff, 0xd6, 0xc5, 0xbc, 0xff,
+    0xcc, 0xbe, 0xac, 0xff, 0xd9, 0xcc, 0xbc, 0xff, 0xe2, 0xdc, 0xcc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x8b, 0x8b, 0x8c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xbc, 0xb1, 0xb4, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0x64, 0x6a, 0x6c, 0xff,
+    0x83, 0x82, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xa1, 0x99, 0x9c, 0xff,
+    0xac, 0xa9, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xdc, 0xdc, 0xdc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xec, 0xea, 0xec, 0xff,
+    0xe8, 0xe7, 0xe4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc2, 0xc2, 0xbc, 0xff,
+    0xa3, 0xa3, 0xa4, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xb3, 0xae, 0xac, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xe8, 0xe7, 0xe4, 0xff,
+    0xd9, 0xd4, 0xcc, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xbc, 0xb6, 0xac, 0xff,
+    0xb0, 0xa3, 0x9c, 0xff, 0xc4, 0xb2, 0xac, 0xff, 0xbc, 0xa4, 0x9c, 0xff,
+    0xa4, 0x85, 0x84, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0xa7, 0x94, 0x84, 0xff,
+    0x9c, 0x8e, 0x7c, 0xff, 0xa9, 0x9b, 0x8c, 0xff, 0xb4, 0xaa, 0x94, 0xff,
+    0xbc, 0xb6, 0xac, 0xff, 0xda, 0xd4, 0xc4, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0xba, 0xb6, 0xb4, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x89, 0x86, 0x84, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x88, 0x8a, 0x84, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0x89, 0x86, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0x83, 0x82, 0x84, 0xff, 0x94, 0x8e, 0x94, 0xff,
+    0xd7, 0xd6, 0xd4, 0xff, 0xf4, 0xf2, 0xf4, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xdc, 0xdc, 0xdc, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xd8, 0xdc, 0xd4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff,
+    0xa1, 0x99, 0x9c, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xbc, 0xb6, 0xac, 0xff,
+    0xb1, 0xaa, 0xa4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xe4, 0xe2, 0xd8, 0xff,
+    0xf2, 0xf0, 0xec, 0xff, 0xd8, 0xdc, 0xd4, 0xff, 0xd5, 0xcd, 0xcc, 0xff,
+    0xcc, 0xbd, 0xbc, 0xff, 0xef, 0xe2, 0xdc, 0xff, 0xc6, 0xb1, 0xb4, 0xff,
+    0xac, 0x8d, 0x8c, 0xff, 0xac, 0x8d, 0x84, 0xff, 0xa4, 0x89, 0x7c, 0xff,
+    0x9c, 0x88, 0x7c, 0xff, 0x9c, 0x8e, 0x7c, 0xff, 0x9c, 0x8e, 0x7c, 0xff,
+    0xb1, 0xa3, 0x94, 0xff, 0xb1, 0xa3, 0x94, 0xff, 0xb4, 0xae, 0x9c, 0xff,
+    0xd9, 0xcc, 0xbc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x81, 0x7e, 0x7c, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x7b, 0x7a, 0x7c, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0x88, 0x8a, 0x84, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x83, 0x82, 0x84, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0x9c, 0x9a, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0x71, 0x72, 0x6c, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xec, 0xea, 0xec, 0xff,
+    0xe8, 0xe7, 0xe4, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xdc, 0xdc, 0xdc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xc4, 0xc3, 0xc4, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0x9c, 0x9a, 0x94, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xd7, 0xd6, 0xd4, 0xff,
+    0xf2, 0xf0, 0xec, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xcc, 0xc2, 0xbc, 0xff, 0xdc, 0xba, 0xbc, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x9c, 0x88, 0x7c, 0xff,
+    0x9c, 0x88, 0x7c, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0x8f, 0x86, 0x7c, 0xff,
+    0xa4, 0x86, 0x74, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0xa8, 0x93, 0x8c, 0xff,
+    0xb1, 0xa3, 0x94, 0xff, 0xb4, 0xae, 0x9c, 0xff, 0xe2, 0xdc, 0xcc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x64, 0x6a, 0x6c, 0xff,
+    0x83, 0x82, 0x84, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x83, 0x82, 0x84, 0xff,
+    0x8b, 0x8b, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0x7b, 0x7a, 0x7c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x94, 0x8e, 0x94, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+    0xe8, 0xe7, 0xe4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xdc, 0xd6, 0xdc, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xba, 0xb6, 0xb4, 0xff,
+    0xd9, 0xd4, 0xcc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff,
+    0xa1, 0x9e, 0x9c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xf4, 0xea, 0xe4, 0xff, 0xbc, 0xb0, 0xac, 0xff,
+    0xbc, 0xaa, 0xac, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xa8, 0x93, 0x8c, 0xff,
+    0xa4, 0x85, 0x84, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0xa8, 0x9b, 0x94, 0xff, 0xbc, 0xa4, 0x9c, 0xff, 0xbf, 0xaa, 0xa4, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0xac, 0x8d, 0x84, 0xff, 0x9c, 0x88, 0x7c, 0xff,
+    0x90, 0x7f, 0x74, 0xff, 0xac, 0x8d, 0x84, 0xff, 0xba, 0xb0, 0xa4, 0xff,
+    0xf4, 0xe9, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x7b, 0x7a, 0x7c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x71, 0x72, 0x74, 0xff,
+    0x88, 0x8a, 0x84, 0xff, 0x89, 0x86, 0x84, 0xff, 0x7b, 0x7a, 0x7c, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x78, 0x77, 0x74, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0xdc, 0xdc, 0xdc, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0x8b, 0x8b, 0x8c, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb9, 0xbc, 0xff,
+    0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xac, 0xa9, 0xac, 0xff,
+    0xdc, 0xdc, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xbc, 0xb0, 0xac, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x96, 0x86, 0x8c, 0xff,
+    0x9e, 0x8b, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa4, 0x85, 0x84, 0xff,
+    0xa4, 0x85, 0x84, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0xbd, 0xa6, 0xa4, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff,
+    0xa4, 0x85, 0x84, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xa7, 0x94, 0x84, 0xff,
+    0xba, 0xb0, 0xa4, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x63, 0x6a, 0x64, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x63, 0x6a, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x7b, 0x7a, 0x7c, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x9c, 0x9a, 0x94, 0xff,
+    0x71, 0x72, 0x74, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xc8, 0xca, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xe4, 0xe1, 0xe4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xd5, 0xcd, 0xcc, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0x9c, 0x80, 0x7c, 0xff,
+    0x9c, 0x7a, 0x7c, 0xff, 0xa4, 0x85, 0x84, 0xff, 0xa4, 0x85, 0x84, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0xb4, 0x96, 0x94, 0xff,
+    0xbd, 0xa6, 0xa4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xbc, 0xa4, 0x9c, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0x9c, 0x88, 0x7c, 0xff,
+    0x9c, 0x92, 0x84, 0xff, 0xc7, 0xb8, 0xac, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x50, 0x4e, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff,
+    0x83, 0x82, 0x84, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0xa1, 0xa2, 0x9c, 0xff, 0xb4, 0xb2, 0xb4, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0x83, 0x82, 0x84, 0xff,
+    0x7b, 0x7a, 0x7c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0xdc, 0xd6, 0xdc, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xd4, 0xc6, 0xc4, 0xff,
+    0xc6, 0xb1, 0xb4, 0xff, 0xe6, 0xd6, 0xd6, 0xff, 0xcc, 0xbe, 0xc4, 0xff,
+    0xb4, 0x96, 0x94, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x9c, 0x7a, 0x74, 0xff,
+    0x9c, 0x7a, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xb0, 0xa3, 0x9c, 0xff,
+    0xad, 0x9e, 0x9e, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0x90, 0x7f, 0x74, 0xff,
+    0x9c, 0x81, 0x74, 0xff, 0xa9, 0x9b, 0x8c, 0xff, 0xd8, 0xdc, 0xd4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xc4, 0xc3, 0xc4, 0xff,
+    0x9a, 0x94, 0x94, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x71, 0x72, 0x74, 0xff,
+    0x83, 0x82, 0x84, 0xff, 0x89, 0x86, 0x84, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff,
+    0xa6, 0x95, 0x94, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xe4, 0xd2, 0xd4, 0xff,
+    0xb4, 0x9b, 0x94, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x9c, 0x7a, 0x7c, 0xff,
+    0x9c, 0x7a, 0x74, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0xb4, 0x9b, 0x94, 0xff, 0xad, 0x9e, 0x9e, 0xff,
+    0xba, 0xb0, 0xa4, 0xff, 0xbf, 0xaa, 0xa4, 0xff, 0xa8, 0x93, 0x8c, 0xff,
+    0x84, 0x7e, 0x74, 0xff, 0x90, 0x7f, 0x74, 0xff, 0xa9, 0x9b, 0x8c, 0xff,
+    0xd9, 0xc6, 0xb4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0xa1, 0x9e, 0x9c, 0xff,
+    0x81, 0x7e, 0x7c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x64, 0x6a, 0x6c, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0xb4, 0xb2, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xac, 0xa9, 0xac, 0xff,
+    0x7b, 0x7a, 0x7c, 0xff, 0xbf, 0xaa, 0xa4, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x9c, 0x7a, 0x74, 0xff, 0x8e, 0x72, 0x74, 0xff,
+    0x9c, 0x7a, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8e, 0x79, 0x74, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xa8, 0x9b, 0x94, 0xff,
+    0xae, 0xa4, 0xa4, 0xff, 0xbf, 0xaa, 0xa4, 0xff, 0xa8, 0x93, 0x8c, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x8a, 0x76, 0x6c, 0xff, 0x84, 0x7e, 0x74, 0xff,
+    0xa9, 0x9b, 0x8c, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x83, 0x82, 0x84, 0xff,
+    0xb3, 0xae, 0xac, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xa3, 0xa3, 0xa4, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x7f, 0x72, 0x6c, 0xff,
+    0x8f, 0x7f, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8e, 0x79, 0x74, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa4, 0x85, 0x84, 0xff,
+    0xa8, 0x93, 0x8c, 0xff, 0xb4, 0x9b, 0x94, 0xff, 0xa8, 0x93, 0x8c, 0xff,
+    0x7f, 0x72, 0x6c, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x90, 0x7f, 0x74, 0xff,
+    0xa7, 0x94, 0x84, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xe4, 0xd2, 0xc4, 0xff,
+    0xf2, 0xe9, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x64, 0x6a, 0x6c, 0xff, 0x92, 0x92, 0x8c, 0xff, 0x64, 0x6a, 0x6c, 0xff,
+    0x83, 0x82, 0x84, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x8b, 0x8b, 0x8c, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7f, 0x72, 0x6c, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9c, 0x80, 0x7c, 0xff,
+    0x96, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9e, 0x8b, 0x84, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x9c, 0x92, 0x84, 0xff, 0x8e, 0x79, 0x74, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0xa7, 0x94, 0x84, 0xff, 0xb1, 0xa3, 0x94, 0xff,
+    0xda, 0xd4, 0xc4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x4e, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x71, 0x6a, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x71, 0x72, 0x6c, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x96, 0x86, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff,
+    0xa4, 0x85, 0x84, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x8d, 0x72, 0x6b, 0xff,
+    0x78, 0x66, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x9c, 0x7a, 0x74, 0xff, 0xa4, 0x89, 0x7c, 0xff,
+    0xa8, 0x9b, 0x94, 0xff, 0xe2, 0xdc, 0xcc, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x78, 0x66, 0x64, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xbc, 0xaa, 0xac, 0xff,
+    0xac, 0x8d, 0x8c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x75, 0x62, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff, 0xbd, 0xa6, 0xa4, 0xff,
+    0x9c, 0x80, 0x7c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x9c, 0x7a, 0x74, 0xff,
+    0x9c, 0x88, 0x7c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xe4, 0xe2, 0xd8, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x70, 0x66, 0x5c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x77, 0x66, 0x6c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x84, 0x79, 0x7c, 0xff,
+    0x96, 0x86, 0x8c, 0xff, 0xac, 0x8d, 0x84, 0xff, 0x8e, 0x72, 0x74, 0xff,
+    0x7f, 0x6a, 0x64, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xba, 0xb0, 0xa4, 0xff,
+    0xb4, 0x9b, 0x94, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x8e, 0x79, 0x74, 0xff,
+    0x8e, 0x79, 0x74, 0xff, 0x84, 0x7e, 0x74, 0xff, 0xda, 0xd4, 0xc4, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x53, 0x41, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x8e, 0x79, 0x74, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff,
+    0x72, 0x62, 0x5c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x9d, 0x8d, 0x8c, 0xff,
+    0xa8, 0x9b, 0x94, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8e, 0x79, 0x74, 0xff,
+    0x7f, 0x72, 0x6c, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xb1, 0xaa, 0xa4, 0xff,
+    0xe4, 0xe2, 0xd8, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff,
+    0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x64, 0x4e, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x6b, 0x56, 0x5c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x6b, 0x56, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x77, 0x66, 0x6c, 0xff,
+    0x7e, 0x6d, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff,
+    0x9d, 0x8d, 0x8c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x7f, 0x72, 0x6c, 0xff,
+    0x7f, 0x72, 0x6c, 0xff, 0x7c, 0x72, 0x64, 0xff, 0x94, 0x8b, 0x84, 0xff,
+    0xda, 0xd4, 0xc4, 0xff, 0xf4, 0xea, 0xe4, 0xff, 0xf2, 0xe9, 0xdc, 0xff,
+    0xf4, 0xea, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x6f, 0x6c, 0x6c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x8c, 0x81, 0x84, 0xff, 0x81, 0x72, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x84, 0x7e, 0x74, 0xff,
+    0xc2, 0xbe, 0xbc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xc9, 0xc0, 0xb4, 0xff,
+    0xf4, 0xea, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x69, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x81, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x77, 0x66, 0x6c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x71, 0x72, 0x6c, 0xff,
+    0xb1, 0xaa, 0xa4, 0xff, 0xd6, 0xc5, 0xbc, 0xff, 0x9a, 0x94, 0x94, 0xff,
+    0xd9, 0xd4, 0xcc, 0xff, 0xe4, 0xe2, 0xd8, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x6b, 0x56, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x6c, 0x61, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x6c, 0x61, 0x64, 0xff,
+    0x6c, 0x66, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff,
+    0x84, 0x77, 0x74, 0xff, 0x89, 0x86, 0x84, 0xff, 0x8f, 0x86, 0x7c, 0xff,
+    0xcc, 0xc2, 0xbc, 0xff, 0xe4, 0xe2, 0xd8, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x2e, 0x34, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x71, 0x6a, 0x64, 0xff,
+    0x71, 0x6a, 0x64, 0xff, 0x70, 0x66, 0x5c, 0xff, 0x72, 0x62, 0x5c, 0xff,
+    0x88, 0x8a, 0x84, 0xff, 0xa8, 0x9b, 0x94, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff,
+    0x63, 0x66, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x72, 0x5b, 0x54, 0xff,
+    0x78, 0x77, 0x74, 0xff, 0x8f, 0x86, 0x7c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x5d, 0x62, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x70, 0x5e, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x70, 0x66, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x6b, 0x56, 0x5c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x2e, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x49, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x2c, 0x26, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x64, 0x4e, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x53, 0x41, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x50, 0x4e, 0x44, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x2e, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x46, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x4e, 0x54, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x53, 0x41, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x50, 0x4e, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x3a, 0x3c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x50, 0x4e, 0x44, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x30, 0x2a, 0x24, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3c, 0x32, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x64, 0x5d, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x34, 0x2e, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x50, 0x4e, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x30, 0x2a, 0x24, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x64, 0x4e, 0x54, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x44, 0x46, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff,
+    0x30, 0x2a, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x46, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x46, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x30, 0x2a, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x30, 0x26, 0x24, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x46, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x30, 0x2a, 0x24, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff,
+    0x3c, 0x32, 0x2c, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x53, 0x41, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x53, 0x41, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x2c, 0x26, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x2a, 0x24, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x58, 0x49, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x2e, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x30, 0x26, 0x24, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x46, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x55, 0x52, 0x4c, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x3a, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x5d, 0x5a, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x53, 0x41, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x30, 0x2a, 0x24, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x30, 0x26, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x30, 0x26, 0x24, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3c, 0x32, 0x2c, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x5c, 0x3e, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x49, 0x4c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x53, 0x41, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x2c, 0x26, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x2c, 0x26, 0x2c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x2c, 0x26, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x30, 0x2a, 0x24, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x30, 0x26, 0x24, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x55, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x55, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x53, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x30, 0x26, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x2c, 0x26, 0x2c, 0xff,
+    0x2c, 0x26, 0x2c, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x2c, 0x26, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x34, 0x2e, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x2e, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x4e, 0x42, 0x44, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x30, 0x2a, 0x24, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x34, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x2c, 0x26, 0x2c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x2c, 0x26, 0x2c, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x55, 0x55, 0x54, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff,
+    0x30, 0x2a, 0x24, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff,
+    0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x55, 0x52, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x3c, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff,
+    0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff,
+    0x49, 0x4a, 0x4c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff,
+    0x33, 0x2c, 0x2c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff,
+    0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff,
+    0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff,
+};
+
+#endif  // WEBP_TESTS_FUZZER_IMG_PEAK_H_
diff --git a/third_party/libwebp/tests/fuzzer/makefile.unix b/third_party/libwebp/tests/fuzzer/makefile.unix
new file mode 100644
index 0000000..4a9bff3
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/makefile.unix
@@ -0,0 +1,31 @@
+# This Makefile will compile all fuzzing targets. It doesn't check tool
+# requirements and paths may need to be updated depending on your environment.
+# Note a clang 6+ toolchain is assumed for use of -fsanitize=fuzzer.
+
+CC = clang
+CXX = clang++
+CFLAGS = -fsanitize=fuzzer -I../../src -I../.. -Wall -Wextra
+CXXFLAGS = $(CFLAGS)
+LDFLAGS = -fsanitize=fuzzer
+LDLIBS = ../../src/mux/libwebpmux.a ../../src/demux/libwebpdemux.a
+LDLIBS += ../../src/libwebp.a ../../imageio/libimageio_util.a
+LDLIBS += ../../sharpyuv/libsharpyuv.a
+
+FUZZERS = advanced_api_fuzzer animation_api_fuzzer animencoder_fuzzer
+FUZZERS += animdecoder_fuzzer mux_demux_api_fuzzer enc_dec_fuzzer
+FUZZERS += simple_api_fuzzer
+
+%.o: fuzz_utils.h img_alpha.h img_grid.h img_peak.h
+all: $(FUZZERS)
+
+define FUZZER_template
+$(1): $$(addsuffix .o, $(1)) $(LDLIBS)
+OBJS += $$(addsuffix .o, $(1))
+endef
+
+$(foreach fuzzer, $(FUZZERS), $(eval $(call FUZZER_template, $(fuzzer))))
+
+clean:
+	$(RM) $(FUZZERS) $(OBJS)
+
+.PHONY: all clean
diff --git a/third_party/libwebp/tests/fuzzer/mux_demux_api_fuzzer.c b/third_party/libwebp/tests/fuzzer/mux_demux_api_fuzzer.c
new file mode 100644
index 0000000..4ed0142
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/mux_demux_api_fuzzer.c
@@ -0,0 +1,96 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "./fuzz_utils.h"
+#include "src/webp/demux.h"
+#include "src/webp/mux.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
+  WebPData webp_data;
+  WebPDataInit(&webp_data);
+  webp_data.size = size;
+  webp_data.bytes = data;
+
+  // Extracted chunks and frames are not processed or decoded,
+  // which is already covered extensively by the other fuzz targets.
+
+  if (size & 1) {
+    // Mux API
+    WebPMux* mux = WebPMuxCreate(&webp_data, size & 2);
+    if (!mux) return 0;
+
+    WebPData chunk;
+    WebPMuxGetChunk(mux, "EXIF", &chunk);
+    WebPMuxGetChunk(mux, "ICCP", &chunk);
+    WebPMuxGetChunk(mux, "FUZZ", &chunk);  // unknown
+
+    uint32_t flags;
+    WebPMuxGetFeatures(mux, &flags);
+
+    WebPMuxAnimParams params;
+    WebPMuxGetAnimationParams(mux, &params);
+
+    WebPMuxError status;
+    WebPMuxFrameInfo info;
+    for (int i = 0; i < kFuzzFrameLimit; i++) {
+      status = WebPMuxGetFrame(mux, i + 1, &info);
+      if (status == WEBP_MUX_NOT_FOUND) {
+        break;
+      } else if (status == WEBP_MUX_OK) {
+        WebPDataClear(&info.bitstream);
+      }
+    }
+
+    WebPMuxDelete(mux);
+  } else {
+    // Demux API
+    WebPDemuxer* demux;
+    if (size & 2) {
+      WebPDemuxState state;
+      demux = WebPDemuxPartial(&webp_data, &state);
+      if (state < WEBP_DEMUX_PARSED_HEADER) {
+        WebPDemuxDelete(demux);
+        return 0;
+      }
+    } else {
+      demux = WebPDemux(&webp_data);
+      if (!demux) return 0;
+    }
+
+    WebPChunkIterator chunk_iter;
+    if (WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter)) {
+      WebPDemuxNextChunk(&chunk_iter);
+    }
+    WebPDemuxReleaseChunkIterator(&chunk_iter);
+    if (WebPDemuxGetChunk(demux, "ICCP", 0, &chunk_iter)) {  // 0 == last
+      WebPDemuxPrevChunk(&chunk_iter);
+    }
+    WebPDemuxReleaseChunkIterator(&chunk_iter);
+    // Skips FUZZ because the Demux API has no concept of (un)known chunks.
+
+    WebPIterator iter;
+    if (WebPDemuxGetFrame(demux, 1, &iter)) {
+      for (int i = 1; i < kFuzzFrameLimit; i++) {
+        if (!WebPDemuxNextFrame(&iter)) break;
+      }
+    }
+
+    WebPDemuxReleaseIterator(&iter);
+    WebPDemuxDelete(demux);
+  }
+
+  return 0;
+}
diff --git a/third_party/libwebp/tests/fuzzer/simple_api_fuzzer.c b/third_party/libwebp/tests/fuzzer/simple_api_fuzzer.c
new file mode 100644
index 0000000..7d2b7f8
--- /dev/null
+++ b/third_party/libwebp/tests/fuzzer/simple_api_fuzzer.c
@@ -0,0 +1,88 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "./fuzz_utils.h"
+#include "src/webp/decode.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
+  int w, h;
+  if (!WebPGetInfo(data, size, &w, &h)) return 0;
+  if ((size_t)w * h > kFuzzPxLimit) return 0;
+
+  const uint8_t value = FuzzHash(data, size);
+  uint8_t* buf = NULL;
+
+  // For *Into functions, which decode into an external buffer, an
+  // intentionally too small buffer can be given with low probability.
+  if (value < 0x16) {
+    buf = WebPDecodeRGBA(data, size, &w, &h);
+  } else if (value < 0x2b) {
+    buf = WebPDecodeBGRA(data, size, &w, &h);
+#if !defined(WEBP_REDUCE_CSP)
+  } else if (value < 0x40) {
+    buf = WebPDecodeARGB(data, size, &w, &h);
+  } else if (value < 0x55) {
+    buf = WebPDecodeRGB(data, size, &w, &h);
+  } else if (value < 0x6a) {
+    buf = WebPDecodeBGR(data, size, &w, &h);
+#endif  // !defined(WEBP_REDUCE_CSP)
+  } else if (value < 0x7f) {
+    uint8_t *u, *v;
+    int stride, uv_stride;
+    buf = WebPDecodeYUV(data, size, &w, &h, &u, &v, &stride, &uv_stride);
+  } else if (value < 0xe8) {
+    const int stride = (value < 0xbe ? 4 : 3) * w;
+    size_t buf_size = stride * h;
+    if (value % 0x10 == 0) buf_size--;
+    uint8_t* const ext_buf = (uint8_t*)malloc(buf_size);
+    if (value < 0x94) {
+      WebPDecodeRGBAInto(data, size, ext_buf, buf_size, stride);
+#if !defined(WEBP_REDUCE_CSP)
+    } else if (value < 0xa9) {
+      WebPDecodeARGBInto(data, size, ext_buf, buf_size, stride);
+    } else if (value < 0xbe) {
+      WebPDecodeBGRInto(data, size, ext_buf, buf_size, stride);
+    } else if (value < 0xd3) {
+      WebPDecodeRGBInto(data, size, ext_buf, buf_size, stride);
+#endif  // !defined(WEBP_REDUCE_CSP)
+    } else {
+      WebPDecodeBGRAInto(data, size, ext_buf, buf_size, stride);
+    }
+    free(ext_buf);
+  } else {
+    size_t luma_size = w * h;
+    const int uv_stride = (w + 1) / 2;
+    size_t u_size = uv_stride * (h + 1) / 2;
+    size_t v_size = uv_stride * (h + 1) / 2;
+    if (value % 0x10 == 0) {
+      if (size & 1) luma_size--;
+      if (size & 2) u_size--;
+      if (size & 4) v_size--;
+    }
+    uint8_t* const luma_buf = (uint8_t*)malloc(luma_size);
+    uint8_t* const u_buf = (uint8_t*)malloc(u_size);
+    uint8_t* const v_buf = (uint8_t*)malloc(v_size);
+    WebPDecodeYUVInto(data, size, luma_buf, luma_size, w /* luma_stride */,
+                      u_buf, u_size, uv_stride, v_buf, v_size, uv_stride);
+    free(luma_buf);
+    free(u_buf);
+    free(v_buf);
+  }
+
+  if (buf) WebPFree(buf);
+
+  return 0;
+}
diff --git a/third_party/libwebp/webp_js/README.md b/third_party/libwebp/webp_js/README.md
new file mode 100644
index 0000000..824afa0
--- /dev/null
+++ b/third_party/libwebp/webp_js/README.md
@@ -0,0 +1,81 @@
+# WebP JavaScript decoder
+
+```
+ __   __ ____ ____ ____     __  ____
+/  \\/  \  _ \  _ \  _ \   (__)/  __\
+\       /  __/ _  \  __/   _)  \_   \
+ \__\__/_____/____/_/     /____/____/
+```
+
+This file describes the compilation of libwebp into a JavaScript decoder using
+Emscripten and CMake.
+
+-   install the Emscripten SDK following the procedure described at:
+    https://emscripten.org/docs/getting_started/downloads.html#installation-instructions-using-the-emsdk-recommended
+    After installation, you should have some global variable positioned to the
+    location of the SDK. In particular, $EMSDK should point to the top-level
+    directory containing Emscripten tools.
+
+-   configure the project 'WEBP_JS' with CMake using:
+
+    ```shell
+    cd webp_js && \
+    emcmake cmake -DWEBP_BUILD_WEBP_JS=ON \
+          ../
+    ```
+
+-   compile webp.js using 'emmake make'.
+
+-   that's it! Upon completion, you should have the 'webp.js', 'webp.js.mem',
+    'webp_wasm.js' and 'webp_wasm.wasm' files generated.
+
+The callable JavaScript function is WebPToSDL(), which decodes a raw WebP
+bitstream into a canvas. See webp_js/index.html for a simple usage sample (see
+below for instructions).
+
+## Demo HTML page
+
+The HTML page webp_js/index.html requires the built files 'webp.js' and
+'webp.js.mem' to be copied to webp_js/. An HTTP server to serve the WebP image
+example is also needed. With Python, just run:
+
+```shell
+cd webp_js && python3 -m http.server 8080
+```
+
+and then navigate to http://localhost:8080 in your favorite browser.
+
+## Web-Assembly (WASM) version:
+
+CMakeLists.txt is configured to build the WASM version when using the option
+WEBP_BUILD_WEBP_JS=ON. The compilation step will assemble the files
+'webp_wasm.js' and 'webp_wasm.wasm' that you then need to copy to the webp_js/
+directory.
+
+See webp_js/index_wasm.html for a simple demo page using the WASM version of the
+library.
+
+You will need a fairly recent version of Emscripten (at least 2.0.18,
+latest-upstream is recommended) and of your WASM-enabled browser to run this
+version.
+
+## Caveats
+
+-   First decoding using the library is usually slower, due to just-in-time
+    compilation.
+
+-   Some versions of llvm produce the following compile error when SSE2 is
+    enabled.
+
+    ```
+    "Unsupported:   %516 = bitcast <8 x i16> %481 to i128
+    LLVM ERROR: BitCast Instruction not yet supported for integer types larger than 64 bits"
+    ```
+
+    The corresponding Emscripten bug is at:
+    https://github.com/kripken/emscripten/issues/3788
+
+    Therefore, SSE2 optimization is currently disabled in CMakeLists.txt.
+
+-   If WEBP_ENABLE_SIMD is set to 1 the JavaScript version (webp.js) will be
+    disabled as wasm2js does not support SIMD.
diff --git a/third_party/libwebp/webp_js/index.html b/third_party/libwebp/webp_js/index.html
index 10873a9..33cacb4 100644
--- a/third_party/libwebp/webp_js/index.html
+++ b/third_party/libwebp/webp_js/index.html
@@ -18,7 +18,7 @@
 var WebpToCanvas;
 
 function init() {
-  WebpToCanvas = Module.cwrap('WebpToSDL', 'number', ['array', 'number']);
+  WebpToCanvas = Module.cwrap('WebPToSDL', 'number', ['array', 'number']);
 }
 window.onload = init;
 
diff --git a/third_party/libwebp/webp_js/index_wasm.html b/third_party/libwebp/webp_js/index_wasm.html
index b77c22c..5d7c17e 100644
--- a/third_party/libwebp/webp_js/index_wasm.html
+++ b/third_party/libwebp/webp_js/index_wasm.html
@@ -34,7 +34,7 @@
   var result;
   if (Module["asm"] != undefined) {
     // wrapper for the function decoding a WebP into a canvas object
-    WebpToCanvas = Module.cwrap('WebpToSDL', 'number', ['array', 'number']);
+    WebpToCanvas = Module.cwrap('WebPToSDL', 'number', ['array', 'number']);
     // get the canvas to decode into
     var canvas = document.getElementById(canvas_id);
     if (canvas == null) return;
diff --git a/third_party/libwebp/xcframeworkbuild.sh b/third_party/libwebp/xcframeworkbuild.sh
new file mode 100755
index 0000000..8d484c2
--- /dev/null
+++ b/third_party/libwebp/xcframeworkbuild.sh
@@ -0,0 +1,255 @@
+#!/bin/bash
+#
+# This script generates 'WebP.xcframework', 'WebPDecoder.xcframework',
+# 'WebPDemux.xcframework' and 'WebPMux.xcframework'.
+# An iOS, Mac or Mac Catalyst app can decode WebP images by including
+# 'WebPDecoder.xcframework' and both encode and decode WebP images by including
+# 'WebP.xcframework'.
+#
+# Run ./xcframeworkbuild.sh to generate the frameworks under the current
+# directory (the previous build will be erased if it exists).
+#
+
+set -e
+
+# Set these variables based on the desired minimum deployment target.
+readonly IOS_MIN_VERSION=6.0
+readonly MACOSX_MIN_VERSION=10.15
+readonly MACOSX_CATALYST_MIN_VERSION=14.0
+
+# Extract Xcode version.
+readonly XCODE=$(xcodebuild -version | grep Xcode | cut -d " " -f2)
+if [[ -z "${XCODE}" ]] || [[ "${XCODE%%.*}" -lt 11 ]]; then
+  echo "Xcode 11.0 or higher is required!"
+  exit 1
+fi
+
+# Extract the latest SDK version from the final field of the form: iphoneosX.Y
+# / macosxX.Y
+readonly SDK=($(
+  xcodebuild -showsdks \
+    | grep iphoneos | sort | tail -n 1 | awk '{print substr($NF, 9)}'
+  xcodebuild -showsdks \
+    | grep macosx | sort | tail -n 1 | awk '{print substr($NF, 7)}'
+))
+readonly IOS=0
+readonly MACOS=1
+readonly IOS_SIMULATOR=2
+readonly MACOS_CATALYST=3
+readonly NUM_PLATFORMS=4
+
+readonly OLDPATH=${PATH}
+
+# Names should be of the form '<platform>-[<variant>-]<architecture>'.
+PLATFORMS[$IOS]="iPhoneOS-armv7 iPhoneOS-armv7s iPhoneOS-arm64"
+PLATFORMS[$IOS_SIMULATOR]="iPhoneSimulator-i386 iPhoneSimulator-x86_64"
+PLATFORMS[$MACOS]="MacOSX-x86_64"
+PLATFORMS[$MACOS_CATALYST]="MacOSX-Catalyst-x86_64"
+if [[ "${XCODE%%.*}" -ge 12 ]]; then
+  PLATFORMS[$MACOS]+=" MacOSX-arm64"
+  PLATFORMS[$MACOS_CATALYST]+=" MacOSX-Catalyst-arm64"
+  PLATFORMS[$IOS_SIMULATOR]+=" iPhoneSimulator-arm64"
+elif [[ "${XCODE%%.*}" -eq 11 ]]; then
+  cat << EOF
+WARNING: Xcode 12.0 or higher is required to build targets for
+WARNING: Apple Silicon (arm64). The XCFrameworks generated with Xcode 11 will
+WARNING: contain libraries for MacOS & Catalyst supporting x86_64 only.
+WARNING: The build will continue in 5 seconds...
+EOF
+  sleep 5
+else
+  echo "Xcode 11.0 or higher is required!"
+  exit 1
+fi
+readonly PLATFORMS
+readonly SRCDIR=$(dirname $0)
+readonly TOPDIR=$(pwd)
+readonly BUILDDIR="${TOPDIR}/xcframeworkbuild"
+readonly TARGETDIR="${TOPDIR}/WebP.xcframework"
+readonly DECTARGETDIR="${TOPDIR}/WebPDecoder.xcframework"
+readonly MUXTARGETDIR="${TOPDIR}/WebPMux.xcframework"
+readonly DEMUXTARGETDIR="${TOPDIR}/WebPDemux.xcframework"
+readonly DEVELOPER=$(xcode-select --print-path)
+readonly DEVROOT="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain"
+readonly PLATFORMSROOT="${DEVELOPER}/Platforms"
+readonly LIPO=$(xcrun -sdk iphoneos${SDK[$IOS]} -find lipo)
+
+if [[ -z "${SDK[$IOS]}" ]] || [[ ${SDK[$IOS]%%.*} -lt 8 ]]; then
+  echo "iOS SDK version 8.0 or higher is required!"
+  exit 1
+fi
+
+#######################################
+# Moves Headers/*.h to Headers/<framework>/
+#
+# Places framework headers in a subdirectory to avoid Xcode errors when using
+# multiple frameworks:
+#   error: Multiple commands produce
+#     '.../Build/Products/Debug-iphoneos/include/types.h'
+# Arguments:
+#   $1 - path to framework
+#######################################
+update_headers_path() {
+  local framework_name="$(basename ${1%.xcframework})"
+  local subdir
+  for d in $(find "$1" -path "*/Headers"); do
+    subdir="$d/$framework_name"
+    mkdir "$subdir"
+    mv "$d/"*.h "$subdir"
+  done
+}
+
+echo "Xcode Version: ${XCODE}"
+echo "iOS SDK Version: ${SDK[$IOS]}"
+echo "MacOS SDK Version: ${SDK[$MACOS]}"
+
+if [[ -e "${BUILDDIR}" || -e "${TARGETDIR}" || -e "${DECTARGETDIR}" \
+      || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" ]]; then
+  cat << EOF
+WARNING: The following directories will be deleted:
+WARNING:   ${BUILDDIR}
+WARNING:   ${TARGETDIR}
+WARNING:   ${DECTARGETDIR}
+WARNING:   ${MUXTARGETDIR}
+WARNING:   ${DEMUXTARGETDIR}
+WARNING: The build will continue in 5 seconds...
+EOF
+  sleep 5
+fi
+rm -rf ${BUILDDIR} ${TARGETDIR} ${DECTARGETDIR} \
+  ${MUXTARGETDIR} ${DEMUXTARGETDIR}
+
+if [[ ! -e ${SRCDIR}/configure ]]; then
+  if ! (cd ${SRCDIR} && sh autogen.sh); then
+    cat << EOF
+Error creating configure script!
+This script requires the autoconf/automake and libtool to build. MacPorts or
+Homebrew can be used to obtain these:
+https://www.macports.org/install.php
+https://brew.sh/
+EOF
+    exit 1
+  fi
+fi
+
+for (( i = 0; i < $NUM_PLATFORMS; ++i )); do
+  LIBLIST=()
+  DECLIBLIST=()
+  MUXLIBLIST=()
+  DEMUXLIBLIST=()
+
+  for PLATFORM in ${PLATFORMS[$i]}; do
+    ROOTDIR="${BUILDDIR}/${PLATFORM}"
+    mkdir -p "${ROOTDIR}"
+
+    ARCH="${PLATFORM##*-}"
+    case "${PLATFORM}" in
+      iPhone*)
+        sdk="${SDK[$IOS]}"
+        ;;
+      MacOS*)
+        sdk="${SDK[$MACOS]}"
+        ;;
+      *)
+        echo "Unrecognized platform: ${PLATFORM}!"
+        exit 1
+        ;;
+    esac
+
+    SDKROOT="${PLATFORMSROOT}/${PLATFORM%%-*}.platform/"
+    SDKROOT+="Developer/SDKs/${PLATFORM%%-*}${sdk}.sdk/"
+    CFLAGS="-pipe -isysroot ${SDKROOT} -O3 -DNDEBUG"
+    case "${PLATFORM}" in
+      iPhone*)
+        CFLAGS+=" -fembed-bitcode"
+        CFLAGS+=" -target ${ARCH}-apple-ios${IOS_MIN_VERSION}"
+        [[ "${PLATFORM}" == *Simulator* ]] && CFLAGS+="-simulator"
+        ;;
+      MacOSX-Catalyst*)
+        CFLAGS+=" -target"
+        CFLAGS+=" ${ARCH}-apple-ios${MACOSX_CATALYST_MIN_VERSION}-macabi"
+        ;;
+      MacOSX*)
+        CFLAGS+=" -mmacosx-version-min=${MACOSX_MIN_VERSION}"
+        ;;
+    esac
+
+    set -x
+    export PATH="${DEVROOT}/usr/bin:${OLDPATH}"
+    ${SRCDIR}/configure --host=${ARCH/arm64/aarch64}-apple-darwin \
+      --build=$(${SRCDIR}/config.guess) \
+      --prefix=${ROOTDIR} \
+      --disable-shared --enable-static \
+      --enable-libwebpdecoder --enable-swap-16bit-csp \
+      --enable-libwebpmux \
+      CC="clang -arch ${ARCH}" \
+      CFLAGS="${CFLAGS}"
+    set +x
+
+    # Build only the libraries, skip the examples.
+    make V=0 -C sharpyuv
+    make V=0 -C src install
+
+    LIBLIST+=("${ROOTDIR}/lib/libwebp.a")
+    DECLIBLIST+=("${ROOTDIR}/lib/libwebpdecoder.a")
+    MUXLIBLIST+=("${ROOTDIR}/lib/libwebpmux.a")
+    DEMUXLIBLIST+=("${ROOTDIR}/lib/libwebpdemux.a")
+    # xcodebuild requires a directory for the -headers option, these will match
+    # for all builds.
+    make -C src install-data DESTDIR="${ROOTDIR}/lib-headers"
+    make -C src install-commonHEADERS DESTDIR="${ROOTDIR}/dec-headers"
+    make -C src/demux install-data DESTDIR="${ROOTDIR}/demux-headers"
+    make -C src/mux install-data DESTDIR="${ROOTDIR}/mux-headers"
+    LIB_HEADERS="${ROOTDIR}/lib-headers/${ROOTDIR}/include/webp"
+    DEC_HEADERS="${ROOTDIR}/dec-headers/${ROOTDIR}/include/webp"
+    DEMUX_HEADERS="${ROOTDIR}/demux-headers/${ROOTDIR}/include/webp"
+    MUX_HEADERS="${ROOTDIR}/mux-headers/${ROOTDIR}/include/webp"
+
+    make distclean
+
+    export PATH=${OLDPATH}
+  done
+
+  [[ -z "${LIBLIST[@]}" ]] && continue
+
+  # Create a temporary target directory for each <platform>[-<variant>].
+  target_dir="${BUILDDIR}/${PLATFORMS[$i]}"
+  target_dir="${target_dir%% *}"
+  target_dir="${target_dir%-*}"
+  target_lib="${target_dir}/$(basename ${LIBLIST[0]})"
+  target_declib="${target_dir}/$(basename ${DECLIBLIST[0]})"
+  target_demuxlib="${target_dir}/$(basename ${DEMUXLIBLIST[0]})"
+  target_muxlib="${target_dir}/$(basename ${MUXLIBLIST[0]})"
+
+  mkdir -p "${target_dir}"
+  ${LIPO} -create ${LIBLIST[@]} -output "${target_lib}"
+  ${LIPO} -create ${DECLIBLIST[@]} -output "${target_declib}"
+  ${LIPO} -create ${DEMUXLIBLIST[@]} -output "${target_demuxlib}"
+  ${LIPO} -create ${MUXLIBLIST[@]} -output "${target_muxlib}"
+  FAT_LIBLIST+=(-library "${target_lib}" -headers "${LIB_HEADERS}")
+  FAT_DECLIBLIST+=(-library "${target_declib}" -headers "${DEC_HEADERS}")
+  FAT_DEMUXLIBLIST+=(-library "${target_demuxlib}" -headers "${DEMUX_HEADERS}")
+  FAT_MUXLIBLIST+=(-library "${target_muxlib}" -headers "${MUX_HEADERS}")
+done
+
+# lipo will not put archives with the same architecture (e.g., x86_64
+# iPhoneSimulator & MacOS) in the same fat output file. xcodebuild
+# -create-xcframework requires universal archives to avoid e.g.:
+#   Both ios-x86_64-maccatalyst and ios-arm64-maccatalyst represent two
+#   equivalent library definitions
+set -x
+xcodebuild -create-xcframework "${FAT_LIBLIST[@]}" \
+  -output ${TARGETDIR}
+xcodebuild -create-xcframework "${FAT_DECLIBLIST[@]}" \
+  -output ${DECTARGETDIR}
+xcodebuild -create-xcframework "${FAT_DEMUXLIBLIST[@]}" \
+  -output ${DEMUXTARGETDIR}
+xcodebuild -create-xcframework "${FAT_MUXLIBLIST[@]}" \
+  -output ${MUXTARGETDIR}
+update_headers_path "${TARGETDIR}"
+update_headers_path "${DECTARGETDIR}"
+update_headers_path "${DEMUXTARGETDIR}"
+update_headers_path "${MUXTARGETDIR}"
+set +x
+
+echo  "SUCCESS"
diff --git a/third_party/linux-syscall-support/codereview.settings b/third_party/linux-syscall-support/codereview.settings
deleted file mode 100644
index b5082e8..0000000
--- a/third_party/linux-syscall-support/codereview.settings
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file is used by git cl to get repository specific information.
-CC_LIST: chromium-reviews@chromium.org,mseaborn@chromium.org
-CODE_REVIEW_SERVER: codereview.chromium.org
-GERRIT_HOST: True
-VIEW_VC: https://chromium.googlesource.com/linux-syscall-support/+/
diff --git a/third_party/llvm-project/codereview.settings b/third_party/llvm-project/codereview.settings
deleted file mode 100644
index 8f94e07..0000000
--- a/third_party/llvm-project/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by git cl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/llvm-project/libcxx/BUILD.gn b/third_party/llvm-project/libcxx/BUILD.gn
index 1d47c23..0c80cac 100644
--- a/third_party/llvm-project/libcxx/BUILD.gn
+++ b/third_party/llvm-project/libcxx/BUILD.gn
@@ -119,7 +119,4 @@
     "//third_party/llvm-project/libcxxabi:cxxabi",
     "//third_party/musl:c",
   ]
-  if (!build_with_separate_cobalt_toolchain) {
-    deps += [ "//third_party/llvm-project/libunwind:unwind_evergreen" ]
-  }
 }
diff --git a/third_party/llvm-project/libcxx/include/locale b/third_party/llvm-project/libcxx/include/locale
index 1c502de..5e925e8 100644
--- a/third_party/llvm-project/libcxx/include/locale
+++ b/third_party/llvm-project/libcxx/include/locale
@@ -215,7 +215,7 @@
 // NOLINTBEGIN(libcpp-robust-against-adl)
 
 #include "starboard/configuration.h"
-#if !SB_IS(EVERGREEN)
+#if !SB_IS(MODULAR)
 #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
 // Most unix variants have catopen.  These are the specific ones that don't.
 #  if !defined(__BIONIC__) && !defined(_NEWLIB_VERSION) && !defined(__EMSCRIPTEN__)
@@ -223,7 +223,7 @@
 #    include <nl_types.h>
 #  endif
 #endif
-#endif // !SB_IS(EVERGREEN)
+#endif // !SB_IS(MODULAR)
 
 #ifdef _LIBCPP_LOCALE__L_EXTENSIONS
 #include <__bsd_locale_defaults.h>
diff --git a/third_party/llvm-project/libcxx/src/thread.cpp b/third_party/llvm-project/libcxx/src/thread.cpp
index 737fdc3..d7fe18e 100644
--- a/third_party/llvm-project/libcxx/src/thread.cpp
+++ b/third_party/llvm-project/libcxx/src/thread.cpp
@@ -16,11 +16,11 @@
 #include <thread>
 #include <vector>
 
-#if !SB_IS(EVERGREEN)
+#if !SB_IS(MODULAR)
 #if __has_include(<unistd.h>)
 # include <unistd.h> // for sysconf
 #endif
-#endif // !SB_IS(EVERGREEN)
+#endif // !SB_IS(MODULAR)
 
 #if defined(__NetBSD__)
 #pragma weak pthread_create // Do not create libpthread dependency
diff --git a/third_party/llvm-project/libcxxabi/BUILD.gn b/third_party/llvm-project/libcxxabi/BUILD.gn
index 0ed1b42..9142fa4 100644
--- a/third_party/llvm-project/libcxxabi/BUILD.gn
+++ b/third_party/llvm-project/libcxxabi/BUILD.gn
@@ -90,7 +90,4 @@
   all_dependent_configs = [ ":cxxabi_dependents_config" ]
 
   deps = [ "//third_party/musl:c" ]
-  if (!build_with_separate_cobalt_toolchain) {
-    deps += [ "//third_party/llvm-project/libunwind:unwind_evergreen" ]
-  }
 }
diff --git a/third_party/llvm-project/libcxxabi/src/cxa_exception.cpp b/third_party/llvm-project/libcxxabi/src/cxa_exception.cpp
index 9cb2bf8..b4535b6 100644
--- a/third_party/llvm-project/libcxxabi/src/cxa_exception.cpp
+++ b/third_party/llvm-project/libcxxabi/src/cxa_exception.cpp
@@ -19,7 +19,7 @@
 #include "fallback_malloc.h"
 #include "include/atomic_support.h" // from libc++
 
-#if __has_feature(address_sanitizer)
+#if __has_feature(address_sanitizer) && !defined(STARBOARD)
 #include <sanitizer/asan_interface.h>
 #endif
 
@@ -268,7 +268,7 @@
 
     exception_header->unwindHeader.exception_cleanup = exception_cleanup_func;
 
-#if __has_feature(address_sanitizer)
+#if __has_feature(address_sanitizer) && !defined(STARBOARD)
     // Inform the ASan runtime that now might be a good time to clean stuff up.
     __asan_handle_no_return();
 #endif
diff --git a/third_party/llvm-project/libunwind/BUILD.gn b/third_party/llvm-project/libunwind/BUILD.gn
index 44d7882..5972c1e 100644
--- a/third_party/llvm-project/libunwind/BUILD.gn
+++ b/third_party/llvm-project/libunwind/BUILD.gn
@@ -12,6 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import("//starboard/build/config/os_definitions.gni")
+
 common_sources = [
   "src/AddressSpace.hpp",
   "src/CompactUnwinder.hpp",
@@ -55,7 +57,8 @@
 # dependencies from spilling over to gn check when run for non-evergreen
 # platforms (e.g., raspi-2_gn_devel). It can and should be removed once the gn
 # check errors have been resolved for evergreen.
-if (sb_is_evergreen) {
+# TODO: b/295702296 Fix libunwind for modular  builds.
+if (sb_is_evergreen || (sb_is_modular && is_host_os_win)) {
   config("unwind_evergreen_config") {
     configs = [ ":common_unwind_dependents_config" ]
 
diff --git a/third_party/metrics_proto/BUILD.gn b/third_party/metrics_proto/BUILD.gn
index a0cb8a6..aa95a30 100644
--- a/third_party/metrics_proto/BUILD.gn
+++ b/third_party/metrics_proto/BUILD.gn
@@ -1,16 +1,6 @@
-# Copyright 2023 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 import("//third_party/protobuf/proto_library.gni")
 
@@ -39,9 +29,19 @@
     "user_action_event.proto",
   ]
   proto_in_dir = "."
-  # TODO(b/282037939): Remove this when python proto are supported or disabled
-  # by default.
+
   if (use_cobalt_customizations) {
+    # TODO(b/282037939): Remove this when python proto are supported or disabled
+    # by default.
     generate_python = false
+
+    sources += [ "cobalt_uma_event.proto" ]
+    # Currently unused protos removed to save on binary size. See b/290819695.
+    sources -= [
+      "memory_leak_report.proto",
+      "omnibox_event.proto",
+      "omnibox_input_type.proto",
+      "sampled_profile.proto",
+    ]
   }
 }
diff --git a/third_party/metrics_proto/METADATA b/third_party/metrics_proto/METADATA
index 1ccb02f..d35eb74 100644
--- a/third_party/metrics_proto/METADATA
+++ b/third_party/metrics_proto/METADATA
@@ -5,9 +5,9 @@
 third_party {
   url {
     type: GIT
-    value: "https://chromium.googlesource.com/chromium/src/third_party/metrics_proto/"
+    value: "https://chromium.googlesource.com/chromium/src"
   }
-  version: "fd3a73980b82eea000403c2c9c1f204f6612e7cf"
+  version: "70.0.3538.124"
   last_upgrade_date {
     year: 2018
     month: 8
diff --git a/third_party/metrics_proto/README.chromium b/third_party/metrics_proto/README.chromium
new file mode 100644
index 0000000..cad75d8
--- /dev/null
+++ b/third_party/metrics_proto/README.chromium
@@ -0,0 +1,19 @@
+Name: Metrics Protos
+Short Name: metrics_proto
+URL: This is the canonical public repository
+Version: 210962504
+Date: 2018/08/30 UTC
+License: BSD
+Security Critical: Yes
+
+Description:
+This package contains the protos that are used to upload metrics data to Google.
+Updates to this code should be made by changing the internal copies, and then
+running the export script.
+
+blaze run //analysis/uma/proto_export:proto_export -- \
+  --from_piper \
+  --output=$CHROMIUM_SRC/third_party/metrics_proto
+
+Local Modifications:
+Unchanged from the output of the export script.
diff --git a/third_party/metrics_proto/README.cobalt b/third_party/metrics_proto/README.cobalt
deleted file mode 100644
index 7b3bdc8..0000000
--- a/third_party/metrics_proto/README.cobalt
+++ /dev/null
@@ -1,15 +0,0 @@
-Name: Metrics Protos
-Short Name: metrics_proto
-URL: This is the canonical public repository
-Version: 210142511
-Date: 2018/08/24 UTC
-License: BSD
-Security Critical: Yes
-
-Description:
-This package contains the protos that are used to upload metrics data to Google.
-Updates to this code should be made by changing the internal copies, and then
-propagating them here.
-
-Local Modifications:
-Unchanged from internal proto.
diff --git a/third_party/metrics_proto/cast_logs.proto b/third_party/metrics_proto/cast_logs.proto
index 6d2a1be..9ea0b57 100644
--- a/third_party/metrics_proto/cast_logs.proto
+++ b/third_party/metrics_proto/cast_logs.proto
@@ -160,7 +160,7 @@
   repeated CastConnectionInfo cast_connection_info = 2;
 
   // Stores Cast-enabled device specific events with a various context data.
-  // Next tag: 18
+  // Next tag: 19
   message CastEventProto {
     // The name of the action, hashed by same logic used to hash user action
     // event and histogram.
@@ -203,6 +203,8 @@
 
     optional string aogh_request_id = 16;
 
+    optional int64 aogh_local_agent_id = 18;
+
     // Optional value associated with the event. For example, may be used for
     // error codes.
     message Metadata {
diff --git a/third_party/metrics_proto/chrome_user_metrics_extension.proto b/third_party/metrics_proto/chrome_user_metrics_extension.proto
index 7255f27..788b674 100644
--- a/third_party/metrics_proto/chrome_user_metrics_extension.proto
+++ b/third_party/metrics_proto/chrome_user_metrics_extension.proto
@@ -13,12 +13,14 @@
 
 import "cast_logs.proto";
 import "histogram_event.proto";
-import "memory_leak_report.proto";
-import "omnibox_event.proto";
+// Cobalt-only change to reduce compiled binary byte size. See b/290819695.
+//import "memory_leak_report.proto";
+//import "omnibox_event.proto";
 import "perf_data.proto";
 import "printer_event.proto";
 import "reporting_info.proto";
-import "sampled_profile.proto";
+// Cobalt-only change to reduce compiled binary byte size. See b/290819695.
+//import "sampled_profile.proto";
 import "system_profile.proto";
 import "translate_event.proto";
 import "user_action_event.proto";
@@ -66,7 +68,8 @@
 
   // This message will log one or more of the following event types:
   repeated UserActionEventProto user_action_event = 4;
-  repeated OmniboxEventProto omnibox_event = 5;
+  // Cobalt-only change to reduce compiled binary byte size. See b/290819695.
+  //repeated OmniboxEventProto omnibox_event = 5;
   repeated HistogramEventProto histogram_event = 6;
   repeated TranslateEventProto translate_event = 15;
   repeated PrinterEventProto printer_event = 16;
@@ -74,14 +77,16 @@
   // Deprecated: use |sampled_profile| instead.
   repeated PerfDataProto perf_data = 8 [deprecated = true];
 
+  // Cobalt-only change to reduce compiled binary byte size. See b/290819695.
   // A list of all collected sample-based profiles since the last UMA upload.
-  repeated SampledProfile sampled_profile = 11;
+  //repeated SampledProfile sampled_profile = 11;
 
   // Additional data related with Cast-enabled devices.
   optional CastLogsProto cast_logs = 12;
 
+  // Cobalt-only change to reduce compiled binary byte size. See b/290819695.
   // Memory leak reports generated since the last UMA upload.
-  repeated MemoryLeakReportProto memory_leak_report = 13;
+  //repeated MemoryLeakReportProto memory_leak_report = 13;
 
   // The ReportingInfo message sent in the X-Chrome-UMA-ReportingInfo header.
   // Copied in by the receiving server.
diff --git a/third_party/metrics_proto/cobalt_uma_event.proto b/third_party/metrics_proto/cobalt_uma_event.proto
new file mode 100644
index 0000000..720d4a8
--- /dev/null
+++ b/third_party/metrics_proto/cobalt_uma_event.proto
@@ -0,0 +1,82 @@
+// Copyright 2023 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto2";
+
+option optimize_for = LITE_RUNTIME;
+
+package cobalt.browser.metrics;
+
+import "histogram_event.proto";
+import "reporting_info.proto";
+import "user_action_event.proto";
+
+// CobaltUMAEvent is a trimmed down version of the Chrome UMA
+// ChromeUserMetricsExtension proto suitable for consumption by systems other
+// than "official" UMA backends.
+//
+// IMPORTANT!! READ THIS BEFORE MODIFYING THIS PROTO!!
+//
+// As this proto definition is copied and reused downstream from Cobalt, this
+// proto must be kept backwards compatible indefinitely. In short it means these
+// rules must be followed:
+//
+//   - Do not rename anything. Fields, messages, enums, etc. should always
+//     maintain their original names.
+//   - Do not reuse field numbers. Once a field number has been used, it can
+//     never used for a different field.
+//   - Do not change the "optional" or "required" status of a field.
+//   - Do not change the default value of a field.
+//
+// If you need to delete a field (including enum fields), reserve both the id
+// and field name like so:
+//
+//     BEFORE:
+//
+//       optional int32 id = 42;
+//       enum MyEnum {
+//         FOO = 1;
+//         BAR = 2;
+//       }
+//
+//     AFTER:
+//
+//       // Deleted field "id", do not reuse tag numbers or field name.
+//       reserved 42;
+//       reserved "id";
+//
+//       enum MyEnum {
+//         FOO = 1;
+//         // Deleted "BAR", do not reuse the field number or nname.
+//         reserved 2;
+//         reserved "BAR";
+//       }
+//
+// To deprecate a field use the "deprecated" tag as follows:
+//
+//     // Deprecated, use bar_count instead.
+//     optional int32 foo_count = 7 [deprecated = true];
+//
+// Next ID: 4
+message CobaltUMAEvent {
+  // Stores information about an event that occurs in response to a user action.
+  repeated .metrics.UserActionEventProto user_action_event = 1;
+
+  // Histogram-collected metrics.
+  repeated .metrics.HistogramEventProto histogram_event = 2;
+
+  // Extra information attached to reports by client at upload time. For
+  // example, failed attempt count, error codes, etc.
+  optional .metrics.ReportingInfo reporting_info = 3;
+}
diff --git a/third_party/metrics_proto/sampled_profile.proto b/third_party/metrics_proto/sampled_profile.proto
index 64adf2f..ea29b73 100644
--- a/third_party/metrics_proto/sampled_profile.proto
+++ b/third_party/metrics_proto/sampled_profile.proto
@@ -46,6 +46,11 @@
 
     // The profile was collected after a thread was determined to be hung.
     THREAD_HUNG = 6;
+
+    // The heap profile was triggered by periodic sampling. The time intervals
+    // between trigger events conform to the Poisson process with certain mean
+    // interval between collections.
+    PERIODIC_HEAP_COLLECTION = 7;
   }
   optional TriggerEvent trigger_event = 1;
 
diff --git a/third_party/metrics_proto/system_profile.proto b/third_party/metrics_proto/system_profile.proto
index 96f129d..edfcaab 100644
--- a/third_party/metrics_proto/system_profile.proto
+++ b/third_party/metrics_proto/system_profile.proto
@@ -960,6 +960,7 @@
     RTANALYTICS_LIGHT = 21;
     RTANALYTICS_FULL = 22;
     CELLULAR = 23;
+    DEMO_MODE_RESOURCES = 24;
   }
 
   // Information about what Chrome components are registered and at which
diff --git a/third_party/mini_chromium/codereview.settings b/third_party/mini_chromium/codereview.settings
deleted file mode 100644
index 2df1829..0000000
--- a/third_party/mini_chromium/codereview.settings
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2009 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-GERRIT_HOST: True
-GERRIT_SQUASH_UPLOADS: True
-CODE_REVIEW_SERVER: https://canary-chromium-review.googlesource.com/
-VIEW_VC: https://chromium.googlesource.com/chromium/mini_chromium/+/
-PROJECT: mini_chromium
diff --git a/third_party/musl/codereview.settings b/third_party/musl/codereview.settings
deleted file mode 100644
index 8f94e07..0000000
--- a/third_party/musl/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by git cl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/musl/src/exit/atexit.c b/third_party/musl/src/exit/atexit.c
index b8f3b85..254eeb7 100644
--- a/third_party/musl/src/exit/atexit.c
+++ b/third_party/musl/src/exit/atexit.c
@@ -54,12 +54,14 @@
 	}
 }
 
+#if !defined(ADDRESS_SANITIZER)
 void __cxa_finalize(void *dso)
 {
 #ifdef STARBOARD
   __funcs_on_exit();
 #endif  // STARBOARD
 }
+#endif  // !defined(ADDRESS_SANITIZER)
 
 int __cxa_atexit(void (*func)(void *), void *arg, void *dso)
 {
diff --git a/third_party/musl/src/string/memccpy.c b/third_party/musl/src/string/memccpy.c
index 3b0a370..5dafded 100644
--- a/third_party/musl/src/string/memccpy.c
+++ b/third_party/musl/src/string/memccpy.c
@@ -7,6 +7,11 @@
 #define HIGHS (ONES * (UCHAR_MAX/2+1))
 #define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
 
+#if defined(USE_COBALT_CUSTOMIZATIONS)
+#ifdef __GNUC__
+__attribute__((no_sanitize("address")))
+#endif  // __GNUC__
+#endif  // defined(USE_COBALT_CUSTOMIZATIONS)
 void *memccpy(void *restrict dest, const void *restrict src, int c, size_t n)
 {
 	unsigned char *d = dest;
diff --git a/third_party/musl/src/string/memchr.c b/third_party/musl/src/string/memchr.c
index 65f0d78..c0a01f6 100644
--- a/third_party/musl/src/string/memchr.c
+++ b/third_party/musl/src/string/memchr.c
@@ -8,6 +8,11 @@
 #define HIGHS (ONES * (UCHAR_MAX/2+1))
 #define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
 
+#if defined(USE_COBALT_CUSTOMIZATIONS)
+#ifdef __GNUC__
+__attribute__((no_sanitize("address")))
+#endif  // __GNUC__
+#endif  // defined(USE_COBALT_CUSTOMIZATIONS)
 void *memchr(const void *src, int c, size_t n)
 {
 	const unsigned char *s = src;
diff --git a/third_party/musl/src/string/stpcpy.c b/third_party/musl/src/string/stpcpy.c
index 4db46a9..369c188 100644
--- a/third_party/musl/src/string/stpcpy.c
+++ b/third_party/musl/src/string/stpcpy.c
@@ -7,6 +7,11 @@
 #define HIGHS (ONES * (UCHAR_MAX/2+1))
 #define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
 
+#if defined(USE_COBALT_CUSTOMIZATIONS)
+#ifdef __GNUC__
+__attribute__((no_sanitize("address")))
+#endif  // __GNUC__
+#endif  // defined(USE_COBALT_CUSTOMIZATIONS)
 char *__stpcpy(char *restrict d, const char *restrict s)
 {
 #ifdef __GNUC__
diff --git a/third_party/musl/src/string/stpncpy.c b/third_party/musl/src/string/stpncpy.c
index f57fa6b..398a47f 100644
--- a/third_party/musl/src/string/stpncpy.c
+++ b/third_party/musl/src/string/stpncpy.c
@@ -7,6 +7,11 @@
 #define HIGHS (ONES * (UCHAR_MAX/2+1))
 #define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
 
+#if defined(USE_COBALT_CUSTOMIZATIONS)
+#ifdef __GNUC__
+__attribute__((no_sanitize("address")))
+#endif  // __GNUC__
+#endif  // defined(USE_COBALT_CUSTOMIZATIONS)
 char *__stpncpy(char *restrict d, const char *restrict s, size_t n)
 {
 #ifdef __GNUC__
diff --git a/third_party/musl/src/string/strchrnul.c b/third_party/musl/src/string/strchrnul.c
index 39e2635..e517fe1 100644
--- a/third_party/musl/src/string/strchrnul.c
+++ b/third_party/musl/src/string/strchrnul.c
@@ -7,6 +7,11 @@
 #define HIGHS (ONES * (UCHAR_MAX/2+1))
 #define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
 
+#if defined(USE_COBALT_CUSTOMIZATIONS)
+#ifdef __GNUC__
+__attribute__((no_sanitize("address")))
+#endif  // __GNUC__
+#endif  // defined(USE_COBALT_CUSTOMIZATIONS)
 char *__strchrnul(const char *s, int c)
 {
 	c = (unsigned char)c;
diff --git a/third_party/musl/src/string/strlcpy.c b/third_party/musl/src/string/strlcpy.c
index ffa0b0b..334f49f 100644
--- a/third_party/musl/src/string/strlcpy.c
+++ b/third_party/musl/src/string/strlcpy.c
@@ -8,6 +8,11 @@
 #define HIGHS (ONES * (UCHAR_MAX/2+1))
 #define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
 
+#if defined(USE_COBALT_CUSTOMIZATIONS)
+#ifdef __GNUC__
+__attribute__((no_sanitize("address")))
+#endif  // __GNUC__
+#endif  // defined(USE_COBALT_CUSTOMIZATIONS)
 size_t strlcpy(char *d, const char *s, size_t n)
 {
 	char *d0 = d;
diff --git a/third_party/musl/src/string/strlen.c b/third_party/musl/src/string/strlen.c
index 309990f..bc812e2 100644
--- a/third_party/musl/src/string/strlen.c
+++ b/third_party/musl/src/string/strlen.c
@@ -7,6 +7,11 @@
 #define HIGHS (ONES * (UCHAR_MAX/2+1))
 #define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
 
+#if defined(USE_COBALT_CUSTOMIZATIONS)
+#ifdef __GNUC__
+__attribute__((no_sanitize("address")))
+#endif  // __GNUC__
+#endif  // defined(USE_COBALT_CUSTOMIZATIONS)
 size_t strlen(const char *s)
 {
 	const char *a = s;
diff --git a/third_party/musl/test/type_size_test.cc b/third_party/musl/test/type_size_test.cc
index 2dfc2cb..f85a0ce 100644
--- a/third_party/musl/test/type_size_test.cc
+++ b/third_party/musl/test/type_size_test.cc
@@ -14,7 +14,7 @@
 
 #include "starboard/configuration.h"
 
-#if SB_IS(EVERGREEN)
+#if SB_IS(MODULAR)
 
 #include <inttypes.h>
 #include <limits.h>
@@ -194,4 +194,4 @@
                   SB_SIZE_OF_INT_is_inconsistent_with_sizeof_wchar_t);
 #endif  // SB_IS(ARCH_X86)
 
-#endif  // SB_IS(EVERGREEN)
+#endif  // SB_IS(MODULAR)
diff --git a/third_party/opus/.gitattributes b/third_party/opus/.gitattributes
deleted file mode 100644
index 649c810..0000000
--- a/third_party/opus/.gitattributes
+++ /dev/null
@@ -1,10 +0,0 @@
-.gitignore		export-ignore
-.gitattributes		export-ignore
-
-update_version		export-ignore
-
-*.bat eol=crlf
-*.sln eol=crlf
-*.vcxproj eol=crlf
-*.vcxproj.filters eol=crlf
-common.props eol=crlf
diff --git a/third_party/opus/.gitignore b/third_party/opus/.gitignore
deleted file mode 100644
index 8cf3ed1..0000000
--- a/third_party/opus/.gitignore
+++ /dev/null
@@ -1,87 +0,0 @@
-Doxyfile
-Makefile
-Makefile.in
-TAGS
-aclocal.m4
-autom4te.cache
-*.kdevelop.pcs
-*.kdevses
-compile
-config.guess
-config.h
-!/*/config.h
-config.h.in
-config.log
-config.status
-config.sub
-configure
-depcomp
-INSTALL
-install-sh
-.deps
-.libs
-.dirstamp
-*.a
-*.exe
-*.la
-*-gnu.S
-testcelt
-libtool
-ltmain.sh
-missing
-m4/libtool.m4
-m4/ltoptions.m4
-m4/ltsugar.m4
-m4/ltversion.m4
-m4/lt~obsolete.m4
-opus_compare
-opus_demo
-repacketizer_demo
-stamp-h1
-test-driver
-*.sw*
-*.o
-*.lo
-*.pc
-*.tar.gz
-*~
-tests/*test
-tests/test_opus_api
-tests/test_opus_decode
-tests/test_opus_encode
-tests/test_opus_padding
-tests/test_opus_projection
-celt/arm/armopts.s
-celt/dump_modes/dump_modes
-celt/tests/test_unit_cwrs32
-celt/tests/test_unit_dft
-celt/tests/test_unit_entropy
-celt/tests/test_unit_laplace
-celt/tests/test_unit_mathops
-celt/tests/test_unit_mdct
-celt/tests/test_unit_rotation
-celt/tests/test_unit_types
-doc/doxygen_sqlite3.db
-doc/doxygen-build.stamp
-doc/html
-doc/latex
-doc/man
-package_version
-version.h
-!/*/version.h
-celt/Debug
-celt/Release
-celt/x64
-silk/Debug
-silk/Release
-silk/x64
-silk/fixed/Debug
-silk/fixed/Release
-silk/fixed/x64
-silk/float/Debug
-silk/float/Release
-silk/float/x64
-silk/tests/test_unit_LPC_inv_pred_gain
-src/Debug
-src/Release
-src/x64
diff --git a/third_party/opus/celt/dump_modes/Makefile b/third_party/opus/celt/dump_modes/Makefile
new file mode 100644
index 0000000..93f599f
--- /dev/null
+++ b/third_party/opus/celt/dump_modes/Makefile
@@ -0,0 +1,32 @@
+
+CFLAGS=-O2 -Wall -Wextra -DHAVE_CONFIG_H
+INCLUDES=-I. -I../ -I../.. -I../../include
+
+SOURCES = dump_modes.c \
+          ../modes.c \
+          ../cwrs.c \
+          ../rate.c \
+          ../entcode.c \
+          ../entenc.c \
+          ../entdec.c \
+          ../mathops.c \
+          ../mdct.c \
+          ../kiss_fft.c
+
+ifdef HAVE_ARM_NE10
+CC = gcc
+CFLAGS += -mfpu=neon
+INCLUDES += -I$(NE10_INCDIR) -DHAVE_ARM_NE10 -DOPUS_ARM_PRESUME_NEON_INTR
+LIBS = -L$(NE10_LIBDIR) -lNE10
+SOURCES += ../arm/celt_ne10_fft.c \
+           dump_modes_arm_ne10.c \
+           ../arm/armcpu.c
+endif
+
+all: dump_modes
+
+dump_modes:
+	$(PREFIX)$(CC) $(CFLAGS) $(INCLUDES) -DCUSTOM_MODES_ONLY -DCUSTOM_MODES $(SOURCES) -o $@ $(LIBS) -lm
+
+clean:
+	rm -f dump_modes
diff --git a/third_party/opus/codereview.settings b/third_party/opus/codereview.settings
deleted file mode 100644
index d7c8d39..0000000
--- a/third_party/opus/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: chromium-review.googlesource.com
-GERRIT_PORT: 29418
-CODE_REVIEW_SERVER: chromium-review.googlesource.com
diff --git a/third_party/opus/update_version b/third_party/opus/update_version
deleted file mode 100755
index a999991..0000000
--- a/third_party/opus/update_version
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/bin/bash
-
-# Creates and updates the package_version information used by configure.ac
-# (or other makefiles).  When run inside a git repository it will use the
-# version information that can be queried from it unless AUTO_UPDATE is set
-# to 'no'.  If no version is currently known it will be set to 'unknown'.
-#
-# If called with the argument 'release', the PACKAGE_VERSION will be updated
-# even if AUTO_UPDATE=no, but the value of AUTO_UPDATE shall be preserved.
-# This is used to force a version update whenever `make dist` is run.
-#
-# The exit status is 1 if package_version is not modified, else 0 is returned.
-#
-# This script should NOT be included in distributed tarballs, because if a
-# parent directory contains a git repository we do not want to accidentally
-# retrieve the version information from it instead.  Tarballs should ship
-# with only the package_version file.
-#
-# Ron <ron@debian.org>, 2012.
-
-SRCDIR=$(dirname $0)
-
-if [ -e "$SRCDIR/package_version" ]; then
-    . "$SRCDIR/package_version"
-fi
-
-if [ "$AUTO_UPDATE" = no ]; then
-    [ "$1" = release ] || exit 1
-else
-    AUTO_UPDATE=yes
-fi
-
-# We run `git status` before describe here to ensure that we don't get a false
-# -dirty from files that have been touched but are not actually altered in the
-# working dir.
-GIT_VERSION=$(cd "$SRCDIR" && git status > /dev/null 2>&1 \
-                           && git describe --tags --match 'v*' --dirty 2> /dev/null)
-GIT_VERSION=${GIT_VERSION#v}
-
-if [ -n "$GIT_VERSION" ]; then
-
-    [ "$GIT_VERSION" != "$PACKAGE_VERSION" ] || exit 1
-    PACKAGE_VERSION="$GIT_VERSION"
-
-elif [ -z "$PACKAGE_VERSION" ]; then
-    # No current package_version and no git ...
-    # We really shouldn't ever get here, because this script should only be
-    # included in the git repository, and should usually be export-ignored.
-    PACKAGE_VERSION="unknown"
-else
-    exit 1
-fi
-
-cat > "$SRCDIR/package_version" <<-EOF
-	# Automatically generated by update_version.
-	# This file may be sourced into a shell script or makefile.
-
-	# Set this to 'no' if you do not wish the version information
-	# to be checked and updated for every build.  Most people will
-	# never want to change this, it is an option for developers
-	# making frequent changes that they know will not be released.
-	AUTO_UPDATE=$AUTO_UPDATE
-
-	PACKAGE_VERSION="$PACKAGE_VERSION"
-EOF
diff --git a/third_party/opus/win32/.gitignore b/third_party/opus/win32/.gitignore
deleted file mode 100644
index c17feab..0000000
--- a/third_party/opus/win32/.gitignore
+++ /dev/null
@@ -1,26 +0,0 @@
-# Visual Studio ignores
-[Dd]ebug/
-[Dd]ebugDLL/
-[Dd]ebugDLL_fixed/
-[Dd]ebugPublic/
-[Rr]elease/
-[Rr]eleaseDLL/
-[Rr]eleaseDLL_fixed/
-[Rr]eleases/
-*.manifest
-*.lastbuildstate
-*.lib
-*.log
-*.idb
-*.ipdb
-*.ilk
-*.iobj
-*.obj
-*.opensdf
-*.pdb
-*.sdf
-*.suo
-*.tlog
-*.vcxproj.user
-*.vc.db
-*.vc.opendb
diff --git a/third_party/ots/codereview.settings b/third_party/ots/codereview.settings
deleted file mode 100644
index acbc431..0000000
--- a/third_party/ots/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
\ No newline at end of file
diff --git a/third_party/skia/codereview.settings b/third_party/skia/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/third_party/skia/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/skia/platform_tools/android/apps/skottie/build.gradle b/third_party/skia/platform_tools/android/apps/skottie/build.gradle
index 1346a2f..4a23eb3 100644
--- a/third_party/skia/platform_tools/android/apps/skottie/build.gradle
+++ b/third_party/skia/platform_tools/android/apps/skottie/build.gradle
@@ -20,8 +20,8 @@
     flavorDimensions "tier"
     defaultConfig {
         applicationId "org.skia.skottie"
-        minSdkVersion 23
-        targetSdkVersion 23
+        minSdkVersion 24
+        targetSdkVersion 33
         versionCode 1
         versionName "1.0"
         signingConfig signingConfigs.debug
diff --git a/third_party/skia/platform_tools/android/apps/skqp/build.gradle b/third_party/skia/platform_tools/android/apps/skqp/build.gradle
index 991e671..61bcf16 100644
--- a/third_party/skia/platform_tools/android/apps/skqp/build.gradle
+++ b/third_party/skia/platform_tools/android/apps/skqp/build.gradle
@@ -15,8 +15,8 @@
     compileSdkVersion 26
     defaultConfig {
         applicationId "org.skia.skqp"
-        minSdkVersion 19
-        targetSdkVersion 19
+        minSdkVersion 24
+        targetSdkVersion 33
         versionCode 1
         versionName "1.0"
         signingConfig signingConfigs.debug
diff --git a/third_party/skia/platform_tools/android/apps/viewer/build.gradle b/third_party/skia/platform_tools/android/apps/viewer/build.gradle
index e407f70..2ff996a 100644
--- a/third_party/skia/platform_tools/android/apps/viewer/build.gradle
+++ b/third_party/skia/platform_tools/android/apps/viewer/build.gradle
@@ -16,8 +16,8 @@
     buildToolsVersion "22.0.1"
     defaultConfig {
         applicationId "org.skia.viewer"
-        minSdkVersion 19
-        targetSdkVersion 19
+        minSdkVersion 24
+        targetSdkVersion 33
         versionCode 1
         versionName "1.0"
         signingConfig signingConfigs.debug
diff --git a/base/third_party/symbolize/BUILD.gn b/third_party/symbolize/BUILD.gn
similarity index 100%
rename from base/third_party/symbolize/BUILD.gn
rename to third_party/symbolize/BUILD.gn
diff --git a/base/third_party/symbolize/DEPS b/third_party/symbolize/DEPS
similarity index 100%
rename from base/third_party/symbolize/DEPS
rename to third_party/symbolize/DEPS
diff --git a/base/third_party/symbolize/LICENSE b/third_party/symbolize/LICENSE
similarity index 100%
rename from base/third_party/symbolize/LICENSE
rename to third_party/symbolize/LICENSE
diff --git a/third_party/symbolize/METADATA b/third_party/symbolize/METADATA
new file mode 100644
index 0000000..541b9d6
--- /dev/null
+++ b/third_party/symbolize/METADATA
@@ -0,0 +1,24 @@
+name: "symbolize"
+description:
+  "Symbolization components extracted from google-glog logging library"
+
+third_party {
+  # Note: This is copied here from Chrome //base/third_party/symbolize
+  url {
+    type: LOCAL_SOURCE
+    value: "https://chromium.googlesource.com/chromium/src/base/+/refs/heads/main/third_party/symbolize/"
+  }
+  url {
+    type: GIT
+    value: "https://github.com/google/glog"
+  }
+  # Approximate version from upstream is m70
+  version: "2fb7110f70453ccb8951428611330d95c496f3cd"
+  last_upgrade_date {
+    year: 2018
+    month: 10
+    day: 8
+  }
+  # Orignal has BSD-3-Clause license
+  license_type: NOTICE
+}
diff --git a/base/third_party/symbolize/README.chromium b/third_party/symbolize/README.chromium
similarity index 100%
rename from base/third_party/symbolize/README.chromium
rename to third_party/symbolize/README.chromium
diff --git a/base/third_party/symbolize/config.h b/third_party/symbolize/config.h
similarity index 100%
rename from base/third_party/symbolize/config.h
rename to third_party/symbolize/config.h
diff --git a/base/third_party/symbolize/demangle.cc b/third_party/symbolize/demangle.cc
similarity index 100%
rename from base/third_party/symbolize/demangle.cc
rename to third_party/symbolize/demangle.cc
diff --git a/base/third_party/symbolize/demangle.h b/third_party/symbolize/demangle.h
similarity index 100%
rename from base/third_party/symbolize/demangle.h
rename to third_party/symbolize/demangle.h
diff --git a/base/third_party/symbolize/glog/logging.h b/third_party/symbolize/glog/logging.h
similarity index 100%
rename from base/third_party/symbolize/glog/logging.h
rename to third_party/symbolize/glog/logging.h
diff --git a/base/third_party/symbolize/glog/raw_logging.h b/third_party/symbolize/glog/raw_logging.h
similarity index 100%
rename from base/third_party/symbolize/glog/raw_logging.h
rename to third_party/symbolize/glog/raw_logging.h
diff --git a/base/third_party/symbolize/patches/001-fix-up-includes.patch b/third_party/symbolize/patches/001-fix-up-includes.patch
similarity index 100%
rename from base/third_party/symbolize/patches/001-fix-up-includes.patch
rename to third_party/symbolize/patches/001-fix-up-includes.patch
diff --git a/base/third_party/symbolize/patches/002-minimal-logging.patch b/third_party/symbolize/patches/002-minimal-logging.patch
similarity index 100%
rename from base/third_party/symbolize/patches/002-minimal-logging.patch
rename to third_party/symbolize/patches/002-minimal-logging.patch
diff --git a/base/third_party/symbolize/patches/003-minimal-utilities.patch b/third_party/symbolize/patches/003-minimal-utilities.patch
similarity index 100%
rename from base/third_party/symbolize/patches/003-minimal-utilities.patch
rename to third_party/symbolize/patches/003-minimal-utilities.patch
diff --git a/base/third_party/symbolize/patches/004-add-missing-symbolize-header.patch b/third_party/symbolize/patches/004-add-missing-symbolize-header.patch
similarity index 100%
rename from base/third_party/symbolize/patches/004-add-missing-symbolize-header.patch
rename to third_party/symbolize/patches/004-add-missing-symbolize-header.patch
diff --git a/base/third_party/symbolize/patches/005-expose-file-helpers.patch b/third_party/symbolize/patches/005-expose-file-helpers.patch
similarity index 100%
rename from base/third_party/symbolize/patches/005-expose-file-helpers.patch
rename to third_party/symbolize/patches/005-expose-file-helpers.patch
diff --git a/base/third_party/symbolize/patches/006-use-sandbox-hook-for-open-object-file.patch b/third_party/symbolize/patches/006-use-sandbox-hook-for-open-object-file.patch
similarity index 100%
rename from base/third_party/symbolize/patches/006-use-sandbox-hook-for-open-object-file.patch
rename to third_party/symbolize/patches/006-use-sandbox-hook-for-open-object-file.patch
diff --git a/base/third_party/symbolize/patches/007-sys-types-h.patch b/third_party/symbolize/patches/007-sys-types-h.patch
similarity index 100%
rename from base/third_party/symbolize/patches/007-sys-types-h.patch
rename to third_party/symbolize/patches/007-sys-types-h.patch
diff --git a/base/third_party/symbolize/patches/008-include-cstdlib.patch b/third_party/symbolize/patches/008-include-cstdlib.patch
similarity index 100%
rename from base/third_party/symbolize/patches/008-include-cstdlib.patch
rename to third_party/symbolize/patches/008-include-cstdlib.patch
diff --git a/base/third_party/symbolize/patches/009-clone-absl-demangle.patch b/third_party/symbolize/patches/009-clone-absl-demangle.patch
similarity index 100%
rename from base/third_party/symbolize/patches/009-clone-absl-demangle.patch
rename to third_party/symbolize/patches/009-clone-absl-demangle.patch
diff --git a/base/third_party/symbolize/patches/010-clang-format.patch b/third_party/symbolize/patches/010-clang-format.patch
similarity index 100%
rename from base/third_party/symbolize/patches/010-clang-format.patch
rename to third_party/symbolize/patches/010-clang-format.patch
diff --git a/base/third_party/symbolize/symbolize.cc b/third_party/symbolize/symbolize.cc
similarity index 100%
rename from base/third_party/symbolize/symbolize.cc
rename to third_party/symbolize/symbolize.cc
diff --git a/base/third_party/symbolize/symbolize.h b/third_party/symbolize/symbolize.h
similarity index 100%
rename from base/third_party/symbolize/symbolize.h
rename to third_party/symbolize/symbolize.h
diff --git a/base/third_party/symbolize/utilities.h b/third_party/symbolize/utilities.h
similarity index 100%
rename from base/third_party/symbolize/utilities.h
rename to third_party/symbolize/utilities.h
diff --git a/third_party/v8/codereview.settings b/third_party/v8/codereview.settings
deleted file mode 100644
index b7a5a97..0000000
--- a/third_party/v8/codereview.settings
+++ /dev/null
@@ -1,7 +0,0 @@
-PROJECT: v8
-GERRIT_HOST: True
-CODE_REVIEW_SERVER: https://codereview.chromium.org
-CC_LIST: v8-reviews@googlegroups.com
-VIEW_VC: https://chromium.googlesource.com/v8/v8/+/
-STATUS: http://v8-status.appspot.com/status
-RUN_POST_UPLOAD_HOOK: True
diff --git a/third_party/v8/src/wasm/wasm-js.cc b/third_party/v8/src/wasm/wasm-js.cc
index 5e0caea..a35174d 100644
--- a/third_party/v8/src/wasm/wasm-js.cc
+++ b/third_party/v8/src/wasm/wasm-js.cc
@@ -2191,6 +2191,7 @@
   // Setup Memory
   // Enables shared memory support.
   i::FLAG_experimental_wasm_threads = true;
+  i::FLAG_experimental_wasm_simd = true;
   Handle<JSFunction> memory_constructor =
       InstallConstructorFunc(isolate, webassembly, "Memory", WebAssemblyMemory);
   context->set_wasm_memory_constructor(*memory_constructor);
diff --git a/third_party/v8/third_party/inspector_protocol/codereview.settings b/third_party/v8/third_party/inspector_protocol/codereview.settings
deleted file mode 100644
index 6ac8580..0000000
--- a/third_party/v8/third_party/inspector_protocol/codereview.settings
+++ /dev/null
@@ -1,6 +0,0 @@
-# This file is used by git-cl to get repository specific information.
-CC_LIST: chromium-reviews@chromium.org
-CODE_REVIEW_SERVER: codereview.chromium.org
-GERRIT_HOST: True
-PROJECT: inspector_protocol
-VIEW_VC: https://chromium.googlesource.com/deps/inspector_protocol/+/
diff --git a/third_party/web_platform_tests/codereview.settings b/third_party/web_platform_tests/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/third_party/web_platform_tests/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/web_platform_tests/websockets/interfaces/WebSocket/close/close-return.html b/third_party/web_platform_tests/websockets/interfaces/WebSocket/close/close-return.html
index ddcdd52..21e4c49 100644
--- a/third_party/web_platform_tests/websockets/interfaces/WebSocket/close/close-return.html
+++ b/third_party/web_platform_tests/websockets/interfaces/WebSocket/close/close-return.html
@@ -7,8 +7,7 @@
 <script>
 test(function() {
   var ws = new WebSocket(SCHEME_DOMAIN_PORT+'/');
-  // SpiderMonkey erroneously does not resolve a void function to "undefined".
-  // assert_equals(ws.close(), undefined);
+  assert_equals(ws.close(), undefined);
   ws.close();
 });
 </script>
diff --git a/third_party/web_platform_tests/websockets/interfaces/WebSocket/send/005.html b/third_party/web_platform_tests/websockets/interfaces/WebSocket/send/005.html
index f6b56a3..2ead7ff 100644
--- a/third_party/web_platform_tests/websockets/interfaces/WebSocket/send/005.html
+++ b/third_party/web_platform_tests/websockets/interfaces/WebSocket/send/005.html
@@ -9,9 +9,7 @@
 async_test(function(t){
   var ws = new WebSocket(SCHEME_DOMAIN_PORT+'/echo');
   ws.onopen = t.step_func(function(e) {
-    // SpiderMonkey erroneously does not resolve a void function to "undefined".
-    //assert_equals(ws.send('test'), undefined);
-    ws.send('test');
+    assert_equals(ws.send('test'), undefined);
     t.done();
   });
 });
diff --git a/third_party/web_platform_tests/websockets/interfaces/WebSocket/send/007.html b/third_party/web_platform_tests/websockets/interfaces/WebSocket/send/007.html
index 7925aff..e10dd01 100644
--- a/third_party/web_platform_tests/websockets/interfaces/WebSocket/send/007.html
+++ b/third_party/web_platform_tests/websockets/interfaces/WebSocket/send/007.html
@@ -13,8 +13,7 @@
     // test that nothing strange happens if we send something after close()
     ws.close();
     var sent = ws.send('test');
-    // SpiderMonkey erroneously does not resolve a void function to "undefined".
-    //assert_equals(sent, undefined);
+    assert_equals(sent, undefined);
   });
   ws.onclose = t.step_func(function(e) {
     ws.onclose = t.step_func(function() {assert_unreached()});
diff --git a/third_party/web_platform_tests/websockets/interfaces/WebSocket/send/008.html b/third_party/web_platform_tests/websockets/interfaces/WebSocket/send/008.html
index 39a02a5..bca801e 100644
--- a/third_party/web_platform_tests/websockets/interfaces/WebSocket/send/008.html
+++ b/third_party/web_platform_tests/websockets/interfaces/WebSocket/send/008.html
@@ -14,8 +14,7 @@
   ws.onclose = t.step_func(function(e) {
     // test that nothing strange happens when send()ing in closed state
     var sent = ws.send('test');
-    // SpiderMonkey erroneously does not resolve a void function to "undefined".
-    //assert_equals(sent, undefined);
+    assert_equals(sent, undefined);
     ws.onclose = t.step_func(function() {assert_unreached()});
     setTimeout(function() {t.done()}, 50);
   })
diff --git a/third_party/websocket-client/codereview.settings b/third_party/websocket-client/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/third_party/websocket-client/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
diff --git a/third_party/woff2/codereview.settings b/third_party/woff2/codereview.settings
deleted file mode 100644
index acbc431..0000000
--- a/third_party/woff2/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com
\ No newline at end of file
diff --git a/third_party/zlib/BUILD.gn b/third_party/zlib/BUILD.gn
index b2f0664..83cb327 100644
--- a/third_party/zlib/BUILD.gn
+++ b/third_party/zlib/BUILD.gn
@@ -23,9 +23,9 @@
 }
 
 # TODO(b/206642994): look into whether we should condition on the
-# floating_point_fpu SABI variable, rather than sb_is_evergreen, here as we did
+# floating_point_fpu SABI variable, rather than sb_is_modular, here as we did
 # in third_party/zlib/zlib.gyp.
-if (is_starboard && sb_is_evergreen && target_cpu == "arm" &&
+if (is_starboard && sb_is_modular && target_cpu == "arm" &&
     use_arm_neon_optimizations) {
   config("zlib_neon_fpu_config") {
     cflags = [ "-mfpu=neon" ]
@@ -80,7 +80,7 @@
     configs += [ "//starboard/build/config:speed" ]
   }
 
-  if (is_starboard && sb_is_evergreen && target_cpu == "arm" &&
+  if (is_starboard && sb_is_modular && target_cpu == "arm" &&
       use_arm_neon_optimizations) {
     configs += [ ":zlib_neon_fpu_config" ]
   }
@@ -161,7 +161,7 @@
       deps = [ "//starboard:starboard_headers_only" ]
     }
 
-    if (is_starboard && sb_is_evergreen && target_cpu == "arm" &&
+    if (is_starboard && sb_is_modular && target_cpu == "arm" &&
         use_arm_neon_optimizations) {
       configs += [ ":zlib_neon_fpu_config" ]
     }
@@ -236,7 +236,7 @@
     configs += [ "//starboard/build/config:speed" ]
   }
 
-  if (is_starboard && sb_is_evergreen && target_cpu == "arm" &&
+  if (is_starboard && sb_is_modular && target_cpu == "arm" &&
       use_arm_neon_optimizations) {
     configs += [ ":zlib_neon_fpu_config" ]
   }
diff --git a/tools/create_archive.py b/tools/create_archive.py
index ba5e9c8..f22aab2 100755
--- a/tools/create_archive.py
+++ b/tools/create_archive.py
@@ -39,8 +39,6 @@
 import sys
 import time
 
-import worker_tools
-
 # Use strict include filter to pass artifacts to Mobile Harness
 TEST_PATTERNS = [
     'content/*',
@@ -49,10 +47,51 @@
     '*.apk',
     'ds_archive.zip',
     'app_launcher.zip',
-    'crashpad_handler',
+    'native_target/crashpad_handler',
     'elf_loader_sandbox'
 ]
 
+SOURCE_DIR = r'<source_dir>'
+
+# These files are not final build artifacts nor inetermediate build artifacts
+# needed.
+BUILDBOT_INTERMEDIATE_FILE_NAMES_WILDCARDS = (
+    r'gypfiles',
+    r'gyp-win-tool',
+    r'environment.x64',
+    r'environment.x86',
+    r'obj',
+    r'obj.host',
+    r'gradle',  # Android intermediates
+    SOURCE_DIR + r'lib/*.so',
+    r'intermediates',
+    r'*.ninja',
+    r'*.ninja_deps',
+    r'*.ninja_log',
+    r'*.mp4',
+    r'*.deb',
+)
+
+# These files are not final build artifacts. Values should match those in
+# INTERMEDIATE_WILDCARD_FILE_NAMES_RE
+INTERMEDIATE_FILE_NAMES_WILDCARDS = (
+    r'gen',
+    r'gypfiles',
+    r'gyp-win-tool',
+    r'environment.x64',
+    r'environment.x86',
+    r'obj',
+    r'obj.host',
+    r'gradle',  # Android intermediates
+    SOURCE_DIR + r'lib/*.so',
+    r'intermediates',
+    r'*.ninja',
+    r'*.ninja_deps',
+    r'*.ninja_log',
+    r'*.mp4',
+    r'*.deb',
+)
+
 # Reference: https://sevenzip.osdn.jp/chm/cmdline/switches/
 _7Z_PATH = r'%ProgramFiles%\7-Zip\7z.exe'  # pylint:disable=invalid-name
 # 1 is fastest and least compression, max is 9, see -mx parameter in docs
@@ -249,13 +288,11 @@
 
 def _CreateWindowsTarCmd(source_path, intermediate_tar_path, patterns,
                          intermediate):
-  exclude_patterns = worker_tools.INTERMEDIATE_FILE_NAMES_WILDCARDS
+  exclude_patterns = INTERMEDIATE_FILE_NAMES_WILDCARDS
   if intermediate:
-    exclude_patterns = worker_tools.BUILDBOT_INTERMEDIATE_FILE_NAMES_WILDCARDS
-  excludes = ' '.join([
-      f'-xr!{x.replace(worker_tools.SOURCE_DIR, source_path)}'
-      for x in exclude_patterns
-  ])
+    exclude_patterns = BUILDBOT_INTERMEDIATE_FILE_NAMES_WILDCARDS
+  excludes = ' '.join(
+      [f'-xr!{x.replace(SOURCE_DIR, source_path)}' for x in exclude_patterns])
   contents = [
       os.path.join(source_path, pattern)
       for pattern in patterns
@@ -268,11 +305,11 @@
 
 def _CreateLinuxTarCmd(source_path, intermediate_tar_path, patterns,
                        intermediate):
-  exclude_patterns = worker_tools.INTERMEDIATE_FILE_NAMES_WILDCARDS
+  exclude_patterns = INTERMEDIATE_FILE_NAMES_WILDCARDS
   if intermediate:
-    exclude_patterns = worker_tools.BUILDBOT_INTERMEDIATE_FILE_NAMES_WILDCARDS
+    exclude_patterns = BUILDBOT_INTERMEDIATE_FILE_NAMES_WILDCARDS
   excludes = ' '.join([
-      f'--exclude="{x.replace(worker_tools.SOURCE_DIR, source_path)}"'
+      f'--exclude="{x.replace(SOURCE_DIR, source_path)}"'
       for x in exclude_patterns
   ])
   mode = 'r' if os.path.exists(intermediate_tar_path) else 'c'
@@ -372,7 +409,6 @@
       help='Archives using parallelized methods.')
   args = parser.parse_args()
 
-  worker_tools.MoveToWindowsShortSymlink()
   if args.extract:
     UncompressArchive(args.source_paths[0], args.dest_path, args.parallel)
   else:
diff --git a/tools/format_ninja.py b/tools/format_ninja.py
index 00bfe1f..3e29118 100644
--- a/tools/format_ninja.py
+++ b/tools/format_ninja.py
@@ -56,6 +56,11 @@
 
 
 def normalize_if_pathlike(path: str, directory: str) -> str:
+
+  # Fixes an issue on windows where paths are parsed incorrectly.
+  if path == 'nul':
+    return path
+
   absolute_path = make_path_absolute(path, directory)
   if os.path.exists(absolute_path):
     return remove_directory_path(absolute_path, directory)
diff --git a/tools/update_required_branch_checks.py b/tools/update_required_branch_checks.py
index fa660df..8b946f4 100644
--- a/tools/update_required_branch_checks.py
+++ b/tools/update_required_branch_checks.py
@@ -11,23 +11,41 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-"""Updates the requires status checks for a branch."""
+"""Updates the requires status checks for a branch.
+
+Requires PyGithub to run:
+
+  $ pip install PyGithub
+"""
 
 import argparse
 from github import Github
 from typing import List
 
+# Issue a Personal Access Token with 'repo' permission on
+# https://github.com/settings/tokens.
 YOUR_GITHUB_TOKEN = ''
 assert YOUR_GITHUB_TOKEN != '', 'YOUR_GITHUB_TOKEN must be set.'
 
 TARGET_REPO = 'youtube/cobalt'
 
 EXCLUDED_CHECK_PATTERNS = [
+    # Excludes non build/test checks.
     'feedback/copybara',
-    '_on_device_',
-    'codecov',
     'prepare_branch_list',
     'cherry_pick',
+
+    # Excludes coverage and test reports.
+    'linux-coverage',
+    'codecov',
+    'on-host-unit-test-report',
+
+    # Excludes blackbox, web platform, and unit tests run on-device.
+    '_on_device_',
+
+    # Excludes evergreen as blackbox test.
+    'evergreen-as-blackbox_test',
+
     # Excludes templated check names.
     '${{'
 ]
@@ -78,11 +96,23 @@
   return list(check_names)
 
 
-def print_checks(branch: str, check_names: List[str]) -> None:
-  print(f'Checks for {branch}:')
-  for check_name in check_names:
-    print(check_name)
-  print()
+def print_checks(repo, branch_name: str, new_checks: List[str]) -> None:
+  branch = repo.get_branch(branch_name)
+  current_checks = branch.get_required_status_checks().contexts
+
+  def print_check_list(checks):
+    for check_name in sorted(checks):
+      print(check_name)
+    print()
+
+  print(f'Required checks to be ADDED for {branch_name}:')
+  print_check_list(set(new_checks) - set(current_checks))
+
+  print(f'Required checks to be REMOVED for {branch_name}:')
+  print_check_list(set(current_checks) - set(new_checks))
+
+  print(f'Required checks that will REMAIN for {branch_name}:')
+  print_check_list(set(current_checks).intersection(set(new_checks)))
 
 
 def update_protection_for_branch(repo, branch: str,
@@ -118,7 +148,7 @@
   for branch in args.branch:
     required_checks = get_required_checks_for_branch(repo, branch)
     if args.dry_run:
-      print_checks(branch, required_checks)
+      print_checks(repo, branch, required_checks)
     else:
       update_protection_for_branch(repo, branch, required_checks)
 
diff --git a/tools/windows/win_compile_time_check.ps1 b/tools/windows/win_compile_time_check.ps1
new file mode 100644
index 0000000..a5fe1dd
--- /dev/null
+++ b/tools/windows/win_compile_time_check.ps1
@@ -0,0 +1,36 @@
+# Script to test if a small target builds quickly on windows as expected.

+

+# Define the timeout value in seconds

+$timeout = 120

+

+$folderPath = ".\out\win32_test\"

+

+# Remove folder if present from out directory

+if (Test-Path $folderPath) {

+    # Delete the folder

+    Remove-Item $folderPath -Recurse -Force

+}

+

+# Start a timer

+$start = Get-Date

+

+# Run the command

+$command = "python .\cobalt\build\gn.py $folderPath -p win-win32 -C devel ; ninja -C $folderpath eztime_test"

+Invoke-Expression $command

+

+# Get the end time

+$end = Get-Date

+

+# Calculate the execution time

+$executionTime = $end - $start

+$executionTimeinSecs = $executionTime.TotalSeconds

+Write-Output "Execution time in secs is $executionTimeinSecs"

+

+# Check if the execution time is greater than the timeout value

+if ($executionTimeinSecs -gt $timeout) {

+    # Check b/291665088 for more discussion.

+    throw "The command took more than $timeout seconds to run."

+}

+

+# The command ran successfully

+Write-Output "The command ran successfully."

diff --git a/tools/worker_tools.py b/tools/worker_tools.py
deleted file mode 100644
index 64bbe70..0000000
--- a/tools/worker_tools.py
+++ /dev/null
@@ -1,157 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Tools for build workers."""
-
-import logging
-import os
-import platform as sys_platform
-import re
-import subprocess
-
-SOURCE_DIR = r'<source_dir>'
-
-# These files are not final build artifacts nor inetermediate build artifacts
-# needed.
-BUILDBOT_INTERMEDIATE_FILE_NAMES_WILDCARDS = (
-    r'gypfiles',
-    r'gyp-win-tool',
-    r'environment.x64',
-    r'environment.x86',
-    r'obj',
-    r'obj.host',
-    r'gradle',  # Android intermediates
-    SOURCE_DIR + r'lib/*.so',
-    r'intermediates',
-    r'*.ninja',
-    r'*.ninja_deps',
-    r'*.ninja_log',
-    r'*.mp4',
-    r'*.deb',
-)
-
-# These files are not final build artifacts. Values should match those in
-# INTERMEDIATE_WILDCARD_FILE_NAMES_RE
-INTERMEDIATE_FILE_NAMES_WILDCARDS = (
-    r'gen',
-    r'gypfiles',
-    r'gyp-win-tool',
-    r'environment.x64',
-    r'environment.x86',
-    r'obj',
-    r'obj.host',
-    r'gradle',  # Android intermediates
-    SOURCE_DIR + r'lib/*.so',
-    r'intermediates',
-    r'*.ninja',
-    r'*.ninja_deps',
-    r'*.ninja_log',
-    r'*.mp4',
-    r'*.deb',
-)
-
-# This regex is the same list as above, but is suitable for regex comparison.
-INTERMEDIATE_FILE_NAMES_RE = re.compile(r'^gen$|'
-                                        r'^gypfiles$|'
-                                        r'^gyp-win-tool$|'
-                                        r'^environment.x64$|'
-                                        r'^environment.x86$|'
-                                        r'^obj$|'
-                                        r'^obj\.host$|'
-                                        r'^gradle$|'
-                                        r'^lib$|'
-                                        r'^intermediates$|'
-                                        r'^.*\.ninja$|'
-                                        r'^.*\.ninja_deps$|'
-                                        r'^.*\.ninja_log$|'
-                                        r'^.*\.mp4$|'
-                                        r'^.*\.deb$')
-
-_SYMLINK_DIR = r'C:\\w'
-_RM_LINK = ['cmd', '/c', 'rmdir', _SYMLINK_DIR]
-_CREATE_LINK = ['cmd', '/c', 'mklink', '/d', _SYMLINK_DIR]
-_DEFAULT_WORKDIR = 'workdir'
-
-
-def FindWorkDir():
-  """Looking for workdir in current working dir paths."""
-  cur_dir = os.getcwd()
-  while cur_dir:
-    cur_dir, tail = os.path.split(cur_dir)
-    if not tail:
-      return None
-    if tail == _DEFAULT_WORKDIR:
-      return os.path.join(cur_dir, tail)
-  return None
-
-
-def MoveToWindowsShortSymlink():
-  r"""Changes current work dir on Dockerized Windows to C:\w.
-
-  This is workaround to issue of long windows path (longer than 460 symbols).
-  When we could address this issue in our python scripts some tooling is not
-  compatible with long paths.
-
-  Creating symlink only if workdir is present in current path. Changing dir to
-  the same level but under short link.
-
-  Returns:
-    current work dir prior to symlink creation
-  """
-  original_cur_dir = os.getcwd()
-  if os.environ.get('IS_BUILDBOT_DOCKER') != '1':
-    return original_cur_dir
-  if sys_platform.system() != 'Windows':
-    return original_cur_dir
-  work_dir = FindWorkDir()
-  if not work_dir:
-    logging.warning(
-        'Running from outside of default workdir: %s, path'
-        'shortening skipped.', original_cur_dir)
-    return original_cur_dir
-
-  logging.info('Changing workdir to symlink %s', _SYMLINK_DIR)
-  if os.path.exists(_SYMLINK_DIR):
-    subprocess.call(_RM_LINK)
-  subprocess.call(_CREATE_LINK + [work_dir])
-  short_cur_path = GetPathUnderShortSymlink(work_dir, original_cur_dir)
-  logging.info('Continuing running from: %s', short_cur_path)
-  os.chdir(short_cur_path)
-  return original_cur_dir
-
-
-def GetPathUnderShortSymlink(workdir_path, path):
-  """Returns path relative to _SYMLINK_DIR if it was under work_dir."""
-  if workdir_path in path:
-    return path.replace(workdir_path, _SYMLINK_DIR)
-  return path
-
-
-def IsIntermediateFile(file_name):
-  """Return True if file is used to create artifacts and is not one itself."""
-  return bool(INTERMEDIATE_FILE_NAMES_RE.match(file_name))
-
-
-class TestTypes(object):
-  UNIT_TEST = 'unit_test'
-  BLACK_BOX_TEST = 'black_box_test'
-  EVERGREEN_TEST = 'evergreen_test'
-  PERFORMANCE_TEST = 'performance_test'
-  ENDURANCE_TEST = 'endurance_test'
-  INTEGRATION_TEST = 'integration_test'
-  UPLOAD_ARCHIVE = 'upload_archive'
-
-  VALID_TYPES = [
-      UNIT_TEST, BLACK_BOX_TEST, PERFORMANCE_TEST, EVERGREEN_TEST,
-      ENDURANCE_TEST, INTEGRATION_TEST, UPLOAD_ARCHIVE
-  ]
diff --git a/url/codereview.settings b/url/codereview.settings
deleted file mode 100644
index a4b341a..0000000
--- a/url/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: lbshell-internal-review.googlesource.com
-GERRIT_AUTODETECT_BRANCH: true
-CODE_REVIEW_SERVER: lbshell-internal-review.googlesource.com